PVOL1BACKUP D%B1111001001 1Pe _vߋt ***THIS VOLUME DOES NOT CONTAIN A HARDWARE BOOTABLE SYSTEM *** && d "W c W  5 E 5tUh |xt 7h   wp؇  @ B     Rd 2 @J .877"  ؇& 00R 5@$T0 ޢގ޷1 ~& . JPHDR1RSX11MPBL87 00010001000100 00000 00000 000000DECFILE11A PPHDR2U0414404144 M 00 PPRSX11MPBL87RSX11MPBL87b +;< DMYZ[18DEC98144326DECNP=[!sߕE T~ @& & _< hEmB c  w5 %<A̋4L% r  فrP͕9YB~525 " @U  `"2@'@HrB rP5 U5UA U#Y 6M0 ! W @0 Iwd1 > #Y  ߋ % %  !                   i RSX11MPBL87ϩ18DEC98023530RSX11MPBL87 [001,001] DECFILE11A |PUFDNNzPszfWgXgZgz"CROSSED"),DSTFCR("FAIR"/"COUNT"),DSTFLM("FAIR"/"LIMIT")%AT BOTTOM OF DSTDEV PRINT SKIP,COL 1,D+"MAXIMUM I/O COUNT = ",COL 22,MAX(DSTIOC),D SKIP,COL 1,"+"MAXIMUM WORD COUNT = ",COL 22,MAX(DSTWCT),VSKIPHAT BOTTOM OF PAGE PRINT SKIP,COL 1,"TRANSACTION CODE =",COL 20,CODE(" ") END-REPORT END-PROCEDURE"!|! DEVICE STATISTICS REPORT!D :DST-REPORTIDELETE DST-REPORT;!(DELETE SYSTEM-INFO-REC;"DELETE SYSTEM-INFO;(FINISH SYSTEM-INFO;L!A'! PUFDOOzP  &_M#^? &(K#^@BuWTkQAr(^Brxrl^Crxl^Drl^Erl^Frl^Grl^Hrl^Ir[qJr[qKr\KLr]KMr[qyN8xrl^O8l^P8[qQ8[qyRt^^St^8^TM^UZg9;^VZg8^WZgd^XZg^YZg^qPUFDOPzPZysd[Olys\Olyd]xX^kz?T_r8` Ԁa_Mp:Ԁbt:zr[qJr[qKr\KLr]KMr[qyN8xrl^O8l^P8[qQ8[qyRt^^St^8^TM^UZg9;^VZg8^WZgd^XZg^YZg^qPUFDOQzPPUFD ORzPPUFD OTzPc""_M"d""_Mc""_r8` Ԁa_Mp:Ԁbt:zr[qJr[qKr\KLr]KMr[qyN8xrl^O8l^P8[qQ8[qyRt^^St^8^TM^UZg9;^VZg8^WZgd^XZg^YZg^qPUFD OUzPPUFD OvzPPUFD Owz PPUFDOzPddddddddddddn0 dd ddddkdd_ddeddmddadddd7dddd&dd,ddBddNddmdddddddddddddddd%dddddd)!dd"dd&Mdd&Qdd&Rdd&xdd &(dd &sddx'dd'dd(ddR)ddw*?Tdd2dd3dd3[qdd3[ql^d4dd8dd8%ddz8(dd}8[qdd8ddy:dd:dd:dd:ddbKddYMddvMddMddkQddrkQ_dQddgQddQddjQddDRddSddSddaTddh XddOl_? q_@r_Arl_Bs_Cv_Dx_Ex_F}_G~_HT_I_J_K_L_wrrysZl^___ ___e_a_PUFDOzPMr\KxQNr]KxQOr[qxQP8[qxQxel_<f_=Ol_>Ol_? q_@r_Arl_Bs_Cv_Dx_Ex_F}_G~_HT_I_J_K_L_wrrysZl^___ ___e_a_PUFDOz,PPUFDPz,P :}}szKv s!sy"z#zy$%y&'y()y*K+Ky,-Ts.Tsy/s0sy1s2sy3s4sy5 s6 sy7s8sy9Ls:Lsy;s<sy=_>s?sy@MsAMsyBLSsCLSsyDkQ kQ@XRkQgkQ1pqkQykQkQ(kQ`kQ XkQykQfkQFskQ$skQHkQ3XHqkQByZkQOskQ/_kQskQL!skQx""`kQM#"kQ"ZkQZ#kQ# XkQ{#wkQ#_kQ8 XkQ9skQ|y:kQy:~kQ:kQHskQ,KskQYMkQoMkQkMskQsMskQ$NskQQkQRkQ RskQ/SxkQPLSskQWXSHqkQSZkQS`kQ;TdkQkQo9KkQj9kQ)lkQskQ" zkQqskQn̖skQ^ؖHqkQb skQskQV kQęskQzƙp:kQyЙHqkQtԙh~kQHTHqkQQdTskQ~TkQ5THqkQH\XkQ\XxKkQ dYskQ#[kQ_ykQ:dkQekQof"kQ fskQ fskQKg_kQPUFDwz PPUFDwz PPUFDwz PPUFDxz P^ wkQSyykQzkQ7zkQz8kQz kQ}kQh! kQm#pkQ#8;kQa#}kQi$` kQg&dkQ)kQ)XkQ`*kQ,2kQl-kQd-8;kQ-`^kQf/0kQ_/8;kQv2kQw3kQ}4`kQe5vkQ92kQPUFDvz%PG}G}( DkQDkQD9ykQDjkQDkQD@,kQD:kQD:kQ%D:kQ&D:kQ'D:kQ*D:kQ2D:kQDhzkQ4D}kQ6ErkQEykQ9DEy_kQDEz_kQ;GEHSkQ<NEkQAiE.kQiE]kQKiEhzkQcoEhzkQrEkQsEkQsE'kQvEkQEhjkQEkQEL;kQ-FykQFkQF zkQFKkQAG@kQRG@kQGLkQG8^kQGp kQG}kQGkQG kQG8kQG@`kQG kQ:GkQ*KkQkQF "STHqkQH\XkQ\XxKkQ dYskQ#[kQ_ykQ:dkQekQof"kQ fskQ fskQKg_kQPUFDz%PE DDEvGEQF F F`JxRG@kQGLkQG8^kQGp kQG}kQGkQG kQG8kQG@`kQG kQ:GkQ*KkQkQF "STHqkQH\XkQ\XxKkQ dYskQ#[kQ_ykQ:dkQekQof"kQ fskQ fskQKg_kQPUFDOzP_Mp:DEvGEQF F F`JxRG@kQGLkQG8^kQGp kQG}kQGkQG kQG8kQG@`kQG kQ:GkQ*KkQkQF "STHqkQH\XkQ\XxKkQ dYskQ#[kQ_ykQ:dkQekQof"kQ fskQ fskQKg_kQPUFD=pzP  p,e"_Mp:,UC;xHx hL(skQkQxkQ3@kQyxskQ hLkQęskQԙkQ""`w" zvX+u'Ԁy'Ԁy'Ԁy'Ԁ2XMԀfM+Ԁ"Ԁ.kQwqkQVqMkQ "wkQ :dwkQ wq VqM "w:dwDjkQDkQD@,kQD:kQD:kQ%D:kQ&D:kQ'D:kQ*D:kQ2D:kQDhzkQ4D}kQ6ErkQEykQ9DEy_kQDEz_kQ;GEHSkQ<NEkQAiE.kQiE]kQKiEhzkQcoEhzkQrEkQsEkQsE'kQvEkQEhjkQPUFDzPz,d1KXwddwF wf'z,sQkQ#(Ԁ{QGwԀ{QrwԀy Ԁy2 ԀD:kQ*D:kQ2D:kQDhzkQ4D}kQ6ErkQEykQ9DEy_kQDEz_kQ;GEHSkQ<NEkQAiE.kQiE]kQKiEhzkQcoEhzkQrEkQsEkQsE'kQvEkQEhjkQPHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADHEADPPUFDNNzP.sz18DEC9802354018DEC98023539őPUFDOOzP. CF.3INQ18DEC9802383518DEC98023835.4qQ18DEC9802383518DEC98023835*$.5 &(18DEC9802383518DEC98023835.6z &(y18DEC9802383618DEC98023835.7#$ &[q18DEC9802383618DEC98023836"2.8|  &[qy18DEC9802383618DEC98023836 .9 &^18DEC9802383718DEC98023836c.:< &aT^18DEC9802383718DEC98023837Ͼ.;!!` &Q^18DEC9802383718DEC98023837 6L.< &Y#^18DEC9802383718DEC98023837W׿.= &Y^#^18DEC9802383818DEC98023838i.>^ &_M#^18DEC9802383818DEC98023838k.?77: &(K#^18DEC9802383818DEC980238386p.@F ~BuWTkQ18DEC9802383918DEC98023838 .Az r(^18DEC9802383918DEC98023839.BG4rxrl^18DEC9802383918DEC98023839.CGVrxl^18DEC9802383918DEC98023839b.DWVV.rl^18DEC9802384018DEC98023839U̺.EY&rl^18DEC9802384018DEC98023840 `.FYrl^18DEC9802384018DEC98023840 a.GYrl^18DEC9802384018DEC98023840 Yc.H^rl^18DEC9802384118DEC98023840& jb.Ir[q18DEC9802384118DEC98023841, ..J01r[q18DEC9802384118DEC98023841/0 a.Kr\K18DEC9802384118DEC98023841` D.L r]K18DEC9802384218DEC98023841s r$.MzZr[qy18DEC9802384218DEC98023842 &.NML8xrl^18DEC9802384218DEC98023842 .OY8l^18DEC9802384218DEC98023842 = .P()8[q18DEC9802384218DEC98023842' M.Qb8[qy18DEC9802384318DEC98023843 .RTt^^18DEC9802384318DEC98023843 .S t^8^18DEC9802384318DEC98023843 3.TM^18DEC9802384318DEC98023843 #.UZg9;^18DEC9802384418DEC98023844 [.VFZg8^18DEC9802384418DEC98023844 W.WTZgd^18DEC9802384418DEC98023844 =.XrZg^18DEC9802384418DEC98023844 >.YrZg^18DEC9802384518DEC98023845 DPUFDOPzP.ZK ysd18DEC9802384518DEC98023845 :.[KOlys18DEC9802384518DEC98023845 <>.\LtOlyd18DEC9802384618DEC98023846 C,.]>`xX18DEC9802384618DEC98023846 R.^@kz?T18DEC9802384618DEC98023846 _#._"Zr818DEC9802384718DEC98023846; .`B( Ԁ18DEC9802384718DEC98023847 'p.aB(_Mp:Ԁ18DEC9802384718DEC98023847 =.bt:z18DEC9802385018DEC98023848 }PUFDOQzPPUFD ORzPPUFD OTzP.c""_M"18DEC9802385318DEC98023850O O O Oä.dbc""_Mc""18DEC9802385318DEC98023853a ;GPUFD OUzPPUFD OvzPPUFD Owz PPUFDOzP.] "dd18DEC9802392218DEC98023922 (!.2tdd18DEC9802392318DEC980239226N.;dd18DEC9802390418DEC98023904.Qdd18DEC9802392318DEC98023923;.<dd18DEC9802390418DEC98023904.=dd18DEC9802392218DEC980239223.nKX0 dd18DEC9802385618DEC98023856.M6 dd18DEC9802390918DEC98023909Q.Mdd18DEC9802390918DEC98023909I.kRdd18DEC9802385618DEC98023856 .Q_dd18DEC9802390918DEC98023909S.``edd18DEC9802392418DEC98023924X@.Pmdd18DEC9802391018DEC98023909W.\add18DEC9802391018DEC98023910[h.U dd18DEC9802391018DEC98023910o.>7dd18DEC9802392318DEC98023923@.^rdd18DEC9802391018DEC98023910x.J&dd18DEC9802392718DEC98023927 .W,dd18DEC9802391118DEC98023910|.)Bdd18DEC9802390718DEC98023907.*Ndd18DEC9802390718DEC98023907.mQdd18DEC9802385618DEC98023856 .` dd18DEC9802390818DEC98023908 L.Pdd18DEC9802391118DEC98023911.Wdd18DEC9802391118DEC98023911.2dd18DEC9802391118DEC98023911.Fdd18DEC9802391118DEC98023911-.W zdd18DEC9802392118DEC98023920 .NZdd18DEC9802391218DEC98023912 .>%dd18DEC9802391218DEC98023912a .[dd18DEC9802390818DEC980239088.X//"dd18DEC9802391218DEC98023912.:.k T)!dd18DEC9802391318DEC98023912 a.L"dd18DEC9802391318DEC98023913.R&Mdd18DEC9802390518DEC98023905 Ml.X^&Qdd18DEC9802390518DEC98023905u.[ &Rdd18DEC9802390618DEC98023906qv.[ &xdd18DEC9802390618DEC98023905 .IB &(dd18DEC9802390518DEC98023904;.Sn &sdd18DEC9802392818DEC98023928 .Z&x'dd18DEC9802392118DEC98023921#.IL'dd18DEC9802391318DEC98023913.j<(dd18DEC9802391318DEC98023913.5R)dd18DEC9802391318DEC98023913.Inw*?Tdd18DEC9802390618DEC98023906n.` 2dd18DEC9802392518DEC98023925 c/.QX3dd18DEC9802390718DEC98023907)).Q3[qdd18DEC9802390418DEC98023904|b.M3[ql^d18DEC9802390818DEC98023907.N4dd18DEC9802392718DEC98023927v..U 8dd18DEC9802391918DEC98023919 !7.P8%dd18DEC9802391818DEC98023918{9V.zr8(dd18DEC9802385918DEC98023859%T.}r8[qdd18DEC9802385918DEC98023859.O8dd18DEC9802392418DEC98023923K(.U y:dd18DEC9802391418DEC98023914 2.9:dd18DEC9802392518DEC98023925w-.V:dd18DEC9802391418DEC98023914 =.Q:dd18DEC9802391418DEC98023914 *._bKdd18DEC9802391918DEC98023919(Q.SYMdd18DEC9802391418DEC98023914"-?.v6.Mdd18DEC9802385818DEC98023858&@.W^Mdd18DEC9802392418DEC98023924`T.skQdd18DEC9802390618DEC98023906lY.rXlkQ_d18DEC9802385718DEC98023857.RQdd18DEC9802392918DEC98023928I.g6$Qdd18DEC9802385518DEC98023855u@.c Qdd18DEC9802392818DEC98023928N.j&Qdd18DEC9802385518DEC98023855@.MDRdd18DEC9802391518DEC98023914'3D.RSdd18DEC9802391518DEC98023915+pG.T Sdd18DEC9802392318DEC98023923BJ.QaTdd18DEC9802391518DEC980239151&T.h<8 Xdd18DEC9802385518DEC98023855w$].J Ltt2Ol_18DEC9802422218DEC98024220s)5.? q_18DEC9802422418DEC98024223*.@r_18DEC9802422818DEC98024224-*nn.A11Nrl_18DEC9802424418DEC98024228*+,0-.B>s_18DEC9802425018DEC98024245..C}}Pv_18DEC9802425318DEC98024250|.;.D33|x_18DEC9802425418DEC980242532v/.E""$x_18DEC9802425618DEC98024255!/4.F}_18DEC9802425718DEC98024256/.GRRL~_18DEC9802430418DEC980242580Q1 O.H\T_18DEC9802430618DEC98024305R1.I_18DEC9802431118DEC98024306Y1U.J55_18DEC9802431218DEC980243114@2B .K??Z_18DEC9802432018DEC98024313u2>u3K.L!!_18DEC9802432118DEC98024320 3.wzrry18DEC9802394118DEC98023941=5PUFDOzP.Mwr\KxQ18DEC9802432618DEC980243253.Nwr]KxQ18DEC9802432618DEC9802432632.Ow!!r[qxQ18DEC9802432618DEC98024326 3 L.Pw8[qxQ18DEC9802432618DEC9802432645PUFDOz,PPUFDPz,P.,PJJJ :}}18DEC9802470018DEC98024700I.,sz18DEC9802505018DEC98024700;;.,!"18DEC9802470118DEC98024701 -.,K18DEC9802470218DEC98024701N.,CDv18DEC9802470218DEC98024702BU. ,s18DEC9802470218DEC98024702.!,z!!sy18DEC9802470318DEC98024702 ".",z18DEC9802470318DEC98024703;?.#,zHzy18DEC9802470318DEC98024703J^.$,18DEC9802470318DEC98024703P.%,z y18DEC9802470418DEC98024704`.&,18DEC9802470418DEC98024704eպ.',zy18DEC9802470418DEC98024704l,.(,18DEC9802470418DEC98024704n׵.),$y18DEC9802470518DEC98024705pv.*, K18DEC9802470518DEC98024705 qL0.+,z Ky18DEC9802470518DEC98024705 ~'.,,18DEC9802470518DEC98024705.-, Ts18DEC9802470618DEC98024706i..,zTsy18DEC9802470618DEC980247064\./,s18DEC9802470618DEC98024706h.0,z|sy18DEC9802470618DEC98024706a[.1,s18DEC9802470718DEC98024707-g.2,z$sy18DEC9802470718DEC98024707+].3,s18DEC9802470718DEC98024707ai.4,z$sy18DEC9802470818DEC98024707^].5, s18DEC9802470818DEC98024708l.6,z< sy18DEC9802470818DEC98024708_.7, s18DEC9802470818DEC98024708nn.8,zsy18DEC9802470918DEC98024708J`.9,Ls18DEC9802470918DEC98024709Òv.:,zLsy18DEC9802470918DEC98024709Ғa.;,s18DEC9802471018DEC98024709Ԓom.<,zLsy18DEC9802471018DEC98024710.=,_18DEC9802471018DEC98024710kg$.>, s18DEC9802471118DEC98024711og==.?,zsy18DEC9802471118DEC98024711*d,.@,Ms18DEC9802471118DEC98024711wgi.A,z4Msy18DEC9802471218DEC98024711+d\.B, LSs18DEC9802471218DEC98024712{gt.C,zLSsy18DEC9802471218DEC98024712,dc.D, /.x,7818DEC9802434218DEC980243426I>F>.y,VW18DEC9802434318DEC98024343U>E.z,MN%18DEC9802434318DEC98024343L>.{,Ks18DEC9802434418DEC98024344#?.},CD18DEC9802434418DEC98024344B(?.~,#$(18DEC9802434518DEC98024345"k?C.,)*[q18DEC9802434518DEC98024345(?J9.,18DEC9802434618DEC98024345ܷ?}.,(18DEC9802434618DEC98024346@.,[q18DEC9802434718DEC98024347PAP.,:;)!18DEC9802434818DEC980243479B.,)![q18DEC9802434818DEC98024348MB94.,23"18DEC9802434818DEC980243481jB.,'(&M18DEC9802434918DEC98024348&B.,?@&M818DEC9802434918DEC98024349>B2r.,x'18DEC9802434918DEC98024349C8.,HIx'(18DEC9802435018DEC98024350GCD.,dex'[q18DEC9802435018DEC98024350cC|.,FG'18DEC9802435118DEC98024351E8D.,]^(18DEC9802435118DEC98024351\~D .,IJ((18DEC9802435218DEC98024351HD.,JK([q18DEC9802435218DEC98024352I$Ef.,R)18DEC9802435218DEC98024352nE., w*?T18DEC9802435318DEC98024352 tEv .,MN218DEC9802435318DEC98024353LE$.,452[q18DEC9802435418DEC980243533E\.,318DEC9802435418DEC98024354F~.,NO418DEC9802435518DEC98024354MFs .,~818DEC9802435518DEC98024355}G?.,gh8(18DEC9802435618DEC98024355fGP.,ij8[q18DEC9802435618DEC98024356hG-.,<=y:18DEC9802435718DEC98024356;dH.,-.:18DEC9802435718DEC98024357,H.,z{:18DEC9802435718DEC98024357yH@.,UV:(18DEC9802435818DEC98024357TGIkD.,WX:[q18DEC9802435818DEC98024358VI.,01:18DEC9802435918DEC98024358/Il.,:[q18DEC9802435918DEC98024359#JO.,STbK18DEC9802435918DEC98024359R8J-.,)*bK(18DEC9802440018DEC98024359(J'.,34bK[q18DEC9802440018DEC980244002Jr.,23YM18DEC9802440018DEC980244001J.,KLM18DEC9802440118DEC98024400JK.,M[q18DEC9802440118DEC98024401dK_.,cdkQ18DEC9802440218DEC98024401bK8.,HIkQ(18DEC9802440218DEC98024402GKG.,HIkQ[q18DEC9802440218DEC98024402G,Lʐ.,"#oQ18DEC9802440318DEC98024403!tLq.,Q18DEC9802440318DEC98024403L.,Q18DEC9802440418DEC98024403ŴLW.,Q18DEC9802440418DEC98024404zM;k.,Q18DEC9802440418DEC98024404~MYl.,Q%18DEC9802440518DEC98024404M.,Q+18DEC9802440518DEC98024405M&.,Q18DEC9802440518DEC98024405M.,DR18DEC9802440618DEC98024405גM۵.,KSs18DEC9802440618DEC98024406jNV.,56S18DEC9802440718DEC980244074sN.,;Ts18DEC9802440718DEC98024407NX.,WXaT18DEC9802440818DEC98024408VN@.,Ts18DEC9802440818DEC98024408OtZ.,:;7fHd?tNHzy:ҀD 0H NHHyH "H XHpHp{H{H`|H HHzHH'H pH"ZH$2xxH&;F H(;F H*;TXuH,;TuH.;TuH0zP|Hz;F3 H;F4 H^d2H^dKH4 H@HJ4HJ HJHJHJGHJVTHJYTHJ\THJ:dHRJwHJKwHJwHDJzHJHCTHF۪H۪H۪HѫBxH001001SYSTEMSYSTEM SYSTEM SY00Qz200001USER USER A.NEW SY00QJ00DATADATADATADATADATADATADATADATADATADATA00& <s% <Ct0CtCt h)))l/t/0 08;KEXDΫDϫB.?@A4GxnG{nGnGjqg;qz8OH;OHKOH:$ة,j(,2,x,{"zIR/I/J< 0J[J[K:[Lks"HtMtLtL8h4;h Kh2/2/2 0|[ RMt!!!!!! '!)W0'!)V'!)W6!8^6!;6!K[!8:[!;[!Kq!tXq!tWq!tXs!8hYs!;hXvs!KhY0""Y #)Zf #)Z" #)Z #8[` #;[ #K[#8\f#;[#K\v#H#Hd# I"#xU]#{U]t#U]< & &Q !&9!&Jt"& "&)"&)"&Hb"& I"&z/&&$:/&)V/&9h/&Jh2&2& ^3&^+bI& HI&8zI&;8I&K&Py&^^&b^&bz&:$&{; (^((z\(*(8(;,x<;,{<;,<A,x<*A,{<xA,<RE,kKc E,KenE,8OdlE,5TADATADATADATADATADATADATADATADATAIq8z\q6qq0or/Nor/Hor 0bor[or[or[r)lsx<ns{<s<;s8;s; ;sKUs) Us)Us)cs8cs;csK^sxU&s{UsUss8stv9wx 9w{ N9w 9wKO:wP~:wbDwx<Dw{<Dw<jaw8aw;awK`iwtiwt|iwtNrwrwBrw &rw8hrw;hrwKhuw["uw[uw[|w)w)~w)<wx w{ w Jx/x/x 0dx8h ySDy |yyy Cy:&Eyx Ey{ NEy Ny8zNy;PNyK Ryx jRy{ $Ry Wy[Wy[&Wy[Jyx y{ y yx py{ *y y) y),y)y8 y; yK hyx y{ y y)&y)y)y}yxUy{UdyU.yaya>y by8hTy;h,yKhyx# y{# ty# 24zD4z4zDzHDzHDz IZkz8 kz;kzKr}x $}{ } ~/~/~ 0~[~[~[[X3c')')d')I8hnI;h(IKhL:1fL8hfL;hLKhS8rS;SKSzSzbS {4S8 RS; SK |x |{ 2|   [[[8bSdb ,58hl5;h5Kh>}>/b/8 0aa bx#l{#,#\,E\tH@\ Ila w,"2RwtR3r\a Te^Ra ^2 .BLKB NFILES*S.BFHD+B .IFF .BLKB NFILES*T .ENDC .PSECT PSECTL .ENDM FSRSZ$fb  .MACRO FDBDF$ .MCALL FDBSZ$ FDBSZ$B ...PC1=.L .BLKB S.FDB .ENDM FDBDF$Eb ' .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$Ab  .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$Ab ( .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$ACb ! .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$AOb , .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$ACb + .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$RBb ! .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$RFb , .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$b % .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 b 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~b  .MACRO FDBSZ$ .IIF DF,S.FDB,.MEXIT .MCALL FDOFF$,DEF$L FDOFF$ DEF$NC DEF$L S.FDB .ENDM FDBSZ$BRb  .MACRO FDOF$L .MCALL FDOFF$ FDOFF$ DEF$L .ENDM FDOF$LCb + .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$SRb  .MACRO NBOF$L .MCALL NBOFF$ NBOFF$ DEF$LD .ENDM NBOF$LEb  .MACRO LDFDB$ FDB .IIF B,FDB,.MEXIT .NTYPE PAR$$$,FDB .IIF EQ,PAR$$$,.MEXIT MOV FDB,R0 .ENDM LDFDB$b  .MACRO CMOV$W VAR,OFFSET. .IF IDN,<#0>,. CLR OFFSET(R0)A .MEXITM .ENDC .IIF NB,VAR, MOV VAR,OFFSET(R0) .ENDM CMOV$WVb  .MACRO CMOV$B VAR,OFFSETM .IF IDN,<#0>,N CLRB OFFSET(R0) .MEXIT .ENDC! .IIF NB,VAR, MOVB VAR,OFFSET(R0)B .ENDM CMOV$Bb  .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$2Rb 00"V7"8s .NCHR ...PC3, .IF GE MAXLG-...PC3F ...PC2=., .=...PC1+OFFSET .ASCII ^VAR^F .REPT MAXLG-...PC3 .BYTE FILLS .ENDR .=...PC2R .IFF .ERROR .ENDCB .ENDC .ENDM CSTRG$NZb  .MACRO CGET$B OFFSET,VARV" .IIF NB MOVB OFFSET(R0),VAR .ENDMZb  .MACRO CGET$W OFFSET,VARF! .IIF NB MOV OFFSET(R0),VARS .ENDMb  .MACRO FCSBT$ GLOBL .MCALL DEFIN$ ...GBL=0R" .IIF IDN,,,...GBL=1 DEFIN$ FD.FTN,<^O1> DEFIN$ FD.CR, <^O2> DEFIN$ FD.PRN,<^O4> DEFIN$ FD.BLK,<^O10>S DEFIN$ FD.RWM,<^O1> DEFIN$ FD.RAN,<^O2> DEFIN$ FD.PLC,<^O4> DEFIN$ FD.INS,<^O10>I DEFIN$ FD.REC,<^O1> DEFIN$ FD.CCL,<^O2> DEFIN$ FD.TTY,<^O4> DEFIN$ FD.DIR,<^O10>, DEFIN$ FD.SDI,<^O20>V DEFIN$ FD.SQD,<^O40>M1 DEFIN$ FD.32B,<^O2000> ; DEVICE USES 32-BIT LBNSI7 DEFIN$ FD.ISP,<^O4000> ;INPUT SPOOLING (NOTE: CHANGED)( DEFIN$ FD.OSP,<^O4000> ;OUTPUT SPOOLING DEFIN$ FD.PSE,<^O10000> DEFIN$ FD.COM,<^O20000> DEFIN$ FD.F11,<^O40000> DEFIN$ FD.MNT,<^O100000>O DEFIN$ NB.VER,<^O1> DEFIN$ NB.TYP,<^O2> DEFIN$ NB.NAM,<^O4> DEFIN$ NB.SVR,<^O10>O DEFIN$ NB.STP,<^O20>0 DEFIN$ NB.SNM,<^O40>> DEFIN$ NB.DIR,<^O100> DEFIN$ NB.DEV,<^O200> DEFIN$ NB.SD1,<^O400> DEFIN$ NB.SD2,<^O1000>F DEFIN$ NB.ANS,<^O2000>N DEFIN$ NB.WCH,<^O4000>E DEFIN$ NB.WLV,<^O10000> DEFIN$ NB.SUP,<^O20000> DEFIN$ R.FIX,<^O1>D DEFIN$ R.VAR,<^O2>O DEFIN$ R.SEQ,<^O3>G DEFIN$ R.STM,<^O4>0 DEFIN$ FA.RD, <^O1> DEFIN$ FA.WRT,<^O2> DEFIN$ FA.EXT,<^O4> DEFIN$ FA.CRE,<^O10>F DEFIN$ FA.TMP,<^O20>N DEFIN$ FA.SHR,<^O40>  DEFIN$ FA.APD,<^O100> DEFIN$ FA.NSP,<^O100> DEFIN$ FO.RD,FA.RD # DEFIN$ FO.WRT,FA.WRT!FA.EXT!FA.CRE># DEFIN$ FO.APD,FA.WRT!FA.EXT!FA.APDS DEFIN$ FO.MFY,FA.WRTS DEFIN$ FO.UPD,FA.WRT!FA.EXT DEFIN$ FA.ENB,<^O100000>O DEFIN$ FA.SEQ,<^O40000> DEFIN$ FA.WCK,<^O20000> DEFIN$ FA.POS,<^O10000> DEFIN$ FA.RWD,<^O4000> DEFIN$ FA.EXL,<^O4000>F DEFIN$ FA.LKL,<^O2000>  DEFIN$ FA.EXC,<^O2000>W DEFIN$ FA.DLK,<^O1000>< DEFIN$ CH.AND,<^O1> DEFIN$ FD.RAH,<^O1> DEFIN$ FD.WBH,<^O2> DEFIN$ FL.AEX,<^O1> DEFIN$ FL.VCP,<^O2> DEFIN$ FF.RWD,<^O1> DEFIN$ FF.POE,<^O2> DEFIN$ FF.NV, <^O3> DEFIN$ FF.SPC,<^O4> DEFIN$ FF.CHR,<^O5> DEFIN$ FF.RWF,<^O6> DEFIN$ FT.ANI,<^O1> DEFIN$ FT.BBF,<^O2> DEFIN$ FT.MBF,<^O4> .MACRO FCSBT$ ARG .ENDM FCSBT$W .ENDM FCSBT$Dfb  .MACRO DEFIN$ SYM,VAL .IIF EQ,...GBL-1,.GLOBL SYM SYM=^O .ENDM DEFIN$b  .MACRO FDOFF$ OFFSET< .MCALL OFFSET,DEF$I,NBOFF$> 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,100"^5TADATADATADATADATADATADATADATADATA OFFSET FX.DLN,1 OFFSET FX.DIR,2 .MACRO FDOFF$ ARG .ENDM FDOFF$ .ENDM FDOFF$Eb  .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$.vb  .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,,,.MEXITD .MACRO NBOFF$ ARG .ENDM NBOFF$F .ENDM NBOFF$Fxb  .MACRO FSROF$ OFFSET1! .MCALL OFFSET,DEF$I,DEF$L,DEFIN$Y ...GBL=0M# .IIF IDN,,,...GBL=1. 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.O OFFSET A.IOST,4 OFFSET A.DFDR,26. OFFSET A.DFBC,2 OFFSET A.DFUI,2 OFFSET A.JUMP,4 OFFSET A.MODE,2 .IF DF L$$GCL .IF DF V$$ACP OFFSET A.EXDS,52. DEFIN$ S.EXDS,52. OFFSET A.LGBK,80. DEFIN$ S.LGBK,80. OFFSET A.PRS,34.. DEFIN$ S.PRS,34.M OFFSET A.FLAG,2 DEFIN$ AF.CCR,1 DEFIN$ AF.RLG,2 .IFFF OFFSET A.EXDS,12. DEFIN$ S.EXDS,12. OFFSET A.LGBK,40. DEFIN$ S.LGBK,40. OFFSET A.PRS,28.O DEFIN$ S.PRS,28.F .ENDC .IFFO OFFSET A.EXDS,12. DEFIN$ S.EXDS,12. .ENDC OFFSET S.FSR2 DEF$L S.FSR2  DEF$I 0 OFFSET A.F5SZ,2 OFFSET A.LDVL,2 OFFSET A.LDVA,2 OFFSET A.LDIL,2 OFFSET A.LDIA,2 .IF DF V$$ACP OFFSET A.OUBK,80. OFFSET A.LODV,6 OFFSET A.LODI,52. OFFSET A.LIDV,6 OFFSET A.LIDI,52. OFFSET A.INBK,80. DEFIN$ S.LDV,6G DEFIN$ S.LDI,52.1 .IFFN OFFSET A.OUBK,40. OFFSET A.LODV,6 OFFSET A.LODI,12. OFFSET A.LIDV,6 OFFSET A.LIDI,12. OFFSET A.INBK DEFIN$ S.LDV,6. DEFIN$ S.LDI,12.. .ENDC OFFSET S.FSR5 DEF$I 0 OFFSET ,16. OFFSET D.DFID,6 OFFSET D.DFDV,2 OFFSET D.DFUN,2! .IIF IDN,,,.MEXITE .MACRO FSROF$ ARG .ENDM FSROF$E .ENDM FSROF$Fb  .MACRO FDSOF$ OFFSET. .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,,F DEF$L S.FIDS .MEXIT. .ENDC .MACRO FDSOF$ ARG .ENDM FDSOF$6 .ENDM FDSOF$Irb  .MACRO DEF$G VAR,SIZD .MCALL DEF$L. .IIF NB,VAR,.GLOBL VAR DEF$L VAR,SIZ .ENDM DEF$GVb  .MACRO DEF$N VAR,SIZF .MCALL DEF$L, DEF$L ,SIZE .ENDM DEF$NFb  .MACRO DEF$I IVAL ...TPC=^O .ENDM DEF$Ib  .MACRO DEF$L SYM,SIZI .IF NB,SYMI SYM=^O<...TPC>D .ENDC .IF NB,SIZ ...TPC=^O<...TPC+SIZ> .ENDC .ENDM DEF$Lb  .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$Fb  .MACRO ABRT$C TSK,PSCT,ERRR .MCALL ABRT$,DIR$ .IF NDF $$$GLBM .PSECT $DPB$.,D$$$=. .IFTF ABRT$ TSK .IFTF .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM ABRT$C.b  .MACRO ABRT$S NADR,ERR .MCALL RFA$,DIR$A RFA$ NADR MOV (PC)+,-(SP) .BYTE 83.,3 DIR$ ,ERR .ENDM ABRT$SCb  .MACRO ABRT$ TSKD .MCALL R50$,OFF$G .IF NDF $$$GLB^ .BYTE 83.,3 R50$ TSKE .ENDC .IF NDF A.BTTNA .NLIST. OFF$2 OFF$ A.BTTN,4 .LIST .ENDC .ENDM ABRT$vb & .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 NDF00"f7"8s,,,> OFF$ X3 .ENDM .IRP X,<,> OFF$ XA .ENDM .ENDC .ENDM ACHN$b . .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$b + .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$S2b # .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$CKb  .MACRO ALTP$S NAME,PRI,ERR$ .MCALL MOV$,RFA$,DIR$ MOV$ PRI RFA$ NAME MOV (PC)+,-(SP) .BYTE 9.,4B DIR$ ,ERR .ENDM ALTP$SMb  .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$b  .MACRO ALUN$C LUN,DA,DU,CS,ERR .MCALL ALUN$,DIR$ .IF NDF $$$GLBS .PSECT $DPB$.,D$$$=.C .IFTF ALUN$ LUN,DA,DU .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ALUN$CIb  .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$SFRb  .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$b  .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$Cb  .MACRO ASTX$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 115.,1L DIR$F .IIF NB , JSR PC,ERR .ENDM ASTX$SAZb  .MACRO ASTX$T .IF NDF $$$GLBO .BYTE 115.,1 .ENDC .ENDM ASTX$b  .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$b  .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.b  .MACRO ATRG$S RDB,ERR .MCALL DIR$,MOV$$ MOV$ RDB MOV (PC)+,-(SP) .BYTE 57.,2 DIR$ ,ERR .ENDM ATRG$Sb  .MACRO BOM$C STS,FLG,CS,ERR .MCALL BOM$,DIR$  .IF NDF $$$GLB$ .PSECT $DPB$.,D$$$=.D .IFTF BOM$ STS,FLGA .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM BOM$Cb  .MACRO BOM$S STS,FLG,ERRC .MCALL MOV$,DIR$,OFF$ MOV$ FLG. MOV$ STS. MOV (PC)+,-(SP) .BYTE 211.,3. DIR$ ,ERR .ENDM BOM$S b  .MACRO BOM$ STS,FLG .MCALL OFF$ .IF NDF $$$GLBR .BYTE 211.,3M .WORD STS .IF NB FLGC .WORD FLG .IFF. .WORD 0 .ENDC .ENDC .IF NDF B.OMCD .NLISTA$$$OST=0 OFF$, OFF$ B.OMCD,2 OFF$ B.OMFL,2 .LIST .ENDC .ENDM BOM$Dvb  .MACRO BOMDF$ .NLIST. S.BUNK=-128. S.BFEI=0. S.BOVL=1.N S.BBIF=1. .LIST .ENDM BOMDF$ @b  .MACRO CALL ADR JSR PC,ADR .ENDM CALLT<b  .MACRO RETURN RTS PC .ENDM RETURNM>b  .MACRO CALLR ADRS JMP ADR .ENDM CALLRb 0 .MACRO CINT$C VEC,BASE,ISR,DSI,PSW,AST,PSCT,ERR .MCALL CINT$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.$ .IFTF CINT$ VEC,BASE,ISR,DSI,PSW,ASTM .IFT. .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM CINT$C b + .MACRO CINT$S VEC,BASE,ISR,DSI,PSW,AST,ERR1 .MCALL RVP$,DIR$B RVP$ VEC,BASE,ISR,DSI,PSW,AST MOV (PC)+,-(S00"n5TADATADATADATADATADATADATADATADATAP) .BYTE 129.,7C DIR$ ,ERR .ENDM CINT$SALb & .MACRO CINT$ VEC,BASE,ISR,DSI,PSW,AST .MCALL OFF$ .IF NDF $$$GLBN .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$b  .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$Cb  .MACRO CLEF$S EFN,ERR .MCALL MOV$,DIR$$ MOV$ EFN$ MOV (PC)+,-(SP) .BYTE 31.,2 DIR$ ,ERR .ENDM CLEF$SRb  .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$0b , .MACRO CLOG$ MOD,PRMLST,LNS,LNSSZ,ENS,ENSSZ .MCALL OFF$,LNMOD$R .IF NDF $$$GLBD LNMOD$ .BYTE 207.,7E .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> .BYTE 0 .ENDR .ENDC .WORD LNS .WORD LNSSZ .WORD ENS .WORD ENSSZ .ENDC .IF NDF C.LFUN$A .IRP X,<,,,,,>I OFF$ X .ENDM* .IRP X,<,,> OFF$ X .ENDM .ENDC .ENDM CLOG$b 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$CEb 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$ LNSI MVB$ PRMLST MVB$ #0,MOD MOV (PC)+,-(SP) .BYTE 207.,7> DIR$ ,ERR .ENDM CLOG$S2b , .MACRO CLON$ MOD,PRMLST,LNS,LNSSZ,ENS,ENSSZ .MCALL OFF$,LNMOD$ .IF NDF $$$GLB$ LNMOD$F .BYTE 207.,7C .BYTE 11. .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 .ENDC .WORD LNS .WORD LNSSZ .WORD ENS .WORD ENSSZ .ENDC .IF NDF C.LFUN A .IRP X,<,,,,,>C OFF$ X .ENDM* .IRP X,<,,> OFF$ X .ENDM .ENDC .ENDM CLON$b 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$CEb 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$ LNSC MVB$ PRMLST MVB$ #11.,MOD MOV (PC)+,-(SP) .BYTE 207.,7 DIR$ ,ERR .ENDM CLON$S.b  .MACRO COMDF$ DEF .NLISTD .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 = 17767300"v7"8s MOV BUFF,C.CMLD+2(R0) .ENDC .IF NB 4 MOV LEN,C.CMLD(R0)= .ENDC JSR PC,.CSI1= .ENDMb  .MACRO CSI$2 CSBLK,IO,SWTAB .GLOBL .CSI22 .MCALL CSI$,LDR0$ .IF NDF C.SIZEP CSI$ .ENDC LDR0$ CSBLK .IF NB  .IF IDN ,. MOVB #CS.INP,(R0) .IFF. .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 .ENDMb # .MACRO CSI$4 CSBLK,IO,SWTAB,DSCBLKC .GLOBL .CSI44 .MCALL CSI$,LDR0$ .IF NDF C.SIZEP CSI$= .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, .ENDMVb , .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+$$ .ENDM4b  .MACRO CSI$ND .WORD 0 .ENDM$b # .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 IDN ,  .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|b  .MACRO LDR0$ ARG .IIF B,ARG,.MEXIT .NTYPE PAR$$$,ARG .IIF EQ,PAR$$$,.MEXIT MOV ARG,R0. .ENDMb  .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 .00"~5TADATADATADATADATADATADATADATADATAENDM CSI$. .ENDM CSI$.b  .MACRO CSM$ SUPVR .IF IDN <(SP)+>, .WORD 007026. .IFF. MOV SUPVR,-(SP) .WORD 007026 .ENDC .ENDM CSM$Ob  .MACRO CSRQ$C TT,RT,CS,ERRO .MCALL CSRQ$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.O .IFTF CSRQ$ TT,RT .IFT= .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CSRQ$C.b  .MACRO CSRQ$S TN,RN,ERR .MCALL RFA$,DIR$T RFA$ TN MOV (PC)+,-(SP) .BYTE 25.,3 DIR$ ,ERR .ENDM CSRQ$S.b  .MACRO CSRQ$ TT,RT. .MCALL R50$,OFF$ .IF NDF $$$GLBR .BYTE 25.,3 R50$ TT .ENDC .IF NDF C.SRTN. .NLISTP OFF$) OFF$ C.SRTN,4 OFF$ C.SRRN,4 .LIST .ENDC .ENDM CSRQ$b  .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$CAtb  .MACRO DECL$S EFN,ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 35.,1 DIR$ ,ERR .ENDM DECL$S\b  .MACRO DECL$ EFN. .IF NDF $$$GLB .BYTE 35.,1 .ENDC .ENDM DECL$b  .MACRO DIR$ ADR,ERR .IF NB  MOV ADR,-(SP) .ENDC EMT ^O<377> .IIF NB , .MCALL ERR$ .IIF NB , ERR$ ERR .ENDM DIR$CFb ! .MACRO DLOG$ MOD,TBNUM,LNS,LNSSZ$ .MCALL OFF$,LNMOD$E .IF NDF $$$GLBC LNMOD$D .BYTE 207.,5. .BYTE 2 .BYTE MOD .BYTE TBNUM .BYTE 0 .WORD LNS .WORD LNSSZ .ENDC .IF NDF D.LFUN.A .IRP X,<,,,,,>E OFF$ X .ENDM .ENDC .ENDM DLOG$b ) .MACRO DLOG$C MOD,TBNUM,LNS,LNSSZ,CS,ERRR .MCALL DLOG$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=.B .IFTF DLOG$ MOD,TBNUM,LNS,LNSSZ .IFTE .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM DLOG$COb & .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,Hb ! .MACRO DLON$ MOD,TBNUM,LNS,LNSSZ .MCALL OFF$,LNMOD$ .IF NDF $$$GLB LNMOD$L .BYTE 207.,5L .BYTE 12. .BYTE MOD .BYTE TBNUM .BYTE 0 .WORD LNS .WORD LNSSZ .ENDC .IF NDF D.LFUNDA .IRP X,<,,,,,>M OFF$ X .ENDM .ENDC .ENDM DLON$b ) .MACRO DLON$C MOD,TBNUM,LNS,LNSSZ,CS,ERRL .MCALL DLON$,DIR$ .IF NDF $$$GLBV .PSECT $DPB$.,D$$$=.M .IFTF DLON$ MOD,TBNUM,LNS,LNSSZ .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM DLON$C,b & .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$SDb  .MACRO DSAR$C PSCT,ERR .MCALL DSAR$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.M .IFTF DSAR$ .IFTR .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM DSAR$CBpb  .MACRO DSAR$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 99.,1 DIR$ ,ERR .ENDM DSAR$SXb  .MACRO DSAR$D .IF NDF $$$GLBE .BYTE 99.,1 .ENDC .ENDM DSAR$nb  .MACRO EGCMI$ .MACRO GCMLD$ GLOB  .ASECT .=0G.MODE: .BLKW 2E GE.COM = 1R GE.IND = 2M GE.CLO = 4 GE.LC = 10 GE.CON = 20 GE.XXX = 40 GE.MUL = 100$ GE.LIB = 200L GE.MCR = 400B GE.IEF = 1000 GE.RWD = 2000 GE.FOP = 4000 GE.RPR = 10000R GE.SDE = 20000D GE.SER = 40000 GE.SLB = 100000 ; G2.XXX = 1G.IMPS: .BLKB 1CG.OVBC: .BLKB 19G.FILE: .BLKW 1G.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 1G.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 G.DEFT: .WORD ^RCMDG.ISIZ:B .ASECT. .=0G.SUSR: .B00"7"8s,BFAD,BFSZ=80.,PDL,SWIT,?GF,?GB,?GS# .MCALL GCMLD$,CWORD$,CBYTE$,CSTRG$  .MCALL CSI$SW,CSI$SV,CSI$ND .IIF NDF FCS$$ FCS$$=1  GCMLD$ ...PC1=.. .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.CDEP 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 CWORD$ ,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 .ENDMb  .MACRO EL00"5TADATADATADATADATADATADATADATADATAGF$C GROUP,CS,ERRF .MCALL ELGF$,DIR$ .IF NDF $$$GLBB .PSECT $DPB$.,D$$$=.E .IFTF ELGF$ GROUP .IFTS .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ELGF$CTb  .MACRO ELGF$S GROUP,ERR .MCALL MOV$,DIR$A MOV$ GROUPM MOV (PC)+,-(SP) .BYTE 159.,2L DIR$ ,ERR .ENDM ELGF$S$b  .MACRO ELGF$ GROUP .MCALL OFF$ .IF NDF $$$GLBL .BYTE 159.,2R .WORD GROUP .ENDC .IF NDF E.LGRP. .NLIST OFF$M OFF$ E.LGRP,2 .LIST .ENDC .ENDM ELGF$b  .MACRO ENAR$C PSCT,ERR  .MCALL ENAR$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=. .IFTF ENAR$ .IFT. .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM ENAR$Crb  .MACRO ENAR$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 101.,1- DIR$ ,ERR .ENDM ENAR$S Zb  .MACRO ENAR$ .IF NDF $$$GLBF .BYTE 101.,1L .ENDC .ENDM ENAR$b  .MACRO ENCP$C PSCT,ERR. .MCALL ENCP$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.C .IFTF ENCP$ .IFT .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM ENCP$C$pb  .MACRO ENCP$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 97.,1 DIR$ ,ERR .ENDM ENCP$SNXb  .MACRO ENCP$A .IF NDF $$$GLB. .BYTE 97.,1 .ENDC .ENDM ENCP$*b  .MACRO ERR$ ERR .IF NB  .NLISTR .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 .IFF. .IF NE ^O<$$$T1-27> .IIF NE ^O<$$$T1-37>, BCC .+4 .ENDC .ENDC CALL ERRD .ENDC .ENDM ERR$b  .MACRO EXIF$C EFN,CS,ERRP .MCALL EXIF$,DIR$ .IF NDF $$$GLB) .PSECT $DPB$.,D$$$=.R .IFTF EXIF$ EFN .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM EXIF$C.b  .MACRO EXIF$S EFN,ERR .MCALL MOV$,DIR$ MOV$ EFNR MOV (PC)+,-(SP) .BYTE 53.,2 DIR$ ,ERR .ENDM EXIF$S-b  .MACRO EXIF$ EFNB .MCALL OFF$ .IF NDF $$$GLBB .BYTE 53.,2 .WORD EFN .ENDC .IF NDF E.XFEF$ .NLISTB OFF$ OFF$ E.XFEF,2 .LIST .ENDC .ENDM EXIF$b  .MACRO EXIT$C PSCT,ERR, .MCALL EXIT$,DIR$ .IF NDF $$$GLB$ .PSECT $DPB$.,D$$$=.$ .IFTF EXIT$ .IFTN .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM EXIT$CEb  .MACRO EXIT$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 51.,1 DIR$+ .IIF NB , CALL ERR .ENDM EXIT$SEXb  .MACRO EXIT$  .IF NDF $$$GLBL .BYTE 51.,1 .ENDC .ENDM EXIT$b  .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.b  .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$Sb  .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$b  .MACRO EXTM$C INC,MASK,CS,ERR .MCALL EXTM$,DIR$ .IF NDF $$$GLB( .PSECT $DPB$.,D$$$=. .IFTF EXTM$ INC,MASKO .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM EXTM$CIb  .MACRO EXTM$S INC,MASK,ERR .MCALL MOV$,DIR$R MOV$ MASK MOV$ INCF MOV (PC)+,-(SP) .BYTE 89.,3 DIR$ ,ERR .ENDM EXTM$SFb  .MACRO EXTM$ INC,MASK .MCALL OFF$ .IF NDF $$$GLBR .BYTE 89.,3 .WORD INC .IF NB MASK .WORD MASKN .IFFI .WORD 0 .ENDC .ENDC .IF NDF E.XTIN .NLISTX OFF$C OFF$ E.XTIN,2 .LIST .ENDC .ENDM EXTM$b  .MACRO FHDOF$ GLOBALE .MCALL FHDO1$ ...GBL=0S .IF B,GLOBAL$ FHDO1$ DEF$L .IFFE .IF IDN,,. ...GBL=1S .ENDC FHDO1$ GLOBAL .ENDC .IF DIF,, .MACRO FHDOF$ ARG1Y .ENDM FHDOF$  .ENDC .ENDM FHDOF$b  .MACRO FHDO1$ OFFSE00"7"8s,L .MACRO FHDO1$ ARG13 .ENDM FHDO1$D .ENDC .ENDM FHDO1$.b  .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$.b  .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$ Lb @ .MACRO GCMLB$ MAXD,PRMPT,UBUF,LUN,PDL,SIZE=80.,?PDL1,?DFNB,?BUF1 .MCALL FDBDF$,FDAT$A,FDOP$A,NMBLK$,FDBF$A,CBYTE$O FDBDF$ FDAT$A 2I .IF NB . FDOP$A LUN,,DFNBR .IFFO FDOP$A 1,,DFNBO .ENDC FDBF$A ,,1E% CBYTE$ ,F.RCTL1 .MCALL GCMLD$ GCMLD$E .BYTE 0 .IF LE " .BYTE GE.COM!GE.IND!GE.CLO!GE.SIZ .IFF ) .BYTE GE.COM!GE.IND!GE.CLO!GE.CON!GE.SIZ. .ENDC .BLKW 4 .BYTE -1,MAXD .IF B .WORD PDL1O .IFFC .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 SIZEOG.LPDL=*<6+<5*2>> .IF B PDL1: .BLKB G.LPDL .ENDC .IF B CBUF: .BLKB SIZE+2. .ENDC .ENDM GCMLB$Z b  .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$rb  .MACRO RCML$ NAME .MCALL LDR0$$ LDR0$ NAMEM .GLOBL .GCML2 JSR PC,.GCML2 .ENDM RCML$pb  .MACRO CCML$ BLK. .MCALL LDR0$. LDR0$ BLK .GLOBL .GCML3 JSR PC,.GCML3 .ENDM CCML$b  .MACRO GCMLD$ GBL .IF NDF S.FDB .MCALL FDBSZ$ FDBSZ$E .ENDC .MCALL GCML$D GCML$D GBLM .MACRO GCMLD$ X .ENDM .ENDM GCMLD$RNb  .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 =00"5TADATADATADATADATADATADATADATADATA -3N GE.MDE = -4 GE.EOF = -10. GE.RBG = -40.G .MACRO GCML$D X .ENDM .ENDM GCML$D,b $ .MACRO GDVI$C LUN,BUFA,BUFL,CS,ERR .MCALL GDVI$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.B .IFTF GDVI$ LUN,BUFA,BUFL .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GDVI$CM6b  .MACRO GDVI$S LUN,BUFA,BUFL,ERR .MCALL MOV$,DIR$,OFF$ MOV$ BUFL MOV$ BUFA MOV$ LUNE MOV (PC)+,-(SP) .BYTE 5,4 DIR$ ,ERR .IF NDF G.DVNAG .NLIST=$$$OST=0A .IRP X,<,,,,>G OFF$ X  .ENDM .LIST .ENDC .ENDM GDVI$Sb  .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$b  .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. .ENDMpb - .MACRO GIN$C SFCN,P1,P2,P3,P4,P5,P6,P7,P8,P9< .MCALL GIN$,DIR$,GFN$,OFF$  .IF NDF $$$GLBN .SAVE .PSECT $DPB$.,D$$$=.. .IFTF GFN$, .NARG $$$N, $$$I=$$$N, .BYTE 169.,$$$N+1. .IRP $$$PRM, .IF EQ $$$I .MEXITA .IFF$ $$$I=$$$I-1I .ENDC .WORD $$$PRMK .ENDR .IF NDF G.INSFI .NLISTI6 .IRP X,<,,,,> OFF$ X1 .ENDR* .IRP X,<,,> OFF$ X. .ENDR* .IRP X,<,,> OFF$ X, .ENDR .ENDC .IFT< .RESTOREI DIR$ #$$$ .ENDC .ENDM GIN$C<b - .MACRO GIN$S SFCN,P1,P2,P3,P4,P5,P6,P7,P8,P9, .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$Sb , .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$Rb  .MACRO GLUN$C LUN,BUFA,CS,ERR$ .MCALL GLUN$,DIR$ .IF NDF $$$GLBA .PSECT $DPB$.,D$$$=.Y .IFTF GLUN$ LUN,BUFAP .IFTN .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GLUN$C$Lb  .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.b  .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$b  .MACRO GPRT$C PRT,BUF,CS,ERR< .MCALL GPRT$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF GPRT$ PRT,BUF .IFTU .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GPRT$Cb  .MACRO GPRT$S PRT,BUF,ERR .MCALL MOV$,RFA$,DIR$,OFF$L MOV$ BUFU RFA$ PRTB MOV (PC)+,-(SP) .BYTE 65.,4 DIR$ ,ERR .IF NDF G.PRPB, .NLIST2$$$OST=0* .IRP X,<,,> OFF$ 00"7"8s,,> OFF$ XB .ENDM .ENDC .LIST .ENDC .ENDM GPRT$Hb  .MACRO GREG$ RID,BUF6 .MCALL OFF$ .IF NDF $$$GLBP .BYTE 65.,4 .WORD 0,RID .WORD BUF .ENDC .IF NDF G.RGID> .NLIST1 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$b  .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$Cb  .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$SNb  .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$CCrb  .MACRO GSSW$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 125.,1F DIR$ ,ERR .ENDM GSSW$S$Zb  .MACRO GSSW$S .IF NDF $$$GLBS .BYTE 125.,14 .ENDC .ENDM GSSW$b  .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$CFVb  .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,<,,,>. OFF$ X$ .ENDM5 .IRP X,<,,,>1 OFF$ X. .ENDM .LIST .ENDC .ENDM GTIM$S.tb  .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$b  .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$b  .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$b  .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$0b < .MACRO HLPDF$ FILLUN,TILUN,EFN,NAME,FDBIN,DSP,MODULE,FDBOUT$HFDB:: .WORD FDBINL .IF NB FDBOUT .WORD FDBOUT. .IFFG .WORD 0 .ENDC$HLUN1 == FILLUN$HLUN2 == TILUNS $HEFN == EFN$HDSP:: .WORD DSPF$HMOD:: .RAD50 /MODULE/.$HNAME::.ASCII /NAME/S .EVEN .ENDM HLPDF$Ab  .MACRO LNBDF$,L,B,SYSDEF  .SAVE .ASECT. LT.SYS='B'0 LT00"5TADATADATADATADATADATADATADATADATA.GRP='B'1O LT.USR='B'2, LT.TSK='B'3R LT.SES='B'41 LT.INV='B'6, LT.APP='B'5N LS.TRM='B'1N LS.PRV='B'2. LB.LOC='B'1G LB.LOG='B'2 IN.TSK='B'1A IN.SES='B'20 IN.GRP='B'4, IN.SYS='B'10.=0LO$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'1ER$NOD ='B'175550BER$DEV ='B'177100'ER$DIR ='B'177060ER$DNF ='B'177020SER$FNM ='B'176420TER$TYP ='B'174540GER$VER ='B'174460SER$ESS ='B'176640AER$XTR ='B'174340SER$BEQ ='B'177510AER$TRN ='B'174550SER$FTB ='B'176364AFS$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'40A FS$WTY ='B'20$ FS$WVE ='B'101FS$NDF ='B'10000FS$DID ='B'20000 P.LNON ='B'0 P.LNAM ='B'1 P.LDEV ='B'2 P.LNOD ='B'3 .RESTORER .MACRO LNBDF$ X,Y,Z .ENDM .ENDMb  .MACRO MVB$ LOW,HIGHR .IF B .IF B 1 CLR -(SP) .IFF1 CLRB -(SP)R MOVB HIGH,1(SP) .ENDC .IFF .IF B 5 CLR -(SP) MOVB LOW,(SP) .IFF4 MOVB LOW,-(SP)0 MOVB HIGH,1(SP) .ENDC .ENDC .ENDM MVB$4b  .MACRO FHDL2$ GLOBAL4 .MCALL FHDO2$ ...GBL=0W .IF B,GLOBALW FHDO2$ DEF$LW .IFF1 .IF IDN,,D ...GBL=1 .ENDC FHDO2$ GLOBAL .ENDC .IF DIF,,E .MACRO FHDL2$ ARG1$ .ENDM FHDL2$ .ENDC .ENDM FHDL2$b  .MACRO FHDO2$ OFFSET. .MCALL DEF$I,OFFSET,DEFIN$F DEF$I 0 OFFSET H.IDOF,1 OFFSET H.MPOF,1 OFFSET H.ACOF,15 OFFSET H.RSOF,1  OFFSET H.FSEG,2M OFFSET H.FLEV,2V OFFSET H.FNUM,2 OFFSET H.FSEQ,2 OFFSET H.FRVN,2 OFFSET H.EFNU,2 OFFSET H.EFSQ,2 OFFSET H.ERVN,2 OFFSET H.UFAT,32. OFFSET H.FCHA OFFSET H.UCHA OFFSET ,1 OFFSET H.SCHA OFFSET ,3 DEFIN$ UC.CON,200 DEFIN$ UC.DLK,100 DEFIN$ UC.CNB,40R DEFIN$ UC.WCK,20N DEFIN$ UC.RCK,10 DEFIN$ UC.WBK,4 DEFIN$ UC.NBK,2 DEFIN$ SC.SPL,20. DEFIN$ SC.DIR,40S DEFIN$ SC.BAD,100 DEFIN$ SC.MDL,200 OFFSET H.RPRO,2 OFFSET H.USE,15 OFFSET H.PRIV,1 OFFSET H.FOWN OFFSET H.PROG,2 OFFSET H.PROJ,2 OFFSET H.FPRO,2 DEFIN$ FP.RDV,1 DEFIN$ FP.WRV,2 DEFIN$ FP.EXE,4 DEFIN$ FP.DEL,10. OFFSET H.BFNU,2 OFFSET H.BFSQ,2 OFFSET H.BRVN,2 OFFSET H.SEMK,4 OFFSET S.HDHD F DEF$I 0 OFFSET I.FNAM,20. OFFSET I.RVNO,2 OFFSET I.CRDT,8. OFFSET I.RVDT,8. OFFSET I.EXDT,8. OFFSET I.BKDT,8.D OFFSET I.ULAB,80. OFFSET S.IDHD DEF$I 0 OFFSET S.MPHD DEFIN$ H.CKSM,510.  .IF DIF,,2 .MACRO FHDO2$ ARG1O .ENDM FHDO2$ .ENDC .ENDM FHDO2$ b  .MACRO HMBL2$ GLOBALO .MCALL HMBO2$ ...GBL=0N .IF B,GLOBALF HMBO2$ DEF$LD .IFFP .IF IDN,, ...GBL=1F .ENDC HMBO2$ GLOBAL .ENDC .IF DIF,,F .MACRO HMBL2$ ARG1. .ENDM HMBL2$E .ENDC .ENDM HMBL2$R$b  .MACRO HMBO2$ OFFSETT .MCALL DEF$I,OFFSET,DEFIN$F DEF$I 0 OFFSET H.HBLB,4 OFFSET H.AHLB,4 OFFSET H.IHLB,4 OFFSET H.VLEV,2 OFFSET H.SBCL,2 OFFSET H.HBVB,2 OFFSET H.AHVB,2 OFFSET H.IHVB,2 OFFSET H.IBVB,2 OFFSET H.IBLB,4 OFFSET H.FMAX,4 OFFSET H.IBSZ,2 OFFSET H.RSVF,2 OFFSET H.DVTY,2 OFFSET H.RVN,2 OFFSET H.NVOL,2 OFFSET H.VCHA,2 OFFSET H.VOWN,4 OFFSET H.VSMX,4 OFFSET H.VPRO,2 OFFSET H.DFPR,2 OFFSET H.DRPR,2 OFFSET H.CHK1,2 OFFSET H.VDAT,8. OFFSET H.WISZ,1 OFFSET H.LRUC,1 OFFSET H.FIEX,2 OFFSET ,384. OFFSET H.SRLN,4 OFFSET H.SNAM,12. OFFSET H.INDN,12. OFFSET H.INDO,12. OFFSET H.INDF,12. OFFSET ,2 OFFSET H.CHK2,2 .IF DIF,,O .MACRO HMBO2$ ARG1E .ENDM HMBO2$F .ENDC .ENDM HMBO2$.b  .MACRO SCBL2$ GLOBAL2 .MCALL SCBO2$ ...GBL=0 .IF B,GLOBALE SCB00"7"8s,F ...GBL=12 .ENDC SCBO2$ GLOBAL .ENDC .IF DIF,,F .MACRO SCBL2$ ARG1E .ENDM SCBL2$F .ENDC .ENDM SCBL2$.Xb  .MACRO SCBO2$ OFFSET .MCALL DEF$I,OFFSET,DEFIN$. DEF$I 0 OFFSET ,2 OFFSET C.SBCL,2 OFFSET C.VSIZ,4 OFFSET C.SECT,4 OFFSET C.TRAK,4 OFFSET C.CYLN,4 OFFSET C.STAT,2 DEFIN$ SC.TRN,1 OFFSET ,486.B OFFSET C.CKSM,2 .IF DIF,,2 .MACRO SCBO2$ ARG1. .ENDM SCBO2$G .ENDC .ENDM SCBO2$b  .MACRO OFF$ SYMB,LENB .IF B <'SYMB'LEN>$$$OST=2 .MEXIT. .ENDC .IF NB  .IF NDF $$$GLBA SYMB=$$$OSTS .IFF SYMB==$$$OST .ENDC .ENDC .IF NB A$$$OST = ^O<$$$OST+LEN>L .ENDC .ENDM OFF$.Vb  .MACRO .PICOD NAME=PIC$IF .PSECT NAME RO,I,LCL,REL,CON .ENDMVb  .MACRO .PCODE NAME=PUR$I .PSECT NAME RO,I,LCL,REL,CONB .ENDMVb  .MACRO .IDATA NAME=IMP$DR .PSECT NAME RW,D,LCL,REL,CON .ENDMVb  .MACRO .PDATA NAME=PUR$D$ .PSECT NAME RO,D,LCL,REL,CON .ENDMVb  .MACRO .ODATA NAME=IMP$DO .PSECT NAME RW,D,LCL,REL,OVRY .ENDMb V .MACRO PFCS$ MOD,TBMSK,LUN,PRBUF,PRSZ,RSBUF,RSSZ,RSLEN,PRSBLK,PRSSZ,DFNBK,DFNSZ,RSMSK .MCALL OFF$,LNMOD$F .IF NDF $$$GLB, LNMOD$, .BYTE 207.,13. .BYTE 8. .BYTE MOD .BYTE LUN .BYTE TBMSK .WORD PRBUF .WORD PRSZN .WORD RSBUF .WORD RSSZR .WORD RSLEN .WORD PRSBLK .WORD PRSSZ .WORD DFNBK .WORD DFNSZ .WORD RSMSK .ENDC .IF NDF F.LMODS6 .IRP X,<,,,,> OFF$ XA .ENDM5 .IRP X,<,,,> OFF$ X .ENDM5 .IRP X,<,,,>P OFF$ XK .ENDM .IRP X,<,>N OFF$ X, .ENDM .ENDC .ENDM PFCS$Hb ^ .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$CRb [ .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$SKb 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$Fb ] .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.~b 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$SMb . .MACRO PRINT$ FDB,ERR,?LBL,A,B,C,D,E,F,?LBL2 .MCALL CALL,CLOSE$,LDR0$,GLUN$S% L00"5TADATADATADATADATADATADATADATADATADR0$ FDB ;LOAD FDB ADDRESS INTO R0 TST F.BDB(R0) BEQ LBL MOV R1,-(SP)B MOV R2,-(SP)S MOV R3,-(SP),/ MOV SP,R1 ;SAVE POINTER TO END OF SEND BUFFER$/ SUB #<8.*2>,SP ;ALLOCATE A GET LUN INFO BUFFERV MOV SP,R2 MOVB F.LUN(R0),R3 GLUN$S R3,R2E% MOV G.LUCW(R2),R3 ;SAVE CHAR. WORD 1Z 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) ;PUSH 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$Eb 6 .MACRO QIO$C FNC,LUN,EFN,PRI,IOST,AST,PRMLST,PSCT,ERR .MCALL QDPB$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=.  .IFTF* QDPB$ 1,FNC,LUN,EFN,PRI,IOST,AST, .IFTC .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM QIO$Cb 1 .MACRO QIO$S FNC,LUN,EFN,PRI,IOST,AST,PRMLST,ERR  .MCALL QDPB$S/ QDPB$S 1,FNC,LUN,EFN,PRI,IOST,AST,,ERRE .ENDM QIO$Sb , .MACRO QIO$ FNC,LUN,EFN,PRI,IOST,AST,PRMLST .MCALL QDPB$R* QDPB$ 1,FNC,LUN,EFN,PRI,IOST,AST, .ENDM QIO$Rb 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$CIb 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 QIOW$S$b - .MACRO QIOW$ FNC,LUN,EFN,PRI,IOST,AST,PRMLSTN .MCALL QDPB$S* QDPB$ 3,FNC,LUN,EFN,PRI,IOST,AST, .ENDM QIOW$b  .MACRO RCVD$C TN,BA,CS,ERRC .MCALL RCVD$,DIR$ .IF NDF $$$GLBS .PSECT $DPB$.,D$$$=.F .IFTF RCVD$ TN,BA .IFTI .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RCVD$CEb  .MACRO RCVD$S TN,BA,ERR .MCALL MOV$,DIR$, RFA$E MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 75.,4 DIR$ ,ERR .ENDM RCVD$S<b  .MACRO RCVD$ TN,BA .MCALL OFF$, R50$ .IF NDF $$$GLB, .BYTE 75.,4 R50$ TN .WORD BAQ .ENDC .IF NDF R.VDTNS .NLISTM .IRP X,<,,> OFF$ XR .ENDM .LIST .ENDC .ENDM RCVD$b  .MACRO RCVX$C TN,BA,CS,ERRF .MCALL RCVX$,DIR$ .IF NDF $$$GLBC .PSECT $DPB$.,D$$$=.N .IFTF RCVX$ TN,BA .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RCVX$C,b  .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.b  .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$b  .MACRO RFA$ ADR .IF NB . .NLISTV .NTYPE $$$T2,ADR. .LIST .IF LT $$$T2-6 MOV 2(ADR),-(SP)$ MOV (ADR),-(SP) .IFFA MOV ADR,-(SP) MOV @(SP),-(SP) ADD #2,2(SP)M MOV @2(SP),2(SP)M .ENDC .IFF CLR -(SP) CLR -(SP) .ENDC .ENDM RFA$b ? .MACRO RLOG$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD. .MCALL OFF$,LNMOD$B .IF NDF $$$GLBN LNMOD$ .BYTE 207.,10. .BYTE 10. .BYTE MOD 00"7"8s,,,,> OFF$ X- .ENDM@ .IRP X,<,,,,> OFF$ XS .ENDM .ENDC .ENDM RLOG$b G .MACRO RLOG$C MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,CS,ERR .MCALL RLOG$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=.0 .IFTF8 RLOG$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RLOG$C.@b 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$SRb ? .MACRO RLON$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMODM .MCALL OFF$,LNMOD$N .IF NDF $$$GLBZ LNMOD$ .BYTE 207.,10.S .BYTE 14. .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 RLON$b G .MACRO RLON$C MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,CS,ERR .MCALL RLON$,DIR$ .IF NDF $$$GLBZ .PSECT $DPB$.,D$$$=.0 .IFTF8 RLON$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RLON$C.@b 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$SRb  .MACRO RRST$ WDBL .MCALL OFF$ .IF NDF $$$GLB. .BYTE 213.,2D .WORD WDB .ENDC .IF NDF R.RSBAZ OFF$D OFF$ R.RSBA,2 .ENDC .ENDM RRST$b  .MACRO RRST$C WDB,CS,ERRA .MCALL RRST$,DIR$ .IF NDF $$$GLB, .PSECT $DPB$.,D$$$=.R .IFTF RRST$ WDB .IFTM .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RRST$CSb  .MACRO RRST$S WDB,ERR .MCALL DIR$,MOV$B MOV$ WDB MOV (PC)+,-(SP) .BYTE 213.,2 DIR$ ,ERR .ENDM RRST$SRb  .MACRO RSUM$C TN,CS,ERR .MCALL RSUM$,DIR$ .IF NDF $$$GLB$ .PSECT $DPB$.,D$$$=.O .IFTF RSUM$ TNF .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RSUM$Cb  .MACRO RSUM$S TN,ERRR .MCALL RFA$,DIR$I RFA$ TN MOV (PC)+,-(SP) .BYTE 47.,3 DIR$ ,ERR .ENDM RSUM$S.b  .MACRO RSUM$ TN .MCALL R50$,OFF$S .IF NDF $$$GLB .BYTE 47.,3 R50$ TN .ENDC .IF NDF R.SUTNV .NLISTM OFF$+ OFF$ R.SUTN,4 .LIST .ENDC .ENDM RSUM$b * .MACRO RVP$ P0,P1,P2,P3,P4,P5,P6,P7,P8,P9 .MCALL MOV$ .NLIST$ .NARG $$$ARG. .LIST .IIF GT $$$ARG-9., MOV$  .IIF GT $$$ARG-8., MOV$ N .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$.b  .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$$b  .MACRO SETF$C EFN,CS,ERRP .MCALL SETF$,DIR$ .IF NDF $$$GLBI .PSECT $DPB$.,D$$$=. .IFTF SETF$ EFN .IFT> .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SETF$CMb  .MACRO SETF$S EFN,ERR .MCALL MOV$,DIR$ MOV$ EFNM MOV (PC)+,-(SP) .BYTE 33.,2 DIR$ ,ERR .ENDM SETF$SCb  .MACRO SETF$ EFN .MCALL OFF$ .IF NDF00"5TADATADATADATADATADATADATADATADATA $$$GLB$ .BYTE 33.,2 .WORD EFN .ENDC .IF NDF S.ETEF .NLIST OFF$ OFF$ S.ETEF,2 .LIST .ENDC .ENDM SETF$b  .MACRO SNPDF$ GBL .IF IDN ,7 .GLOBL SB.CTL,SB.DEV,SB.UNT,SB.EFN,SB.ID,SB.LM1,SB.PMDF1 .GLOBL SC.HDR,SC.LUN,SC.OVL,SC.STK,SC.WRD,SC.BYT. .ENDCM SB.CTL = 0 SB.DEV = 2 SB.UNT = 4#SB.DSW = 5 ;DIRECTIVE STATUS WORDM SB.EFN = 6SB.ID = ^O<10>.SB.LM1 = ^O<12> SB.PMD = ^O<32>$ SC.HDR = 1 SC.LUN = 2 SC.OVL = 4SC.STK = ^O<10>$SC.WRD = ^O<20>$SC.BYT = ^O<40>. .MACRO SNPDF$ X .ENDM .ENDM SNPDF$Sb : .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$Ab < .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$,b  .MACRO SNXC$ DEVICE,UNIT .MCALL OFF$ .IF NDF $$$GLBD .BYTE 127.,3. .IF B DEVICE# .WORD 0 .IFFW $$$T2=. .ASCII /DEVICE/ .=$$$T2+2 .ENDC .BYTE UNIT .BYTE 0 .ENDC .IF NDF S.NXDV .IRP X,<,,> OFF$ X .ENDM .ENDC .ENDM SNXC$b ! .MACRO SNXC$C DEVICE,UNIT,CS,ERRP .MCALL SNXC$,DIR$ .IF NDF $$$GLBB .PSECT $DPB$.,D$$$=.P .IFTF SNXC$ DEVICE,UNIT .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SNXC$CMb  .MACRO SNXC$S DEVICE,UNIT,ERR .MCALL DIR$,MOV$. MOV$ UNIT MOV$ DEVICE MOV (PC)+,-(SP) .BYTE 127.,3. DIR$ ,ERR .ENDM SNXC$SVb  .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,b  .MACRO SPEA$S AST,ERR .MCALL MOV$,DIR$D MOV$ AST= MOV (PC)+,-(SP) .BYTE 165.,2. DIR$ ,ERR .ENDM SPEA$S$b  .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$b  .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$pb  .MACRO SPND$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 45.,1 DIR$ ,ERR .ENDM SPND$SXb  .MACRO SPND$ .IF NDF $$$GLBR .BYTE 45.,1 .ENDC .ENDM SPND$b  .MACRO SRDA$C AST,CS,ERR .MCALL SRDA$,DIR$ .IF NDF $$$GLBO .PSECT $DPB$.,D$$$=.N .IFTF SRDA$ AST .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SRDA$C$b  .MACRO SRDA$S AST,ERR .MCALL MOV$,DIR$ MOV$ ASTS MOV (PC)+,-(SP) .BYTE 107.,2 DIR$ ,ERR .ENDM SRDA$Sb  .MACRO SRDA$ AST$ .MCALL OFF$ .IF NDF $$$GLB1 .BYTE 107.,2. .WORD AST .ENDC .IF NDF S.RDAER .NLIST OFF$F OFF$ S.RDAE,2 .LIST .ENDC .ENDM SRDA$b  .MACRO STAF$C AFF,CS,ERR .MCALL STAF$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF STAF$ AFF .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM STAF$Cb  .MACRO STAF$S AFF,ERR .MCALL DIR$,MOV$,AFF$ AFF$ MOV$ AFF- MOV (PC)+,-(SP) .BY00"7"8s,> OFF$ X .ENDM .LIST .ENDC .ENDM SVDB$b  .MACRO TFEA$ FEAT .MCALL OFF$,FEADF$ .IF NDF $$$GLBA .BYTE 209.,2. .WORD FEATR .ENDC .IF NDF F.TEAFM OFF$F OFF$ F.TEAF,2 .IF DF $$$GLB FEADF$ ,<=> .IFF  FEADF$C .ENDC .ENDC .ENDM TFEA$b  .MACRO TFEA$C FEAT,CS,ERR .MCALL TFEA$,DIR$ .IF NDF $$$GLBB .PSECT $DPB$.,D$$$=.F .IFTF TFEA$ FEAT1 .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMb  .MACRO TFEA$S FEAT,ERR> .MCALL MOV$,DIR$ MOV$ FEAT MOV (PC)+,-(SP) .BYTE 209.,2. DIR$ ,ERR .ENDM`b ! .MACRO OVAST$ SENSE,?LABL,?LABL2, MOV @#.NOVPT,-(SP) BEQ LABLT ADD #N.FAST,(SP)E .IF IDN , BICB #^O200,@(SP)+A .IFF. .IF IDN , BISB #^O200,@(SP)+A .IFFA0 .ERROR ; PARAMETER MUST BE "ALLOW" OR "INHIBIT" .ENDC .ENDC BR LABL2FLABL:F INC (SP)+LABL2: .ENDM OVAST$b ? .MACRO TLOG$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD  .MCALL OFF$,LNMOD$T .IF NDF $$$GLB) LNMOD$2 .BYTE 207.,10.R .BYTE 9. .BYTE MOD .WORD TBMSK .WORD LNS .WORD LNSSZ .WORD ENS .WORD ENSSZ .WORD RSIZE .WORD RTBMOD( .WORD STATUS< .ENDC .IF NDF T.LFUN2A .IRP X,<,,,,,>A OFF$ X .ENDM@ .IRP X,<,,,,> OFF$ XF .ENDM .ENDC .ENDM TLOG$b G .MACRO TLOG$C MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,CS,ERR .MCALL TLOG$,DIR$ .IF NDF $$$GLB) .PSECT $DPB$.,D$$$=.0 .IFTF8 TLOG$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM TLOG$C.@b 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$SRb ? .MACRO TLON$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMODM .MCALL OFF$,LNMOD$N .IF NDF $$$GLBZ LNMOD$ .BYTE 207.,10.S .BYTE 13. .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 TLON$b G .MACRO TLON$C MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD,CS,ERR .MCALL TLON$,DIR$ .IF NDF $$$GLBZ .PSECT $DPB$.,D$$$=.0 .IFTF8 TLON$ MOD,TBMSK,STATUS,LNS,LNSSZ,ENS,ENSSZ,RSIZE,RTBMOD .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM TLON$C.@b 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$SRb  .MACRO ISTAT$ STTBL,KEYTBL,DEBUG .MCALL MTRAN$ .IF DF $RONLY .PSECT $STATE,D,RON .IFF, .PSECT $STATE,D .ENDCSTTBL::  .IF DF $RONLY .PSEC00"5TADATADATADATADATADATADATADATADATAT $KTAB,D,RO .IFF .PSECT $KTAB,D .ENDCKEYTBL:: .IF DF $RONLY .PSECT $KSTR,D,RO .IFFM .PSECT $KSTR,DI .ENDC .IF IDN ,<$DEBUG>V .MACRO DBGTP$ .LIST .=. .NLISTN .ENDM .IFF  .MACRO DBGTP$ .ENDM .ENDC $$$KEY = -1 $$$FLG = -1 $EXIT = 0 $LAMDA = 3007 $NUMBR = 302E $STRNG = 304$ $BLANK = 306 $SUBXP = 310T $EOS = 312L $DNUMB = 314 $RAD50 = 316 $ANY = 320 $ALPHA = 322. $DIGIT = 324S .PSECT. .ENDM ISTAT$b .MACRO STATE$ LABEL. .PSECT $STATE $$$FLG = $$$FLG!200 MTRAN$D .IF NB LABELCLABEL: .ENDC $$$FLG = -1 .PSECT .ENDM STATE$b (.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 $$$BIT .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$$xb  .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$b  .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 DEFIN00"7"8s,,,> OFF$ XV .ENDM .LIST .ENDC .ENDM VRCS$0b , .MACRO WIMP$C SFCN,P1,P2,P3,P4,P5,P6,CS,ERR .MCALL DIR$,GFN$,OFF$ .IF NDF $$$GLBO .PSECT $DPB$.,D$$$=. .IFTF GFN$ .NARG $$$N $$$I=$$$N- .BYTE 169.,$$$N+1% .IRP $$$PRM, .IF EQ $$$I .MEXITN .IFF1 $$$I=$$$I-1L .ENDC .WORD $$$PRM$ .ENDR .IF NDF W.IMSFR .NLIST.6 .IRP X,<,,,,> OFF$ XS .ENDR* .IRP X,<,,> OFF$ XO .ENDR OFF$ W.IP07,2 .ENDC .IFTV .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM WIMP$C3.b % .MACRO WIMP$S SFCN,P1,P2,P3,P4,P5,P6O .MCALL MOV$,DIR$,OFF$,MVB$,GFN$ GFN$ .NARG $$$N $$$I=$$$N-$$$K=6.1% .IRP $$$PRM,, .IF GT $$$I-$$$K MOV$ $$$PRM .ENDC $$$K=$$$K-1L .ENDR MOV (PC)+,-(SP) .BYTE 169.,$$$N+1 DIR$. .ENDM WIMP$S,b $ .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$b  .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$CYpb  .MACRO WSIG$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 49.,1 DIR$ ,ERR .ENDM WSIG$S.Xb  .MACRO WSIG$F .IF NDF $$$GLBL .BYTE 49.,1 .ENDC .ENDM WSIG$b  .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$zb  .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.b  .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$b  .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$CRb  .MACRO WTSE$S EF,ERR .MCALL MOV$,DIR$A MOV$ EF MOV (PC)+,-(SP) .BYTE 41.,2 DIR$ ,ERR .ENDM WTSE$SSb  .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$b  .MACRO CNCT$ TNAME,EFN,EAST,ESB .MCALL OFF$,R50$ .IF NDF $$$GLB .BYTE 143.,6D R50$ TNAMEF .WORD EFN .WORD EAST. .WORD ESB .ENDC .IF NDF C.NCTNN6 .IRP X,<,,,00"7"8s,> OFF$ X$ .ENDM .ENDC .ENDM CNCT$b % .MACRO CNCT$S TNAME,EFN,EAST,ESB,ERR .MCALL DIR$,MOV$,RFA$,MVB$. MOV$ ESB MOV$ EAST MOV$ EFNE RFA$ TNAMED MOV (PC)+,-(SP) .BYTE 143.,6. DIR$ ,ERR .ENDM CNCT$SFb ( .MACRO CNCT$C TNAME,EFN,EAST,ESB,CS,ERR .MCALL CNCT$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=. .IFTF CNCT$ TNAME,EFN,EAST,ESBD .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CNCT$C.b  .MACRO CPCR$C NAME,CS,ERR .MCALL CPCR$,DIR$ .IF NDF $$$GLBN .PSECT $DPB$.,D$$$=. .IFTF CPCR$ NAMEE .IFTS .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CPCR$Cb  .MACRO CPCR$S NAME,ERRV .MCALL DIR$,MOV$,RFA$ RFA$ NAME MOV (PC)+,-(SP) .BYTE 205.,3 DIR$ ,ERR .ENDM CPCR$SEb  .MACRO CPCR$ NAME .MCALL R50$,OFF$ .IF NDF $$$GLB .BYTE 205.,3 R50$ NAME .ENDC .IF NDF C.PCNM. OFF$S OFF$ C.PCNM,2 .ENDC .ENDM CPCR$b  .MACRO AFF$CPA=1MCPB=2RCPC=4LCPD=10UBE=20UBF=40UBH=100.UBJ=200BUBK=400=UBL=1000UBM=2000UBN=4000 UBP=10000 UBR=20000$ UBS=40000N UBT=100000 .ENDM AFF$b  .MACRO CRAW$C WDB,CS,ERR  .MCALL CRAW$,DIR$ .IF NDF $$$GLB+ .PSECT $DPB$.,D$$$=.D .IFTF CRAW$ WDB .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CRAW$CFb  .MACRO CRAW$S WDB,ERR .MCALL DIR$,MOV$F MOV$ WDB. MOV (PC)+,-(SP) .BYTE 117.,2 DIR$ ,ERR .ENDM CRAW$Sb  .MACRO CRAW$ WDB= .MCALL OFF$ .IF NDF $$$GLB= .BYTE 117.,2 .WORD WDB .ENDC .IF NDF C.RABA0 OFF$0 OFF$ C.RABA,2 .ENDC .ENDM CRAW$b " .MACRO SCLI$C CLI,DEV,UNIT,CS,ERR .MCALL SCLI$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.D .IFTF SCLI$ CLI,DEV,UNIT .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SCLI$Cb  .MACRO SCLI$S CLI,DEV,UNIT,ERRI .MCALL MOV$,RFA$,DIR$,MVB$C RFA$ CLI. MVB$ UNIT,#0D MOV$ DEV. MOV (PC)+,-(SP) .BYTE 173.,5. DIR$ ,ERR .ENDMb  .MACRO SCLI$ CLI,DEV,UNIT .MCALL R50$,OFF$ .IF NDF $$$GLB .BYTE 173.,5.$$$T2=.. .ASCII /DEV/A .=$$$T2+2 .BYTE UNIT,0R R50$ CLII .ENDC .IF NDF S.CIDV + .IRP X,<,,,>D OFF$ X .ENDM .ENDC .ENDM SCLI$b  .MACRO CRRG$C RDB,CS,ERR. .MCALL CRRG$,DIR$ .IF NDF $$$GLBR .PSECT $DPB$.,D$$$=.I .IFTF CRRG$ RDB .IFTB .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CRRG$CCb  .MACRO CRRG$S RDB,ERR .MCALL DIR$,MOV$ MOV$ RDBC MOV (PC)+,-(SP) .BYTE 55.,2 DIR$ ,ERR .ENDM CRRG$SYb  .MACRO CRRG$ RDB .MCALL OFF$ .IF NDF $$$GLB0 .BYTE 55.,2 .WORD RDB .ENDC .IF NDF C.RRBA, OFF$I OFF$ C.RRBA,2 .ENDC .ENDM CRRG$b ) .MACRO CRVT$C IAST,OAST,AAST,MLEN,CS,ERR, .MCALL CRVT$,DIR$ .IF NDF $$$GLB$ .PSECT $DPB$.,D$$$=.$ .IFTF CRVT$ IAST,OAST,AAST,MLEN .IFTS .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CRVT$Cb & .MACRO CRVT$S IAST,OAST,AAST,MLEN,ERR .MCALL DIR$,MOV$S MOV$ MLEN MOV$ AAST MOV$ OAST MOV$ IAST MOV (PC)+,-(SP) .BYTE 149.,5 DIR$ ,ERR .ENDM CRVT$S$b ! .MACRO CRVT$ IAST,OAST,AAST,MLENB .MCALL OFF$ .IF NDF $$$GLBN .BYTE 149.,5$ .WORD IAST .WORD OAST .WORD AASTA .WORD MLENC .ENDC .IF NDF C.RVIA$6 .IRP X,<,,,,> OFF$ X, .ENDM .ENDC .ENDM CRVT$b  .MACRO ELAW$C WDB,CS,ERR .MCALL ELAW$,DIR$ .IF NDF $$$GLB, .PSECT $DPB$.,D$$$=.L .IFTF ELAW$ WDB .IFTM .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ELAW$Cb  .MACRO ELAW$S WDB,ERR .MCALL DIR$,MOV$ MOV$ WDBT MOV (PC)+,-(SP) .BYTE 119.,2F DIR$ ,ERR .ENDM ELAW$SEb  .MACRO ELAW$ WDB .MCALL OFF$ .IF NDF $$$GLBN .BYTE 119.,2R .WORD WDB .ENDC .IF NDF E.LABA, OFF$, OFF$ E.LABA,2 .ENDC .ENDM ELAW$b  .MACRO DTRG$C RDB,CS,ERRL .MCALL DTRG$,DIR$00"5TADATADATADATADATADATADATADATADATA .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.  .IFTF DTRG$ RDB .IFTE .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM DTRG$CCb  .MACRO DTRG$S RDB,ERR .MCALL DIR$,MOV$. MOV$ RDBM MOV (PC)+,-(SP) .BYTE 59.,2 DIR$ ,ERR .ENDM DTRG$SEb  .MACRO DTRG$ RDB .MCALL OFF$ .IF NDF $$$GLB$ .BYTE 59.,2 .WORD RDB .ENDC .IF NDF D.TRBAN OFF$F OFF$ D.TRBA,2 .ENDC .ENDM DTRG$b  .MACRO CRGF$C GROUP,CS,ERR  .MCALL CRGF$,DIR$ .IF NDF $$$GLB$ .PSECT $DPB$.,D$$$=.C .IFTF CRGF$ GROUP .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM CRGF$CCb  .MACRO CRGF$S GROUP,ERR .MCALL MOV$,DIR$C MOV$ GROUP. MOV (PC)+,-(SP) .BYTE 157.,2. DIR$ ,ERR .ENDM CRGF$SNb  .MACRO CRGF$ GROUPT .MCALL OFF$ .IF NDF $$$GLBF .BYTE 157.,2E .WORD GROUP .ENDC .IF NDF C.RGRPT .NLISTF OFF$F OFF$ C.RGRP,2 .LIST .ENDC .ENDM CRGF$b  .MACRO CMKT$C EFN,AST,PSCT,ERRI .MCALL CMKT$,DIR$ .IF NDF $$$GLBD .PSECT $DPB$.,D$$$=.G .IFTF CMKT$ EFN,AST .IFT .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM CMKT$C.b  .MACRO CMKT$S EFN,AST,ERR .MCALL DIR$,RVP$C $$$T1=0 .IIF NB EFN $$$T1=1 .IIF NB AST $$$T1=1 .IF EQ $$$T1 MOV (PC)+,-(SP) .BYTE 27.,1 .IFF. RVP$ EFN,AST MOV (PC)+,-(SP) .BYTE 27.,3 .ENDC DIR$ ,ERR .ENDM CMKT$SO>b  .MACRO CMKT$ EFN,ASTN .MCALL OFF$ .IF NDF $$$GLBA $$$T1=0 .IIF NB EFN $$$T1=1 .IIF NB AST $$$T1=1 .IF EQ $$$T1. .BYTE 27.,1 .IFFG .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$b " .MACRO EMST$C TNAME,STATUS,CS,ERR .MCALL EMST$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=.  .IFTF EMST$ TNAME,STATUS. .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM EMST$Cb  .MACRO EMST$S TNAME,STATUS,ERRF .MCALL DIR$,MOV$,RFA$ MOV$ STATUS RFA$ TNAMEA MOV (PC)+,-(SP) .BYTE 147.,4E DIR$ ,ERR .ENDM EMST$S3b  .MACRO EMST$ TNAME,STATUS .MCALL OFF$,R50$S .IF NDF $$$GLB .BYTE 147.,4 R50$ TNAMEI .WORD STATUSN .ENDC .IF NDF E.MSTN OFF$R OFF$ E.MSTN,4 OFF$ E.MSST,2 .ENDC .ENDM EMST$b  .MACRO ELVT$C UNUM,CS,ERR .MCALL ELVT$,DIR$ .IF NDF $$$GLBC .PSECT $DPB$.,D$$$=.N .IFTF ELVT$ UNUM .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ELVT$CIb  .MACRO ELVT$S UNUM,ERRM .MCALL DIR$,MOV$Y MOV$ UNUM MOV (PC)+,-(SP) .BYTE 151.,2 DIR$ ,ERR .ENDM ELVT$SNb  .MACRO ELVT$ UNUM .MCALL OFF$ .IF NDF $$$GLB0 .BYTE 151.,2D .WORD UNUMN .ENDC .IF NDF E.LVNMF OFF$F OFF$ E.LVNM,2 .ENDC .ENDM ELVT$b  .MACRO DSCP$C PSCT,ERRC .MCALL DSCP$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.B .IFTF DSCP$ .IFTE .PSECT PSCT DIR$ #$$$,ERR .ENDC .ENDM DSCP$CCpb  .MACRO DSCP$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 95.,1 DIR$ ,ERR .ENDM DSCP$SXb  .MACRO DSCP$M .IF NDF $$$GLB .BYTE 95.,1 .ENDC .ENDM DSCP$b  .MACRO RCST$C TNAME,BUF,CS,ERRU .MCALL RCST$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.. .IFTF RCST$ TNAME,BUF .IFTA .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RCST$C$b  .MACRO RCST$S TNAME,BUF,ERR .MCALL DIR$,MOV$,RFA$ MOV$ BUFE RFA$ TNAME. MOV (PC)+,-(SP) .BYTE 139.,4. DIR$ ,ERR .ENDM RCST$SIb  .MACRO RCST$ TNAME,BUFE .MCALL OFF$,R50$ .IF NDF $$$GLB .BYTE 139.,4 R50$ TNAMEL .WORD BUF .ENDC .IF NDF R.CSTN$ OFF$ OFF$ R.CSTN,4 OFF$ R.CSBF,2 .ENDC .ENDM RCST$b 2 .MACRO GCCI$C CBUF,CBFL,IBUF,IBFL,ADDR,NCP,CS,ERR .MCALL GCCI$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=.R .IFTF# GCCI$ CBUF,CBFL,IBUF,IBFL,ADDR,NCPE .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMb / .MACRO GCCI$S CBUF,CBFL,IBUF,IBFL,ADDR,NCP,ERRI .MCALL 00"7"8s,,,,> OFF$ X .ENDM OFF$ G.CCIL,2$$$OST=0K .IRP X,<,,,,,>B OFF$ X  .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$b  .MACRO MSDS$C MASK,CS,ERR .MCALL MSDS$,DIR$ .IF NDF $$$GLB, .PSECT $DPBD$ D$$$=.. .IFTF MSDS$ MASK .IFT0 .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMb  .MACRO MSDS$S MASK,ERR  .MCALL MOV$,DIR$ MOV$ MASK MOV (PC)+,-(SP) .BYTE 201.,2. DIR$ ,ERR .ENDMb  .MACRO MSDS$ MASK .MCALL OFF$ .IF NDF $$$GLB. .BYTE 201.,2. .WORD MASKG .ENDC .IF NDF M.SDMAN .IRP X,<,>0 OFF$ XX .ENDM .ENDC .ENDM MSDS$b  .MACRO SCAA$C AST,CS,ERRS .MCALL SCAA$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=.D .IFTF SCAA$ AST .IFTS .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SCAA$CNb  .MACRO SCAA$S AST,ERR .MCALL MOV$,DIR$D MOV$ AST  MOV (PC)+,-(SP) .BYTE 173.,2. DIR$ ,ERR .ENDM SCAA$Sb  .MACRO SCAA$ AST. .MCALL OFF$ .IF NDF $$$GLB. .BYTE 173.,2. .WORD AST .ENDC .IF NDF S.CAAE OFF$, OFF$ S.CAAE,2 .ENDC .ENDMb  .MACRO FEAT$C FEAT,CS,ERR .MCALL FEAT$,DIR$ .IF NDF $$$GLB, .PSECT $DPB$.,D$$$=.. .IFTF FEAT$ FEATD .IFTF .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM FEAT$C.b  .MACRO FEAT$S FEAT,ERRA .MCALL MOV$,DIR$ MOV$ FEAT MOV (PC)+,-(SP) .BYTE 177.,2. DIR$ ,ERR .ENDMb  .MACRO FEAT$ FEAT .MCALL OFF$,FEADF$  .IF NDF $$$GLB$ .BYTE 177.,2. .WORD FEAT3 .ENDC .IF NDF F.EAF OFF$N OFF$ F.EAF,2F .IF DF $$$GLB FEADF$ ,<=> .IFF FEADF$ .ENDC .ENDC .ENDM FEAT$b  .MACRO EXTK$C INC,CS,ERRS .MCALL EXTK$,DIR$ .IF NDF $$$GLBF .PSECT $DPB$.,D$$$=. .IFTF EXTK$ INC .IFTN .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM EXTK$CRb  .MACRO EXTK$S INC,ERR .MCALL MOV$,DIR$1 CLR -(SP) MOV$ INCN MOV (PC)+,-(SP) .BYTE 89.,3 DIR$ ,ERR .ENDM EXTK$SFb  .MACRO EXTK$ INC .MCALL OFF$ .IF NDF $$$GLBF .BYTE 89.,3 .WORD INC .WORD 0 .ENDC .IF NDF E.XTIN. .NLISTA OFF$. OFF$ E.XTIN,2 .LIST .ENDC .ENDM EXTK$b + .MACRO GCII$C BUF,BUFL,CLI,DEV,UNIT,CS,ERRF .MCALL GCII$,DIR$ .IF NDF $$$GLBE .PSECT $DPB$.,D .IFTF$$$=.R GCII$ BUF,BUFL,CLI,DEV,UNIT .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMb ( .MACRO GCII$S BUF,BUFL,CLI,DEV,UNIT,ERR .MCALL MOV$,MVB$,DIR$,RFA$M MVB$ UNIT,#0 MOV$ DEV RFA$ CLIK MOV$ BUFL MOV$ BUF. MOV (PC)+,-(SP) .BYTE 173.,7. DIR$ ,ERR .ENDM GCII$S.b # .MACRO GCII$ BUF,BUFL,CLI,DEV,UNITT .MCALL OFF$,R50$T .IF NDF $$$GLB .BYTE 173.,7. .WORD BUF .WORD BUFLC R50$ CLIC$$$T2=., .ASCII /DEV/$ .=$$$T2+2S .BYTE UNIT,0. .ENDC .IF NDF G.CIBFBA .IRP X,<,,,,,>M OFF$ X .ENDM$$$OST=0@ .IRP X,<,,,,> OFF$ X# .ENDM! .IRP X,<,>V OFF$ XM .ENDM .ENDC .ENDM GCII$b % .MACRO MVTS$C ACTION,ADDR,VAL,CS,ERRC .MCALL MVTS$,DIR$ .IF NDF $$$GLBF .PSECT $DPBD$ D$$$=. .IFTF MVTS$ ACTION,ADDR,VAL .IFTF .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMb " .MACRO MVTS$S A00"5TADATADATADATADATADATADATADATADATACTION,ADDR,VAL,ERR .MCALL MOV$,DIR$< MOV$ VALG MOV$ ADDR MOV$ ACTION MOV (PC)+,-(SP) .BYTE 203.,4. DIR$ ,ERR .ENDMb  .MACRO MVTS$ ACTION,ADDR,VALO .MCALL OFF$ .IF NDF $$$GLBU .BYTE 203.,4. .WORD ACTION. .WORD ADDR .WORD VAL .ENDC .IF NDF M.VTACR6 .IRP X,<,,,,> OFF$ X$ .ENDM $$$=05 .IRP X,<,,,> OFF$ XS .ENDM5 .IRP X,<,,,>S OFF$ X, .ENDM .ENDC .ENDM MVTS$b ) .MACRO GDIR$C MOD,ENS,ENSSZ,RSIZE,CS,ERR. .MCALL GDIR$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.S .IFTF GDIR$ MOD,ENS,ENSSZ,RSIZE .IFT$ .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GDIR$Cb & .MACRO GDIR$S MOD,ENS,ENSSZ,RSIZE,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$F LNMOD$F MOV$ RSIZE MOV$ ENSSZ MOV$ ENS1 MOV$ #0 MVB$ #4,MOD MOV (PC)+,-(SP) .BYTE 207.,6. DIR$ ,ERR .ENDM GDIR$S>Fb ! .MACRO GDIR$ MOD,ENS,ENSSZ,RSIZE. .MCALL OFF$,LNMOD$ .IF NDF $$$GLBD LNMOD$E .BYTE 207.,6. .BYTE 4 .BYTE MOD .WORD 0 .WORD ENS .WORD ENSSZ .WORD RSIZE .ENDC .IF NDF G.DFUNSA .IRP X,<,,,,,> OFF$ X .ENDM .ENDC .ENDM GDIR$b + .MACRO FSS$ FSBUF,FSSZ,PRSBLK,PRSSZ,RESERVM .MCALL OFF$ .IF NDF $$$GLB  .IIF NB RESERV, .ERRORM .BYTE 207.,7- .BYTE 5 .BYTE 0 .WORD 0 .WORD FSBUF .WORD FSSZ .WORD PRSBLKR .WORD PRSSZ .ENDC .IF NDF F.RSV1FA .IRP X,<,,,,,>. OFF$ X .ENDM .IRP X,<,>D OFF$ X. .ENDM .ENDC .ENDM FSS$ b 3 .MACRO FSS$C FSBUF,FSSZ,PRSBLK,PRSSZ,RESERV,CS,ERR .MCALL FSS$,DIR$N .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.B .IFTF$ FSS$ FSBUF,FSSZ,PRSBLK,PRSSZ,RESERV .IFT$ .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM FSS$Cb 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$Svb 6 .MACRO QDPB$S DIC,FNC,LUN,EFN,PRI,IOST,AST,PRMLST,ERR .MCALL RVP$,MVB$,DIR$ .NLISTR$$$ARG=0 .IRP X,$$$ARG=$$$ARG+1B .ENDM .LIST .IF GT 6-$$$ARG .REPT <6-$$$ARG>$ CLR -(SP) .ENDR .ENDC .IIF NB , RVP$ PRMLST RVP$ IOST,AST MVB$ EFN, RVP$ FNC,LUNR MOV (PC)+,-(SP) .BYTE DIC,12. DIR$ ,ERR .ENDM QDPB$SV"b 1 .MACRO QDPB$ DIC,FNC,LUN,EFN,PRI,IOST,AST,PRMLSTM .MCALL OFF$ .IF NDF $$$GLBY .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$b  .MACRO GMCR$C CS,ERRC .MCALL GMCR$,DIR$ .IF NDF $$$GLBC .PSECT $DPB$.,D$$$=.L .IFTF GMCR$ .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GMCR$CRb  .MACRO GMCR$ .MCALL OFF$ .IF NDF $$$GLBM .BYTE 127.,41.G .BLKW 40. .ENDC .IF NDF G.MCRBR .NLIST OFF$ OFF$ G.MCRB,80. .LIST .ENDC .ENDM GMCR$b  .MACRO MAP$C WDB,CS,ERR .MCALL MAP$,DIR$< .IF NDF $$$GLB, .PSECT $DPB$.,D$$$=.. .IFTF MAP$ WDBC .IFTM .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM MAP$Cb  .MACRO MAP$S WDB,ERRS .MCALL DIR$,MOV$L MOV$ WDBG MOV (PC)+,-(SP) .BYTE 121.,2$ DIR$ ,ERR .ENDM MAP$Sb  .MACRO MAP$ WDB .MCALL OFF$ .IF NDF $$$GLBL .BYTE 121.,2, .WORD WDB .ENDC .IF NDF M.APBAM OFF$. OFF$ M.APBA,2 .ENDC .ENDM MAP$I^b  .MACRO IHAR$C PSCT,ERR .MCALL DSAR$C DSAR$C PSCT,ERR .ENDM IHA00"7"8s1 .IF IDN ,SYM==$$$ .IFFSYM=$$$ .ENDC .ENDC $$$=$$$+NUM$ .ENDM .BLKB.Lb  .MACRO .BLKW. NUM,SYM,GBL .IF NB F .IF IDN ,SYM==$$$ .IFFSYM=$$$ .ENDC .ENDC$$$=$$$+<2*NUM> .ENDM .BLKW.8b  .MACRO .BLK.$$$=0 .ENDM .BLK.b  .MACRO LNMOD$ LM.USR=128. LT.USR=2. SD.LOG=3. SD.BYE=4. GD.LOG=5. SD.TI=6.R SD.MOD=7. SD.MUD=8. .ENDMb  .MACRO MOV$ ARG .IF NB M .IF DIF ,<#0>< MOV ARG,-(SP) .MEXITY .ENDC .ENDC CLR -(SP) .ENDM MOV$Nb  .MACRO GMCX$C WVEC,CS,ERR .MCALL GMCX$,DIR$ .IF NDF $$$GLB< .PSECT $DPB$.,D$$$=.. .IFTF GMCX$ WVECC .IFTC .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM GMCX$Cb  .MACRO GMCX$S WVEC,ERR .MCALL DIR$,MOV$R MOV$ WVEC MOV (PC)+,-(SP) .BYTE 113.,2. DIR$ ,ERR .ENDM GMCX$SSb  .MACRO GMCX$ WVEC .MCALL OFF$ .IF NDF $$$GLBO .BYTE 113.,2 .WORD WVECD .ENDC .IF NDF G.MCVA- OFF$. OFF$ G.MCVA,2 .ENDC .ENDM GMCX$b " .MACRO MRKT$C EF,TM,TU,AST,CS,ERR .MCALL MRKT$,DIR$ .IF NDF $$$GLBL .PSECT $DPB$.,D$$$=.= .IFTF MRKT$ EF,TM,TU,ASTF .IFTS .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM MRKT$Cb  .MACRO MRKT$S EF,TM,TU,AST,ERR$ .MCALL RVP$,DIR$ RVP$ EF,TM,TU,AST MOV (PC)+,-(SP) .BYTE 23.,5 DIR$ ,ERR .ENDM MRKT$Sb  .MACRO MRKT$ EFN,TM,TU,ASTL .MCALL OFF$ .IF NDF $$$GLBD .BYTE 23.,5 .WORD EFN .WORD TMO .WORD TU2 .WORD AST .ENDC .IF NDF M.KTEF .NLISTR6 .IRP X,<,,,,> OFF$ XL .ENDM .LIST .ENDC .ENDM MRKT$b  .MACRO RDAF$C BA,CS,ERR .MCALL RDAF$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.R .IFTF RDAF$ BAR .IFTC .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RDAF$C)b  .MACRO RDAF$S BA,ERR .MCALL MOV$,DIR$ MOV$ BA MOV (PC)+,-(SP) .BYTE 39.,2 DIR$ ,ERR .ENDM RDAF$S2b  .MACRO RDAF$ BA .MCALL OFF$ .IF NDF $$$GLBN .BYTE 39.,2 .WORD BAR .ENDC .IF NDF R.DABA2 .NLIST, OFF$T OFF$ R.DABA,2. .LIST .ENDC .ENDM RDAF$b  .MACRO SWST$C BASE,ADDR,CS,ERR .MCALL SWST$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=. .IFTF SWST$ BASE,ADDR .IFTC .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SWST$Cb  .MACRO SWST$S BASE,ADDR,ERR .MCALL DIR$,MOV$M MOV$ ADDR MOV$ BASE MOV (PC)+,-(SP) .BYTE 175.,3. DIR$ ,ERR .ENDM SWST$SDLb  .MACRO SWST$ BASE,ADDRY .MCALL OFF$ .IF NDF $$$GLB. .BYTE 175.,3. .WORD BASEF .WORD ADDRA .ENDC .IF NDF S.WBAS. .IRP X,<,,> OFF$ XC .ENDM $$$OST=2@ .IRP X,<,,,,> OFF$ XS .ENDM OFF$ S.WSR5,2 .ENDC .ENDM SWST$b  .MACRO RDEF$C EFN,CS,ERR .MCALL RDEF$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=.M .IFTF RDEF$ EFN .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RDEF$Cb  .MACRO RDEF$S EFN,ERR .MCALL MOV$,DIR$$ MOV$ EFNE MOV (PC)+,-(SP) .BYTE 37.,2 DIR$ ,ERR .ENDM RDEF$SAb  .MACRO RDEF$ EFN .MCALL OFF$ .IF NDF $$$GLB. .BYTE 37.,2 .WORD EFN .ENDC .IF NDF R.DEEF< .NLIST> OFF$  OFF$ R.DEEF,2.  .LIST .ENDC .ENDM RDEF$b  .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$b  .MACRO RDXF$S BA,ERRE .MCALL MOV$,DIR$R CLR -(SP) MOV$ BA MOV (PC)+,-(SP) .BYTE 39.,3.E DIR$ ,ERR .ENDM RDXF$Sb  .MACRO RDXF$ BA .MCALL OFF$ .IF NDF $$$GLBE .BYTE 39.,3.E .WO00"5TADATADATADATADATADATADATADATADATARD BA .WORD 0 .ENDC .IF NDF R.DABA .NLISTE OFF$ OFF$ R.DABA,2.. .LIST .ENDC .ENDM RDXF$db  .MACRO RMAF$S ERR MOV (PC)+,-(SP) .BYTE 163.,1 DIR$ ,ERR .ENDM RMAF$SR8b V .MACRO RPOI$C TNAME,PN,PR,UGC,UMC,PARENT,BUFADR,BUFLEN,SC,DNAM,UNIT,TASK,OCBAD,CS,ERR .MCALL RPOI$,DIR$ .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$Cfb S .MACRO RPOI$S TNAME,PN,PR,UGC,UMC,PARENT,BUFADR,BUFLEN,SC,DNAM,UNIT,TASK,OCBAD,ERR .MCALL MVB$,MOV$,RFA$,DIR$S RFA$ TASK MOV$ DNAM MVB$ UNIT,SC 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$SBb N .MACRO RPOI$ TNAME,PN,PR,UGC,UMC,PARENT,BUFADR,BUFLEN,SC,DNAM,UNIT,TASK,OCBAD .MCALL R50$,OFF$D .IF NDF $$$GLBN .BYTE 11.,16. R50$ TNAME .BLKW 3 .BYTE UMC,UGC R50$ PARENT .WORD OCBAD .WORD BUFADRA .WORD BUFLENA .BYTE UNITL .BYTE SC, .IF NB DNAM$$$T2=. .ASCII /DNAM/ .=$$$T2+2 .IFFU .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$b # .MACRO RQST$C TN,PN,PR,GC,P,CS,ERRD .MCALL RQST$,DIR$ .IF NDF $$$GLBY .PSECT $DPB$.,D$$$=.T .IFTF RQST$ TN,PN,PR,GC,P .IFTF .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMb  .MACRO RQST$S TN,PN,PR,GC,P,ERR .MCALL MVB$,RFA$,DIR$ MVB$ P,GC CLR -(SP) RFA$, RFA$ TN MOV (PC)+,-(SP) .BYTE 11.,7 DIR$ ,ERR .ENDM RQST$S.*b  .MACRO RQST$ TN,PN,PR,GC,PP .MCALL R50$,OFF$ .IF NDF $$$GLB0 .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$b  .MACRO RREF$C WDB,CS,ERR .MCALL RREF$,DIR$ .IF NDF $$$GLBP .PSECT $DPB$.,D$$$=.I .IFTF RREF$ WDB .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM RREF$CDb  .MACRO RREF$S WDB,ERR .MCALL DIR$,MOV$P MOV$ WDB MOV (PC)+,-(SP) .BYTE 81.,2 DIR$ ,ERR .ENDM RREF$SNb  .MACRO RREF$ WDB .MCALL OFF$ .IF NDF $$$GLBS .BYTE 81.,2 .WORD WDB .ENDC .IF NDF R.REBAS OFF$R OFF$ R.REBA,2 .ENDC .ENDM RREF$b  .MACRO SDUN$C TN,BA,EFN,CS,ERRF .MCALL SDUN$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=.D .IFTF SDUN$ TN,BA,EFN .IFTB .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SDUN$CMb  .MACRO SDUN$S TN,BA,EFN,ERR .MCALL MOV$,RFA$,DIR$ MOV$ EFN MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 179.,5E DIR$ ,ERR .ENDM SDUN$SAb  .MACRO SDUN$ TN,BA,EFNL .MCALL R50$,OFF$. .IF NDF $$$GLB .BYTE 179.,5S R50$ TN .WORD BAA .WORD EFN .ENDC .IF NDF S.DATN .NLISTA+ .IRP X,<,,,>I OFF$ XN .ENDM .LIST .ENDC .ENDM SDUN$b  .MACRO UMAP$C WDB,CS,ERR .MCALL UMAP$,DIR$ .IF NDF $$$GLBM .PSECT $DPB$.,D$$$=.R .IFTF UMAP$ WDB .IFTC .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM UMAP$Cb  .MACRO UMAP$S WDB,ERR .MCALL DIR$,MOV$ MOV$ WDB MOV (PC)+,-(SP) .BYTE 123.,2. DIR$ ,ERR .ENDM UMAP$S$b  .MACRO UMAP$ WDBO .MCALL OFF$ .IF NDF $$$GLBF .BYTE 123.,2. .WORD WDB .ENDC .IF NDF U.MABA2 OFF$E OFF$ U.MABA,2 .ENDC .ENDM UMAP$b  .MACRO USTP$C TNAME,CS,ERRP .MCALL USTP$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=.D .IFTF USTP$ TNAME .IFT$ .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM USTP$C.b  .MACRO USTP$S TNA00"&7"8s,,,,> OFF$ XR .ENDM5 .IRP X,<,,,>D OFF$ XP .ENDM .LIST .ENDC .ENDM RUN$Sb  .MACRO SFPA$C AST,CS,ERRE .MCALL SFPA$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.U .IFTF SFPA$ AST .IFTU .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SFPA$C1b  .MACRO SFPA$S AST,ERR .MCALL MOV$,DIR$ MOV$ AST MOV (PC)+,-(SP) .BYTE 111.,2. DIR$ ,ERR .ENDM SFPA$S.b  .MACRO SFPA$ AST, .MCALL OFF$ .IF NDF $$$GLBF .BYTE 111.,2. .WORD AST .ENDC .IF NDF S.FPAE2 .NLIST, OFF$O OFF$ S.FPAE,2 .LIST .ENDC .ENDM SFPA$b ( .MACRO SMSG$C TGT,BUF,LEN,PRMLST,CS,ERR .MCALL SMSG$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=.$ .IFTF SMSG$ TGT,BUF,LEN,E .IFTN .PSECT CS DIR$ #$$$,ERR .ENDC .ENDMb % .MACRO SMSG$S TGT,BUF,LEN,PRMLST,ERRC .MCALL MVB$,MOV$,RVP$,DIR$R$$$ARG=0$$$=0P .IRP X,$$$ARG=$$$ARG+1A .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<b  .MACRO SMSG$ TGT,BUF,LEN,PRMLST .MCALL OFF$ .NLIST. .IF NDF S.MTGT OFF$$3 .IRP X,<,,,>G OFF$ XF .ENDM .IF DF $$$GLB .GLOBL SM.SER .ENDCSM.SER=1 .ENDC .IF NDF $$$GLB$$$ARG=0 .IRP X,$$$ARG=$$$ARG+1I .ENDM .IF NB TGTL .IF IDN TGT SM.SERA .IF LT,$$$ARG-4 $$$ARG=4. .ENDC .ENDC .ENDC .LIST .BYTE 171.,4+$$$ARG .BYTE TGT .BYTE 0 .WORD BUF .WORD LEN .IRP X,$$$ARG=$$$ARG-1 .WORD X .ENDM .REPT $$$ARG  .WORD .ENDR .ENDC .ENDMb  .MACRO SPRA$C AST,CS,ERR. .MCALL SPRA$,DIR$ .IF NDF $$$GLB2 .PSECT $DPB$.,D$$$=.. .IFTF SPRA$ AST .IFTB .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SPRA$Cb  .MACRO SPRA$S AST,ERR .MCALL MOV$,DIR$N MOV$ ASTF MOV (PC)+,-(SP) .BYTE 109.,24 DIR$ ,ERR .ENDM SPRA$SCb  .MACRO SPRA$ ASTG .MCALL OFF$ .IF NDF $$$GLBB .BYTE 109.,2 .WORD AST .ENDC .IF NDF S.PRAE. .NLIST. OFF$. OFF$ S.PRAE,2 .LIST .ENDC .ENDM SPRA$$b N .MACRO SPWN$C TNAME,PN,PR,UGC,UMC,EFN,EAST,ESB,CMDLIN,CMDLEN,UNIT,DNAM,CS,ERR .MCALL SPWN$,DIR$ .IF NDF $$$GLBB .PSECT $DPB$.,D$$$=.E .IFTF; SPWN$ TNAME,,,UGC,UMC,EFN,EAST,ESB,CMDLIN,CMDLEN,UNIT,DNAM .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SPWN$C9b K .MACRO SPWN$S TNAME,PN,PR,UGC,UMC,EFN,EAST,ESB,CMDLIN,CMDLEN,UNIT,DNAM,ERR$ .MCALL DIR$,MOV$,MVB$,RFA$D .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$SCb F .MACRO 00".5TADATADATADATADATADATADATADATADATASPWN$ TNAME,PN,PR,UGC,UMC,EFN,EAST,ESB,CMDLIN,CMDLEN,UNIT,DNAM .MCALL OFF$,R50$ .IF NDF $$$GLBR .IF B DNAME .BYTE 11.,13. .IFF, .BYTE 11.,14. .ENDC R50$ TNAMEC .BLKW 3 .BYTE UMC,UGC .WORD EFN .WORD EAST .WORD ESB .WORD CMDLINM .WORD CMDLENL .WORD UNITN .IF NB DNAM$$$T2=. .ASCII /DNAM/ .=$$$T2+2) .ENDC .ENDC .IF NDF S.PWTNNA .IRP X,<,,,,,>E OFF$ X .ENDM@ .IRP X,<,,,,> OFF$ X, .ENDM .IRP X,<> OFF$ XM .ENDR $$$OST=256.*8.F OFF$ SP.WX8 .ENDC .ENDM SPWN$b # .MACRO SDIR$C MOD,ENS,ENSSZ,CS,ERR. .MCALL SDIR$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=.. .IFTF SDIR$ MOD,ENS,ENSSZ .IFTU .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SDIR$CTb  .MACRO SDIR$S MOD,ENS,ENSSZ,ERR .MCALL DIR$,MOV$,MVB$,LNMOD$< LNMOD$, MOV$ ENSSZ MOV$ ENS. MOV$ #0 MVB$ #3,MOD MOV (PC)+,-(SP) .BYTE 207.,5> DIR$ ,ERR .ENDM SDIR$SN&b  .MACRO SDIR$ MOD,ENS,ENSSZ$ .MCALL OFF$,LNMOD$P .IF NDF $$$GLBN LNMOD$ .BYTE 207.,5. .BYTE 3 .BYTE MOD .WORD 0 .WORD ENS .WORD ENSSZ .ENDC .IF NDF S.DFUNC6 .IRP X,<,,,,> OFF$ X  .ENDM .ENDC .ENDM SDIR$b , .MACRO SDRC$C TNAME,BUF,EFN,EAST,ESB,CS,ERR .MCALL SDRC$,DIR$ .IF NDF $$$GLBM .PSECT $DPB$.,D$$$=.  .IFTF SDRC$ TNAME,BUF,EFN,EAST,ESB+ .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SDRC$Cb ) .MACRO SDRC$S TNAME,BUF,EFN,EAST,ESB,ERR .MCALL DIR$,MOV$,RFA$,MVB$. MOV$ ESB. MOV$ EAST MOV$ EFN MOV$ BUF. RFA$ TNAMEO MOV (PC)+,-(SP) .BYTE 141.,7C DIR$ ,ERR .ENDM SDRC$SM4b $ .MACRO SDRC$ TNAME,BUF,EFN,EAST,ESB .MCALL OFF$,R50$ .IF NDF $$$GLBR .BYTE 141.,7B R50$ TNAMES .WORD BUF .WORD EFN .WORD EASTF .WORD ESB .ENDC .IF NDF S.DRTN.A .IRP X,<,,,,,>$ OFF$ XN .ENDM .ENDC .ENDM SDRC$b . .MACRO VSDA$C TN,BA,BL=13.,EFN,SPRI,TI,CS,ERR .MCALL VSDA$,DIR$ .IF NDF $$$GLBT .PSECT $DPB$.,D$$$=. .IFTF VSDA$ TN,BA,BL,EFN,SPRI,TIE .IFTC .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM VSDA$CAb , .MACRO VSDA$S TN,BA,BL=#13.,EFN,SPRI,TI,ERR .MCALL MOV$,RFA$,DIR$ MOV$ TI MOV$ SPRI MOV$ BL MOV$ EFND MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 71.,8., DIR$ ,ERR .ENDM VSDA$SDxb & .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$b  .MACRO ULGF$C CS,ERRL .MCALL ULGF$,DIR$ .IF NDF $$$GLBV .PSECT $DPB$.,D$E$$$=., .IFTF ULGF$ .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM ULGF$CErb  .MACRO ULGF$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 159.,1E DIR$ ,ERR .ENDM ULGF$S.Zb  .MACRO ULGF$. .IF NDF $$$GLB. .BYTE 159.,1, .ENDC .ENDM ULGF$b % .MACRO VRCD$C TN,BA,BL=13.,TI,CS,ERRD .MCALL VRCD$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.D .IFTF VRCD$ TN,BA,BL,TI .IFTC .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM VRCD$CSb # .MACRO VRCD$S TN,BA,BL=#13.,TI,ERR  .MCALL MOV$,DIR$, RFA$C MOV$ TI MOV$ BL MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 75.,6.V DIR$ ,ERR .ENDM VRCD$SE"b  .MACRO VRCD$ TN,BA,BL=13.,TI. .MCALL OFF$, R50$ .IF NDF $$$GLBE .BYTE 75.,6.C R50$ TN .WORD BA .WORD BL .WORD TID .ENDC .IF NDF R.VDTND .NLIST 6 .IRP X,<,,,,> OFF$ XV .ENDM .LIST .ENDC .ENDM VRCD$b  .MACRO SVTK$C ADR,LEN,CS,ERR .MCALL SVTK$,DIR$ .IF NDF $$$GLBT .PSECT $DPB$.,D00"6"88s,> OFF$ XV .ENDM .LIST .ENDC .ENDM SVTK$b . .MACRO VSUN$C TN,BA,BL=13.,EFN,SPRI,TI,CS,ERR .MCALL VSUN$,DIR$ .IF NDF $$$GLBE .PSECT $DPB$.,D$$$=.D .IFTF VSUN$ TN,BA,BL,EFN,SPRI,TIR .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM VSUN$C(b , .MACRO VSUN$S TN,BA,BL=#13.,EFN,SPRI,TI,ERR .MCALL MOV$,RFA$,DIR$ MOV$ TI MOV$ SPRI MOV$ BL MOV$ EFNY MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 179.,8. DIR$ ,ERR .ENDM VSUN$S,xb & .MACRO VSUN$ TN,BA,BL=13.,EFN,SPRI,TI .MCALL R50$,OFF$ .IF NDF $$$GLBR .BYTE 179.,8. 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 VSUN$b 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 .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM VSRC$C1b 0 .MACRO VSRC$S TNAME,BUF,BUFLEN,EFN,EAST,ESB,ERR .MCALL DIR$,MOV$,RFA$,MVB$S MOV$ ESBL MOV$ EAST MOV$ BUFLEN MOV$ EFN, MOV$ BUF RFA$ TNAME. MOV (PC)+,-(SP) .BYTE 141.,8. DIR$ ,ERR .ENDM VSRC$S.Vb + .MACRO VSRC$ TNAME,BUF,BUFLEN,EFN,EAST,ESBS .MCALL OFF$,R50$E .IF NDF $$$GLB, .BYTE 141.,8. R50$ TNAMEF .WORD BUF .WORD EFN .WORD BUFLEN .WORD EAST$ .WORD ESB .ENDC .IF NDF V.SRTNRL .IRP X,<,,,,,,> OFF$ XT .ENDM .ENDC .ENDM VSRC$b  .MACRO STLO$C GRP,MSK,CS,ERRV .MCALL STLO$,DIR$ .IF NDF $$$GLBV .PSECT $DPB$.,D$$$=.V .IFTF STLO$ GRP,MSK .IFTD .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM STLO$C b  .MACRO STLO$S GRP,MSK,ERR .MCALL DIR$,MOV$F MOV$ MSK. .IF NB GRP MOV #GRP,-(SP)O .IFF CLR -(SP) .ENDC MOV (PC)+,-(SP) .BYTE 137.,3 DIR$ ,ERR .ENDM STLO$S.b  .MACRO STLO$ GRP,MSK< .MCALL OFF$ .IF NDF $$$GLB> .BYTE 137.,3N .WORD GRP .WORD MSK .ENDC .IF NDF S.TLGRR OFF$C OFF$ S.TLGR,2 OFF$ S.TLMS,2 .ENDC .ENDM STLO$b  .MACRO SDAT$C TN,BA,EFN,CS,ERR .MCALL SDAT$,DIR$ .IF NDF $$$GLB. .PSECT $DPB$.,D$$$=. .IFTF SDAT$ TN,BA,EFN .IFTM .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SDAT$Cb  .MACRO SDAT$S TN,BA,EFN,ERR .MCALL MOV$,RFA$,DIR$ MOV$ EFND MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 71.,5 DIR$ ,ERR .ENDM SDAT$S$b  .MACRO SDAT$ TN,BA,EFNG .MCALL R50$,OFF$N .IF NDF $$$GLBG .BYTE 71.,5 R50$ TN .WORD BA. .WORD EFN .ENDC .IF NDF S.DATN .NLIST+ .IRP X,<,,,>T OFF$ X. .ENDM .LIST .ENDC .ENDM SDAT$b > .MACRO SDRP$C TASK,BUFADR,BUFLEN,EFN,FLAG,PARENT,OCBAD,CS,ERR .MCALL SDRP$,DIR$ .IF NDF $$$GLBT .PSECT $DPB$.,D$$$=.  .IFTF/ SDRP$ TASK,BUFADR,BUFLEN,EFN,FLAG,PARENT,OCBAD+ .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SDRP$Cb ; .MACRO SDRP$S TASK,BUFADR,BUFLEN,EFN,FLAG,PARENT,OCBAD,ERR7 .MCALL MVB$,MOV$,RFA$,DIR$. MOV$ OCBADN RFA$ PARENT MOV$ BUFLEN MVB$ EFN,FLAG MOV$ BUFADR RFA$ TASK MOV (PC)+,-(SP) .BYTE 141.,9. DIR$ ,ERR .ENDM SDRP$Sb 6 .MACRO SDRP$ TASK,BUFADR,BUFLEN,EFN,FLAG,PARENT,OCBAD .MCALL R50$,OFF$$ .IF NDF $$$GLBT .BYTE 141.,9. R50$ TASK .WORD BUFADRT .BYTE EFN,FLAG, .IF NB BUFLEN .WORD BUFLEN .IFF .WORD 13. .ENDC R5000">5TADATADATADATADATADATADATADATADATA$ PARENT .WORD OCBAD .ENDC .IF NDF S.DRTKPA .IRP X,<,,,,,>, OFF$ X. .ENDM .IRP X,<,>N OFF$ XF .ENDM .IF DF $$$GLB .GLOBL SD.REX,SD.RAL,SD.RNX .ENDC SD.REX=200 SD.RAL=001 SD.RNX=002 .ENDC .ENDM SDRP$b  .MACRO SREA$C AST,CS,ERRB .MCALL SREA$,DIR$ .IF NDF $$$GLBL .PSECT $DPB$.,D$$$=.  .IFTF SREA$ AST .IFTE .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SREA$Cb  .MACRO SREA$S AST,ERR .MCALL MOV$,DIR$N MOV$ AST MOV (PC)+,-(SP) .BYTE 167.,2S DIR$ ,ERR .ENDM SREA$S,b  .MACRO SREA$ ASTR .MCALL OFF$ .IF NDF $$$GLB. .BYTE 167.,2$ .WORD AST .ENDC .IF NDF S.REAE. .NLISTR OFF$ OFF$ S.REAE,2 .LIST .ENDC .ENDM SREA$b " .MACRO SREF$C TASK,WDB,EFN,CS,ERR .MCALL SREF$,DIR$ .IF NDF $$$GLB  .PSECT $DPB$.,D$$$=. .IFTF SREF$ TASK,WDB,EFNS .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SREF$Cb ! .MACRO SREF$S TSKADR,WDB,EFN,ERR .MCALL DIR$,MOV$,RFA$ MOV$ WDB MOV$ EFN RFA$ TSKADR MOV (PC)+,-(SP) .BYTE 69.,5 DIR$ ,ERR .ENDM SREF$SNb  .MACRO SREF$ TASK,WDB,EFN .MCALL R50$,OFF$ .IF NDF $$$GLB .BYTE 69.,5 R50$ TASK .WORD EFN .WORD WDB .ENDC .IF NDF S.RETNF+ .IRP X,<,,,>. OFF$ X$ .ENDM .ENDC .ENDM SREF$b  .MACRO SREX$C AST,BUF,CS,ERRS .MCALL SREX$,DIR$ .IF NDF $$$GLB$ .PSECT $DPB$.,D$$$=.A .IFTF SREX$ AST,BUF .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SREX$CAb  .MACRO SREX$S AST,BUF,ERR .MCALL MOV$,DIR$$ CLR -(SP) MOV$ AST. MOV (PC)+,-(SP) .BYTE 167.,3 DIR$ ,ERR .ENDM SREX$Sb  .MACRO SREX$ AST,BUF. .MCALL OFF$ .IF NDF $$$GLBT .BYTE 167.,3S .WORD AST .WORD 0 .ENDC .IF NDF S.REAEN .NLISTC OFF$M OFF$ S.REAE,2 .LIST .ENDC .ENDM SREX$b  .MACRO SRRA$C AST,CS,ERRL .MCALL SRRA$,DIR$ .IF NDF $$$GLB .PSECT $DPB$.,D$$$=.. .IFTF SRRA$ AST .IFT. .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM SRRA$CXb  .MACRO SRRA$S AST,ERR .MCALL MOV$,DIR$M MOV$ ASTS MOV (PC)+,-(SP) .BYTE 21.,2 DIR$ ,ERR .ENDM SRRA$Sb  .MACRO SRRA$ AST .MCALL OFF$ .IF NDF $$$GLB1 .BYTE 21.,2 .WORD AST .ENDC .IF NDF S.RRAEA .NLISTS OFF$F OFF$ S.RRAE,2 .LIST .ENDC .ENDM SRRA$b % .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 .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM VRCX$Cb # .MACRO VRCX$S TN,BA,BL=#13.,TI,ERRS .MCALL MOV$,DIR$, RFA$E MOV$ TI MOV$ BL MOV$ BA RFA$ TN MOV (PC)+,-(SP) .BYTE 77.,6. DIR$ ,ERR .ENDM VRCX$SL"b  .MACRO VRCX$ TN,BA,BL=13.,TIR .MCALL OFF$, R50$ .IF NDF $$$GLB2 .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$b  .MACRO STSE$C EFN,CS,ERR .MCALL STSE$,DIR$ .IF NDF $$$GLB1 .PSECT $DPB$.,D$$$=.D .IFTF STSE$ EFN .IFT .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM STSE$C.b  .MACRO STSE$S EFN,ERR .MCALL DIR$,MOV$R MOV$ EFNL MOV (PC)+,-(SP) .BYTE 135.,2F DIR$ ,ERR .ENDM STSE$SCb  .MACRO STSE$ EFN. .MCALL OFF$ .IF NDF $$$GLBT .BYTE 135.,2. .WORD EFN .ENDC .IF NDF S.TSEF, OFF$X OFF$ S.TSEF,2 .ENDC .ENDM STSE$b * .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$S8b  .MACRO WDBDF$ GBL .MCALL .BLKW.,.BLKB.,.BLK.R .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 .00"F88s,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* .GLOBL 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$$b  .MACRO STIM$C NBUF,OBUF,CS,ERRB .MCALL STIM$,DIR$ .IF NDF $$$GLBL .PSECT $DPB$.,D$$$=.. .IFTF STIM$ NBUF,OBUF .IFT, .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM STIM$C>fb  .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.TIYR .NLIST<$$$OST=05 .IRP X,<,,,> OFF$ X< .ENDM5 .IRP X,<,,,>F OFF$ X .ENDM .LIST .ENDC .ENDM STIM$S,b  .MACRO STIM$ NBUF,OBUF .MCALL OFF$ .IF NDF $$$GLBF .BYTE 61.,3 .WORD NBUF .WORD OBUFD .ENDC .IF NDF S.TIBAN .NLIST> 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$b  .MACRO STOP$C CS,ERR, .MCALL STOP$,DIR$ .IF NDF $$$GLBT .PSECT $DPB$.,D$$$=. .IFTF STOP$ .IFTR .PSECT CS DIR$ #$$$,ERR .ENDC .ENDM STOP$Crb  .MACRO STOP$S ERR .MCALL DIR$ MOV (PC)+,-(SP) .BYTE 131.,1 DIR$ ERRA .ENDM STOP$SOZb  .MACRO STOP$. .IF NDF $$$GLB, .BYTE 131.,1I .ENDC .ENDM STOP$b  .MACRO SCAL$S SRAD,CRAD,ERR .MCALL DIR$,MOV$> MOV$ CRAD MOV$ SRAD MOV (PC)+,-(SP) .BYTE 155.,3$ DIR$ ,ERR .ENDM SCAL$S  b  .MACRO FEADF$,L,B .MCALL DEFIN$ .IF NB L'B. ...GBL=1 .IFF ...GBL=0F .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. DEFIN$ FE$LSI,9. 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.Y 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$SEC,48. 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. DEFIN$ FE$PC3,65. DEFIN$ FE$DFB,66. DEFIN$ FE$RTB,67. DEFIN$ FE$ODB,68. DEFIN$ FE$XDJ,69. DEFIN$ FE$NSY,70. DEFIN$ FE$NCO,71. DEFIN$ FE$RTK,72. DEFIN$ FE$RDR,73. DEFIN$ FE$RLG,74. DEFIN$ FE$LDR,75. DEFIN$ FE$VTL,76. DEFIN$ FE$ANT,77. DEFIN$ FE$NRT,78. DEFIN$ FE$EXE,79. DEFIN$ FE$CMO,80. DEFIN$ FE$SLS,81. DEFIN$ FE$UBM,82. DEFIN$ FE$ICP,83. DEFIN$ FE$SWB,84.A DEFIN$ FE$ACK,85. ; System supports alternate checkpoint supportD< DEFIN$ FE$Y2K,87. ; System displays years in 4 digit format3 DEFIN$ FE$32B,88. ; System supports 32-bit devicesE= DEFIN$ FE$ISO,800"N5TADATADATADATADATADATADATADATADATA9. ; System displays years in ISO 8601 formatO DEFIN$ HF$UBM,-1. DEFIN$ HF$EIS,-2. DEFIN$ HF$QB,-3.G DEFIN$ HF$DSP,-4. DEFIN$ HF$SWR,-5. DEFIN$ HF$KXJ,-6. DEFIN$ HF$RMT,-7. DEFIN$ HF$CIS,-8. DEFIN$ HF$TOY,-9. DEFIN$ HF$KDJ,-10.8 DEFIN$ HF$UME,-11.. DEFIN$ HF$FPP,-16. DEFIN$ HF$NVR,-17.D DEFIN$ HF$INV,-18.s DEFIN$ HF$CLK,-19.e DEFIN$ HF$ITF,-20. DEFIN$ HF$PRO,-21.S DEFIN$ HF$BRG,-32.i 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.F 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. DEFIN$ T4$LBW,42. DEFIN$ T4$LRW,43. DEFIN$ T4$RON,44. .MACRO FEADF$ X,Y .ENDM FEADF$D .ENDM FEADF$.b " .MACRO RDBBK$ SIZ,NAM,PAR,STS,PRO .MCALL RDBDF$,R50$T RDBDF$F .WORD 0 .WORD SIZ R50$ NAM. R50$ PAR3 .WORD STS .WORD PRO .ENDM RDBBK$3Rb  .MACRO RDBDF$ GBL .MCALL .BLKW.,.BLK. .BLK. .BLKW. 1,R.GID,GBL .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.RES,RS.MDL,RS.NDL,RS.ATT 1 .GLOBL RS.NEX,RS.EXT,RS.DEL,RS.WRT,RS.RED,RS.TOP .ENDCRS.CRR=^O<100000>ZRS.UNM=^O<40000>RS.TOP=^O<1000>0RS.RES=^O<400>RS.MDL=^O<200>RS.NDL=^O<100> RS.ATT=^O<40>O RS.NEX=^O<20>P RS.DEL=^O<10>K RS.EXT=^O<4> RS.WRT=^O<2> RS.RED=^O<1> .MACRO RDBDF$ X .ENDM .ENDM RDBDF$.b  .MACRO QIOSY$ $$$GBL,$$$MSG) .IIF IDN,<$$$GBL>,, .GLOBL QI.VERS .IF IDN,<$$$MSG>, $$$MAX=0. $$MSG=1 .IFFN $$MSG=0 .ENDC .MCALL IOERR$ IOERR$ $$$GBL .MCALL DRERR$ DRERR$ $$$GBL .IF DIF,<$$$MSG>,D .MCALL FILIO$ FILIO$ $$$GBL .MCALL SPCIO$ SPCIO$ $$$GBL .MACRO QIOSY$ ARG,ARG1,ARG2 .ENDM QIOSY$N .ENDC .ENDM QIOSY$0 b  .MACRO IOERR$ $$$GBLT .MCALL .IOER.,DEFIN$S .IF IDN,<$$$GBL>,X ...GBL=1. .IFFB ...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.0 .IOER. IE.RSU,-17.. .IOER. IE.OVR,-18. .IOER. IE.BYT,-19.S .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.C .IOER. IE.DIS,-69.A .IOER. IE.PNT,-71.A .IOER. IE.NDR,-72.N .IOER. IE.TMO,-95.F .IOER. IE.CNR,-96.V .IOER. IE.MII,-99.K .IOER. IE.SPI,-100. .IOER. IE.FER,-101. .IOER. IE.CBE,-105. .IOER. IE.NOD,-23.I .IOER. IE.DFU,-24.U .IOER. IE.IFU,-25.R .IOER. IE.NSF,-26.T .IOER. IE.LCK,-27.K .IOER. IE.HFU,-28.D .IOER. IE.WAC,-29.N .IOER. IE.CKS,-30.E .IOER. IE.WAT,-31.K .IOER. IE.RER,-32.E .IOER. IE.WER,-33.T .IOER. IE.ALN,-34.L .IOER. IE.SNC,-35.C .IOER. IE.SQC,-36.W .IOER. IE.NLN,-37.S .IOER. IE.CLO,-38.T .IOER. IE.DUP,-57.R .IOER. IE.BVR,-63.O .IOER. IE.BHD,-64.R .IOER. IE.EXP,-75.I .IOER. IE.BTF,-76.I .IOER. IE.ALC,-84.R .IOER. IE.ULK,-85.E .IOER. IE.WCK,-86.D .IOER. IE.DSQ,-90.U .IOER. IE.PIO,-104. .IOER. IE.NBF,-39.F .IOER. IE.RBG,-40.K .IOER. IE.NBK,-41.U00"V88s> DEFIN$ IS.ESC,<^O<33*400+1>>E DEFIN$ IS.CC, <^O<3*400+1>> DEFIN$ IS.ESQ,<^O<233*400+1>> DEFIN$ IS.PES,<^O<200*400+1>> DEFIN$ IS.EOT,<^O<4*400+1>> DEFIN$ IS.TAB,<^O<11*400+1>>P DEFIN$ IS.TMO,+2. DEFIN$ IS.OOB,+3. DEFIN$ IS.TMM,+4.' DEFIN$ IS.RVI,+2. ; DATA SUCC. XMITTEDO' DEFIN$ IS.CNV,+3. ; DATA SUCC. XMITTEDD 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. .IF EQ,$$MSG+ .MACRO IOERR$ A .ENDM IOERR$> .ENDC .ENDM IOERR$3rb  .MACRO DRERR$ $$$GBL .MCALL .QIOE.,DEFIN$4 .IF IDN,<$$$GBL>,4 ...GBL=1D .IFFS ...GBL=0* .ENDC .IIF NDF,$$MSG,$$MSG=0F .QIOE. IE.UPN,-01.N .QIOE. IE.INS,-02.  .QIOE. IE.PTS,-03.C .QIOE. IE.UNS,-04.S .QIOE. IE.ULN,-05.  .QIOE. IE.HWR,-06.X .QIOE. IE.ACT,-07.L .QIOE. IE.ITS,-08.- .QIOE. IE.FIX,-09.. .QIOE. IE.CKP,-10. .QIOE. IE.TCH,-11.D .QIOE. IE.RBS,-15.F .QIOE. IE.PRI,-16.E .QIOE. IE.RSU,-17.R .QIOE. IE.NSW,-18. .QIOE. IE.ILV,-19.3 .QIOE. IE.ITN,-20.. .QIOE. IE.LNF,-21. .QIOE. IE.AST,-80.4 .QIOE. IE.MAP,-81.D .QIOE. IE.IOP,-83.. .QIOE. IE.ALG,-84.N .QIOE. IE.WOV,-85.$ .QIOE. IE.NVR,-86.N .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$.8b  .MACRO FILIO$ $$$GBL .MCALL .WORD.,DEFIN$. .IF IDN,<$$$GBL>, ...GBL=1S .IFFE ...GBL=09 .ENDC .WORD. IQ.X, <^O001>,<^O000> .WORD. IQ.Q, <^O002>,<^O000> .WORD. IQ.S, <^O004>,<^O000> .WORD. IQ.UMD,<^O004>,<^O000> .WORD. IQ.SEL,<^O011>,<^O000> .WORD. IQ.LCK,<^O200>,<^O000> .WORD. IO.KIL,<^O012>,<^O000> .WORD. IO.RDN,<^O022>,<^O000> .WORD. IO.UNL,<^O042>,<^O000> .WORD. IO.LTK,<^O050>,<^O000> .WORD. IO.RTK,<^O060>,<^O000> .WORD. IO.SET,<^O030>,<^O000> .WORD. IO.WLB,<^O000>,<^O001> .WORD. IO.RLB,<^O000>,<^O002> .WORD. IO.LOV,<^O010>,<^O002> .WORD. IO.LDO,<^O110>,<^O002> .WORD. IO.ATT,<^O000>,<^O003> .WORD. IO.DET,<^O000>,<^O004> .WORD. IO.FNA,<^O000>,<^O011> .WORD. IO.RNA,<^O000>,<^O013> .WORD. IO.ENA,<^O000>,<^O014> .WORD. IO.CLN,<^O000>,<^O007> .WORD. IO.ULK,<^O000>,<^O012> .WORD. IO.ACR,<^O000>,<^O015> .WORD. IO.ACW,<^O000>,<^O016> .WORD. IO.ACE,<^O000>,<^O017> .WORD. IO.DAC,<^O000>,<^O020> .WORD. IO.RVB,<^O000>,<^O021> .WORD. IO.WVB,<^O000>,<^O022> .WORD. IO.EXT,<^O000>,<^O023> .WORD. IO.CRE,<^O000>,<^O024> .WORD. IO.DEL,<^O000>,<^O025> .WORD. IO.RAT,<^O000>,<^O026> .WORD. IO.WAT,<^O000>,<^O027> .WORD. IO.APV,<^O010>,<^O030> .WORD. IO.APC,<^O000>,<^O030> .MACRO FILIO$ A .ENDM FILIO$ .ENDM FILIO$<tb 00"^5TADATADATADATADATADATADATADATADATA .MACRO SPCIO$ $$$GBLO .MCALL .WORD.,DEFIN$O .IF IDN,<$$$GBL>,W ...GBL=1O .IFF. ...GBL=0E .ENDC .WORD. IO.WLV,<^O100>,<^O001> .WORD. IO.WLS,<^O010>,<^O001> .WORD. IO.WNS,<^O020>,<^O001> .WORD. IO.WAL,<^O010>,<^O001> .WORD. IO.WMS,<^O020>,<^O001> .WORD. IO.CCO,<^O040>,<^O001> .WORD. IO.WBT,<^O100>,<^O001> .WORD. IO.WLT,<^O010>,<^O001> .WORD. IO.WLC,<^O020>,<^O001> .WORD. IO.WPB,<^O040>,<^O001> .WORD. IO.WDD,<^O140>,<^O001> .WORD. IO.RSN,<^O140>,<^O002> .WORD. IO.RLV,<^O100>,<^O002> .WORD. IO.RST,<^O001>,<^O002> .WORD. IO.RAL,<^O010>,<^O002> .WORD. IO.RNE,<^O020>,<^O002> .WORD. IO.RNC,<^O040>,<^O002> .WORD. IO.RTM,<^O200>,<^O002> .WORD. IO.RDB,<^O200>,<^O002> .WORD. IO.SCF,<^O200>,<^O002> .WORD. IO.RHD,<^O010>,<^O002> .WORD. IO.RNS,<^O020>,<^O002> .WORD. IO.CRC,<^O040>,<^O002> .WORD. IO.RPB,<^O040>,<^O002> .WORD. IO.RDF,<^O240>,<^O002> .WORD. IO.RLC,<^O020>,<^O002> .WORD. IO.CMP,<^O210>,<^O002> .WORD. IO.ATA,<^O010>,<^O003> .WORD. IO.GTS,<^O000>,<^O005> .WORD. IO.R1C,<^O000>,<^O005> .WORD. IO.INL,<^O000>,<^O005> .WORD. IO.TRM,<^O010>,<^O005> .WORD. IO.RWD,<^O000>,<^O005> .WORD. IO.SPB,<^O020>,<^O005> .WORD. IO.RPL,<^O020>,<^O005> .WORD. IO.SPF,<^O040>,<^O005> .WORD. IO.STC,<^O100>,<^O005> .WORD. IO.SMD,<^O110>,<^O005> .WORD. IO.SEC,<^O120>,<^O005> .WORD. IO.RWU,<^O140>,<^O005> .WORD. IO.SMO,<^O160>,<^O005> .WORD. IO.HNG,<^O000>,<^O006> .WORD. IO.HLD,<^O100>,<^O006> .WORD. IO.BRK,<^O200>,<^O006> .WORD. IO.RBC,<^O000>,<^O006> .WORD. IO.MOD,<^O000>,<^O006> .WORD. IO.HDX,<^O010>,<^O006> .WORD. IO.FDX,<^O020>,<^O006> .WORD. IO.SYN,<^O040>,<^O006> .WORD. IO.EOF,<^O000>,<^O006> .WORD. IO.ERS,<^O020>,<^O006> .WORD. IO.DSE,<^O040>,<^O006> .WORD. IO.RTC,<^O000>,<^O007> .WORD. IO.SAO,<^O000>,<^O010> .WORD. IO.SSO,<^O000>,<^O011> .WORD. IO.RPR,<^O000>,<^O011> .WORD. IO.MSO,<^O000>,<^O012> .WORD. IO.RTT,<^O001>,<^O012> .WORD. IO.SLO,<^O000>,<^O013> .WORD. IO.MLO,<^O000>,<^O014> .WORD. IO.LED,<^O000>,<^O024> .WORD. IO.SDO,<^O000>,<^O025> .WORD. IO.SDI,<^O000>,<^O026> .WORD. IO.SCS,<^O000>,<^O026> .WORD. IO.REL,<^O000>,<^O027> .WORD. IO.MCS,<^O000>,<^O027> .WORD. IO.ADS,<^O000>,<^O030> .WORD. IO.CCI,<^O000>,<^O030> .WORD. IO.LOD,<^O000>,<^O030> .WORD. IO.MDI,<^O000>,<^O031> .WORD. IO.DCI,<^O000>,<^O031> .WORD. IO.PAD,<^O000>,<^O031> .WORD. HT.RPP,<^O010>,<^O000> .WORD. IO.XMT,<^O000>,<^O031> .WORD. IO.XNA,<^O010>,<^O031> .WORD. IO.INI,<^O000>,<^O031> .WORD. IO.HIS,<^O000>,<^O032> .WORD. IO.RCI,<^O000>,<^O032> .WORD. IO.RCV,<^O000>,<^O032> .WORD. IO.CLK,<^O000>,<^O032> .WORD. IO.CSR,<^O000>,<^O032> .WORD. IO.MDO,<^O000>,<^O033> .WORD. IO.CTI,<^O000>,<^O033> .WORD. IO.CON,<^O000>,<^O033> .WORD. IO.ORG,<^O010>,<^O033> .WORD. IO.ANS,<^O020>,<^O033> .WORD. IO.STA,<^O000>,<^O033> .WORD. IO.DTI,<^O000>,<^O034> .WORD. IO.DIS,<^O000>,<^O034> .WORD. IO.MDA,<^O000>,<^O034> .WORD. IO.DPT,<^O010>,<^O034> .WORD. IO.RTI,<^O000>,<^O035> .WORD. IO.CTL,<^O000>,<^O035> .WORD. IO.STP,<^O000>,<^O035> .WORD. IO.SWI,<^O000>,<^O035> .WORD. IO.CNT,<^O000>,<^O036> .WORD. IO.ITI,<^O000>,<^O036> .WORD. IO.EIO,<^O000>,<^O037> DEFIN$ VV$SET,1 DEFIN$ VV$UNL,2 DEFIN$ VV$SIZ,-1> .WORD. IO.RSD,<^O030>,<^O014> .WORD. IO.WSD,<^O010>,<^O013> DEFIN$ SD.TXT,0 DEFIN$ SD.GDS,1 .WORD. SB.PRT,<^O020>,<^O003> .WORD. SB.CLR,<^O010>,<^O036> .WORD. SB.RDY,<^O010>,<^O033> .WORD. SB.NRD,<^O020>,<^O033> .WORD. IO.LBK,<^O000>,<^O035> .WORD. SB.CBL,<^O010>,<^O035> .WORD. SB.CLK,<^O020>,<^O035> .WORD. IO.CPR,<^O010>,<^O033> .WORD. IO.CAS,<^O020>,<^O033> .WORD. IO.CRJ,<^O040>,<^O033> .WORD. IO.CBO,<^O110>,<^O033> .WORD. IO.CTR,<^O210>,<^O033> .WORD. IO.GNI,<^O010>,<^O035> .WORD. IO.GLI,<^O020>,<^O035> .WORD. IO.GLC,<^O030>,<^O035> .WORD. IO.GRI,<^O040>,<^O035> .WORD. IO.GRC,<^O050>,<^O035> .WORD. IO.GRN,<^O060>,<^O035> .WORD. IO.CSM,<^O070>,<^O035> .WORD. IO.CIN,<^O100>,<^O035> .WORD. IO.SPW,<^O110>,<^O035> .WORD. IO00"f#k8s,<^O035> .WORD. IO.NLB,<^O130>,<^O035> .WORD. IO.DLB,<^O140>,<^O035> .WORD. IO.CTY,<^O000>,<^O007> .WORD. IO.DTY,<^O000>,<^O015> .WORD. IO.LDI,<^O000>,<^O016> .WORD. IO.UDI,<^O010>,<^O023> .WORD. IO.LTI,<^O000>,<^O017> .WORD. IO.UTI,<^O020>,<^O023> .WORD. IO.LTY,<^O000>,<^O020> .WORD. IO.UTY,<^O030>,<^O023> .WORD. IO.LKE,<^O000>,<^O024> .WORD. IO.UER,<^O040>,<^O023> .WORD. IO.NLK,<^O000>,<^O023> .WORD. IO.ONL,<^O000>,<^O037> .WORD. IO.FLN,<^O000>,<^O025> .WORD. IO.RAD,<^O000>,<^O021> .WORD. IO.MAO,<^O010>,<^O007> .WORD. IO.LEI,<^O010>,<^O017> .WORD. IO.RDD,<^O010>,<^O020> .WORD. IO.RMT,<^O020>,<^O020> .WORD. IO.LSI,<^O000>,<^O022> .WORD. IO.UEI,<^O050>,<^O023> .WORD. IO.USI,<^O060>,<^O023> .WORD. IO.CSI,<^O000>,<^O026> .WORD. IO.DSI,<^O000>,<^O027> .WORD. IO.RAM,<^O000>,<^O032> .WORD. IO.RLK,<^O000>,<^O013> .WORD. IO.EBT,<^O000>,<^O011> .WORD. IO.ATX,<^O000>,<^O001> .WORD. IO.ATF,<^O000>,<^O002> .WORD. IO.CRX,<^O000>,<^O031> .WORD. IO.DRX,<^O000>,<^O032> .WORD. IO.RTF,<^O000>,<^O033> .MACRO SPCIO$ A .ENDM SPCIO$ .ENDM SPCIO$<b  .MACRO UMDIO$ $$$GBLO .MCALL .WORD.,DEFIN$O .IF IDN <$$$GBL>,I...GBL=1 .IFF...GBL=0 .ENDC .WORD. IQ.UMD,<^O004>,<^O000> .WORD. IO.HMS,<^O000>,<^O010> .WORD. IO.BLS,<^O010>,<^O010> .WORD. IO.OFF,<^O020>,<^O010> .WORD. IO.RDH,<^O030>,<^O010> .WORD. IO.WDH,<^O040>,<^O010> .WORD. IO.WCK,<^O050>,<^O010> .WORD. IO.RNF,<^O060>,<^O010> .WORD. IO.RNR,<^O070>,<^O010> .WORD. IO.LPC,<^O100>,<^O010> .WORD. IO.RTD,<^O120>,<^O010> .WORD. IO.WTD,<^O130>,<^O010> .WORD. IO.TDD,<^O140>,<^O010> .WORD. IO.DGN,<^O150>,<^O010> .WORD. IO.WPD,<^O160>,<^O010> .WORD. IO.RPD,<^O170>,<^O010> .WORD. IO.CER,<^O200>,<^O010> .WORD. IO.CEW,<^O210>,<^O010> .MACRO UMDIO$ A .ENDM .ENDM UMDIO$ b  .MACRO .IOER. SYM,LO,MSG> DEFIN$ SYM,LO .IF GT,$$MSG> .MCALL .IOMG. .IOMG. SYM,LO, .ENDC .ENDM .IOER.6b  .MACRO .QIOE. SYM,LO,MSG. DEFIN$ SYM,LO .IF GT,$$MSG. .MCALL .IOMG. .IOMG. SYM,,< .ENDC .ENDM .QIOE. b  .MACRO .IOMG. SYM,LO,MSG> .WORD -^O .ENABL LC .ASCIZ ^MSG^. .DSABL LC .EVEN' .IIF LT,^O<$$$MAX+>,$$$MAX=-^O .ENDM .IOMG.<Xb  .MACRO .WORD. SYM,LO,HI DEFIN$ SYM, .ENDM .WORD.ER. SYM,LO,MSG> DEFIN$ SYM,LO .IF GT,$$MSG> .MCALL .IOMG. .IOMG. SYM,LO, .ENDC .ENDM .IOER.6b  .MACRO .QIOE.<0b , &#sxWxLJGLgrG3yV4fy^F zF VNz8r +z (G .X %G 2&G (G PdG (G G :G /KG G WG `G XG iG tG qG |G (X ,G 8G 8G VNX SX i^G v^G wX yX \}X X .X 5X qX X e^G G G xsG pX G(GTGG,{`T} tG0 }|0|Cp}Bz_M@fM@%~f+z}~)WX)WX))XX)XX)ZX)ZX, X,!X,R"X,(X,CMX,NX,SX,yX,\}X-DX-EX.X.X.X.X2X2.X2pX2X2X2X2ًX3^sX3sX<8"<R"<$:K_MfM{vy2+zd6&Gd&Gd(Gl(XlCMXlNXlSXl\}XtpX!!z'!%<6!}[!}q!Pq!y+"Y X+"X+"zX+"6X+"K"X+"'X+"(X+"YX00#n5TADATADATADATADATADATADATADATADATA+"X+"X+"ZX+"2X #n~#}#Oq##""X#wX# zX#X#X#.X#X#yX#yX#N&X#yX#v~X%G%G%G%r!G%#G% #G%#G%LG%ZG%kfG% qG%tG%wG%xG%G%CG%G<&kG<&DG<&%G<&G<&zG<&(G<&w*G<&:G<&H;G<&SG<&`G<&eG<&fG<&fG<&pG<&pG<&KqG<&%tG<&iwG<&lyG<&9G<&G<&BGI&}c&Xc&Xc&Xc&Xc&Xc&L Xc&Xc&Xc&Xc&Xc&Xc&Xc&Xc&;Xc&Xc&Xc&Xc&Xc&Xc&~Xc&Xc& Xc&"Xc&"Xc&#Xc&#Xc&#Xc&#Xc&4&Xc&'Xc&,Xc&8Xc&";Xc&G;Xc&|KXc&KXc&jLXc&_MXc&MXc&NXc&SXc&TXc&UXc&WXc&XXc& XXc&XXc&gYXc&dZXc&ZXc&b^Xc&^Xc&dXc&eXc&eXc&fXc&dfXc&fXc&9gXc&pXc&pXc&2qXc&grXc&krXc&sXc&sXc&wwXc&wXc&xXc&xXc&yXc&yXc&ZzXc&hzXc&}Xc&Xc&Xc&Xc&Xc&Xc&Xc&Xc&RXc& Xc&#Xc&KXc&Xc&BXp&B&G&ZG&]fG&tG&tG&CyG|' G|'G'dB'eB'G'IRG' qG'ąG'G((X(lX(zX(WX(&XX(YX(mX(X(ZX(@X(iX(X(X(5X(yG( G(QG\)zG\)G\) G\)KG)G))[MG) G)PG),G)nEG)sEG)EG)_GG)GG)2HG)4G)ZG)p )'G)TyG)G)0X)%G)'G)^G)PsG) G)G)%G)LG)WG)WG)G)ZG)8G)x)` )VX)X)(X)VNX)SX)CTX)VdX)[dX)jdX)fX)fX)gX)pX)nrX)sX)wX)yX)\}X)pG) G) G)w G)pG)KqG)G)%)5)G)t G)G)G)BxG)OzX)PzX)G)!G)dG)VgG)[}G)p )))XG)pG)G)Gt*Rt*Rt*Rt*GRt*I"Rt*3Rt*NRt*rRt*sRt*sRt*sRt*zRt*Rt*Rt*bRt*։R*4R*KR*R*R*R* R*8&R*@,R*KR* XR*@wR*wRT,KXT,XT,XT,X,t,1|(,Z,VN,Q,:dT,Oq,u~,,X6-26-26-26-26-z26-'26-+26-f26-Kl26-Vq26-26-j26-26-ą26-K2-.Q|(#0X#0X#0X#0X#09X#0DX#0LX#0MX#0vX#0X#0)X#04X#0X#0X#0TX#0UX#0X#0X#0xX#08X#08X#08X#08X#08X#08X#08X#08X#0:X#0k;X#0;X#0;X$0!X$0R"X$0(X$0SX$0sX,0X,0X,0σX,02X,05X,0qX,0X-0X-01X00pX00qX00sX00sX00sX20,X20,X20,-X20.X20.X408X408X408X408X409X40Q:X40W:X40;;X40:<X40wX40uwX40wX40wX40xX40xX40CyX40NyX40RyX40yX40yX40yX40yX401zX40wR:KwR:iwR:owR:wR:wR:xR:xR:xR:ByR:FyR:WyR:yR:yR:yR:yR:azR:zR:}R:R:R:R:R:+R:|R:AR:iR:yR:R:R:$R:CR:dR:hR:R:R:R:R:R:ۑR:R:BR:DR:R:R:2R:R:1R:;KR;@jR;vR;wR;LR;R@;({T;RT;8RT;RT;RT;RT;RT;7RT;!RT;;"RT;I"RT;`RT;dRT;4fRT;$qRT;sRT;wRT;DyRT; zRT;zRT;*}RT;RT;RT;3RT;RT;RlK[MXlK_MXKBNfXNXr%s@8s]Xs^Xs`XUs%Vcs}Vst XsXsXs#XsQXs,XXs`XXsLqXs[qXshXs}XsXs [t{8X[tX[tX[tXtwXtyXtXt Xt{R?{0R?{pR?{R?{R?{pR?{NR?{@R@{0R@{NR@{NRA{0RA{RA{RB{NRC{RD{0RE{RE{RG{R}R}R}R}4R}yR}R} R}H R} R} R}KR}kR}R}>R}R}R}R}R}R}R}R}R}R}!R}I"R}8&R}](R}(R}2R}2R}T3R}3R}5R}8R}O:R}:R}:R}D;R}KR}KR}MR}vNR}xQR}QR}RR}WR}KXR}:YR}`YR}ZR}ZR}`R}:dR}fR}fR}(gR}iR}jR}pR}UqR}qR}sR}HwR}JwR}wR}wR}xR}xR}xR}xR}yR}yR}zR}8}R}V}R}]}R}c}R}~R}R}R}R}0R}փR}׃R}؃R}كR}ڃR}ۃR}܃R}݃R}ރR}߃R}|R},R}R}R}R}@ ~L R ~ R ~GR ~I"R ~YR ~pR ~ qR ~)qR ~[qR ~brR ~urR ~rR ~rR ~sR ~sR ~sR ~sR ~zR ~R ~5R ~R ~R ~$R ~:R ~R ~ۑR ~{R ~^R_MfMa |Ra |RbSRd}Rk |Rl8 Rl Rl Rl Rl Rl+ RlRl!XlR"Xl(XlCMXlNXlSXlQ\RllRllRllRlsXlsXlyXl\}XlRlRlRlRlRlRlRsRuVYRuyRuyRuyRuyRuyRvӁRvRvRvRvRvRvRvRvRvRvRvRvRX6XL X X X`qXwX7xXAyXNyXyXyXXXCXCXCXCXC,XCQXCSXC\XXC|ZXC fXCfXCUqXCrXCsXCxXCkzXkXkXkXk'XkgKXkKXkMXkTXkfXkfXkrXkxX'%<}zLdX.XSXSvXSX|@R**WRB wR BxR |Ri$$`$`$$ $8T$ō,$ōw$ȍ8 $ȍ$ȍ`$ʍ8T$ˍs$ˍH$}*~``ÐHXԒXԒXԒXԒ7!XԒ#XԒxQXԒWXԒWXԒqXԒLqXԒ[qXԒVsXԒ;xXԒXԒ}XԒXԒRX:.X. X.8X.KX. LX.^X.qX.BxX.yX.yX4wX#R#֯R#R#R-R-'R-(R-?R-R-[R-R5|R5R5R5^R5fR5ٱR5$R55R5QR"#&Vu'*U(*,v:JT[*E`:dx\gIqXTq*UqlVq!tw6xJAy*ąbX HWD,`<W`ȫ *ʫh~ͫe<@QHV@45 5!j<t!Ȭ F;P2;VN<`=@==`rDK4'6֯}CdeF474}4vdx7 XCX@9\p=dpsu v9B \q Pw x z ?S@SAS} ,l J,z 4u~h 8r= &lE:1K1o1p1q1r1s1t1u1v1w4}6L 6xQ9`=Kr?y?BC\}C\D\^Whp! h!h&8h':}s:2/KJP:=y?; ?Dv@ :jiw< vww}}N Ա2&BԱ&BԱ(BձAձSCձWA^ֱfaBoC 4v0 0# 02XC4D`;E2&B&B(BfaBe;E$*Ѳ:F&ܲ""ܲ#ܲ#ܲ`ܲ)dDܲGdDܲ@waK3a[M3aVN<aZb2bG3c2 6cIq cd?!4d)&< d;5@de&6e&6eMeMeZe$3e?3f4vft:fy:gg<g^g^g^ggg,gCgRgg^ggg}9i iF8iWlmlE:mo:dp# ph;p &PpJ,<pK,=pZpiw< pvwpwppy?py?py?q:Drkr@r"&rSrwr,}rrrC@lrs2s2 6s.2sk=s}wDwDwtEwL wkw@lwwjwxkF8xkF800#5TADATADATADATADATADATADATADATADATAWx%Ps~3yV4fy^,d w z @~; f2; v2F zK VN<r +z ]_ ] `^" Kq2 J+3xxx|xx 0 $@LdXRy[M3|(w }|%S4v&e _M@%~f}~1yDL@:h;<zB4e"4@Lz_Ml'5n X5zz'5@zzXW6` ` Hr.uXRv[ S[ @S[ AS^'!%<0!# 6!}[!}! 6#y#'#LF#}b#t!7#Oq# &( &,G &@7 &oKN &pKP &yM &zNj & &KKn!&}&`;&pu'x9\'dB(#=d((9B((xQ_,,Z,h9,l J,z ,Oq,hy-T.@J2d4h:;svYM]RK:SKq:dT:ZKt^E`W E`PZF`88F`W:N`@J63ax}m3a~p3ao4a` 6ae6ahZ6af6a8`z6a8d6a8b7a`9axh9al9ajBa8"5d:dh;:dl;:diw< :dvw:dw:dwdvPep<ev=$ep!eDfT=afZkf`;>kfKq?f; ?Dfv@ f] \gN\ghykzR q} q_M 2qW@7q7qq@l7qsqIqAVqMA^\qsr>r%s@84sUs%Vs"&tLtyB$t_3ukM3u^3u_3uIq4u%!4u;; 4uH;5uZ>5up5u%6u" *6ut:V7u`"9uXJ>u>uzL>u>u#b>uu'@>uU(>uT[>uN`>uIqx>uTq>u!t>uAy*>uV>u>u%?ud@u# x@u`BuW!lBuq!Bu"BuXCuzDusEudbGuv vq`vXuCvP9wK:rwrwdw7xs"x+By AyNy w0Sy~Ty`xy%y%^y]ydy@_MC4KqC!! &!p:Ld `}$`(}SX|@R*h~DHEYEw}E$d j(_F8aF&K9}Rw * 8B pB  0 B o`$s}2d?!:fNb 42l'4D  D"0Nb 42n X4D  D"0b 4ӭJz'4ӭDs.@ft:@  D"0d;h  D"Jĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ z ds.| DEe    *1  ˕03 "   ˔Ӕ ʥ7ft: b  ZW D`@o@d?!@aVN@  D"04'h  D"8w *eB 8  oaVN"`0d?!b  R!  D  D"0le&he&hc2 h\s2 h.  D"p *) l0, *) $ )*)0,40,6 b  -Z#t! -De?@o@ft:@s}@  D"0H4h  D"Lw *f f ! fP ŀ)Bos}ft::e?b  mz &@ mD@`@:@}s@ձS@}@@@e;@h&@ձ@h'@ X@zձW@X@e@,l@,z@}@4@ 8r@֯}@'@ƭJ(>ƭD  D"0yuh vh yb 4R,h4Dph@d;@aVN@  D"0|g}h  D"* 5)%Eefffff f% EDD%][%><  1 aVNXd;^phb  JRK Dq:@i@  D"0mlEh  D" Mwiq:b  :SKq D  D"0&moh  D"*  DP5R RRR b  RT DmlE@o@aVN@  D"0*lEh  D".w *eB 8  oaVN*mlE b 4mJ:dh4mDs@d;@  D"0phh  D"e( 1  `((   >: 5s<w  w1  %,,:4  d;phb  ΥBep ΥD @  D"08pJ,h  D"< 8   **$ vb >ƭZ(#>ƭD  D"0yyphyyb  ΥJev ΥD @  D"00pK,hskh&  D"4 8  ** b  ΥjDfT ΥD @pZ@o@r,}@f@  D"0D 8rh.:h  D"Hw ) * w46l0 o pZ,r,}0fb  ΥZkf`; ΥD @d;@m @  D"0p  D"Z8Ae f"( UCɗ+e$&% 8sDsb  Ra Dq:@i@o@  D"0Ѳ:h  D""w *D  woi q:b @WJ#L@WDp &@s@  D"02eh  D"6&ff   'p &$sb  z &, D)HN<&`H)H>[XH)^H<&%H WWH&CyH\)KH<&H(yH)nEHz)sEH<&KqHTH )EH( HL[;H&{PH`[8HHWH&{Hd6&H%kfH%ZH@d&Hz|'H qH'ąH |H)H#)H4)H%H PdH :H )_GH)LgrH)HWH)TyH$z'IRH&{ZHWzH@'H)H0)GH%wH@%xH [#H%CH )2HH4) H,)BxH) H-<&%tHz<&9H `H$)[MH &H %HB)pH<&pH<&pHWwH (H 2&H(d(HWwH i^H` v^HZzt!H)w H.)H)PH8)KqH,{hH4'HF xsH[YHtw(@w BwDwFwHw&-H 6lF8sb 4=J@4=D X@K@  D"0'h  D" 8eB   XKPb vz &yvD  :(}h:`hh4fahxGP}h\h@Ѳ:hX:Zh:h}h @hPz=B@=F\JN:R 8rV@Z`;^Ѳ:X^wwwwwwwwwwwwwwwwwwwwwԱ2&Ա& Ա(ֱfa2&&( fa$y(?T,GP}0wBvF;VNJ,lN,zR4V֯}Z X^ձS&^wwwwwwww82XlE K'ձW:s{H$9KH}xH$9;H%{!H:GH H}D;H:qH:H:qH,wfH:"qH:&qH:&H:$qH:.qH:(qH$9YH}H&$9 Hz$9YH:WHP:a H$9YH,w{H ~sH:TqH:RH$9H}HU$9ZZH:H :H:t H:qHz:H8:H$9CfH$9DfH ~H:H:H ~sH$9Z&H$9bH$9`&H ~H$9kH$9{H<Hz$9~ZH,wH:q!H $9ZH$9ZH}`H`:-HA{0H $9ZH:x HvH;LH}4H ~sH:Hz:H wvH:!H:-H:}H`}Hj$9[H$9'H$93H$9[H$9H$9H,wWH*KH:Hz$91H$93gH:H:-H ~$H@:H5^HlH5fH :#"HuVYH}yHR}H;E{H?{pHz$9rH$9&H}Hi:brH:crH$9fHt*bH@:krH $9H:vrH@t*H5ٱH w+H:rH}pHzk |H:rH :rH :rH:rH0:2H:rH8:rH} HD$9BH5$HlH55H}8}H%$9g'Hz$9n'H<_Ht*zH$9sH$9H$9H?{pH ~:H:[KHkZH}qHV?{Ht*GH$9'H$9Hz$9H$9H$9 H}V}H9}H H>:sH :sHx}]}HA}UqH6: sH:#H:sH }c}H@*@wH5QHzw:dH:KH?{@H:KH$9H}H:} HS:3H@:{3H:|sH }H<:sH`:sH*wH }H=z:sH:sH:sH:sH0:sH ~HT;8H:sH:KHlH $9CH:KHH}!H :H$9VHz$9XH ~ۑH:sHP$9|H:4H:tHT;wH$9.H:-tH`:,dH:1H}|H :74HwHwH-[H}`YH z:vH$9H$9H:n'Hl+ H#$98H$9H:owHvӁH:H}HT:wHP:H:wHt*H z}ZHz6a8>D @[xQ@[Kr@[}@[@[@o@[`@ Kr4ɪ2qhɪ3qhzɪ#qhɪ;rhɪJrhɪ3&hɪKrhɪ#&hɪ2&hɪ;'hɪK'hɪJ'h 4Twh4P t t tK0 Kr5R  J1 r- ;Dt-E U+UD, q   E "[}^[}d[}~[xQ4|5   D E E5$[xQ EWX 52 / & 4 &9 &9U3uE uUw [|5   uE uU5`AU & E& & E& De&fr[`` $̋"5 & & & & De&fH ̋E U6[`T)aw 6  w  e 1 w 0" , 0o4[F[KrJ[}N 8b >z6a8>Ds@[xQ@[@[`@ Kr4ɪ2qhɪ3qhɪJrhɪ3&hɪKrhɪ2&h:ɪK'hɪJ'h 4Bwh4 K0 Kr5G  ?r- 2Dt-E U"UD   E 5   D h[xQ|E E5[xQ EWO ,) &  4 &9U3uE uUw5  [|  uE u00#5TADATADATADATADATADATADATADATADATAU5`AU & E& & E& De&f $̋"5`[`N & & & & De&fH ̋E U$[`ws Kb >z6a8>D[`@ Kr4Fɪ3qhɪ3&hɪKrhɪK'h 4wh4K0 KrJ5 5 5 2  UE5  E5@? & E& & E& De&f $̋"5 & & & & De&fH2[`r[`| ̋U Tb >z6a>D @[xQ@[Kr@[}@[@[@o@[`@ Kr4~ɪ;rhɪJrhbɪKrhɪ;'hɪK'hɪJ'h 4wh4P t t tK0 Kr5;  31 r- $DUt-E D, q  E E Ӂ"[}Z[}`[}t[xQ|  E U &W2/ , & 4 &9 &9U3uE uU[t|.5`.U & E& & f&ËDef Ë )̋E U<[`T)aw 6  w  e 1 w 0" , 0o4[F[KrJ[}N bb >z6a>Ds@[xQ@[@[`@ Kr4hɪJrhɪKrhɪK'hɪJ'h 4wh4 K0 Krl50  (r- DUt-E D  E E ܁^[xQ E U &W)& #  4 &9U3uE uU.5`.[b|U & E& & f&ËDef Ë )̋E U*[`ws Krb >j6a>D[`@ Kr4BɪKrhɪK'h 4lwh4K0 KrF5  5 2  UE   pE U 5@*& E& & f&ËDef Ë )̋U<[` b tz9axtD @[Kr@[}@[@[@o@[`@ Kr4ɪ3qhɪ2qhɪ#qhZɪ;rhɪJrhɪKrh 4Twh4P t t tK0 Kr1 5  :5:UW' % ,  E5  [}<[\[}L|   E5 E  W5  ,E 0[ EWX 52 / & 4 &9 &9U3uE uUw [|5   uE uU5`AU & E& & E& De&fr[`` $̋"5 & & & & De&fH ̋E U6[`T)aw 6  w  e 1 w 0" , 0o4[F[KrJ[}N .b tz9atDs@[@[`@ Kr4ɪ3qhɪ2qhɪJrhɪKrh 4Bwh4 K0 Kr5  454UW!     E5    E8[<|5 E  W5  ,E  [ EWO ,) &  4 &9U3uE uUw5  [|  00#k8sɪ3qhɪKrh 4wh4K0 KrB5  5U   E5@? & E& & E& De&f $̋"5 & & & & De&fH2[`r[`| ̋U Zb T z3ax}T D @[Kr@[}@[@[@o@[`@ Kr4ɪ;rhɪJrhɪKrhB 4wh4P t t tK0 Kr1 5  *5*UW  ,   E5 E  [}<[\[},| Wˇ5  ,E [ E U &W2/ , & 4 &9 &9U3uE uU[t|.5`.U & E& & f&ËDef Ë )̋E U<[`T)aw 6  w  e 1 w 0" , 0o4[F[KrJ[}N b T z3aT Ds@[@[`@ Kr4ɪJrhɪKrh 4wh4 K0 Kr5  $5$UW      E5 E  W8[|[|ч5  ,E   E U &W)& #  4 &9U3uE uU.5`.[b|U & E& & f&ËDef Ë )̋E U*[`ws Kjb T b3a~T D[`@ Kr4>ɪKrh 4pwh4K0 KrB5  5U   tE U *5@*& E& & f&ËDef Ë )̋U@[`b  mj& mDs@s@; @c&gr@o@  D"0Xhfy:h   D"w ^B C DBe ?D1 'UBe(e$2eo sHc&grRsP| 4%[]%<>  1 >ߋ J(; FsFb  Υj7qs ΥDs@ @xk@s@i@  D"0rChwh*  D" 8   *  4 6 B:B\:< f f  P  BeeD&& `Е- Е-el' tVw D  &Е. ce  Е:   B%  & G`ЕJЕAЕN W0iT:BnݪKЕFЕEЕBЕMЕAЕRЕAЕPЕRЕMЕAЕYЕJЕUЕNЕJЕUЕLЕAЕUЕGЕSЕEЕPЕOЕCЕ$lTЕNЕOЕVЕDЕEЕCb Xz.XD:`@:Z@:@ܲ#b B3DܲGd@ ke(03h ke( C &qFre @AE2cD! D2rܲGd|8 Hb J4fDܲ#@ܲGd@ ke(0"4fh ke(& & CC w ܲGd$ܲ#zb t0B t0D ke(0 @,hC,h ke(eb JF Dܲ#@ܲGd@ ke(0.F h ke(2> qqqQѕwܲGd0ܲ#b J;VNDܲ#@ܲGd@ ke(0F VNh ke( RRRwܲGdܲ#b rr +Dܲ#@ ke(0D+h!!hh2+h xQh}h$r +h ke(H97; uwy{D& fW#v&wFܲ#b Zbs;D ke(0V9phBYh@;(hv8h:h ke(Z L@W @@@ 8@ A Be   @  @ A@@K@P @b ByXDܲ`@ ke(0,h00#k8sL lܲ#ps |<   e$9΅b HJTHDܲ#@ܲGd@ ke(0 `Th ke($ & w ܲGd"ܲ#b XJXDs@ܲGd@ ke(0,Cph ke(0 & & &&&ܲGd,sb R%Dܲ#@ܲGd@C,@ ke(0%h ke("  w ܲGdC, ܲ#b z}Ds@N@N]@ܲ#@ܲGd@ X@NBx@N{8@N{@$9΅@C,@ ke(0}h ke(   *e  f w  NܲGdC,N X$NBxDN{PN]ZN{8^fhܲ#lsrs~$9΅ | e b XZ1yXDN@ݩ%@ ke(0XN]hN{8hN{h ke(\&&&f&f   ` % s*N.ݩ%b Oγb<zOγDs@c&G;@T;w@a@ ke(0Zg(0"ah Zg(&'W, Е0wc&G;sT;w$ab JDܲ#@ܲGd@ ke(0{h ke( _w ܲGdܲ#,b R` Ds@# z@$9@ ke(0s&   (w  *ܲGdC,$(*ܲ#.s4N8ݩ%b R[!}Dܲ#@ܲGd@C,@ ke(02[!}h ke(6  2 w ܲGdC,4ܲ#b  J֯L Dܲ#@ܲGd@ ke(0q!yh ke( ew ܲGdܲ#b J֯Dܲ#@ܲGd@ ke(0q!h ke( aw ܲGdܲ#2b  Q Q Q IwܲGd:ܲ#b W &=e e@ B  $ݪK6d;b ZD z@*@ \q@4u~@ ke(0<}h ke(@& %NBwA & fww z4u~2 \q>*b tjf]tDs@G> @$9s@GVN@:$@:4F@ Rhke(0 &)_& & &  & && && Ε 61& 1)ȋ& & & ,s.G> 2GVN6:$B$9sZG> nG> T|& & & & & & Ε 1 &  a@ G> GVN:4F6G>  b ZsD,0z@ܲ#@ܲGd@)%@ ke(0Zgh ke(^&  & e mw&f&fe  s&ܲGd,0z)%,ܲ#B,0zF)%b R q}Dܲ#@ܲGd@C,@ ke(02 q}h ke(6  2 w ܲGdC,4ܲ#b BձDܲGd@ ke(0pIqh ke(t   _(  ?f'& f' ?E@@ a B 0e  ܲGdb RձDs@ܲGd@ ke(04Kq hKq^h ke(8KM & & &&& ܲGd4sb BsrDܲGd@ ke(0.srh ke(2 e@AB ܲGdb Rr%Dܲ#@ܲGd@C,@ ke(0r%h ke(  w ܲGdC,ܲ#"b tJs@8tDܲ#@ܲGd@ ke(0s@8h ke(  eCBBaIBBJbCBB ɒɐBܲGd| & &  wܲ#b J#DܲGd@ܲ@w@ ke(0Yqh ke(  wܲGdܲ@wb XRUs%XDܲ#@ܲGd@ ke(0(cs}hUs%h ke(,Q &wܲGd*ܲ#b BձzDܲ`@ ke(0[qMh ke( /w ܲ`b zxDlOpH)H)H)H)xH)p H)%H[ H)` H)p H)5H ke(0b Z9wKDܲ#@E4d@ܲGd@C,@ ke(0(9wKh ke(,  wܲGdC, E4d*ܲ00#5TADATADATADATADATADATADATADATADATA# b Oγr!&}OγDܲ""@a@a@aP@ ke(0Zg(0:<8"h <R"h<$h Zg(>ͥwf=@a e/a2  aP2 a2 ܲ""b zrwDs@ܲ#@ܲGd@L @$9΅@w@C,@ ke(0rwhrwh ke( p`  2@  e *  w  *pܲGd"C,8w>L rܲ#vs&|/<   e$9΅b tJrwdtDܲ#@ܲGd@ ke(0drwdh ke(h e ICBBaI    B wܲGdfܲ#b XR u~XDܲ#@ܲGd@ ke(0&,u~hwu~h ke(* =w =w ܲGdܲ# ܲGd(ܲ# b XRx+XDܲ""@ܲ#@ܲGd@ ke(0vx+h ke(z W#0A %+B%&AB`B`D&  B~> ee Jb"b "╫w HܲGdpܲ#xܲ""b <0R X<0Dܲ#@ܲGd@ ke(0.whuwWh ke(2G &wܲGd0ܲ#b RyDܲ#@ܲGd@C,@ ke(0$yh ke((  wܲGdC,&ܲ#b  Ry Ds@ܲ#@ ke(0@Iqh0y}h ke(D B (W/ D  7 f& }w(sBܲ#b zAyDs@ܲ#@ܲGd@L @$9΅@w@C,@ ke(0AyhAyh ke(      2@  e 9ܲGd"C,zw|2       w   /<  L Vܲ#Zs|$9΅ eDb rSyD5!@5 @ @@@ ke(0 Xhݩ%hwh< ke( ,#b3!  b3!a & > >265 : FX |b Jy%Dܲ#@ܲGd@ ke(02y%h ke(6 @  EwܲGd4ܲ#b Xb #XDܲ#@ܲGd@ ke(0Zg(0y@h.yhX:` Zg( e2w 7 Nw&f&fCDEe  > ܲGd X:`0ܲ#:ܲGd>X:`BX:`HNPܲ# dX:`(|   cs X:` b J zDܲGd@ܲ@w@ ke(02sh ke(6 X eETETwܲGd4ܲ@wb J 4fDܲ#@ܲGd@ ke(0z4fh ke( -w ܲGdܲ#b Ry%Dܲ#@ܲGd@C,@ ke(0y%h ke(   w ܲGdC,ܲ#b Jy]Dܲ""@ܲ#@ ke(0Xy]h ke(\@$A E& & B ?E@  D Q w% Nܲ#Xܲ""b 00#k8sL zܲ#~s.| /<  e$$9΅^b 뀻jjM뀻Dܲ""@ܲ#@$99@ ke(0`h&`hy`h y`h ke(& @EA:% NP& @5A E& B _"E@  D Q 5E,|w+w E  ܲ#ܲ#$99(ܲ""b BxDܲ#@ ke(0 ÐHXh ke(& 1w ܲ#~b :*D ke(0*h ke()b Jܲ#Ds@ ke(0ܲ#hܲ#h ke(sb Jܲ`Dܲ#@ܲGd@ ke(0ܲ`h ke( &w ܲGdܲ#b Jܲ)dDܲ""@ ke(0Lܲ)dhܲGdh ke(PC & ` `Ba#   L Lܲ""b Bܲ@wDܲ#@ ke(0(ܲ@wh ke(,CC    &w*ܲ#Nb Oγ2KOγDȬ FHA vb <:ܲ""<D ke(0ܲ""h ke(& >b XzTy`XDNHQHHNBxH BxHQHN:dHBxHH N H  :\}h>Nt!h>t!hN\}h\}ht!h   >>> >|tl00#5TADATADATADATADATADATADATADATADATAd2b tb!tD)@4@@W@<&e@)p@ 4@h 8w &&E  AHW )p)p<&e)"4&<&e().)p2)p$b Xz!p:XD$9 @)Bx@)p@W@t<@ @)@)Ps@:@ @h Dw   . ʥ:W:t<) )Bx$ *)p<$9 >)Ps&b tz! &tD)@)_G@)Bx@$9~Z@)p@W@<&e@ @)%@)@)Ps@t @*)p@:@ 4h w    t72  -@ep@ D  e  ` & RW $9~Z")Ps.:4<&e6):t <)B)BxJ)pP)pT b:P|e     R#R-.)_G)% )Bx":0 6)pb B @~D  D"06ݪKhih  D":&  m  f A N  %Pb |TB=|TD@ Cx0=h Cx  ` *  !נ נ  נננ"D נaנz E ѐEp(p |נ$נ-נ0נ9נAנZנ_נ:  ^נ[ȕ]נ<ȕ>ȋ@ w נ%נ*נ$נ_נ-נ.נ0נ9נAנZ݃Ƞ נ0נ7נ*נ,A oȠm k  tנ"A   t &A fנ$נ%נ*נ0נ9נAנZנ_נ-נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (w>נ/* . .נ$נ-נ.נ0נ9PlנAנZ נ_ נ:  Dנ"  0b |SJ@=|SD@d@ Cx0@=h Cx E^`  UQ  UQ ËUI U `e |ccD    Ĕ%*.A U 0 0 W ,Uw@W /D : cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBtC5D  KR΋KBAE:D0CĊ \ eB  Dҁ CSĊ  WvdȀC E Cs Ε f)& 6 l(*  E 'W " =N  W :+W l= 1 #W ,W / %W %W *Հ W <W [W >W ] v(* 6 e b N@B:h;N@D  D"0@d;hm h  D"D&   `@ ` B   & A @    b ΚXb9}ΚXDi(Pi Zi di .tՕ: @e e0e0Uib XB%PsXDs@ K0 ""h K$'1sb Xz ]XD1o@ sJhab1vh 1ph1sh1uh 1wh1qh"1th1rhc0Z aX cXb $*J c c c c c c c$ c*c^   fwvAAU Xs ssss$s *s 0s@a VaZ1ob XB XD `E4dhEdhHʫh~h d% & ^UU U U UUUN a  b 0zܩu~0DݪM@ݪK@W@i@ab@ Zg`Zg(0ܩu~h:h::"h Zg`< Zg(w &fe&  w &ff=elC    5p  d  W"W`iri|  A &@d &@ &m M M` M`5u  @ @ e@ M`u 5`2ii$i0i:ݪKFݪKRݪKfݪKBW @ `u  #;eu o eA eS S S B CeS S S A eS , ab HZg`PݪM ^Zg`fݪMxݪM0tS S B ee Zg`ݪMb ΚXBתZΚXD Zg`0תZhabh$ Zg`4JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECb X:i XD Zg(06i h Zg(:&f!  E D  E E C B Ί Ab XzXDfH`fHH fHH p&H fHjzHxfHfHKH fH " 5H fH@ b NBi(ND@ Zg(0ni(h Zg(r AUUUU    T T T T ee(e(e(e(T $)T T TU U U U  ~b Xz#'XD)@:Z@)Ty@:@[Y@[Y@)@)Z@)W@)W@[<}@o@:Ա2&@[(}@)X@ Zg(0dh Zg(w EH  P A Е:%ʋ B   5Е" e pe 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)<)ZB:ZN[(}vb tX:#}tXD Zg(0yh Zg(&3b %  B  | 7 w 5&g:gVgdgrgzƀt  k i'5e d ^ [U5@ D( G uɥ;5<5  g($9!NgRRg^g-Ԩ  5@ u5 Fɥ@5ub , 5w E 5 @ gNg^g<zl @8jMABAe @&PPP@C&5A  88U&NK$9!\:shѲ:lT; zt$9!e  8 "@0 *_%`AB2:Ѳ::br Ѳ:4T; zL r$9!~$9!$d w@ 8glb o*)TyH)PR$9!T)P`<&9b)h:t nѲ:r)Ps|ep& f P aAAf@pnp C֋ 8Ë7AB`f VT:GѲ:@)pD)pH L)PsP)PX:^Ѳ:b)Pf)Psn)pr)pa`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a`$9pl$9!t Bw@ ŀajTI& af n`V @e,w jj4`&<&9<&Kq<&D ()<)PsD)Psnolj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY <=X@=l e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCe###3X`v)W3 & w  jDl@ TeT5l@ @ L:)P$$9!&)Ps,28o>)PN 8rX)W\)Pt`|sd e  & @ & V An5jP a@@` > ~ @ 8 ( X)W)'}s2' q4)8h'zs. ePa-eP BAnB X/   @   RՀaePÕwePP6 -0P -0Pd-0Ph$9p p-0Pz-0P\)K@>b XR4XDzs!s@ v4h U9qhdh(Zgh6 M@BCAf } f&  GRR@ 3   &$&~ Vs!s|& e% ~ԥ ~F` F` f&Pe e  @  veT  % % % %% % %@ABCD f @  f% % % % t '&f&f`%  > BBe   *uuuuFE@aaH~  r 6  < (  .   "    x  l l&f&D%% %% v  % %%l% Z %% %% D   % %%% " eTTTT@A% X@Ae BA 2`u u `u @A `u u `u p B` `ee% ; vu u d5 5 w6%%% %e;u u u  x ueM u u  ueM u  ueM ue eeeeeeeeeeeeuuuu%&D   5  5\  n eb NBݪMND@ Zg(0TݪMh Zg(X @    e  T T T T H1CdT T L $)dL t dL d  Fb X*ZKXD \b j\DDs@c&~@T;@o@  D"0DhDh\Dh  D"% w &Ba +- ʥ# . U 0   b c&~T;s$o*|  `     Jb QXR^QXDo@  D"0\h hdh  D"w  w & W+W- Ba. W#  B0  c  c S W %ec e`s oo<|  # 3  & ˥ Z ^C  b XZ7aXD@S@?S@o@ N.D,hD,h ۩"S Rw w &e``00#.5TADATADATADATADATADATADATADATADATA a  `e`P D 2o ?So@S ۩"S` ,۩"S :۩"S`b tXzR:tXD<&`@<&Kq@`@[8@)P@[Z@)W@)p@s@BDRFHJHLxNPhRTVX| &- ae  $e  & & & & && & & & &)4  ^b: R &E@ U U @ P J .1 6 (  2  4t  AW A t  %& & & & & & & & & & & & & & & & & & & & tT:t v:  V4  X@ :tP A V @ HI @ :E wAW HAfW l H @ eB   n wL B f  B \   %ww x ^f <D |  U w 6 H L P@ U w  eC "@d U w| t wh t  @44Vt   B B   4 4 H   (B r 4m -c  :  t \%ww H     C    wL J w< K w, B  T w  w x X@ ~wb z4a` D?H"ɪKr@X@""@w@év~@ 46L h Ch C\}h9`hj1ohBh 6xQh=Krh1Kh4}h?yh ~, , t t t 4  ~, ""  "wɪKr X év~ ,  b zBa8"D c[H [xQH[KrH[KH[}H[yH[L H [\}H[H [`H[oHzb t:ͫetD  ̅ ͫeh  ̅enb 0R 0DB,0zH*sH&5 H.sH([H, b :<h *:h&:h,:Bh:_h2  D"W l "  ߥ *  + 23E Ew    Е-   0@c&~$T;&sVW6|A W e`fÊ    E ib pBL@pDi@ Zg(0H[(}h Zg(L & & @( f  e ee e (i b RdXRDW@d;@:@ Zg(0^<h Zg(bw &BA'  '     Aw A& ,Wd;&d;4:L:P:\:b LX:DLXD Zg(0NKh Zg(az  .b  z` Ds@c&G;@W@T;w@:B@i@c&K@ Zg`$Zg(0a}h@ah~h$"@QhvahaPhB Zg`(JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC Zg(''w Del  ~= w D&el& dЕ- eaePPP"w DHc&KsT;wc&G;"s$T;w*WJWnh |WT|  &Е. ce  Е: Е- B&iL:B$b XzXRXD:`@:Z@:@'vv    V     " $ & (v( ,* 6,  4.  p0 |2 4 6 8 :B: < >  @ Zg(w && D¥%  B&ХVA C e!  aebE  Е%*WB5TADATADATADATADATADATADATADATADATA A   EA EЕ A A   Е.  AЕ; ,[(}aP$a0@QB[(}Z[(}p:Z b Oҳz2dOҳD@@:2@`@@ `^@)@)@'@)Ty@}@ @ @z:t @)p@$9@P@9x@<&e@@y@)W@)p@:@}@:@M@ 8r@=@b)'@@=@)Ps@' q@)p@:@hp!@ Zg`xZg(0Mh 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 'LBCH    .MAIN. Zg(n 7 $& Lwf@> 07 ԋ_  7 j hz Zg`Zg` Zg`Zg`@y `^ Zg`$$ `^&Zg`&4:t 6Zg`@ :Zg`>FZg`JZg`XZg`j7 E L4  w7 " 2 $  h jZg`Zg`Zg`$Zg`2Zg`   J!     rZg` Zg`H Zg` $Zg`(4Zg`8P )pD)pH}V)p \Zg`d)ptP|Pbp  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)pPhp! XZg` fZg`$n@ tZg` U N 1ȥ9C ʥ ʥ ҥ@w Vp @ Zg`P 8r Zg`"P&:DZg` rZg`V~=|L  \fdwȕ e 7 5j1-C 7 | Zg`Zg`fZg`d Zg`&@=4P8)W " @>    (zZg`Zg`Zg`Zg`Zg` Zg`(&Zg`DZg`J:LZg`@ PZg`>VZP `Zg`n` tZg`^( 4A Е.) ыѝѝɝwы@>4 t&R Zg`()Ps Zg`A: "Zg`)0M4M8MH:2JZg`@ NZg`>b tR$ep!tDs@tCyH c&|KH6T,HkxH!)pH ,R"H L HshH0{mH`qH za9H"-DH)XHaKH #{8H)jdH 7{ HT,KHc&G;HYc&RH'(ZH0{H(lH tyH(zH@z.8H,yH .Hc&H0{DHlSHc&KHKc&WH:#0H#0H4{*LH#0Hs,XH@#09H [t{8Hz3^sH)VHc&XHGc& XH?tBxH.yH (H)\}H-EH#{8HtsH3sH0{9H#0HtsHz.{H)ZH c&HM#z zH.yH #0LHc&dHAkH'-0H0{H0{Ht H#0DH0{Ht8Hzs`XHn]H #0vH# zH0{nHl!H #0MH c&jLH#""H#0H)VNHԒLqH4{MHԒ[qH-01Hz40wHn^HlyH(WH 3jHc&pH#0)H c&HL#04H c&pH#{mHT,HԒqH@CkzHc&XH7zԒ7!H c& H2uNEDH Nb NE2>uU(NED©#H Nb NE2>uTqNEDOH Nb NE2>uu'NEDH Nb NE2>u!tNEDuT[NEDH Nb NE2>uAyNEDȫ H Nb NE2>uIqNED H Nb NE2>uNEDjuNEDpŜH Nb NE2>u#NEDH Nb NE2>uN`NED(XH Nb NE2>uNEDJH Nb NE2>uzNEDi5uH Nb NE2>u%NEDt!H :b NEz3u^NED5 @@@ dhPhHh hHh Wh hRWh  h  @ &e6% 4% 4%04 f   w eF w 5 >RX5 fb N:7xsND5 @ $7sh (e6@a "H5 b  :,d D  D"0aZh  D" =p!Օ^Vb  ,bK VN ,Ds@s@o@f@  D"0aVNh;VNh  D"w BC "&0*7e "fSYqq1յ<pBՋ.p0po&s(|2* 0=E%0=w s&fb  ΥZ  ΥD @f@  D"0ziWhrwh`i h  D"~46f %8 E D/D!D l0l8epl0pɥ.ɕ wx |f b 4hrw4hDs@r"&@q:@w@i@o@f@  D"0`h  D"w *8I *=)98 eB &&  U **o"w8ihq:|e *Nlv ΋00#^5TADATADATADATADATADATADATADATADATA*.2  & #!)&ePe && >2i^s(e >E p* wq:"r"&&f b  %b& %D @q:@i@o@  D"0tch`rh  D"xw  )  fU %  BA `6p 4p`4 %60 4o $i6q:b  Zz Dq:@i@  D"0HeZhrShft:h   D"L   f >5>Eu    i:q:nb  : & D  D"0h  D" rb  lz, lDe&@py@r@r@pJ,@o@mo@s2 @f@  D"0d}h   D"w ) 8C 0* ) *w*   ep &o pJ, rNfbpyre&|p  |އȥ#= EW9ť^*0 ` Ca C  =  F ȥ 0*ȥ = Eե^ Aȥ e@  = Ep2!)8etE`l0  0 0/ &l0 `p l064p 4 p  , JNs2 x *` C#   D @)  6?0D)r:mo^b  lz,hy lDe&@r@pK,@o@mo@sk@s2 @f@  D"0\ h  D"w ) 8C * ) *w*  ep p  | o pK, rNf^e&|ȥ#= EW9ť^*0 ` Ca C  =  R ȥ 0*ȥ = Eե^ Aȥ e@  = Ep2!)8eE`l0  0t 0/ &l0 `p l064p 4 p  8 V *`:s2 p)w C#   D @)  6?0D)skr2mob  =Z:dw =Ds.@D@o@  D"0pwh wh  D"w *  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w UojD|\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` *weC5U5  5 54s.t@e*=U Ee& REe  ӥ" wV ˥"   ˥" (Ք     Օ b  zafZ Db@e&@e&@c@r@i @c2 @w@aK@  D"0pZh   D"=D `p46 f 64/=  @) 0  8w 46 ,i $e&0wNchblc2 zaK$|8 e*w re&b  Ӎz\g ӍD @e&@py@r@r@w@w@pJ,@o@mo@i@aZ@2r,}@f@  D"02}h  D"w n832cd& & & B  2OΕ   N Υ$Ε  2o pJ,|2Υ   v Ε f 00#f#k8swTr,}` pf *0,   ) )% ȥ  = ȥ l 0l  pyr0e&> t ȥ ,ȥ- ȥe&=Ba@a e0b eȥe@ aZXi_ X= E8 el0  & 0 l0`p l064p 4 ep l)wbȥ%  ,  N w0  J B # f &,aZ:aZHr,}Pw\rvmoN `* w)0406 l0  $fb  Ӎz\ghy ӍD @e&@r@w@w@pK,@o@mo@i@sk@aZ@r,}@*f@  D"0 h  D"w n832cd& & & B  2OΕ   N Υ$Ε  2o pK,|2Υ   v Ε f e * e*w@)0, mo>wTr,}` pf   ) )% ȥ  = ȥ l 0l  ȥ (re&& jaZtȥ- ȥe&=Ba@a e0b eȥe@ ] V=@i E8 el0  & 0 l0`p l064p 4 ep )wzlȥ%  ,  wL  JwB # f  `* &aZ"aZ,r,}4w@skZmo2w)0406 l0  fDb  z7q Db@wt@rk@wL @iW@rw@bG@s2 @  D"0\rhrh   D"`e6p 4 8 81416   2s2 "b*iW@bGDrkNwL Vwt\rwb  :\q D  D"0r,}h  D"> =00l&8el2 0 |*b  Js"& Ds@@  D"0Nr"&h  D"R82e& 0 0 0 80 B0 0 0 0)#0.s"b  (ZtL (Dxk@q:@i@  D"00rkhwkh  D"4 U8UMw wi&q:2xk~b  R$t_ Dw@aK@s2 @  D"0rh  D"&4&6= 64 wz%!64=5 2 6  l0 & Z46 s2 Fs2 `|64 :)0406 0 *0e6p 4 = aKPwb  Jw Dw@f@  D"0BwL h  D"F B 00fep=& /e`pwwDfb 4Ψz4ΨDb@wt@rw@bG@wk@a[M@f@  D"0whwh  D" ..8em,0l0!D0e6p 4.) &f   bG`a[Mlwkprw|wt8|e) .  e6p 4 08*w,b6fb  Rd DbG@w@aZ@  D"0Pwh  D"T)"(. =00#n5TADATADATADATADATADATADATADATADATA . B  E (.bGFaZJwb AWJdvAWD&s@s@  D"0p &h  D"eff NeP   #llD eJ Ԕ %:ԕ: sJst|f"& f&f& & Ε lle  lsb 4j:dvw4Ds@s@o@aVN@\D@  D"0pvwh vwh  D"w *D ]Xfe<5"ӕ_ S :ӕ: & "& Εo0s|4' *'**UqqC ӥ:  Ce   * sssX\DpaVN|b  z:dw D&p &@s@[;@piw@pvw@pw@s@o@d;@aVN@  D"0>"}sh p# h*s}h  D"eB  8 $&w *5<w1  U U@  f&" &aVN&o0sV[;jpw|p &|-'Q'**%*$ (%0 *&* *5ND   sss8d;TaVNJ <  EU   aVN:pvw@piwFpwb  ej &( eDs@  D"0yyph &hByy y y((  BBFF y rb >ƭB(>ƭD  D"0yuh yHb  -Z0!# -Ds@s@;VN@  D"0eMheMh   D" e(&&& e"4 &fff& & "eW!  eW!eW sLs(|  p*ŋ;VNvb  mj&`; mDs@s@; @c&gr@o@  D"0Xhfy:h   D"w SB C DBe ?D1 'UBe(e$2eo sHc&grRs:| 4%[]%<>  1 >(; b 4-R,l4-DeM@g}@o@  D"0,lh  D"w  wo eMg}b 4-R,z4-DeM@g}@o@  D"0,zh  D"w wo eMg}tb  Ze Ds@q:@i@f@  D"0cIqh  D"W=f& e %&&eH =&e0  U   E >  sXiH|>E5E=uf p  w s2q:Ffb \=zE`W\=Db@mlE@eZ@s@r"&@r@q:@i@o@d?!@rS@r,}@ZaVN@f@@ft:@fy:@cIq@s}@  D"0hp!h  D"w  D 8"!#($ĥ ĥ w 0 o sfy:|*0 @Q$    0 40 60)) *<##   w:# w(&* 0s}VaVNpft:=ȥwz `p!2 EW!p0p252e <'##XsnstUfE @#U 00#vk8s  # #D  q:"rS*mlE.r"&:i#=0/H#@&0 # = e0   0@e 6=fq:\#02/002# @#?@#040 6w/!0/ l0/!p!0Rf  .=p0p2*b \=zE`PZ\=Db@mlE@eZ@s@r"&@r@q:@i@o@d?!@rS@r,}@baVN@f@@ft:@fy:@cIq@s}@  D"0^Whh!h  D"w & w  D  8"!#($ĥ ĥ woos fy:|. 0 *0 @Q$    0 40 60))  eB *<##   w@s}LaVNraVN:# w(&* =ȥwz `p!2 EW!p0p252e ft:tst<'##UfE @#U   P3)/ #( P)sPcIqhcIq @#**fff  &*wp. tB58e$8w2A& eZ,d?!  #&i$q:>rSFmlEJr"&Vi #D #=0/H#@&0 # = e0   \ 0@e 6=#02/002# @#?@#040 6w/!q:nf<0/ l0/!p!0 .=p0p2b \=zF`8\=Db@s@r"&@r@q:@i@o@r,}@aVN@f@@fy:@"  D"0h&h  D"w  D 8"!#($ĥ ĥ w 0 o sfy:|*0 @Q$    0 40 60))eB &*   wX . VB58e$8w6aVNrs2A&e 4p8q  (#4=A#@)( *O*)sfr돀t@#0l @# 02ȕ8 00ĥ݇AĥĊ  ȕ000 >b0 @0 &*0 @ & & e * eBe>  # # r,}"i6q:>r"&JilD #=0/H#@&0 # = e0   0@vq:e 6=#02/002# @#?@#040 6w/!0/ lb00#~$TADATADATADATADATADATADATADATADATAf0d0/!p!0 .=p0p2b \=zF`W\=Db@mlE@eZ@s@r"&@r@q:@i@o@d?!@rS@r,}@RaVN@f@@ft:@fy:@cIq@  D"0h'h  D"w  D 8"!#($ĥ ĥ w 0 o sfy:|*0 @Q$    0 40 60))eB   w:# w(&* =ȥwz `p!6aVNPft:2 EW!p0p252e <'##UfE 8sNst@#U   P3)/ #( P) @#**fff   cIq,cIqFeZld?!|eZ&*wp. tB58e$8w2A&e 4p8q  (#4=$sBsJlA#@)( *O*)@#0l @# 02ȕ8 00ĥrlb݇AĥĊ  ȕ000 0 @0 &*0 @ & & e# eB&B 2r,}Pidq:~rSdB * eBe>  # #D #=0/H# mlEr"&i@&0 # = e0   0@e 6=#02/002Fq:|\# @#?@#040 6w/!0/ l0/!p!0 .=p0p22fb >j=>D&p &@s@@s@$9pw@@=@ Cx0.=h Cx eeȵe ~ o DEP%5 eȵPe< &e  %$&*@=Fsrp &z$9pw|s|@A 55@558 eBeeeȵee&e :e4   QB4b >j=>D&p &@s@@s@$9pw@@=@ Cx0.=h Cx eeȵe ~ o DEP%5 eȵPe< &e<0b  &gZsxVWxLJFLgrF3x4fyF yF VNz~r +z  (F . %F 2&F (F PdF (F F :F /KF F WF `F XF iF tF qF |F ( ,F 8F 8F VN S i^F v^F w y \}  . 5 q e^F F F xsF p F(FTFF,{`T}PtF0 0}|0|Cp}z _MfM%}+z }~`)W)W))X)X)Z)Z, ,!,R",(,CM,N,S,y,\}-D-E....22.2p2222ً3^s3s<8"L<R"L<$L:K0_M*fM*{y2+z d6&Fd&Fd(Fl(lCMlNlSl\}tp!!z '!%6!}6[!}4q!q!y+"Y +"+"z+"6+"K"+"'+"(+"Y00$k8s,Q,:d,Oq,u~,J,6-x6-x6-x6-x6-zx6-'x6-+x6-fx6-Klx6-Vqx6-x6-jx6-x6-ąx6-Kx- .Q{n#0#0#0#0#09#0D#0L#0M#0v#0#0)#04#0#0#0T#0U#0#0#0x#08#08#08#08#08#08#08#08#0:#0k;#0;#0;$0!$0R"$0($0S$0s,0,0,0σ,02,05,0q,0-0-0100p00q00s00s00s20,20,20,-20.20.40840840840840940Q:40W:40;;40:<40w40uw40w40w40x40x40Cy40Ny40Ry40y40y40y40y401z40wQ:KwQ:iwQ:owQ:wQ:wQ:xQ:xQ:xQ:ByQ:FyQ:WyQ:yQ:yQ:yQ:yQ:azQ:zQ:}Q:Q:Q:Q:Q:+Q:|Q:AQ:iQ:yQ:Q:Q:$Q:CQ:dQ:hQ:Q:Q:Q:Q:Q:ۑQ:Q:BQ:DQ:Q:Q:2Q:Q:1Q:;KQ;@jQ;vQ;wQ;LQ;Q@;({T;QT;8QT;QT;QT;QT;QT;7QT;!QT;;"QT;I"QT;`QT;dQT;4fQT;$qQT;sQT;wQT;DyQT; zQT;zQT;*}QT;QT;QT;3QT;QT;QlK[MlK_MKNfN{Q?{0Q?{pQ?{Q?{Q?{pQ?{NQ?{@Q@{0Q@{NQ@{NQA{0QA{QA{QB{NQC{QD{0QE{QE{QG{Q}Q}Q}Q}4Q}yQ}Q} Q}H Q} Q} Q}KQ}kQ}Q}>Q}Q}Q}Q}Q}Q}Q}Q}Q}Q}!Q}I"Q}8&Q}](Q}(Q}2Q}2Q}T3Q}3Q}5Q}8Q}O:Q}:Q}:Q}D;Q}KQ}KQ}MQ}vNQ}xQQ}QQ}RQ}WQ}KXQ}:YQ}`YQ}ZQ}ZQ}`Q}:dQ}fQ}fQ}(gQ}iQ}jQ}pQ}UqQ}qQ}sQ}HwQ}JwQ}wQ}wQ}xQ}xQ}xQ}xQ}yQ}yQ}zQ}8}Q}V}Q}]}Q}c}Q}~Q}Q}Q}Q}0Q}փQ}׃Q}؃Q}كQ}ڃQ}ۃQ}܃Q}݃Q}ރQ}߃Q}|Q},Q}Q}Q}Q}@0 ~L Q ~ Q ~GQ ~I"Q ~YQ ~pQ ~ qQ ~)qQ ~[qQ ~brQ ~urQ ~rQ ~rQ ~sQ ~sQ ~sQ ~sQ ~zQ ~Q ~5Q ~Q ~Q ~$Q ~:Q ~Q ~ۑQ ~{Q ~^Q_MNfMNa |Qa |QbSQd}Qk |Ql8 Ql Ql Ql Ql Ql+ QlQl!lR"l(lCMlNlSlQ\QllQllQllQlslslyl\}lQlQlQlQlQlQlQsQuVYQuyQuyQuyQuyQuyQvӁQvQvQvQvQvQvQvQvQvQvQvQvQ6L   `qw7xAyNyyyCCCCC,CQCSC\XC|ZC fCfCUqCrCsCxCkzkkkk'kgKkKkMkTkfkfkrkx'%}z Ld.SSvS|@ppW wQ BxQ |Qijj`j`jj j8Tjō,jōwjȍ8 jȍjȍ`jʍ8TjˍsjˍHj}p~0``ÐHXXԒԒԒԒ7!Ԓ#ԒxQԒWԒWԒqԒLqԒ[qԒVsԒ;xԒԒ}ԒԒR:.. .8.K. L.^.q.Bx.y.y4w#Q#֯Q#Q#Q-Q-'Q-(Q-?Q-Q-[Q-Q5|Q5Q5Q5^Q5fQ5ٱQ5$Q55Q5QQɪK'gɪ#qhɪ2qjɪ3qlJɪ;rlɪJrnJɪKroתZJݪKTݪM"(X,0z.D,GKRPU9q O8T&H{f!"(#&u'pU(p,v:T[pE`:d\g8IqTqpUqVqV!tw`6xAypą" ..H.W.D,<W"ȫ pʫh~^ͫe@Q@4. 5 5!,j< t!Ȭ F;P2;VN&`=@=J=X`rD\K4'6֯}Cd*e474}4vdx7 XCXj@9\p=dpVsu v9B \q8 Pw8 x8 z8 8?S@SAS} ,l,z64u~ 8r= &VlE:1KL1oL1p^1q^1r^1s^1t^1u^1v^1w^4}L6L L6xQL9`L=KrL?yL?LBLC\}LCL\D\\^WPhp!h!Ph&h'}s:2T/KTJTPT:=y?; ?Dv@ :iw< vww:}TT} rԱ2&BԱ&BԱ(BձAձSCձWA^ֱfaBoC 4v0 T0# T0T2XC4D`;E2&B&B(BfaBe;E$*Ѳ:F&ܲ""Hܲ#Zܲ#Zܲ`ܲ)dܲGdܲ@wXaK3a[M3aVN&b2bG3c2 6cIqcd?!4d)&< d;5@d\e&6e&6eMeMeZe$3e?3f4vft:fy:jg8g<8gggg8gg,gC8gR8g8gg8g8g}9iF8l8mlE:mo:dp# ph;p &pJ,<pK,=pZhpiw< pvwpw:ppy?py?py?q:Drk r@r"&  rSr,} :r 6r 6rC@lr s2s2 6s.2sk=s}wDwDwtEwL wk w@lwwwxkF8xkF800$k8s &yL` &zM & &KJ!&}L&`;j&p6u'x9\'d(#=d((9B( (xQ_&,,,h9,l,z6,Oq,hy- T.@J2d4:;sYM\RK:SKq:dT:ZK^\E`WE`PZPF`8F`WN`@J|3ax}l3a~o3anJ4a` L6ad6ag6af>6a8`6a8d,6a8b7a9axh9alJ9ajBa8"5d:dh;:dl;:diw< :dvw:dw:dw:dvep<ev=$ep!eDfT=afZhkf`;>kfKq?f; ?Dfv@ f]P\g\ghy rkzQ q} q_MP2qW@7q 67qq@l7qsqIqAVqMA^\q :srr%,s@84sUs%s"&  tL tyB$t_ 3ukMT3u^.3u_3uIqH4u%!4u;;f4uH;5uZ5up(5u%6u" p6ut:7u`"9uX>uD>uz>uZ>u#>uu'>uU(>uT[">uN`>uIq>uTq8>u!t>uAyp>u>u >u%?ud@u# @u`8BuW!Buq!VBu"BuCuz`DusEudGu"v vqvXuCvP"9wKrwXrwdw7xshx+yRAyNy wvSyTy`y%y%y]Tyd4y@_MNC4KqC!! &.!p: Ld `}j`(},S|@ph~DHEYEw }E$d (_F8aF&K9},Q,:d,JvL u~,\M\DpsձձձzT#x Xy zP # 4f  u~0# TT,jMxX*ܲ""Hܲ#Zܲ`ܲ)dܲ@wXbs;{q:00$TADATADATADATADATADATADATADATADATAb  =J; f =Do@\D@  D"0h;Ph  D"lw  %ҥ[֥< , (e  5 s  D woj\Db  B; v D  D"0s.hsh  D"&fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@|b  :" Kq D  D"02bh  D"6141612epl2l0pxb  :J+ D  D"0bGh  D"8e2 ~b  jy[M Dq:@i@o@  D"0e$h<e?hhaKh(a[Mh  D"0,0, f 톇,, w      .% eB 00$k8sw * 8B pB  0 B o`$s}2d?!:fNb 42l'4D  D"0Nb 42n X4D  D"0b 4ӭJz'4ӭDs.@ft:@  D"0d;h  D"Jĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ z ds.| DEe    *1  ˕03 "   ˔Ӕ ʥ7ft: b  ZW D`@o@d?!@aVN@  D"04'h  D"8w *eB 8  oaVN"`0d?!b  R!  D  D"0le&he&hc2 h\s2 h.  D"p *) l0, *) $ )*)0,40,6 b  -Z#t! -De?@o@ft:@s}@  D"0H4h  D"Lw *f f ! fP ŀ)Bos}ft::e?b  mz &@ mD@`@:@}s@ձS@}@@@e;@h&@ձ@h'@ X@zձW@X@e@,l@,z@}@4@ 8r@֯}@'@ƭJ(>ƭD  D"0yuh vh yb 4R,h4Dph@d;@aVN@  D"0|g}h  D"* 5)%Eefffff f% EDD%][%><  1 aVNXd;^phb  JRK Dq:@i@  D"0mlEh  D" Mwiq:b  :SKq D  D"0&moh  D"*  DP5R RRR b  RT DmlE@o@aVN@  D"0*lEh  D".w *eB 8  oaVN*mlE b 4mJ:dh4mDs@d;@  D"0phh  D"e( 1  `((   >: 5s<w  w1  %,,:4  d;phb  ΥBep ΥD @  D"08pJ,h  D"< 8   **$ vb >ƭZ(#>ƭD  D"0yyphyyb  ΥJev ΥD @  D"00pK,hskh&  D"4 8  ** b  ΥjDfT ΥD @pZ@o@r,}@f@  D"0D 8rh.:h  D"Hw ) * w46l0 o pZ,r,}0fb  ΥZkf`; ΥD @d;@m @  D"0p  D"Z8Ae f"( UCɗ+e$&% 8sDsb  Ra Dq:@i@o@  D"0Ѳ:h  D""w *D  woi q:b  z &, D)HN<&`H)H>[XH)^H<&%H WWH&CyH\)KH<&H(yH)nEHz)sEH<&KqHTH )EH( HL[;H&{PH`[8HHWH&{Hd6&H%kfH%ZH@d&Hz|'H qH'ąH |H)H#)H4)H%H PdH :H )_GH)LgrH)HWH)TyH$z'IRH&{ZHWzH@'H)H0)GH%wH@%xH [#H%CH )2HH4) H,)BxH) H-<&%tHz<&9H `H$)[MH &H %HB)pH<&pH<&pHWwH (H 2&H(d(HWwH i^H` v^HZzt!H)w H.)H)PH8)KqH,{hH4'HF xsH[YHtw(@w BwDwFwHw&-H 6lF8sb 4=J@4=D X@K@  D"0'h  D" 8eB   XKPb vz &yvD  :(}h:`hh4fahxGP}h\h@Ѳ:hX:Zh:h}h @hPz=B@=F\JN:R 8rV@Z`;^Ѳ:X^wwwwwwwwwwwwwwwwwwwwwԱ2&Ա& Ա(ֱfa2&&( fa$y(?T,GP}0wBvF;VNJ,lN,zR4V֯}Z X^ձS&^wwwwwwww82XlE K'ձW:s{H$9KH}xH$9;H%{!H:GH H}D;H:qH:H:qH,wfH:"qH:&qH:&H:$qH:.qH:(qH$9YH}H&$9 Hz$9YH:WHP:a H$9YH,w{H ~sH:TqH:RH$9H}HU$9ZZH:H :H:t H:qHz:H8:H$9CfH$9DfH ~H:H:H ~sH$9Z&H$9bH$9`&H ~H$9kH$9{H<Hz$9~ZH,wH:q!H $9ZH$9ZH}`H`:-HA{0H $9ZH:x HvH;LH}4H ~sH:Hz:H wvH:!H:-H:}H`}Hj$9[H$9'H$93H$9[H$9H$9H,wWH*KH:Hz$91H$93gH:H:-H ~$H@:H5^HlH5fH :#"HuVYH}yHR}H;E{H?{pHz$9rH$9&H}Hi:brH:crH$9fHt*bH@:krH $9H:vrH@t*H5ٱH w+H:rH}pHzk |H:rH :rH :rH:rH0:2H:rH8:rH} HD$9BH5$HlH55H}8}H%$9g'Hz$9n'H<_Ht*zH$9sH$9H$9H?{pH ~:H:[KHkZH}qHV?{Ht*GH$9'H$9Hz$9H$9H$9 H}V}H9}H H>:sH :sHx}]}HA}UqH6: sH:#H:sH }c}H@*@wH5QHzw:dH:KH?{@H:KH$9H}H:} HS:3H@:{3H:|sH }H<:sH`:sH*wH }H=z:sH:sH:sH:sH0:sH ~HT;8H:sH:KHlH $9CH:KHH}!H :H$9VHz$9XH ~ۑH:sHP$9|H:4H:tHT;wH$9.H:-tH`:,dH:1H}|H :74HwHwH-[H}`YH z:vH$9H$9H:n'Hl+ H#$98H$9H:owHvӁH:H}HT:wHP:H:wHt*H z}ZHz6a8>D @[xQ@[Kr@[}@[@[@o@[`@ Kr4ɪ2qhɪ3qhzɪ#qhɪ;rhɪJrhɪ3&hɪKrhɪ#&hɪ2&hɪ;'hɪK'hɪJ'h 4Twh4P t t tK0 Kr5R  J1 r- ;Dt-E U+UD, q   E "[}^[}d[}~[xQ4|5   D E E5$[xQ EWX 52 / & 4 &9 &9U3uE uUw [|5   uE uU5`AU & E& & E& De&fr[`` $̋"5 & & & & De&fH ̋E U6[`T)aw 6  w  e 1 w 0" , 0o4[F[KrJ[}N 8b >z6a8>Ds@[xQ@[@[`@ Kr4ɪ2qhɪ3qhɪJrhɪ3&hɪKrhɪ2&h:ɪK'hɪJ'h 4Bwh4 K0 Kr5G  ?r- 2Dt-E U"UD   E 5   D h[xQ|E E5[xQ EWO ,) &  4 &9U3uE uUw5  [|  uE uU5`AU & E& & E& De&f $̋"5`[`N & & & & De&fH ̋E U$[`00$k8sz6a8>D[`@ Kr4Fɪ3qhɪ3&hɪKrhɪK'h 4wh4K0 KrJ5 5 5 2  UE5  E5@? & E& & E& De&f $̋"5 & & & & De&fH2[`r[`| ̋U Tb >z6a>D @[xQ@[Kr@[}@[@[@o@[`@ Kr4~ɪ;rhɪJrhbɪKrhɪ;'hɪK'hɪJ'h 4wh4P t t tK0 Kr5;  31 r- $DUt-E D, q  E E Ӂ"[}Z[}`[}t[xQ|  E U &W2/ , & 4 &9 &9U3uE uU[t|.5`.U & E& & f&ËDef Ë )̋E U<[`T)aw 6  w  e 1 w 0" , 0o4[F[KrJ[}N bb >z6a>Ds@[xQ@[@[`@ Kr4hɪJrhɪKrhɪK'hɪJ'h 4wh4 K0 Krl50  (r- DUt-E D  E E ܁^[xQ E U &W)& #  4 &9U3uE uU.5`.[b|U & E& & f&ËDef Ë )̋E U*[`ws Krb >j6a>D[`@ Kr4BɪKrhɪK'h 4lwh4K0 KrF5  5 2  UE   pE U 5@*& E& & f&ËDef Ë )̋U<[` b tz9axtD @[Kr@[}@[@[@o@[`@ Kr4ɪ3qhɪ2qhɪ#qhZɪ;rhɪJrhɪKrh 4Twh4P t t tK0 Kr1 5  :5:UW' % ,  E5  [}<[\[}L|   E5 E  W5  ,E 0[ EWX 52 / & 4 &9 &9U3uE uUw [|5   uE uU5`AU & E& & E& De&fr[`` $̋"5 & & & & De&fH ̋E U6[`T)aw 6  w  e 1 w 0" , 0o4[F[KrJ[}N .b tz9atDs@[@[`@ Kr4ɪ3qhɪ2qhɪJrhɪKrh 4Bwh4 K0 Kr5  454UW!     E5    E8[<|5 E  W5  ,E  [ EWO ,) &  4 &9U3uE uUw5  [|  uE uU5`AU & E& & E& De&f $̋"5`[`N & & & & De&fH ̋00$TADATADATADATADATADATADATADATADATAE U$[`ws Kb tj9atD[`@ Kr4>ɪ3qhɪKrh 4wh4K0 KrB5  5U   E5@? & E& & E& De&f $̋"5 & & & & De&fH2[`r[`| ̋U Zb T z3ax}T D @[Kr@[}@[@[@o@[`@ Kr4ɪ;rhɪJrhɪKrhB 4wh4P t t tK0 Kr1 5  *5*UW  ,   E5 E  [}<[\[},| Wˇ5  ,E [ E U &W2/ , & 4 &9 &9U3uE uU[t|.5`.U & E& & f&ËDef Ë )̋E U<[`T)aw 6  w  e 1 w 0" , 0o4[F[KrJ[}N b T z3aT Ds@[@[`@ Kr4ɪJrhɪKrh 4wh4 K0 Kr5  $5$UW      E5 E  W8[|[|ч5  ,E   E U &W)& #  4 &9U3uE uU.5`.[b|U & E& & f&ËDef Ë )̋E U*[`ws Kjb T b3a~T D[`@ Kr4>ɪKrh 4pwh4K0 KrB5  5U   tE U *5@*& E& & f&ËDef Ë )̋U@[`b  mj& mDs@s@; @c&gr@o@  D"0Xhfy:h   D"w ^B C DBe ?D1 'UBe(e$2eo sHc&grRsP| 4%[]%<>  1 >ߋ J(; FsFb  Υj7qs ΥDs@ @xk@s@i@  D"0rChwh*  D" 8   *  4 6 B:B\:< f f  P  BeeD&& `Е- Е-el' tVw D  &Е. ce  Е:   B%  & G`ЕJЕAЕN W0iT:BnݪKЕFЕEЕBЕMЕAЕRЕAЕPЕRЕMЕAЕYЕJЕUЕNЕJЕUЕLЕAЕUЕGЕSЕEЕPЕOЕCЕ$lTЕNЕOЕVЕDЕEЕCb Xz.XD:`@:Z@:@ܲ#b B3DܲGd@ ke(03h ke( C &qFre @AE2cD! D2rܲGd|8 Hb J4fDܲ#@ܲGd@ ke(0"4fh ke(& & CC w ܲGd$ܲ#zb t0B t0D ke(0 @,hC,h ke(eb JF Dܲ#@ܲGd@ ke(0.F h ke(2> qqqQѕwܲGd0ܲ#b J;VNDܲ#@ܲGd@ ke(0F VNh ke( RRRwܲGdܲ#b rr +Dܲ#@ ke(0D+h!!hh2+h xQh}h$r +h ke(H97; uwy{D& fW#v&wFܲ#b Zbs;D ke(0V9phBYh@;(hv8h:h ke(Z L@W @@@ 8@ A Be   @  @ A@@K@P @b ByXDܲ`@ ke(0,h ke( w ܲ`fb ~Z~Dܲ#@ܲGd@ ke(0.Qh,1hHwh ke(` e00$TADATADATADATADATADATADATADATADATA BBCC w qqq0 fqC Q IܲGd4ܲ#VܲGd4|w C Q Qqwܲ#ܲGd2ܲ#|b z}Ds@ܲ#@ܲGd@L @$9΅@w@C,@ ke(00h}h ke( j  2@  e ' w  /*jܲGd"C,8w>L lܲ#ps |<   e$9΅b HJTHDܲ#@ܲGd@ ke(0 `Th ke($ & w ܲGd"ܲ#b XJXDs@ܲGd@ ke(0,Cph ke(0 & & &&&ܲGd,sb R%Dܲ#@ܲGd@C,@ ke(0%h ke("  w ܲGdC, ܲ#b z}Ds@N@N]@ܲ#@ܲGd@ X@NBx@N{8@N{@$9΅@C,@ ke(0}h ke(   *e  f w  NܲGdC,N X$NBxDN{PN]ZN{8^fhܲ#lsrs~$9΅ | e b XZ1yXDN@ݩ%@ ke(0XN]hN{8hN{h ke(\&&&f&f   ` % s*N.ݩ%b Oγb<zOγDs@c&G;@T;w@a@ ke(0Zg(0"ah Zg(&'W, Е0wc&G;sT;w$ab JDܲ#@ܲGd@ ke(0{h ke( _w ܲGdܲ#,b R` Ds@# z@$9@ ke(0s&   (w  *ܲGdC,$(*ܲ#.s4N8ݩ%b R[!}Dܲ#@ܲGd@C,@ ke(02[!}h ke(6  2 w ܲGdC,4ܲ#b  J֯L Dܲ#@ܲGd@ ke(0q!yh ke( ew ܲGdܲ#b J֯Dܲ#@ܲGd@ ke(0q!h ke( aw ܲGdܲ#2b  Q Q Q IwܲGd:ܲ#b W &=e e@ B  $ݪK6d;b ZD z@*@ \q@4u~@ ke(0<}h ke(@& %NBwA & fww z4u~2 \q>*b tjf]tDs@G> @$9s@GVN@:$@:4F@ Rhke(0 &)_& & &  & && && Ε 61& 1)ȋ& & & ,s.G> 2GVN6:$B$9sZG> nG> T|& & & & & & Ε 1 &  a@ G> GVN:4F6G>  b ZsD,0z@ܲ#@ܲGd@)%@ ke(0Zgh ke(^&  & e mw&f&fe  s&ܲGd,0z)%,ܲ#B,0zF)%b R q}Dܲ#@ܲGd@C,@ ke(02 q}h ke(6  2 w ܲGdC,4ܲ#b BձDܲGd@ ke(0pIqh ke(t   _(  ?f'& f' ?E@@ a B 0e  ܲGdb RձDs@ܲGd@ ke(04Kq hKq^h ke(8KM & & &&& ܲGd4sb BsrDܲGd@ ke(0.srh ke(2 e@AB ܲGdb Rr%Dܲ#@ܲGd@C,@ ke(0r%h ke(  w ܲGdC,ܲ#"b tJs@8tDܲ#@ܲGd@ ke(0s@8h ke(  eCBBaIBBJbCBB ɒɐBܲGd| & &  wܲ#b J#DܲGd@ܲ@w@ ke(0Yqh ke(  wܲGdܲ@wb XRUs%XDܲ#@ܲGd@ ke(0(cs}hUs%h ke(,Q &wܲGd*ܲ#b BձzDܲ`@ ke(0[qMh ke( /w ܲ`b zxDlOpH)H)H)H)xH)p H)%H[ H)` H)p H)5H ke(0b Z9wKDܲ#@E4d@ܲGd@C,@ ke(0(9wKh ke(,  wܲGdC, E4d*ܲ# b Oγr!&}OγDܲ""@a@a@aP@ ke(0Zg(0:<8"h <R"h<$h Zg(>ͥw00$k8sL rܲ#vs&|/<   e$9΅b tJrwdtDܲ#@ܲGd@ ke(0drwdh ke(h e ICBBaI    B wܲGdfܲ#b XR u~XDܲ#@ܲGd@ ke(0&,u~hwu~h ke(* =w =w ܲGdܲ# ܲGd(ܲ# b XRx+XDܲ""@ܲ#@ܲGd@ ke(0vx+h ke(z W#0A %+B%&AB`B`D&  B~> ee Jb"b "╫w HܲGdpܲ#xܲ""b <0R X<0Dܲ#@ܲGd@ ke(0.whuwWh ke(2G &wܲGd0ܲ#b RyDܲ#@ܲGd@C,@ ke(0$yh ke((  wܲGdC,&ܲ#b  Ry Ds@ܲ#@ ke(0@Iqh0y}h ke(D B (W/ D  7 f& }w(sBܲ#b zAyDs@ܲ#@ܲGd@L @$9΅@w@C,@ ke(0AyhAyh ke(      2@  e 9ܲGd"C,zw|2       w   /<  L Vܲ#Zs|$9΅ eDb rSyD5!@5 @ @@@ ke(0 Xhݩ%hwh< ke( ,#b3!  b3!a & > >265 : FX |b Jy%Dܲ#@ܲGd@ ke(02y%h ke(6 @  EwܲGd4ܲ#b Xb #XDܲ#@ܲGd@ ke(0Zg(0y@h.yhX:` Zg( e2w 7 Nw&f&fCDEe  > ܲGd X:`0ܲ#:ܲGd>X:`BX:`HNPܲ# dX:`(|   cs X:` b J zDܲGd@ܲ@w@ ke(02sh ke(6 X eETETwܲGd4ܲ@wb J 4fDܲ#@ܲGd@ ke(0z4fh ke( -w ܲGdܲ#b Ry%Dܲ#@ܲGd@C,@ ke(0y%h ke(   w ܲGdC,ܲ#b Jy]Dܲ""@ܲ#@ ke(0Xy]h ke(\@$A E& & B ?E@  D Q w% Nܲ#Xܲ""b JydDܲ#@ܲGd@ ke(0ydh ke( w ܲGdܲ#b Ry@Dܲ#00$TADATADATADATADATADATADATADATADATA@ܲGd@C,@ ke(0y@h ke("  w ܲGdC, ܲ#b XJT,XDܲ#@ܲGd@ ke(0'%h ke( w ܲGdܲ#b XBLdXDܲ`@ ke(0Ldh ke( w ܲ`b bSDܲ#@ܲGd@C,@ ke(0TShSvhSh  ke(XKM&     2 &wܲGd&C,Vܲ#b 0R|@0Dܲ#@ܲGd@ ke(0HWh|@h ke(LG &  eq B C1&wܲGdJܲ#b tztDs@ܲ#@ܲGd@L @$9΅@w@C,@ ke(0hh ke( x  2@  e .  w *xܲGd"C,8w>L zܲ#~s.| /<  e$$9΅^b 뀻jjM뀻Dܲ""@ܲ#@$99@ ke(0`h&`hy`h y`h ke(& @EA:% NP& @5A E& B _"E@  D Q 5E,|w+w E  ܲ#ܲ#$99(ܲ""b BxDܲ#@ ke(0 ÐHXh ke(& 1w ܲ#~b :*D ke(0*h ke()b Jܲ#Ds@ ke(0ܲ#hܲ#h ke(sb Jܲ`Dܲ#@ܲGd@ ke(0ܲ`h ke( &w ܲGdܲ#b Jܲ)dDܲ""@ ke(0Lܲ)dhܲGdh ke(PC & ` `Ba#   L Lܲ""b Bܲ@wDܲ#@ ke(0(ܲ@wh ke(,CC    &w*ܲ#Nb Oγ2KOγDȬ FHA vb <:ܲ""<D ke(0ܲ""h ke(& >b XzTy`XDNHQHHNBxH BxHQHN:dHBxHH N H  :\}h>Nt!h>t!hN\}h\}ht!h   >>> >|tld200$&k8s)Ps&b tz! &tD)@)_G@)Bx@$9~Z@)p@W@<&e@ @)%@)@)Ps@t @*)p@:@ 4h w    t72  -@ep@ D  e  ` & RW $9~Z")Ps.:4<&e6):t <)B)BxJ)pP)pT b:P|e     R#R-.)_G)% )Bx":0 6)pb B @~D  D"06ݪKhih  D":&  m  f A N  %Pb |TB=|TD@ Cx0=h Cx  ` *  !נ נ  נננ"D נaנz E ѐEp(p |נ$נ-נ0נ9נAנZנ_נ:  ^נ[ȕ]נ<ȕ>ȋ@ w נ%נ*נ$נ_נ-נ.נ0נ9נAנZ݃Ƞ נ0נ7נ*נ,A oȠm k  tנ"A   t &A fנ$נ%נ*נ0נ9נAנZנ_נ-נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (w>נ/* . .נ$נ-נ.נ0נ9PlנAנZ נ_ נ:  Dנ"  0b |SJ@=|SD@d@ Cx0@=h Cx E^`  UQ  UQ ËUI U `e |ccD    Ĕ%*.A U 0 0 W ,Uw@W /D : cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBtC5D  KR΋KBAE:D0CĊ \ eB  Dҁ CSĊ  WvdȀC E Cs Ε f)& 6 l(*  E 'W " =N  W :+W l= 1 #W ,W / %W %W *Հ W <W [W >W ] v(* 6 e b N@B:h;N@D  D"0@d;hm h  D"D&   `@ ` B   & A @    b ΚXb9}ΚXDi(Pi Zi di .tՕ: @e e0e0Uib XB%PsXDs@ K0 ""h K$'1sb Xz ]XD1o@ sJhab1vh 1ph1sh1uh 1wh1qh"1th1rhc0Z aX cXb $*J c c c c c c c$ c*c^   fwvAAU Xs ssss$s *s 0s@a VaZ1ob XB XD `E4dhEdhHʫh~h d% & ^UU U U UUUN a  b 0zܩu~0DݪM@ݪK@W@i@ab@ Zg`Zg(0ܩu~h:h::"h Zg`< Zg(w &fe&  w &ff=elC    5p  d  W"W`iri|  A &@d &@ &m M M` M`5u  @ @ e@ M`u 5`2ii$i0i:ݪKFݪKRݪKfݪKBW @ `u  #;eu o eA eS S S B CeS S S A eS , ab HZg`PݪM ^Zg`fݪMxݪM0tS S B ee Zg`ݪMb ΚXBתZΚXD Zg`0תZhabh$ Zg`4JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECb X:i XD Zg(06i h Zg(:&f!  E D  E E C B Ί Ab XzXDfH`fHH fHH p&H fHjzHxfHfHKH fH " 5H fH@ b NBi(ND@ Zg(0ni(h Zg(r AUUUU    T T T T ee(e(e(e(T $)T T TU U U U  ~b Xz#'XD)@:Z@)Ty@:@[Y@[Y@)@)Z@)W@)W@[<}@o@:Ա2&@[(}@)X@ Zg(0dh Zg(w EH  P A Е:%ʋ B   5Е" e pe 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)<)ZB:ZN[(}vb tX:#}tXD Zg(0yh Zg(&3b %  B  | 7 w 5&g:gVgdgrgzƀt  k i'5e d ^ [U5@ D( G uɥ;5<5  g($9!NgRRg^g-Ԩ  5@ u5 Fɥ@5ub , 5w E 5 @ gNg^g<zl @8jMABAe @&PPP@C&5A  88U&NK$9!\:shѲ:lT; zt$9!e  8 "@0 *_%`AB2:Ѳ::br Ѳ:4T; zL r$9!~$9!$d w@ 8glb o*)TyH)PR$9!T)P`<&9b)h:t nѲ:00$>TADATADATADATADATADATADATADATADATAr)Ps|ep& f P aAAf@pnp C֋ 8Ë7AB`f VT:GѲ:@)pD)pH L)PsP)PX:^Ѳ:b)Pf)Psn)pr)pa`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a`$9pl$9!t Bw@ ŀajTI& af n`V @e,w jj4`&<&9<&Kq<&D ()<)PsD)Psnolj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY <=X@=l e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCe###3X`v)W3 & w  jDl@ TeT5l@ @ L:)P$$9!&)Ps,28o>)PN 8rX)W\)Pt`|sd e  & @ & V An5jP a@@` > ~ @ 8 ( X)W)'}s2' q4)8h'zs. ePa-eP BAnB X/   @   RՀaePÕwePP6 -0P -0Pd-0Ph$9p p-0Pz-0P\)K@>b XR4XDzs!s@ v4h U9qhdh(Zgh6 M@BCAf } f&  GRR@ 3   &$&~ Vs!s|& e% ~ԥ ~F` F` f&Pe e  @  veT  % % % %% % %@ABCD f @  f% % % % t '&f&f`%  > BBe   *uuuuFE@aaH~  r 6  < (  .   "    x  l l&f&D%% %% v  % %%l% Z %% %% D   % %%% " eTTTT@A% X@Ae BA 2`u u `u @A `u u `u p B` `ee% ; vu u d5 5 w6%%% %e;u u u  x ueM u u  ueM u  ueM ue eeeeeeeeeeeeuuuu%&D   5  5\  n eb NBݪMND@ Zg(0TݪMh Zg(X @    e  T T T T H1CdT T L $)dL t dL d  Fb X*ZKXD \b j\DDs@c&~@T;@o@  D"0DhDh\Dh  D"% w &Ba +- ʥ# . U 0   b c&~T;s$o*|  `     Jb QXR^QXDo@  D"0\h hdh  D"w  w & W+W- Ba. W#  B0  c  c S W %ec e`s oo<|  # 3  & ˥ Z ^C  b XZ7aXD@S@?S@o@ N.D,hD,h ۩"S Rw w &e`` a  `e`P D 2o ?So@S ۩"S` ,۩"S :۩"S`b tXzR:tXD<&`@<&Kq@`@[8@)00$Fk8s@BDRFHJHLxNPhRTVX| &- ae  $e  & & & & && & & & &)4  ^b: R &E@ U U @ P J .1 6 (  2  4t  AW A t  %& & & & & & & & & & & & & & & & & & & & tT:t v:  V4  X@ :tP A V @ HI @ :E wAW HAfW l H @ eB   n wL B f  B \   %ww x ^f <D |  U w 6 H L P@ U w  eC "@d U w| t wh t  @44Vt   B B   4 4 H   (B r 4m -c  :  t \%ww H     C    wL J w< K w, B  T w  w x X@ ~wb z4a` D?H"ɪKr@X@""@w@év~@ 46L h Ch C\}h9`hj1ohBh 6xQh=Krh1Kh4}h?yh ~, , t t t 4  ~, ""  "wɪKr X év~ ,  b zBa8"D c[H [xQH[KrH[KH[}H[yH[L H [\}H[H [`H[oHzb t:ͫetD  ̅ ͫeh  ̅enb 0R 0DB,0zH*sH&5 H.sH([H, b :<h *:h&:h,:Bh:_h2  D"W l "  ߥ *  + 23E Ew    Е-   0@c&~$T;&sVW6|A W e`fÊ    E ib pBL@pDi@ Zg(0H[(}h Zg(L & & @( f  e ee e (i b RdXRDW@d;@:@ Zg(0^<h Zg(bw &BA'  '     Aw A& ,Wd;&d;4:L:P:\:b LX:DLXD Zg(0NKh Zg(az  .b  z` Ds@c&G;@W@T;w@:B@i@c&K@ Zg`$Zg(0a}h@ah~h$"@QhvahaPhB Zg`(JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC Zg(''w Del  ~= w D&el& dЕ- eaePPP"w DHc&KsT;wc&G;"s$T;w*WJWnh |WT|  &Е. ce  Е: Е- B&iL:B$b XzXRXD:`@:Z@:@'vv    V     " $ & (v( ,* 6,  4.  p0 |2 4 6 8 :B: < >  @ Zg(w && D¥%  B&ХVA C e!  aebE  Е%*WB> :2 'LBCH    .MAIN. Zg(n 7 $& Lwf@> 07 ԋ_  7 j hz Zg`Zg` Zg`Zg`@y `^ Zg`$$ `^&Zg`&4:t 6Zg`@ :Zg`>FZg`JZg`XZg`j7 E L4  w7 " 2 $  h jZg`Zg`Zg`$Zg`2Zg`   J!     rZg` Zg`H Zg` $Zg`(4Zg`8P )pD)pH}V)p \Zg`d)ptP|Pbp  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)pPhp! XZg` fZg`$n@ tZg` U N 1ȥ9C ʥ ʥ ҥ@w Vp @ Zg`P 8r Zg`"P&:DZg` rZg`V~=|L  \fdwȕ e 7 5j1-C 7 | Zg`Zg`fZg`d Zg`&@=4P8)W " @>    (zZg`Zg`Zg`Zg`Zg` Zg`(&Zg`DZg`J:LZg`@ PZg`>VZP `Zg`n` tZg`^( 4A Е.) ыѝѝɝwы@>4 t&R Zg`()Ps Zg`A: "Zg`)0M4M8MH:2JZg`@ NZg`>b tR$ep!tDs@tCyH c&|KH6T,HkxH!)pH ,R"H L HshH0{mH`qH za9H"-DH)XHaKH #{8H)jdH 7{ HT,KHc&G;HYc&RH'(ZH0{H(lH tyH(zH@z.8H,yH .Hc&H0{DHlSHc&KHKc&WH:#0H#0H4{*LH#0Hs,XH@#09H [t{8Hz3^sH)VHc&XHGc& XH?tBxH.yH (H)\}H-EH#{8HtsH3sH0{9H#0HtsHz.{H)ZH c&HM#z zH.yH #0LHc&dHAkH'-0H0{H0{Ht H#0DH0{Ht8Hzs`XHn]H #0vH# zH0{nHl!H #0MH c&jLH#""H#0H)VNHԒLqH4{MHԒ[qH-01Hz40wHn^HlyH(WH 3jHc&pH#0)H c&HL#04H c&pH#{mHT,HԒqH@CkzHc&XH7zԒ7!H c& H2uNEDH Nb NE2>uU(NED©#H Nb NE2>uTqNEDOH Nb NE2>uu'NEDH Nb NE2>u!tNEDuT[NEDH Nb NE2>uAyNEDȫ H Nb NE2>uIqNED H Nb NE2>uNEDjuNEDpŜH Nb NE2>u#NEDH Nb NE2>uN`NED(XH Nb NE2>uNEDJH Nb NE2>uzNEDi5uH Nb NE2>u%NEDt!H :b NEz3u^NED5 @@@ dhPhHh hHh Wh hRWh  h  @ &e6% 4% 4%04 f   w eF w 5 >RX5 fb N:7xsND5 @ $7sh (e6@a "H5 b AWJdvAWD&s@s@  D"0p &h  D"eff Ne(   #llD eJ Ԕ %:ԕ: sJst|f& f&f& & Ε lle  lsrb >ƭB(>ƭD  D"0yVuh yVvb  -B0!# -D  D"0eMheMh  D" :b  mZ&`; mDs@; @o@  D"0Xhfy:h   D"w CB C DBe ?DBe(e$2e  %[]%<> o s| 1 >; b 4-J,l4-Dg}@o@  D"0 ,lh  D"w  wo g}b 4-J,z4-Dg}@o@  D"0,zh  D" w wo g}$b 4Z:dvw4Do@aVN00$vk8sB=>D&@=@ Cx0=h Cx  @=Nb  2,d D  D"0Rb  'bK VN 'Ds@s@o@f@  D"0aVNh;VNh  D"w BC "&0*5e "fSYqq1յ<pBՋ.p0po&s$|2*E%0*w s"fNb  Υ2  ΥD  D"0b 4grw4gDs@r"&@q:@w@i@o@f@  D"0 `h  D"w *8I *=)98 eB &&  U **o"w8ihq:|e *Nlv ΋*.)  & #!)&ePe && 2i^s~q:p* wr"&fb  %b& %D @q:@i@o@  D"04ch`rh  D"8w  )  U o $i4q:b  Ze Ds@q:@i@f@  D"0rcIqh  D"v0f& e %&&eH U   Ef p  ws8i`q:tfb  Zz Dq:@i@  D"06eZhrShft:h   D":    f u    i(q:lb  : & D  D"0h  D" b  gz, gDe&@py@r@r@pJ,@o@mo@f@  D"0}h  D"w ) 8C * ) *w*  ep p &o pJ, rNfbpyje&| ȥC  =  ȥ 0*ȥ = Eե^ Aȥ e@ v Ep |p  , J *` tr2tC#   D mob  gr,hy gDe&@r@pK,@o@mo@sk@f@  D"0 h  D"w ) 8C * ) *w* ep p  ȥ o pK, rNfZe&|C  =  ȥ 0*ȥ = Eե^ Aȥ e@  Ep p  8 V *`)w jskpr.tC#   D00$~$TADATADATADATADATADATADATADATADATA mo>b \=zE`W\=Db@mlE@eZ@s@r"&@r@q:@i@o@d?!@rS@r,}@Rf@@ft:@fy:@cIq@s}@  D"0lhp!h  D"w  D 8"!#($ĥ ĥ w2 0 o sfy:|*0 @Q$    0 40 60))   w#  w&*w52e 0s}Jft:ls #( P) @#**fff  &*wF. J358e cIq eZFd?!VeZzst$8w22&e %p8q #( *O*)@#0l @s$Pr돀# 02ȕ8 00ĥ݇AĥĊ  ȕ000 0 @0 &(bjr,}l*0 @ u # eB&B B * eBe>  # #& iq:.rS6mlE:r"&FiD #&0 #   0@e 6@#040 6w!Hq:rf dp2zb \=zE`PZ\=Db@mlE@eZ@s@r"&@r@q:@i@o@d?!@rS@r,}@baVN@f@@ft:@fy:@cIq@s}@  D"0^Whh!h  D"w & w  D  8"!#($ĥ ĥ woos fy:|B 0 *0 @Q$    0 40 60))  eB   w#  w&*w5@s}LaVNfft:2e  #( P) @#**fff  &*wF  s"cIq , r,}(i4q:JrSRmlEVr"&bi # #D #&0 #   0@e 6@#dq:(d040 6w!p2f,b \=zF`8\=Db@s@r"&@r@q:@i@o@r,}@aVN@f@@fy:@"  D"0h&h  D"w  D 8"!#($ĥ ĥ w 0 o sfy:|*0 @Q$    0 40 60))eB &*   w. . ,358e$8w6aVNrs22&e %p8q #( *O*)@#0l @# 0sHr돀t2ȕ8 00ĥ݇AĥĊ  ȕ000 0 @0 &*0 @  bbr,}u * eBe>  # #D #&0 iq:r"& ibl#   0@e 6@#040 6w!p2"q:LfDb \=zF`W\=Db@mlE@eZ@s@r"&@r@q:@i@o@d?!@rS@r,}@RaVN@f@@ft:@fy:@cIq@  D"0rh'h  D"w  D 00$k8s  # &iq:4rSwTr,}` pf|py*0, @  ) ) ȥ ȥ l 0l  ȥ r*e&8 tȥ ȥ ee@ v/ h( E ep ) w ȥ,  N w  J B # f  `* w)&r,}$w0rJmop tf"l0406 l0 b  Ӎz\ghy ӍD @e&@r@w@w@pK,@o@mo@sk@r,}@f@  D"0n h  D"w n832cd& & & B  2OΕ   N Υ$Ε  2o pK,|2Υ   v Ε f e * e*w0, &mo>wTr,}` pf|r<  ) ) ȥ ȥ l 0l  ȥ ćȥ e& tȥ ee@ r- d& E ep ) w ȥ,  w|r,}  JwB # f  `* w)0406 l0 wsk.moT Xflb  r7q Db@wt@rk@wL @bG@s2 @  D"0<rhrh  D"@e6p 4 8 00$%TADATADATADATADATADATADATADATADATA &s2 "b*bG.rk2wL :wtb  :\q D  D"0hr,}h  D"l. 00l  0 *b  Js"& Ds@@  D"0Nr"&h  D"R82e& 0 0 0 80 B0 0 0 0)#0.s"b  'RtL 'Dq:@i@  D"0 rkhwkh  D"$ U4 6wi"q:fb  R$t_ Dw@aK@s2 @  D"0rh  D"&4&6 64 wr%64 2 6  l0 & Z46 64 :s2 6s2 paKH|)0406 0 *0e6p 4 @wb  Jw Dw@f@  D"0wL h  D"" Bfep`pww f(b 4Χr4ΧDb@wt@bG@wk@a[M@f@  D"0`whwh  D"d ) !f  e) . e6p 4 08*w&bGa[M&wk2wtXbbfb  Bd Dw@  D"0wh  D" ) . .w D"" Bfep`pww f(b 4Χr4ΧDb@wt@bG@wk@a[M@f@  D"0`whwh  D"d ) !f  e) . e6p 4 08*w&bGa[M&wk2wtXbbfb  Bd Dw@ <0b 2@*@14=X"p8u:,l\,z &8^W &hp! h! &h&h'}sDvwcIq~eMeMfy:"p# Dp &pvws}De ~0!#  &(8&`;"(:,l\,zE`W E`PZ &F`8F`W:dvw:dwDdv=b AWJdvAWD&s@s@  D"0p &h  D"eff Ne(   #llD eJ Ԕ %:ԕ: sJst|f& f&f& & Ε lle  lsb 4j:dvw4Ds@s@o@aVN@\D@  D"0pvwh vwh00%k8sƭB(>ƭD  D"0yVuh yVvb  -B0!# -D  D"0eMheMh  D" :b  mZ&`; mDs@; @o@  D"0Xhfy:h   D"w CB C DBe ?DBe(e$2e  %[]%<> o s| 1 >; b 4-J,l4-Dg}@o@  D"0 ,lh  D"w  wo g}b 4-J,z4-Dg}@o@  D"0,zh  D" w wo g}Zb  Ze Ds@q:@i@f@  D"0cIqh  D"M=f& e %&&eH =&e0  U   E >  sXi4|>E=uf p  wq:2fNb \=zE`W\=Db@mlE@eZ@s@r"&@r@q:@i@o@d?!@rS@r,}@Rf@@ft:@fy:@cIq@s}@  D"0hhp!h  D"w  D 8"!#($ĥ ĥ w 0 o sfy:|*0 @Q$    0 40 60))  p w# w&* =ȥw `p!20s}Jft: EW!p0p252e  Ň#( P) @#**ff2sHcIqbeZtf  &*wd. hB58e$8w2A&e 4p8q  d?!eZ@s^sf (#4=A#@)( *O*)@#0l @# 02ȕ4r돀l8 00ĥ݇AĥĊ  ȕ000 0 @0 &*0 @ u # bNr,}lixq: eB&B B * eBe>  # #D #rSmlEr"&*id=0/H#@&0 # = e0   0@e 6=#02/Vq:002# @#?@#040 6w/!0/ l0/!p!0 .=Bf\p0p2b \=zE`PZ\=Db@mlE@eZ@s@r"&@r@q:@i@o@d?!@rS@r,}@baVN@f@@ft:@fy:@cIq@s}@  D"000%TADATADATADATADATADATADATADATADATA^Whh!h  D"w & w  D  8"!#($ĥ ĥ woos fy:| 0 *0 @Q$    0 40 60))  eB  p w# w&* =ȥ@s}LaVNfft:w `p!2 EW!p0p252e  Ň#( P) NsdcIq~eZt@#**fff  &*wd. hB58e$8w2A&e(d?!8eZ\szs 4p8q  (#4=A#@)( *O*)@#0l @Pr돀l# 02ȕ8 00ĥ݇AĥĊ  ȕ000 0 @0 &(bjr,}*0 @ u # eB&B B * eBe>  # #& iq:.rS6mlE:r"&FidD #=0/H#@&0 # = e0   0@erq: 6=#02/002# @#?@#040 6w/!0/ l0^f,\/!p!0 .=p0p2b \=zF`8\=Db@s@r"&@r@q:@i@o@r,}@aVN@f@@fy:@"  D"0h&h  D"w  D 8"!#($ĥ ĥ w 0 o sfy:|*0 @Q$    0 40 60))eB &*   wL . JB58e$8w6aVNrs2A&e 4p8q  (#4=A#@)( *O*)sfr돀t@#0l @# 02ȕ8 00ĥ݇AĥĊ  ȕ000 >b0 @0 &*0 @ u * eBe>  # #D r,}"i.q:2r"&>il #=0/H#@&0 # = e0   0@e 6jq:=#02/002# @#?@#040 6w/!0/ l0/!Vf$dp!0 .=p0p2Tb \=zF`W\=Db@mlE@eZ@s@r"&@r@q:@i@o@d?!@rS@r,}@RaVN@f@@ft:@fy:@cIq@  D"0nh'h  D"w  D 8"!#($ĥ ĥ w 0 o sfy:|*0 @Q$    0 40 60))eB  p w# w&* =ȥw `p!6aVNPft:2 EW!p0p252e  Ň#( P) @#*8sNcIqheZt*fff  &*wd. hB58e$8w2A&e 4p8 d?!"eZFsdslq  (#4=A#@)( *O*)@#0l @# 02ȕ:r돀l8 00ĥ݇AĥĊ  ȕ000 0 @0 &*0 @ u bTr,}ri~q:# eB&B B * eBe>  # #D #rS mlE$r"&0id=0/H#@&0 # 00%&8sb=>D&p &@s@@$9pw@@=@ Cx0=h Cx eeȵe ~ d DE  eVȵ(e &e  %$@A 5 *@=\p &d$9pwfs|5@558 eBeeDeȵee&e e $  QB4.Hf\=p0p2b >b=>D&p &@s@@$9pw@@=@ Cx0=h Cx eeȵe ~ d DE  eVȵ(e &e  %$@A 5 <0b +@-j"L3Љ6sBKBv#xx'e.`X.`0y: ty: y:x Te 60qX H0q8 >s88 *` ~hb Xb"LXD#@?T@{@©2@*@ Zg#0*kh Zg#.f  eE   *©2#Ԃ{?T:b tXb3ЉtXD[ L@jS@d@N`r@ X:Zg#0B2zh Zg#F B` w` w wmf X:[ L X:X: X:&N`r*jS0X:4[ L8dR@?hu~P?h2b zBvD?hk@?hu~@?h2@/d@?hT[@W@A-@A-@R@jD@?hBx@@*k@ Zg#0ZN`rh Zg#^w E   B ` p 7A @ae  ^W?hBxkA-,?hk0/d4A-6?hT[:A->R@?hu~P?h2TjDZjDb t:#xxtD Zg#0"h Zg#&e?E? & f Y<b Xj'eXD?hk@?hu~@?hT[@A-@A-@R@ Zg#0Nh Zg#R  0 B ` T00&TADATADATADATADATADATADATADATADATAR RA-?hT[ ?hT[?hu~&A-:A-?hT[ @?hT[F?hkLRN?hu~b Xz.`XD?hcM@j/d@?hk@?hu~@?hT[@W@A-@A-@@?hBx@3e@?hy@2©2@@ Zg#0~*h Zg#w f 4 & D -N   `   vW ©2A-?hT[ &?hT[,?hu~2?hcM:?hu~H3eJ?hyPj/dTA-\?hkh?hT[j?hT[n?hBxr©2v|Db Xz.`XD?hcM@j/d@@?hk@?hu~@?hT[@Cs:@©Bx@W@A-@A-@@Z@?hBx@3e@?hy@CQ@©2@@ Zg#0*h Zg#w f E  w`K`/ & D -N   vW ©2CQ$Cs:(.©Bx:A-?hT[ H?hT[N?hu~T?hcM\?hu~j3el?hyrj/dvA-~?hk(| `   ?hT[?hT[?hBx©2Fb LRy:LDs@@ X:0Zg#0R68h X:A? Zg#VeE & m*  * * *bFX: X: s $X: *X:*6X:*>X:*HX:*&b  ?hcM ?hcM&*03e2?hyXb Xz0qXXD#@?hk@?h2@e;@?T@@ձ@#h@jTG@{@ X: "Zg#0j/dh</dh X:#Zg# vp4e6( d> > p4e6( "B X: 0X:6ձBJX: ZX: rX:xe;J|7 w e)w 7   TX:?hkX:X:?h2 jTG2X:8X:B{#h F?Tb Xz0q8 XD#@?hk@?h2@e;@?T@@ձ@#h@jTG@{@jG@jjH@2 X: Zg#0j/dhF/dh X:#Zg# p4e6( xH   H p4e6(J X: 0X:6ձ@jGFjGLTX: dX: |X:^| ,䇷  7 w e)w 7   he;jjHjjH"X:&?hk(X:,X:00&'8ssLXD@ Zg#04h Zg#8B B  @`   B`.>b Xz` XDVN@3eH Q?hcMH?hkH?hu~H?h2H?hT[H?hBxH?hyHX:xRhhA-hA-hRhjDh jTGhjGhjjHh X: &&G::VN>b Xz8 XDVN@3eH Q?hcMH?hkH?hu~H?h2H?hT[H?hBxH?hyHX:xRhhA-hA-hRhjDh jTGhjGhjjHh X: &&::VN.b Xj~XDGG@@jS@N`r@ Zg#0\=HhNcMhhB Zg#`   v  m ` @ 8N`r GGN`r jS6N`r:jSNN`rZN`r?hT[H?hBxH?hyHX:xRhhA-hA-hRhjDh jTGhjGhjjHh X: &&::VN.b Xj~XDGG@@jS@N`r@ Zg#0\=HhNcMhhB Zg#` <0Y +- 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%Y%kf%f%\g%Iq%Kq%Tq%t%'t%iw%w%ly%y%z% %%%%%ą%Ʌ%%s%%%((z(W(Y(Z(m((Z(@(i(((5WnWWzWWWYWmWWZW@WiWWW5a8a0MaMaMaMa@`a a8aGaGaGaGaHa0MaMa(dafa a`^aaapaxaaaa!a"a"a"a`'a8a;a#;aW00'TADATADATADATADATADATADATADATADATAaxZaaЉaa avaxayaaa" a> a? a8a:a:aLaWaWaxZa@`a  b?  bp  b  b0  b% b& b' b' b' b' bP2 b: b: bK b@` br>Gr>w"sY#e[(#s\9"93"9Mp;EM$;OM$;PM@;_]Cr xC8@CO <vCP <vC29@C{QbhCWTbhC+d&Cd&Cz%xDZ@DZ@Db=DbDb\Dq\DMwEH&EH&EH&EH&EH&G]\>~G\LG\]JJ$JE$Jm$J|ae@c%$c_$eO?ePM2e-P^$i5u,i{?$i{N.i{_6i|_6l,x`@pŜs`"a(xR~<Z@}\}NR~\S~)@wl@@XO]\Bv\O\a,,bhh d©#,©#,©%d©Ee©,`f©qqg©sh©wié"Cé"RکG2HکK?ݩ[}1 ݩ݁BvݩQPݩ-iީi,#k2H2gk`"l@"C멀"RWDKqlSZ?("QP,Pd@.@3(#m3p7w@;hp;8r>=xtd=hv=w@Wm@Ym@.@@`m@R~@@S~@@@]f\0 zLez\4}ɪweɪh@ɪh@̪a 3$ΪWӪ8}Ӫz%xӪ36تWDުE}4GGWDXD($<(E$T(m$(XBKEIOwOybR'S`"`S"G S"TUSZNU݁HDUUU- XRv\ Zr>.@O,W\...VWXRNO7PZX7Pw88%&'B'(`{((T!(")#+x&,Hu',U(,,1.\v:2T[,E`5:d5\g5Nq<vq<vIq9Kq<Tq,Uq6dVq6!t6Hw\dw!w;)x)@6x27x@@x@Ay,y@y!y!y!;ją<<9`xmK`"@ \ %%V@H%W%<:`Txl!&'RrZo+d&8 v~\ëëKqfȫ ȫ`TȫLq}4˫e\H KInDL^J|V-s|"T"YT}<Y}<YZG(jRj<Zl l \t!s@ WT)@ XT)@ VN<00'8s1ul1un<1uo1us3u"3u$3uG%x3uK3ukM%3uS&3u^%3u_'B3uIq'3u|q3uIt4u%!(`4u;;(4uH;(T4ug5uZ(5up)5u|q,5u˖P5u)@5u$+*5u%+x5u>6u" ,6ut:,H6uMq,6uw.X6uw.7u.7u`"17ub"1 7u2g2H9u29uf'2j9uS<9uX2=ul=u\=u=u>=u8=u=u<3$=u=x=u'3=uYH36?ud5?ud@u# 5@u~q@u`5NBu5Bu6BuW!6dBuq!6Bu"6BuK7PBuM88Bu9T9^Bu;TLBu=T9Buw9Buw@BuwBuz}9HBu}9BuBuZBu9Bu6:Bu+xBu:BuBu ;*Cu ;xCuz;Dus;jEukY^Eud<Gu<Gub pGur Guc}<Hud[uE<v[ukM=[u`>~[uq>[u|q?H\u%!?\u;;?$_ud?_u`"Bv_uwCfu[DgudE|hudEhuwG huNhu`HDju[KlusHmudInmudJ|ou~Ku'Ku#LukMLu`LuqMu|qMu%!M2u;;N.u$Nut:Ou`"QPuwRuC^RudTuwTu`UudVueu[MWZudM,u'YNufsYuLy[(uy\ukM\u`]uq^u|q^u%!^$u;;_6uN`@uwa(ut:au2Xbhuutduvu샘,uwuNqzLuLyzu;;}4u,F}uLudu<u`u`buw`u`ulu,`ueueu[ ulEuGfuLy\u8bu8Dududufs|uwuL(uevq 00'TADATADATADATADATADATADATADATADATAjY PzrzPDkEH+"H+"Hp+"Hh+"tHa8HWH% H +"0H%H +" HB bpH%HpYMHp[MH@b&HavHpcMH zky:H%\gHk:HkJH bفH!k:H b4H%&H+"(HkH%'HaH8+"H`WYH bH,z(YH(HpYYH% H a؁H: bH@aH< bH0%Hp;YH b؁H.a(H> b(H2+"EHP+"xQHzbp HaPH@+"HbYH%'H@ bPH4(ZHbxH2p Hk4KHkH bpH bpqH%H%HzWnH bxH6%H bvHpYHb`Hk^KH bH<pWHpnHPplH%tHb`H b`H bH>z%'tH bHb`H bH8a8Hb`H bȂH:b`H%HkWH pH#z zH+"RH@k,Hk+dHz+"LHpٚH@bhH +"H+"H%(H%@H pwHaGH1aGH(p7[H aGH&%5H0(WHaH&zaH&b H axHaGH&a!H+"HaH(kHH8+"RHWiHW@Hbp HpH%ɅH +"HPzb`rH$+"JHpHa(dH%ąH b0 Ha@`H b@`HbHH&bIH+"GH@b[H+"H+"wH+"GH0zp`H bHa;H bxH+"BxH+"HaHH%QHa8H +"#THayHk<H+" H(Ha"Hz+"xHa"H a"H2+"THkyqH+"1H bӞH+".H bQ HP+"HpH b` Ha#;H %H b`rH6z%H!+"Hk%H+"v8H%H@WmHb H+"`H0+"yH+"N`HPa HB bpB<F Jj<Nt!2Y Nzry ND@JE$@ݩ@@G@\@@G\@U@eP@i{@(E$@ 0ry  4wwwwwwwwwwwD @G(E$JE$G\i{eP"\&ݩ*U.2Y Njrz NDDb@ݩ-@@G@\@G\@i{@(m$@  rz  $wwwwwww, @G(m$DbG\i{\"ݩ-Y NRr{ ND-@@G@U-@e-P@ r{  wwww @Ge-PU--Y NZr| NDJm$@@@G@,@=@ r|  wwwww  @G=,Jm$NY NE24sNED 4s NY NE2vqNED vq NY NE2:h;NED :h; NY NE2 @~NED  @~ Y NR1uND 1u ldwhyh8yhyhR 1up  C A @   f A #  &  m 5 f eC NY NE21uTKNED 1uTK Y NB1ucKNDV@ 1ucK h 1ucK VNY NE21uKNED 1uK NY NE21uwLNED 1uwL NY NE21uxNED 1ux Y Sj3uSD5 @l @ @YT}@@ 3u 9h93h 3uCPU  ,, & 0 0   ,`wt3 B5 |  f T%wD C5/5* "@  @ bYT}`0 wCwN 3 5   wss   1 1 5 5 t "` 0 1  ů )    @ @ w &V  ,NYT} A # B,D 5  5  A     xl :l8 1 1 1   `Y Or3uOD;PM@@9@93@ 3u c_hc%h;OMh~;EMh$ 3u  55           &<9JV93p9~| w;PMY NEB3uGNED 3uG 4CzhӪzh 3uG8"& d  zY NE:3ukMNEDS~@ h  ,w S~:Y NEz3u^NED5 @@@ dhPhHh 00'TADATADATADATADATADATADATADATADATAhHh Wh hRWh  h  @ &e6% 4% 4%04 f   w eF w 5 >RX5 frY Or3uSOD 3uS C+dh|Cdh+dhfEHhEHhEHh EHhEHh 3uS @@ @ 9C@&e$e& Μ N<B>& 2mB>o  o "|j d `[ ]Ҭ V  Ue  5`昃`$EEˊˊE & ˤ!%   cc   9e  Pt  A>55,<lɥ fEÊ֥  PzY NE:3u_NEDS~@ &h  0w S~Y NEJ3uIqNEDJ@S~@ h WTl  WTjjJ w S~zY NE:4u%!NEDS~@ h  Dw S~zY NE:4u;;NEDS~@ {h  4w S~Y NEJ4uH;NEDS~@pŜ@ h WTd  WTbbpŜ $w S~Y NEJ5uZNEDi5u@S~@ !h WTn  WTlli5u w S~Y NEJ5upNEDi5u@S~@ "h WTn  WTlli5u w S~Y NEz5uNEDt!@5!@Kq@R'@DMw@Ӫ@ 5u˖ S~h WTt WTh XTz XTh YT ZTd)xh HT{{{{{{{{{  WTff R'n nt!DMwӪ XT  ZT  5u˖  WT ( ( 5u˖66. { { { {  XTTT`` 5u˖ 5u˖{  {   {  { 5u˖&f B * ͋'% ͥ!ͥE%,  D5  PB2    ZTl|%pċ5J J J @ EͥAA I&KqNY NE25u$NED 5u$ Y NEJ5u%NEDS~@@ #h WTf  WTdd (w S~,Y NEz6u" NED@S~@ȫ @@©#@  T[hu'h U(hAyhTqh WT^   WTRR ©#VV ZZȫ $P TX`dw"S~zY NE:6ut:NEDS~@ &h  Hw S~Y Qz6uMqQDN@l @@.@@@x@L@ZX@Y@93@ 6uMq Vh*h ©#h ©#hOh 6uMqw 5 , L , L L *wPuLuNfV 0L5 @eL ,% @x,93HYB L@.|    `1! W-, A , LœE¥" t4 w  LnN r@.ub  e t 4 00'8s&deE 4`0  (e)Ej0`0^ 0n5j ^h h :&X:dp|E`dU% e)0)f  2נ/נ נ   נ נ RՀC$szY NE:7u`"NEDS~@ ,h  8w S~>Y OR7ub"ODɪh@9@ZX@ 7ub" ݩ[}h 7ub"  "` &&   f&& ע , , A` 9ZX@ɪh | & ɪhY OEB7u2gOED 7u2g dhکGh 7u2gh   eAm:CEeB@ & &  CR  &VPNY NE29uNED 9u NY NE29uf'NED 9uf' lY NE:9uXNED 6xhv:h Y N:=u<ND =u< \̪a h =u<` +3 3@    NY NE2=u'NED =u' Y NEz=uYHNEDs@DZ@7w@C29@ɪh@@S~@V@C8@ =uYH Ӫh =uYHdbD D/5% %%  S0Ԋ8cP @"s J C29|D%b p w w5 tBh?lYjU@8C8>sD7w055   w@pK5˥t)) ‹5Up54DZrt5AɥAeu@A55U4 H  &fw^Vfɪhp@S~Y NER?udNEDS~@(X@pŜ@ E`h WTj  WThh (XbbpŜ w S~zY NE:@u# NEDS~@ :dh  w S~zY NE:@u`NEDS~@ \gh  <w S~NY NE2BuNED Bu00'TADATADATADATADATADATADATADATADATA NY NE2BuNED Bu Y NEJBuW!NEDi5u@S~@ Uqh WTn  WTlli5u w S~Y NEJBuq!NEDi5u@S~@ Vqh WTn  WTlli5u  w S~Y NEJBu"NEDS~@<@ !th WTZ  WTXX< \w S~Y QjBuKQD5 @l @V@L@Y}@ BuK hZXh BuK#  0 µ1!0w  5   w5& *w5  w5 Vl | ww  w5  D, 1   5&@ ) %>L`Y}nV e  C   r  &V p 0 p 0   t 5w      @  ppp 0 0 0 l  1 1 1 &Y PZBuMPD5 @@ɪh@ZX@ BuM |wh BuM (f& 1, 1, & 4 A`!  && &V 5 ɪh`ɪhfrZXNY NE2Bu9TNED Bu9T NY NE2Bu=TNED Bu=T NY NE2BuwNED Buw NY NE2Buz}NED Buz} NY NE2Bu}NED Bu} Y NEZBuNEDj<@S~@ @ Iqhh WTb  WT^^ j<hlwS~6Y NERBu6NED`T@@x@©#@ Bu6 WXتW|7  `   Vw<@3 44 4  8   m5 4 PCO pXw4 4 47eC<7*6 W9W^w0 ` C` ::t  2 7  )u`:NCA" &&   5w   wE5 .5 <A f "b <.w  . < 8 23 u u<ul<76 E   8& t:tm<5 5 5 555 5 5 &تW^q5 &5 (<5@  3(A@ 33u  d  J`. <3 u-<Q.u < <5.3 e t @4@84 wC4#3 ` f ꆖ @4 76 `Х^  7W̪a \ 8wwtY PEz_u`"PED5 @q@N@SZ@@.@@x@é"@"@کK@ _u`" Lݩ݁h]\h _u`"  3 6w]V!' 5 5 ͥIu @ 1" é"5 .SZ( 2@.xq#|A B&VP 853'3 & & &&Ef&5   EH55wE@ LNnکK r@.X3U@3  4 4 4EP  wV@xY OB_uwOD _uw .é"h"h _uw2Be2   4 Y Orfu[ODW@ɪh@9@ZX@ fu[ $تWhWhWhXh fu[  e@ 4 t 4 0f&  & eV #5  r 2EN& 5(vW| B8 %`%1 &&  5  q8qm8 &9LZX0 q8t C `54ul4ɪhNY NE2gudNED gud @Y PzhudPDتW@W@q@V@W@W@CP @y@̪a @ hud BKh  hud t, t,  :   1 `Cm: > 4 C:Cm@ 4w4 4  BlW00'TADATADATADATADATADATADATADATADATA.W4تW|2 B-@ v 6цBm :A7=60B`@@ e0b e0I@7C:C0BLy" &  pŠ5wF %B>C< T :7   6 w76 EB |تWt C2776   P < D OE& 5 0 "0 $0&s-`CP <s<5@u7BB:   m@m:55 5 5 555 hql 5 5 5 &5 (u 4B C4C#   ꆖ `` e @ w2 4̪a tW,"r $ &   "V:Y O:huwOD huw S"h huw@u>u<5256758*A-<?A-<9¥e¥  )`T|e¥ B< Bm>   u:Am<p u@Y Nrhu`NDBK@q@@.@USZ@@x@CO @S"@ hu` U݁h hu`4  S(wG0-"0-$0-& 44 4 ! + S"USZ "@.TCO zq<|efff@e w  EwBK  @.:@xY NZlusNDȫ`T@W@@x@ZX@ lus h lus@ZT O   ALA4  42$"2&' 1 Ɋ:ȫ`TZ| 8 4 &  5 4 uw$ZX0WX@xY ObmudODتW@W@W@W@̪a @ mud L Kh mud& & &4 4 4 1- 1-  B  W7  u-.8 ) m ::WlWrتW|I@0. 7 C:C0B"B : B>C< ,55  5 5 5&C4C#X.  f   u-.8W7w ̪a VWY NZmudND@.@@x@ K@S"@ mud Vh mudZ 5.5-@p7 !w 4 w%S"< K6 @@.X@xNY NE2ou~NED ou~ Y QZu'QDl @@ɪh@9@ u' Th u'̥ q"q $e$q "f&   5 f   e v 89Hɪh|," ,$    ," ,$ p $p"$"    l v &V NY NE2u#NED u# NY NE2ukMNED ukM xY PEju`PED@;OM@;EM@@x@" @93@ u` G\h u` B$  wA  ( f  )e l*t5 5 5  44 93" ;OM:6|4  4 w w(@x4;EMNY NE2uqNED uq NY NE2u|qNED u|q Y PRu%!PDɪh@@x@X@ u%! fePh u%!j@5 N&]0N  m  4  00'8s\h ut:5 N  5 2 &w 4 4 e t w& & B 5 ͥ9ͥIeA  é" ("@@x|@ A BW-25@  4t5 u 5&u( PwD,,(C@,  tu e@ C 2 r 4 &f %wB, _t mW-2ydwy(yVXj93nXxɪht2 5 ȵȵ-55 ȵȵ et w@ȵ ȵP f 4 U@LuLuNfLV L5 NE@4 4 5 5 5 5 &5 ( L`LXLY Rzu`"RD@X@ɪh@@x@j@멀"@93@̪a @ u`" \ݩh("h u`" w w m 0u.0 )A"` 5@ =멀"@Xɪhb̪a |u>C5   CA  4 4 e t W- 5 NLuLuN>̪a B93hE@w%LL 5 @L4 4 5 5 5 5 &5 ( 4   @xdjY PBuwPD uw xé"h멀"h uw|0W& 55Be,( * E    RR @LY SEzuC^SED}@@.@@Cz@4}@ɪh@YT}@9@ZX@ uC^ dXhjh@Xh& uC^&f(`@ ,",$wf&   LR   t  L4542p$2r"L4}Vɪh^Cz| #"-$4  %W-2 @LL4 L4  fwe 5 f} j@.p "`  W,  5 L W,  U  fLfN  NL 9(YT}H\bZXY NEzudNEDDZ@Cz@4}@ɪh@@x@V@@S~@9@ZX@ ud (E$h  ud*I )@`e( @ 9   %` 5  et 4"4$4 &<9L4}\ɪhdCzH|45"45 4  eLw ΋wbw "ZX.DZ6V>@xF@S~ Y PBuwPD uw "hS"h uw 0W:@Ae,( * EQ    QQQ *A-<|A-<LY Pru`PD@X@ɪh@@x@j@S"@̪a @X@ u` Uh u` w4 4  W mѕ0Q<Q=0 )CmѐѐCB" B  S"(@X200'TADATADATADATADATADATADATADATADATAɪh~̪a |C<B> 4   4 4 e t L@uLuNw4 4 5 5 5 5 &5 (4 ̪a  X\@x  jY QbudQDɪh@@x@"@̪a @X@ ud h ud&]]Z0N S N mѕW0Q<Q=0 )CmѐѐCB"` ,"6ɪhb|B>C<  4 5 5 5 LuLuNwL5 5 5 ̪a ̪a 6XN@xY Szu[MSD5 @}@@Cz@4}@ɪh@YT}@9@ZX@Ӫz@ u[M ~8^hv h u[M& &2LwF8W8  `     wt  F9btɪhxCz|Lde@  LV85N`v ,,f -68C .024 r`r   "`&&  fLfN  && &(ɪh,Ӫz4JZXbZXp5 tt  4 &V , ,%,,  "2 2  2 2 w Q  w   vt + f 1 @ 5@@ @5@ @09l f1N1Ewn& & $ . &  f5  ewP 6" *(% $"e$s "3 &wb "` &&  "`}rd   YT}4}Y SBu'SDɪh@ u' 6`Th u':& B  p p- ɪh*Y ORufsODɪh@ݩ[}@̪a @ ufs H"sh ufs    tF 6Ce # ,7lѕ ѕ,2Ba.ݩ[}(ɪh|Ba r,,eѕeeCm: ,,̪a ` E m ev`e 5e.Ba z̪a t$ Bm`  ep0%Abe e  ̪a :̪a D̪a l̪a \BmC:  66`wB@ e   ̪a fY zJuLyzD@̪a @ uLy #eh uLyW8,W8   33 s.s0 eW8 ,B:m`| e wW8=,92Bal-&ѕѕQQCB p0,̪a l̪a 0,1 m), 0,`.Ba- B:m p0LlFV̪a Ftev eE¥ @@`pY P:uyPD uy #sh uy 4 Y NEJukMNEDs@DZ@ ukM (Dbh ukM,   m@ w$s*DZY Pzu`PD@s@;OM@;EM@@@x@" @9@93@ u` ;_hG\h u`   w ?  l@ 4( AN &f 6 t%w,93" ;OM"" @00'8s& & Д 1  #.504  @0A.B> @m: 554  6wL©%zw4w@x Y Oju;;ODs@c%@@9@93@ u;; Pi{hi|h u;;T  l@      Ü( w s"9349BRc%Y OEzuNOED5 @w@©,`@ZG@ëKq@@93@̪a @ uN l,xh uN5 0 7 : .584   5 : 58U B@ "` B@-  w  ,w6©,`F93RxZG|p-x9#W-00A@  ^ 9 @Q0 A@B6`eõVëKqjëKqE`e& N e @,A6`B:` pf:` 6 d w B6J2ҵ  @̪a rt 0 4 fNfL %fLV Ee& &   t  5 .wY NEBuwNEDK@ uw  s`"h uw$5 5 5 ,25 4\w"KY OEzut:OED2g@©w@@.@©E@w@ީ@@x@©qq@w@93@ ut: |\h ut: +www @ 55w  4 wkw©w @.,©E& 0@.6©qq0 :@.L2gbީf93vw~@xY Ozu2XODG@G@w@ɪh@کG@8@ݩ[}@ u2X CWThlhC{Qhr  u2X5 84 595 - 9\  I' Q5KA@!Af9f:: 9 :9  8.Gh8| !g9$5 : 9 f&&  5K ņ%!*5 86 55w8@wVG A@ tt  B9- t t 5 :w "`4  5 "کG6ݩ[}FwTɪhdɪht5Y OruB@ t 5 : ݩ[}.ɪh68tY Pzu=rPD0 @C+d@5 @w@ɪh@©,`@ZG@ëKq@@©s@93@ u=r $©Eh u=ru>@ @ h0 Ap `  Z u<U R84  2 (5 :  58 %U 0 BC+dZwb©,`r93|BB@ E<00'TADATADATADATADATADATADATADATADATAu> B@ - "` †wZ@- 9 95 w&5 $BZG U t@99A@B:` ʵ 5 <e& &2õE`e `& N e !ëKq93>ëKqt& & Ee ֵ$ u .u0  : wt 4 t%P eX93\©svɪh8%<4   fLV w ɪh&5 Y PrurPD5 @,#@w@@ɪh@ZX@ݩ[}@ ur ©,`h ur&D4 4  Bm@.C@# UE;C@ @<’ <,#^5 x| 4-   t4      && 5fLV & ݩ[}ɪh>wF,#ZfZX(Y NjuVsND0 @5 @w@ɪh@©s@93@ uVs h©qqh uVsl@ A B4tE@P 4    5 <fLV &*0 :w@93D©sNɪhT5 Y SjufsSD0 @5 @w@ɪh@ZX@©%@ ufs &©sh ufsf@&  E `9J@m:ȵPD& & EeeҔ ȵ    &70 *©%|4  v&  - @eL4  0 e0wT5 jwt5 2&& @  fLV ZX(ɪhY NRu}sND0 @5 @Oy@ u}s L©wh u}sP@4 @0 5 354444w0 5 NOy>Y Pzu`"PDKq@©w@@.@Ow@©E@w@4}@@x@©qq@`"@93@ "u`" ݩ-hީh\ u`" +@w &4w ww5545 5 5 %@ %d`"©w @..Ow( 2@.D©E> H@.N©qqH R@.Z| w 5@4  W-`  P4 w1Kq @.938wJ4}X@xwY NzuEND5 @@Cz@4}@ɪh@YT}@9@ZX@ uE ,#h uE   "`   %+%0   C@ % & 94YT}:4}JɪhNCzT5 H|    "`&& %` fLV .ZXY NJusNDުE@̪a @ us 2gh usBm:@@4 Ee4 e @EC% >@t<@  ` 0̪a |ުEv|'t< 4  t t  t. t0 t24445 5 55B> ުEY NBuwND uw 0`"hwh uw4 55 596Y OEZuOED2g@w@ɪh@̪a @ u Kqh uP 5@=  (4    A@ ɪh2gLw|uw̪a Y {EzuE{ED3@8^@`T@@.@w@@e@ɪh@ɪh@ @CWT@ުE@b`@ݩ[}@̪a @ uE @Wh0h@Yh@`h3(#hxh00'&8s@.R8^L V@.l | w t 6      33 p6p8 w4  Y+ݩ[}ɪh,`Tde h@.C@    tt  0wE8 1 h@8A6 &t 6E1CWT28^$ 6@.L bݩ[}pɪht w564  5 6e&V B@    ,#+`T `z @..wVwѐ   ` , C@ E ,,-B mf m C:  p̪a ,ުE>̪a |̪a Tl0ѐeBe. ,,ѐeBe2 "̪a L̪a PުEY ObuHOD@W@@Y@ȫLq@@`@x@ uH 3h uHB@ Ev .Ba ,` m62Ba ,,` m6 Bm:e6,m xRAm6u-:6  , f6,N &0  (GBt0%,, B:m ,, , #s&Y |zu,x|D8^@ȫLq@`T@@.@w@@;h@˫e@ɪh@ @ުE@ëKq@Rݩ[}@̪a @ u,x JGhh;8hh h u,x5,"w 5 6ww 8 6B@ @0A. 'tF 6  B;h @.(8^" ,@.> \ݩ[}lɪh|w   &  56,D:lBm: $ ʵEe`eA@C E`T˫e~  @.A m  Bm: p.p0 u6  e"&&,A65 6 4 4 &V ̪a ëKqJwlt&:66`e  2 B:`  u-:6&@@ >ëKqZwmm  ɵCeeC` 6 v: mlBm0 |ȫLqla u-:6 mm`BmC:- u-:6ѕќ&̪a hȫLqf@@ѕѕќm a DުEb̪a Y ORuODɪh@ުE@̪a @ u =xh u6 EW6 @eAWe6@@5 v ~ɪh|66 6 6 6 6 66`C:`!$ 9 9˵eE `:ev:66l ˵˵˵mm m et@m:@f A mf>>m > >v`˵r˵@oe@@@%!8ުEl00'.TADATADATADATADATADATADATADATADATAmv` r19  CCeeu,B``(̪a vl ѕQ,5,6 r :5:B:m e e e m mw̪a Y ORuODȫLq@#s@̪a @ u =hh u 9- Am:ewB,Am:u- CC eeweeB` ` p0vr̪a |6, w !!  9B@ 0 wm0 mZ#s  m A:`ѕeQ- e  QQBC ȫLqT̪a z̪a t 9mm mv 8$,% me m 8,v 8 ,8,. 9,  ,8,hY zuD8^@ȫLq@`T@@.@w@#e@"s@ɪh@=x@ @CWT@=h@JZX@ݩ[}@̪a @s@ u Hh=h u5,ww,w0wf,5-  w,, z@0A.W8,@4A2 S=x @.=h @.,8^& 0@.D |ݩ[}|wt 6f,5- ,w`4   t G8wHɪh.`T6#e :@.RCWTlwx"s |@.>,p.p0 p2p4 ,`BmC:m @e  m e,,PȫLqtL5-W-LfLfN 4    4 5 6,&# ,  tt ,.w:ZXt4t2t0t. 4 u6  ,  wFw.Bm:e%:CWTJwVs@ Z@.6la ,4  u6  w4 L5-efLV B@ ѕ̪a 0CWTBwdeQ- ,ѕѕ Ce QQCB >̪a `̪a Y N:uNqND uNq $0 h uNq(& 5@ \Y ybuLyyD@W@@Y@ȫLq@@`@̪a @ uLy *eh uLyA:B,B mm ,, ,B mm B mm @,, ,Հ|,v C:B:`@,,  mm e0 r,?@,; s: R̪a , mm, , mm``0  wr@,9,5 TȫLq\@``@Yd@Wt`, mm, , mmC:`0 w A:`e,VȫLqZ@`^@Yb@W  p0e B mm  p0lBm0 @`J̪a zȫLqle @,,  Al  p0mmlB`0    @W&@YbȫLqf@YF`A m u6.u8056 , B@ ̪a Y REJu;;RED̪a @ u;; HȫLqhުEh u;;L b @@& e$cÒE eccBm>  B̪a Y Rzu,FRD8^@,#@`T@@.@w@@ɪh@ @Ӫz@ݩ[}@ZX@̪a @" u,F Ӫ8h u,FC@f44 4  wt&00'68s`Tt p6p8 1 0 e.Ba C@œ Š%EfÜ Êp5ŀɕ C<̪a @œ @0A. \ &C@ 0  p.p0  Ar.Tr0V A@q r2 rݩ[}0`Tl4    ` C@s2s454fLfN NLӪz&l4  && t wZX0ɪhY ORuLODɪh@ݩ[}@ uL 0GhGh uL4   t "ݩ[}0ɪhjY NEzudNEDs@Cz@4}@ɪh@V@@S~@9@ZX@ ud n(m$h ud4  &   5  bw %` 5 p  ,5 : #4     %` C@ D   wC@5 <u3<u4>9#B,ɪh8$w693:©%TYT}Z4}:`  ifEeֵB`e&  9T4  HC@  A%`%P88U B@ - "` Ȇw5 <p- w©,`093LjZG2A@B:`9' )9 v@  h5 <9B:`ʵw"w( 7bDëKqpëKql9 6 t-< <@ <B6< ! < H4 f< <>4 t%P%Z93b©sT : 585 <u3<u4>U "`8   97z<4 %u .u&ɪh934FYT}L4}Tɪhd0fL L 0 fLV Ee& &   t A@B:c2õEwɪh$5 L`e `& N eH& & Ee ֵ$Y OZuwOD0 @+d@ުE@EH@ uw S`"h uw@Du00'>TADATADATADATADATADATADATADATADATA>u<*A-<[A-<U   ¥A-<@p-<\0 |< 9   9&  595 44 4 4 4 44  +d&EHHުE Y SEzu`SED0 @5 @@@.@I@w@@h @ɪh@@x@ZG@CWT@b;8@Ӫ8@ëKq@=@@EH@S`"@C{Q@ u` zU-h u`5 4 w  t  %w ,w  4  09t wwf_ S`"CWT,w2h , 6@.DӪ8> H@.TC{Qr=l v@.|65 6 % 6 ,   w5@4@@ /p-<* 9$w ,H CWT*CWT4 8@.V0 dEHph  t@.w6 w/, w5@5 5 55 @ MӪ8  @.;8 @.( ,@.~5 t55wuLuN5 5 5 4 A4     t@4wu:61I @.JwTCWTbv@x9A 9=A@C:`˵1 A@ !  %`&4  t݇ ,5 XëKq`tZGl9ɪhY Ozu,`OD,#@w@@ɪh@x@ZX@Ӫz@̪a @ u,` `h u,`  p6p8 ee ѐ  C@Ü El Be. ѐ  m .x<̪a X̪a bxp̪a | p04 &  w,  r6 r8 AF  "`&&  ̪a >,#XӪzj|ZX4 fLfN bNL5 6C@s6s8  5 64 fLfN  NL,Fɪhnwt w*Y NRueND0 @ɪh@ëKq@ ue Kh ue5 =7 3 -:p-:& B6`Ee & &   t u6:u6. 0 $ɪh8ëKq|0NY NE2ueNED ue Y wZu[wDEH@EH@EH@EH@ u[ 8h u[59&& &l :U,:` 9wCm: "9wh:5: < s>59wB9|œE  e` D˵˵˵em <B@ ,W m emv` <N  8A@A E mv` ˵’ee`ef *EH2EHVtv` <  9 5,mweE, EH(EHY OErulEOED0 @w@ɪh@l,x@ުE@EH@ݩ[}@ ulE ëh ulE C.`eE<<=>A@q-<G 9A A mf >5 <5 < ɪhJEHjުEj|4 u4 5 4  C45 4  t   &w"l,x(0 Hݩ[}VɪhdɪhY N:uGND uG ëKqh uGC:6`” A@µEe   A@ ˊפ ` El |`: Y vEbuLyvEDG@ɪh@@@̪a @ uLy ˫eh uLytF 6 00'F8s`f @f 5 60 "= &@.@ D@.Lp-<* 9$w ,w0 w), w5@ j0 EH$h  (@.6Ӫ8( :@.F;88 J@.XJ \@.t@  uLuN A4 t 4 5 4 4  @wfE5,5L\wf@x-u,u:69? 9;A@ A@  !  %`&4  45 bëKqj~ZGlt ww9f 2lfu<u>A4  %p-,p-< >p-<ɪhR0 v 92A@L%% @@ Nt4u:.w 54u.:@m:e 6EHLë. P@.VY TzufsTDw@@4}@ɪh@ɪh@8@YT}@©%@ ufs `sh ufs  &4 ,}`   2"`. &B 1 t5 : 4 9 ɪh4©%^ɪhn8|   4 ^9lA:`eCe2 - -,8 5 B  YT}4}l U,4 e  4 5,E,LLu<u>fLV  w*hwVY PRuwPD0 @K@+d@ uw "h uw5 4\ lB  u>u<¥*A-<'A-<!  Kz0 >| ¥A-< p-< 4 (+d$Y NEZuLNEDw@4}@YT}@ݩ[}@ uL zZGh uL~ff f4  e4     "`  4  &wD4}Xݩ[}fwvYT}Y NEzBu;TNED5 @ Bu;T UqhIqhd{h0&hDT[h\\gh8u'hThHhlzh !thXU(hLhhwhE`h,h4h(!h&h,Ayh`hąh<"h #h$*:dhVqhTqhPh@ Bu;T531/-+)'%#!   erfA|5 |yY SzudMSD5 @}@@Cz@4}@s@ɪh@YT}@9@ZX@Ӫz@ u[M ,h u[M@L& &200'NTADATADATADATADATADATADATADATADATALwF8W8  `     wt J9fxɪh|Cz| Lde@  LV85N`v ,,g -68C .024 r`r   "`&&  fLfN  &&&,ɪh0Ӫz8NZXfZXt5 t t  4 & w, ,%,,  "2 2  2 2 &sw Q  w   vt + f 1 @ 5@@ @5@ 69l@ f1N1Ewl& & $ . &  l5  ewN 6" *(% $"e$s "3 &w` "` && }x$d "`   YT}4}xY zuD8^@ȫLq@`T@@.@w@#e@s@"s@ɪh@=x@ @CWT@R=h@ZX@ݩ[}@̪a @s@ u Jh=h u5,ww,w0wf,5-  w,, |@0A.W8,@4A2 S=x @.=h @.,8^& 0@.D |ݩ[}|wt 6f,5- ,w`4   t G8wHɪh.`T6#e :@.RCWTlwx"s |@.>,p.p0 p2p4 ,`BmC:m @e  m e,,PȫLqtL5-W-LfLfN 4    4 5 6,&# ,  tt ,.w:ZXt4t2t0t. 4 u6  ,  wFw.Bm:e%:CWTJwVs@ Z@.6la ,4  u6  w4 L5-efL wB@ ѕ̪a 0CWTBwdsfeQ- ,ѕѕ Ce QQCB @̪a b̪a Y SEzulSED0 @5 @@.@I@w@@h @ɪh@@x@ZG@CWT@;8@ZӪ8@ëKq@@EH@S`"@@C{Q@ u` zU-h u`5 4 w  t  %w ,w  4  09t t wfN S`"CWT,w2h , 6@.DӪ8> H@.TC{Qv|65 6 % 6 ,  v 5@4@@ /p-<* 9$w ,7 CWT*CWT8V0 dEHph  t@.w6 w/, v 5@5 5 55 @ <Ӫ8  @.;8 @.,~5 t55wuLuN5 5 5 4 A4     t@4wu:61I @.JwTCWTbv@x 9A 9=A@C:`˵1 A@ !  %`&4  t݇ ,5 XëKq`tZGl9ɪhY Ozu8OD5 @@.@w@@s@©,`@3(#@ZG@@ u8 h  u8     85 : "` 9pL5 N w,  &1"©,`4@ZG\3(#V `@.t5 4|&A6 5 6 4 & w00'V8s`f @f 5 0 &DLp-<* 9$w ,w0 w), v 5@ Y0 EH$h  (@.6Ӫ8( :@.F;88 J@.\t@  uLuN A4 t 4 5 4 4  @wfE5,5L\wf@x-u,u:69? 9;A@ A@  !  %`&4  45 bëKqj~ZGlt ww9f 2lfu<u>A4  %p-,p-< >p-<ɪhR0 v 92A@L%% @@ Nt4u:.w 54u.:@m:e 6EHLë. P@.Y N:=u=ND =u< \̪u h =u<` +3 3@    XY N(z1unN(DS~@[@)x@[o@ @($HrQ@ 1uo :KqhxR~h ZT&  1uo>w & 7.*.e.J [[o)x.* [o&)x.([o0)x<)x. ZT"" 1uo 1uohY Nz3uKNDs@s@s@@:+@7x@@x@V@,Pd@ 3uK ^Dbh*DMwh* 3uK1   55@  ͥ#@>E5uu  < 5@[,Vrs|W& AɥNfv & fA5e&5 4Q4 ea  5  #z,Pdj5 55U  u  5 w 5u ":+&7xBsJsR@xY Nz3u|qNDl@:@DZ@ɪwe@R@@s@@x@V@!@Z@:@RCr @ΪW@&@r@,Pd@ 3u|q J$hJh 3u|qee&5EU@5 @% eE5 UpʥIʵ5 t $Uʥ 5|5 u"-e.Iaat EUb8bbbr' w@5 J G e2Cr llrΪWz,PdB   e4 U5Up6"PAHX*U‹UA!BU```twUU Ke eB ʥe  Ї@ H5DZ`:hɪwer&G %`f 5 f  !&& & eP 5  8 !R,r2R:!D!V,Pdf:nɪwel5f  @5  t(( w 4 "4 &$ w`e ,rZ.RNsrVv@xPPH 8Y Nj3uItNDDZ@7x@@x@V@:@,Pd@ 3uIt 8J|h 3uIt< &&e eLPuw w&,Pd:7x.DZ6V:@xY Shz4ugShD:p@@Cz@4}@ɪh@7x00'^TADATADATADATADATADATADATADATADATA@@x@V@@S~@9@V@,Pd@" 4ug 8pŜh 4ug5 85 :5 <5 @CC  a # C ˥ C<  z33   A8 |  @ e 5,@ ͥw pwwww<3 Q4%&& f*V4@xB@S~ f&     & Q4    !  N`e ! & f N B,PdJ:pP7xt & %t"   v ` cQ$    $ & 0gB:  ^ Y :A<W" 1t F 1c5:ee B3e "43"lB Ί  c! ! Q4%8   &fA8   -5@ hV|T u8 %`6%    U9 4}DɪhHCzY Nz5u|qNDl@'@DZ@R@!@Z@y@o@ΪW@&@r@ 5u|q >i5uh 5u|q@`Bf@ΥY!T55W Υ5  A > ;`e Υ 1 % Υ &JRPlVΪWjrpZv&|Υ##e  APPH 8 5@f >:55&HJ1B2RlΪW,!2&6ZlXDZt, @%  : E͵L `Ӵӕ, J :؆*l,ʘ `BtΪWp585Υ  ` % 51 1 5BBl>ʥ]ʥ: N('.rl Nҕ. L&Bl.0Ҕ lȊ `Ewe  w @ ( CBojyZ a   e%/e.Ґqӥ0    eTY Qz5u>QD5 @}@T@@Cz@ɪh@@x@V@" @9@V@ZX@*Ӫz@ 5u> h 5u>E  u@!p@  &  >& xB  ʥ . BVJ" RV|B B <@   )@ e , 5 w @ :VNV\@x  t %` v . f  A85 8A:5 :   .  u8 2ɪh6Cz`nZXt   5E- 5f@6   N2   B2 6  5 9    @ < 6 6 Q66 6 6 v 5 D5 l `A-<u< "A< vu:  85>vm>  @   w 66 6f5   \6B  '5 >5@ B ^5 > @5@r> r@ /0$p0"r}@Tdd %@@ "* (A:@>  UUU3@BӪzRӪzfY NEJ9uSNED 9uS  ZTT VNhRrQhRY Oz=ulOD:@@.@7x@@x@©#@,Pd@ =ul ȫ`Thȫ h `Thh&  =ulG "Q5 ,,@  4  ,  LB&   wW-L0p©#j t@.P| uLu00'f8sJHwhTvhPh hT.h6DqhHh]fh  =u`n flf ws$e$fL " . {"{^{`ww& .Z*[.[oZ`"^@R~Y Nz?udNDl@:p@'@DZ@ɪwe@@@x@V@@S~@Z@ΪW@&@*,Pd@ ?ud (Xh ?udE@T5  9 6 3 . ' P& &e` 0e 2.l4ΪW:'@&DZR,Pdl:ppɪwe|  (@%  w !,8! U1(5E55e(5  B" $*DZ" e"J B) u IuI55 ,5 p%Ue&  Pt55  U  5wb U@E߁ w"V,@xN@S~l Y Oz@u~qODs@5 @$99E*5z5 |51 w 5e JCœ 5œ  w\53 3 & h. U U@ UG3  >& Nf  * && @& & Nf8 ot 0Zwp V5D% A VwJ\w e   >w  & s$96M$9pw$9J5 VZnBA%&  ^% 5E     ,@ DAD`wU5 2wRBe,l  'SY !@ʥ_ e 0ε%wX ,@   .ҕ: B n  W1SΕ[ B C`Δ > Ef&Nf& "W<W>W[W]dCB`קקw ?ҕ[e zҕ, pҕ] * ͋ 5 D wѕ. B@Ⳑs$9pws$96MB15   r; ( F BU1 1 1  w58Be8bbbeJb*.ZDZ\b#1 AA ܃ BP5U ueLEew\h@B 0 %!w Twwקק@w E52@S~Zae6s8$9:2T7xlY}r.|5 ȥ ȋ5ȋ1 1 "#Հ && pp f N5 h,Pdx:+~7x'`0  0   &f 0 &V &jɪh&t  K&1 ɪh,PdY P@tzBuP@tD5 @}@l @$9|@@x@ @L@ Bu j%8 5`0+&! D7x$9~Z($9X2$9<$9BF$9fP$9.Z$9d$9n$9Zqx$9|u 0 P 0 & %  5U ,$9#:'":q!,:r6:J,PdN:e G 16 z,* M` 4 ʥ,  , 0<U: .% 0et  8`ee 08 6D Bʥ-  % 17ʥ* 1Y%V5 'hT;jszs|T;w eCʥ9@& 0c R  ʥ72& 0cV +  42% x`0. ,5%l5  ʥ*5   0  # # # % 8w  1ʥ* ʥ%dy%Z$@e.!%'  & e a  A ҥ*B 40 Jʥ*ʥ7  d˕ ʥ" ʥaʥz‹  C^6 BBd5; ' Ee0 TT;VslsnT;wV &  N #  e0 `IҐ `e   8>Y QhbEukYQhD5 @7x@Y}@:+@,Pd@ EukY Lh EukY 1   .̥ @ $ ! 1  ŀ f&& pp   5 Y}h,Pdl:+|7x|Y N(RGur N(D7x@:@,Pd@ Gur PYh Gur T& e &  eL5 N.,Pd6:@7xY vhzHudvhD5 @:p@$9@$9f@:#@$9@s@7x@:@.@,Pd@ Hud ~t!h Hud & &   &  w   ͥ+ ,-..(,Pd0:pP,Pd|.  .U.m. Up ]< 65  ΊUE A    6 R:#\5 t X6 6 ev 66   .4.m t  `0 4"4 $e$t 6 "4 &&e  0 Dw&D& %%%,$,Pd.:DsV7xd$9fn$9x$9lpnY N(jhuN(DتW@5 @W@l @ɪh@̪a @ hu USZh hu 75 :  nq8 2 B"    2775 :B< Bm>(W4تW| <2 <C> > <נ+נ$ נ1ѕ נ0 :B>f<C4C#  | l̪a  . j555 5 5 5@u : u 4 .ѐ :ʋ  :: :C$t    5 l ɪh4Y Pzju[KPD5 @}@l @00'~TADATADATADATADATADATADATADATADATA@ɪh@9@.@ZX@ ju[K  Vh&WhNhOh  ju[KU C `5L H& && 5 r, r, ` ^ Eɪh| e(" eb `vl %  & ̥ 4 f f Q Ɋ  !5p,p, -f& & & C B ,.6.66  5555 B   H5 Z}t   &&  0 .   e q r,r,   Ê @eL  ZX>9FɪhL.  1 1 &V l ZXY NEzueNEDT@DZ@@J|@ɪh@9@ZX@Ӫz@@ ue JE$h  ueAAe@e@ BB& )`e %3@% .eRJ$    | B( & j 9 eLuw    Ȋet """$""0h &"(T8DZJ9RɪhzӪz$  && w ZX"J|Y NzueNDs@}@DZ@@J|@ɪh@9@Ӫz@ZX@@ ue jJm$h ue4  `Ete  E 4 bAe:uAH `@ e| K(@AɥIBu u IEU Pul u ul K  w BB0A5E W ݂C˥w < ͇H&DZvst Ȝ `Ȝ Ȝ  Bʥ ppN0ȋ е%8М 4 "H "H!fN0#&ee& le U E"% J# w N`vcQ`dH#H -DDZ%#҇wN j e$ Im a Im C˥DœAFH Š ef%ef  e0d Js AR4rrr R  R ֜ 0f t=p t& C˥we045   =0΋K s (E&ŀ&f& fS  y e eV}\4Q4 6dJ d΋H<!b 8=$" P`H ` 3X 8 V> .0(0 0 A<pp w& AFN   &54(AF eLw   &&J|8ɪh<ӪzJdZXnDZT  Ȋ9 ɪh|Y NEB=uNEDrQ@ =u  ZTT  ZTRRrQY NEz5u˖NEDs@t!@5!@Kq@R~@R'@DMw@[@[L @$9΅@T; z@Ӫ@zxR~@ 5u˖ S~h WTt WTh XT XTh YT ZTd)xh HT{{{:{{{{{{  WTff R'n nt!DMwӪ XT  ZT  5u˖  WT ( ( 5u˖666 { { { {  XT 5u˖TT``j 5u˖j 5u˖{  {   {  { 5u˖&f B%p j * ͋'% ͥ!ͥE%,  D5  PB   ZT00'8s 1uo>\\ WT XT WT Y N(z1uoN(Dt!@@j<@J@i5u@S~@R'@@DMw@[@ȫ @ @z@@)x@Ӫ@[o@ @($HpŜ@<@(X@rQ@©#@O@ 1uo :zKqhxR~h ZT& WTtBu;T xUqhIqhd{h0&hDT[h\\gh8u'hThH00'TADATADATADATADATADATADATADATADATAhlh z!thXU(hLhhwhE`h,h4h(!h&h,Ayh`hąh<"h #h$:dh"VqhTqhPh@ 1uo>w & 7.*.e.J [[o)x.* [o&)x.([o0)x<)x. ZT"" 1uo 1uo WTP(Pv©#O  <ȫ  j<pŜR'(XJ i5u"t!$DMw&ӪBu;T|531/-+)'%#!   erwzS~Y N(z1usN(Dy@S~@ XT@ WT@rQ@ 1uo KqhxR~h ZT` WT 1uow v y ZTZ Z$ 1uo WT XT WT Y N(z=uN(Ds@.@ w @ | @ x @ { @ y @`"@$9΅@@R~@y@ z @z yh R~h@GhHwh=u Wh}h 8^hv~h hvhh8.hDqhh]fh =u5Lxn ff ea ENe LuHBw E Aaa &EC e.*Ec 6.$Z JyV6P pj | {XE" Qc  & &f& e  fuZe^`.e-..("f P#.(&eXw$ߥ(1& & & &   e[K [qr& & a9 e ڇ %($,$9΅.sFt N,%e% P   w$ D`"%  .w~wwpa ^ @ .=u~@R~=up< w B x H y N z T { Z | |     $$ ((  ,0<84Xt@D, H    Y N(z=uN(D.@ w @ | @ x @ { @ y @`"@Z@@R~@y@ z @ zyh R~h@Gh=u WhZ}h 8^hTv~hTHwhj hvh^h4.hVDqhTh]fh =u5Lxn faAwENe LuH w aDE{X{.{^{` N,%0.$ $ZFyLF | Pw `"wjw=uj@R~wb      $$ ((  ,0<84@D,.=ub w  x  y  z  {  |  H   hY N(z=uN(Ds@.@ w @ | @ x @ { @ y @`"@$9΅@@R~@y@,Pd@z z @ yh R~h@GhHwh=u rWh}h 8^hv~h hvhh8.h"Dqhh]fh =u5Lxn ff ea ENe LuH=w E Aaa &EC e.*Ee{X6.$Z JyV6P pj |E" Qc & &f& e  fu%e.e.(P(eXw$^P v$~`% N/,%e% PQ4& ߥ1 8PKQr 8&9 %솀w., D$9΅FsR,Pd|`"%  .w wwa ^ @00'(8sHea>He>He>Ht[SMtS~d xR~]x_~d 0Zs>Hr;>H40<MM.6807w@R~@S~}[Md Ӫ:۪s,M۪.M[SM MfM($!bR'R|d0Rd>HRM>Hvd ..]Wd [lMQmMnM.d Kq!bw>H@xy fM`"T]V;]hijkl~d ƫ80ƫ0ƫ0̫Mͫ[SM00(TADATADATADATADATADATADATADATADATA00(8sur'0>uT(dN>u\(>H>ud(M@utqBu]Bu_:BuswButwanY Ď|#ĎL {4fC~w  ~@h"h@{80{&h{ShY Ď|8eĎL {Jw  5E5 ettCtt@@ii@{8F{/hY Ď|:eĎL {Jw5’6t @ vtB@A  6t@@P5 ii@{8F{hghY ĎR|vĎD {0Fkh*hhjhih  {Jf f &f &ff  Y NEzx NEDRd@r;@e@ea@e@e@@G@@s@ (x  ,wwwwwwwww8 @GRdeeea"e&r;*s Y Nb3u|KN00(TADATADATADATADATADATADATADATADATADs@s@@x@V@ 3uK ^DbhDMwh 3uKb  ͥ#@>E5uu  5 w 5uV:sBsJ@xRY NJ3u[NDm @ 3u[ RFdhs< 3u[f&f&6 ff I % % % %   Be !!!`  b\ |u 5 %  Ce |  ` %%# #$)fC  Ae@ Ct% . fU U \m ^U M U B eU M eU U M  D0% %D0% a aeJZ2L s@NAJBEFRAMRPAYAMNUJLUJGUAPESTCOVONCEDm<<Y NEr=u\HNEDs@DZ@7w@C29@@S~@V@C8@ =uYH Ӫh =uYHdbD D/5% %%  S0Ԋ8cP @"sJ C29|D%b w w5 tBh?lLjU@055 *C80s67w  w@pK5˥t)) ‹5Up55&DZHt@A55U4 H &fw6VF@S~8Y Oz@utqODz@s@5 @$9$98b5 dBAw ևB  u BEC`"  D ccє D ɔɥaɥzɥ y(. fۇ&e # 5efEB`F ~ . ӥ:  ӥ:@! $&5 \  @! U`eUU5U mɥ[ɥ<"@  ˥.   0Q UDeĤ _ Uċ5E  lU0 E pU5 . 5E0 U L. x; n Ċ- bUT " & N ӥ"   U5CM% E A5Q`C _C&  A &5 ˥A˥Z.˥a˥z(˥ ˥ ˥˥˥ ˥*˥% ˥$˥_  ˥0 ˥9 ˥7 U   "L ˋ˥ ˥ LY N(zBuswN(D5 @v~@.@Dq@]f@ Buw shshshshshz.haeh`"hDZh7whC29hZh@xhVh>h@S~h@R~h" h:.h,Vh<"C8hDZhyh  BuwN*PU5D e0  S  ,rw ` @@ % %P! < 05.v~|E 505@00(8s 5V .> 54 .C3 3  R1o)x.>1o N,1o.)x.2>41o8lS~Z)x.\1o`1o.|,, UEs3w&& $)x&()x&,1o ZTPP^ 1uo^XXd 1uod\\  WT XT WT VV   VTY N(z1u.N(DS~@lS~@1o@[@ XT@ WT@)x@[o@ @($HrQ@ 21uo Kqh ZT` VT& WT 1uo 5V .* 54 .C3 3  ,, UE: 1o)x.* 1o$lS~F)x.H1oL1oP|s3w&& & 7..e.Z)x&)x&1o"[*[o,)x.02[o8)x.:[oB)xN)x. ZT"" 1uo 1uoPPJ 1uoJXXP 1uoP\\t$ WTt XT WTr VV   VTY N(z1u/N(Dt!@@j<@J@i5u@S~@lS~@R'@@1o@DMw@[@zȫ @ XT@ WT@ @@@)x@Ӫ@[o@ @($HpŜ@<@(X@rQ@z©#@O@ 1uo Kqh ZT` VT& WTBu;T xUqhIqhd&hDT[h\\gh8u'hTzhHhl!thXh U(hLhhwhE`h,h4h(!h&h,Ayh`hąh<B"h #h$:dh{h0VqhTqhPh@ 1uo 5V .* 54 .C3 3  ,, UE: 1o)x.* 1o$lS~F)x.H1oL1oP|s3w&& & 7..e.Z)x&)x&1o"[*[o,)x.02[o8)x.:[oB)xN)x. ZT"" 1uo 1uoPPJ 1uoJXXP 1uoP\\t$ WTt XT WTr VV  VT WTP(Pv©#O  <ȫ  j<pŜR'(XJ i5u"t!$DMw&ӪBu;T|531/-+)'%#!   erwzS~0Y N(z1u3N(Dy@S~@lS~@1o@ XT@ WT@)x@rQ@00(8sur'K@QLz5 @ah@q@@<@f@awe@T@̫@ f@ @n@[l@۪.@Qm@ Gw@ BB %  JLf  B @ Հ @0 1  0 w@ h>frh|f  B @ Հ @0 1  f@ @f 1  w fhfvj @ e`e۪s, Q0 l6 6 6 Uv @ eah  8`e۪s,6 @l -w-  6 6 ̵96   a e6 Nah> \qaa a e !-tm&E& e f %   .q^{/8 `e etce5 wew l t B tm&E& @j~{/e N C    m   m6 / mtm&E& t Ѐm   ee ^{/0 Հ m e-> :   @mCm B !  mm  ~  C B`m  ew @ a ` afNla0iZq( F   a 6  B t v  W e  a ewCe" t 'qVq`je`&  en ` @tmfE& e t @  w@    ɵ   w f!Qm ${/Fixj :&c& &a @`": @`"" C`D$ @ @`"6x4q$ $ @`:  @`:@` @ >m(6  m666ma mzq2e  @`  ȋ @`"96B  ` `>  `"  UB @`"  ` B   66  E(>& &&(ewC6ofj* N`N` )m # m6a e m a  Dqdq>e w ɕ [@ N`e ,N` ]  ewh~j"   tEm 5ENUme ! f & 6 fE@E UP5@5 a ewB e@h @`e۪s, lf     % f5 La  "a "6  6 a ah Bqn |a  @6av e a efA 2  fAqLq a ae a T e6v aa  qtqf ea ewABa 6a  @6       q iLq     &       00(TADATADATADATADATADATADATADATADATA U v6 6   ^ W      vvW    ve W   ve&  a  a  5 a  a a 5a a(qTqdqnV  a e5v e  a 5=6  @ Bt @ e qJq `6R W a aa a na ea  Ke! f  "q\qpq< fA N a Neae a  668q aa  ea eff@ @)@m&fe  N q8q4%w @  W-  fL w6 6 aa @+ '@" jhq6  a C) a  6v)6a vva 4 2@@m ,qLqbqv,      aa ewBAe4C`eVq`j*m&6-$-  e[l `m e f E-N f - 4 tme̫ a ` e̫ h*`3  e%w@ ɵ C`v6'D`N`ɵ Ӄo  Cm̫( *jn l6ɵ lv6 @ a& a& N t' eebed e0  e   e ( e& :4a& a& N a ez2 2qL{;   $ Gjjw & 6    r@ rd   Wt@ r Wpd@ r    tiWt Wpd@Wp @` me0H %wf(((@@^&_  Baʕ Djb W 36e Bm W   v` E  B`": W ~v6a W sB`:3 n@`TB` e6 6    mW XW UW:HW"Fm6 -:!6 amZ6-E U@ @`-Y3 nV-"6 mm e 8mJ  am B҂-%m Bae -wW    ":E U@  eWtEERrPew)@7C5 LR@ E  C6 ` 5 L L -jnTz۪s,@G?f@GEf@{/@j@i@h@G8,4hlF2hhƫhLyqh LUsh ƫ8h@ b*(D@ E6   L 5 L L %NT($x  ^   X 2*ƫh R|dh68h$h\L{;lY @Q>u\(@QL L{;p`P@0 p`P@0 p`XP@0 p`P|@0 p`P@0 p`P@0 p`P@0 0(XddPh@@@z5 @ah@f@q@@<@D0X@ad@T@;@Fd@̫@ @n@[l@|t( x @Hd00(8s  `5 @t> 6 m @tm&fE"m Et&E e|{hg !cȋ e   oet6 /a mm  Q < 2f0- v`@a> v  v`@a> J  b`      C`m > ew @ `> `> 6``@b  ` a` j^a e6 6t  D A   Db>    Db6   Db>    Db6  5 EUE - ew A  o6e I FjV@ a o " ! `6a e ma  qVqvq  me w A@&? < 9e N`tEa   (L tEB`mCmjNʜ D @&eWtEaH>   w >  e@  a,  :j^C` eeb & ea6  m]   e ,$ eb  f e "  L{;L  GL L @6      e w @&*>  t@`&E& e 2 66ij{/ 6ee 66 E66P t>P %f   f  D Ee wf@mBm W    Dee@mCm D  e ej  &  TLef   f  REe fA  wAFdvj*< C 6 6  e`e"۪s,X  eb mE5 L       q& %  - 1    vah`  F<h< e vE a & e  q L5 L5LEvUa (<Z W-LW-L ef@6 veL a >,xa @E  AaNqjq  af a \ a ea >,[@E &Aa 00(TADATADATADATADATADATADATADATADATA>qRqR af a  a ea >,"afeN a 4qHq  a eew@ a @   `ɋ  eq(iBqJa e wC &65 W-  pL w66E- 66-qj 66 @@6  a   afe&a <a 0qnqB5 (aB" a  v@@l6Aa@a-  gL <q65 Nv5 @b   a ua ew@Nqjqtj: ɵ  Bov6ɵ `5v5plv65  5vB6 @ aa& N z3 eeb e4 e e eT   e,    e e|  $eL " ,aa& N a e*5 N`v6 Cbv6  * 2q  a eqL{; $,4< Gw & 6   Bm0  e76% -`60   t Wt@` @` j8 Wpd p ` `L%w @:CD E!!  W-  !!  *jdTlD0X~D0X! !   ' $D@ E  W-& #  & w, T*D0XXT\;nTr;xad0@tE5    ALW  uNh uLx @h5  uL h)LAaW"g@E h@E 8@t @ e@`55  @NE  huNL ( =LAa@E  u u uH   @  P ` p @E e`5x z۪.@Qm@۪s,@G?f@GEf@{/@j@i@h@{hg@L{;whG8Rdhh u*J Z  n " V B x2eh0 ehv eh eahVr;h\sh.D Y s@Q>ud(s@QL L{;$        ! "3    .    1 0  (   2\ ((  ) 8  v4()      * .3256 5      EA) ('1PH |?1[ $?1@ 0@` $`B 0 $Gt0 Dz $2/ 00(8s!     $ 0 e  0x_~Nx_~ 5N5OUNT  5 N5OU N> ! 5!N5OU0N$ " A ̵W ̵ W ̵  @N   LewAthx5 ~B T@` ȕȕ ȕ w)v0 0 5 L5 N5 5  0 Lj4Na:Naea>  7@E (   &   @E P ,x_~fx_~|v,  &    tmE& e w,0 5 L5 N  5CeLex_~H{/*6`5v q  e  @`e   l N CeL5&    p&   & +   .x_~Xx_~tx_~,  @E ,e`E e   @`e  R l N & % f w  We  "x_~Bx_~8 a> 0   =eR  x_~(x_~J  @` WtmN&E& e &     L00(TADATADATADATADATADATADATADATADATA0 H  *{/@x_~~ @E ,@E 0$ e wf 0 0 LDa 5 N5 5 4Ca`e:x_~Dj@ m  t`&E& e      u   h,P>  ({/>x_~Lx_~Zx_~tx_~< 0 0 em   J eR  &x_~ ` Wt`N&E& e *  1 10    &  "{/%w eAAC!PjV5 !2Rr22 `` e !  !  !px_~ze@e@ea@F2@e@68@@r;@s@{/@j@i@h@L{;XFo'hzF'hrhhh:Frh}[hMhnͫ[Sht[ShRh[Sh6̫hN hnh fh[lh.P!!!!> 2  L{;NN0 PX R T( V` X Zp \     " T  Z  `  f  l  r  G>\  ` ( P ~* \ ($.  Ddh@ j۪.hQmh۪s,hG?fhGEfhRG8zahhqh <h hfh+^%)hBY NzBuNDs@5 @$9΅@Dq@ Bu >.hTadhawehafh*;hTh"ThxR~hnD0Xhp Bu P 4 P  1u(A  ) D̥  h5 s*$9΅Z5 |uu <#A0< 5 E # *A( w D j!55 RDq8 8"4 p  0 4 5   N" ; B  ,B D!5 4te ! D5e`w eE< .f .2  , ,pR l J a b!&f 4Y NzBuNDs@5 @W@l~@$9΅@@v@C< @Dq@ Bu .hJadhTawehafh;hjThvThpxR~hD0Xh Bu  4 PJ!  3  H  1u(! 4 -&C< BsL$9΅hDq|HE} H A  )   00()8suT(NEL L{;p`P@0 p`P@0 p`XP@0 p`P|@0 p`P@0 p`P@0 p`P@0 0(XddPh@@@|t( x @Hd GL D0Xad:5 @D0X@ad@L{;whG8ahhY Nz4uND @.@ @af@ah@xR~@ 44u rWhj@Gh\l~hdh:2vhnC< hd.hfDqhdx_~h" 4uv%N*  PS(5 FwaAENe w  u aDTE{V{.{^{`8$ah* $ @afF.TN 8ww   $(,0 $44u xR~  whG8ahh<0b *@n00)TADATADATADATADATADATADATADATADATA z V ]  H IS: <  R  I  3 Tz *{T& J! `" $Nw* 2 & 5 (b; 0 G 1 \K 3zK c=M RK baT sX_ J@T` zd 6d :e ;vf Jq`6:w Bx _x My My3Nz z} D4 c wTb  .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 .ENDM4b  .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 .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 .ENDMb  .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' 2V) VS.32B='B' 4 ; VOLUME USING 32-BITS LBNSl6V.FFNU:'L'.BLKB 1 ; FIRST FREE INDEX FILE BITMAP BLOCK9V.LRUH:'L' ; POINTER TO START OF LRU DIRECTORY STRUCTUREC+V.EXT:'L'.BLKW 1 ; POINTER TO VCB EXTENSIONBV.HBLB:'L'.BLKW 2.V.HBCS:'L'.BLKW 2.DV.HFBK:'L'.BLKW 1 ; high order portion of free block (if VS.32B set);V.FFSB:'L'.BLKW 1 ; First free bitmap block with free spaceP V.LGTH:'L' .ASECTO.=0BM.LNK:'L'.BLKW 1M.TYPE:'L'.BLKB 1' MT.MLS='B' 1WM.ACC:'L'.BLKB 1M.DEV:'L'.BLKW 1M.TI:'L'.BLKW 1 M.LEN:'L'  .ASECTE.=0GF.LINK:'L'.BLKW 1FF.FNUM:'L'.BLKW 1SF.FSEQ:'L'.BLKW 1I .BLKB 1F.FSQN:'L'.BLKB 1N00)8s; IN 32BIT LBN DEVICES, 256 GROUPS OF BLOCKS WILL BE LOCKED BYF; EACH LOCK BLOCK. IT IS ASSUMED THAT A CONFLICT WILL BE MINIMAL USING; THIS STRATEGY.;, .ASECT..=01L.LNK:'L'.BLKW 1L.WI1:'L'.BLKW 1L.VB1:'L'.BLKB 1L.CNT:'L'.BLKB 1 .BLKW 1 L.LKSZ:'L' .PSECTE .MACRO F11DF$ X,Y,Z .ENDM F11DF$T .ENDM F11DF$Op b  .MACRO CCBDF$ L,B,LST .IIF NB LST .LIST .SAVE .ASECT .=-2C.URM:'L' .BLKW 1LC.LNK:'L' .BLKW 1DC.RSV:'L' .BLKB 1MC.BID:'L' .BLKB 1 C.XACP:'L'C.NSP:'L' .BLKW 1DC.LIN:'L' .BLKB 1OC.STA:'L' .BLKB 1CC.FNC:'L' .BLKB 1 C.MOD:'L' .BLKB 1DC.STS:'L' .BLKW 1L C.BUF1:'L'C.BUF:'L' .BLKW 2T 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.XTC:'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='00)TADATADATADATADATADATADATADATADATAB' 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$*b  .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$'b  .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'20000=ZF.INI='L'40000LZF.DVP='L'100000ZS.ASN='L'100000ZS.BSY='L'140000.IIF NB LST .NLIST .RESTORE: .ENDM PDVDF$.b  .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$Cb  .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$MPb  .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='00)8s, .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 b  .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' ES.SST ='B' 20' L E$CCMD ='B' 1T E$SSTA ='B' 1S E$SSWI ='B' 2' E$SAPP ='B' 3' E$SBAC ='B' 4 E$SSHO ='B' 5  E$SCHL ='B' 6D E$SSST ='B' 7 E$CERR ='B' 2 E$SDVH ='B' 1 E$SDVS ='B' 2 E$STMO ='B' 3 E$SUNS ='B' 4S E$STMS ='B' 5 E$CDVI ='B' 3S E$SDVI ='B' 1S E$CDCI ='B' 4E E$SMOU ='B' 1E E$SDMO ='B' 2E E$SRES ='B' 3E E$SRCT ='B' 4E E$CMEM ='B' 5E E$SMEM ='B' 1L E$CSYS ='B' 6T E$SPWR ='B' 1S E$CCTL ='B' 7' E$STIM ='B' 1' E$SCRS ='B' 2 E$SLOA ='B' 3  E$SUNL ='B' 4D 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'00)TADATADATADATADATADATADATADATADATAE$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 .ENDMb  .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$Ab  .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 .BLKW 1H.LUTE:'L'.BLKW 1'H.GARD:'L'.BLKW 1'H.NLUN:'L'.BLKW 1'H.LUN:'L'.BLKW 2H.FPSL='B'25.*2L.=0WW.BPCB:'L'.BLKW 11W.BLVR:'L'.BLKW 1WW.BHVR:'L'.BLKW 1.W.BATT:'L'.BLKW 1'W.BSIZ:'L'.BLKW 1.W.BOFF:'L'.BLKW 1.W.BFPD:'L'.BLKB 1+W.BNPD:'L'.BLKB 1 W.BLPD:'L'.BLKW 1E W.BLGH:'L' WB.NBP='B'20 WB.BPS='B'40 .PSECT. .MACRO HDRDF$ X,Y .ENDM .ENDMb  .MACRO HWDDF$,L,B,SYSDEF  .MACRO CRESET NAM,ADDR.$$$=0. .REPT 8.R CRENAM NAM,>,\$$$ $$$=$$$+1. .ENDR .ENDM .MACRO CRENAM NAM,ADDR,N 'NAM''N'==ADDR .ENDMMPCSR ='B'^O177746MPAR ='B'^O172100PIRQ ='B'^O177772 PR0 ='B'^O0KPR1 ='B'^O40PR4 ='B'^O200'PR5 ='B'^O240ZPR6 ='B'^O300OPR7 ='B'^O340.PS ='B'^O177776SWR ='B'^O177570TPS ='B'^O177564KXCSRA='B'^O177520KXCSRD='B'^O177530KXJQIR='B'^O177532KXCSRF='B'^O177534KXCSRH='B'^O177536KMCR ='B'^O177734 .IF DF E$$EAEAC='B'^O177302MQ='B'^O177304SC='B'^O177310 .ENDC .IF NB B\ CRESET KINAR,<^O172340> CRESET KINDR,<^O172300> CRESET KDSAR,<^O172360> CRESET KDSDR,<^O172320> CRESET SISAR,<^O172240> CRESET SI00)&8s CRESET SDSAR,<^O172260> CRESET SDSDR,<^O172220> CRESET UINAR,<^O177640> CRESET UINDR,<^O177600> CRESET UDSAR,<^O177660> CRESET UDSDR,<^O177620> .ENDC .IF NB SYSDEF .IF DF K$$DAS CRESET KISAR,<^O172360> CRESET KISDR,<^O172320> .IFFM CRESET KISAR,<^O172340> CRESET KISDR,<^O172300> .ENDC .IF DF U$$DAS CRESET UISAR,<^O177660> CRESET UISDR,<^O177620> .IFF  CRESET UISAR,<^O177640> CRESET UISDR,<^O177600> .ENDC .ENDCUBMPR ='B'^O170200CMODE ='B'^O140000PMODE ='B'^O30000ECSMODE='B'^O40000PSMODE='B'^O100002SR0 ='B'^O177572SR3 ='B'^O172516CPUERR='B'^O177766MEMERR='B'^O177744MEMCTL='B'^O177746N.KEY='B'^O173054.N.UPT='B'^O173064DN.DZA='B'^O173074IN.DWA='B'^O173104EN.DAY='B'^O173114>N.MON='B'^O173116IN.YEA='B'^O173120E FE.EXT='B'^O12 FE.MUP='B'^O2. FE.EXV='B'^O4CFE.DRV='B'^O10FE.PLA='B'^O20FE.CAL='B'^O40FE.PKT='B'^O100 FE.EXP='B'^O200FE.LSI='B'^O4001FE.OFF='B'^O1000FE.FDT='B'^O2000FE.X25='B'^O4000FE.DYM='B'^O10000'FE.CEX='B'^O20000'FE.MXT='B'^O40000'FE.NLG='B'^O100000 F2.DAS='B'^O1 F2.LIB='B'^O2P F2.MP ='B'^O46F2.EVT='B'^O10F2.ACN='B'^O20F2.SDW='B'^O40F2.POL='B'^O100PF2.WND='B'^O200.F2.DPR='B'^O400F2.IRR='B'^O1000F2.GGF='B'^O2000F2.RAS='B'^O4000F2.AHR='B'^O100003F2.RBN='B'^O200002F2.SWP='B'^O40000EF2.STP='B'^O100000 F3.CRA='B'^O1A F3.XCR='B'^O2L F3.EIS='B'^O4TF3.STM='B'^O10F3.UDS='B'^O20F3.PRO='B'^O40F3.XHR='B'^O100F3.AST='B'^O200F3.11S='B'^O400F3.CLI='B'^O1000F3.TCM='B'^O2000F3.PMN='B'^O4000F3.WAT='B'^O100000F3.RLK='B'^O20000 F3.SHF='B'^O400002F3.SEC='B'^O100000 F4.CXD='B'^O1N F4.XT ='B'^O2W F4.ERL='B'^O4LF4.PTY='B'^O10F4.DVN='B'^O20F4.LCD='B'^O40F4.NIM='B'^O100F4.CHE='B'^O200F4.LOG='B'^O400F4.NAM='B'^O1000F4.FMP='B'^O2000F4.DCL='B'^O4000F4.DDS='B'^O100000F4.ACD='B'^O20000AF4.NCT='B'^O400003F4.LSD='B'^O100000 F5.PRO='B'^O1S F5.DFB='B'^O2O F5.RTB='B'^O4RF5.ODB='B'^O10F5.XDJ='B'^O20F5.NSY='B'^O40F5.NCO='B'^O100F5.RTK='B'^O200F5.RDR='B'^O400F5.RLG='B'^O1000F5.LDR='B'^O2000F5.VTL='B'^O4000F5.ANT='B'^O100000F5.NRT='B'^O20000NF5.EXE='B'^O400004F5.CMO='B'^O100000 F6.SLS='B'^O1N F6.UBM='B'^O2D F6.ICP='B'^O4MF6.SWB='B'^O10F6.ACK='B'^O20F6.ABO='B'^O409F6.Y2K='B'^O100 ;DISPLAY ALL YEAR FIELDS AS FOUR DIGITSS8F6.32B='B'^O200 ;EXECUTIVE SUPPORTS 32-BIT LBN DEVICES=F6.ISO='B'^O400 ;DISPLAY ALL YEAR FIELDS AS ISO 8601 FORMAT;+ HF.UBM='B'^O1X HF.EIS='B'^O2N HF.QB ='B'^O4NHF.DSP='B'^O10HF.SWR='B'^O20HF.KXJ='B'^O40HF.RMT='B'^O1000HF.CIS='B'^O2000HF.TOY='B'^O1400HF.TY0='B'^O0400HF.TY1='B'^O1000HF.KDJ='B'^O2000HF.UME='B'^O4000HF.BMV='B'^O10000'HF.XME='B'^O20000DHF.FPP='B'^O100000 H2.NVR='B'^O16 H2.INV='B'^O26 H2.CLK='B'^O46H2.ITF='B'^O10H2.PRO='B'^O20H2.BRG='B'^O100000 SF.STD='B'^O1' SF.PGN='B'^O2IMP.CRH='B'^O100000MP.PWF='B'^O40000'MP.RSM='B'^O20000AMP.NOP='B'^O10000S MP.STP='B'^O4MP.INT='B'^O7777 .MACRO HWDDF$ X,Y,Z .ENDM .ENDMb  .MACRO ITBDF$ L,B,SYSDEFF .IF DF A$$TRP .MCALL PKTDF$ PKTDF$' .ENDC .ASECT' .=0X.LNK:'L' .BLKW 10X.JSR:'L' JSR R5,@#0X.PSW:'L' .BLKB 1B .BLKB 1X.ISR:'L' .BLKW 10 X.FORK:'L' .BLKW 1 .BLKW 1 .BLKW 1 .BLKW 1 .IF DF M$$MGEX.REL:'L' .BLKW 10 .ENDCX.DSI:'L' .BLKW 1'X.TCB:'L' .BLKW 1' .IF NB SYSDEF .IF DF A$$TRP .BLKW 1X.AST:'L' .BLKB A.PRMR .ENDCX.VEC:'L' .BLKW 1OX.VPC:'L' .BLKW 1O X.LEN:'L'' .ENDC .PSECT .MACRO ITBDF$ X,Y,Z .ENDM ITBDF$ .ENDM ITBDF$b  .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$K.CPU:'L' .BLKB 1KK.OWN:'L' .BLKW 1:K.CRQ:'L' .BLKW 2:K.URM:'L' .BLKW 1NK.FRK:'L' .BLKW 1$.=-20.KE.UMH:'L'.BLKW 2BKE.UMC:'L'.BLKW 1.=177776KE.RHB:'L'.BLKW 1 KE.UCB:'L'.BLKW 1' .PSECT KS.OFL='B'1C KS.MOF='B'00).TADATADATADATADATADATADATADATADATA2, KS.UOP='B'4D KS.MBC='B'10 KS.SDX='B'20 KS.POE='B'40 KS.UCB='B'100S KS.DIP='B'200 KS.PDF='B'400:KS.EXT='B'1000KS.SLO='B'2000KS.MRC='B'4000KS.CPU='B'10000B .ASECT..=177762S.PRI:'L' .BLKB 1BS.VCT:'L' .BLKB 1BS.CON:'L' .BLKB 1B .BLKB 1 .BLKW 1S.CSR:'L' .BLKW 1B .BLKW 1 .BLKB 1 .BLKB 1S.OWN:'L' .BLKW 1. .ASECTB.=-4K1.CON:'L'.BLKB 1$ .BLKB 1K1.STS:'L'.BLKW 1K1.MAS:'L'.BLKW 1K1.OWN:'L'.BLKW 1'K1.CRQ:'L'.BLKW 2' K1.UCB:'L' .PSECTS .MACRO KRBDF$,X,Y,Z .ENDM .ENDMb  .MACRO LBLDF$ L,B .ASECTU.=0'R$LNAM:'L'.BLKW 2R$LSA:'L' .BLKW 1SR$LHGV:'L'.BLKW 1OR$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$SMV='B'010000LD$SCL='B'000200LD$AMK='B'000060LD$RES='B'000040LD$SUP='B'000010LD$REL='B'000004LD$TYP='B'000002.=0AL$BTSK:'L'.BLKW 2.L$BPAR:'L'.BLKW 2L$BSA:'L' .BLKW 1 L$BHGV:'L'.BLKW 1UL$BMXV:'L'.BLKW 1BL$BLDZ:'L'.BLKW 1BL$BMXZ:'L'.BLKW 1BL$BOFF:'L'.BLKW 1BL$BWND:'L'.BLKB 1BL$BSYS:'L'.BLKB 1BL$BSEG:'L'.BLKW 1BL$BFLG:'L'.BLKW 1BL$BDAT:'L'.BLKW 3B!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 12L$BHRB:'L'.BLKW 10L$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$L$BAPR:'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$ .IIF NE .-1000, .MEXIT'LB$REV='B'000401TS$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 .PSECTL .MACRO LBLDF$ X,Y .ENDM .ENDM b  .MACRO PCBDF$ L,B,SYSDEFB .ASECT..=0EP.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 10P.NXBA:'L'.BLKW 10 .BLKW 2P.HDLN:'L'.BLKB 1'P.IOC:'L' .BLKB 10$$$=.SP.RRM:'L'.BLKW 1 .IF NDF M$$PROS.=$$$' .ENDC .IF NB SYSDEF P.LGTH='B'.0 .ENDC.=0'P.LNK:'L'.BLKW 1P.PRI:'L'.BLKB 1P.RMCT:'L'.BLKB 1YP.NAM:'L'.BLKW 2P.SUB:'L'.BLKW 1P.MAIN:'L'.BLKW 1SP.REL:'L'.BLKW 1 P.BLKS:'L'P.SIZE:'L'.BLKW 11 .BLKW 1P.SWSZ:'L'.BLKW 1.P.DPCB:'L'.BLKW 1BP.TCB:'L'.BLKW 1P.STAT:'L'.BLKW 1P.HDR:'L' .BLKW 1 .BLKW 1P.ATT:'L' .BLKW 2P.HDLN:'L'.BLKB 1P.IOC:'L' .BLKB 1$$$=.'P.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 1YP.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.UBS='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)68sTADATADATADATADATADATADATADATADATARECE:'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 .ENDMb  .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 9S2.PRT='B'20000 ;DEVICES SUPPORT PARTITIONING IN DRIVER.;+ S3.DRL='B'1 S3.NRL='B'2K S3.SIP='B'4L S3.ATN='B'10 S3.SLV='B'20 S3.SPA='B'40 S3.SPB='B'100' S3.OPT='B'200OS3.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'.L .ENDC .PSECT' .MACRO SCBDF$,X,Y,Z .ENDM .ENDMn b  .MACRO TCBDF$,L,B,SYSDEF0 .ASECTQ.=00T.LNK:'L' .BLKW 10T.PRI:'L' .BLKB 1TT.IOC:'L' .BLKB 1IT.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 31T.IID='B' T.LBN+11T.LDV:'L' .BLKW 11T.PCB:'L' .BLKW 11T.MXSZ:'L' .BLKW 1T.ACTL:'L' .BLKW 1T.ATT:'L' .BLKW 2RT.ST4:'L' .BLKW 1NT.HDLN:'L' .BLKB 17T.LBNX:'L' ;HIGH ORDER BYTE OF LBN FOR 32-BIT DEVICESNT.TKI:'L' .BLKB 1RT.GGF:'L' .BLKB 1OT.TIO:'L' .BLKB 1CT.EFLM:'L' .BLKW 2T.TKSZ:'L' .BLKW 1$$$=..T.OFF:'L' .BLKW 1. .BLKB 1T.SRCT:'L' .BLKB 1T.RRFL:'L' .BLKW 2 .IF NDF P$$LAS.=$$$' .ENDC .IF NB SYSDEF$$$=.T.CTX:'L' .BLKW 1 .IF NDF N$$DIR1.=$$$: .ENDC$$$=..T.OCBH:'L' .BLKW 2T.RDCT:'L' .BLKW 1 .IF NDF P$$OFF.=$$$' .ENDCT.SAST:'L' .BLKW 1$$$=.TT.RRM:'L'.BLKW 1T.IRM:'L'.BLKW 1T.CPU:'L'.BLKB 1 .BLKB 1 .IF NDF M$$PROB.=$$$L .ENDC$$$=.ET.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'4000TS.RSW='B'2000TS.STP='B'1000 TS.CKR='B'100= TS.BLC='B'37TS.BLK='B'177777T2.AST='B'100000T2.DST='B'40000NT2.CHK='B'20000'T2.REX='B'10000'T2.SEF='B'4000T2.SIO='B'1000 T2.AFF='B'400. T2.HLT='B'200L T2.ABO='B'100B T2.STP='B'40 T2.STP='B'20 T2.SPN='B'10 T2.SPN='B'4. T2.WFR='B'2N T2.WFR='B'1=T3.ACP='B'100000T3.PMD='B'40000KT3.REM='B'20000$T3.PRV='B'10000NT3.MCR='B'4000T3.SLV='B'2000T3.CLI='B'1000 T3.RST='B'400' T3.NSD='B'200G T3.CAL='B'100C T3.ROV='B'40 T3.NET='B'20 T3.MPC='B'10 T3.CMD='B'4' T3.SWS='B'2' T3.GFL='B'1CT4.RON='B'20000'T4.RIN='B'10000'T4.P0 ='B'4000T4.LRW='B'2000T4.LBW='B'1000 T4.DFB='B'4002 T4.FMP='B'2002 T4.CTC='B'1002 T4.MUT='B'40 T4.LDD='B'20 T4.PRO='B'10 T4.PRV='B'4' T4.DSP='B'2' T4.SNC='B'1'TR.UBT='B'100000TR.UBS='B'40000WTR.UBR='B'20000'TR.UBP='B'10000'TR.UBN='B'4000TR.UBM='B'2000TR.UBL='B'1000 TR.UBK='B'4003 TR.UBJ='B'2003 TR.UBH='B'1003 TR.UBF='B'40 TR.UBE='B'20 TR.CPD='B'10 TR.CPC='B'4' TR.CPB='B'2' TR.CPA='B'1' .ENDC .PSECT .MACRO TCBDF$ X,Y,Z .ENDM .ENDMb  .MACRO CTBDF$,L,B,SYSDEFL .ASECT0.=177756L.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 00)F8s,....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,

N FUNC MEM,005,006,<> FUNC STN,006,006,R FUNC HRC,007,006,M FUNC ONE,010,006,A FUNC STA,011,006,  FUNC IF ,012,006,. FUNC RLI,013,006,L FUNC RUL,014,006,<' FUNC MBO,015,006,T FUNC RSW,016,006,R FUNC WAT,017,006,E FUNC RAT,020,006,' FUNC MBF,021,006,O 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,O# .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,= .IOER. IE$RON,e. .IOER. IE$PNT, .ENDM CO$ONL = 1 CO$OFL = 2 CO$UNK = 3. CO$ACC = 4o CO$ANY = 5t CO$MAI = 6m CO$MAX = 6R CD$STO = 2. CD$GOT = 4f CD$CON = 6i CD$MAX = 6x M$LOG = 1 M$INIT = 2R M$DEBG = 4d M$EXIT = 10 .ASECTu .=0C$DTYP: .BLKB 1< ET$HDR = 1t ET$END = 2. ET$DEV = 'AC$DECT: .BLKB 1lC$DVER: .BLKB 1cC$DSTD: .BLKB 1 C$DMUB: .BLKB 1kC$DMCT: .BLKB 1n .EVENC$DFAC: .BLKW 2RC$DIDN: .BLKW 9.C$STD: .=0C$DTYP:nC$DNAM: .BLKW 1.C$DPUN: .BLKB 1.C$DLUN: .BLKB 1tC$DSCT: .BLKB 1C$DEVT: .BLKB 1$C$DSTS: .BLKW 1 CS$XXX=1C CS$EXF=76 CS$SUB=100$ CS$PCT=200$ CS$OFL=400$ CS$PDF=1000 CS$POR=2000 CS$MBD=4000 CS$UNK=10000G CS$ACC=20000 CS$MTD=40000d CS$DRV=100000C$DST2: .BLKW 1$ CS$ATR=1 CS$MRC=2 CS$CPU=4N CS$MCT=10 CS$PUN=20 CS$CRD=40 CS$PRC=100B CS$CTL=200D CS$DCL=3400 DC$UNI = 0k DC$CTL = 1K DC$MKU = 2 DC$MKC = 3 DC$SBU = 4B DC$SBC = 5: DC$CPU = 6P DC$SYS = 7B00)NTADATADATADATADATADATADATADATADATAC$DDAT: .BLKW 1BC$DSAD: .BLKW 1BC$SME: .=C$SMEC$DKPO: .BLKW 1BC$SCT: .=C$SMEC$DCTN: .BLKW 1CC$DUPO: .BLKW 1$C$SUN: .=C$SMEC$DCPO: .BLKW 1$C$SCP: .=C$SMEC$DCTN: .BLKW 1B .BLKW 4C$SMB: CP$OFL=400= CP$XXX=1000 CP$CUR=2000 CP$MCT=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>  .ENDM $$$TMP=0D ATT CSR,2 ATT VEC,2 ATT UBR,2 ATT TYP,4 ATT VOL,12. ATT ERR,10 ATT PRI,2 ATT MBP,6 ATT STE,2 ATT SAL,2 ATT DSN,2 ATT CSN,10 ATT PRO,2 ATT CFE,2 ATT CHE,2 ATT CLK,2 ATT MDM,2$ ATT NAM,6 ; SYSTEM NAME (DC$SYS)4 ATT SFE,2 ; DECIMAL/OCTAL, 2/4/ISO YEAR (DC$SYS) CP$MOD = ^o000377 CP$CPU = ^o001400 CP$SMP = ^o100000 CF$UBM = ^o000001 CF$EIS = ^o000002 CF$QB = ^o000004A CF$DSP = ^o000010 CF$SWR = ^o000020 CF$CHE = ^o000040 CF$CIS = ^o000200 CF$TOY = ^o001400 CF$KDJ = ^o002000 CF$UME = ^o004000 CF$FPP = ^o100000 CK$FRQ = ^o007777 CK$TYP = ^o170000 CK$KWL = 0*4096. CK$KWP = 1*4096. CK$KWV = 2*4096. CK$KWF = 3*4096. .ASECTM .=0C$MBAS: .BLKW 1MC$MINT: .BLKB 1 .BLKB 1C$MSIZ: .BLKW 1,C$MGRN: .BLKW 1DC$MDSC:C .PSECTo .MACRO OLRDF$ X .ENDM .MACRO ATT X0 .ENDM .ENDMb  .MACRO DEVCD$ $$$GBL0 .MCALL DEFIN$ .IF IDN <$$$GBL>,0...GBL=1 .IFF0...GBL=0 .ENDC .MACRO DEV X  DEFIN$ D$'X,$$$TMP  $$$TMP=$$$TMP+1 .ENDM $$$TMP = 0 DEV UDETC DEV UKNO0 DEV RK03Y DEV RK050 DEV RK5FL DEV RX01 DEV RX02= DEV RL01 DEV RL022 DEV RP02 DEV RP034 DEV RP04C DEV RP05$ DEV RP06 DEV RP07 DEV RK06. DEV RK07S DEV RM02, DEV RM03B DEV RM05D DEV RM80C DEV RS03 DEV RS04. DEV RS06R DEV RF11. DEV TK25M DEV TK50 DEV TU10A DEV TU16$ DEV TU45C DEV TU77 DEV TU78$ DEV TS11G DEV TSU01 DEV TSV0. DEV TU80N DEV TU81 DEV TM02F DEV TM03$ DEV TM78M DEV TU56 DEV TU58$ DEV TU60D DEV MSCPD DEV RA60D DEV RA80D DEV RA81D DEV RC25D DEV RD50D DEV RD51D DEV RX50D DEV ML11D DEV RM06D 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 .ENDMb  .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 1B.UFLG:'L'.BLKB 1YB.LDS:'L'.BLKB 10.B.UIDL:'L'.BLKW 1LB.UWRN:'L'.BLKB 1.B.UINT:'L'.BLKB 1B.ICUR:'L'.BLKW 1.B.LDIR:'L'.BLKW 2L B.ULEN='B'.'$$$= <.+77>/100.BU.ACT='B' 200BU.PWE='B' 100BU.ID1='B' 040BU.IDL='B' 020.=$$$TLNB.PRI:'L'.BLKB 1B.TNAM:'L'.BLKW 2LB.TCB:'L' .BLKW 1:B.TST3:'L'.BLKW 1L .BLKW 1B.CUIC:'L'.BLKW 1.B.PUIC:'L'.BLKW 1CB.CTXT:'L'.BLKW 2CB.TCKP:'L'.BLKW 2:B.OVLY:'L'.BLKW 2LB.EXST:'L'.BLKW 2' B.TLEN='B'.NB.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 2B.UNIT:'L'.BLKW 1UB.EXTS:'L'.BLKW 1EB.LSCN:'L'.BLKW 3'B.SCNR:'L'.BLKW 10B.DSCN:'L'.BLKW 1L/B.CKNL:'L'.BLKW 2 ;CPU ACCOUNTING, KERNEL MODE.B.CKUS:'L'.BLKW 2 ;CPU ACCOUNTING, SUPER MODE-B.CIDL:'L'.BLKW 2 ;CPU ACCOUNTING, IDLE TIMEC-B.CKSP:'L'.BLKW 2 ;CPU ACCOUNTING, USER MODEBB.CKAL:'L'.BLKW 1 ;RESERVED B.SLEN='B'.B.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 2NB.CFCL00)V8s/100K .= $$$HLN B.SSLN='B' . .= $$$HLN B.CTLS:'L'.BLKW 3KB.CSRT:'L'.BLKW 1GB.CRSN:'L'.BLKB 60.' B.CLEN='B'.P .= $$$HLNGB.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'.I .BLKB 1B.DLBL:'L'.BLKW 6KB.DMST:'L'.BLKW 1KB.DUIC:'L'.BLKW 1KB.DVPR:'L'.BLKW 1KB.DACP:'L'.BLKW 2K B.MLEN='B'.' BM.SHR='B'1. BM.NOS='B'2 BM.SYS='B'4' BM.FOR='B'10 .= $$$HLN B.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 1PB.PDEV:'L'.BLKW 1MB.PPUN:'L'.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'40000S0BF.CPU='B'10000 ;INCLUDE CPU STATISTICS IN SABBF.IDL='B'4000BF.WRT='B'2000BF.SCN='B'1000 BF.SLR='B'400 BF.ERR='B'200T BF.STR='B'100U BF.LSS='B'40 BF.NTD='B'20 BF.TRN='B'10 BF.XTK='B'4T BF.TSK='B'2A BF.XAC='B'1DB.MAXL='B'128.B.MINL='B'$$$HLN .PSECTT .MACRO ACNDF$ X,Y .ENDM .ENDM<b  .MACRO ACTDF$,L,B .ASECTP.=06A.GRP:'L' .BLKB 3AA.MBR:'L' .BLKB 3'A.PSWD:'L' .BLKB 6A.LNM:'L' .BLKB 14.LA.FNM:'L' .BLKB 12.A.LDAT:'L' .BLKB 6A.NLOG:'L' .BLKB 2A.SYDV:'L' .BLKB 4A.ACN:'L' .BLKW 1AA.CLI:'L' .BLKW 2A.LDEV:'L' .BLKW 2A.LPRV:'L' .BLKW 1A.SID:'L' .BLKW 1A.DDS:'L' .BLKB 11.R .BLKB 1FA.FPRO:'L' .BLKW 1'A.RLVL:'L' .BLKW 1 AR.LVL='B'401TA.SALT:'L' .BLKW 1A.ENCT:'L' .BLKB 1 A.PWML:'L' .BLKB 1CA.HPW:'L' .BLKW 4XA.TTY:'L' .BLKB 4A.PRID:'L' .BLKB 1A.SECD:'L' .BLKB 1A.PRIT:'L' .BLKW 1A.SECT:'L' .BLKW 1A.PWLF:'L' .BLKB 1 .BLKB 36A.UIDL:'L' .BLKW 1A.IWRN:'L' .BLKB 1A.IINT:'L' .BLKB 1A.LOGF:'L' .BLKW 1A.AEXP:'L' .BLKW 2A.LBDT:'L' .BLKB 6 A.RLEN ='B' . A.LEN ='B' 128.' .IIF GT,<.-A.LEN>, .ERROR1 AL.SLV='B' 1 AL.DDS='B' 2 AL.SIL='B' 4 .IF DF A$$LOGP AL.AUT='B' 10' AL.BND='B' 20L .IFTFL AL.RMT='B' 40AAL.NET='B' 100AL.DIS='B' 200 .IFTAL.PRI='B' 400AL.SEC='B' 1000K .ENDCTAL.PWE='B' 2000.AL.EXP='B' 4000AL.PWW='B' 10000 .PSECT' .ENDMb  .MACRO SHDDF$,L,B,SYSDEF  PKTDF$ .ASECT'.=0WM.LNK:'L' .BLKW 1BM.LHD:'L' .BLKW 1BM.UCBS:'L'.BLKW 2WM.STS:'L' .BLKB 1WM.FLG:'L' .BLKB 1BM.LBN:'L' .BLKB 1M.ERC:'L' .BLKB 1 ,M.ELBN:'L'.BLKW 1 ; Low order word of fence1 .BLKW 1 ; High order word if 32-bit LBNs used'M.LGH=.B .PSECTLMS.MDA'B'= 001MS.CHP'B'= 002MS.ACP'B'= 004MS.CBP'B'= 010MS.DPR'B'= 020MS.DSC'B'= 040MS.DSB'B'= 100MS.LDS'B'= 200MF.PRI'B'= 007MF.SEC'B'= 070MF.INC'B'= 011MF.DSE'B'= 100MF.LDS'B'= 200 .ASECTL.=0SML.LNK:'L' .BLKW 1ML.LEN:'L' .BLKB 1ML.TYP:'L' .BLKB 1ML.DNC:'L' .BLKB 2ML.PRI:'L' .BLKW 1ML.PKT:'L' .BLKB I.LGTHKML.LGH=. .PSECTK MT.PKT'B'=1L I.R0'B'=I.PRMLI.R1'B'=I.PRM+2L .PSECTwML.FID'B'=ML.PKT+I.IOSB ML.FSEQ'B'=ML.PKT+I.IOSB+2ML.LBN'B'=ML.PKT+I.PRM+10CML.CNT'B'=ML.PKT+I.PRM+4ML.TCB'B'=ML.PKT+I.TCBML.SR0'B'=ML.PKT+I.R0RML.SR1'B'=ML.PKT+I.R10ML.PR0'B'=ML.PKT+I.PRM+14=ML.PR1'B'=ML.PKT+I.PRM+16C .MACRO SHDDF$,X,Y,Z .ENDM00)^TADATADATADATADATADATADATADATADATA .ENDMb  .MACRO MKDEF$ $$$GBLK .MCALL .WORD.,DEFIN$' .IF IDN <$$$GBL>,1...GBL=1 .IFFB...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.R .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 .ENDMb  .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 .ENDMb  .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 1NU.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'4000UU.KNO ='B'10000UU.SEL ='B'200005UU.PTV ='B'40000 ;1= Partition table in UCBX is valid @UU.PRT ='B'100000 ;1= Device is a partition of the physical unitU.BPKT='B'U.CNT+20U.MEDI='B'U.BPKTU.UC2X='B'U.CNT+24'U.PART='B'U.CNT+26 ;Partition base LBN6;.U.SNUM='B'U.CNT+10U.FCDE='B'U.CNT+12U.KRB1='B'U.CNT+14); VIRTUAL DISK/TAPE DEPENDANT UCB OFFSETSG;=. = -12U;U.DCBS:'L'.BLKW 1 ; DCB back pointers (1st UCB only) (sec)/U.DCBP:'L'.BLKW 1 ; DCB back pointer (primary)06U.FCBX:'L'.BLKW 1 ; FCB Extention Block Address (DSR)1U.IOPQ:'L'.BLKW 1 ; Outstanding I/O packet queuea; #; VIRTUAL DISK/TAPE FCBX PARAMETERSa;t. = -27FX.SER:'L' .BLKW 1 ; Unit serial number, if UX.SER set.-FX.UCB:'L' .BLKW 1 ; Destination UCB addressn/FX.WDB:'L' .BLKW 1 ; Window Descriptor AddressN1FX.LBN:'L' .BLKB 1 ; Starting LBN Address (high)D8FX.FLG:'L' .BLKB 1 ; flag byte to determine type of VF:1FX.SZ0:'L' .BLKW 0 ; Size of secondary extention /FX.LB2:'L' .BLKW 1 ; and low order base LBN 8FX.FID:'L' .BLKW 0 ; storage for file ID when no window3FX.TCB:'L' .BLKW 1 ; TCB of task for debug packetsT.FX.REL:'L' .BLKW 1 ; Bias of 4.KW packet area/FX.SIZ:'L' .BLKW 0 ; Length of this descriptorB;' ; DEFINE U.UTIL VALUES FOR VFDRV;0UU.SPD ='B' ^o001000 ; Unit marked for spindown5UU.PAS ='B' ^o000200 ; Unit is connected passthroughF+UU.MUN ='B' ^o000040 ; Unit has dual DCB's ;V.=0X .BLKW 9.LX.NAME:'L' .BLKW 2X.IOC:'L' .BLKW 2XX.ERSL:'L' .BLKB 1X.ERHL:'L' .BLKB 1X.ERSC:'L' .BLKB 1X.ERHC:'L' .BLKB 1X.WCNT:'L' .BLKW 2+X.VFID:'L' .BLKW 0 ;VIRTUAL DEVICE FILE IDe,X.CYLC:'L' .BLKW 2 ;CYLINDERS CROSSED COUNTX.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 1X.CHSH:'L' .BLKW 1 X.LGTH='B'.R X.DFFL='B'10. X.DFSL='B'8. X.DFHL='B'5. XC.ENA='B'200C XC.A00)f8sX.PTBL:'L'.BLKW 4*8. ;Device Partition table, for master unit:X.DPSZ='B'. ;SIZE OF DISK MSCP PARTITIONED UCB EXTENTION .IF NB TTDEFB.=U.BUF. U.TAPR:'L'U.TUX:'L' .BLKW 1KU.TSTA:'L' .BLKW 4U.UIC:'L' .BLKW 1KU.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 1OU.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.INS='B'2H S6.LED='B'4V0S6.BKS='B'10 ;MAP BACKSPACE TO DELETE ON INPUT S6.EIO='B'4000S6.RLU='B'1000S6.RDI='B'100000 .ENDC.=U.UNITU.OCNT:'L'.BLKB 1E.=U.BUF0U.RPKT:'L'.BLKW 10U.WPKT:'L'.BLKW 1U.IAST:'L'.BLKW 15U.OAST:'L'.BLKW 1'U.AAST:'L'.BLKW 1 .IF NB TTDEF5.IIF NE U.AAST+2-U.UIC .ERRORF .ENDC .=U.AAST+4U.PTCB:'L'.BLKW 1 .=U.BUF+20U.CTCB:'L' .BLKW 1U.COTQ:'L' .BLKW 2U.RED2:'L' .BLKW 1 .IF NB TTDEFC .=U.UIC+4U.CPUN:'L'.BLKB 15 .BLKB 3U.CPKT:'L'.BLKW 16U.LFLG:'L'.BLKW 1'U.RAST:'L'.BLKW 2 U.VNAM:'L'.BLKB 10 .ENDC .PSECT6 DV.REC='B'1 DV.CCL='B'20 DV.TTY='B'40 DV.DIR='B'10 DV.SDI='B'20 DV.SQD='B'40 DV.MSD='B'100P DV.UMD='B'200 DV.MBC='B'400 DV.EXT='B'400BDV.SWL='B'10002DV.32B='B'2000 ;DEVICES USES 32-BIT LBNS (1=YES)>DV.ISP='B'4000 ;INPUT SPOOLED DEVICE (1=YES) (NOTE: CHANGED)/DV.OSP='B'4000 ;OUTPUT SPOOLED DEVICE (1=YES)LDV.PSE='B'10000.DV.COM='B'20000TDV.F11='B'40000DV.MNT='B'100000U2.DH1='B'100000U2.DJ1='B'40000.U2.RMT='B'20000U2.HFF='B'10000 U2.L8S='B'10000 U2.NEC='B'4000U2.CRT='B'2000U2.ESC='B'1000 U2.LOG='B'400 U2.SLV='B'200V U2.DZ1='B'100S U2.HLD='B'40 U2.AT.='B'20 U2.PRV='B'10 U2.L3S='B'4 U2.VT5='B'20 U2.LWC='B'1' UM.OVR='00)nTADATADATADATADATADATADATADATADATAB'1' UM.CLI='B'36 UM.DSB='B'200 UM.NBR='B'400VUM.CNT='B'1000UM.CMD='B'2000UM.SER='B'4000UM.KIL='B'10000OU2.R04='B'100000U2.7CH='B'10000 U3.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'2V 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 UD.NCP='B'7' .MACRO UCBDF$,X,Y,Z,A .ENDM .ENDMb  .MACRO MTADF$,L,B .ASECT'.=0V.TCNT:'L' .BLKW 1V.TYPE:'L' .BLKB 1V.VCHA:'L' .BLKB 1V.LABL:'L' .BLKB 12.V.NXT:'L' .BLKW 1VV.MVL:'L' .BLKW 1MV.UVL:'L' .BLKW 1OV.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$b  .MACRO UDADF$,L,B .ASECT.=0CP.CRF:'L' .BLKB 4BP.UNIT:'L'.BLKB 2.P.SEQ:'L' .BLKB 22P.OPCD:'L'.BLKB 1C .BLKB 1P.MOD:'L' .BLKB 2'P.BCNT:'L'.BLKB 4.P.BUFF:'L'.BLKB 12.MP.LBN:'L' .BLKB 4= .BLKB 16. P.END:'L'D P.LENG='B'. .=P.BCNTP.OTRF:'L'.BLKB 4B.=P.BCNT .BLKB 2P.UNFL:'L'.BLKB 20 .BLKB 12.P.DVPM:'L'.BLKB 40P.SHUN:'L'.BLKB 2P.CPSP:'L'.BLKB 2T.=P.BCNT .BLKB 2P.UNFL:'L'.BLKB 22 .BLKB 12. .BLKB 4P.FORM:'L'.BLKB 2 P.SPED:'L'.BLKB 2.=P.BCNTP.RBN:'L' .BLKB 4.=P.BCNT .BLKB 4 .BLKB 12.P.FMTI:'L'.BLKB 4.=P.BCNTP.RECC:'L'.BLKB 4'P.TMGC:'L'.BLKB 41.=P.BCNTP.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 1P.STS:'L' .BLKB 22 .=P.BCNT+16.P.FBBK:'L'.BLKB 4..=P.BCNTP.OTRF:'L'.BLKB 4'P.CMST:'L'.BLKB 2'.=P.BCNTP.MLUN:'L'.BLKB 2BP.UNFL:'L'.BLKB 2 P.SPDL:'L'.BLKB 1 .BLKB 3P.UNTI:'L'.BLKB 8.P.MEDI:'L'.BLKB 4=P.SHUN:'L'.BLKB 2BP.SHST:'L'.BLKB 2 P.TRCK:'L'.BLKB 21P.GRP:'L' .BLKB 2 P.CYL:'L' .BLKB 2CP.USVR:'L'.BLKB 1CP.UHVR:'L'.BLKB 1CP.RCTS:'L'.BLKB 2 P.RBNS:'L'.BLKB 1 P.RCTC:'L'.BLKB 1 .=P.SHUNP.FORM:'L'.BLKB 2KP.SPED:'L'.BLKB 2KP.FMEN:'L'.BLKB 2.00)v8s, 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 b  .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. .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`b  .MACRO REBOT$ .MCALL BTJMP$ CLR R0 CLR R1D BTJMP$< .ENDM REBOT$4Db  .MACRO BTJMP$ MOV @#$RBTAD,PC .ENDM BTJMP$ b  .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.F00)TADATADATADATADATADATADATADATADATAHW ='B' 000204BE.CSR ='B' 000205BE.IDC ='B' 000206BE.ACP ='B' 000207BE.HSP ='B' 000210BE.NCT ='B' 000211BE.TCB ='B' 000212BE.LBN ='B' 000213BE.IFC ='B' 000214BE.CAA ='B' 000215BE.CNA ='B' 000216BE.QIN ='B' 000215BE.QNF ='B' 000216BE.UCB ='B' 000217BE.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' 101100C BE.NIN ='B' 101200N 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.CHE ='B' 000320BF.UP ='B' 000400 BE.IN1 ='B' 100100R BE.SP1 ='B' 100200T BE.SP2 ='B' 100300N BE.FNF ='B' 100400LBF.PTS ='B' 100400 .PSECT1 .MACRO BCKDF$ X,Y .ENDM BCKDF$L .ENDM BCKDF$Tb  .MACRO CHEDF$,L,B VV$CHE='B'4= .SAVE .ASECTR.=0 H.CSTS:'L'.BLKB 1 H.CVER:'L'.BLKB 1 H.PAVL:'L'.BLKW 3 H.PKTQ:'L'.BLKW 2 H.DACTQ:'L'.BLKW 2H.CMDH:'L'.BLKW 2 H.CEDH:'L'.BLKW 2 H.TMP:'L'.BLKW 1H.FRK:'L' .BLKW 1BH.CMDF:'L' .BLKW 1H.LGTH=.CS.REQ='B'000001CS.RUN='B'000002CS.DNF='B'000004CS.DBG='B'000020CD.ERR='B'100000CD.DRV='B'040000CD.FIN='B'020000CD.WIP='B'010000CD.DFR='B'004000.=0E.BNXT:'L'.BLKW 1CE.BPRV:'L'.BLKW 1KE.PHYA:'L'.BLKW 1E.SIZE:'L'.BLKB 1E.STAT:'L'.BLKB 1E.ANXT:'L'.BLKW 1EE.APRV:'L'.BLKW 1.E.UCB: 'L'.BLKW 1.E.LBNH:'L'.BLKW 2.E.LBNL:'L'.BLKW 2.E.LNXT:'L'.BLKW 1.E.LPRV:'L'.BLKW 1.E.IOPA:'L'.BLKW 1.E.ATTL:'L'.BLKW 2. E.LGTH='B'.1 ES.DEL='B'200K ES.ERR='B'100' ES.WDF='B'040H ES.WPL='B'0200 ES.RIP='B'004' ES.WIP='B'002' ES.XIP='B'001G.=00A.ANXT:'L'.BLKW 10A.IOPA:'L'.BLKW 10 A.LGTH='B'.2 0.=0WS.DAT:'L' .BLKW 2RS.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.WLOD:'L' .BLKB $$$S.WLAP:'L' .BLKB $$$S.POL:'L' .BLKW 2'S.PSP:'L' .BLKW 22S.RLE:'L' .BLKW 2S.WDFR:'L' .BLKW 2 S.SIZE='B'.= DC$ENA='B'1' DC$DIS='B'2O DC$ACT='B'30 DC$DAC='B'42 DC$RCS='B'5. DC$SET='B'6 DC$CSB='B'7 DC$RSB='B'10 DC$DEL='B'11DC$CRE='B'100000DC$PAR='B'40000KDC$WBH='B'20000 DC$DBG='B'10000 .RESTOREL .MACRO CHEDF$ Y,Z .ENDM .ENDMb  .MACRO LNMDF$,L,B,SYSDEFL .SAVE .ASECT.=0GL.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'. LT.SYS='B'0 LT.GRP='B'1 LT.USR='B'2 LT.TSK='B'3 LT.SES='B'4 LT.INV='B'6 LT.APP='B'5 LS.TRM='B'1 LS.PRV='B'2 LB.LOC='B'10 LB.LOG='B'2' IN.TSK='B'1H 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'.L C.DDS:'L'..=0O$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'20000)8s6/K+A6+D6p!+D6{:+H6+H6K+J6`"+K6U<+K6<}+L6+L6(F+L6Ş+M6X+c6+c63+c63+c6G+c6Q+c6Q+c6@y+c6y+c6+c6Z+d6+d6(+d6xQ+d6Xz+d6+d6+e6(+f6+f6+f6 9+f6K+f6xQ+f6Q+f6Z+f6`+f6fa+f6f+f6f+f6g+f6qg+f68r+f6w+g6 +h6+i6b+i6+i6^+i6&X+i6.X+i6/X+i6xd+i6f+i6@y+l6s+l6p+l6e+m6^f+n6VN+n6 S+o6q+o6|+o6y+p6 +p6(+p6G+p6G+p6r+p6r+r61+r6"+r6"+r6s+s6 +s6+s6xQ+s6f+t61H+t6hL+>hs+Ah8+Ah@`+Dhp!+Dhy+Dhp+FhH+FhVN+Hh +Lh(F+Mh8+ah +bhL+ch, +chw+dh L+dhzd+fh8+fh9+fh9+hh+hh+ih8+ih8^+lh+lh+lhW+lh8Y+lhY+lhY+mh+nhH+nhQ+oh+phq+phr+rh !+rhQ+rhr+shU<+sh<}+sh+sh+shҒ+th+uh+wh+i+i+iC+iU+i+iK+i M+i:d+ike+idf+ir+iw+i+qU:+qz+ry+r&+r+rq+rv+rx+r+r+r+r+r+t+t/K+tp!+txd+tU<+8w+Tw +Twz+TwQ+TwLy+sw. +sw/ +sw0 +sw1 +sw2 +sw3 +sw4 +sw5 +sw+sw+sw+sw+sw+sw+sw+sw+wL +w +wk+w+w+w2+w$;+wcZ+ws+wz}+wp:+00*8szH H:GxHdh LHT#HT dH(YH(HԃH@#HH#T[H< NH"{z)މH$i6&XHd6xQH|\ZHTLHi6/XHnO.Hv6#H.n6 SH1[HIyH 3jEH5HzdOHԃH TSH@f6H rH0z}HkfH@{H"LH(mH卶(H-58Hr<H HyH^p6 Hd}H e:H z(H <+H*Hd]ZH#HuH|H6{HGQHb#"H*H3b<}H H 4H:Hz(H@zfHT pHSsH )ZHgHT pH JwH,& uZH$||KHHHd8 HfHz:HgHBFwHV;MHByH.H<KHWHKH,2H6gH&\MHGHlDHpHhzKHn8HЀH HPHfgH@_XHH zHH HKHHKH,#H(zH$\KHWHVgH H=HfH_H~H2zH+eHsHWHHWHzvHKH##H&*}H(yH~H'LH .SHJwH*H,H00*8s6/KH :HrH@ kHd Hd Hd #:H H yH:6{8H d H 3gH DHrqHzt/KHd 'H SH :dHd HqU:H@d _yHtUhLHHh H 3cZH 3zH 3sHhsHDhpHJ6`"H;5fH;5JHFAh@`HLh(FH 3kH;5,H wcZH;5'HQ;5sH9H;5{H;5OHGz<$=CQ.;-+*BEFGLNPSVWX!:&#? ,&,&&Zj <>@BDFHv,x&z,|&~&B",z(|$:D:h~",z  (| "$$&(:*,.0D2:468:h<>@7 p7  r77P7 \   L" DD T:  ,? 7 " 8hv7  7 & 6 7 B "7tm  2  w  ? w De w %6,Bhpx.eDl r w ׭ D B 5$ 4  t@  z%B l6BHRfB (f 8w ? D 7 f_ 7c  7Z7 X w ԇ  y;5w 82bp*00+8ssfr7 ($ĝw)t!MC w7i   e0B7P pJflH l: j@ 7w>MPODcJ BE7IOILLsVsjEMTRFPzw 7 w   T  L  % R ,4X`hp&dhr,tv4xXz`|h~px p 43 8  N (  >  @ @   J 6  xvsb(f&f)w bd 4j w L^%4 < % ! &d$40^NPVdf%44 >7`$-  z@@@Pr@ @em 7X wRPw Z   @f   m77  ` `  07Eu` A "  A ы <>  ( &5  &% F) L:t T$9)\:pFR  7F)  w $ az $s0F>sd +f&%&%#$ h%  zU wH N, @ e0 2 @7^ >.ss"(6>DzR^nJ 7N 7 @7<&e N @ e0  wZ L   @ LZ NL P R T r |i3 e ee e @( `ADD  SUB  MOV  CMP  0BIT  @BIC  PBIS  BRBNE& & BEQ, , BGE2 2 BLT 8 8 BGT > > BLED D BPLJ J BMIP P BHIV V BLOSBHISBVSeh h BCCn n BCS t t  CLRz z F COM  INCP  DEC   NEG  F ADC  SBC  TST   ROR  F ROL  ASR  ASL  SXT  pMUL  rDIV  tASH  vASHCxXOR  ~SOB  EMT  JSR  SWABRTS  FJMP  BPTe  CLC  CLV   CLN  SEC" " SEVP( ( SEN. . SCC4 4 CCC: : NOP@ >@ ~p`>  <Vh@\h: > $<(V,h04\8h  qq0uqXuququququq@yqxdqqqq  2|qqqq    f&Bwpz KWt E@ Ktpe 4e0 &tt` *z > J@ ^ f)  a    xXt(pet @ 8  S 00+TADATADATADATADATADATADATADATADATA  @ÝE 2Ý ( 2 Ft T ` j  3t8pe  ѕ,Ýt v Ý` ÝT Vѕ,J E tpe ѕ,  2 @ h z ^  єєєє &&f L$q   D!De    ѕ + : ~ ѕBѕ rnl r Zѕ & v5vѕ0 tEe0v V&  r e.e e ~&f &ѕ  D~ѕ( ѕ)  < X ѕ@ Ý r Ý`  | ѕ+ѕ#ѕ- & D ! !E7QN09t$v J~ %  6!   6!    D   !?t7Qf  +-'"A) N4 Ft0P pA h b Z TtP J F` Z   & , ff  P>&f @ #!-((- >( !U, D7& \)U0 ~ !  j 8U  ,+ U> F U&(  " )  P! tP: "5 u7Q&   U  ^ x --r 6 &7 5  ҋ⋗B* &h     EE  4 R V rz ~&d &f 0 $q ePf wB w$q &d b .,,e 8  .$ 09AZ ~׭<.   ׭,$8 z׭$A~ %$ %.@e.Wp(`~&7 "q  fHb z|:Ds@$9)@:t @2Hq:@i@    \~h\h}h}h BBBBBBBBB* (B*B,B.B0B2B4B6B8B(4( X\*X.\\\ggj01234567SWAMLHCQFXBGIVED}~\/'"% ^_@><$=CQ.;-+*BEFGLNPSVWX!:&#? ,&,&&Zj <>@BDFHv,x&z,|&~&B",z(|$:D:h~",z  (| "$$&(:*,.0D2:468:h<>@7 p7  r77P7 \   L" DD T:  ,? 7 " 8hv7  7 & 6 7 B "7tm  2  w  ? w De w %6,Bhpx.eDl r w ׭ D B 5$ 4  t@  z%B l6BHRfB (f 8w ? D 7 f_ 7c  7Z7 X w ԇ  y;5w 82bp*7$  77w77%5 f   b/7* 7 b # Ba 8 , 8  & Lw 7R7Pw_F5B05 L  wB~  w   7m     77 wj  hz ~ 4b  $00+8ssfr7 ($ĝw)t!MC w7i   e0B7P pJflH l: j@ 7w>MPODcJ BE7IOILLsVsjEMTRFPzw 7 w   T  L  % R ,4X`hp&dhr,tv4xXz`|h~px p 43 8  N (  >  @ @   J 6  xvsb(f&f)w bd 4j w L^%4 < % ! &d$40^NPVdf%44 >7`$-  z@@@Pr@ @em 7X wRPw Z   @f   m77  ` `  07Eu` A "  A ы <>  ( &5  &% F) L:t T$9)\:pFR  7F)  w $ az $s0F>sd +f&%&%#$ h%  zU wH N, @ e0 2 @7^ >.ss"(6>DzR^nJ 7N 7 @7<&e N @ e0  wZ L   @ LZ NL P R T r |i3 e ee e @( `ADD  SUB  MOV  CMP  0BIT  @BIC  PBIS  BRBNE& & BEQ, , BGE2 2 BLT 8 8 BGT > > BLED D BPLJ J BMIP P BHIV V BLOSBHISBVSeh h BCCn n BCS t t  CLRz z F COM  INCP  DEC   NEG  F ADC  SBC  TST   ROR  F ROL  ASR  ASL  SXT  pMUL  rDIV  tASH  vASHCxXOR  ~SOB  EMT  JSR  SWABRTS  FJMP  BPTe  CLC  CLV   CLN  SEC" " SEVP( ( SEN. . SCC4 4 CCC: : NOP@ >@ ~p`>  <Vh@\h: > $<(V,h04\8h  qq0uqXuququququq@yqxdqqqq  2|qqqq    f&Bwpz KWt E@ Ktpe 4e0 &tt` *z > J@ ^ f)  a    xXt(pet @ 8  S  @ÝE 2Ý ( 2 Ft T ` j  3t8pe  ѕ,Ýt v Ý` ÝT Vѕ,J E tpe ѕ,  2 @ h z ^  єєєє &&f L$q   D!De    ѕ + : ~ ѕBѕ rnl r Zѕ & v500+TADATADATADATADATADATADATADATADATAvѕ0 tEe0v V&  r e.e e ~&f &ѕ  D~ѕ( ѕ)  < X ѕ@ Ý r Ý`  | ѕ+ѕ#ѕ- & D ! !E7QN09t$v J~ %  6!   6!    D   !?t7Qf  +-'"A) N4 Ft0P pA h b Z TtP J F` Z   & , ff  P>&f @ #!-((- >( !U, D7& \)U0 ~ !  j 8U  ,+ U> F U&(  " )  P! tP: "5 u7Q&   U  ^ x --r 6 &7 5  ҋ⋗B* &h     EE  4 R V rz ~&d &f 0 $q ePf wB w$q &d b .,,e 8  .$ 09AZ ~׭<.   ׭,$8 z׭$A~ %$ %.@e.Wp(`~&7 "q  f"b zyDs@<&Kq@p@`@$9)@<&9@:t @2Hq @?S@:@i@z=@@=@' q@:@<&D@hp!@   \~h\h}h}hy ( BBBBBBBBB   & . J (B*B,B.B0B2B4B6B8Bprtv x z |& ~. (4( X\*X.\\\  mm=<&9<&Kq<&D ' > P    ' q ySY  ggDDDfDDDD01234567SWAMLHCQFXBGIVED}~\/'"% ^_@><$=CQ.;-+*BEFGLNPSVWX!:&#? ^ DDDfDDDD:<>@BDFtvxz|~B0<Ld2,8 B t 0Nb~0< L d2,8 "$ & (*B , .02t 4 6 8:0b@N T\7 7 \  N7J77"    "< DD T:  |? 7F N T\8hB7< 7 & X @7 :B 07    w  ? w 0De w ;%X,Bh0px;.eDlB  w ׭]DJ B 5$ 4  t@  %B znfB6BHRfB: ( w ?  7 _ 7  77 w Tԇ  y|w 2bTp|z7tld  7D7RwM7472%5$ f   h27z * 7 b 2& Ba  < 2   & P w 77w5z5 J 6`w`B~  w ] U:67Im0*&&  ,) T  77 6nT00+8s9Ɓ 0׭'  Dsl"Uh`^7 0>$ĝw)t!MC w 7   e0B7Plr x t: r@ 7fw>4.(MP^[ODPc .BE07/IO$IL Rs\s EMTR FPw 7P wF   \  T  %  R  j nxz|~    & .  p 43 8  N (  >  @ @   2   &  . ` xbjf&f)w   w  %.4 < %,s(2> \^drt ! %44 7`f-b @@@P@ @em8 7 w4 $* w   T @f   m77  ` `  n07E  T0  u` A A ы ~  j h\5  h%\XTLFZ:t b$9)j:~F ) HB, 7.F),^b d /VR *2s>FLsX^b h?Sz~=i~ $ȕ R 7 Hd& SYfp"# 7 N .STB FILE NAME IS: m&@=`6>' qDhp!  ^ @j d] w P$ az +f&%&%#$ %  "&PPsXs`ft|` (U w N,D @B e0 @;7  7 7 7&e N @ e0 L (D B0;q w>  * $ >@ e ee e @( `ADD$     4>>iJ J SUBP P MOVqV V CMP\ \ 0BITb b @BIC h h PBISnnBRBNEz zBEQ BGE& BLTf BGT BLE BPL BMI BHIBLOSBHISBVS 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@ @JSRFFSWABRTSR RFJMPX XBPT^ ^CLCd dCLV j jCLNp pSECv vSEV| |SENe SCC` CCC  NOP>~pp>`  b@:p > $(,0b4844 qq0uqXuququququq@yqxdqqqq  2|qqqq >> (f&BwpKWtE Ktpeh 4e0 &tt` *>J^h)X  a  D J Xt(pe  8 <S@ : ÝE ÝX(D2JFT`@j:6 3t8pe p ѕ,Ýt vL VÝ`4 HÝT Vѕ,J E 00+TADATADATADATADATADATADATADATADATAtpeJ ѕ,F2L@4hJzFR  єєєє &&f L$q   D!De /*f   R|:.7 @ D!wwD     ѕ+ : $ .ѕB:ѕ   ѕ & v5vѕ0 tEe0v &> r e.e d>&e ~&f &ѕ  D~ѕ( dѕ)Y ѕ@ ÝJ r 6Ý6n0`  " ѕ+ѕ#ѕ- & D ! !E7QB09"$ v"J~ %  <!   6!    D   !?7Qf  +-'"A) N7 Ft0P vA n h ` ZtP P ` Z  &  , ff  P&f @ #!-((- >( !U, D7& \)U0 ~ !  j 8U  ,+ U F U&(  " )  J! tP 5 u7Q&   Ux  ^ xD -B-> VD&70 5 (ҋ⋗B* & 6 X  EE b6 L*(66:XVb^6bdfLhj&f 0 $q ePf( wbB wZX$q ,,eF( 8 ( .$ 09AZ ~׭.   ׭$׭A~(z B5 `  w@7l:ew07 ew  B5  `  f   w"w,@e %$ %..:<r@e.Wp(`~&7 "q  (fb VZt^sVDs@:t @:@ t^d \~h\ht^( t^00tZ|B (*,.0246ntpZr|tvx|4  *.  = gg|||||||01234567SWAMLHCQFXBGIRVED.|||||| |D=DTfx}~\/'"% ^_@><$=CQ.;-+*,BEFGKLNOPRSVWX^&Tfx  ~B~$$`jf~0jdp|6l~$$  `jf~0 j"d$p&(*,.02|4668:@"\L7 v7  0 x77P7 \ OD T:  B? 7 7 7 " \ L0\8& B  7  7   w  1 w 0De@ w ;% e0DlD" B$\0d@l;x0~D N w  5W 4 T @  Z r 4;t  83 @  D $T>X0^ #E = e0,  ~@ nb (0,r f^w ? :0 P (.R0bt07 ,_ &7+  7"7 hw Xԇ  &y~w7  !7(X6~p( 77w77%5 f     }`\7qmVPLL DB Q X 00+&8s   w 777UE   l f <eb7Rls7LGǁ 0f׭5.&Uvnl7 8L#ĝw)t!T fxTTE w7 f f e0B7  : @ PJDMP|yODnc, JffjstszsBEN7MIOBIL:FP2 EM*TR"w 7n wd      t  l  % <R tZ|  N3 X  n H  ^ 8 @ "*"<&0t2Z4|68:<>@  <  <& t<f&fw ~ | w h 4sB<Xb|n 4TxT <xT % !   %4T4xf j&TxT&x(TRlTpxvf7`N-J @@@P@ @em  7 w~|w   X @f   lX|   m77  ` `  07E ` A A ы df |  P NB5  N8 @ H$0 7" ,:::t Tz )  w2E  w "T$ az +f&%0%%"BTt0zt $ d%T 0 (U  N,F @D e0 0 @;  Ne0, 7z 7 l7h T0(&F2DB; &e N @ e0  w , &   @f A N  % * , ., 0& 2 P Xl e ee e ^ @(F   ,B     8@b Vѳrt^8VѳDs@:t @T(@:@T(@ }\~h\h|} x |}( }00tZ|b |}(*,.0246 n|}t p|}Z r|}| t|} v|} x|} ||} n @(tZ| DHv <|} >|} @|} B|} D|} L|}t N|}Z P|}| R|} T|} V|} X|} Z|}dDhHH=HggV01234567SWAMLHCQFXBGIRVEDNV |} |} |} |} |} |} |} |}ATfx}~\/'"% ^_@><$=CQ.;-+*,BDEFGIKLNOPRSUVWXZt&Tfx  "zzz Fdz |} |}z |} |}z |}z |} |} |} |}  |}F |}d |} |} |} |}"<XR`jnvz |} |} |}< |}X |}R |}` |}j |} |} |}n |} |} |} |}v |}^hR^$N>Z |}^ |} |}h |}R |}^ |} |}$ |}N |}> |}|}^7 @7  0 R767>7t R P OD L T: D Rz}@ }}}}} }0"}R(},}0}2}66}>>}RX}RZ? 72 74 x 7 & \  R 7 R  7 x R w2  : nz }}}2} }4(} .4\6} :}R@}R H}T}Z}b}R ~}n  De@y %%e0Dl   w  00+.TADATADATADATADATADATADATADATADATA 5W 4 T @  >Z 0Z} }@ }y} (}0 .}8}>}  H} Z}T t}R ;t  3   D #E = e0,  @ NL B} }2}`} d}p}Nv}L|}t (06 Z w ? 06 7 _ 7  77 < V҇  y~ }0}}6} Z}  .}02}4}6<}H}P}T} \}^} p}>w7  !7 77w77%5 f  z} }}}"}*} :}<}P}T}X}\}`}l} ~}d 0 &7m  ,   77 w z}}}}"}(}*}.}0}8}@} F}N}T}X} f f m  @ f  " f  B` b%/R}} }$},} >}J} \}h}|}     w8 D _ & >  w  7>77U@Z}} } } &} 2}j}>n}t}x}~}@E@  @>  eB5 & 77 0f׭}}@}@}>"}(},}8}B:sF} V}\}`} n}fr}z}nU@>@7 t>7ĝ( @f&w-~} }@}>}@}"}(}2}>6}<}D}LT(P}@VT( Z}j}vt!TTE w>7 f f e0B7 \ X: V@7  MPz}} }T$}>(} ,}f 2}f<}D}V}Z}b}h}l}p}jjODc BE7wIOILFP EMTR|} }}s"s$}(s,}2}6}@}H}P}X}`}d}w 7J wH  6        % "R  P 43J}}J}H}$}*},}6 d}" h}L  V   F  r 6 @ \@ R v N D FB<<f&f@V}DZ}\}fsh}Bl}p}< t}<P | JTaAxa   TaAx ^} }P|} "}J(}:} B}T J}xX} n}T v}xD % !   %&4T xa f 7`-J R ,} H}TL}  N} T}x d}fn}r}v}x}JD@@@PF@ @em 7D wFHw    ~@f   mz }D}F$}.}D6}F:}H>}D}N}V} \}d} l}t}~}<77  ` `  \0@7=E `   ы%0%7 7b} }}N}V} f}0h} n}p}v} z}|}v5  X5  5??5  %z}} }}} },}2}8}B}F}R}X}\}h}* ]     f&00+6,;8s7 Z#@\%zt t@tZ tL t "t8&t.t2>4tC 8e . &) B  B B ( t Ft`sdtht B e0 ѕ ѕ t> \q gR^ PCPCPC PCPCPC PCPCPC PSPSPS DSDSDS R0R <>\2@R H<^S0R0 R1R1R1 R2R2R2 R3R3R3 R4R4R4 R5R5R5 SPSPSP TOSTOS >>> BREAK <<< 4t 8t4Js Vt]Ztbt Z R J D >C 8e . &) B  B B ( t Ft`sdtht B e0 ѕ ѕ t> \q<0Y30 5~ S3 g3 3; Bx303P38T3++^q+ +dkW.^qt9?9@;M>8>DXH8HKJKNt Xt .0) %RZJwx{(KXYqsOy*}d|&F&,&&)&&&<&,&.&3&AG& N&N`&4d&f&\g&p&s&x&x&Fy&Ny&&c& c&t c&c&=c&c&%c&&c&b'c&d'c&'c&](c&(c&8c&8c&>9c&X:c&y:c&:c&:c&AGc&vLc&Wc&Yc&{Zc&fc&yc&c&rc&(s:( z(b (0('(T*(U*(V*(W*(v*(w*(x*(y*(z*({*(|*(}*(~*(*(*(:(pE(CG(DG(HG(^G(_G(`G00,>TADATADATADATADATADATADATADATADATA(aG(bG(cG(dG(eG(fG(gG(Z(S[(T[(f(f(r(w(w(w(y(Ry(([()Bx)04)Xu/)vu/)wu/)xu/)yu/)zu/){u/)|u/)}u/)u/)u/)u/)u/)u/)u/)u/)u/)u/) v/)Hv/)W)S)p!)H)H)!)Bx))r) S;4S;S;S;S;""S;2S;3S;:S; NS; RS;YS;JwS;wyODOXJOH"}}}$}}y:}vL}tN}Nq}Jw}Bx}y}}o;='3A> 3Dp3:Bx3P3>d3>83>r3K<}3Kօ3L 3Ls3Ly3@q0@r0r2.w0Ry2.4Ǝ446&6&<36&""/6&f2.6&w~0'v400,F;8sH5 @z)!Hc&X:HS;3H}y:H)sE@c&rHS;H~<Hc&:H(b H&H`@d@}H>P@c&:H&fH&{<](H$<<H6&\gH)@}s@|H@c&AGH&sH([H~r@&H &3H (rH# S@c&WHNt H KXH$9OHYqHc&%H)04H<~H)P@zc&YHS;JwH& NHc&&Hz8@}Hfc&fHc&Hc&Hձ@h'@8Hc&=H)SHc&b'HzsH$9.@$95:@xHz~<HJc&8H%H) H )HHc&8HOyH +Hc&>9HS;2HRy@&HL  H 6f jL n r vH z ~J|[OAzBCD(MP R*SRQz     " &z * . 2( 6 :  >* BR FXAzBCD(12-3456~789%~z 00,NTADATADATADATADATADATADATADATADATA   z   $((,-048< @ DHLP% TP.~6~>~0U1]3e4m5u6}89~F~Nz .  6  >   U$](e,m0u4}8< @ DF H LNHb~V~H~~^~~n~1234~  V  H    ^ $ ( , 0n 4 8<@D]~v~~~~~~~78~  v  ~    $ ( , 0 4 8 < @^ [?61%;-1[1112141;Q181~     "% &*- . 261:1>1B1F1JQN1 R V Z"Z6jRR  f z    6 j R R       f x8 J @ ~!! Z 8  J @ ~! !  w !EuB 5 CeeO%UU A"wX Me 6!5 =%0 \$  ~\}\6| ~ 5 :ue   0 0 0  5  @Aej~UU BeXPCeL eVe 0 BCe~U*      E@&Uh Eh   l Be$R~  L\} D~   Pu u 5-5 6   P  0q q @, L\}6 p\}0" 1 ^N5H L@A- 5 B51B@mBAmBu '  5 B T5  \}N \}H b\}8H U & E~  50  x \} 2 0 0 @eFB~w AeCBe.E"  I  !  I w %   dN   vw v%UU444    J  4  0:*2 Jw N\} Z\}jw r\} ~\}0 & UU  0 6   wv %@mB  p   E~ 2\}0 :\}6F R w8@0  ` Ce2`54 p ` 6 E@t0  t0 5 <6U& , t0 5NB& E% W @&  &D5@  $D  K se~ ~> e 4w< W C B =5 .+s ^eAe3eO3Z SssqI D4 %56 9 (   z~fe &4:Ǝ6~ ^5 U5@  eP ~  E  ҁ B~e• D`~ E5dƎ@  w KmB3eC-4  wB6 % RR D~ .D~ 80 C2 4QA8B 5@  ` ` VD45@ +  b  p&f  m ~ 8C~meI~ ~ 5!6̇U @E5`u- 4 j 0 0   t   4 5@ & F2   rꆇe B`  B 2@ ZƎ  @ ZB` 톇   ҋ  %UU u A ˥*   Z\}D >0e L= 00,V;8s 0 0 N vN xL= x D  N " %  n1@ *B8  5  p 0 0      0  0    C2 4 C@ hL=wP j "5C@  1e1 1  0F \} H & 2 Z   H   &  2  J VJ W W C@& L=@0e   $\} P 0  0   J b@2"e Z5@   h D 0 0   &  L=eH~ l     4&@`^   fT  0  lw `ҔD~ "    .&@`  W  \}T2 z\}W r t w C`~ D~    eC~L=l b5@V &- (@ ;  r 5 : < w J 2 L=6 w   \}-@p C~ D-6L=66  h  wB@ʢ :   1w ~ltN Z w Z f #N B` e~ .  , Z ]   f\}Z p\}] | 0 ~  0  \ C6#    e a~ 0 e   &  V 0 0 $r$ D4 V RD-65@  5   E  C` &  l 0 0 w ” B  ~a z 5@0!0 :Aw Bz5  8DV , 5B~mB`B~  z~5>5  HƎ^Ǝzѥ ~eB'@ >~! N  e  @ p ~ 5@  \}1457 5+5õ@ 8 - b 0 $ ;BC  m  õ< , f @   5 Ǝ (\}- 0\} ^\}<|  ` :  p= BVfP ` %!t-<%(%L  <%" \}` D\}`Lb(hL|#t-<. C@%C@ &C@  wFe B ɥ. ы~APBV *^Ǝt1 2 UE U@E122A& `1e2= & J   5" f\}|" \}$.6>FNV^fnvz      . 6 > F N V ^ f n "v~R ~         ` ɋQ$A5 dl &5-5 'm![B< q~  \& JB< \}`@q.pG Q~f:  z t-<4Am< H5 5t-<5 5@  %$6U w گtگt)Xu , 5  05  P @w &گtگt)u44w گtگt)u>>w گtگt)uHHw f75@  25@ %L=%5@ & Jl 00,^TADATADATADATADATADATADATADATADATA6 6 w\ گtگt)ubw $5@  5@ L=6 6 w \گt گt  ) v*,*5@   T w &گt گt  )HvR,R5@  X \w &گtگt)vuz*z 5@  "w $گtگt)wu&t-<  wf گtگt)xuw B> <t-< e `  w B> <e `   >`  <  < . < 6>w گtگt)yuLL <E xBm< 5#5A< C~ f:  z% V A<C~ D5 0 05 Ǝ&f:   .Uw> گtگt)zu`!~B-< U  1w2w3w4w5w7w:wƎ ƎB@rf<w=w?w@wAwBw!wz"wr#wj$wb%wZ&wRwJ   t@qw 5 Ue B` B`  Ef:fBAe*Bҥ ~ 57 U t^ `fehU NE % BEAeBe$R~  = FwZ \}`( nگtگt){uw 56f:fuM@ee. Ae$ Me DuM      Me5 : Ae$J  w 5 0UC2 REC@ bw   5E5 <e \ U5<e`  B<w&! u :u ; fw f: 5  4E  *f@  2\}!L&BD~ U   .5 : \} \}(AC$9N<X:  $  <  &d|d fAm< U E5   4  eыAm> e$ wL&*Ǝ .\} vگtگt)|u@ AZ az w :گtگt)}u(09  w "گtگt)u<`< f-+ +- . ɠ ~ 5Nm>V   w Ǝ Zگt گt  )u" "wr گt"گt"")uF   ~5 5  $w0Ǝ @گt$گt$$)u&w& گt&گt&&)uC2L=  5 f    F5 : uew %|~UU  8U@ r  N`fehU E %" ꇇ5 :&- *; j  " \} ,\}`JP" b\}-H X: `w  d1 0 C    e0 e0 ;= u- @ev5 5 f@ A~fehU .E fA%1 fEh1fURy @\}Hh &  %0 f  p t < " ,\} 4\} B 0 0 \}$          66 B n      Bɋ W]W: mKɋ d((pe 2f1A%& ppe - *%%b'  1  d:Bx >rPP0.)sE4)sE<)2HD)2HHձN`;\`dP j 0 0 h0h  1 Br P` * 0 0    0  0  A1"  K<}  0" 0"" $   0$ 0$$ w ,AHCCHeEfD & pe ɇ Ƈ%FuJ `Dw E<>P8)sE<)sED)2HL)2HPձV`;v8) B ",e$FFJ% 4 xC-C`AleC ",e>8H>PX:Bx^:Bx%uDH UBE`JF R5H&   5   B5 F8TT>d\)Pf)pj0 @,e fe N,Nv v  1& Z  Dp:s ~r  ~ DDpH:s ~r T='^rh}l='+%׭& & & & & & & & & &  1<  <<P A> sT;w ='>DpB:4FVc&X<<}^L bL fL rL ~L ^t & & & & & f& Ε &f  ,}V} r$A> (Dp,wxJ5 N8TYPz6&fPDs@:G@='@$9Y@ ~@@$9΅@Dp@ 0rhRyh  w ѰB   f& & & & && f& Ε `  ,& & & & f& f& Ε.<='@DpD:G ~ x='|DpH| f& &  ׭W1 ":G ~ $s&$9΅,$9YYPz6&<PD5!@='H<&%t@A> HDpH NT HPHLsH >dHz>rH SHL H :BxH>8HKօH gHLyHK<}H8>DXH8HKJKNt Xt .0) %RZJwx{(KXYqsOy*}d|&F&,&&)&&&<&,&.&3&AG& N&N`&4d&f&\g&p&s&x&x&Fy&Ny&&c& c&t c&c&=c&c&%c&&c&b'c&d'c&'c&](c&(c&8c&8c&>9c&X:c&y:c&:c&:c&AGc&vLc&Wc&Yc&{Zc&fc&yc&c&rc&(s:( z(b (0('(T*(U*(V*(W*(v*(w*(x*(y*(z*({*(|*(}*(~*(*(*(:(pE(CG(DG(HG(^G(_G(`G(aG(bG(cG(dG(eG(fG(gG(Z(S[(T[(f(f(r(w(w(w(y(Ry(([()Bx)04)Xu,R)vu,R)wu,R)xu,R)yu,R)zu,R){u,R)|u,R)}u,R)u,R)u,R)u,R)u,R)u,R)u,R)u,R)u,R)u,R) v,R)Hv,R)W)S)p!)H)H)!)Bx))r) S;4S;S;S;S;""S;2S;3S;:S; NS; RS;YS;JwS;wyODOXJOH"}}}$}}y:}vL}tN}Nq}Jw}Bx}y}}o;='0<A> 0<Dp0<:Bx0<P0<>d0<>80<>r0<K<}0<Kօ0<L 0<Ls0<Ly0<@q-@r-r/nw-Ry/n1Ǝ1100-v;8sH5 @z)!Hc&X:HS;3H}y:H)sE@c&rHS;H~<Hc&:H(b H&H`@d@}H>P@c&:H&fH&{<](H$<<H6&\gH)@}s@|H@c&AGH&sH([H~r@&H &3H (rH# S@c&WHNt H KXH$9OHYqHc&%H)04H<~H)P@zc&YHS;JwH& NHc&&Hz8@}Hfc&fHc&Hc&Hձ@h'@8Hc&=H)SHc&b'HzsH$9.@xH~<HJc&8Hz%H) H $95:@)HHc&8HOyH +Hc&>9HS;2HRy@&H] 0 . f00](~ABCDM0P~2] 6 :0 >. B Ff J0 N0RV] Z( ^~ b f j n r0UrnRSQNzABCD78:j n   N z $ ( , 0 4 8"`ppz 4V z   `  p p z   4     V h  n $R  h     n $w EuB 5 CeeO%UU A"wvMe `5 =%0 $  ~\}0| 5 :ue   * 0 0  5  dAej~UU BeXPCeL eVe 0 BCe~U$   .  0 E@&Uh Eh D $ Be$R~ *D~  L\} " Pu u @A- 5 B51B@mBAmBu '  5 B T  j\} @5 H U  |E~ P |50 x , \} : 0 0 XX@eFB~w AeCBe.E"  I  !  I w %   d   vw %UU444UU4  w~ %@mB  x *2 P  "E~ ^ wD@0  ` Ce2`54 p ` 6 E@t0  t0 5 <6U& , t0 5NB& E% W @&  &D5@  $D00-;8s0e L=  0  p1  > 0 0 lvl xL= x D : " %  1@ *B8  5  p 0 0    0  0  C2 4 C@ hL=wP  "5C@  1e1 1  0d \} ..` D P Z  .  . `  D  P  h Vh W W C@& L=@0e   $\} P 0  0   J ~@2"e 5@    D 0 0   &  L=eH~ l     & | C` H  w `ҔD~ :    & r b <w C`~ D~ b    eC~L=l 5w  e~@~ w Jxt  2 L=6 P w ^ C~ D-6L=66  h  *wB, @ʢ    1w l w f #N B` (e~ 0H>l r  , & &)  " "\}& ,\}) 8 0 0  \ C6#    e a~ 0 e    V 0 0  r  D4 V D-65@  5   E  C` j   l 0 0 l l w ” B  ~a z 5@0!0 :Aw Bz 5  DV , 5B~mB`B~  z~575 ѥ HƎ^Ǝd ~eB#@ D~ e  @ ~ 5@  f @ h5  , :  ^= BVfP , %!t-<%%  <%~#" \}, B\},J`fz~\t-<. C@%fC@ &C@  wFe B ɥ. ы~APBV1 (f\Ǝ 2 UE U@E122A& `1e2= & J   5 d\}zT \}$0N0(zz 0 00-pTADATADATADATADATADATADATADATADATAN 0 ( z          "( R          VV , ɋQ$A5 <l &5-5 'm![B< q~ | \& JB< \},@q.G Q~f: V B t-<4Am< 5 n 5t-<5 5@  %$N6U w گtگt)Xun,n5  05  P @w &گtگt)uw گtگt)uw گtگt)uw >75@  25@ %L=%5@ & l 6 6 &w4 گtگt)u.b.w $5@  5@ L=6 6 w \گt گt  ) v,5@  X  w &گt گt  )Hv,5@  0 w &گtگt)vu* 5@  w` $گtگt)wu&t-<  w> گtگt)xu$$w B> <t-< e ` p w B> <e ` J  >`  <  <  < 6w گtگt)yu <E Bm< 5#5A< C~ f: V B% V A<C~ 4 D5 0 05 Ǝ&*f: J Uw گtگt)zuLL`!~B-< p |U H 1w2w3w4w5w7w:wƎ ƎB@r<w=w?w@wAwBw!wz"wr#wj$wb%wZ&wRwJ   t@qDw 5 Ue B` B`  Ef:fBAe*Bҥ ~ 57 t ^U t ~,fehU NE %N BEAeBe$R~  = w2 \},(N nگtگt){u00w 56f:fuM@ee. Ae$ Me DuM      Me5 : Ae$  w f P5 0 UC2 \ Ew   5E5 <e  U5<eJz(`  B<w8 lu :u ; @w f: 5  E   D~U   5 :  \}: n\}\}>(>AC^9@NvX:  ^ @ v  &| Am< U E>5   4  eыAm> e$ wL&*Ǝ .\}> vگtگt)|u@ AZ az w :گtگt)}uR(R09  w "گtگt)uv`v f-+ +- . ɠ ~ 5Nm>V   w Ǝ Zگt گt  )u" "wr گt"گt"")uF   ~5 5  $w0Ǝ @گt$گt$$)u22&w& گt&گt&&)u<<C2L=  5 f v    F5 : uew %UUv  "U@ 00-;8sf1A%& ppe - *%%b'  1  d:Bx >rPP0.)sE4)sE<)2HD)2HHձN`;\`dP j 0 0 0  1 Br P` * 0 0    0  0  A1"  K<}  0" 0"" $   0$ 0$$ w ,AHCCHeEfD & pe ɇ Ƈ%FuJ `Dw E<>P8)sE<)sED)2HL)2HPձV`;vb) B ",e$FFJ% 4 xC-C`AleC ",e>8H>PX:Bx^:Bx%uDH UBE`JF R5H&   5   B5 F8TT>d\)Pf)pjZ @,e fe N,Nv v  1& Z  Dp:s ~r  ~ DDpH:s ~r T='^rh}l='+%׭& & & & & & & & & &  1<  <<P A> sT;w ='>DpB:4FVc&X<<}^L bL fL rL ~L ^t & & & & & f& 00-.TADATADATADATADATADATADATADATADATAΕ &f  ,}V} r$A> (Dp,wxJ5 N8T_Pz6&fPDs@:G@='@$9Y@ ~@@$9΅@Dp@ 0rhRyh  w ѰB   f& & & & && f& Ε `  ,& & & & f& f& Ε.<='@DpD:G ~ x='|DpH| f& &  ׭W1 ":G ~ $s&$9΅,$9Y_Pz6&<PD5!@='H<&%t@A> HDpH NT HPHLsH >dHz>rH SHL H :BxH>8HKօH gHLyHK<}H8>DXH8HKJKNt Xt .0) %RZJwx{(KXYqsOy*}d|&F&,&&)&&&<&,&.&3&AG& N&N`&4d&f&\g&p&s&x&x&Fy&Ny&&c& c&t c&c&=c&c&%c&&c&b'c&d'c&'c&](c&(c&8c&8c&>9c&X:c&y:c&:c&:c&AGc&vLc&Wc&Yc&{Zc&fc&yc&c&rc&(s:( z(b (0('(T*(U*(V*(W*(v*(w*(x*(y*(z*({*(|*(}*(~*(*(*(:(pE(CG(DG(HG(^G(_G(`G(aG(bG(cG(dG(eG(fG(gG(Z(S[(T[(f(f(r(w(w(w(y(Ry(([()Bx)04)Xu/)vu/)wu/)xu/)yu/)zu/){u/)|u/)}u/)u/)u/)u/)u/)u/)u/)u/)u/)u/) v/)Hv/)W)S)p!)H)H)!)Bx))r) S;4S;S;S;S;""S;2S;3S;:S; NS; RS;YS;JwS;wyODOXJOH"}}}$}}y:}vL}tN}Nq}Jw}Bx}y00.;8s 3Dp3:Bx33>P3>d3>83>r3J3K<}3Kօ3L 3Ls3Ly3@q0@r0r3w0Ry35Ǝ556&6&<36&""/6&f36&w~0'v500.TADATADATADATADATADATADATADATADATACYPz6&PD @~<Hz5 @)!Hc&X:HS;3H}y:Hc&rHS;H~<Hc&:HIq@(b Hb&@&Hc&H~<`Hz>d@}H>P@c&:H&fH&{<](H$<<H6&\gH|H@c&AGH&sH([H~r@&H &3H (rH# S@c&WHNt H KXH+^qHS; NH c&vLH<<}HS; RH(Ho;Hz}H~OHYqHc&%H)04H<~Hc&YHS;JwHz& NHc&&Hz8@}Hfc&fHzc&Hc&H8Hc&=H)SHc&b'HsH@J@z(ZH)BxHc&'H&xH@xH~<HJc&8H%H) H )HHc&8HOyH +Hc&>9HS;2HRy@&H bp @b 0(گt( \}<)0 #5[[?3l[?3h#6#3#5[?5h[?5lDM=>L  H 6f jL n r vH z ~J|[OAzBCD(MP R*SRQz     " &z * . 2( 6 :  >* BR FXAzBCD(12-3456~789%~z    z   $((,-048< @ DHLP% TP.~6~>~0U1]3e4m5u6}89~F~Nz .  6  >   U$](e,m0u4}8< @ DF H LNHb~V~H~~^~~n~1234~  V  H    ^ $ ( , 0n 4 8<@D]~v~~~~~~~78~  v  ~    $ ( , 0 4 8 < @^ [?61%;-1[1112141;Q181~     "% &*- . 261:1>1B1F1JQN1 R V Z"Z6R00.;8s e 4w W C B =5 .+s eAe3eO3Z SssqI D4 %56 9 (   ~fe &4:Ǝ6~ 5 U5@  eP ~  E  ҁ B~e• D`~ E5dƎ@  w KmB3eC-4  wB6 % RR D~ .D~ 80 C2 4QA8B 5@  ` ` VD45@ +  b  p&f  m ~ 8C~meI~ ~ 5!6̇U @E5`u- 4 j 0 0   t   4 5@ & F2   rꆇe B`  B 2@ ZƎ  @ ZB` 톇   ҋ  %UU u A ˥*   Z\}D >0e L=  0  $1  > 0 0 N vN xL= x D  N " %  n1@ *B8  5  p 0 0      0  0    C2 4 C@ hL=wP j "5C@  1e1 1  0F \} H & 2 Z   H   &  2  J VJ W W C@& L=@0e   $\} P 0  0   J b@2"e Z5@   h D 0 0   &  L=eH~ l     4&@`^   fT  000.TADATADATADATADATADATADATADATADATA  lw `ҔD~ "    .&@`  W  \}T2 z\}W r t w C`~ D~    eC~L=l b5@V &- (@ ;  r 5 : < w J 2 L=6 w   \}-@p C~ D-6L=66  h  wB@ʢ :   1w ~ltN Z w Z f #N B` e~ .  , Z ]   f\}Z p\}] | 0 ~  0  \ C6#    e a~ 0 e   &  V 0 0 $r$ D4 V RD-65@  5   E  C` &  l 0 0 w ” B  ~a z 5@0!0 :Aw Bz5  8DV , 5B~mB`B~  z~5>5  HƎ^Ǝzѥ ~eB'@ >~! N  e  @ p ~ 5@  \}1457 5+5õ@ 8 - b 0 $ ;BC  m  õ< , f @   5 Ǝ (\}- 0\} ^\}<|  ` :  p= BVfP ` %!t-<%(%L  <%" \}` D\}`Lb(hL|#t-<. C@%C@ &C@  wFe B ɥ. ы~APBV *^Ǝt1 2 UE U@E122A& `1e2= & J   5" f\}|" \}$.6>FNV^fnvz      . 6 > F N V ^ f n "v~R ~         ` ɋQ$A5 dl &5-5 'm![B< q~  \& JB< \}`@q.pG Q~f:  z t-<4Am< H5 5t-<5 5@  %$6U w گtگt)Xu , 5  05  P @w &گtگt)u44w گtگt)u>>w گtگt)uHHw f75@  25@ %L=%5@ & Jl 6 6 w\ گtگt)ubw $5@  5@ L=6 6 w \گt گt  ) v*,*5@   T w &گt گt  )HvR,R5@  X \w &گtگt)vuz*z 5@  "w $گtگt)wu&t-<  wf گtگt)xuw B> <t-< e `  w B> <e `   >`  <  < . < 6>w گtگt)yuLL <E xBm< 5#5A< C~ f:  z% V A<C~ D5 0 05 Ǝ&f:  00.;8s گtگt)zu`!~B-< U  1w2w3w4w5w7w:wƎ ƎB@rf<w=w?w@wAwBw!wz"wr#wj$wb%wZ&wRwJ   t@qw 5 Ue B` B`  Ef:fBAe*Bҥ ~ 57 U t^ `fehU NE % BEAeBe$R~  = FwZ \}`( nگtگt){uw 56f:fuM@ee. Ae$ Me DuM      Me5 : Ae$J  w 5 0UC2 REC@ bw   5E5 <e \ U5<e`  B<w&! u :u ; fw f: 5  4E  *f@  2\}!L&BD~ U   .5 : \} \}(AC$9N<X:  $  <  &d|d fAm< U E5   4  eыAm> e$ wL&*Ǝ .\} vگtگt)|u@ AZ az w :گtگt)}u(09  w "گtگt)u<`< f-+ +- . ɠ ~ 5Nm>V   w Ǝ Zگt گt  )u" "wr گt"گt"")uF   ~5 5  $w0Ǝ @گt$گt$$)u&w& گt&گt&&)uC2L=  5 f    F5 : uew %|~UU  8U@ r  N`fehU E %" ꇇ5 :&- *; j  " \} ,\}`JP" b\}-H X: `w  d1 0 C    e0 e0 ;= u- @ev5 5 f@ A~fehU .E fA%1 fEh1fURy @\}Hh &  %0 f  p t < " ,\} 4\} B 0 0 \}$          6<6 B n   E +"iK 6 0 0 nn Br   0 0 T55 f1A% & C **%%b'   1  x6:Bx >rPP0HP N 0 0 0 p 1 Br LP * 0 0  B  0  0  A1" . K<}  0" 0"" $ $  0$ 0$$ &&w AHCCHeEA& fD  ~ԇ%FuJ `Dw E) ƇB ",>PZp>8e$FFJ% 4 C-C`AleC ",e%uDH UB,>P<:BxB:BxE`JF Q5H&   5   @,e ,&5 *8T8>db8T F00.TADATADATADATADATADATADATADATADATA 0& 0&&   EF 0 JEJ@JeJF  @J J F F5 H   e  &  ^ƎtƎp^   b $B ,f&$ EBa & & ̋•v ` 4\}$\}$$ !A[$%././0:  B pE `4 U & NU E  KօKօ2Kօ\}22.+"z+"+"' +"Z +"iK+"K!!Ӌ 0 0 H11 ff eA2$ $$$$$3 F>aW axZ(b,a@`:E`D b J\}2r>vb&|J!f e22 0 f e&&pd b@`& b$b(x,>2b&6a@`HT b^hJnb(xr bp vaGzaG~ bz*"f& e< Iq bK<}YPz6&""PD گt)Xuh)wuh)vuh)uh)uh)yuh )}uh2)|uh)xuh )zuh b){uh )uh)uhC)uhq)uh)uhY)uh) vh)uh)Hvh 0 گtNO HELP AVAILABLEALPHABETIC REQUIREDNUMERIC REQUIREDALPHANUMERIC REQUIREDSIGNED NUMERIC REQUIREDNON-DISPLAY6|ABLE CHARACTERFULL FIELD REQUIREDINPUT REQUIRED\YPz6&w~PD}y@s@:G@5 @wx@Ls@8T@='@~ @Dp@:4F@ 0@qh:@rhwhl &  & & & & & f& Ε  nwfe55 & & && && fRr&='*Dp.:G ~ DL N~  Dp:s ~r  ~ DDpH:s ~r T='^rh}l='+%׭& & & & & & & & & &  1<  <<P A> sT;w ='>DpB:4FVc&X<<}^L bL fL rL ~L ^t & & & & & f& Ε &f  ,}V} r$A> (Dp,wxJ5 N8TYPz6&fPDs@:G@='@$9Y@ ~@@$9΅@Dp@ 0rhRyh  w ѰB   f& & & & && f& Ε `  ,& & & & f& f& Ε.<='@DpD:G ~ x='|DpH| f& &  ׭W1 ":G ~ $s&$9΅,$9YYPz6&<PD5!@='H)x@G]\@i{@A> H($@DpHDb@ NT Hz>PHLsH >dH>rH SHL H :BxH>8H>HJHKօH gHLyHK<}H .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$ST .MACRO DLXBUF,LABEL,SIZE; .MCALL DLXDF$ DLXDF$T .BLKB PRO$OV' .IF NB

$8$)($L$NJ$B Function = R$" :$tJuFULL REGISTERS= ($Nn $FULL $OUTPUT_PACKETS e$"$B|I/O Operation Information:!1FL--- --------- ------------!2FL!5FCDevice Function!38FCType of Error!2FL!5FC!30DP!38FC!30DP!3FL o $2??? vd .$2B$6C$: $>i$Device Error Position Information:!1FL------ ----- -------- ------------!2FL!5FCCylinder!15FCGroup!22FCHead!28FCSector!39FCBlock!2FL!5FC!8DP!15FC!5DP!22FC!4DP!28FC!10DP!39FC!10DP!2FL!$hd!1FP!5FCEntry !DP!22FC(continued)!3FLDevice Supplied Information:!FL------ -------- ------------!2FLjL$ $0)#$N$ $B( (s$Bi )(i d)t$)(>$!1FP!5FCEntry !DP!20FCSequence !DP!40FC!6DP!48FC!18DP!DP!2FS!20DP!3FLDevice Supplied Information:!FL------ -------- ------------!2FL!1FP!5FCEntry !DP!20FCSequence !DP!40FC!6DP!FL!5FC!18DP!DP!2FS!20DP!3FLDevice Supplied Information:!FL------ -------- ------------!2FL)J1 J1 NONE JO $N  UPDATE_RECORD  ~'RR&NPt$&) $&)q~$& NOTESE NONOTESR$. UPDATE_RECORDC_| RF$ V_V$NjC$F*O)$. L$:nG$*.$>v$B $'VRr P K$R$zzu$RF~-$ L F$Rv$!HL$R!S$pFV m$NjS$F*O)$. $:n $*$>v~$Brz$R$R~<$$ $^$D '$NL$F*)L$.L  $:00c  TADATADATADATADATADATAF$*$>N$ ' $:N/A /$:./)I)2 $2N/A$2???( L$2.=)z)2? $N $F*e)$. $:L$*G$>$$6$T$>K$D@b 8^ (| DSP3P1P01.05V2.00rat DEVICE_ID DISPI@ ERROR_INFO_EV   @ ERROR_INFO_GD   HEADER    INDICATEJINTERMOD_DEVERR     ! # NOTE_NUMBERSS:REPORT   SUBCODE  TEMP_GEOM  START_MOD  U$GP$ TDevice MessageTDJ eceH $ro  ft T mu$ f $ l'0 ILLPACSBCC$ $)" $l)"  DEVSM1 DEVICE_NAMERI$& DEVICE_ENTRY DEVICE_ERROR DEVICE_ERROREVSBENNE $|&$* $xV) _N NE RVE$ BRIEFEf $NN>$g$a)(L$N$N$B Function = RB$"F  $tJuFULL REGISTERS= $$NB n$FULL:$OUTPUT_PACKETS$"G$B|I/O Operation Information:!1FL--- --------- ------------!2FL!5FCDevice Function!38FCType of Error!2FL!5FC!30DP!38FC!30DP!3FL --$2??? FC  $2i$6F$: $>r$Device Error Position Information:!1FL------ ----- -------- ------------!2FL!5FCCylinder!15FCGroup!22FCHead!28FCSector!36FCBlock!2FL!5FC!8DP!15FC!5DP!22FC!4DP!28FC!6DP!36FC!10DP!2FL-aS$hd!1FP!5FCEntry !DP!22FC(continued)!3FLDevice Supplied Information:!FL------ -------- ------------!2FLjcLe$ L$i)#p$N $ m$B: (-$B )(- -)-$F)($!1FP!5FCEntry !DP!20FCSequence !DP!40FC!6DP!48FC!18DP!DP!2FS!20DP!3FLDevice Supplied Information:!FL------ -------- ------------!2FL!1FP!5FCEntry !DP!20FCSequence !DP!40FC!6DP!FL!5FC!18DP!DP!2FS!20DP!3FLDevice Supplied Information:!FL------ -------- ------------!2FLP)2J1 cJ1 NONE nJO --$N- UPDATE_RECORD  'RR&NP $&N)  $&)qN$& NOTESE NONOTESRR$. UPDATE_RECORD|  $ VV $NjS$F*ON)T$. .$:nA$*R$>v$B V'VRr $Rj$zCz$R$~$ $R*$$R$pV $Nj$F*O)$.  $:n$*$>v$BrzV$Rm$R~S$$ $$$:nD ~$N$F*R)$.R <$:$*$>$ ' N$:N/A /:$:./*))2 $2N/A$2???  $$2.))2 I$N$F*)2$.? $:$*$>2$$6$$> $n 00c O  b @BDF H!( DEVICE_ID   DISPL0 ERROR_INFO_H HEADERD  INDICATES&INTERMOD_DEVERR  *REPORTI  SCSI_TAB  SUBCODE UNIT_TAB  *VAR    START_MOD-$2?hCDDZ "Inoat"---,--8"!2L FC<"rop2F= $>  B (0DP!2FL-aS$hd!1FP!5FCEntry !DP!22FC(continued)!3FLDevic p$edP $Device MountDevice DismountDevice Info ResetRCT Device error5*n$y  :evc>*Reserved- HSC505 UDA50F RC25F VMS Software ServerL TU81L UDA50A RD/RX TOPS 10/20 Software Server' TK50 RUX50 KFBTAE KDA50 TQK70 RV20 RRD50-QBUS KDB50 RQDX3 UQSSP/DSSI Tape UQSSP/DSSI Disk$ UQSSP/DSSI Disk and Tape$ UQSSP/DSSI Other  TUK50 RRD50-UNIBUS$ RQZX1` RF30a RF71b TF85c TF70$$ $*Reserved RA80 RC25 RCF25 RA60 RA81 RD51 RX50 RD52 RD53 RX33 RA82 RD31 RD54 RRD50 RD32 RX18 RA70 RA90 RF30 RF71 RD33 RA92% RA72( RA71g $atR e t* Reserved RX23 RX33 RZ22 RZ23 RZ23L RZ24 RZ25 RZ24L RZ55 RZ56 RZ57 RZ72$\ l $I ($P $T($P& J$ t)` i T(o$( D't0 ILLPACSBCHi$ $T)" $()" L DEVSM1 DEVICE_NAMEd tO$(Tt$ d(e$ BRIEFE)J$e$X )($n$ i$(>Volume Label = s$i)D d$:) Hard Errors = a$N/Ad-$-)#F)F , Soft Errors = l $N/AoF$g)#l)a e)5$FULL REGISTERSr0N/AIT$OUTPUT_PACKETS NONE UPDATE_RECORDS  $ )a$F$ )`$ N/AA ($$/u$2e)b wXe$00c  TADATADATADATADATADATAP Bfile, $: z 0        oi$$PBate n88e$: z f  e te   ^      ~DP  b N r   v$f  Z j V   ! " # $ n&  *  .  2  6 R PB 88$: z  f    ^      ~  b~ N$ r   vf  Z j V   ! " # $ n&  *  .  2  6 R t :$ BRIEFEVCJ!$a$Xt)(S$!$ $Block Replaced, LBN = $)#* $FULL REGISTERSl $N/AI<$OUTPUT_PACKETS $$U <'4/Data Transfer Error:!FL---- -------- ------!2FL :2-Replacement Status:!FL----------- -------!2FLF 2$8e * l$^)# $)# $)# $)#tp!4FCCommand Reference!25FCUnit Number!40FCSequence Number!60FCFormat!2FL!4FC!18DP!25FC!9DP!40FC!9DP!60FC!7DP!2FLU*:K$ *'* $>" * Unassigned e$=)#a s 1$ ->LL$ a' L,!$F, * Unassigned e>$$  ' I,$3, * Unassigned e)f0$YESnNO)$bYESnNO)H$NYESnNO#),$rYESnNOr)$YESnNOU)!4FCSUCCESS!12FCCONT.!23FCREPLACEMENT REQUEST!45FCERR DURING REPLCMNT!68FCRESET!2FL!4FC!4DP!12FC!4DP!23FC!4DP!45FC!4DP!68FC!4DP!2FL3P 4$v4)# D$f_))_$fb!4FCEvent Code/Subcode!25FCController S/N!41FCController model!2FL!4FC!9DP!25FC!15DP!45FC!30DP!2FL  $Z)# $j)# !$V)#jf!4FCClass!29FCController Sftwr Version!55FCController Hdwre Version!2FL!4FC!18DP!29FC!8DP!55FC!8DP!2FL $_)# :$)#$,VR!4FCMultiunit code!22FCUnit ID!40FCUnit Model!2FL!4FC!17DP!22FC!18DP!40FC!25DP!2FL $|)# 0$)#D@!4FCUnit Class!30FCUnit Sftwre Version!2FL!4FC!26DP!30FC!9DP!2FL $)# $n0)# 9$)#fa!4FCUnit Hrdwre Version!30FCCYLINDER!50FCVolume Serial Number!2FL!4FC!9DP!30FC!17DP!50FC!33DP!2FLP $z=  $>)#$ Z$ *$ ~!4FCLogical Block!20FCNew Replacement Block!47FCOld Replacement Block!70FCStatus!2FL!4FC!10DP!20FC!25DP!47FC!20DP!70FC!7DP!2FLp X$$4< $)#*&!4FCLast Header (RBN)!2FL!4FC!33DP!2FL 4  $ )#<$)# 4 $ (Primary RBN)e(Secondary RBN)3). A$N/Ai$)#),$SuccessyFailureS)~!4FCLogical Block!20FCNew Replacement Block!47FCOld Replacement Block!70FCStatus!2FL!4FC!10DP!20FC!25DP!47FC!20DP!70FC!7DP!2FL  $)#<C$)# 4 $ (Primary RBN)l(Secondary RBN)cC) $N/Ai$B)#)$SuccessyFailureS)~!4FCLogical Block!20FCNew Replacement Block!47FCOld Replacement Block!70FCStatus!2FL!4FC!10DP!20FC!25DP!47FC!20DP!70FC!7DP!2FL  :$840 W$R)#!4FCCause!2FL!4FC!9DP!2FL  NONE $NONEv UPDATE_RECORD6 $ 2$ &$6$>$ '@ $2. $.$!* $*$!: $:$!d2$ &$6$>$.$$)*$$):$$)@ b 800c O  b E11XXE11XX E11XXE11XXE11XXE11XX"E1134(E11XX,E11441-E11XX5E118XV CPU_ENTRY!$Zj EUNKWNV DEVICE_ENTRY$j$V CPU_ERRORT $NONE  CPU_ERROR$P $ BRIEFRdN$ $)($,11/E$*?t$0RL)"S) i$$)FULL REGISTERST I_$FULL$OUTPUT_PACKETS $hd!1FP!5FCEntry !DP!22FC(continued)!3FLMemory Supplied Information:!FL------ -------- ------------!2FLn Ld$ $)# $fs$ $A (-$F )( S)r$l)($!1FP!5FCEntry !7DP!20FCSequence !DP!40FC!6DP!48FC!18DP!DP!2FS!20DP!3FLMemory Supplied Information:!FL------ -------- ------------!2FL2!1FP!5FCEntry !9DP!22FCSequence !DP!40FC!6DP!FL!5FC!18DP!DP!2FS!20DP!3FLMemory Supplied Information:!FL------ -------- ------------!2FL2)1 NONE O@b 8_Id( DSP6P1P01.00V2.00FL-rHEADERS  INTERMOD_DEVERR &REPORTC   SUBCODE L START_MODIDESt:WF$St KtPower Recovery L$R S$8 ES'0 ILLPACSBCn_$x S$< )" E$8R)"  TS$t BRIEFC,T $x$@)($$lFULL REGISTERSn$Z$pOUTPUT_PACKETS NONE 1$tNONE|_T@b 8_IN> (< DSP7P1P01.01V2.00MHDATAC      "DEVICESDISPHEADER  INTERMOD_DEVERR OP_SYSE  PROC_CONVT *REPORT   SUBCODE  START_MOD  E"$d 04Time ChangeSystem CrashDriver LoadDriver UnloadSystem MessageS$  IfCPAn00c  TADATADATADATADATADATACPB-CPC-CPD- -$- -L"0$ '"#0 ILLPACSBCi$ $)" $)" $ ($:5*ntry !$ P!FR 0 F$ BRIEFCNnBi$L$-)(-$4 New Time = eF$R!)(! C$FULL REGISTERS=82$ OUTPUT_PACKETS a$RL)(VQTime Change Information:!1FL---- ------ ------------!2FL!5FCNew Time!2FL!5FC!20DPy NONE*$:$ne6 V B Z   ^$b f >  F j$ n D$ BRIEFCNB2$$)($4 Crashed at $6)(z  $FULL REGISTERSt$ OUTPUT_PACKETS $V $n$r$Z$ $B)#vrSystem Crash:!1FL------ ------!2FL!5FCSystem!18FCIdent!25FCCPU!30Format!2FL!5FC12DP!18FC!4DP!25FC!3DP!30FC!6DP!2FLn$6)(.$^)'$b6$f0m )&:$FI0J)&$Ft0)&xt!5FCTime of Crash!27FCActive Task!40FCTI:!48Kernel APR5 Mapping!2FL!5FC!20DP!27FC!6DP!40FC!2DP!3DP:!48FC!6DP!2FS!6DP NONET*sfer !$ L : r  p$e"tr-$: --'r- ! :$ BRIEFi.$" $$)( $4$:p$FULL REGISTERSotF$ OUTPUT_PACKETSoF$:!$FIDevice Driver Load:!1FL------ ------ -----!2FL!5FCDriver Name!2FL!5FC!2DP0MDevice Driver Unload:!1FL------ ------ -------!2FL!5FCDriver Name!2FL!5FC!2DPl ) NONE$* RR$ JNOP)N $ BRIEFe Y$J'#@4Y$N$)(Y$4$NC$JSF$@!4P$E$E)(F$4E$N'RT$FULL REGISTERSi!8$ OUTPUT_PACKETS #$x_$N!$JE`[System Message Service:!1FL------ ------- --------!2FL!5FCThe message follows:!2FL!5FC!80DPn" Z$J(x)V$Nf$JF`[System Message Service:!1FL------ ------- --------!2FL!5FCThe message follows:!2FL!5FC!80DPn($N(#$N)V$J(M"llgSystem Message Service:!1FL------ ------- --------!2FL!5FCThe message follows:!2FL!5FC!40DP!FL!5FC!40DP- NONE iS$NONEs@b 8_INPnP(` DSP8P1P01.01V2.00ge DATACDISPVHEADER  INTERMOD_DEVERR &REPORT-   SUBCODE  START_MOD--------$!2( Unknown InterruptUnknown Interrupt ee$c F--$\ --'F0 ILLPACSBCss$ !$`!)" F$\F)" D N$\O*T$J : 6 Xl$ BRIEFCrGfE$ $dO)($B Vector = s$:V)BN)&L , Lost Interrupts = O $6)#L D$FULL REGISTERSt~E$OUTPUT_PACKETSRV$:Y)Bp)&BE$6)#U$6A$ (Counter limit reached or exceeded))A LHStatus:!1FL-------!2FL!5FCVector!13FCLost Interrupts!2FL!5FC!4DP!13FC!DP NONE DO$NONEE00c O  b Sz$p J N Z ^ b f  j  n r R Vs$J sg'0 ILLPACSBCF$ $)" C$J)" -P*6 $ '*0 ILLPACSBCF"$ $ )" A$C)"  p$ BRIEFC`T($$)(t$ .Task = BP$ )'F , [k B$:F ]  $$FULL REGISTERSF $OUTPUT_PACKETSL$:R$ T)' $N)#$T$Z0T)&$f0T()&T$^0TI)&a$j0T-)&-$b0T-)&F$n0Tm)&!$r0T)&N$R0T)&*$V0T)&Status:!23FCProcessor : !DP!1FL-------!2FL Task: !DP!29FCI/O : !DP!2FL Reason: !DP!2FL R0 : !DP!30FCR3 : !DP!1FL R1 : !DP!30FCR4 : !DP!1FL R2 : !DP!30FCR5 : !DP!2FL!18FCSP : !DP!1FL!18FCPC : !DP!1FL!18FCPS : !DP!1FLP NONE $NONEA@b 8 _INPW_Z(¶ E1144VM01.02V2.00 TyDISPDBINTERMOD_DEVERR      REALDdREGISTER     " $&(*,.0REPORTV CPU_ENTRYALID P|P$RA  INEU T$6)cSI$6 )cMABELPPD$6> ER  _GFx $$h0P_CSR00&$MEMORY PARITY CSR 00 - 772100 : (& CSR = PN$0=D)!  (B)U  UCx I$ h0P_CSR01&$MEMORY PARITY CSR 01 - 772102 : B (& CSR = PR$0=)!D  (B)  vx T n$ h 0P_CSR02&$MEMORY PARITY CSR 02 - 772104 :  (& CSR = PL$0=Y)!  (B)  "x $h0P_CSR03&$MEMORY PARITY CSR 03 - 772106 : u (& CSR = P $0=)!  (B)N  'x $h0P_CSR04&$MEMORY PARITY CSR 04 - 772110 : * (& CSR = P$0=z)00c  TADATADATADATADATADATA!V  (B)  *x $h0P_CSR05&$MEMORY PARITY CSR 05 - 772112 : * (& CSR = P $0= )!  (B)*  *x $*h0P_CSR06&$MEMORY PARITY CSR 06 - 772114 : ' (& CSR = PJ$0=)!*  (B)*  v x *$*h 0P_CSR07&$MEMORY PARITY CSR 07 - 772116 : or (& CSR = P$0=)!Y  (B)  pe x l$eh$0P_CSR08&$MEMORY PARITY CSR 08 - 772120 : -- (& CSR = P-$0= )!-  (B)-  ---x - $ -h(0P_CSR09&$MEMORY PARITY CSR 09 - 772122 :  (& CSR = P*$0= )!c  (B)  z$x $ h,0P_CSR10&$MEMORY PARITY CSR 10 - 772124 : A (& CSR = P $0=<)!l  (B)  -x $ $ Nh00P_CSR11&$MEMORY PARITY CSR 11 - 772126 : N (& CSR = P $0=)!J  (B)  $x ) $ lh40P_CSR12&$MEMORY PARITY CSR 12 - 772130 : (& CSR = P $0= )!  (B)  z)x $ $ -h80P_CSR13&$MEMORY PARITY CSR 13 - 772132 : DP (& CSR = P$0=)!  (B)N  x ~$h<0P_CSR14&$MEMORY PARITY CSR 14 - 772134 : (& CSR = P$0=<)!l  (B)  $x F$h@0P_CSR15&$MEMORY PARITY CSR 15 - 772136 : f (& CSR = Pb$0=)!b  (B)  b)  $H0CACHERRCACHE ERROR REGISTER :Al  *Cache Memory Parity Error *Unused bits set &$*Parity Error High Byte (cache) 2$ &$*Parity Error Low Byte (cache) l *Tag Parity Error  *Unused bits setJ0CSHCTRLCACHE CONTROL REGISTER :N/ *Unused bits set#  Valid Store in UseT#  Valid Clear in ProgressP! *Unused bit set FS  Write Wrong Parity Tags "  Unconditional Cache Bypassc   Flush Cache  Parity Error Aborte$  Write Wrong Parity Data[ *Unused bits set  Force Miss High  Force Miss Lowh]$ *Unused bit seth &$ Disable Cache Parity Interrupt L0CSHMAIN" CACHE MAINTENANCE REGISTER ::!   Compare 1P!   Compare 2P:   Compare 37F   Valid6F  High Parity Bit!  Low Parity Bit$  Tag Parity Biteg   Hites *Unused bits set!2  Enable Stop ActionEe!  Address Matchedmi  Enable Halt ActionE!1  Hit on Destination OnlyDP ,*% Tag Data From Address Match Register3N0CACHHIT CACHE HIT/MISS REGISTER :t27  64 Tag Address of Last Access = C$0AC)&k SN *Unused bit set -$ B  Hit on 6th previous access  Miss on 6th previous accessA B  Hit on 5th previous access  Miss on 5th previous accessX B  Hit on 4th previous access  Miss on 4th previous accessP! B  Hit on 3rd previous access  Miss on 3rd previous accessC$ B  Hit on 2nd previous access  Miss on 2nd previous accessL) B  Hit on most recent accesss  Miss on most recent accesssd\N/AsCXN/As!TN/AsPtN/As5`???sFlN/As4hN/AsdN/AsPN/As"p  $ppTrap Thru Vector 114 $F$x.)!5FCName!13FCValue!25FCInterpretation!2FL2T$!2FL!5FC!DF!13FC!DP!25FC!DP!2FLt.d$!25FC!DP!75FC!DP!CE! !25FC!DP!CEtU) C00c O  b (Ķ E117XVM01.02V2.00MDISPDBINTERMOD_DEVERR      REALDxREGISTER     " $&(*,.02468:REPORT_x CPU_ENTRYrity Bf$|$    $6S)cAn$6)cdressPPn$6 At !1 x $nh0P_CSR00&$MEMORY PARITY CSR 00 - 772100 : 0 (& CSR = PC$0=S)!E  (B):  x  a$sh0P_CSR01&$MEMORY PARITY CSR 01 - 772102 : B (& CSR = Pr$0=s)!  (B)o  reix c$h 0P_CSR02&$MEMORY PARITY CSR 02 - 772104 :  (& CSR = P $0=c)!  (B)s  pex u a$ h0P_CSR03&$MEMORY PARITY CSR 03 - 772106 : (& CSR = Pn$0=a)!s  (B)i  ndpx i s$Lh0P_CSR04&$MEMORY PARITY CSR 04 - 772110 : d (& CSR = PN$0=N)!  (B)N  x s l$Ah0P_CSR05&$MEMORY PARITY CSR 05 - 772112 :  (& CSR = Pu$0=)!  (B)  .x C m$ah0P_CSR06&$MEMORY PARITY CSR 06 - 772114 : Lt (& CSR = P5$0=!)!C  (B)U  SR=x $ $ h 0P_CSR07&$MEMORY PARITY CSR 07 - 772116 : P (& CSR = P1$0=()!  (B)  x ) *$*h$0P_CSR08&$MEMORY PARITY CSR 08 - 772120 : 07 (& CSR = P($0= )!  (B)0  (x $ xh(0P_CSR09&$MEMORY PARITY CSR 09 - 772122 : : (& CSR = P $0=0)!!  (B)B   -x $ h,0P_CSR10&$MEMORY PARITY CSR 10 - 772124 :  (& CSR = P0$0=B)!  (B)  $x h$ h00P_CSR11&$MEMORY PARITY CSR 11 - 772126 : (& CSR = PB$0=)!  (B)  0x  $ &h40P_CSR12&$MEMORY PARITY CSR 12 - 772130 : ! (& CSR = P$0=)!l  (B)  _CRx $ h80P_CSR13&$MEMORY PARITY CSR 13 - 772132 : (& CSR = P$0=)!  (B)1  MEOx P I$1h<0P_CSR14&$MEMORY PARITY CSR 14 - 772134 : (& CSR = P$0=1)!$  (B)R  Y Sx 4 $:h@0P_CSR15&$MEMORY PARITY CSR 15 - 772136 :  (& CSR = P1$0=R)!A  (B)R  723D0LOW_ERR" LOW ERROR ADDRESS REGISTER :0 20 Error Address LSBs = S$ )&  (O)a F0HIGHERR$"HIGH ERROR ADDRESS REGISTER : Hi ZX Cycle Type = $Data In (read) Data In Pause Data Out Data Out ByteP)  *Unused bits set 64 Error Address MSBs = $0rt)&e  (O) H0CACHERRCACHE ERROR REGISTER :og  *CPU Abortse *CPU Abort After Errorng *UNIBUS Parity Errordi $"*UNIBUS Multiple Parity Errorsac  *CPU Errory  *UNIBUS Errorp W *CPU UNIBUS AbortP *Error in Maintenancet " *Data Memory Group 1 (cache)is " *Data Memory Group 0 (cache) &$*Address Memory Group 1 (cache) 0 &$*Address Memory Group 0 (cache) ER *Main Memory Odd Word  *Main Memory Even Word 3 (&!*Main Memory Address Parity Errorit *Main Memory TimeoutJ0CSHCTRLCACHE CONTROL REGISTER :d  *Unused bits sete   Force Replacement Group 1ch  00c  TADATADATADATADATADATA Force Replacement Group 0  Force Miss Group 1Gly  Force Miss Group 0Gre  Disable Unibus TrapAC  Disable TrapsL0CSHMAIN" CACHE MAINTENANCE REGISTER : .,( Force set Mem Parity, Odd Word, Hi Byteit .,( Force set Mem Parity, Odd Word, Lo Byteac 0.) Force set Mem Parity, Even Word, Hi Bytets 0.) Force set Mem Parity, Even Word, Lo Bytetou 0.) Force wrong Fast Address Parity, Group 1t H 0.) Force wrong Fast Address Parity, Group 1tac 0.) Force wrong Fast Address Parity, Group 0ts 0.) Force wrong Fast Address Parity, Group 0tnt 64/ Force wrong Fast Data Parity, Group 1, Hi Bytea 64/ Force wrong Fast Data Parity, Group 1, Lo Bytea 64/ Force wrong Fast Data Parity, Group 0, Hi Byteap 64/ Force wrong Fast Data Parity, Group 0, Lo Byteaue  Memory Margins = $ReservedNormalCheck Wrong Address Parity Early Strobe Late Strobe- Low Current- High Current )  *Unused bit setlN0CACHHIT CACHE HIT/MISS REGISTER :rFC  *Unused bits setAd B  Hit on 6th previous access  Miss on 6th previous accesson B  Hit on 5th previous access  Miss on 5th previous access*I B  Hit on 4th previous access  Miss on 4th previous access B  Hit on 3rd previous access  Miss on 3rd previous access B  Hit on 2nd previous access  Miss on 2nd previous access& B  Hit on most recent accesss  Miss on most recent accesss\N/AsCXN/As3TN/As!tN/As3`???s!lN/As!hN/AsFdN/AsDPN/As"LpH  g $pefpTrap Thru Vector 114 he$xe*%!5FCName!13FCValue!25FCInterpretation Z*%!2FL!5FC!DF!13FC!DP!25FC!DP!27FC!50FS . $!25FC!DP!75FC!DP!CE! !25FC!DP!CE52)@b 8 _INPW_Z7$_7$j>(&Ƕ E118XVM01.01V2.00MDISPDBINTERMOD_DEVERR      REALD`REGISTER     " $&(*,.REPORT CPU_ENTRY Timeo|0$  e  $6c)cpm$6u)ch PPr$6  Frx M s$1h0P_CSR00&$MEMORY PARITY CSR 00 - 772100 :  (& CSR = PL$0=S)!I  (B)C  INEx C R$ h0P_CSR01&$MEMORY PARITY CSR 01 - 772102 : s (& CSR = P $0=t)!  (B))  stx m a$vh 0P_CSR02&$MEMORY PARITY CSR 02 - 772104 : ou (& CSR = Pr$0=d)!s  (B),  1tHx  .$ch0P_CSR03&$MEMORY PARITY CSR 03 - 772106 : es (& CSR = Ps$0= )!c  (B)  drsx a t$ph0P_CSR04&$MEMORY PARITY CSR 04 - 772110 : 4 (& CSR = Pt$0=y)!r  (B)L   x /$ h0P_CSR05&$MEMORY PARITY CSR 05 - 772112 : Da (& CSR = P,$0= )!  (B)  Magx $sh0P_CSR06&$MEMORY PARITY CSR 06 - 772114 : Lo (& CSR = Pu$0=)!  (B)*  bi x l $h 0P_CSR07&$MEMORY PARITY CSR 07 - 772116 : Ad (& CSR = P $0=s)!c  (B)  6hx e o$sh$0P_CSR08&$MEMORY PARITY CSR 08 - 772120 : ss (& CSR = Po$00c O  b  (Kɶ E119XVM01.00V2.00MDISPDBINTERMOD_DEVERR      REALD`REGISTER     " $&(*,.REPORT CPU_ENTRYibus A t|$ Q  2r$6o)co$6t)c er ODPPp$6  " ussx a B$sh0P_CSR00&$MEMORY PARITY CSR 00 - 772100 : nu (& CSR = P $0=i)!o  (B)r 00c  TADATADATADATADATADATA  acex $ h0P_CSR01&$MEMORY PARITY CSR 01 - 772102 : 5 (& CSR = Pa$0= )!  (B)  s cx s $oh 0P_CSR02&$MEMORY PARITY CSR 02 - 772104 : on (& CSR = Ps$0=)!i  (B)n  ou x e $sh0P_CSR03&$MEMORY PARITY CSR 03 - 772106 : s (& CSR = Pe$0=N)!  (B)N  x s t$Ah0P_CSR04&$MEMORY PARITY CSR 04 - 772110 :  (& CSR = P $0=)!  (B)  ctrx 4 $xh0P_CSR05&$MEMORY PARITY CSR 05 - 772112 : FL (& CSR = PF$0=p)!  (B)D  DPCx  5$Eh0P_CSR06&$MEMORY PARITY CSR 06 - 772114 : P (& CSR = P1$0=()!  (B)  x ) $ h 0P_CSR07&$MEMORY PARITY CSR 07 - 772116 : 06 (& CSR = P($0= )!  (B)0  (x $xh$0P_CSR08&$MEMORY PARITY CSR 08 - 772120 : : (& CSR = P $0=0)!!  (B)B   6x $ h(0P_CSR09&$MEMORY PARITY CSR 09 - 772122 :  (& CSR = P0$0=B)!  (B)  v$x h$ h,0P_CSR10&$MEMORY PARITY CSR 10 - 772124 : (& CSR = PB$0=)!  (B)  ,x  $ &h00P_CSR11&$MEMORY PARITY CSR 11 - 772126 : ! (& CSR = P$0=)!  (B)  _CRx $ h40P_CSR12&$MEMORY PARITY CSR 12 - 772130 : (& CSR = P$0=)!  (B)1  MEOx P I$ 1h80P_CSR13&$MEMORY PARITY CSR 13 - 772132 : (& CSR = P$0=1)!$  (B)R  Y Sx 3 $:h<0P_CSR14&$MEMORY PARITY CSR 14 - 772134 : B (& CSR = P1$0=R)!A  (B)R  723x $h@0P_CSR15&$MEMORY PARITY CSR 15 - 772136 : (& CSR = PR$0=R)!  (B)6   CR $H0CACHERR$"MEMORY SYSTEM ERROR REGISTER :  CPU abortSST DMA Tag Store Comparator DMA Tag Store Parity  *Unused bits setJ0CSHCTRLCACHE CONTROL REGISTER :y *Unused bits setL0CSHMAINMAINTENANCE REGISTER : *Unused bits set  KDJ11-E Modulet *Unused bits setN0CACHHIT CACHE HIT/MISS REGISTER :Tte *Unused bits setU\N/AulXN/AusTN/AutN/Auc`???ulN/AurhN/AudN/AuWPN/Au"Dp e b$pepTrap Thru Vector 114 $xF.)!5FCName!13FCValue!25FCInterpretation!2FLiT$!2FL!5FC!DF!13FC!DP!25FC!DP!2FLt.S$!25FC!DP!75FC!DP!CE! !25FC!DP!CEt )KE@b 8_INPW_Z7$_7$j7$@v7$> (S˶ E11XXVM01.02V2.00MDISPDBINTERMOD_DEVERR      REALDPREGISTER     " $&REPORT CPU_ENTRYS A|$ S  _G_F1$6$)cC$6)cETDDL$62 LGP Fx P $Kh0P_CSR00&$MEMORY PARITY CSR 00 - 772100 : (& CSR = P$0=i)!  (B)  x  00c O  b @BDFH J!L"N#P$R%T&V'X(Z)\*^+REPORTR  DEVICE_ENTRY_VARWID44_$J 0MLCS1 *Special Condition setLG *Transfer ErroriV_ &$*MASSBUS Control Bus Parity Err _M *Unused bit setlC . Drive Available*Drive not AvailableAR R($ Unibus B Selected for data transfer($ Unibus A Selected for data transfer .,  BA17,BA16 = eT$0,)!S  (B) M *  Device Readye*Device not Readyd ) 2 Interrupt Enabled Interrupt not Enabled   Function = h$ MS  *Go bit on0|MLWCh 64 Word Count = "$|`)C)#  words remaini00c  TADATADATADATADATADATAng 0MLBAMS  Bus Address Registerd0MLDA h *Unused bits set  "  Sector Address = `$ )# 0MLCS2  *Data Late *Write Check ErrorM1 *Parity Error (memory)&) *Nonexistent Drive *Nonexistent Memoryr *Program Error *Missed Transfer2 $"*MASSBUS Data Bus Parity Error S *  Output Ready  Output not Ready b &  Input Ready Input not Ready ,*% Controller Clear (clears all drives)SOW :*Parity Test set (even)r Parity Test reset (odd)S (&" Bus Address Increment Inhibit set  Unit Selected = e0$ 0MLDS  Attention Activee *Error (composite)KN *Unused bit sett * Medium Online*Medium not Online: *Unused bit seti ,*& Last Block Transfered (last of drive) *Unused bit setn P * Drive Present*Drive not Present &  Drive Ready*Drive not Ready 8  Volume Valida$ *Volume not Valid (battery off) : *Unused bits set 0XMLERRx  *Data Checks &$*Drive Unsafe (AC Lo/Prom Data) 13 *Operation IncompleteP *Unused bits set *Invalid AddressSR *Address Overflow Erroro13 *Unused bits set *ECC Hard ErrortS $"*MASSBUS Data Bus Parity error *Unused bit setu13 &$*MASSBUS Control Bus Parity Err  $"*Register Modification Refused *Illegal RegisteraY *Illegal Functiona0MLAS *Unused bits set$   Unit #7 Attention Activef`   Unit #6 Attention Activef   Unit #5 Attention Activefit   Unit #4 Attention Activef!5   Unit #3 Attention Activef2F   Unit #2 Attention Activef25   Unit #1 Attention ActivefE!   Unit #0 Attention Activef0`MLPA *Unused bit setid  d(& Array Board Selected = u$d)# d  lF$ MLPA [6:0] is a Column Address  MLPA [6:0] is a Row Addresset p,* Row Address Selected = Row $p)#N Au *Unused bit setl h64$l Row Columne)  Address = m b$h)# 0MLDB114 64 Data Buffer contents !$  (see note)rp)a 0\MLMRL!5 "  Number of Array Cards = 16.C! "  Number of Array Cards = 8.. "  Number of Array Cards = 4..lo "  Number of Array Cards = 2..sl "  Number of Array Cards = 1..2 * 64K Chip Arrays 16K Chip Arraysmn (# Selected Transfer Rate = 2 Mb/sec.v(# Selected Transfer Rate = 1 Mb/sec.v($ Selected Transfer Rate = .5 Mb/sec.*% Selected Transfer Rate = .25 Mb/sec.)N >" Refresh Margin Slowed by 50%  Refresh Margin Normald 2 Prom Read/Write onm Prom Read/Write off , Prom Disable on Prom Disable offo 5 ( Data Clock on Data Clock offfac < Data Diagnostic Mode on Data Diagnostic Mode off vi 2 Data Check Enabledd*Data Check Disabled M > Error Correction Disabled Error Correction Enabledd : ECC Diagnostic Mode one ECC Diagnostic Mode off0MLDT re *Unused bits setN/   Drive Type = $ 0xMLSNN/ 20 Drive Serial Number = f$x)   (BCD)  t$((0$MLE1) *Unused bits setF 0@> Syndrome Word of the Sector = b.$00rC)!!  (B)! E! *Unused bits set 4B@! Syndrome Word A of the Sector = se$40rd)!s  (B) 08MLE2-  *Unused bit setA @DB# High order 7 bits of Array Word = cE$@0 E)!T  (B)  *Unused bits seton DB@! Syndrome Word B of the Sector = =a$D0rB)!  (B)o (0$MLE1Mis *Unused bits seton (B@! Parity CRC Word of the Sector = =a$(0tB)!  (B)o 3 *Unused bits setac ,<: C00c O  b   Bits 00-15 of the Array Word = $0 5)&D  (O)! (0MLD2bun @>  Bits 16-31 of the Array Word = F$0 C)&r  (O)F *0HMLEE3 " *Uncorrectable Channel Error *Single Channel Errorl " *Error Detected in CRC Wordrl *Unused bit set  L$"*Channel in Error = X$L )# Qe P20 Error Pattern = $P0r*)!  (B)0 ,0TMLEL (& Error Sector Address = $T)# .0tMLPD 0.) Prom Data (depending on MLMR bits 3,5,6)d  $:%,P] 00MLBAE  *Unused bits set 64 BA21 through BA16 = $0 A)!  (B) 20MLCS3!5 *Address Parity Error P! $"*Data Parity Error on Odd Word!6 &$*Data Parity Error on Even Wordi $"*Write Check Error on Odd Word P &$*Write Check Error on Even Wordi_$  Double Word Transferedvon *Unused bits setel 0 Interrupt Enabled Interrupt Disablede *Unused bits sets!  Inverse Parity CheckenNl$r ~0^ $bNo OperationCDrive ClearFRead_In Preset Search CommandPWrite Check Data5Write DataRead Data4 i$xl) 3N^S$ Vs'N L!$b0Invalid function) $0)"N/Aa U$T )#rN/Aa0N/Aa5|o$ r$h mr$L*"!( 2"0XXXX X X XXXX&"i$   ! F$RcNo error bit found4 C0$C.)!5FCName!13FCValue!25FCInterpretation!2FLd$&$C R)$F * $ $#$ i@b 8_INPW_ZT!Ə7$7$_7$j7$@v7$> (HѶ ERK05VM01.01V2.00MDISPCFUNCTION BINTERMOD_DEVERR      XREGISTERS     " $&(*REPORT_  DEVICE_ENTRYf An yrds =r$60RKDS A  &$ Interrupting Drive = r$ )#a C *Drive Power Low C  . Drive is an RK05v Drive is an RK03vAr  *Drive UnsafeRec *Seek Incompleteec 2 Sector Counter OK*Sector Counter not OKd 6  Drive Ready (heads loaded) *Drive not Ready5 R.) R/W/S Ready (no positioning in progress)d"*R/W/S not Ready (positioning) P(# Write Protect on (write protected)g&" Write Protect off (write enabled)sa X*& SC=SA (sector countor=sector address),( SC<>SA (sector counter<>sector address)st "  Sector Counter = C$k)#a 0RKERled  *Drive Errorre &$*Overrun (Overflow out of disk) dd *Wri00c  TADATADATADATADATADATAte Lockout Violationne  *Seek Errorode *Programming Error *Nonexistent Memorya  *Data Late  *Timing ErrorM2 *Nonexistent Diskr$ *Nonexistent Cylinderi *Nonexistent Sectore *Unused bits set *Checksum Errortth *Write Check Error0RKCSu *Error (RKER bits set)th " *Hard Error (RKER 5-15 set)i . Search Complete Search not CompleteD *Unused bit setpAr $"*Bus Address Increment Inhibit b`*Format bit set @$Fd(Writing headers)eo) a$W(Reading headers)e)  *Unused bit setsnu &$  Stop on Soft Error (RKER 01-00)ct 2 Controller Readyo*Controller not ReadyR s 2 Interrupt Enabled Interrupt not Enabled .,  BA17,BA16 = t$0,s)!b  (B)c    Function = b$l f  *Go bit on0RKWC 64 Word Count = $ )C<)#:  words remainingh 0RKBA  Bus Address Registerd 0RKDA(  "  Drive Selected = $n)#l )t $" Cylinder Address = s$-)#o or * Surface = Lower Surface = Uppers "  Sector Address = $)#C  (0RKDB"  Data Buffer contentsd:$p0Jl NControl ResetWriteReadWrite CheckSeekRead CheckDrive ResetWrite Lockt $RK05RK03)pN/A5:Je$ de': $l#$NlInvalid function m$t)"eh0i$Rb$ ) :!$,!])#|N/AMx $)#n$1.0.e) $6)# A$uh$ h60$ B$) ! !$!d"r)# P i$rD 11. tP$t r1. x!$$")#  0.rE$d")# $>"e< &"n$  s r$ F $n Controller not readyrNo error bit foundD sl$L .)!5FCName!13FCValue!25FCInterpretation!2FLdr$$CO@&b 8_INPW_ZT!Ə"7$7$_7$j7$@v7$>0#(Ӷ ERK67VM01.01V2.00MDISPCFUNCTION BINTERMOD_DEVERR       NOTE_NUMBERS REGISTERT     " $&(*,.02468:<>@BDFH J!L"N#P$R%T&V'X(Z)\*^+`,b-d.f/h0j1l2n3p4r5t6v7x8REPORTS VAR   \! DEVICE_ENTRYJ!Dv W,,$600RKCS1z *Combined Error setRI  Drive Interrupt setT $"*Drive-Controller Parity Error J$*18 Bit Data Format (20 sector) $ 16 Bit Data Format (22 sector)  *Controller Time-out0  8F" Controller Drive Type = RK07r" Controller Drive Type = RK06r 4.,  BA17,BA16 = r$40,a)!K  (B)  2 Controller Ready *Controller not Readye 2 Interrupt Enabled Interrupt not Enabled *Unused bit setE n <00c O  b $ Parity Test ondd)2$ Parity Test offn) v Message Pair 0 Selected Message Pair 1 Selected Message pair 2 Selected Message pair 3 Selected0tRKECPSnno  x ECC Position = E$l 0|RKECPT C  0. ECC Pattern = $0PE)&l  (O) 0RKA0e o  Drive Status Change  Position in Progresstd   Spindle onn  Write ProtectedN/    Offset onl &*18 Bit Format 16 Bit Format . Drive Type = RK07 Drive Type = RK06ts &  Drive Ready*Drive not Readye *  Volume Valida*Volume not Valid6 . Drive Available*Drive not Available o *Unused bits set *( Message came from Drive s$)# 0RKB0s o *Read/Write UnsafeE) *Drive Off Tracknu *Spindle Speed LossD S *Write Lock Errors = *Seek Incompleteo $"*Controller-Drive Pari00c  TADATADATADATADATADATAty Errornu *Nonexecutable Functionyf  *Fault  *AC Lowco *Invalid Addresset *Unused bit setsd *Unused bits setv  Message ID = $n)#d 0RKA1gh  Unloading Heads =  Returning to Zerot  Loading Headsse   Reverse   Forward S "  Speed OKH *Speed not OKs *  Pack Presents*Pack not Presentoe *  Door Latcheds*Door not Latchedong &  Brush Homea*Brush not Homee  & *Heads HomeH Heads not Homee0 6 Servo Signal presento*Servo Signal missingohe *Unused bit setiF *( Message came from Drive Ea$ )#n "0RKB1le  *Servo Unsafe  *Limit Detected on Seeke *Seek and No MotionS" *Servo Signal ErrorS  *Tribit Error te  *Index Error *Multiple Head Selecte&  *Head Faultes $"*Write Gate and No Transitionr P  *Sector ErrornLM *Unused bits set0   Message ID = s$ b)# $0RKA2 th *Unused bit sett   P!   $or *Unused bit settrr $" Message from Drive t$h)# &0RKB2 *Unused bit setr  $" Cylinder Address = $)#n se *Unused bits seted  Message ID = $)# (0RKA3se  20 Drive Serial Number = s$^)   (BCD)o C *( Message came from Drive te$h)#m *0RKB3Wri *Unused bits setl)   8  Head = 0.  Head = 1.  Head = 2." (  Sector = $()#  *Unused bits set $ Message ID = $$ )# H2@@:"X " 4" ! RcNo error bit found4 C0$C.)!5FCName1M2Mr:t$n!0JNSelect DrivePack AcknowledgeDrive ClearUnload3Start SpindleRecalibrateOffsetSeek4Read Data0 Write Data Read Headerl Write HeaderC Write CheckD!>!$-M+r0)7$M!F$8)#)#C  uin.  ~ $ Offset Value = o$-O+eC) $O$8B))#  uin.e  Cylinder Difference = eg$l)#o k) C w$xe&  k$x6dNormale$xB)#k) tOutside of legal range7t0$8RK07RK06 )$p 8$0) :J$< F': !l4$N!l*Invalid functionr $HN)"h$$dBRC$T !$X!)#|N/A$x $d)# >$T)# $X@)# $2$. $L.h**$dB$T:!$X!")#  $XR21. $ .$T1 $2.x$d")#$$T")#$X")# $p $*"(   $2 $P"(   $ Drive Faultn $Drive Off Tracko $ Spindle Speed Loss( $ Servo UnsafeSeek Incompleteo"  Read Write Unsafes.",D    "  $"P  0 hD D hD DD 0 DD $X @$Operation Incomplete& $ HVRC Error V"P  0 hD D hD DD 0 DD $X @>$Operation Incomplete& $ HVRC Error V Status not Valid  V$NNo error bit found 3$l.)!5FCName!13FCValue!25FCInterpretation!2FL$$$  F$5N00c O  b  (>׶ ERL12VM01.06V2.00M DEVICE_OPDISPBINTERMOD_DEVERR      TREGISTERF     " $&(REPORT  VAR DEVICE_ENTRYfset C$J 0RLCSe *Composite Error  *Drive Error  *Error Code = L$ at  Drive Selected = N$X  2 Controller Ready *Controller not Ready EC 2 Interrupt Enabled Interrupt not EnabledF$ .,  BA17,BA16 = te$0,()!  (B)n b   Function = $h ai &  Drive Ready*Drive not Ready0RLBA)  Bus Address Registerd Ps$BBBB0RLDA  (& Cylinder Address = $a)#y Te B  Head Selected = Lower head  Head Selected = Upper head  &$ Sector Address = $ )#r 0RLMP1r $" Register contents undefined R00RLDA  Field value meaninglessat & *Required-reset-bits are set   Reset  *Required-reset-bit is setit , Get Status set-*Get Status reseti $*Required-set-bit is reset 0RLMP18 $" Register contents undefined R 0RLDAits  0. Cylinder Address Difference = $*)# V *Unused bits setli B  Head Selected = Lower heade  Head Selected = Upper headese  *Required-reset-bit is set c > Seek Direction = Forwardt Seek Direction = ReversetUn  *Required-reset-bit is set  $*Required-set-bit is reset0RLMP1 = $" Register contents undefined =R0RLDAror $" Register contents undefined =0RLMP1  (& Cylinder Address = n$d)#s et B  Head Selected = Lower headd  Head Selected = Upper headd &$ Sector Address = $ 1)# v0RLDAg H $" Register contents undefined =0RLMP1ea $" Register contents undefined =t S $:j0RLBAE O  *Unused bits setes 0. BA21 - BA16 = td$0 n)!L (B)n   shH0RLMP2 *Write Data Errorsds *Current Head Erroruig  Write Protectedna *Seek Time Outnu *Spin Speed Erroroes *Write Gate Erroro#   Volume Checkr *Drive Select Erroru*L . Drive Type = RL02 Drive Type = RL01 > Head Address = Lower head Head Address = Upper heador  *Cover OpensHe   Heads Out (over the disk)   Brushes Homev P  Drive State = r$*Invalid stateLoad CartridgeSpin UpF Brush Cyclet Load HeadsSeekLock Onr Unload Heads Spin Downo )  &"   t settrr $" Message fD$I  IOperation Incompletep8 $rr Write Checkn Data CRCa Header CRCe  Data LateCaeHeader not Founde=Nonexistent Memory o Memory Paritye$eUnknown Error = $3)# p$dRL02RL01l)lN/A2hd$*Invalid Functiony*Invalid FunctionU Write Checkl Get StatusSeek Read Header Write Data Read DataoRead Without Header Check-#)  H$@)" $IIIv $$I 4$I$Io o$i)#u$&$00c  TADATADATADATADATADATA$)"!)#a $"t $:)#( $)#St$vt $a)#ntN/AviN/Av|n$1.0.)SxN/A eX$ /////8ed2$P/$( r!t$a!)# dN/Al|N/A e$&"i$   $ $F" u .$ $ $ l$oNo error bit found $L.)!5FCName!13FCValue!25FCInterpretation!2FLr x$e$ea@&b 8_INPW_ZT!Ə"""ƺ7$7$_7$j7$@v7$>t"(ٶ ERM05VM01.04V2.00Mp DEVICE_OPDISPFUNCTIONI BINTERMOD_DEVERR       NOTE_NUMBERST REGISTER_     " $&(*,.02468:<>@BDFH J!L"N#P$R%T&V'REPORTA VAR DEVICE_ENTRYo dthout,, $J0RMCS1I *Special Condition set *Transfer Errori &$*MASSBUS Control Bus Parity Err :) *Unused bit setl D Drive Available.**Drive not Available (other port using it)) R($ Unibus B Selected for Data Transfer($ Unibus A Selected for Data Transfera! .,  BA17,BA16 = e|$0,)!  (B) $ 2 Controller Readyd Controller not Readyr 2 Interrupt Enabled Interrupt not Enabledit   Function = $) !5  *Go bit on0lRMWC 64 Word Count = $l)CL)#  words remainingr 0RMBA  Bus Address Registerd0RMDAnde *Unused bits setd "  Track Address = sd$l)#e = & *Unused bits set (see note) r  "  Sector Address = e$ t)#c 0RMCS20  *Data Late v *Write Check Erroreq  *Parity ErrorE *Nonexistent Drive *Nonexistent Memorye *Program Error *Missed Transfer$ $"*MASSBUS Data Bus Parity Error J&" Output Ready (silo contains data)" Output not Ready (silo empty)  B  Input Ready (silo not full)  Input not Ready (silo full)d 42- Controller Clear (clears all drives as well)l H H"*Parity Test set (even parity)$ Parity Test reset (odd parity)r S $"*Bus Address Increment InhibitUn  Drive Selected = i$e 0RMDS-se  Attention Active R  $"*Error (RMER1,2 have bits set)0  Position in Progressbco * Medium Online*Medium not Online 8 Drive is Write Locked Drive is Write Enabledt = 0.* Last Sector Transfered (last of the pack)& .,( Programmable (ports program selectable)LD * Drive Present*Drive not Present &  Drive Ready Drive not Ready u *  Volume Valida*Volume not Validt *Unused bits set0 : Drive in Offset Modep Drive not in Offset Moder 08RMER1a < *Data Checkint  *Drive Unsafe W 00c O  b  DRQ on (dual port unit)  DRQ off (single port unit)D *Unused bits set ( Drive Type = a$r 0hRMSN 20 Drive Serial Number = n$h) "  (BCD) 0dRMOF *Unused bits setD 2 16 Bit Data Formatr*18 Bit Data Formatr@ "  ECC Inhibit  ECC enabled$ : Header Compare Inhibitn Header Compare Enabledn *Unused bits setD B  Offset Direction = ForwardD  Offset Direction = ReverseDio *Unused bits set0RMDC *Unused bits set  $" Desired Cylinder = $)# 0HRMHRe!2   Holding Register contents 0\RMMR2 "  Port A Request for ServiceDd "  Port B Request for ServiceD  Control Select Tag on0 ,*1$X Test Sequencer Branching on) "  Control or Cylinder Tag onn H  Control or Head Tag ong   `DBe$X Maintenance Bus Lines = o$` 0te)!t  (B)a n)"0DRMER2La $"*Bad Sector Detected (Hdr bit) B *Seek Incompleteom $"*Operator Plug Error (removed) H &$*Invalid Command (VV bit reset)c*S *Loss of System Clockb*U *Loss of Bit Clock M *Unused bits set#  *Device Checks *Unused bits set*L *Data Parity Error *Unused bits set$0,RMEC1 *Unused bits setrr  0 ECC Position = *$d &04RMEC2at *Unused bits set   ECC Pattern = t $ > 0$:%,Ees((0RMBAER  *Unused bits set 64 BA21 through BA16 = b$0 s)!b  (B)r *0RMCS3Dr *Address Parity Erro00c  TADATADATADATADATADATArb " *Data Parity Error, Odd Word C $"*Data Parity Error, Even Wordt*U " *Write Check Error, Odd Wordge $"*Write Check Error, Even Wordt2  Double Word Transferedn  *Unused bits setsa 2 Interrupt Enabled Interrupt not Enabled *Unused bits setd >< Inverse Parity Check Bits = t $0r )!t  (B)( (,,"se ts" $ Message ID = $$ )# H2N$"0^obNo OperationSeek CommandRecalibrateDrive ClearRelease (dual port)Offset CommandReturn To CenterlineRead_In Preset Pack Acknowledge Search CommandWrite Check DataWrite Check Header And DataWrite DataWrite Header And DataRead DataRead Header And Data $ $0 8& B$06#Normal.$0)#y)  Outside of legal range C w$@ue: Irrelevant (ECH set))Irrelevant (ECH set) g $d t8:KIrrelevant (ECI set)Irrelevant (ECI set)*$$4 n0c)& (O) $ "$hh) $N^R$  'N #$bInvalid function T$#)" $('n *$|$$$@d!B$ !)#*|$$`$ X!$ !R)#N/A $)#$ $)# $ )# $<$@T$  $('/X*|$#$p$@ !$ !)#*|$$`$ !$ !)# $   $('P63.31. $1 @ $ $('131.19.D$f"T)#$")#$ "S)# e$L$ ( $ *"( j"thDDD D D D DD8888 8 8 8 8 88888888""     $No error bit found  $v.)!5FCName!13FCValue!25FCInterpretation!2FL)$e$~n$ ol$@$b 8_INPW_ZT!Ə"""ƺ"7$7$_7$j7$@v7$>!(ܶ ERM23VM01.04V2.00Mp DEVICE_OPDISPFUNCTIONI BINTERMOD_DEVERR       NOTE_NUMBERST REGISTER_     " $&(*,.02468:<>@BDFH J!L"N#P$R%T&V'REPORTA VAR6 DEVICE_ENTRYDB/$  ,,$J0RMCS1 D *Special Condition set *Transfer Errorilo &$*MASSBUS Control Bus Parity Err le *Unused bit setlia D Drive Available.**Drive not Available (other port using it) R($ Unibus B Selected for Data Transfer($ Unibus A Selected for Data Transfer .,  BA17,BA16 = e$0,a)!e  (B)l ck 2 Controller Readyd Controller not Readyr 2 Interrupt Enabled Interrupt not Enableden   Function = $ M  *Go bit on0lRMWC 64 Word Count 00c( O  b  DRQ on (dual port unit)  DRQ off (single port unit)D *Unused bits set ( Drive Type = $ 0hRMSN 20 Drive Serial Number = n#$h)   (BCD) 0dRMOF$ 00c0  TADATADATADATADATADATA*Unused bits set 2 16 Bit Data Formatr*18 Bit Data Formatr "  ECC Inhibit  ECC enabled : Header Compare Inhibitn Header Compare Enabledn$ *Unused bits setou B  Offset Direction = ForwardD  Offset Direction = ReverseD *Unused bits set0RMDC *Unused bits setr  $" Desired Cylinder = s$b)# 0HRMHR Di   Holding Register contents 0\RMMR2*U "  Port A Request for ServiceD  "  Port B Request for ServiceD  Control Select Tag on ,*M$X Test Sequencer Branching onn)ts "  Control or Cylinder Tag onnqu  Control or Head Tag ongSe  `DB $X Maintenance Bus Lines = o $` 0t)!e  (B)e r)"0DRMER2 $"*Bad Sector Detected (hdr bit) C *Seek Incomplete $"*Operator Plug Error (removed)` &$*Invalid Command (VV bit reset)cR2 *Loss of System Clockb ( *Loss of Bit Clockco *Unused bits setug  *Device Checks$ *Unused bits setet *Data Parity Errorm *Unused bits set$0,RMEC1bi *Unused bits set  0 ECC Position = r$ &04RMEC2 *Unused bits set*U  ECC Pattern = to$i > $:&%,E4((0RMBAE s  *Unused bits set 64 BA21 through BA16 = b$0 *)!s  (B) *0RMCS3th *Address Parity Errorb " *Data Parity Error, Odd Wordre $"*Data Parity Error, Even Wordt E " *Write Check Error, Odd Word E $"*Write Check Error, Even Wordt E  Double Word Transferednhe *Unused bits set 2 Interrupt Enabled Interrupt not Enabled *Unused bits set n >< Inverse Parity Check Bits = td$0r)!n  (B)a  c(Bi,,"0r"t B)( (,,"se ts" N$0^obNo OperationSeek CommandRecalibrateDrive ClearRelease (dual port)Offset CommandReturn to CenterlineRead_in Preset Pack Acknowledge Search CommandWrite Check DataWrite Check Header and DataWrite DataWrite Header and DataRead DataRead Header and Data $ $0 8& B$06#Normal.$0)#y)  Outside of legal range C w$@ue: Irrelevant (ECH set))Irrelevant (ECH set) g $d t8:KIrrelevant (ECI set)Irrelevant (ECI set)*$$4 n0c)& (O) $ "$hh) $N^R$  'N #$bInvalid function T$#)"|*($|$ !$ !@"d)#$N/A $)# $ )#! $ #)# $<A$@ $|* $$ #! $ !@"T)# $ (R/31. $ $1 4.#$$")#$ ")#! $ ")#  $$ P $ 6*"( j"hDDD D D D DD8888 8 8 8 8 88888888""    $No error bit found D$v.)!5FCName!13FCValue!25FCInterpretation!2FL)$~8$ "$  @"b 8_INPW_ZT!Ə"""ƺ""(7$7$_7$j7$@v7$00c8 O  b  ( ߶ ERM80VM01.05V2.00Mh DEVICE_OPDISPFUNCTIONI BINTERMOD_DEVERR      REGISTERD     " $&(*,.02468:<>@BDFH J!L"N#P$R%T&V'X(Z)\*^+`,REPORTM VAR| DEVICE_ENTRYDBEj ,,$J0RMCS1 D *Special Condition set *Transfer Errorilo &$*MASSBUS Control Bus Parity Err le *Unused bit setlia . Drive Available*Drive not AvailableEn T($ Port Select set (Unibus B selected)*& Port Select reset (Unibus A selected) .,  BA17,BA16 = re$0, )!  (B)o X 2 Controller Readyt Controller not Readynen 2 Interrupt Enabled Interrupt not Enabled   Function = $t Re  *Go bit on0hRMWCt 64 Word Count = n$ha)C )#C  words remaining 0RMBAder  Bus Address Registerd0RMDA( *Unused bits set "  Track Address = sP$e)#t  *Unused bits set "  Sector Address = t$ )#R 0RMCS2 P  *Data Lateri *Write Check Error *Parity Error (memory) *Nonexistent Driveul *Nonexistent Memoryr M *Program Errore *Missed Transferan $"*MASSBUS Data Bus Parity Error J&" Output Ready (silo contains data)" Output not Ready (silo empty)ve B  Input Ready (silo not full)  Input not Ready (silo full)& 0.* Controller Clear (clears all drives also)se H"*Parity Test set (even parity)$ Parity Test clear (odd parity)r)D $"*Bus Address Increment Inhibityp  Unit Selected = e$0 0RMDSn#$  Attention Activee  *Error (RMER1/3 bits set)hBi  Position In Progresssor * Medium Online*Medium not Online  Drive is Write Locked  Last Block Transfered B,( Programmable (ports program selectable) Locked On Portpff * Drive Present*Drive not Presentts &  Drive Ready Drive not Readyd *  Volume Valida*Volume not Validts$ *Unused bits setng   Drive in Offset Modep 0$RMER1  (*Data Check ErrorMSe  *Drive Unsaferol *Operation Incompletepes *Drive Timing Errortts *Write Lock Erroroer *Invalid Address ErrorHe *Address Overflow Erroroen *Header CRC Error 0t *Header Compare Erroro ,*ECC Hard Error t) *Write Clock Failr  *Format ErrorF E HF$$P*Synchronous Bus Parity Errors*Control Bus Parity Error C)kb $"*Register Modification Refused *Illegal Registera *Illegal Functiona0RMAS *Undefined bits seti*U  Unit #7 AttentionR  Unit #6 Attention s  Unit #5 Attentionit  Unit #4 Attention  Unit #3 Attention  Unit #2 Attentiono$  Unit #1 Attention(  Unit #0 Attention04RMLA6 *Unused bits set 8  Sector Count = $8)#d re *Unused bits set0RMDBdre  Data Buffer contentsn0<RMMR1 C "  Occupied (transfering data) C  Run and Go bits Actived D *End Of Block was setv $"*Exception (MASSBUS line set)dpt *Enable Searchot  Looking For SyncUbi  Enable CRC Outnnv *(# Data Area (in data sync byte area)n ( *($ Header Area (in HDR sync byte area)( .,' Continue (data transfer to next block)l *(# WC Prom Strobe (RD/WR data timing)o  Enable ECC Out  Write Data Bit $"$@ Last Sector Decode/o) &$f$@ Last Sector and Tracku)to @2 Diagnostic Mode ona Diagnostic Mode off0RMDT Co $"00c@  TADATADATADATADATADATA*Drive not Sector Addressablei *Unit is a Tape DriverW ,&!*Unit is not a Moving Head Deviceg *Unused bit setM  DRQ on (dual port unit) *Unused bits sety)   Drive Type = a$a 0dRMSNIr 20 Drive Serial Number = )n$dE) s  (BCD) 0TRMOFrre *Unused bits sett)  X2 16 Bit Data Formatr 18 Bit Data Formatr  \"  ECC inhibit  ECC enablednc : Header Compare Inhibit) Header Compare Enabled)  `@  Skip Sector Error Inhibited Skip Sector Error Enabled *Unused bit setr V* $  Offset Direction = Forwardd)* $  Offset Direction = Reversed)$ *Unused bits set0RMDC$ *Unused bits set  $" Desired Cylinder = D$D)#D   0DRMMR28 "  Port A Request for serviced "  Port B Request for serviced 8 Control Select Tag on Control Select Tag offvCV ,*C$@ Test Sequencer Branching on)  H"  Control or Cylinder Tag onnR  L Control or Head Tag ong  Maintenance Bus Lines"00RMER2  $"*Bad Sector Detected (hdr bit): *Seek Incompletetn $"*Operator Plug Error (removed)*U &$*Invalid Command (VV bit reset)cct *Loss of System Clockbio *Loss of Bit Clockse *Unused bits set  *Device Checkset *Unused bit sett C *Skip Sector ErrorH *Unused bit setr R P$"*Data Parity Error (synch bus) *Unused bits set$0RMEC1fo *Unused bits set  RPX$\ $,tSq$(c ECC position = o$r  Position register irrelevant)t)&0 RMEC2B *Unused bits set o HF$\$,e $(e  ECC Pattern s Pattern register irrelevantD)> dh$:b%,E((0RMBAE"  *Unused bits set*I 64 BA21 through BA16 = e $0 s)!  (B)C *0RMCS3it *Address Parity Erroreet " *Data Parity Error, Odd Word $"*Data Parity Error, Even WordsPa " *Write Check Error, Odd Word $"*Write Check Error, Even Wordsts  Double Word Transferednn *Unused bits set 2 Interrupt Enabled Interrupt not Enabled *Unused bits set >< Inverse Parity Check Bits = s $0rh)!1  (B)  !"*RMCS3th *AdNs$ar0^at bNo OperationSeek CommandRecalibrateDrive ClearRelease (dual port)Offset CommandReturn To CenterlineRead_In Preset Pack Acknowledge Search CommandWrite Check DataWrite Check Header And DataWrite DataWrite Header And DataRead DataRead Header And Data o $a& $6Normalm$d)#) Outside of legal range r$d ) rN^$ e'N ( $bInvalid function $)"t|$t$ie$e!d$ !r)#N/A k$k)#e $)# r$C)# n$($,$rC|* $$t !h$ !r"a)# a $a $X& $`e31.a30. 29. $9" 13.D$ ")#$0")#a$#"y)# $O$i fe$ *"e( n"el0 0 0 0 00000$$$$ $ $ $ $ $$$$$$$$"")     ) $ No error bit found N$L.)!5FCName!13FCValue!25FCInterpretation!2FLa$z$~00cH cO  b ( ERP07VM01.04V2.00Ml DEVICE_OPDISPFUNCTIONI BINTERMOD_DEVERR      REGISTERD     " $&(*,.02468:<>@BDFH J!L"N#P$R%T&V'X(Z)\*^+`,b-REPORTA VARh DEVICE_ENTRYMR1V  ,, $J0RPCS1ts *Special Condition set  *Transfer Errorine &$*MASSBUS Control Bus Parity Err  *Unused bit setl . Drive Available*Drive not Availablesy R($ Unibus B Selected for Data Transfer($ Unibus A Selected for Data Transfero .,  BA17,BA16 = eC$0,e)!D  (B)a ti 2 Controller Readyd Controller not Readyrat 2 Interrupt Enabled Interrupt not Enabledt   Function = $@ 2  *Go bit on0lRPWCoff 64 Word Count = "$l*)Cv)#o  words remaininge 0RPBApe  Bus Address Registerd0RPDA *Unused bits setn "  Track Address = sn$d)#t s *Unused bit set= "  Sector Address = v$e)#l 0RPCS2D)  *Data Latese *Write Check Error6 $"*Unibus Parity Error (memory)r *Nonexistent Drive E *Nonexistent MemoryrCo *Program Errorr *Missed Transfer $"*MASSBUS Data Bus Parity ErrorSe J&" Output Ready (silo contains data)" Output not Ready (silo empty)n B  Input Ready (silo not full)  Input not Ready (silo full)*U 0.* Controller Clear (clears all drives also)d H"*Parity Test set (even parity)$ Parity Test clear (odd parity)rMM $"*Bus Address Increment Inhibit P  Unit Selected = e $ 0 RPDS  Attention Activeees &$*Error (RPER1, 2 or 3 bits set)r C  Positioning in Progress * Medium Online*Medium not Onlineen  Drive is Write Locked 0.) Last Block Transfered (last of the pack))ee T,( Programmable (ports program selectable)&" Not Programmable (locked on port)it * Drive Present*Drive not Present  &  Drive Ready Drive not Readyd *  Volume Valida*Volume not Validt *Unused bits set*S 6 Interleaved Sectors Sectors not Interleaved*D " *Early Warning (thermo/air)nts  Offset Mode on( 0,RPER1X$ 0 *Data Checkeos  *Drive Unsafeon *Operation Incompleteo  *Drive Timing Errort s *Write Lock Erroro $ *Invalid Address Erroreg *Address Overflow Errora *Header CRC Error  *Header Compare Erroroth 4*ECC Hard Error ! *Write Clock Failr  *Format ErrorFEr @>P$D*Data Bus Parity Error*Control Bus Parity Errorte)or $"*Register Modification Refusedrd *Illegal Registeraor *Illegal Functiona0RPAS *Unused bits set2  Unit #7 Attentionnt  Unit #6 Attention  Unit #5 Attention>  Unit #4 Attentionts  Unit #3 Attention  Unit #2 Attention  Unit #1 Attention$  Unit #0 Attention0HRPLA *Unused bits set L  Sector Count = $L)# R *Unused bits set0RPDBRet  Data Buffer contentsn0PRPMR T2*Diagn00cP  TADATADATADATADATADATAostic Mode ont Diagnostic Mode offte X86d$T Diagnostic Routine Number = d$X)#t e)r &$$T Diagnostic Parameteru)0RPDT " *Drive Not Block Addressableal *Unit is a Tape Drivee l ("*Unit not a Moving Head Devicee' $"*Device Programmable from Host > DRQ on (dual port unit)  DRQ off (single port unit)o *Slave Present *Unused bit sete $  Drive Type = $ 0hRPSN$ 20 Drive Serial Number = n$h.)   (BCD). 0\RPOF3.  *Command Modifier bit sett0" $"*Move Track Descripter bit seti *Unused bit setc 2 16 Bit Data Formatt 18 Bit Data Formatt0  `$ ECC Inhibited  ECC Enabled$ < Header Compare Inhibitedt Header Compare Enablede *Unused bits setL d Value meaningless0RPDC *Unused bits set  $" Desired Cylinder = $i)#N 0RPCC) *Unused bits set  $" Current Cylinder = m$)# 08RPER2" *Program Error e *CPE (CROM parity error)In &$*CPU Unsafe (8080 up timed out)l@ *R/W Unsafe #3nh *R/W Unsafe #2rr *R/W Unsafe #1nu *Write Overrun  *Write Ready Unsafep O <NL*Error Code = $<0r)$  (X)d (see Field Service document) "0@RPER3 *Bad Sector Errorede *Seek Incomplete0 *Defect Skip ErrorA *Write Sense Failure *Control Logic Failure  *Loss Of Bit Clock Erroron *Loss Of Cylinder Errorr " *Processor Handshake Failure   *Device Checknnd  *Index Unsafen C  *DC Unsafeng *Serdes Data Failurein D*Data Bus Parity Error S *Sync Byte Error *Sync Clock ErrorE  *Run Time Out Errorr$0 RPEC1it  $ ECC Position = $ &0(RPEC2   ECC Pattern> $: %,EeC((0RPBAEse  *Unused bits set*U 64 BA21 through BA16 = rP$0 )!n  (B) *0RPCS3 *Address Parity Errorrnu " *Data Parity Error, Odd WordS $"*Data Parity Error, Even Wordtn " *Write Check Error, Odd WordC2 $"*Write Check Error, Even WordtF  Double Word Transferedn *Unused bits set 2 Interrupt Enabled Interrupt not Enablednu *Unused bits setBA >< Inverse Parity Check Bits = t$0r)!  (B)s r ro" ata Parity Error N $rd0^ckEbNo OperationSeekRecalibrateDrive ClearRelease (dual port)OffsetReturn To Center LineRead-in preset No Operation Search CommandDiagnosticWrite Check DataWrite Check Header and DataWrite DataFormat TrackWrite Track DescriptorRead DataRead Header and DataRead Track Descriptor0e$0n$4 et$`ie$$)#  Meaningless) $ha) cN^e$ 'N cm$bIllegal functionD $)"|$t$ed$2Dt!$t! )#N/A $t)#a A$D)# $d)# a$0$4$a|*a$aa$2  !$!&")# $Tm49. ) $9"s31.lg$r"d)#r^$" )#$")#  v$d$n n$*")( "@@@ @@@@@@88 8 8 8 8 8,,,, , , , , ,,,,,,,,""       $No error bit found  $<o12D, Error Code = f$<0 )$  (X) $ $L.)!5FCName!13FCValue!25FCInterpretation!2FLt$~$00cX O  b ( ERP23VM01.00V2.00MDISPCFUNCTION BINTERMOD_DEVERR      |REGISTERS     " $&(*,.02468:<REPORTI | DEVICE_ENTRY jctor $6 0RPDS0 6 Selected Unit Ready Selected Unit not ReadyR : Selected Unit Onlinea*Selected Unit not Online   & RP03 Selected RP02 Selected *Header Not FoundtPa $"*Selected Unit Seek Incomplete "  Selected Unit Seek Underway  *Selected Unit File Unsafe $" Selected Unit Write Protected   Unit #7 Attention Activee>   Unit #6 Attention Activee o   Unit #5 Attention Activeela   Unit #4 Attention Activeete   Unit #3 Attention Activee   Unit #2 Attention Activeel   Unit #1 Attention Activee   Unit #0 Attention Activee0RPERve *Write Protect Violation *File Unsafe ViolationBi *Nonexistent Cylindernor *Nonexistent Trackit *Nonexistent Sectore H *Program Error $"*Format Error (header parity)dnu  *Mode Erroro m  *Longitudinal Parity Errorts *Word Parity Error *Checksum Errorr  *Timing Erroro C *Write Check Error *Nonexistent Memoryyam *End of Pack Error p *Disk Error (HNF or SKI)0RPCS ns *Error (composite)*R  *Hard Errorp*W F  Attention Interrupt Enabled$ *Attention Interrupt not Enabled< &  PDP-11 Mode PDP-10/15 Moder d N$ Function is a Header Operationd(# Function is not a Header Operationo  Drive Selected = *$t S 2 Controller Ready *Controller not Readya B Interrupt on Done enabled"*Interrupt on Done not enabledor .,  BA17,BA16 = $0,C)!k  (B) ns   Function = f$l   *Go bit set 0RPWCus 64 Word Count = *$c)Ct)#r  words remainingc 0RPBARun  Bus Address Registert 0RPCAon *Unused bits setat  ,* Desired Cylinder Address = P$s)# 0RPDA*U *Unused bits set "  Track Address = S$ )# P *( Current Sector Address = r$,)#d  *( Desired Sector Address = $*)#t 0RPM1  *Unused bits set W V,' Silo Output Ready (silo contains data)F(# Silo Output not Ready (silo empty)aru N&! Silo Input Ready (silo not full)y&! Silo Input not Ready (silo full)y I , Control bit set Control bit reset ( 0 Set Head State on Set Head State offd 8 Set Cylinder State on Set Cylinder State offsee (&" Bus Signals to Drive, bit 7 = LSB0RPM2jhd This is a write only register which only has significance when the maintenance enable switch is on.0RPM3tjhc This is a write only registerwhich only has significance when the maintenance enable switch is on.o0SUCAWri *Unused bits set  $" Cylinder Address = $ e)#D 0SILO He  Silo Memory contents e:i$or0J$NControl ResetWrite (implied seek) Read (implied seek)Write Check (implied seek)SeekWrite (no implied seek)Home SeekaRead (no 00c`  TADATADATADATADATADATAimplied seek)!$t$RP03RP02)pN/A3:J $ 9"': l.$NlInvalid function$ $ )"h$$ $ v!$!n)#n|N/A)x ($ )# $)# $)#  $@$@$ @$@$@h*$ 8 $ 8! $!,")# $ R9.  ,$.,"19.x$  " )# $ ")#$ "r)# to$N"L  " 2 C$ptNo error bit found$ $LD.)!5FCName!13FCValue!25FCInterpretation!2FLhem$ $" @&b 8_INPW_ZT!Ə"""ƺ""("0 "H "( 7$7$_7$j7$@v7$>|"(V ERP456M01.05V2.00MCONTROL  DEVICE_OPDISPFUNCTION BINTERMOD_DEVERR      REGISTERD     " $&(*,.02468:<>@BDFH J!L"N#P$R%T&V'X(Z)\*^+`,REPORTR VAR DEVICE_ENTRY R  *p$edd e8< $P e85 d85me Se,,e$`b0RPCS102 *Special Condition set.$ *Transfer Errori$ &$*MASSBUS Control Bus Parity Err $ *Unused bit setl($ D Drive Available.**Drive not Available (other port using it)h vB$8*Unused bit setl$ Unibus B Selected for data transfer )2$8$ Unibus A Selected for data transfer)# .,  BA17,BA16 = e$0,)!  (B) 2 Controller Readyt Controller not Readyf 2 Interrupt Enabled Interrupt not Enablednd   Function = !$N me  *Go bit on0~RPWCm$ 64 Word Count = $~e)Co)#c  words remainingn 0RPBA   Bus Address Registerd0RPDAnti *Unused bits setct "  Track Address = st$ )#i U "  Sector Address = $)#R 0RPCS2 V  *Data Lateio *Write Check Error C  *Parity Error (in memory)dck *Nonexistent Driveto *Nonexistent Memorye *Program Errorea *Missed Transferod $"*MASSBUS Data Bus Parity Errorty J&" Output Ready (silo contains data)" Output not Ready (silo empty)  B  Input Ready (silo not full)  Input not Ready (silo full) M 42- Controller Clear (clears all drives as well)lro H"*Parity Test set (even parity)$ Parity Test clear (odd parity)r*H $"*Bus Address Increment Inhibit*A  Unit Selected = e<$ 0&RPDSP-1  Attention Activeer **Error (composite) a  Positioning in Progressri * Medium Online*Medium not Onlinead  Drive is Write Locked 0.* Last Sector Transfered (last of the pack)ne T,' Programmable (port program selectable)c&" Not Programmable (locked on port)n * Drive Present*Drive not presentCu R" Drive Ready (not doing R/W/S).) Drive not Ready (drive is doing a R/W/S)) *  Volume Valida*Volume not valid( B<d$<*Unused bit seti00ch O  b  DRQ on (dual port unit)  DRQ off (single port unit)D *Unused bits set 2 Drive Type = b$ 0zRPSNent 20 Drive Serial Number = nP$z")   (BCD)r 0nRPOFE (   Sign Change  *Unused bits seted 2 16 Bit Data Formatr 18 Bit Data Formatre $ ECC Inhibited  ECC Enabled*W < Header Compare Inhibitedt Header Compare Enablede C *Unused bits setld rum *Unused bit sett S v  Offset = $ 0RPDC *Unused bits setol  "$" Desired Cylinder = O$"i)#l 0RPCC Of *Unused bits setha  $" Current Cylinder = e$n)# 0RRPER2 *(U$<*Unused bit sete *AC Unsafel)in *Unused bit setety  *PLO Unsafe c 0.o$<*Unused bit sete*30 Volt Unsafer)*R  *Index Error0 *No Head SelecteCC *Multiple Head Select C2 *Write Ready Unsafec$ :8,$<*Abnormal Stop*Fail Safe enabled (open CB)e) *Transition UnsafeBA " *Transition Detector Failure 64$< Read and Writee*Motor Sequence Errorn*)a *Current Switch Unsafe *Write Select Unsafen *Current Sink Failureed *Write Current Unsafee"0VRPER3 D  *Off Cylindert *Seek Incomplete ><$<*Operator Plug Error (removed)*Unused bit setn) *Unused bits set<  *DC Low Ch  *AC Low  :8$<*35 Volt Regulator Failure*Unused bit set r) ><$<*Unused bit sett*Any Unsafe Except Read/Writen)k *Unused bit settal 20$< Write and Offset*Velocity Unsafe)ea 20 $<*Drive DC Unsafe*Pack Speed Unsafe)$06RPEC1  : ECC Position = $r &0>RPE00cp  TADATADATADATADATADATAC2  B0. ECC Pattern = $B 0Pt)!h  (B)d > nD$P%,(aa((0RPBAEk  *Unused bits setea 64 BA21 through BA16 = ce$0 )!  (B)T *0RPCS3e$ *Address Parity Errorcni " *Data Parity Error, Odd Word $"*Data Parity Error, Even Word nc " *Write Check Error, Odd Word $"*Write Check Error, Even Word t)  Double Word Transferedn$ *Unused bits set 2 Interrupt Enabled Interrupt not Enabled49 *Unused bits setr"  >< Inverse Parity Check Bits = $ 0rv)!d  (B) $(")""" "  "@@@ @d$@0t xNo OperationUnload (stand by)RecalibrateDrive ClearRelease Search CommandWrite Check DataWrite Check Header & DataWrite DataWrite Header & DataRead DataRead Header & DataSeek CommandOffset CommandReturn to Centerline Pack AcknowledgeRead In Preset B$ RP04 <P RP05 F<P RP06 <P$,$r-P+e)$vP)#  uin.e $ $: & $:6 Normal$:A)#) Outside of legal range $z) "dt$ R'd .$x$Invalid function $)")$$$!$ ! )#N/A $P)# $*)# $)# $J$N $ *$D$ D! $ !D")# $ T21. $1"18."$ ")#$")#$$")# r $ $*n $**"( "tVVV VVVVVVRR R R R R RRRRRRRRRFFFF F F F F FFFFFFFF""! & &&  $ $No error bit found $L.)!5FCName!13FCValue!25FCInterpretation!2FL/D$ $@b 8 _INPW_ZT!Ə"""ƺ""("0 "H "(  "7$7$_7$j7$@v7$(h ERRORMM01.04V2.003FCDEVICESERLMES!   ERROR ERROR_INFO_ER ERROR_INFO_GC ERROR_INFO_HA:ERR_TMP      NOTE_NUMBERSN PACKET_RANGEREPORT  TITLEERROR_1 REPORI8-8S\ *TE _J  N --F _1P-RARGNOTUNQEArgument specification !AC is not uniquePILLFILSPCEIllegal file specification - !ACOILLPACSPCEIllegal packet specification - !ACILLPACRANEIllegal packet range - LOW = !AC, HIGH = !ACILLARGCOMEIllegal argument combinationILLSWTARGEIllegal switch argument - !ACINTERR001EInternal error detected at position number !ACMODNOTFND00cx O  b  (Q ERS11VM01.00V2.00MDISPCFUNCTION BINTERMOD_DEVERR      TREGISTERS     " $&(REPORT  DEVICE_ENTRYgis a $6z0RFDCSd *Error (composite)on $"*Freeze (bits 12-15 of RFDAE) U *Write Check Error U *Data Parity Error U *Nonexistent Diskr U *Write Lockout errorni *Missed Transfer U   Disk Clearn 2 Controller Readyr*Controller not Readyf S 2 Interrupt Enabled*Interrupt not Enabled S <: Extended Memory XM1,XM0 = Ec$0no)!i  (B)t rr *Maintenance mode on   Function = $l   *Go bit on0RFWC0 64 Word Count = s$b)C )#  words remainingc 0RFCMA E (&! Current Memory Address Register t0RFDAR  "  Track Address = d$)#a o  "  Word Address = da$e)#c 0RFDAE* *Address Parity Errorson *A Timing Track Errorsen *B Timing Track Errors *C Timing Track Errorsnl *Unused bit set ia *Nonexistent MemoryoT *Unused bit setmck   CMA Inhibit  Data Request Late, *Unused bit setain *Illegal Drive Address   Drive Selected = $ p :8 MSB's of track address = $0s)!  (B) 0RFDBRNe  Data Buffer Registers 0RFMAR *Unused bits setCh F" $ Maint. Data bit onee)"2$ Maint. Data bit off)8 F" $ Maint. C Timing onfi)"$ Maint. C Timing off )de F"e$ Maint. B Timing onfa)"a$ Maint. B Timing offt)et F"$ Maint. A Timing onfd)"s$ Maint. A Timing off ) *Unused bit setg NLb$ Simulated Head Signals = e$ =0l)!  (B) C) NL*$ Maint. Data Track bits = $y0e)!n  (B) )R HF$ Maint. C Timing = bt$f0)!  (B)s b)se HF$ Maint. B Timing = b.$s0t)!*  (B) a)) HF$ Maint. A Timing = b$ 0 )!  (B)u p)0RFADSri *Unused bits set 20 Disk Segment Address = $ )# :$ra 00J$ NNo OpWriteReadWrite ChecktRS11epN/A1n:J$ r': llU$N l*Invalid functionra e$ )#xN/AvCN/Av fr$/D$ /f! )#/$@/I!c)#/<$`/r!t)#/( v$)#e|N/Av)hN/Av *$B t$" "  "  i r$n No error bit found Us$L .)!5FCName!13FCValue!25FCInterpretation!2FL/t$a$N_@b 8 _INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"27$7$_7$j7$@v7$00c O  b (d ERS34VM01.04V2.00M$ DEVICE_OPDISPFUNCTIONI BINTERMOD_DEVERR      REGISTERD     " $&(*,.02468:<>REPORT_ VAR8 DEVICE_ENTRYWID&W_G_FU$J0RSCS1 *Special Condition setAS *Transfer ErroriIT &$*MASSBUS Control Bus Parity Err *Unused bit setl *Drive not AvailableEV R($ Unibus B Selected for data transfer($ Unibus A Selected for data transferre .,  BA17,BA16 = e $0,*)!t  (B) rr  *Controller not Readyr    Interrupt not Enabled e   Function = T$s er  *Go bit on0$RSWCer 64 Word Count = t$$a)C )#  words remainingn 0RSBAabl  Bus Address Registerd0RSDA)! ("*Spare Track Address bits setr  "  Track Address = e*$b)#o FW "  Sector Address = $C)## 0RSCS20  *Data Late! *Write Check Errorst *Unibus Parity Error *Nonexistent Drivea *Nonexistent Memoryr d *Programing Errorr *Missed Transferro $"*MASSBUS Data Bus Parity Error  J&" Output Ready (silo contains data)" Output not Ready (silo empty)se B  Input Ready (silo not full)  Input not Ready (silo full)ck 0.* Controller Clear (clears all drives also), (&"*Parity Test bit set (even parity)al L"*Bus Address Increment Inhibit($ Bus Address Increment Inhibit reset  Drive Selected = $F 0RSDSr R  Attention Active d *Error (composite)ai  Position in Progresstai * Medium Online*Medium not OnlineC *Drive is Write LockedC 0.* Last Block Transfered (last of the track) *Unused bit setnng * Drive Present*Drive not Present &  Drive Ready Drive not Ready *Unused bits set 0 RSERign  *Data Checks *Unsafe (drive AC low)L *Operation Incomplete)$ *Drive Timing ErrortB) *Write Lock Erroront $"*Invalid Address Error ( >max) *Address Overflow Error(nt *Unused bits set *MASSBUS Parity ErroroF *Register Modify Refused " *Illegal Register Addressing *Illegal Function 0RSASDis *Unused bits set   Unit #7 Attention Activei   Unit #6 Attention Activei   Unit #5 Attention ActiveiN/   Unit #4 Attention ActiveiN   Unit #3 Attention Activei   Unit #2 Attention Activei   Unit #1 Attention Activei/   Unit #0 Attention Activei0RSLA( *Unused bits set*$ *( Current Sector Address = $)# 20" Current Sector Fraction Passed = $)#N 0RSDB$  Data Buffer Registeri0RSMR R(0$  Serial Data Clock SignalPi)(s$  Serial Data Clock SignalPU)fe j4S$ % Maint Write Data Bit for Top Surfacer )4o$ % Maint Write Data Bit for Top Surfacer ) P L* $  In CRC Field (16 bits long)P) $  Not in CRC Field k) j4n$ % Maint Write Data Bit, Bottom SurfacerB)4 $ % Maint Write Data Bit, Bottom Surfacer ) X*r$  Drive Data Buffer Strobe onP), $  Drive Data Buffer Strobe offt)rr h2 $ $ Enable Shift Register Parallel Loadr)4 $ % Disable Shift Register Parallel Load) D  Address Confirmed  Drive Sector Pulses2 (&! Drive Performing Write OperationLbl &$  Drive Performing Read Operation> b0e$ ! Maint Read Data Bit, Top SurfaceLd)0B$ ! Maint Read Data Bit, Top SurfaceL) V*"$  Maintenance Index Pulse onu)*$  Maintenance Index Pulse off) J$d$ 00c  TADATADATADATADATADATA Maintenance Clock onlt)$$  Maintenance Clock off) f2$ $ Maint Read Data Bit, Bottom Surface)2 $ $ Maint Read Data Bit, Bottom Surfacet)ri *Unused bit setate   Maintenance Mode on0RSDTr & $"*Drive not Sector AddressableSff *Unit is a Tape Driver C $"*Unit is a Moving Head DeviceSR &$*Unit is a 7 Channel Tape DriverP  > DRQ on (dual port unit)  DRQ off (single port unit)r$ *Slave Present&   Drive Type = :$# > $:%Die(0RSBAE"  *Unused bits setIn 64 BA21 through BA16 = $0 )!  (B) 0RSCS3$ *Address Parity Error # " *Data Parity Error, Odd WordD $"*Data Parity Error, Even Wordv  " *Write Check Error, Odd Word18 $"*Write Check Error, Even Wordv)  Double Word Transferedn $ *Unused bits set 2 Interrupt Enabled Interrupt not Enabled *Unused bits setR >< Inverse Parity Check Bits = vF$0rF)!F  (B)F >F HN$ p0^NaebNo OperationDrive ClearRead In Preset SearchWrite CheckWriteReadN/AN^$  n'N/t t$bInvalid function0 $C)" |2$@db$ !e$RS03 )ie)#lN/AN/A0 $C)# $*)# e b$ a|8$@ur$ !d"r$RS03#)P)# $<"U63.e*$f"l)# $s"d)# e t$ $l P $a*" ( 6"U4           "d   l H$e No error bit founds f$L.)!5FCName!13FCValue!25FCInterpretation!2FL))$6*$:@ b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"97$7$_7$j7$@v7$>d (} ERX01VM01.00V2.00MDISPC ERROR_TYPEU FUNCTION BINTERMOD_DEVERR      8REGISTERP   REPORT f DEVICE_ENTRYMaiTWe Dat$6V0RXCS Bi *Error (composite error)r$ &$*RX Initialize (write only bit)  *Unused bits set   . Drive Type = RX02 Drive Type = RX014 *Unused bits setd 4 Transfer Request on Transfer Request off to 2 Interrupt Enabled Interrupt not Enabled D $  Done bit on  Done bit offtea 2 Unit Selected = 1.l Unit Selected = 0.lac   Function = $n en  *Go bit set 0RXDBInd *Unused bits set  ZXe$%*Low byte of register contains = RXES!# Low byte of register contains datane)0RXES) *Unused bits set, 2 Unit Selected = 1.e Unit Selected = 0.e  &  Drive Ready*Drive not Ready &  Deleted Data Detectedes : Drive Density = Doubleo Drive Density = Singleo M *Density Error& *Unused bit set=ap  Initialize Done o <:p$*Unused bit sete*Parity Error (Unibus input))la *CRC Error detectedP0RXER% *Error Code = *$s  Ts$etN0d hWrite SectorRead SectorWrite Deleted Data Sectord:o$D 00c O  b  77.(Home Found Before Desired Trk0Self-diagnostic Error8Sector Not Found After 52 HdrsH>40 us and No SEP Clock SeenPPreamble Could Not Be FoundXPreamble Found But No ID Mark`CRC Error On Apparent HeaderhTrack Address MisscomparepToo Many Tries For an IDAMxData AM Not Found, Timed OutCRC Error On Sector ReadAll Parity ErrorsI$RX02RX01)N/A2Td@$ $ 'T $h*Invalid functionr$1.0.))N/AN/AN/AN/AN/A:LR$ ': #$P$*Invalid error coder $$L).)!5FCName!13FCValue!25FCInterpretation!2FLn$$@b 8 _INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF7$7$_7$j7$@v7$>( ERX02VM01.02V2.00MDISPC ERROR_TYPEU BINTERMOD_DEVERR      dREGISTER     " $&(*,.0REPORTG VAR DEVICE_ENTRYNUM TEXG$60RX2CSI_ *Error (composite error)UP &$*RX Initialize (write only bit) DE $*BA Extention (write only)T  . Drive Type = RX02 Drive Type = RX01rr *Unused bits set r8o$ Double Densityt*Density Indicator invalid.)8 $ Single Densityt*Density Indicator invalid) 4 Transfer Request on Transfer Request offnof 2 Interrupt Enabled Interrupt not Enabledbl $  Done bit on  Done bit offt v:l$ Unit Selected = 1.l*Unit indicator invalid)u):n$ Unit Selected = 0.l*Unit Indicator invalid) )bi   Function = %$no b *Go bit set (write only) wy$0RX2ES *Unused bits setnu  *Nonexistent Memory Errorile *Word Count Overflow 0 *Unused bit setr 2 Unit Selected = 1.w Unit Selected = 0.w &  Drive Ready*Drive not Ready D  Deleted Data Detectedsi : Drive Density = Doubleo Drive Density = Singleone *Density Errorbi  *RX AC Lowr  Initialize Done *Unused bit sete  *CRC Error detectedn@0RX2DB (" (Register contents undefined)0RXWD1: 20 Word Count = r$P)#D  words remainingd 1 8*Error Code = $i  (no error code returned)i0RXWD2k *Unused bit set N 20! Current Track Adrs of Drive 0 = ak$e)#P Pr *Unused bit setAou 20! Current Track Adrs of Drive 1 = ae$h)#a 0RXWD3p *Unused bits setFo "  Target Sector = r $t)#R ad *Unused bit set=   Target Track = $A)#T 0RXWD4 XVu$hT Track Adrs at seek error = A$)#  Track Address = e$N)# ) 2 Unit selected = 1.  Unit selected = 0. al B  Density of Drive 1 = Double  Density of Drive 1 = Singleio * Head is Loadedv Head not Loaded B  Density of Drive 0 = Double  Density of Drive 0 = Single *Unused bits set Z,( Rd Err Reg Cmd issued in Double Density,( Rd Err Reg Cmd issued in Single Density00c  TADATADATADATADATADATA6 "ng *Illegal Function 0:A$is 0LeiPDrv. 0, No Home Found on INITDrv. 1, No Home Found on INIT Tried To Access a Track > 76.(Home Found Before Desired Trk8Sector Not Found After 52 HdrsH>40 us and No SEP Clock SeenPPreamble Could Not Be FoundXPreamble Found But No ID MarkhTrack Address MiscomparepToo Many Tries for an IDAMxData AM Not Found, Timed OutCRC Error on Sector ReadR/W Circuit Failed Self TestWord Count OverflowDensity ErrorWrong Keyword for SET DENSITYCv $RX02RX01s)rN/A2anc$Invalid function Fill BufferS Empty Buffer Write Sector Read SectordSet Media Densityh Read StatustWrite Deleted Data SectorcRead Error Code-() io$.10.) o$J RF$z $ )#$z $n)# i $httz S$a)#zN/Ai r$ )# N/A ~N/A)jN/A:Lr$ tB':Se$P,$PP*Code unknown to Error Log )r$""  r l$a)No error bit foundg sr$Ll.)!5FCName!13FCValue!25FCInterpretation!2FLf $r$ @b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("L7$7$_7$j7$@v7$> (x ET0310M01.00V2.00MDISPCFUNCTION BINTERMOD_DEVERR       NOTE_NUMBERS HREGISTERT     " REPORT VAR DEVICE_ENTRY  i a$62 0MTS *Illegal CommandA <:$*End Of File detected  End Of File detectede)kn *Cyclic Redundancy Error  " *Parity Error (CRC and LRC)dor *Bus Grant Late Errord) <:!$*End Of Tape detectedd End Of Tape detectedr) *Record Length Error 64 $*Bad Tape ErrorE*Operation Incompletet)X *Nonexistent MemoryO < Selected Unit Onlinee *Unit not Present or Offline= "  Beginning Of Tape detectede s . Drive = 7 Channel Drive = 9 Channelic  Settling Down S  Write Protectednd   Rewinding  0  Drive Ready Drive not Ready (in use)e0MTCru *Combined Error setn  XV  Density = rb$ *Invalid densitye 200 BPI 556 BPI 800 BPI 800 BPIi)l d) $" Subsystem Clear (write only)In * Even Parity onr Even Parity off  Drive Selected = $y 2 Controller Ready *Controller not Readyt  2 Interrupt Enabled Interrupt not Enabled .,  BA17,BA16 = t $0,n)!S  (B) t   Function = $lr ve  *Go bit on0MTBRC D  Gs$)C)# $ 0MTCMA  Current Memory Address 0MTDni  Data Buffer Contentssbi 86 $  Byte B = r$d0)& D) 86 $g  Byte A = s$0)& D)  64$  Byte B = r$ 0a)&n  ) 64*$  Byte A = $ 0e)&t e) 0MTRD 0.) Timer Signal (100 us. at 50% duty cycle)8 D p&! Character Select = LRC CharacteryH Character Select = 00c O  b (rB ET1645M01.03V2.00MlDENSITY  DEVICE_OPDISPC FORMAT_TYPE FUNCTION BINTERMOD_DEVERR      REGISTERP     " $&(*,.02468:<>@BDFH REPORTN VAR DEVICE_ENTRYoror b $`0MTCS1CI *Special Condition set *Transfer ErroriGE &$*MASSBUS Control Bus Parity Err B *Unused bit setlEC . Drive Available*Drive not Available R($ Unibus B Selected for Data Transfer($ Unibus A Selected for Data Transfer .,  BA17,BA16 = e $0,)!  (B)i y 2 Controller Readyd Controller not Readyr) 2 Interrupt Enabled Interrupt not Enabled     Function = o$   *Go bit on0hMTWClet 64 Word Count = i$hn)Ce)#y  words remainingt 0MTBAot  Bus Address Registerd0DMTFCe s   Frame Count = gn$D)# 0MTCS2  *Data Late *Write Check Error *Parity Error (memory)ea *Nonexistent Drivese *Nonexistent Memoryr*C *Program Error *Missed TransferIn $"*MASSBUS Data Bus Parity Error B J&" Output Ready (silo contains data)" Output not Ready (silo empty)Pa B  Input Ready (silo not full)  Input not Ready (silo full) ,*% Controller Clear (clears all drives)!yt F"*Parity Test on (even parity) " Parity Test off (odd parity) 7, (&"*Bus Address Increment Inhibit set=  Unit Selected = e$ 0(MTDS) *(# Attention Active (slave-transport)sdr ,*Error (MTER bit set)aa  Position in Progressa  * Medium Online*Medium not Online T(# Write Lock set (write ring absent)s*& Write Lock reset (write ring present) "  End00c  TADATADATADATADATADATA of Tape detected (EOT)n*$ *Unused bit sett  * Drive Present*Drive not Present) . Formatter Ready Formatter not Ready&  Slave Status Changera 08 Formatter in PE Mode  Formatter in NRZI ModeER   Slowing Down r  PE ID Burst Detectedd S  Tape Mark detectede   BOT detectedt ,*& Slave Attention (slave coming online) 0@MTER)! ><$0*Correctable Data Error (PE)*CRC Error (NRZI)I )( $"*Unsafe (not online or AC low) *Operation Incompleterl *Drive Timing Errortrr *Non-executable Function @>r$0*Correctable Skew (PE)*Illegal Tape Mark (NRZI)a)l *Frame Count Error E *Non-standard Gapr 20$0*PE Format Error*LRC Error (NRZI)p) LJ$0*Incorrectable Data Error (PE)*Vertical Parity Error (NRZI)e) L *Data Bus Parity Error  *Format Errori  *Control Bus Parity Error F $"*Register Modification RefusedW  *Illegal Register Addressf *Illegal Function 0MTASmai *Unused bits setr  Formatter #7 Attentionsco  Formatter #6 Attentionsp  Formatter #5 Attentions/  Formatter #4 Attentionsnc  Formatter #3 Attentions  Formatter #2 Attentions  Formatter #1 Attentions  Formatter #0 Attentions0MTCK *Unused bits set @>$0*Dead Track = Pt CRC Parity = o$1D0 ) )!5 64C$0  CRC word = a$0C)&  (O) )  $0*Dead Track = 8t)  $0*Dead Track = 7t)#  N$0*Dead Track = 6tN)  r$0*Dead Track = 5tP)  $0*Dead Track = 4t )or  r$0*Dead Track = 3t)  $0*Dead Track = 2tN)rr  o$0*Dead Track = 1t.)0$MTDBter  Data Buffer contentsC0HMTMRe P  TRa$L Maintenance Mode Data Field = a$H >0e)&!  (O) d)ta :p$L 200 BPI Clock!)n$L 200 BPI ClockS)ac B $L Maintenance Clockc) e$L Maintenance Clock )nt @>n$L Maintenance Mode Op-code = $Hc )#c n)t) L4 Maintenance Mode on Maintenance Mode offc04MTDTSur $*Drive Sector Addressable Bo .($*TAP reset (signal is hardwired set) *($*MOH set (signal is hardwired reset) (&!*7CH set (signal hardwired reset)e > DRQ on (dual port unit)  DRQ off (single port unit)reS * Slave Present Slave not PresentRQ < Transport Type = f$s )r 8. Formatter = TM03  Formatter = TM02 0PMTSNDi 20 Drive Serial Number = nn$Pd) t  (BCD)I 0TMTTC BA 8 Acceleration bit set= Acceleration bit resetn*A D  Frame Count Status bit setr" Frame Count Status bit resetsrr  `:8o$8 Slave Address Changei Tape Control Writea$) V*% Abort on Data Transfer Error enabled *& Abort on Data Transfer Error disabled s *Unused Bit setT I X  Density Selected = $ P \  Format Selected = $  N&$0 Even Parity (NRZI only))&$0 Odd Parity (NRZI only)) )In d Slave Selected = $c 8 r$P%,S"0MTBAEN  *Unused bits set 0. BA21 - BA16 = tC$0 )!@  (B) 0MTCS3i *Address Parity Errorn " *Data Parity Error, Odd Worda $"*Data Parity Error, Even Word  " *Write Check Error, Odd Word $"*Write Check Error, Even Word s"  Double Word Transferedn" *Unused bits set 2 Interrupt Enabled Interrupt not Enabled *Unused bits sete  >< Inverse Parity Check Bits = $ 0rF)!m  (B)a 2I(er$$"2F)"6*$:ition UnsafeBA " *Tras~o$De0EroNo OpRewin00c O  b 
(b= ETA11VM01.00V2.00MDISPCFUNCTION BINTERMOD_DEVERR      (REGISTERS  REPORT 8 DEVICE_ENTRY & For $60TACSoTC *Error (composite) $"*Block Check (CRC on READ SFB)RC  *Clear Leader (EOT or BOT) *Drive is Write Locked  File Gap detected  *Timing Errore &$*Offline (no drive or no power) 0 H" Unit #0 Selected (left drive)$ Unit #1 Selected (right drive) *D 4 Transfer Request on Transfer Request offg 0 Interrupt Enabled*Interrupt Disabledf= *  Device Readys*Device not Readye c "  Initiate Last Byte Sequencece   Function = $l  *Go bit on0TADB 2 *Unused bits set B :8 Data Buffer = tL$a0)&  (O) M:t$an0JNWrite File GapWriteReadSpace Reverse FileSpace Reverse BlockSpace Forward FileSpace Forward BlockRewinditTA11dpN/A1:J$$ s ': llh$NelInvalid functionH $1.0.d)dx??? N/AQN/Ao|N/AhN/A il$""  0  $vtDrive not readyn a T e$rNo error bit found0 $La.)!5FCName!13FCValue!25FCInterpretation!2FLta $d$_S00c  TADATADATADATADATADATA@ b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"m~"6U"s]7$7$_7$j7$@v7$>L ( ETC11VM01.01V2.00MDISPCFUNCTION BINTERMOD_DEVERR      <REGISTERS    REPORT_ d DEVICE_ENTRYEVrR_UNIT $60TCSTM *Tape At End Zone Region &$*Parity Error (checksum msmtch)   *Mark Track Decoding Error *Illegal Operation &$*Select Error (NXU or multiple) *C *Block Missed Erroro *Data Missed Error *Nonexistent Memoryo    Selected unit Up to Speedli @o$ Maint. Clock ont) e$ Maint. Clock offn)#1 J$d$ Maint. Mark Track onSr)$r$ Maint. Mark Track offe)of L&0$ Maint. Data Track 0 one)$ $ Maint. Data track offe)ad N&e$ Maint. Data Track 1 ont)&L$ Maint. Data Track 1 off )ct N&l$ Maint. Data Track 2 onf)&A$ Maint. Data Track 2 off) D <: Extended Data XD17,XD16 = p$0n:)!$  (B) 0TCCMeW *Error (composite) *Unused bit settS  *Maintenance Mode on F  Delay Inhibit setin 6 Tape Motion = Reverse Tape Motion = Forwardh$  Unit Selected = r$ d 2 Controller Readyr*Controller not ReadydA 2 Interrupt Enabled*Interrupt not Enabled 86  BA17,BA16 = t $ 0)!  (B) nd   Function = !$lN me  *Go bit on0TCWC $ 64 Word Count = $T)CT)#B  words remaininga 0TCBAtio  Bus Address Registerd0TCDTFra  Data Buffer contentsd:$80JbotNStop All TransportsRead Block NumberRead DataRead AllStop Selected TransportWrite Timing and Mark TrackWrite DataWrite AlltTC11OpN/A1N:J)$ n': ll$Nll*Invalid functiona% ,$)"x???vBN/AvN/Avi|N/AvhN/Av A$*"A( 4 T$iController not Ready  *$PyNo error bit found Da$Ly.)!5FCName!13FCValue!25FCInterpretation!2FLtd $$ P@(b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"r~"6U"s]7$7$_7$j7$@v7$>%( ETS11VM01.03V2.00MpDISPCFUNCTION BINTERMOD_DEVERR       MES_SAGE_TYPE MODET  NOTE_NUMBERSL REGISTERN     " $&(*,.02468:<>@BREPORTVVAR   # DEVICE_ENTRYFr#SzHLGVV:"I_" U'CRO="TP_S TBNERS DEVIC00c O  b 5%)u*Unused bit seti )ck 64e$*Unused bit seta*Read Bus Parity Error )nt 20o$*Invalid Preamble*Unused bit setE )L 86a$*Synchronization Failure*Unused bit sete)4 20 $00c  TADATADATADATADATADATA*Invalid Postamble*Unused bit seti ). 42*$*Invalid End Of Data*Unused bit set ()*M 0.s$*Postamble Short*Unused bit set C)et 0. $*Postamble Longt*Unused bit set u)po *Uncorrectable DataUor *Multitrack Errort e$M 0PXST2a EXTENDED STATUS REGISTER 2  Operation In Progress = 20$*Silo Parity Error*Unused bit setem) = B@ $!*Serial Bus Parity Error At Drivee*Unused bit setct)t= :8e$*Capstan Acceleration Fail*Unused bit set s)me  \* Drive is a TU80 Drive is a TS11 A $"*Write Card Failed (WB clock)U *Unused bits setab T,* Microcode Revision Level = s$Te)# M "0PXST2I EXTENDED STATUS REGISTER 2 $  Operation In Progressed 20$*Silo Parity Error*Unused bit set y) B@$!*Serial Bus Parity Error At Drivee*Unused bit setcd) $ :8$*Capstan Acceleration Fail*Unused bit set n)d  \* Drive is a TU80 Drive is a TS11 $"*Write Card Failed (WB clock)U *Unused bit setl *Unused bit setla XZX*$ Residual Capstan Tick Count = u $X*)#t $Xr*Unused bits set")*)~$0PXST2v EXTENDED STATUS REGISTER 2 T  Operation In Progressts 20$*Silo Parity Error*Unused bit set p)ot B@$!*Serial Bus Parity Error At Drivee*Unused bit setci)Ch :8 $*Capstan Acceleration Fail*Unused bit set ))  \* Drive is a TU80 Drive is a TS11*T $"*Write Card Failed (WB clock)Uo *Unused bit setlf-  Dead Track Parity setve  *Track 7 Deadare  *Track 6 Deada  *Track 5 Deadapa  *Track 4 Deadaev  *Track 3 Deadaor  *Track 2 DeadaW  *Track 1 DeadaFo  *Track 0 Deada&0`XST3 EXTENDED STATUS REGISTER 38 d:8I$dXP#*Diagnostic Error = Capstan Runaway r) ><r$*Limit Exceeded (tension arm)u*Unused bit set r)um *Operation Incomplete at  Reverse (motion)l1 64p$*Capstan Response Fail*Unused bit set )X *Density Check .,n$ *Noise Recordk*Unused bit set ) :8$*Limit Exceeded Statically*Unused bit set ) 2 *Reversed into BOTn:i$fu0JN/aN*Illegal FunctionRead$Write CharacteristicWriteWrite Subsystem MemoryPosition Format Control InitializeGet Status Immediateudl." 00s$ Illegal Mode CodeRead NextRead PreviousReread PreviousReread NextLoad MSG BUF Adrs, Set DEV Char.Write DataWrite Data RetryNormal (Diagnostic Use Only)Space Records ForwardSpace Records ReverseSkip Tape Marks ForwardSkip Tape Marks ReverseRewind Write Tape Mark Erase Write Tape Mark Entry Message Buffer Release Rewind And Unload Clean Drive InitializeGet Status (END Message Only)$ 20) N/AEndFailErrorAttention $$  )$' $& *Invalid Function mode+codes$$ #' $ *Invalid Message codeetD$\TU80TS11)pN/A0:J $ ': l$Nl*Invalid functioncN/Avx???vN/AvN/Av"|N/Av$hN/Av $lRead bytes remaining X$ bb records remainingrr  tape marks remaininge (value meaningless) ZF$<(~ $.",, PP P P 00c O  b X(C3 ETSV05M01.01V2.00MPDISPCFUNCTION >INTERMOD_DEVERR       MES_SAGE_TYPE MODED REGISTER_     " $&(*,.02468:<>@BREPORTYVAR   DEVICE_ENTRY^X>0rTT0" 0t" 'l=" pS h  Record Length Longe *Write Lock Errornr$ *NonexecutableFhi$6 )celmmand((d$60CMDHDR COMMAND PACKET HEADER WORD O .,' Acknowledge (message buffer available)l n  Clear Volume CheckgCh .,' Opposite (reverse the reread sequence)eod   Swap Bytesr L  Function Mode = e $li   jhT$ F*tD) Format = T N$1 Wrd Hdr, Interrupt Enabled1 Wrd Hdr, Interrupt Disabledet)t *C   Function = a$l  .$F0CMDB_2)COMMAND PACKET WORD 2ETh *( Tape Mark/Record Count = 4$!)# 0CMDB_3 "  UNUSED COMMAND PACKET WORDd0CMDB_4 "  UNUSED COMMAND PACKET WORDd U U UU0CMDB_2 UNUSED COMMAND PACKET WORD 0CMDB_3 UNUSED COMMAND PACKET WORD 0CMDB_4i UNUSED COMMAND PACKET WORDT0CMDB_2eCOMMAND PACKET WORD 2 O :8 Bus Address BA15-BA00 = Ds$0Am)&  (O)* 0CMDB_3COMMAND PACKET WORD 30on  *Unused bits setct :8 Bus Address BA21-BA16 = Dr$0A)!  (B) 0CMDB_4COMMAND PACKET WORD 46  Byte Count = o$s)# 0TSSRESTATUS REGISTERW@ *Special Condition setDr *Unused bit setit= *Sanity Check Errorsat $"*Register Modification Refused *Nonexistent Memoryis $"*Need Buffer Address (msg bfr) .,  BA17,BA16 = Aa$0,)!i  (B) ev . Subsystem Ready*Subsystem not Ready *Offline (transport) O n$2$ *i$*Meaningless value*Internal Diagnostic Error*Reserved valuer *Not used *Reserved (Loss of Power)( ):)$  a$  Normal TerminationI Attention Condition Tape Status Alert*Function Reject*Recoverable Error (tape moved)g#*Recoverable Error (tape not moved)-$*Unrecoverable Error (position lost)*Fatal Controller Error-n) ck *Unused bit setn0MSGHDR)MESS00c  TADATADATADATADATADATAAGE HEADER WORDoEX *(# Acknowledge (CMD buffer available)C I *Unused bits set  $U STD Status = r$*Illegal Statust*Illegal Command*Illegal Address*Write Lock Error/NXF *Microdiagnostic Error) \$I  STD Status = $*Illegal Statust*On or Off Lined*Microdiagnostic Failure) n)d)t B"*Format not supported by TSV05 Format = One Word HeaderT  Message Code = $pr 0MSGLGH4MESSAGE LENGTHra *Unused bits set  "  Message Length = c$ )#d 0 RBPCR,*%RESIDULE BYTE/POSITION COUNT REGISTERM#  EE$ r)#C p$tn 0$XST0$ EXTENDED STATUS REGISTER 0)u  Tape Mark detectedI  Record Length Short  Logical End Of Tape4  Record Length Longe*U *Write Lock Errorn *Nonexecutable FunctionRse *Illegal Command ) *Illegal Addressxc   Tape Moveddse &  Drive Onlinee*Drive OfflineOT 2 Interrupt Enabled*Interrupt not Enabled  Volume Check < Phase Encoded Drive"*Phase Encoded Drive Bit resetem   Write Locked (protected)rma  Beginning Of Tape   End Of Tape0(XST1 EXTENDED STATUS REGISTER 10  *Data Late  *Unused bit set ad  ,*Correctable DataERe *Unused bits set *Read Bus Parity Error *Unused bits set *Uncorrectable Datarha *Unused bit setD $hi 00XST2 EXTENDED STATUS REGISTER 2  Operation In Progress *RAM Checksum Errore *Unused bits set *Write Clock Failede *Unused bits set B Extended Features Enabled" Extended Features not Enabled 2 Buffering Enabled Buffering not Enabled 4,* Microcode Revision Level = C$4n)# "00XST2 EXTENDED STATUS REGISTER 2  Operation In Progressly *RAM Checksum Errore *Unused bits setai *Write Clock Failede *Unused bits set 8"  Selected Unit = ee$8)# $0<XST3$ EXTENDED STATUS REGISTER 3TU @0"*Unknown Micro Diagnostic Error = :$@)" .**Diagnostic Error = RAM Write/Read Failure$ *Diagnostic Error = FIFO failure *Unused bit setoRe *Operation Incomplete  Reverse (motion)l *Unused bit setnr *Density Checkrk *Unused bits setme *Reversed into BOT $ &0DXST4 EXTENDED STATUS REGISTER 4 < High Speed Mode (100 IPS) Low Speed Mode (25 IPS) " *Write Retry Count Exceededi *Unused bits set H&$ Write Retry Count = c$H)" :$0J@N*Illegal FunctionReadWrite CharacteristicWriteWrite Subsystem MemoryPosition Format Control$ InitializeGet Status Immediate. " 00al eIllegal Mode CodeRead NextRead PreviousReread PreviousReread NextLoad MSG BUF Adrs, Set DEV Char.Write DataWrite Data RetryNormal (Diagnostic Use Only)Space Records ForwardSpace Records ReverseSkip Tape Marks ForwardSkip Tape Marks ReverseRewind Write Tape Mark Erase Write Tape Mark Entry Message Buffer Release Rewind And Unload NO-OP (Get Status) Rewind with Immediate Interrupt Drive InitializeGet Status (END Message Only)a$ 20P N/AEndFailErrorAttention$i$d$ no' 00c O  b "$ << $gl$ oe" D" (( ((.",$ $ $ $$$$$""N $$$ $ $<J"rH  $$$$$$$$$( 0<  $aiNo error bit foundc c$o.)!5FCName!13FCValue!25FCInterpretation!2FLiT$!2FL!5FC!DF!13FC!DP!25FC!DP!2FLt.r$Z!25FC!DP!75FC!DP!CE! !25FC!DP!CEt)@b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rs"Ss"x~"6U"s]7$7$_7$j7$@v7$> (4. ETU58VM01.03V2.00MDISPCBINTERMOD_DEVERR      @REGISTERL     REPORTSUCCESS VAR  DEVICE_ENTRY  |Nonex  $60RCSRDL11 RECEIVER CSR   Device Status Change ri  Ring Indicator onOT . Clear to Send onn Clear to Send offbl 0 Carrier Detect on Carrier Detect offged  Receiver Activeri "  Secondary Received Data on (p *Unused bits setng  Receiver Done O B  Receiver Interrupt Enabled  Receiver Interrupt Disableda > Device Interrupt Enabledl Device Interrupt Disabled *Unused bit setp $" Secondary Transmitted Data on 2 Request to Send ont Request to Send offar *  Device Readye Device not Readyo  Reader Enable set0RBUF DL11 RECEIVER DATA BUFFERt  *Errorm *Receiver Data Overrunet $"*Receiver Detected Framing Err " *Receiver Data Parity ErrorE E *Unused bits setur ., Received Data = rf$n)&e  (O)u 0XCSRDL11 TRANSMITTER CSRLe *Unused bits setST 2 Transmitter Ready*Transmitter not Readyon F  Transmitter Intrupt Enabled$ Transmitter Intrupt not Enabld  *Unused bits setde *Maintenance bit set *Unused bit settit  Break bit set0WORD1 TU58 COMMAND & STATUS CODEos   Command Modifier = i$R *D   Opcode = $ReservedNo Ope InitializeReadWriteiReservedPositionReservedDiagnose Get Status Set Status*) s 0WORD2 SUCCESS CODE & UNIT FIELDi DB Unit Selected = I$*Illegal Unit D$S)# 0.1.N) 4  Success Code = $e 0WORD3TU58 BYTE COUNT FIELDInu 0.  Actual Transfered byte count = o$00c  TADATADATADATADATADATA )# 288$""6ga nctionReadWrite CharacteristiW$te  Normal SuccessCSuccess with RetrieszFailed Self-testiPartial Oper (end of medium)Hard Read ErroroBad Unit NumberxNo CartridgePWrite ProtectedeData Check ErroreSeek Error (block not found)Motor Stopped.Bad OpcodeBad Record Numbera$ gs' 2O,Unknown Value r$0w)&  (O)S  r$ e r$n Li$"oWith Increased ThresholdiAnd Read VerifyT None Issuedr  None Issuedr\TU58sXN/A8Tv$ReservedNo OpT InitializeReadWriteiReservedPositionReservedDiagnose Get Status Set Status) Ot ($ )#ulN/AehN/AeddN/Aei`???epPN/Aenp e' $/t tpE$ g O$p"|p    $pEpNo Error Foundr $xi$!1FCValue!25FCInterpretation!FLe|L!2FL!1FC!DP!25FC!DP!2FLa.o$!25FC!DP!75FC!DP!CE! !25FC!DP!CEd )@b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rs"Ss"xu"~"6U"s]7$7$_7$j7$@v7$>( ETU77VM01.03V2.00MlDENSITY  DEVICE_OPDISPC FORMAT_TYPE FUNCTION BINTERMOD_DEVERR      REGISTERP     " $&(*,.02468:<>@BDFH REPORTN VAR DEVICE_ENTRYSKAGS $`0MTCS1I_ *Special Condition set *Transfer ErroriH &$*MASSBUS Control Bus Parity Err F *Unused bit setlSS . Drive Available*Drive not Available R($ Unibus B Selected for Data Transfer($ Unibus A Selected for Data TransferOT .,  BA17,BA16 = en$0, )!S  (B)b &  Drive Ready Drive not Readyec 2 Interrupt Enabled Interrupt not Enabledta    Function = b$ et  *Go bit on0hMTWCcei 64 Word Count = $he)Cv)#I  words remaining 0MTBA En  Bus Address Registerd0DMTFCit   Frame Count = g $Dn)#t 0MTCS2ue  *Data Lateeq *Write Check Error D *Unibus Parity Errorad *Nonexistent Drive s *Nonexistent MemoryrEC *Programing Errorr *Missed Transferr $"*MASSBUS Data Bus Parity Errored J&" Output Ready (silo contains data)" Output not Ready (silo empty)et B  Input Ready (silo not full)  Input not Ready (silo full)CS  Controller Clear(Le  Parity Test ona $"*Bus Address Increment Inhibitea  Drive Selected = r$ 0(MTDStru $" Slave-transport Attention ont ,*Combined Error sett  Position in Progressnak * Medium Online*Medium not OnlineTA  Write Protectedma  End of Tape detectedn  *Unused bit settNo * Drive Present*Drive not Presentti . Formatter Ready Formatter not Readys 00c O  b o$0*Incorrectable Data Errorr*Vertical Parity Error) *Data Bus Parity Error  *Format Errori g  *Control Bus Parity Errorr $"*Register Modification Refused  *Illegal Register Addressfth *Illegal Function 0MTAST *Unused bits setNo  Formatter #7 Attentions  Formatter #6 Attentionsli  Formatter #5 Attentionson  Formatter #4 AttentionsSe  Formatter #3 AttentionsN/  Formatter #2 Attentions??  Formatter #1 Attentions  Formatter #0 Attentions0MTCK *Unused bits setnd @>x$0*Dead Track = Pt CRC Parity = t$1D0 |)L )FC 64o$0  CRC word = D$0CC)&!  (O) )*I  e$0*Dead Track = 8t)  $0*Dead Track = 7t)  i$0*Dead Track = 6t)  $0*Dead Track = 5tx)  $0*Dead Track = 4t)t  e$0*Dead Track = 3t)  $0*Dead Track = 2tn)  $0*Dead Track = 1ts)0$MTDB me  Data Buffer contentsC0HMTMR  TRo$L Maintenance Mode Data Field = c$H i0R)&W  (O)a a)re " a$L Tape Speed Clock )$ " $L Maintenance Clock) @>$L Maintenance Mode Op-code = ($H)# ") L4 Maintenance Mode on Maintenance Mode offc04MTDT & *Drive is Sector Addressable .($*TAP reset (signal is hardwired set) *($*MOH set (signal is hardwired reset) (&!*7CH set (signal hardwired reset)e2F > DRQ on (dual port unit)  DRQ off (single port unit)r5F * Slave Present Slave not PresentTE < Transport Type = $ og 8. Formatter = TM03  Formatter = TM02 0PMTSN 20 Drive Serial Number = nn$Pd) t  (BCD) 0TMTTCres : Acceleration bit set= Tape Activity RD/WR Datatng F  Frame Count Register Loaded$  Frame Count Register not Loaded"  `:8S$8 Slave Address Change  Tape Control Writeyp)ti V*% Abort on Data Transfer Error enabled *& Abort on Data Transfer Error disabledai X  Density Selected = e$d # \  Format Selected = $  T**$0 Even Parity used for RD/WR @)($0 Odd Parity used for RD/WRW)re d Slave Selected = a$r 8 $P%,Sdb"0MTBAE I  *Unused bits set 0. BA21 - BA16 = t$0 t)!h  (B) 0MTCS3me *Address Parity Errorr " *Data Parity Error, Odd WordND $"*Data Parity Error, Even Word ee " *Write Check Error, Odd Word5 $"*Write Check Error, Even Word de  Double Word Transferedn *Unused bits set = 2 Interrupt Enabled Interrupt not Enabledle *Unused bits setri  >< Inverse Parity Check Bits = $ 0rs)!e  (B)y so(.."Fma" Control$ Initialize~$G40 eNo OpRewind Off-lineRewindDrive ClearRead-in PresetP Erase Write Tape Mark Space ForwardM Space ReverseCWrite Check ForwardWrite Check ReversetWrite Forwa00c  TADATADATADATADATADATArdRead ForwardoRead Reversepc*e$rdP08ap <800 BPI/NRZI1600 BPI/PE*Reserved*Reserved*Reservedd$ ~0v rzPDP-10 Core DumpPDP-15 Core DumpPDP-10 Compatible PDP-11 Normal PDP-11 Core DumpPDP-15 Normal*Reserved Format*8n$X m'*  r$<*Illegal Densitydv$\ tu'd  a$zy*Illegal Formaty $P) ~$  d'~ i$r*Invalid functionm$ $d)#n???vN/AvN/AvdN/AvoN/Av" ((  (  $ v i$e$,g d$,*"/(     J"yH@@@@@@ @ @ @@ @ @@@@@ $No error bit found  $Lr.)!5FCName!13FCValue!25FCInterpretation!2FLts$z$~ w@b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rs"Ss"xu"u"~"6U"s]7$7$_7$j7$@v7$>(QZ EUNKWN01.017V2.00MvDISPCBINTERMOD_DEVERR      REGISTERLVAR DEVICE_ENTRY = | D0 o$6 0C&  ac XN/ATN/AtN/Ac`???lN/A$hN/ArdN/A)PN/ApN/A \ *Unknown $x$hc!54FC1111110000000000!FL!5FCOffset:!17FCWord :!32FCHighbyte:!44FCLowbyte:!54FC5432109876543210:!FLFLG!5FC------!17FC------!32FC--------!44FC-------!54FC----------------!2FLF | '|$`a$c)#e$i)% $ )%R$a)%$0 )!0+!5FC!DP!17FC!DP!32FC!DP!44FC!DP!54FC!DP!2FL- |6<8 This entry is printed for any of the following reasons:<7 1. The entry's device mnemonic is unknown to the: error log subsystem.:6 2. The entry's device mnemonic is known, but the size is incorrect.<7 3. The device mnemonic indicates a MASSBUS device, but:<7 the Drive_Type_Register does not contain a valid: MASSBUS ID.T<7 4. The required device module is not present in the:  library.<7 5. The entry is a CPU or memory related error but the:83 CPU type is unknown to the error log subsystem. \X!3FLNOTES:!2FL!DP!2FL!DP!FL!DP!2FL!DP!FL!DP!2FL!DP!FL!DP!FL!DP!2FL!DP!FL!DP!2FL!DP!FL!DP@ b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rs"Ss"xu"u"~"6U"s]"fH7$7$_7$j7$@v7$(]J FINLP1P01.00V2.00_AC(DEVICES   ERROR ERROR_INFO_E ERROR_INFO_GN ERROR_INFO_HL NOTE_NUMBERSF PACKET_RANGEI nREPORT      !#%')+-/135TIME_4E   TITLELFINAL_103/04:R*2**$"TU68TU"B<DU( @DXRX01RX01ERX01Y@) D D D 1M'DDM$00c O  b :!5FCPacket time selections:!FL!9FCFrom !DP through !DP!2FLD$"A$ (not used) ).)!5FCVolume label selection:!FL!9FC!DP!2FLP>f$$)  (not used)\)$$ )  (not used) )HC!5FCSerial number selections:!FL!9FCDrive: !DP!FL!9FCPack: !DP!2FLiZ $No eN)HistoryiT _$No r)Errorr $No r )Geometry >9!5FCSummary selections:!FL!9FC!DP!FL!9FC!DP!FL!9FC!DP!2FL: $ No u ) ProcessorrP C$No sV)MemoryE "A$No yD) System_Info A $No mD) PeripheralE  $No h)ControlrM VQ!5FCPacket type selections:!FL!9FC!DP!FL!9FC!DP!FL!9FC!DP!FL!9FC!DP!FL!9FC!DP!2FLt $ !5FCPacket number selections:!FL ST'C.$N*5S$):$*5$ )HU$O$!9FC!DP:!DP!FL$!9FC!DP:!DP!FL !9FC!DP!FL)U)  * !FL!5FCDevice selections:!FL >'*Z@>U$8N$@$8$<0F )& : M$8)(ALL)F ) !9FC!DP!FL * $)# $)#FA!FL!5FCNumber of packets printed / processed:!FL!9FC!DP / !DP!2FLDG8$)*<)S)*K$8$<B=!5FCProcessing began at !DP!FL!5FCProcessing ended at !DP!2FL!UREPORT)PINPUTTC)Pv USER )PDD*Pdx@b 8 _INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rs"Ss"xu"u"~"6U"s]"fH7$7$_7$j7$@v7$&MP(! FMTNP1P01.04V2.00infH DEVICE_ID       "h DEVICE_OP       "$&(*,.02DISP&FUNCTION_CODESd :HEADERI INDICATEY&INTERMOD_DEVERR    v IO_ACTIVITY      !#%')+-/13579 MAPPING_CONV OP_SYS_ PROC_CONV REPORTARESOLVE   SUBCODE,TASKC  TEMPE  OUTPUT_PACKETSrt(e$\) 8cto<CPA9CPBvCPCPCPDFP:$!D r16-Bit$18-Bito22-Bitet> ::0 " $"rr C$9"ry A$No yD) System_Info A $No mD) Peripherl8 *  FL9 IO.WLBaIO.WLTeIO.WLCo IO.WPB@IO.WLV`IO.WDDIO.RLBIO.LOVIO.RLC$ IO.RPB$@IO.RLVHIO.LDOD`IO.RSNIO.SCFDIO.RWDIO.TRMLIO.SPB  IO.SPF@IO.STCHIO.SMDvPIO.SECt`IO.RWUpIO.SMOIO.EOFIO.ERS$ IO.DSEIO.HMS IO.BLSIO.OFFLIO.RDH IO.WDHL(IO.WCK0IO.RNF)8IO.RNR)@IO.LPC!PIO.RTD XIO.WTDs`IO.TDD/hIO.DGNdpIO.WPDDxIO.RPDFIO.CER$IO.CEWIO.RVBIO.WVBKR88 * ` lREOhd00c  TADATADATADATADATADATADUIO.INLDUIO.RPLL*$N $)#$$~ v$|R)D (X$|R )T )6$B)(LG!1FP!5FCEntry !DP!20FCSequence !DP!40FC!6DP!FL!5FC!18DP!DP!2FS!20DP!3FLC$"(8$F_HA$$$*$H$.n*?$.05S)")B$ $< R$&)#System Identification:!1FL------ ---------------!2FL!5FCSystem!19FCIdent!26FCProcessor!37FCMapping!46FCCPU!51FCFormat!2FL!5FC!12DP!19FC!4DP!26FCPDP-11/!2DP!37FC!6DP!46FC!3DP!51FC!2DP!3FL )$>r$$0m)&J$([$0m)& , $0m)& ] N/A)$)'&$ PrivilegedNon-privilegedR)&$ PrivilegedNon-privileged)Requesting Task:!1FL---------- -----!2FL!5FCTI:!13FCUIC!24FCTask Name!35FCTask Privilege!51FCTerminal Privilege!2FL!5FC!2DP!3DP:!13FC!9DP!24FC!6DP!35FC!14DP!51FC!14DP!3FL E_$6NpS$N$*e)$x $j )D $j)$Z $:)A t$b)&,$F($^)&N/Alt)Device Identification Information:!1FL------ -------------- ------------!2FL!5FCDevice!13FCType!27FCVolume Label!41FCController!53FCUnit!59FCSubunit!2FL!5FC!6DP!13FC!12DP!27FC!12DP!41FC!2DP !DP!53FC!3DP!59FC!3DP!2FLPV$V N/Ai$V) )N$tR$BN/Ai$Jp)#)$BN/Ai$f)#p)je!5FCPack SN!19FCDrive SN!33FCHard Errors!46FCSoft Errors!2FL!5FC!12DP!19FC!12DP!33FC!4DP!46FC!4DP!2FLoP$BN/AC$NT)#B) $BN/AC$n )#G)Q$B$ZTN/AC,$> )#)b^!5FCI/O Count!28FCWords Transferred!51FCCylinders Crossed!2FL!5FC!21DP!28FC!21DP!51FC!21DP!3FL F$:@$X$)@ $$F  'F$ $ XLR`$Ol$hv$R  'R )$dJ$$ ! IQ.X G) $ ! IQ.Q ) $  ! IQ.UMD)E F* D$0.)&4 $ $,(Internal I/O operation)*I$$0r1)&JD$[$0r)& ,E L$0rD)&! ] N/AV)R$)'x$h$$$$$)BI)&T$$E)BP)&)$*$)B)&)N/A)$R$ $)#N/Av)I/O Operation Identification:!1FL--- --------- ---------------!2FL!5FCTI:!13FCUIC!24FCTask Name!35FCAddress!48FCLength!2FL!5FC!2DP!3DP:!13FC!9DP!24FC!6DP!4FS!DP!35FC!9DP!3FS!DP!48FC!6DP!2FL $" $)# $)#$ $d_!5FCMaximum Retries!22FCRetries Remaining!41FCOperation!2FL!5FC!6DP!22FC!6DP!41FC!DP!2FS!DP!3FL! $$tlg!5FC*Address and possibly length of the buffer transferred!1FL!6FCare not those of the issuing task!3FLr $2  6'Concurrent I/O Activity:!1FL---------- --- ---------!2FL!5FCDevice!13FCController!25FCUnit!33FCSubunit!42FCTI:!50FCUIC!FL!5FCTask!13FCAddress!25FCLength!33FCOperation!2FL E ' $ ar$--$- 'p$ mt$ aR R-R`-$ l$hl$ 'R $d$J#$p$ ! IQ.Xef)n e$ ! IQ.Qer)F S$  ! IQ.UMDF)r 2* 8$0.!)&C DB!$F$0.K)& $ *$)A $")&$*$a)&N/A)#$ $0.>)&J$[$0.)& ,, $0.g)& ] N/A) $ )'h$$$$a$ )B)&$Y$)B)&b)Y$$N)BY)&)N/A,)Y$$r)#N/A)$pl!5FC!2DP!3DP:!13FC!2DP !DP!25FC!3DP!33FC!3DP!42FC!2DP!3DP:!50FC!9DP!FL!5FC!6DP!13FC!9DP!25FC!6DP!33FC!DP!2FL   P8'!!FLCeg00c O  b $::0 "A")N/9"io entification:!1FL--- --------- ---------------!2FL!5FCTI:!13C!8FC *  S!P )IO.WLBIO.WLTIO.WLCa IO.WPBr@IO.WLVe`IO.WDDaIO.RLBCIO.LOV!IO.RLCD IO.RPBP@IO.RLV2HIO.LDO!`IO.RSNIO.SCFIO.RWDIO.TRMIO.SPBd IO.SPFp@IO.STCeHIO.SMDhPIO.SECt`IO.RWUdpIO.SMOrIO.EOFsIO.ERSi IO.DSEsIO.HMSIO.BLSIO.OFFIO.RDH IO.WDHc(IO.WCKO0IO.RNF:8IO.RNR-@IO.LPC-PIO.RTD2XIO.WTDi`IO.TDDnhIO.DGN5pIO.WPDFxIO.RPD4IO.CERFIO.CEWFIO.RVBCIO.WVB5CRg8!3 * ` lhp$dDUIO.INLDUIO.RPLL$N $ )#$$~ $|)D ($|R ) )$BJ)(JE!1FP!5FCEntry !DP!20FCSequence !DP!40FC!6DP!48FC!18DP!DP!2FS!20DP!3FLF$"(8$FHF$$$*$K$.*?$.05")")*$&$< A$&)#System Identification:!1FL------ ---------------!2FL!5FCSystem!19FCIdent!26FCProcessor!37FCMapping!46FCCPU!51FCFormat!2FL!5FC!12DP!19FC!4DP!26FCPDP-11/!2DP!37FC!6DP!46FC!3DP!51FC!2DP!3FL B$>r)A$$0m#)&JA$[l$0mD)&1 ,D $0mP)&F ]! N/AP)!$P)'&F$ PrivilegedNon-privileged!)&$ PrivilegedNon-privilegedL)Requesting Task:!1FL---------- -----!2FL!5FCTI:!13FCUIC!24FCTask Name!35FCTask Privilege!51FCTerminal Privilege!2FL!5FC!2DP!3DP:!13FC!9DP!24FC!6DP!35FC!14DP!51FC!14DP!3FL 3C$65Device Identification Information:!1FL------ -------------- ------------!2FL!5FCDevice!13FCType!27FCVolume Label!41FCController!53FCUnit!59FCSubunit!68FCPack SN!82FCDrive SN!2FLC--$-$*e-)-$xF F$jv)D V$jm)e$Z C$:t)A r$bF)&!$FC$^u)&N/AlF)!$VDN/Al1$V!) C)!$tXS!5FC!6DP!13FC!12DP!27FC!12DP!41FC!2DP !DP!53FC!3DP!59FC!3DP!68FC!12DP!82FC!12DP!2FLiN$BN/AC#$N)#e)P$BN/ACF$ni)#S)C$Bd$ZrN/ACC$>t)#r)F$BN/ACP$JF)#2)F$BN/ACC$fP)#L)!5FCI/O Count!28FCWords Transferred!51FCCylinders Crossed!74FCHard Errors!87FCSoft Errors!2FL!5FC!21DP!28FC!21DP!51FC!21DP!74FC!4DP!87FC!4DP!3FL !D$:8!!$D)@L:$$ '$ $ FLR`$lX$h$R l'R $dJ$$ ! IQ.X d) $ ! IQ.Q  )Q X$  ! IQ.UMD )Q )* $0.)&  I/O Operation Identification:!1FL--- --------- ---------------!2FL!5FCTI:!13FCUIC!24FCTask Name!35FCAddress!48FCLength!56FCMaximum Retries!73FCRetries Remaining!92FCOperation!2FL00c  TADATADATADATADATADATA  R$,(Internal I/O operation)*I$$0rP)&J$[$0r)& , $0r)& ] N/A)I$a)'I$hf$t$:$L$-$-)B-)&-$F$:)BF)&C)F$a$A)Be)&4)N/A!)F$!$:$F)#N/AC) 4$D)# C$P)#D$C$hd!5FC!2DP!3DP:!13FC!9DP!24FC!6DP!4FS!DP!35FC!9DP!3FS!DP!48FC!6DP!56FC!6DP!73FC!6DP!92FC!DP!2FS!DP!3FL F5$!1C$!tDlg!5FC*Address and possibly length of the buffer transferred!1FL!6FCare not those of the issuing task!3FLr t$2  es'tConcurrent I/O Activity:!1FL---------- --- ---------!2FL!5FCDevice!13FCController!25FCUnit!31FCSubunit!40FCTI:!48FCUIC!59FCTask!67FCAddress!78FCLength!86FCOperation!2FL 3A'! L$3 i $$ '$ $ R RR`$lt$h$ $'R $dJ$$ ! IQ.Xe ) $ ! IQ.Qe#)p $  ! IQ.UMDn) !* r$0. )&Q MB$$0.)&$ &$)A $)&$$0)&N/A)$ $0.)&J$N[$0.)& ,> &$0.)&[ ] N/A)$)'h$g$ $]$A$ )B)& $$)B)&)$B$)B)&)N/A)$$)#N/AN)&$jf!5FC!2DP!3DP:!13FC!2DP !DP!25FC!3DP!31FC!3DP!40FC!2DP!3DP:!48FC!9DP!59FC!6DP!67FC!9DP!78FC!6DP!86FC!DP   CD'!!2FLeg@b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rs"Ss"xu"u"~"6U"s]"fH7$7$_7$j7$@v7$&M'Z'_j(~2 INITM1M01.03V2.009DPX INIT_TEMP .REPORTO   TITLElINIT_1!20FC!25DZ7*2&P!" : >der (RBN)!2FL!4FC!33DP!2FL 4  $ )#<$)# 4 $ (Primary RBN)e(SecondaryR(V V 'V / $h!2FL!5FC!DF!13FC!DP $d:N$RSX-11M/M-Plus Error Logging System )  ))*  Page8 P:5!7DP!10FC!20DP!32FC!18DP!52FC!6DP!60FC!30DP!92FC!39DP9l!25FC!DP!75FC!DP!CE!T FMTWP1:N$RSX-11M/M-Plus Error Logging System )R   !)c)*  Pagel P<8!7DP!10FC!20DP!32FC!18DP!52FC!6DP!FL!10FC!30DP!42FC!39DPl !25FC!DP!CE0T FMTNP1p|$:p| M  $XBRIEF1 $d( p|~z Entry Time Stamp Entry Type Device Error Type Additional Informationp|------- -------------------- ------------------ ------ ------------------------------ --------------------------------------->)Fp|>9 Entry Time Stamp Entry Type Device  p|>9------- -------------------- ------------------ ------ T>U)\`00c( O  b "9D!FC"14 PFL" De"n nrm*"-- ---- ------------!2FL!5FCDevice!13FCType!27FCVolume Label * * e5'*ptfFu$b6a&*N * eN'*L -$$b '* * * * * *m'* * * r'*pf$^$fA&* * '*A C$$ft !'* * * * * *P'* * * !F'*p!fC|P$Bi&*$ * $'*e $|A$Bn )S'* * * * * *'* * * B'*pCfxL$>F&*  * Cr'*Tf d$xF$>l ds'* * * * * *s'* * * !D'*p!fPC$^!!&*3 * $8'*$ $@$^ '* * * * * *'*)   'Error Summary:' rDevice Type Drive SN Volume Label Pack SN Error Type Count First/Last Occurence Entryni------ ------------ ------------ ------------ ------------ ------------------------------ ----- -------------------- -------Onx| * tn'* !FP *'* $^$ ) J$>$x  $B$|  $f$F  $bI$ )$t$bLN/A-$b) -)H $fF)D $f)$beN/Al$bA) )R$B $fA)D C$fP)$bdN/AlD$bD) 1)\PC$>!D$BF P$fS)D !$f!)!9$b2N/AlF$b) )t$^!$>Dl$B5 d$fs)D n$f )hf$bnN/Al!$b!) a)o!FLle\n$k$$$$$Js$F)#$Nr)(/$Ri$VF)(-$Zhc!6DP!2FS!12DP!2FS!12DP!2FS!12DP!2FS!12DP!2FS!30DP!2FS!5DP!2FS!20DP!2FS!7DP!FL!104FC!20DP!2FS!7DP!FLF8n$^8xp$>i|F$B3$b!L$f *F@b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rs"Ss"xu"u"~"6U"s]"fH7$7$_7$j7$@v7$&M'Z'_y:'x. (6 SMRYGPP01.02V2.00ype@ ERROR_INFO_GM   0GEOM_KEYR  & GEOM_PRINTV  TITLE SUM_GEOMETRYXT jThK::ZNAE"T_IT"UP z U  " ~EA*"NE S6 8 "il gx!)  " |qu*"-- -----!2FL!5FCTI:!3IL2466>"mi>" L"" m""-- -FL*"FC ome Label * * e5'*ptfFu$b600c0  TADATADATADATADATADATAa&*N * * 'L'*pf$b$N*&*  * '* *$$N* *'* * * * * *A'* * * 'A'*pf$f$V*&*  * '* *$$V* *'* * * * * *'* * * 'e'*pf$B$b)*&*  * '* *$$b* *'* * * * * *F'* * * 'T'*pf$>$fd*&*  * '* *$$f* *'* * * * * *!'* * * ''*pf$~^$F*&*  * '* *$~$F* '* * * * * *'* * * E'*pufrz$B &* * ec'* y $z $Bi  '* * * * * * '* * *  '*p fra$^cn&*  * '*- -$-$^- --'* * * * * * '*--)   --'-Geometry Summary:t ezvDevice Type Drive SN Volume Label Pack SN Head Group Cylinder Sector LBN Error Count$zv------ ------------ ------------ ------------ ------------ ---- ----- -------- ------ ---------- -----------lz~ * nl'*>!FP $'*  A$^b$  >$B$zDF D$F<$~le ) $f$bF l b$b $ $!$bN/A$bd) s)Hn l$fl)D b$f)!$baN/Al$b) L)R$F$ $f)D $fF)$bN/Al/$b) V)\)-$BD$FS P$fS)D S$fD)SP$bPN/AlD$bF) D)t02$^2D$BF$F $f>)D $f)$bN/Al$b) )!FLlx$ $$$$$VFR$V)#N/Al)$R$N$N)#N/Al) $ZR$> $J)#`\!6DP!2FS!12DP!2FS!12DP!2FS!12DP!2FS!12DP!2FS!4DP!2FS!5DP!2FS!8DP!2FS!6DP!2FS!10DP!2FS!8DP!FL$^)z$B$b$~$F.$f *IC@ b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rs"Ss"xu"u"~"6U"s]"fH7$7$_7$j7$@v7$&M'Z'_y:'xxh(y SMRYHPP01.01V2.00 Ty0 ERROR_INFO_HM $HIST_KEYV  " HIST_PRINTS  TITLE SUM_HISTORYUME_EZAHD**:COEv"TXnz" jLG"AS _zME&  rIT UIC UIC_GROUP UIC_MEMBER(~T@P_**2"LE B"YX " T" U   " ~EA*"NE S6 8 * * '*p fr $Nuv-&* * 5T'*I 6$r>$N i'* * * *v *v **'* * * '*pfzp$Vv&* * '* $z*$V '* * * *v *v *'* * * *'*pfj$>v*&*  * '* $j*$> '* * * *v *v *'* * * *'*pfn$Jv*&*  * '* $n*$J '* * * *v *v *'*$r*)   'History 00c8 O  b B$j ' $V*$zF $N $r $ *$NN/A^$N) n)H $V)D $V^)-*$NN/Al$N*) )R $> $V)D $V)$NN/Al$N) )jtu$Jy$> $V)D  $VT)  $NSN/All$N ) e) !FLleXo$y$r$t$ $FN)# $Bo$B)#z)-$R--$R-)#-)B=!6DP!2FS!12DP!2FS!12DP!2FS!12DP!2FS!13DP!2FS!11DP!2FS!11DP!FL! n-$J-j-$>-z$Vrz$N *@b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rs"Ss"xu"u"~"6U"s]"fH7$7$_7$j7$@v7$&M'Z'_y:'xxhx.T( MSCPCE01.11V2.00CODCONN_ID  CONTROLLER_ERRORC CONT_TABD  DATA_ERRORA DISPX DRIVE_ERROR fEPACKET       ! #%')+-/1 HOST_BUFFER BINTERMOD_DEVERR       MAJOR_STATUS  MEDIA_FORMAT MSG_TYP REPORTM*VAR   L DEVICE_ENTRYss :htlti^"RA0"$""<B%CD"%`"@|"De%!RX33d%RRA82d%@RD31d%6@RD54e%2" RRD50cd% @RD32e%RX31e%$$$0 MSGFD13MESSAGE ENVELOPE FIELD92   Connection I.D. = E$   Message Type = $2    Credits = pR$)# 22 (& Message length = $  wordsL 0 MSGFD2"$"COMMAND REFERENCE NUMBER FIELD25 H Command reference numberF(# Error does not relate to a command0MSGFD3 RESERVED 0MSGFD4MESSAGE SEQUENCE NUMBERt< B"*Error Packet is Only Partialo Error Packet is Completet 0MSGFD5)MESSAGE FORMAT FIELD *Illegal formatF*Controller ErrorE*Host Memory Access Errort*Disk Transfer Error *SDI Error*Small Disk Errorr*Tape Transfer Error*STI Communication Error*STI Drive Error Log*STI Formatter Error Log 0MSGFD6e FLAGS FIELDt  Operation successfulL$  Operation continuingLLn *Reserved bits setP! 42- Sequence number reset (end of logged packet)r0 MSGFD7EVENT CODE FIELD$   *Subcode = Fo$p  *Major Status = $  MSGFD8i0.Controller I.D. (S/N) = $*))s  (X) 0MSGFD9eCONTROLLER MODEL FIELD   Model = R$ 0MSGFD10CONTROLLER CLASS FIELDf   Class = Rj$*Illegal subsystem numbern *Reserved  Mass Storage ControllersD Disk Class DevicesT Tape Class DevicesD Disk Class DevicesL Loader Class S SCSI Class Devices54) * 0MSGFD11.,(CONTROLLER SOFTWARE VERSION NUMBER FIELDrv $" Firmware version = R$r)# 0MSGFD12.,(CONTROLLER HARDWARE VERSION NUMBER FIELD R $" Hardware version = $2)# z L$ $H A$ HD1$H R00c@  TADATADATADATADATADATA0MSGFD13ERROR CODE FIELDX3 "  SA error code = $3)# j  R$ FZ0MSGFD13PORT ERROR CODE FIELDEig $"*Last Fail Error) = $7)# ^  n$dN0MSGFD13 RESERVED 0 MSGFD14HOST MEMORY ADDRESS S`$*I  perRt*Reserveds HSC503 UDA50l RC25G VMS Software Server TU81 UDA50A RD/RXo TOPS 10/20 Software Server TK50o RUX50 KFBTA KDA50 TQK70 RV20 RRD50-QBUS$ KDB50 RQDX3 UQSSP/DSSI Tape UQSSP/DSSI DiskC UQSSP/DSSI Disk and Tapei UQSSP/DSSI Other TUK50A RRD50-UNIBUSp RQZX1s` RF30a RF71b TF852c TF70%*$Z 8@<MSCP DiskMSCP TapeDiagnostic Utility ProtocolD$x Sequential MessageDatagram Message8Credit Notification Message%Maintenance Message~2$ 72SuccessInvalid command"Command abortedUnit-OfflineUnit-AvailableMedia Format ErrorCompare ErrorData Error Host Buffer Error Controller ErrorZ Drive Error7 Formatter Error BOT EncountereddTape Mark EncounteredRecord Data TruncatedPosition LostoSerious ExceptionLEOT DetectedDiagnostic Errorl$ga  $FCT Read - EDC errorFCT Read - Invalid Sect HaderFCT Read - Data Sync TimeoutDisk Format Not 512 Byte SectDisk Not Formated/FCT CorruptFCT read - Uncorrectable ECCxn$J Valid Header Not Found Data Sync Not Found/TimeoutUncorrectable ECC ErrorOne Symbol ECC Error Two Symbol ECC Error Three Symbol ECC Error Four Symbol ECC Error Five Symbol ECC Error Six Symbol ECC ErrorSeven Symbol ECC ErrorEight Symbol ECC Error"$lap 4AEI8Odd Transfer AddressOdd Byte Count=Nonexistent Memory Error Host Memory Parity ErrorA@e$ PZ X*Dt\SERDES Overrun ErrorEDC ErrorInconsistent Data Structurer $en  se SDI Commd timeout/Seek IncmplCntrlr Detected Protocol ErrPositioner Error(Mis_seek)Lost R/W RDY on/betwn x'sferDrive Clock DropoutLost Rcver RDY betwn SectorsDrive Detected ErrorCntrlr Detected State Prty Er$$)#0*8 $ NO'* $<"RIllegal value $i)# $ el' $"-Illegal Value s$)# ~r$ pM'~ p$"rIllegal value e$s)# lCla iBh$l2Ww$ '  a$ ll2x*$ dP'x 8$ pl l2"4I$ R'" d$8 el l2d@Xd$ ~'@ v$\ l l2m5$ Dp' 1m$ ellPN/AeD/  / R$r"FIllegal Value $)#*  `p$ *'` ls$t" * Unassigned $)#a ZN/AnI^N/AnaVN/AnvN/AnfN/AnbN/AnjN/AnnN/AnfRN/An $$ r?$rA'~$N) d $rArN$Illegal form00cH cO  b CONN_ID  CONTROLLER_ERRORC CONT_TABD  DATA_ERRORA DISPX DRIVE_ERROR EPACKET       ! #%')+-/13579;=?ACEG I!K"M# GENE_COMM   HOST_BUFFER BINTERMOD_DEVERR       MAJOR_STATUS_  MEDIA_FORMATS  MEDIA_TYPEEMSG_TYP  ONLIN_SUCH  OP_CODE REPORTF SET_CONCH  SUCCESS UDA_PATH_  UNIT_OFFLINE UNIT_TAB_ VVAR        !#%') WRITE_PROTV B DEVICE_ENTRYrsiB=$b)"SGD "CONHFI7"*Uu8d : << @> D@ A"er (teG"\ 0c"AL $SK"LD")0 "LU"LD, " N mrF". 4 IED  X$ LBN = V$ )&  (O) $ RBN = V$ K)&0  (O) *Invalid HeaderET)0)X $ IX20MSGFD22CYLINDER NUMBERE " Cylinder Number = $)# 40NMSGFD23 SECTOR NUMBERe T  Sector Number = D$N)5$ R)`GH $A$BR$ $ uv <R$6)c0@$ )cDU$)c $R$<8$@ZS$D  M80 81) $v0 MSGFD1SMESSAGE ENVELOPE FIELD =   Connection I.D. = E$  A  Message Type = t$$    Credits = pS$E)# $  (& Message length = &$(=  words 0 MSGFD2 $"COMMAND REFERENCE NUMBER FIELD 0.  Command reference number one = $$ )&I $ 0.  Command reference number two = $A)& 0MSGFD3=UNIT NUMBER FIELDeSG   Unit number = LA$)# 0VMSGFD_4 RESERVED 0"MSGFD5EENCODED OPCODE FIELDSe   Op Code = O$, Il &2 I E$"OA" 0*MSGFD68 RESERVEDv0*MSGFD6 FLAGS FIELDOAT  Bad Block ReportedDta  Bad Block UnreportedmEN . Error Log Generatede *Serious ExceptionB  EOT Encountered D  Position LostSe *Reserved bits set02MSGFD7DSTATUS CODE FIELDt= 6M  : *Subcode = $0A S >*Major Status = $ ` F$"MMMM" SM BMSGFD8 M0 BMSGFD8 " OUTSTANDING REFERENCE NUMBER LJ; Command reference number ofthe command that was aborted = =S$B2)# C0 BMSGFD8" OUTSTANDING REFERENCE NUMBER TRC Command reference number of thecommand whose status is returned = =Z$BS)#2 0 NMSGFD9tCOMMAND STATUSr "  Command status =e$N)# C0BMSGFD8K MSCP00cP  TADATADATADATADATADATA VERSIONss (& Mscp version number = e2$B)#T !0NMSGFD9 CONTROLLER FLAGSer 20+ Controller Initiated Bad Block replacementsUM *Reserved bits set n   Enable Attention MessagesCT .,( Enable Miscellaneous Error Log MessagesR .,' Enabele Other Hosts Error Log Messagesso$ ,*% Enable This Hosts Error Log MessageseC *Reserved bits set(o   Shadowing0  576 Byte Sectorst#0MSGFD10CONTROLLER TIMEOUTr$ $" Timeout interval = $S)#U %0MSGFD110.)CONTROLLER SOFTWARE REVISION NUMBER FIELDn C $" Software version = @$$)# &0MSGFD120.)CONTROLLER HARDWARE REVISION NUMBER FIELDn $" Hardware version = $)# 'MSGFD130.Controller I.D. (S/N) = $))8  (X) -0MSGFD14CONTROLLER MODEL FIELD   Model = Rt$e .0MSGFD15CONTROLLER CLASS FIELD   Class = R$*Illegal Subsystem numberI *ReservedI Mass Storage Controllers= Disk Class Devicesr Tape Class Devicesr Disk Class Devices Loader Class  SCSI Class Devices9) IIII`/0 BMSGFD8 BYTE COUNT FIELD ,* Actual Bytes Transfered = $BS)#D 30 NMSGFD9 RESERVED70 MSGFD10 RESERVED;0 MSGFD11 RESERVED?0 MSGFD12 POSITION  Object Count = $)# C0 MSGFD13 BYTE COUNT 64& Number of bytes in the Tape Record = $i)# NpG0 BMSGFD8eRECORDS SKIPPEDsRA ., Number of records skipped = R$B)# K0 NMSGFD9TAPE MARKS SKIPPED 0.  Number of tape marks skipped = $N)# O0MSGFD10 RESERVEDQ0MSGFD11 RESERVEDS0 MSGFD12 POSITION LJ< Position of Tape in terms of objectcounts forward of BOT = $)# PW0 BMSGFD8 RESERVED[0 NMSGFD9 RESERVED_0 MSGFD10 RESERVEDc0 MSGFD11 POSITION LJ< Position of Tape in terms of objectcounts forward of BOT = $)# PPP 7$>g0BMSGFD8MULTIUNIT CODE FIELD F Access Path = F$ J  Tape unit = =$4 i0NMSGFD9UNIT FLAGS FIELD *Unused bits set   Hardware Write Protecteds   Software Write Protecteds *Unused bits set &$  Variable Speed Mode Suppression  Variable Speed Unit *Unused bits set  Compare Writest  Compare Readsk0 RMSGFD_1 RESERVEDoMSGFD10*(Unit I.D. (S/N) = 7$))  (X) u0MSGFD11UNIT MODEL FIELD   Model = L0$H v0MSGFD12UNIT CLASS FIELD   Class = S$*Illegal subsystem numberr *Reservedo Mass Storage Controllers= Disk Class Devicesr Tape Class Devicesr Disk Class Devices Loader Class  SCSI Class Devices9g) t w0 MSGFD13MEDIA TYPE FIELD  Media Type = l$s at  {0MSGFD14 FORMATnt  *Unused bits set$  Cartridge Block Modemce $" Group Code Recording 6250 bpia  Phase Encoded 1600 bpi2in   NRZI 800 bpid}0MSGFD15 SPEED r 0.Speed at which unit operates = s$)#  t E$"p0MSGFD16 FORMAT MENUi  *Unused bits setia  Cartridge Block Modep@ $" Group Code Recording 6250 bpidi  Phase Encoded 1600 bpi2   NRZI 800 bpid0MSGFD17 RESERVED0 MSGFD16MAXIMUM WRITE BYTE COUNT B (& Largest Record Size = Td$T)#r 0MSGFD17 NOISE RECORD "  Record Length = i$R)#F 0MSGFD18 RESERVED\ f $80EV0BMSGFD8uMULTIUNIT CODE FIELDFo  Contents are UndefinedTie F J0NMSGFD9rUNIT FLAGS FIELD E  Contents are UndefinedT0 RMSGFD_1 RESERV00cX O  b  ' h$0*Unknown major status value sH$> )#o  nr nT0 Pr$>n2)$: ' 0V$ 5nn r`$"nn!Zr2$6 $'Z ! !$r n!L0 Outstanding reference numbern"Invalid Comm at Offset P.OTRFi2i0 $nt"Invalid Comm Offset at Pr$j nn d $>eHf$ ,e' nHu$"oH * Unassigned Od$)#U Z t c$80 sH $ eo'  Hd$"oH * Unassigned Ol$l)#D e2L $6 cw'22a0$Hn"Invalid Comm Offset at PU$De n `p$ b '` ci$t" * Unassigned O $&)# uxr$6 lf'x2a0t$"Invalid Comm Offset at P$U NeZrf$6 r'Z2C0t$nc"Invalid Comm Offset at Pb$ji  t y$0a Cnnnn* 0Subcode field not usedC uu<f$: oa'e0$$0 ouu<t $: A 'r0 $rP$0 ruu<L^I$: uf'L0$bCo$0 cuu<axc$: mr'x0M$cd$0 tu u<gv $: oi'v0O$io$0 eu u<i@Xd$: ro'@e0a$\  $0 Du u<d $: S' 0r$rn$0 uub0N/Acd / r/ $"0Illegal value a$:f)#e  n $"lnt$"lfrpk o$s$ u$JeD*Unknown Type $0or)&o ,r c$0oi)& (O)c P^$" E'P W, $b.t,( Unknown Code D$&E)&O (O)n Zd$"OOL $i))e $HLPort w$FD)# A4Subunit a$J)#E sN/Au N/Aue$,t e$d)#oN/AuvN/AudN/Au N/Au N/Au a f$e( l$Z$ e uu$0 tO$u rb$m$!1FCValue!25FCInterpretation!FLEL!2FL!1FC!DP!25FC!DP!2FLa.r$t!25FC!DP!75FC!DP!CE! !25FC!DP!CEeF)@b 8 _INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rs"Ss"xu"u"~"6U"s]"fH7$7$_7$j7$@v7$&M'Z'_y:';T}dxxhxE>P(~ MSCPAT01.071V2.00MFCONN_ID DISP_jEPACKET       ! #%')+-/13BINTERMOD_DEVERR       MEDIA_TYPEHMSG_TYP OP_CODE REPORT"VAR    DEVICE_ENTRYRY P D$$$Lx 0 ^MSGFD1MESSAGE ENVELOPE FIELD? ~  Connection I.D. = EA$V\   Message Type = F$bf :!   Credits = pe$4)#4 !F (& Message length = !$fC  words4 0 MSGFD2FIELD RESERVED0MSGFD3)UNIT NUMBER FIELD %   Unit number = L$)# 0MSGFD4CFIELD RESERVED 0MSGFD5ENCODED OPCODE FIELD a   Atncode = Oe$jn 0MSGFD6nFIELD RESERVED0MSGFD7 FIELD RESERVEDt n o$@I d0MSGFD8nMULTIUNIT CODE FIELDca 42# Access path (shared control00cp  TADATADATADATADATADATAler) = De$g)#e nt $" Spindle (shared) = <$ )#T 0MSGFD9 UNIT FLAGS FIELD  \.) Cntrlr will Perform Bad Block ReplacmentD,' Host Must Perform Bad Block Replacmentnow < Inactive shadow Set Unito Active Shadow Set Uniti!2   Hardware Write ProtectedoP!   Software Write Protectedo R $" Suppress Caching (high speed)te $" Suppress Caching (low speed))ad *Unused bits setre  Removable MediaWr   Write-back (nonvolatile)era *Unused bits set o  576 Byte Sectorsoed  Compare Writesrec  Compare Reads0 bMSGFD10FIELD UNDEFINEDrRDWfMSGFD11,* Unit I.D. (S/N) = a $fW))  (X)d 0jMSGFD12UNIT MODEL FIELD"   Model = L$L*)`bt$f*Illegal Model Numberi *Reserveda RX23D RX26P RX33F RZ22L RZ23D RZL23 RZ24D RZ25F RZ24L * Reserved * Reserved * Reserved * Reserved RZ55c RZ56e RZ57( * Reserved * Reserved * Reserved * Reserved RZ72- )$$f*Illegal Model Numberi *Reserveda RA80D RC25P RCF25 RA60L RA81D RD513 RX50D RD52F RD53L RX33e RA82  RD31d RD54e RRD50 RD32d  Unassigned5 RX185 RA70e RA90 RX35v RF30e RF71 SVS00 RD337 ESE20 RRD40 RF31- RF72- RA92-  Unassigned- ESE52  Unassigned  RFH31 RFH72 RF73a RFH73 RA72C  Unassigned  Unassignedg RA71FO)+) 0nMSGFD13UNIT CLASS FIELDD   Class = St$*Illegal Class Numberi *Reserveda Mass Storage ControllersR Disk Class Devices Tape Class DevicesL Disk Class Devices3 Loader Class R SCSI Class DevicesR) 0 rMSGFD14MEDIA TYPE ID FIELDe<  Media type = e$^ v$ zL0VvzzH"PPf0 " DmVP""5 ob D>"PP^0 \"atbj PxZDP-11 Core DumpPDP-15 Normal*Reserved Format*8n$X m'*  r$<*Illegal Densitydv*$ tZ 8<MSCP DiskMSCP Tape$Diagnostic Utility Protocalv$x   Sequential MessageDatagram MessageCredit Notification MessageMaintenance Message$$@Z 2itf6@Available AttentionCADuplicate Unit Num AttentiontBAccess Path Attentionbd%PRA80d 0RC25d 3 RCF25c"<RA60d%QRA81d%3@RD51e%2RX50d%4@RD52d%5@RD53e%!RX33d%RRA82d%@RD31d%6@RD54e%2" RRD50cd% @RD32e%RX31e% RX31e%RX18d%!@RD33d%ZRA90d%\RA92d%FRA70d%GRA71d%HRA72"RX23"RX26"!RX33"RZ22"RZ23" RZ23Lc"RZ24" RZ24Lc"RZ25"7RZ55"8RZ56"9RZ57"HRZ72&Reserved Media TypeeHf $ a)#r*8)$~ '* QV($<"oVIllegal value $~n)# r5$ ' ebs$ "bIllegal Value $<)#  r$@l p Z $v.$z^ Fm$ZeJT^D*Unknown Type $v0o)& , $z0or)& (O)N =$2 $ (D'$ jT$6.rj( Unknown Code a$t)&t (O)na  N/An/N/An N/AnaN/Ang???ndN/AnCN/AneN/And $:)#$ $je Ar$a$!1FCValue!25FCInterpretation!FLnPL!2FL!1FC!DP!25FC!DP!2FLa.*$H!25FC!DP!75FC!DP!CE! !25FC!DP!CEae)tw00cx O  b ( The Status Field is for Command Ref. # t$&e)&C  (O) 0 2MSGFD9COMMAND STATUSrr 42 OT$2e)#m  Units Till Command CompletionE UU(0 &MSGFD8rBYTE COUNT FIELD E ,* Actual Bytes Transfered = io$&)# 0 6MSGFD_1 RESERVED"0 :MSGFD_2 RESERVED&0 >MSGFD_3 RESERVED*0 2MSGFD9FIRST BAD BLOCK FIELDr@ 86 First Bad Block = L\$E $2r)#N/Ar) //L> $". .0&MSGFD8 MULTIUNIT CODE FIELDse * Access Path = F $e rr . Shared Spindle = n$t 002MSGFD9 UNIT FLAGS FIELD \.) Cntrlr will Perform Bad Block Replacment ,' Host Must Perform Bad Block Replacmentn tF$8$ *Reserved bit setm  Shadow Set Catch Up in progress#),$$ Active Shadow Set Unito)   Hardware Write Protectedo   Software Write Protectedoga $" Suppress Caching (high speed) $" Suppress Caching (low speed)) *Unused bits set & Removable Media  Fixed Media   Write-back (nonvolatile)e *Unused bits setl  576 Byte Sectorso  Compare Writesrl  Compare Reads20 6MSGFD_1 RESERVED6MSGFD10*(Unit I.D. (S/N) = r$))  (X)g <0MSGFD11UNIT MODEL FIELDs$   Model = Lg$)`Z$*Illegal Model Numberi *Reserveda RX23i RX26e RX33r RZ22T RZ23  RZL23 RZ24o RZ25l RZ24L * Reserved * Reserved * Reserved * Reserved RZ55T RZ56  RZ57o * Reserved * Reserved * Reserved * Reserved RZ72D) $*Illegal Model Numberi *Reserve00c  TADATADATADATADATADATAda RA80i RC25e RCF25 RA60T RA81  RD513 RX50o RD52l RD53L RX33e RA82  RD31d RD54e RRD50 RD32d  Unassigned5 RX185 RA70e RA90 RX35v RF30e RF71 SVS00 RD337 ESE20 RRD40 RF31- RF72- RA92-  Unassigned- ESE52  Unassigned  RFH31 RFH72 RF73a RFH73 RA72C  Unassigned  Unassignedg RA71FD)+) =0MSGFD12UNIT CLASS FIELDUQ   Class = S$*Illegal subsystem numberR *ReservedR Mass Storage ControllersT Disk Class Devices5 Tape Class DevicesR Disk Class Devices Loader Class d SCSI Class Devices5) >0 MSGFD13MEDIA TYPE FIELD  Media Type = $  @ B0MSGFD14SHADOW UNIT FIELDm VT$$g& Controller Does Not Support Shadowing Shadow Unit = o$e)#n i)D0MSGFD15SHADOW UNIT STATUS FIELDfi <:e$g$ Field ReservedT*Shadow Status Unknown) $FF0 MSGFD16UNIT SIZE FIELDTma 64% Number of LBN's Available to Host = oA$l)#e J0 MSGFD17 VOLUME SERIAL NUMBER FIELDEr  Volume S/N = f$ ) o N0MSGFD16TRACK SIZE FIELD (& Ro$t)#  LBN's in a TrackBo P0MSGFD17GROUP SIZE FIELDec *( Rn$e)#  Track's in a GroupR R0MSGFD18CYLINDER SIZE FIELDRc ,* Y$)#g  Group's in a Cylinder T0:MSGFD_2(&"UNIT SOFTWARE VERSION NUMBER FIELDHa $" Firmware Version = e$:)#D U0>MSGFD_3(&"UNIT HARDWARE VERSION NUMBER FIELDt $" Hardware Version = $>x)#$ V0MSGFD19RCT SIZE FIELDnd ., C $c)#t  LBN's in the RCT TableUb X0MSGFD20RBN SIZE FIELDo (& Br$)#  RBN's in a Track Y0MSGFD21RCT COPIES FIELDl 42 C$ )#x  Redundant Copies of RCT TableS 6 E $&Z0&MSGFD8CMULTIUNIT CODE FIELD  Contents are UndefinedT A * .\02MSGFD9UNIT FLAGS FIELDMe  Contents are UndefinedT^0 6MSGFD_1 RESERVEDb*DtMSGFD10 Unit I.D. (S/N) = UnknownTh0MSGFD11UNIT MODEL FIELDSt  Contents are Undefinedwi0MSGFD12UNIT CLASS FIELDl  Contents are Undefinedwj0 MSGFD13MEDIA TYPE FIELD R  Contents are UndefinedwDr  n0MSGFD14SHADOW UNIT FIELDeDe VTr$$& Controller Does Not Support Shadowing Shadow Unit = o*$8)# )p0MSGFD15SHADOW UNIT STATUS FIELDi) <:$$ Field ReservedT*Shadow Status Unknownl) #$Fr0 MSGFD16UNIT SIZE FIELDTle  Contents are Undefinedov0 MSGFD17 VOLUME SERIAL NUMBER FIELD  Contents are UndefinedEz0MSGFD16TRACK SIZE FIELD  Contents are UndefinedE|0MSGFD17GROUP SIZE FIELD l  Contents are UndefinedE~0MSGFD18CYLINDER SIZE FIELDi  Contents are UndefinedE0:MSGFD_2(&"UNIT SOFTWARE VERSION NUMBER FIELDIl  Contents are UndefinedU0>MSGFD_3(&"UNIT HARDWARE VERSION NUMBER FIELDa  Contents are UndefinedU0MSGFD19RCT SIZE FIELD  Contents are UndefinedU0MSGFD20RBN SIZE FIELD$  Contents are UndefinedU0MSGFD21RCT COPIES FIELDem  Contents are UndefinedU 0&MSGFD8mMULTIUNIT CODE FIELDfe * Access Path = FE$r  . Shared Spindle = a$r 02MSGFD9oUNIT FLAGS FIELDFC  Contents are UndefinedU & Removable Media  Fixed MediaC!  Contents are UndefinedU0 6MSGFD_1 RESERVED$MSGFD10*(Unit I.D. (S/N) = $))  (X)p 0MSGFD11UNIT MODEL FIELDkn   Model = L $R)`eR$*Illegal Model Numbere *ReservedD RX23S RX26n RX33t RZ22T RZ23  RZL23 RZ24 RZ25l RZ24L * Reserved * Reserved * Reserved * Reserved00c O  b MSGFD_3(&"UNIT HARDWARE VERSION NUMBER FIELD@ $" Hardware Version = $>")# 0MSGFD19RCT SIZE FIELDD  Contents are UndefinedU0MSGFD20RBN SIZE FIELD  Contents are UndefinedU0MSGFD21RCT COPIES FIELD  Contents are UndefinedU" C &MSGFD8eFtpr"Le%"$FL""!D!FC>"25CP!\".$z"C!P5F"!C!!2"DP CR)" $$NN sP%% %2 hsR%2%4 TsPRNZL&P N N5@ Х,  NJC %RN ‰Nc % U*%$Z 8  <MSCP DiskMSCP TapeDiagnostic Utility Protocolt$Ex Sequential MessageDatagram MessageCredit Notification Message%Maintenance MessageC$ Success Invalid CommandCommand AbortedUnit OfflineUnit AvailableMedia Format Error`Unit Write ProtectedCompare ErrorData Error= Host Buffer Error> Controller Error= Drive Error Formatter Error BOT EncounteredTape Mark EncounteredRecord Data TruncatedPosition LostSerious ExceptionLEOT DetectedDiagnostic Error %$    NormalSpin-down ignoredStill ConnectedDuplicate Unit NumberAlready OnlineStill Online EOT Encountered Fs.$D  ^ VZP.CRFCommand Reference NumberP.UNITUnit NumberRSRVEDReserved5P.OPCDOpcode~ RSRVEDReserved P.MODModifiers P.BCNTByte Count P.BUFFBuffer DescriptorP.LBNLogical Block Number.$  8e04 RSVREDReservedP.UNFLUnit FlagsRSVREDReserved P.DVPMDevice Dependent Parameters P.SHUNShadow Unit"P.CPSPCopy Speed  d .f$  |LEtx P.VRSNMSCP VersionP.CNTFController Flag00c  TADATADATADATADATADATAsP.HTMOHost TimeoutRSVREDReservedP.TIMEQuadword Time and Date$  Unit UnknownVolume Not MountedUnit is InoperativeDuplicate Unit NumberField Service disabled Unit$  FCT Read - EDC errorFCT Read - Invalid Sect HaderFCT Read - Data Sync TimeoutDisk Format Not 512 Byte SectDisk Not Formated/FCT CorruptFCT read - Uncorrectable ECC$ ` Write Protected by SoftwareWrite Protected by HardwareWrite Prot Hardware&Software`$h rvValid Header Not Found Data Sync Not Found/TimeoutUncorrectable ECC ErrorOne Symbol ECC Error Two Symbol ECC Error Three Symbol ECC Error Four Symbol ECC Error Five Symbol ECC Error Six Symbol ECC ErrorSeven Symbol ECC ErrorEight Symbol ECC ErrorECC field corrections onlyb$p txOdd Transfer AddressOdd Byte CountNonexistent Memory ErrorHost Memory Parity Error@$Z X\SERDES Overrun ErrorEDC ErrorInconsistent Data Structure$  SDI Commd timeout/Seek IncmplCntrlr Detected Protocol ErrPositioner Error(Mis_seek)Lost R/W RDY on/betwn x'sferDrive Clock DropoutLost Rcver RDY betwn SectorsDrive Detected ErrorCntrlr Detected State Prty Er$p  SDI Port 0SDI Port 1SDI Port 2SDI Port 3\SDI Port 0SDI Port 1SDI Port 2SDI Port 3<$ JNSerious ExceptionAbortAccessAvailableCompare Controller DataCompare Host DataDetermine Access PathEraseFlushGet Command StatusGet Unit StatusOnlineReadReplaceSet Contrlr. CharacteristicSet Unit CharacteristicWritebd%PRA80d 0RC25d 3 RCF25r"<RA60d%QRA81d%3@RD51e%2RX50d%4@RD52d%5@RD53e%!RX33d%RRA82d%@RD31d%6@RD54e%2" RRD50rd% @RD32e%RX31e% RX31e%RX18d%!@RD33d%ZRA90d%\RA92d%FRA70d%GRA71d%HRA72"RX23"RX26"!RX33"RZ22"RZ23" RZ23Lr"RZ24" RZ24Lr"RZ25"7RZ55"8RZ56"9RZ57"HRZ72&Reserved Media TypetTP$U:)#T*8A$ '* H$<"Illegal value $)# $ ' ]$"Illegal Value $)# $" ' $0V*Unknown major status value s$")# nn $"n2$ ' $ nn: $nnnF^$ 'F $^ n $nFReplacement Block Number Invalid Comm at Offset P.RBNL Outstanding reference number"Invalid Comm at Offset P.OTRFi2$Z"Invalid Comm Offset at P$V nnN8$ '2$4"Invalid Comm Offset at P$0 nNd|$ 'd2$x"Invalid Comm Offset at P$tN NAF^J$ EC'F2C$Z"Invalid Comm Offset at P$V  k 00c O  b $ mnnnn*Subcode field not useduu<^$ '$$ uu<_$ _';_$_$ _uu<;$ '$ $ Fuu< `rr$ i'`u $vro$ cu u<vbto$ a'btz$xnl$ du u<0@Xn$ tS'@T $\Pa$ 2u u< $ co' 4$oX$ ruutN/Acp/ P/ Sr$(")Illegal value $P)#l  c$lp $leipva$P$ en$tJD*Unknown Type a$0oc)&c ,s $0od)&o (O)B C<J$ -l'< na$N.o( Unknown Code n$ e)&m (O)n eve$OOhi O$a))n~l$*Unknown *Reserveds RA80R RC25t RCF25 RA60t RA81o RD51 RX50l RD52i RD53T RX33s RA82e RD31s RD54  RRD50 RD32e  Unassignedd RX18  RA70e RA90 RX35 RF30 RF71 SVS00 RD33 ESE20 RRD40 RF31 RF72 RA92  Unassigned- ESE52  Unassigned2 RFH31 RFH72 RF73 RFH73 RA72  UnassignedC  Unassigned  RA71se)+ y $UU^s$* st' EO$a*UW$*e)# aUnit oU$.IO)#e 4yPort o$*I)#n sSubunit e$. )#l e $*u)#n i$.n)# N/AunN/Au r$c 5$c)#nN/AuEN/AuN/AuoN/AurN/Au r r$t( e e$/$y  r$ nf$l o=$/$!1FCValue!25FCInterpretation!FLRoL!2FL!1FC!DP!25FC!DP!2FLa.o$`!25FC!DP!75FC!DP!CE! !25FC!DP!CE2B)@8b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rs"Ss"xu"u"~"6U"s]"fH7$7$_7$j7$@v7$&M'Z'_y:';T   *Subcode = F$ nd *Major Status = '$n XMSGFD8G0.Controller I.D. (S/N) = ($))r  (X) 0MSGFD9CONTROLLER MODEL FIELD   Model = Rn$o 0MSGFD10CONTROLLER CLASS FIELDDE   Class = Rt$*Illegal subsystem numbero *Reserved Mass Storage Controllers5 Disk Class DevicesR Tape Class Devices Disk Class Devices0 Loader Class d SCSI Class Devices9)) U 0MSGFD11.,(CONTROLLER SOFTWARE VERSION NUMBER FIELDfi 0. Controller firmware version = BL$ )# 0MSGFD12.,(CONTROLLER HARDWARE VERSION NUMBER FIELD 0. Controller hardware version = Bn$)# 0MSGFD13MULTIUNIT CODE FIELD N 42# Access path (shared controller) = F$p)#  $" Spindle (shared) = <$)# ereMSGFD14,* Unit I.D. (S/N) = #$))  (X) "0MSGFD15UNIT MODEL FIELDnt   Model = L$ #0MSGFD16UNIT CLASS FIELD C   Class = Sd$*Illegal subsystem numberr *ReservedE Mass Storage Controllers5 Disk Class DevicesR Tape Class Device Disk Class Devicese Loader Class  SCSI Class DeviceseC) N $0MSGFD17(&"UNIT SOFTWARE VERSION NUMBER FIELD& *( Unit Firmware Version = BI$)# %0 MSGFD18(&"UNIT HARDWARE VERSION NUMBER FIELDN *( Unit Hardware Version = Be$ d)#n &0MSGFD19&$ SMALL DISK CYLINDER NUMBER FIELDde   Cylinder = 2$)#R (0 (MSGFD20 VOLUME SERIAL NUMBER FIELDFD  Volume Serial NumberFT  o$ VaD,0,MSGFD21FULL ERROR CODEN 0 *Errorcode = D$ dl 4F$*Subcode = Drive Detected errorD *Subcode = Positioner errorr& 8*Major Status = e$e .0<MSGFD22CURRENT LOW 5 BITS_1 ., Current low 5 bits = *$<)&i  (O)( /0@MSGFD23PREVIOUS LOW 5 BITS EL 0. Previous low 5 bits = r$@`)&  (O) 00DMSGFD24STATE MACHINE ADDRESS= 20 State machine address = o5$D )&4  (O)s 20HMSGFD25LAST DISTANCE TRAVELED R *( Last distance traveled = r$H )#R 40TMSGFD26 DESIRED TRACKees "  Desired Track = a2$T )#0 60XMSGFD27STARTING TRACK R "  Starting Track = $XD)# 80dMSGFD28TRACK ERROR VALUE R *( A/D + SCN Track Error = $dF)# :0hMSGFD29SELECT REGISTER IMAGEr *Unused bit set d l*( Head selected = M$l)&  (O)F SS p., A/D Input selected = *$pe)&  (O)e ;0xMSGFD30SECTOR IN ERRORcis ,* Sector in error = D$xc)&  (O)C <0,MSGFD21PREVIOUS DRIVE STATUS De 20 Previous drive status = M$,A)&P  (O) >0<MSGFD22FRONT PANEL IMAGEt ., Front Panel Image = s $<T)&E  (O) @0@MSGFD23TRACK IN ERRORup "  Current track = e $@)# B0DMSGFD24 SPINDLE STATEk U 20 State machine address = $Di)&  (O)d D0 HMSGFD25LAST HEADER READM P$" Last header read = $P)# fi L&$ Last Block Number = s $LI)#N H0TMSGFD26DRIVE STATUS REGISTERs  Front panel serial inZE 4*ANL Servo timeout Servo has not timed outFD " *Speed error  Speed okayron 2*Spindle is stoppedd Spindle is spinningIZ .*Heads are hom00c O  b 8 N/A, Pos = dn$li)#d $ ns)#n d$x )#3 R $lF)# 7$x )#N/A C $|BRIEF 7e$H*$ N/A, LBN = d*$H )#  $H* *$ N/A, RBN = d$H)#  $\)#t *$D#)#s$H. )# $ $#$n'$) / $uz$Illegal formatController ErrorHost Memory Access ErrorDisk Transfer Error SDI ErrorTSmall Disk Errorr)n f$l$!1FCValue!25FCInterpretation!FLreL!2FL!1FC!DP!25FC!DP!2FLa.F$!25FC!DP!75FC!DP!CE! !25FC!DP!CE!)at00c O  b   No Settable Vector Address  Vector Address settable $ @  22 Bit Addressing supported No 22 Bit Address supportur d2. Diag Support for Wraparound, Purge, Poll Test0, No Support for Wraparound, Purge, Poll Testi)   ReservedrR\ 0MSGFD3  SA REGISTER L  *Fatal Error)   In Initialization step 2dH DB  Port Type = aE$ReservedUB/QB Storage System PortP )i l &$ Ignore Purge Complete ResponseP h  Enter Wraparound Modepe &$ Command Ring = $^s  Slots in (& Response Ring = e$~  Slotsr S 0MSGFD3e SA REGISTERi  *Fatal Error   In Initialization Step 3s R   Reservedalo 0.) Intrpt Request at compl of Init Step 1-3127 RPR$ Intrpt vector = t$/)&t 00 (O)r  No Intrpt From Port Allowede)N0MSGFD3) SA REGISTERF/D  *Fatal ErrorL)   In Initialization step 4wSE   Reserveda s &$ Cntrlr ucode vers = e$)#P `0MSGFD3d SA REGISTERd  *Fatal Error *Port Hardware failure0 vMSGFD1MESSAGE ENVELOPE FIELDSo z  Connection I.D. = E$b  Message Type = $r ~  Credits = p$~)# (& Message length = S$ve  words5 0 MSGFD_1RESERVED - MBZ0 MSGFD_2RESERVED - MBZ 0 MSGFD2PORT DICTATED VALUEE  Last fail indicator$MSGFD3-20 Controller I.D. (S/N) = w$))  (X) *0MSGFD4CONTROLLER MODEL FIELDUQ   Model = R$f +0MSGFD5CONTROLLER CLASS FIELD   Class = R$*Illegal subsystem numberw *Reserved  Mass Storage ControllersT Disk Class Devicesr Tape Class Devicesr Disk Class Devices Loader Class  SCSI Class Devices9) ,00c  TADATADATADATADATADATA0MSGFD6.,(CONTROLLER SOFTWARE VERSION NUMBER FIELD $" Firmware version = $)# -0MSGFD7A.,(CONTROLLER HARDWARE VERSION NUMBER FIELD $" Hardware version = 5$)# .0MSGFD8ERROR CODE FIELD *Port Error = $z @$RA  PT*Reserved HSC50 UDA500 RC25 VMS Software Server TU81 UDA50AA RD/RX TOPS 10/20 Software Server TK50 RUX50 KFBTA KDA50r TQK70 RV20 RRD50-QBUS KDB50s RQDX3 UQSSP/DSSI Tape UQSSP/DSSI Disk UQSSP/DSSI Disk and Taped UQSSP/DSSI Other TUK50 RRD50-UNIBUSP RQZX1` RF30va RF71lb TF85c TF70 *$x 8<MSCP DiskMSCP TapeDiagnostic Utility ProtocoltTimeout (driver internal)$x "Sequential MessageeDatagram MessageTCredit Notification MessageeMaintenance Message/C&o$up  :>Reserved Error CodeParty/TO on Envlop/Packet RdParty/TO on Envlop/Packet WrCntrlr ROM/RAM parity errorController RAM parity errorController ROM parity errorParty/TO on Ring ReadParty/TO on Ring WriteInterrupt master error Host Access Time Out Credit Limit EXCEEDED Device Fatal Hardware error Cntrlr Fatal Hardware error Instruction Loop Time OutInvalid Connection I.D.Interrupt Write ErrorMaint R/W Invalid Region I.D.Maint Wr to Nonloadble cntrlrCntrlr RAM Error (Non Parity)INIT Sequence ErrorHi-level Protocol IncompatblePurge/Poll hardware failurev$N)#r*8$z '* bk$<"GbIllegal value e$zi)#T ce$ ni'  re$""rrIllegal Value $y)# $j  aA$ fnc$r e e$npa o$n ^ c$e)#anr$  m e$n(  $vn ~ o$)# Hn h S$uN&:S$ S '& z$>( z"*No code match found in tabler vz&:$ '&  z$>(Sz"*No code match found in tabler@PS$ r'@ ef$T"f * Unassigned ho$S)#i oN/AnN/AnPN/AnuN/AnN/AnN/AnsN/AnmN/AnN/An r s$je a $'& i$> an $ $ dr a$ m$ waec$ t Port Hardware Failurei $t Time OutF nB'& $z0T*Last Fail Error i$)#  Unknown t fn$ C$!1FCValue!25FCInterpretation!FLlhL!2FL!1FC!DP!25FC!DP!2FLa.i$P!25FC!DP!75FC!DP!CE! !25FC!DP!CER )@Lb 8&&_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rs"Ss"xu"u"~"6U"s]"fH7$7$_7$j7$@v7$&M'Z'_y:';T<8 Drive Offline to Hosts, UDA50 error routine using driveX   Format Operation EnabledU S "  Diagnostic Cylinder Enabled 0 576 Sector Format 512 Sector Format r   Drive Online & Availablel *Unused bit set *Unused bit set * Spindle Ready*Spindle not Ready   EL bit sett J$ Drive connected through Port Be$ Drive connected through Port Ae . Port Switch ind*Port Switch not inrd ( Run Switch on*Run Switch offt40HMSGFD23 SDI SUPPLIED STATUS FIELDP (&! Suppress Attention on Subunit #4r (&! Suppress Attention on Subunit #3r (&! Suppress Attention on Subunit #2r (&! Suppress Attention on Subunit #1rP L"  Controller C flags = $  *Drive Error (drive fault)oc *Transmition Errorl) *Level 2 Protocal Errorl *Unused bit seta *Write Lock Error *Unused bits set e$U60PMSGFD24RA60 STATUS BYTE 870TMSGFD25RA60 STATUS BYTE 9ke $" Previous Cyl Address low byte80XMSGFD26RA60 STATUS BYTE 10sro 86 Previous Cyl Address = $Xy$TR)B )#d 90\MSGFD27RA60 STATUS BYTE 11ser &$ Previous Sel Head = $\)# :0`MSGFD28RA60 STATUS BYTE 12=ar $" Current Cyl Address low bytee;0hMSGFD30RA60 STATUS BYTE 13s.D 86 Current Cyl Address = w$XM$TW)Bv)#d <0lMSGFD31RA60 STATUS BYTE 14s E $" Current Sel Head = n$\E)#r =0pMSGFD32RA60 STATUS BYTE 15 ar *Error Code = $ >0S_B_8?0S_B_9@0S_B_10A0S_B_11B0S_B_12C0S_B_13D0S_B_14rE0S_B_15 HF/*The last eight bytes came from unit model # = =($0l)# ` $  p 't*Reservedt HSC50 UDA50$ RC25d VMS Software Server' TU81i UDA50A RD/RXn TOPS 10/20 Software Server TK50 RUX50 KFBTA KDA50 TQK70 RV20 RRD50-QBUS KDB50 RQDX3 UQSSP/DSSI Tapek UQSSP/DSSI DiskC UQSSP/DSSI Disk and Tape UQSSP/DSSI OtherF TUK50 RRD50-UNIBUS RQZX1` RF30ea RF71pb TF85c TF70ie$ wnt*Reserved RA80 RC25 RCF25 RA60 RA81 RD51 RX50 RD52 RD53 RX33 RA82 RD31 RD54 RRD50 RD32 RX18 RA70 RA90 RF30 RF71 RD33 RA92% RA72( RA71*$+DZ 8tyf<MSCP Disk MSCP TapeDiagnostic Utility Protocald$x roohvSeq00c O  b  0Slave Done TMO to Seek CmdSlave Done TMO to RTZ CmdSlave Response Err to RTZ CmdSlave Done TMO on 1st PassCmd Rcvd TMO on Diag StopSlave Done TMO on Diag StopDrive not OnlineCmd Bytes 4 & 5 are <> 0Invalid Group NumberInvalid Head Select NumberInvalid Cylinder RangeSpindle not ReadyController Timeout = 0Spindle not ReadyIllegal Memory RegionDD Bit SetTried to Clear a Hard FaultSlv Dn TMO (1ms) to Get StatusIllegal Error Recovery00c O  b  0Diag Cmd - Invalid ParmsWrt Enbl a Write Prot DriveSetting S7 = 1Slv Dn TMO from Get Status CmdErr Response to Get Status CmdInvalid Group NumberMicrocode Fault ErrorsNo Watchdog Intrpt (Proc Hltd)Slave Done TMO (ASCII Port)Slv Cmd Rcvd Err (ASCII Port)Invalid TT BitMult Hd Selct/No Wrt Transition Error7$( )#*8$  '* $<"Illegal value *$ *)##  drU$, $'d #$v"Illegal Value P$, )#* ),@$ ut', )$D"Illegal value #$)# ll cB5$l2H\$ u'H /$` /ll2$ $ '  r$ nl l2$$ Cl' Cr$ il l2@X!$ CP'@ $\ !l l2FB$ uu' e $ olloN/Ae / a/ rt$p"iIllegal Value g$o)#f  G t$xrvxa$L vf'x ln$" ILLEGAL VALUE e$Lo)#F o$LoDee$h or'woNo fault code sete aa$R`pd$ ei'` Sr$t"f * Unassigned l$T)#a  n$ ea' nd$"  * Unassigned O$t)# n A$g))l  $ iHs$ @ae$ eo' af$ UNIT sy$n)#p l R$N)#e  o$e)# t k$xNnbrze$T rt'zTR$ r$2bInvalid FunctionkInvalid Op_codenmN/Aa e i$dae$N/Aab$V$da)# N/AaiN/AapN/AaaN/AarN/Aa $@3$@ $<)# B$x  $  l$ $ 2 $X$3  $ ',$3) $ n@ h$xIllegal formatController ErrorHost Memory Access ErrorDisk Transfer Error SDI ErrorT@)% $($!1FCValue!25FCInterpretation!FLrL!2FL!1FC!DP!25FC!DP!2FLa.$!25FC!DP!75FC!DP!CE! !25FC!DP!CE)@Fb 8##_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rs"Ss"xu"u"~"6U"s]"fH7$7$_7$j7$@v7$&M'Z'_y:';TC(, MSCP70M01.01V2.00M CONN_ID  CONTROLLER_ERRORC CONT_TABD C_FLAGN  DATA_ERRORV DISPC DRIVE_ERROR EPACKET       ! #%')+-/13579;=?ACEG I!K"M#O$Q%S&U'W(Y)[*]+_,a-c.e/g0i1k2m3o4q5s6u7FAULT HOST_BUFFER BINTERMOD_DEVERR       MAJOR_STATUS(  MEDIA_FORMATV MSG_TYP OP_CODE RA70_LED REPORTIUDA_PATH UNIT_TAB_ FVAR        !@ DEVICE_ENTRYss @i9 FF"TWRVE" 0$7"n  $ ="FD8&["IO MBy" Hr ar"##  t"(SG"L  UN"*Uu d "Rni," )i 8"ov r,LeDEE00c  TADATADATADATADATADATAAteted u$r)#*)e F(0MSGFD19 GROUP FIELD k   Group = Le$a)#D *0 4MSGFD20 VOLUME SERIAL NUMBER FIELDs (& Volume serial number = ,$4C)#R .0 8MSGFD21HEADER VALUE FIELD @FD <jhN$@  LBN = VR$<N)&M  (O)L $@" RBN = Ve$<r)&n  (O) *Ivd HeaFFx$0 MSGFD1DMESSAGE ENVELOPE FIELD P    Connection I.D. = E$r n , Message Type = $ t t $  Credits = pt$$e)#n  ((& Message length = $$5  wordso 0 0MSGFD2F$"COMMAND REFERENCE NUMBER FIELD D H Command reference numberF(# Error does not relate to a commando0lMSGFD3 UNIT NUMBER FIELDe*U   Unit number = L*$ls)#b 0|MSGFD4aMESSAGE SEQUENCE NUMBERt B"*Error Packet is Only Partialo Error Packet is Completet 0MSGFD5 MESSAGE FORMAT FIELD *Illegal formatF*Controller ErrorE*Host Memory Access Errort*Disk Transfer Error *SDI Error*Small Disk Errorr 0MSGFD6 FLAGS FIELD te  Operation successfulr S  Operation continuingr *Reserved bits set S 20, Sequence number reset(end of logged packet)0MSGFD7 EVENT CODE FIELDl)   *Subcode = Fc$E  *Major Status = *$t MSGFD8e0.Controller I.D. (S/N) = $6))  (X)S 0MSGFD9CONTROLLER MODEL FIELD   Model = RA$e 0MSGFD10CONTROLLER CLASS FIELDs   Class = Ry$*Illegal subsystem numberd *Reservedp Mass Storage ControllersT Disk Class Devicesr Tape Class Devicesr Disk Class Devices Loader Class  SCSI Class Devices9 ) 0MSGFD11.,(CONTROLLER SOFTWARE VERSION NUMBER FIELDre *( UDA50 firmware version = $l)#S 0MSGFD12.,(CONTROLLER HARDWARE VERSION NUMBER FIELD0 *( UDA50 hardware version = 5$ )# 0MSGFD13MULTIUNIT CODE FIELD_B  Access Path = F$    Shared Spindle = $, FMSGFD14,* Unit I.D. (S/N) = D $e))  (X) "0MSGFD15UNIT MODEL FIELDRe   Model = L$0 #0MSGFD16UNIT CLASS FIELD   Class = S$*Illegal subsystem number *ReservedE Mass Storage ControllersT Disk Class Devicesr Tape Class Devicesr Disk Class Devices Loader Class  SCSI Class Devices9) T $0 MSGFD17(&"UNIT SOFTWARE VERSION NUMBER FIELD $" Firmware Version = $ )# %0MSGFD18(&"UNIT HARDWARE VERSION NUMBER FIELD $" Hardware Version = $)#K $&0MSGFD19 RETRY LEVEL & COUNT FIELDB *Unused bit setO (& Running Retry Count = LP$S)#t  NL Error Recovery Level = 0$ENo Recovery Attempted $)#) J(0MSGFD19RESERVED FIELDe   Reserved = $)# *0 4MSGFD20 VOLUME SERIAL NUMBER FIELDi (& Volume serial number = $4R)#r .0 8MSGFD21HEADER CODE FIELDm @ <jh$@ LBN = C$<8)&  (O) $@ RBN = C$<)&  (O)R *Invalid HeaderL))\ $L 20DMSGFD22SDI REQUEST BYTE FIELDRA < (RU) Run/Stop switch in*(RU) Run/Stop switch outD 4 (PS) Port switch in*(PS) Port switch out *Unused bit setc b0+ (EL) Loggable info in extended status areas0,*(EL) No loggable info in extended stat area H (SR) Spindle readyn.)*(SR) Spindle not ready (not up to speed)r \0, (DR) There is a request for diagnostic load*&*(DR) No diagnostic is being requestedP ^,( (RR) Drive requests recalibrate command0+*(RR) Drive requires no recalibrate commanddia B (OA) Drive unavailable $*(OA) Drive online or availabler30HMSGFD23SDI MODE BYTE FIELDo J$  (S7 bit) 576-byte sector format$ *(S7 bit) 512-byte sector formatrt N&! (DB bit) DBN area access 00c O  b 0S_B_8?0S_B_9@0S_B_10A0S_B_11oB0S_B_12C0S_B_13oD0S_B_14E0S_B_15e D HF/*The last eight bytes came from unit model # = =$0l)# o` $en  poc t*Reserved HSC50  UDA50  RC25 VMS Software Server  TU81n UDA50A RD/RXu TOPS 10/20 Software Server TK50 RUX50a KFBTA KDA50  TQK70 RV20 RRD50-QBUS  KDB50 RQDX3k UQSSP/DSSI Tape  UQSSP/DSSI Disk UQSSP/DSSI Disk and Tapeo UQSSP/DSSI Other TUK50o RRD50-UNIBUSe RQZX1` RF30ia RF71b TF85c TF70woT$on *Reserved RA80 RC25 RCF25 RA60 RA81 RD51 RX50 RD52 RD53 RX33 RA82 RD31 RD54 RRD50 RD32 RX18 RA70 RA90 RF3000c TADATADATADATADATADATA RF71 RD33 RA92% RA72( RA71r*S$plZ 8ea <MSCP DiskSMSCP TapeDiagnostic Utility ProtocalsHhw$tox vs rzSequential MessagedDatagram MessageCredit Notification MessageTMaintenance Messagee 0 $t 8 DPaeHSuccessInvalid CommandeCommand AbortedUnit-OfflineUnit-AvailableMedia Format ErrorWrite ProtectedCompare Error1Data Error Host Buffer ErrorO Controller Error Drive ErroriDiagnostic ErrorL$  `dFCT Read - EDC errorFCT Read - Invalid Sect HaderFCT Read - Data Sync TimeoutDisk Format Not 512 Byte SectDisk Not Formated/FCT CorruptFCT read - Uncorrectable ECC$J TetValid Header Not Found Data Sync Not Found/TimeoutUncorrectable ECC ErrorOne Symbol ECC Error Two Symbol ECC Error Three Symbol ECC Error Four Symbol ECC Error Five Symbol ECC Error Six Symbol ECC ErrorSeven Symbol ECC ErrorEight Symbol ECC Errors$p Odd Transfer AddressuOdd Byte CountNonexistent Memory ErrorHost Memory Parity Errorth@T$r Z Xnsn\SERDES Overrun ErrorEDC ErrorInconsistent Data Structure R$al  SDI Commd timeout/Seek IncmplCntrlr Detected Protocol ErrPositioner Error(Mis_seek)Lost R/W RDY on/betwn x'sferDrive Clock DropoutLost Rcver RDY betwn SectorsDrive Detected ErrorCntrlr Detected State Prty Erx$$l #DNormal Drive OperationDrive off line - Under diag Drive off line - Duplicate Unit Idn~u$of Change modeoChange controller flagsDiagnosetDisconnect (Drive)Drive clearmError recoverylGet common characteristicsGet subunit characteristicse Initiate seekOn linei RunRead memoryoRecalibratevTopologyWrite memory Select group$p li SDI Port 0bSDI Port 1SDI Port 2SDI Port 3d\SDI Port 0SDI Port 1SDI Port 2nSDI Port 3$  Spin-up timeoutSpin-up servo diagnosticPower supplyMicrocode faultFrame sequence errorLevel 2 message checksum error SDI message framing error Invalid opcodes Command length errorcomm contains inval head addrSpindle faultSpindle over currentGuard band errorInvalid or inconsi parametersOpco/Para inva/incon w dri staActuator over speed errorSector overrun error%Off-track error&Spindle speed error'HDA overtemp1Read gate and write gate error2R/W while faulted3Attempt to wri through bursts4Encode error5Write unsafe9Write and off track:Write and write protected<Servo faultsAResponse timeoutCTCR and R/W ready out LDFMT comand format not enabledKIndex errorLExternal hardware faultMWrite and bad embeddedOSDI transmit error-pulse errorPDSP diagnostic timeout`R/W test failurebRead failuregWrite failureExternal RAM failureInternal RAM failureUV00cO  b 0$"0 * Unassigned r $ )#n l  a$))$0 H$ @l $ re' $,Unit sg$ )#  $)#, $)# $n bf~S$\ C'~($E$(2pInvalid Function(Invalid Op_codeniN/Aa b $l(N/Aa(M$le)#lN/AaN/AaN/Aa N/AaoN/Aa r $@$@ a$<D)# O A$r. ' $$ v' c$r$  r$$N $< n l$i*"$(```````` c N$$ 2 s i$E$r $$$('0$#) $$n$h $Illegal formatController ErrorHost Memory Access ErrorDisk Transfer Error SDI ErrorTl) $ $,)$!1FCValue!25FCInterpretation!FLrL!2FL!1FC!DP!25FC!DP!2FLa.$!25FC!DP!75FC!DP!CE! !25FC!DP!CE)00c TADATADATADATADATADATA@Lb 8&&_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rs"Ss"xu"u"~"6U"s]"fH7$7$_7$j7$@v7$&M'Z'_y:';TI("$ MSCP8001.087V2.00M8CONN_ID  CONTROLLER_ERRORC CONT_TABD C_FLAGN  DATA_ERRORV DISPC DRIVE_ERROR EPACKET       ! #%')+-/13579;=?ACEG I!K"M#O$Q%S&U'W(Y)[*]+_,a-c.e/g0i1k2m3o4q5 HOST_BUFFER BINTERMOD_DEVERR      LED MAJOR_STATUSL  MEDIA_FORMATT MSG_TYP OP_CODE  RA80_FAULTG  RA81_FAULTU  RA82_FAULT REPORT_UDA_PATH UNIT_TABE FVAR        !2F DEVICE_ENTRY T F sDe<<"de 0as"as \vi7"MGP17="VES4N [ <\ar H]"0@{"ARW8E "LD("io T$",&"ELY " D$" $0"nt =XP$S)#t  NL Error Recovery Level = 0$ENo Recovery Attempted $)#) J(0MSGFD19RESERVED FIELDe   Reserved = $)# *0 4MSGFD20 VOLUME SERIAL NUMBER FIELDi (& Volume serial number = $4R)#r .0 8MSGFD21HEADER CODE FIELDm @jhNN$0 MSGFD1=MESSAGE ENVELOPE FIELD)    Connection I.D. = ES$,2 ES , Message Type = )$Ln  $  Credits = po$$)# rt ((& Message length = h$Pt  words 0 0MSGFD2$"COMMAND REFERENCE NUMBER FIELDus H Command reference numberF(# Error does not relate to a commando0lMSGFD3oUNIT NUMBER FIELDe)r   Unit number = L $le)#s 0tMSGFD4 MESSAGE SEQUENCE NUMBERted B"*Error Packet is Only Partialo Error Packet is Completet 0xMSGFD5dMESSAGE FORMAT FIELDav *Illegal formatF*Controller ErrorE*Host Memory Access Errort*Disk Transfer Error *SDI Error*Small Disk Errors 0|MSGFD6t FLAGS FIELD it  Operation successfulrDB  Operation continuingr *Reserved bits setra 42- Sequence number reset (end of logged packet) 0MSGFD7 EVENT CODE FIELDDD   *Subcode = Fo$4  *Major Status = h$Dr )(MSGFD8 0.Controller I.D. (S/N) = D$)).  (X)) 0MSGFD9tCONTROLLER MODEL FIELDni   Model = RW$0W 0MSGFD10CONTROLLER CLASS FIELD2   Class = RW$*Illegal subsystem numbern *Reserved  Mass Storage ControllersT Disk Class Devicesr Tape Class Devicesr Disk Class Devices Loader Class  SCSI Class Devices9 ) t 0MSGFD11.,(CONTROLLER SOFTWARE VERSION NUMBER FIELDe *( UDA50 firmware version = a$r)#u 0MSGFD12.,(CONTROLLER HARDWARE VERSION NUMBER FIELD p *( UDA50 hardware version = S$R)#i 0MSGFD13MULTIUNIT CODE FIELD  Access Path = Fr$$u o   Shared Spindle = $X COTMSGFD14,* Unit I.D. (S/N) = Dr$f))s  (X) "0MSGFD15UNIT MODEL FIELD(   Model = Lo$\n #0MSGFD16UNIT CLASS FIELDit   Class = Sr$*Illegal subsystem number *ReservedE Mass Storage ControllersT Disk Class Devicesr Tape Class Devicesr Disk Class Devices Loader Class  SCSI Class Devices9B) $0 MSGFD17(&00cO  b <8 Drive Offline to Hosts, UDA50 error routine using driveer   Format Operation EnabledU "  Diagnostic Cylinder Enabled 0 576 Sector Format 512 Sector Format re   Drive Online & Availablel *Unused bit set *Unused bit set * Spindle Ready*Spindle not ReadyTQ   EL bit sett J$ Drive connected through Port Be$ Drive connected through Port Ae . Port Switch ind*Port Switch not inrk ( Run Switch on*Run Switch offt40HMSGFD23 SDI SUPPLIED STATUS FIELDPSI (&! Suppress Attention on Subunit #4r (&! Suppress Attention on Subunit #3r1 (&! Suppress Attention on Subunit #2r (&! Suppress Attention on Subunit #1r L"  Controller C flags = $(  *Drive Error (drive fault) *Transmition ErrorRA *Level 2 Protocol Errorl *Unused bit seto *Write Lock Error *Unused bits set 5$UU60PMSGFD24RA80/81 STATUS BYTE 8o53 ,* Seek & Recal retry count = $P)# 70TMSGFD25RA80/81 STATUS BYTE 9o   Retried Op-code = $T 80XMSGFD26RA80/81 STATUS BYTE 10 *Data Pulse ErrorT90 *Unused bit seto *Controller Pulse Errorn $"*Real Time Cntrlr Sta Lin P.E.  *Read/Write Overrun Error *Unused bits set90\ MSGFD27_1RA80/81 STATUS BYTE 11 0.) Cyl Addr low byte, printed in next fieldl:0` MSGFD27_2RA80/81 STATUS BYTE 12ss 42 Cylinder address = e$`$\r)Bt)#t ;0dMSGFD28RA80/81 STATUS BYTE 13 "  Current Group = Tc$d)# <0hMSGFD29RA80/81 STATUS BYTE 14U *LED Error Code = A$@l =0pMSGFD30RA80/81 STATUS BYTE 15 (&*Control Panel Fault Code = $8  C>0PMSGFD24RA82 STATUS BYTE 8 D ,* Seek & Recal retry count = r$P)# ?0TMSGFD25RA82 STATUS BYTE 9ad   Retried Op-code = a$T @0XMSGFD26RA82 STATUS BYTE 10 eo > Receiver Ready asserted *Receiver Ready not assertedt 6 R/W Ready asserted *R/W Ready not assertede *ATTENTION assertedrnd *AVAILABLE assertedrme &$  RTCS + WTR/CMD enabled (Port A)mb &$  RTCS + WTR/CMD enabled (Port B) $" RTDS output enabled (Port A) ur $" RTDS output enabled (Port B) A0\ MSGFD27_1RA82 STATUS BYTE 11dSe 0.) Cyl Addr low byte, printed in next fieldlB0` MSGFD27_2RA82 STATUS BYTE 12 Tr 42 Cylinder address = $`$\)BN)#x C0dMSGFD28RA82 STATUS BYTE 13 or "  Current Group = 1$dn)#\ D0hMSGFD29RA82 STATUS BYTE 14 *LED Error Code = $@a E0pMSGFD30RA82 STATUS BYTE 15 (&*Control Panel Fault Code = l$8e F0S_B_8G0S_B_9H0S_B_10I0S_B_11J0S_B_12oK0S_B_13L0S_B_14 M000c  TADATADATADATADATADATAS_B_15  HF/*The last eight bytes came from unit model # = = $0lr)#a `$ri  pt*Reserved HSC50 UDA50t RC25D VMS Software Serverr TU81c UDA50Ab RD/RX  TOPS 10/20 Software Server TK50 RUX50 KFBTA KDA50 TQK70 RV20 RRD50-QBUS KDB50r RQDX3 UQSSP/DSSI TapeS UQSSP/DSSI Disk UQSSP/DSSI Disk and Tape UQSSP/DSSI Other TUK50 RRD50-UNIBUS RQZX1` RF30a RF71b TF85c TF70on$le inl*Reserved RA80 RC25 RCF25 RA60 RA81 RD51 RX50 RD52 RD53 RX33 RA82 RD31 RD54 RRD50 RD32 RX18 RA70 RA90 RF30 RF71 RD33 RA92% RA72( RA71o*n$leZ 8t<MSCP DiskMSCP TapeeDiagnostic Utility Protocolt^$`x lgrpSequential MessagexDatagram MessageCredit Notification MessageMaintenance Message&/$pr  :SPm>SuccessInvalid commandeCommand AbortediUnit-OfflinelUnit-AvailableMedia Format ErrorcCompare Error Data Errorc Host Buffer Error Controller Error Drive ErrorlDiagnostic ErroronBr$r  VfalZFCT Read - EDC errorFCT Read - Invalid Sect HaderFCT Read - Data Sync TimeoutDisk Format Not 512 Byte SectDisk Not Formated/FCT CorruptFCT read - Uncorrectable ECC t$riJ drvValid Header Not Found Data Sync Not Found/TimeoutUncorrectable ECC ErrorOne Symbol ECC Error Two Symbol ECC Error Three Symbol ECC Error Four Symbol ECC Error Five Symbol ECC Error Six Symbol ECC ErrorSeven Symbol ECC ErrorEight Symbol ECC Errorr$p  itOdd Transfer AddressaOdd Byte Count0Nonexistent Memory Error7Host Memory Parity Error@6$taZ Xdes\SERDES Overrun ErrorEDC ErrorInconsistent Data Structureqi$er  rrySDI Commd timeout/Seek IncmplCntrlr Detected Protocol ErrPositioner Error(Mis_seek)Lost R/W RDY on/betwn x'sferDrive Clock DropoutLost Rcver RDY betwn SectorsDrive Detected ErrorCntrlr Detected State Prty Erx$N Normal OperationDuplicate Unit Number Duplicate Unit Identifier te$mo  mdAbortmAccesstAvailableiCompare Controller Datam Compare Host Datap Determine Access PathEraseFlusheGet Command StatusGet Unit Status Online !ReadReplace Set Contrlr. Characteristicl Set Unit Characterist00c(O  b Control Panel Interlock Broken ?Prsnalty Card Interlock Broken @Invalid Read/Write Region AResponse Timed Out BSeek Isued When Drv Not Onlin-CRealtime Comm at R/W RDY off-DFormat Comm at Fmt Enabl offfEInvalid Hd Adrs in R.T. Comm FR/W Safty Intrupt & No CAUSE GTT Bit Wrong In Disconct Comm HInval Wr Mem Offset/Byte Cnt IInvalid Comm at Topology Mode JDrive Disabled By DD Bit KIndex Error MWrite and Bad ImbeddeduSlave Uncommanded SpindownuSlave Load TimeoutSlave Sent Unexpected MessageSlave Rcvd Bad Command PacketuSlave Opcode Parity ErroriSlave Received Invalid OpcodeaMstr Rcvd Bad Status from SlviSlave Recal TimeoutRSlave Seek TimeoutiSlave Offset TimeoutPSlave Spinup TimeouteSlave Spindown TimeoutSlave Send Status TimeoutgSlave Initialization TimeoutqSlave Speed Check Timeoutueg$al @ Spinup ErrorRd/Wr Diag Failure at SpinupRd/Wr UnsafeoSpindle Mtr Belt Interlk OpenSpindle Motor Speed ErrorDrive Disabled By DD BitHDA/Srvo Board Over TemptureMicro Code FaultSpinup Servo Diag FailedInitial Recal At Spinup Faili$op  dueIndex ErroroMaster/Slave ErrorrServo Diagnostics FailediMicroprocessor FaultiDrive Disabled by DD BitdServo Coarse Positioning ErrorIdle Diagnostics FailedSpindle Motor FaultrWrite and Bad Embedded Servo Fine Positioning Error'R/W Diagnostics Failed SDI ErrorWrite and Write ProtectlSpindle Motor Interlock faultl0Servo or HDA Overtemp2Servo/Micro Interlock Fault4R/W Command Error6CTL PAN/Micro Interlock Fault8R/W Unsafe00c0 TADATADATADATADATADATA:R/W-Micro Interlock FaultPERS/Micro Interlock Fault$  Servo or HDA overtempHybrid fault)R/W Command ErrorSpindle Error R/W Unsafe Error SDI Error Servo-HDA-R/W Interlock ErrorDMaster/Slave ErrorHybrid Servo Interlock ErroroServo Coarse-positioning ErrorHybrid-OCP Interlock ErrorServo Fine-positioning Error Hybrid-R/W Interlock ErrorSpindle Motor Interlock fault Index Error$Drive disabled by DD-bit(Write and Bad Embedded servo,Write and Write protect0Servo Diagnostics failedf4Idle Diagnostics failed$8R/W Diagnostics failedu=Power Up diagnostics failediP$( )#*8($  /'* ,$<",Illegal value N$ )# ^l$, a'^ /L$p"LIllegal Value $,a)#D &:$  '& D$$>"DIllegal value $)# $<lHl4 B$l2BV`$ 'B 4$Z <ll2$ $ ' 40$ <l l2$ el' t4n$ r<l l2 @Xr$ i '@ e4r$\ D<l l2$ F' !4I$ e<ll4N/AeCH/ !</ !$<C"74Illegal Value !$)#   $x x$L 'x l($"(ILLEGAL VALUE $L)# $$L $L$ L *r$h i' @ $" @No LED error code seti $ $B$p B' u8$8No fault code set $AB$p  ' 8$8No fault code set BG$p v' $8 $8No fault code set  `pL$  '` 0D$t"0 * Unassigned $)# oo$ e' $\$"\ * Unassigned $)#t  $*))se$\ $H#$ @$a$ n' $$nXUnit s$#)# $ g$)#X $)#  $xnbt$T ' 'tT$U$T2$Invalid FunctionTInvalid Op_codenNN/Aa  e$l N/Aa r$l)#N/AacN/AaN/AacN/AaN/Aa $$@$$@A d$<)# $$A4 N' N$@  'A' $8 $F $ $x 4 $ $ "XXX $2 $<$H ,$4'& $D) @ h$nehf$xIllegal formatController ErrorHost Memory Access ErrorDisk Transfer Error SDI ErrorT() $a$!1FCValue!25FCInterpretation!FLr2L!2FL!1FC!DP!25FC!DP!2FLa.!$!25FC!DP!75FC!DP!CE! !25FC!DP!CED)ou@Rb 8))_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rs"Ss"xu"u"~"6U"s]"fH7$7$_7$j7$@v7$&M'Z'_y:';TlN(* MSCP9XM01.02V2.00MCONN_ID  CONTROLLER_ERRORC CONT_TABD C_FLAGN  DATA_ERRORV DISPC DRIVE_ERROR EPACKET       ! #%')+-/13579;=?ACEG I!K"M#O$Q%S&U'W(Y)[*]+_,a-c.e/g0i1k2m3o4q5s6u7w8y9{: HOST_BUFFER BINTERMOD_DEVERR 00c8O  b  Port B receivers enabledD Port A receivers enabledD X*& Loggable info in extended status area,' No loggable info in extended stat areaA5 < Spindle ready($*Spindle not00c@ TADATADATADATADATADATA ready (not up to speed)So T,' There is a request for diagnostic load&! No diagnostic is being requestedc T(# Drive requires recalibrate commandl*& Drive requires no recalibrate command 6 Drive unavailable Drive online or available30HMSGFD23SDI MODE BYTE FIELDa J$*576-byte sector format(18 bit)c$ 512-byte sector format(16 bit)c <*DBN area access enabled DBN area access disabled6 H" Formatting operations enabled$ Formatting operations disabledcis T*% Drive disabled by cont error routined($ Drive enabled by cont error routineUN Z,'*Write protect switch for sub unit 0 ON,' Write protect switch of sub unit 0 OFF *Not implemented bit set (&"*(ED1) internal error log disabled (&"*(ED0) internal error log disabled40LMSGFD24SDI ERROR BYTE FIELD *Unused bits set 0*Write lock errorE No write lock error *Unused bit sete <*Level 2 protocol erroro No level 2 protocol error F*&*SDI receive error on SDI transmission No SDI receive error 31 >.)*Drive error(drive fault light may be on)M  No errorr50PMSGFD25SDI CONTROLLER BYTEf T"  Controller C flags = $R 30 *Unused bits set $$|60XMSGFD26$$ STATUS BYTE 8 ,* Seek & Recal retry count = $$X)# 70\MSGFD27$$ STATUS BYTE 9P Ta  Last Op-code = g$t 80`MSGFD28$$ STATUS BYTE 10 e d,* Vender heads used in HDA = $dd)#N ti *Unused bits set M ,*&*Drive failed during drive calibration90h MSGFD29_1o$$ STATUS BYTE 11u bo 0.) Cyl Addr low byte, printed in next fieldl:0l MSGFD29_2r$$ STATUS BYTE 12ya Er 42 Cylinder address = r$l$ho)Br)#r ;0tMSGFD30i$$ STATUS BYTE 13s  |"  Current Group = D$|r)# ad x0.  Current Error Recovery Level = $xe)# <0MSGFD31D$$ STATUS BYTE 14RC rr *LED Error Code = l$C =0MSGFD32$$ STATUS BYTE 15 ou 42# Front Panel Fault Code(decimal) = e$b)#E >0S_B_8?0S_B_9@0S_B_10bA0S_B_11oB0S_B_12oC0S_B_13lD0S_B_14bE0S_B_15bol HF/*The last eight bytes came from unit model # = =T$0lr)# a`d$By  pemrt*Reserved HSC50r UDA50 RC25t VMS Software Server TU81e UDA50Ae RD/RXr TOPS 10/20 Software Servero TK50r RUX50Y KFBTAd KDA50e TQK70 RV20r RRD50-QBUSu KDB50i RQDX3 UQSSP/DSSI Tape UQSSP/DSSI Disk UQSSP/DSSI Disk and Tapei UQSSP/DSSI OtherC TUK50t RRD50-UNIBUSe RQZX1` RF30aa RF71tb TF85c TF70$ rit*Reserved RA80 RC25 RCF25 RA60 RA81 RD51 RX50 RD52 RD53 RX33 RA82 RD31 RD54 RRD50 RD32 RX18 RA70 RA90 RF30 RF71 RD33 RA92% RA7200cHcO b OCP interlock broken@SDI Inval read mem region errBDri not online/SEEK com issuedCTCR and not Rd/Wri ready faultDFormat com & format not enabldERd gate & off trck bo assertedFInvalid hardware faultGInval disconn com/TT bit errorHInval wri mem byte ctr/off errIInval com during TOPOLOGY commJDrive disabled by controllrKIndex errorLSDI Inval wri mem region errorMWri gate & bad embdd serv infoOInval SEL GRP-Not Rd/Wri readyPServo data bus errorQSector/byte counter errorRServo RAM test failureSServo processor offset errorTHd sel regi loopback errorUSanity timeout after loadVServo RAM test failureWMaster processor timer errorXDedicated HD gain calibtd errYEmbed servo offset cali errorZEmbedded head gain calibration[Bias calibration error\ECM detd incor dia idx/sec pul`Read/Write head select failureaDiag Index Sync timeout errorbRead test overall read failurecRead test partial failuredCannot clear IID error bitseDiag idx or sector not detectdfRead test servo failuregCannot execute write testhDia cannot exe w/o SWR jumperiUnable to force compare errorjUnable to force No-sync errorkR/W Rd/Wri test overall failulR/W Wri/Rd test partial failumUnble to for R/W gates togetrnUnable to for W/W prot. erroroDia Wri attpd while wri protdpServo prossor spinup timeoutqRecalibrate timeout errorrServo processor seek timeoutsServo prossor HD swi timeouttOffset timeout erroruSer prossor unload timeout errvServo processor sanity timeoutwHead load timeout errorxSer pror bias for cali timeoutyDedicated ser cali timeout errzEmbed Offset/Gain cali timeout{Inva test while spindle runng|Gray co mat err aftr dedi setg}Embedded interrupt timeout~Fine track lost after settlingSettling timer expiredM pror ROM consisty co mismatSer prossor settle sta timeoutSer pror coar velo sta timeoutSer pror fine velo sta timeoutSer prossor seek direction errMastr prossor RAM test failureStatic RAM failureM prossor ROM checksum failureM prossor EEPROM wri viola errSeek speed out of rangeS pro insi Dst trk dug set staS pro ousi Dst trk dug set staUncalibrated and PLO errorS.Velo pty=0 during mlttrkseekM pro ROM/EEPROMcons co mismatEEPROM checksum failureUnable to force index errorNo int detd durg R/W for faultInnr gud band w/o sero fau setInner guard Band/Servo faultSDI loop back test failureSDI test failure: Port ASDI test failure: Port BCannot execute diagno/jumperPosnr corrd evt while dat XferWri & positioner corrted eventRd gate & posner corrted eventError log header corruptedDrive faulted, test cannot runError log check point codeUble to clr arr safty sta regUnable to force Encoder errorUble to force multiple HD seleUnable to force write gateUnable to force write currentUnble to force read gateUnable to force wri gateUnble to force RD & WR faultServo fault/force fault testForced read and write faultUART overrun or framing errOCP data packet checksum errorOCP start byt is not Sync charOCP Invalid responseOCP retransmit failureOCP command unsuccessfulOCP command timeoutMr pror UART loopback test faiMr pror UART Xmitter/Rvr errorOCP to Mtr proc commu timeoutOCP NMI timeout failureOCP pror ROM checksum failureCartridge checksum errorMicroco updat cartdge de00cXO b /(0 MSCP5X01.097V2.00M~CONN_ID CONT_TABT  DATA_ERRORV DISPT DRIVE_ERROR EPACKET       ! #%')+-/13579;=?ACEG I!K"M#O$Q%S&U'W(Y)[*]+_,a-c.e/g0i1k2m3o4q5s6u7w8y9{:};<BINTERMOD_DEVERR       MAJOR_STATUS  MEDIA_FORMATC MSG_TYP REPORTFSCSI_TAB UNIT_TABI 6VAR     , DEVICE_ENTRYRE ,Sp MB~"io ~a$"MG187"VESN ?""ar]N^ _ ` a"z&}"nt=b$"Eor Recovery Level = \$E2No Recovery Attempted $S)#). J(0MSGFD19RESERVED FIELDel   Reserved = $)#8 *0 4MSGFD20 VOLUME SERIAL NUMBERF$~ &)`Ve$~ )`e R$4\\F$~0 MSGFD1MESSAGE ENVELOPE FIELD   Connection I.D. = E&$z id  Message Type = $ FD   Credits = p $L)# to (& Message Length = c$u  words 0 MSGFD2w$"COMMAND REFERENCE NUMBER FIELDs H Command reference numberF(# Error does not relate to a commando0fMSGFD3iUNIT NUMBER FIELDea   Unit number = L($f*)#n 0zMSGFD4)MESSAGE SEQUENCE NUMBERtt B"*Error Packet is Only Partialo Error Packet is Completet 0~MSGFD5oMESSAGE FORMAT FIELDno *Illegal formatF*Controller ErrorE*Host Memory Access Errort*Disk Transfer Error *SDI Error*Small Disk Errorr 0MSGFD6c FLAGS FIELD or  Operation successfulr a  Operation continuingrac *Reserved bits settt *(# Sequence no. reset (end of packet)o0MSGFD7eEVENT CODE FIELD D   *Subcode = Fo$o ' *Major Status = b$i  poMSGFD8c0.Controller I.D. (S/N) = $o))m  (X)e 0MSGFD9tCONTROLLER MODEL FIELD i   Model = Rb$~4 0MSGFD10CONTROLLER CLASS FIELD   Class = Re$*Illegal subsystem numbero *Reservedt Mass Storage ControllersT Disk Class Devicesr Tape Class Devicesr Disk Class Devices Loader Class  SCSI Class Devices9S) r 0MSGFD11.,(CONTROLLER SOFTWARE VERSION NUMBER FIELDro 0. Controller firmware version = BY$)# 0MSGFD12.,(CONTROLLER HARDWARE VERSION NUMBER FIELD 0. Controller hardware version = B$)#T 0MSGFD13MULTIUNIT CODE FIELD\ 42# Access path (shared controller) = Fa$O)#o 0 $" Spindle (shared) = T$0)#e de MSGFD14,* Unit I.D. (S/N) = $))n  (X)t "0MSGFD15UNIT MODEL FIELD M   Model = LT$B #0MSGFD16UNIT CLASS FIELDex   Class = SS$*Illegal subsystem numberr *ReservedE Mass Storage ControllersT Disk Class Devicesr Tape Class Devicesr Disk Class Devices Loader Class  SCSI Class Devices9a)  $0MSGFD17(&"UNIT SOFTWARE VERSION NUMBER FIELD *( Unit Firmware Version = B*$ )#o %0MSGFD18(&"UNIT HARDWARE VERSION NUMBER FIELD# *( Unit Hardware Version = Be$b)#E $~_&0MSGFD19 RETRY LEVEL & COUNT FIELDBS *Unused bit setOE (& Running Retry Count = Lt$g)#b it NL Error Recovery Level = $ENo Recovery Attempted R$r)#) \(0MSGFD19&$ SMALL DISK CYLINDER NUMBER FIELD   Cylinder = R$)# *0 MSGFD20 VOLUME SERIAL NUMBER FIELD  Volume Serial NumberF $~ .0 MSGFD21HEADER VALUE FIELDTK   jhX$ LBN = V$ )&  (O) $ RBN = V$ K)&0  (O) *Invalid HeaderET)0)X $ IX20MSG00chO b 0&MSGFD22ESCSI SENSE DATA 43 &$ SCSI Sense Data 4 = F$&)&1 ?0*MSGFD22FSCSI SENSE DATA 54 &$ SCSI Sense Data 5 = F$*)&R @0.MSGFD22GSCSI SENSE DATA 65 &$ SCSI Sense Data 6 = F$.)&( A02MSGFD22H0SCSI SENSE DATA 76< &$ SCSI Sense Data 7 = FS$2T)& B06MSGFD22IlSCSI SENSE DATA 87 &$ SCSI Sense Data 8 = Fi$6M)&a C0:MSGFD22JSCSI SENSE DATA 98ti &$ SCSI Sense Data 9 = F$:)& D0>MSGFD22KcSCSI SENSE DATA 10S &$ SCSI Sense Data 10 = $>r)& E0BMSGFD22LiSCSI SENSE DATA 11ia &$ SCSI Sense Data 11 = e$B)& F0FMSGFD22MoSCSI SENSE DATA 12er &$ SCSI Sense Data 12 = $F )&v G0JMSGFD22NoSCSI SENSE DATA 13 &$ SCSI Sense Data 13 = D$Jr)&  F$S  l %0Sdr$ SRarH0MSGFD22 ADDRESS MARKt   Address Mark = o$t)#F I0NMSGFD23CYLINDER NUMBER $" Cylinder Number = o$N)#V J0RMSGFD24 HEADER NUMBERbNo "  Header Number = =b$RE)#E K0VMSGFD25 SECTOR NUMBERr "  Sector Number = = $Vr)#S L0ZMSGFD26 LENGTHbo   Length = F$Z )#b  C r %6LxS$ LC N0^MSGFD28 ADDRESS MARKSy   Address Mark = $$^)# O0bMSGFD29TRACKS PER CYLINDER te (& Tracks per Cylinder = m$b )#o P0jMSGFD30 HEADER NUMBERC "  Header Number = nu$jr)# Q0nMSGFD31 SECTOR NUMBERr D "  Sector Number = n$n)# R0rMSGFD32 LENGTHl   Length = o$ro)#r  PoiT0vMSGFD34 CCITT CRC tw $" CRC = RC$vk)&o (octal)R V0MSGFD21DESIRED CYLINDERed $" Desired cylinder = t$S)#e H y r$ D$8X0MSGFD22 STATUSma  Ta$n)# TZ0MSGFD22CURRENT CYLINDER $" Current Cylinder = i$d)#v e@i$  Png T*Reserved HSC50D UDA50 RC25 VMS Software Servere TU81r UDA50A RD/RX TOPS 10/20 Software Server TK50r RUX50T KFBTAi KDA50c TQK70 RV20I RRD50-QBUSr KDB50 RQDX3S UQSSP/DSSI Tape UQSSP/DSSI Diskn UQSSP/DSSI Disk and Tapeo UQSSP/DSSI Otherg TUK50o RRD50-UNIBUSe RQZX1l` RF30ua RF71eb TF85rc TF70 pXp$it hthel*Reserved RA80 RC25 RCF25 RA60 RA81 RD51 RX50 RD52 RD53 RX33 RA82 RD3100cp TADATADATADATADATADATA RD54 RRD50 RD32 RX18 RA70 RA90 RF30 RF71 RD33 RA92% RA72( RA71D@r$sf PnetT* Reserved RX23 RX26 RX33 RZ22 RZ23 RZ23L RZ24 RZ25 RZ24L RZ26 RZ35 RZ27 RZ28 RZ55 RZ56 RZ57 RZ58 RZ29 RZ72 RZ73- RZ74 RRD40 RRD42 RRD43 RRD44 RWZ52 RZxxa*i$t Z 8ine<MSCP DiskaMSCP TapeoDiagnostic Utility Protocal no$Rdx &f r*Sequential MessageeDatagram Message Credit Notification MessageeMaintenance Message ug$OP8 Success Invalid CommandaCommand AbortedoUnit OfflineWUnit AvailablesMedia Format ErrorrWrite ProtectedCompare ErroreData Erroro Host Buffer Errorl Controller Error Drive ErrorlDiagnostic Errortfu$ @ litForced error reading FCT/RCTFCT Read - EDC errorFCT Read - Invalid HeaderFCT Read - Data Sync TimeoutECC error in ECC fieldDisk Not 512 Byte SectorsDisk Not Formated/FCT CorruptFCT read - Uncorrectable ECCRCT Corrupt RCT FullcX$ad  jhinValid Header Not Found Data Sync Not Found/TimeoutECC error in ECC fieldUncorrectable ECC ErrorOne Symbol ECC Error Two Symbol ECC Error Three Symbol ECC Error Four Symbol ECC Error Five Symbol ECC Error Six Symbol ECC ErrorSeven Symbol ECC ErrorEight Symbol ECC Errortm$ut  ocsMain Controller TimeouteProtocol Error Positioner Error (Mis-Seek) Lost R/W RDY on/betwn x'sferGDrive Clock DropoutlLost Rcver RDY between SectorsrDrive Detected ErrorrCntrlr Detected State Prty Ers r$n)#t*8e$ r'* zp$<$Mz*Unknown value cS$p)#s  &t$ o' ro$*$o*Unknown Value c $e)#l su$ o' ei$$n*Unknown Value cM$s)#a uS$au s$2m$ sr' M $ e2oXj$ p'X i $n g 2i $ tt' aa$ d  ot$ &n Unknown Value of eE$O)#n  @PE$ cc'@ a~e$T"~ * Unassigned d$e)#r N$ e<u@Po$ tI'@ dd$Te e$I)#r HrXhe$ u'X   $l"e * Unassigned t$ )#l e r$))I$tN/Ano$fC)#tN/An a o$~oN/An  e$t)#rN/AniN/AntN/An da$ o $dn'E$l) e e$rdz$~Illegal formatController ErrorHost Memory Access ErrorDisk Transfer Error SDI ErrorTSmall Disk Errorc)r o$t$!1FCValue!25FCInterpretation!FLr L!2FL!1FC!DP!25FC!DP!2FLa.c$<!25FC!DP!75FC!DP!CE! !25FC!DP!CE)5300cxO b ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\BINTERMOD_DEVERR       MAJOR_STATUS_ MSG_TYP OFFLINE_FORMAT_ REPORTT SUCCESS_CODE_ UNIT_TAB1 RVAR        !#%'WRITE_PROTECTED v9 DEVICE_ENTRYeC d9^*R,,"haopng"yt ct7"10?" "]S)^ _ ` a"n  l}"FD2."E ESI""$x#"0Co t |"ER MhEL"  Mel = Rt$e .0MSGFD15CONTROLLER CLASS FIELD   Class = R$*Illegal Subsystem numberI *ReservedI Mass Storage Controllers= Disk Class Devicesr Tape Class Devicesr Disk Class Devices Loader Class  SCSI Class Devices9) IIII`/0$ )` $I)`t,$/c)` |s$0e)`=$BS)9$0 MSGFD1MESSAGE ENVELOPE FIELDED   Connection I.D. = E$l Co  Message Type = S$1 NT   Credits = py$ )#t = (& Message Length = $F  wordsR 0 MSGFD2m$"COMMAND REFERENCE NUMBER FIELD9 B0.  Command reference number one = o$Ba)&m N F0.  Command reference number two = $F)&F 0JMSGFD3GUNIT NUMBER FIELDeL   Unit number = Le$J )#o 0bMSGFD4$MESSAGE SEQUENCE NUMBEReSG B"*Error Packet is Only Partial  Error Packet is Completet 0fMSGFD51MESSAGE FORMAT FIELD P  MESSAGE FORMAT = o$f*Illegal format *Controller Errort*Host Memory Access Errorr*Disk Transfer Error *SDI Error*Small Disk Error *Tape Transfer Error*STI Communication Error*STI Drive Error Log*STI Formatter Error LogI) L 0jMSGFD6i FLAGS FIELDr  Operation successfuln   Operation continuingn *Reserved bits set *(# Sequence no. reset (end of packet)t0nMSGFD7 EVENT CODE FIELD  r *Subcode = F$ k v*Major Status = E$ (zMSGFD8 0.CONTROLLER I.D. (S/N) = $z))S  (X) 0~MSGFD9CONTROLLER MODEL FIELDIT   Model = R $pl 0MSGFD10CONTROLLER CLASS FIELDer   Class = Rs$*Illegal subsystem numbero *Reserved Mass Storage Controllers Disk Class Devices Tape Class Devicess Disk Class Devicesf Loader Class i SCSI Class Devicesi)  0MSGFD11.,(CONTROLLER SOFTWARE VERSION NUMBER FIELDid 0. Controller firmware version = Br$g)#5 0MSGFD12.,(CONTROLLER HARDWARE VERSION NUMBER FIELDM 0. Controller hardware version = Bc$n)#o 0MSGFD13MULTIUNIT CODE FIELDEN  Access path = Fe$h tr   Tape unit = =$r g 2MSGFD14*(UNIT I.D. (S/N) = 6$b))  (X) 00c TADATADATADATADATADATA"0MSGFD15UNIT MODEL FIELD   Model = LM$M #0MSGFD16UNIT CLASS FIELD T   Class = S$*Illegal subsystem numberi *ReservedE Mass Storage Controllers Disk Class Devices Tape Class Devicess Disk Class Devicesf Loader Class i SCSI Class Devicesis) e $0MSGFD17(&"UNIT SOFTWARE VERSION NUMBER FIELD *( Unit Firmware Version = B$)#F %0MSGFD18(&"UNIT HARDWARE VERSION NUMBER FIELD0 *( Unit Hardware Version = B $)#  nn$UF &0MSGFD19 LEVEL C   Level = d$)# '0MSGFD19B RETRYlte   Retry = d $)# (0 MSGFD20POSITION (OBJECT COUNT)=et ,* Position (Object Count) = Rt$)#" ,0MSGFD21.,'FORMATTER SOFTWARE VERSION NUMBER FIELD ., Formatter Firmware Version = S$D)# -0MSGFD22.,'FORMATTER HARDWARE VERSION NUMBER FIELD ., Formatter Hardware Version = o$n)#a  nf$F.0 MSGFD29A SCSI SENSE DATA 0rWR &$ SCSI Sense Data 0 = es$ e)&d /0MSGFD29BDSCSI SENSE DATA 10 &$ SCSI Sense Data 1 = e$)& 00MSGFD29CSCSI SENSE DATA 21T &$ SCSI Sense Data 2 = eP$ )&O 10MSGFD29D$SCSI SENSE DATA 32 &$ SCSI Sense Data 3 = eo$n)&a 20MSGFD29ESCSI SENSE DATA 43FD &$ SCSI Sense Data 4 = e)$)&X 30MSGFD29FDSCSI SENSE DATA 54el &$ SCSI Sense Data 5 = e$I)&L 40"MSGFD29GSCSI SENSE DATA 65be &$ SCSI Sense Data 6 = en$"l)&s 50&MSGFD29HsSCSI SENSE DATA 76De &$ SCSI Sense Data 7 = eC$&C)&s 60*MSGFD29ISCSI SENSE DATA 87 &$ SCSI Sense Data 8 = e$* )& 70.MSGFD29J SCSI SENSE DATA 98de &$ SCSI Sense Data 9 = eE$.)& 802MSGFD29KSCSI SENSE DATA 10M &$ SCSI Sense Data 10 = $2*)&s 906MSGFD29LdSCSI SENSE DATA 11 &$ SCSI Sense Data 11 = $6)& :0:MSGFD29MSCSI SENSE DATA 12 &$ SCSI Sense Data 12 = $:S)&1 ;0>MSGFD29N SCSI SENSE DATA 13de &$ SCSI Sense Data 13 = I$>R)&R <0MSGFD23 DRIVE STATUSFD *Drive Status = "$ =0MSGFD24DRIVE ERROR CODE  *Drive Error Code= $x >0MSGFD25 DRIVE FLAGSr  Reserved Bit 7d  Drive is in Run State  Positioned at BOT   Hardware Write ProtectedoUD  Reserved Bit 3  Tape Unloaded  Head at Track Zerotrv  Cartridge Present?0MSGFD26 TRACK NUMBERA   Track Number = K$0)# @0MSGFD27PHYSICAL BLOCK NUMBERc *( Physical Block Number = o$)# B0MSGFD28LOGICAL BLOCK NUMBER (& Logical Block Number = $)# C0MSGFD29 TAPE COUNT 0 D   Tape Count 0 = D$ )#e D0NMSGFD30 TAPE COUNT 1RR   Tape Count 1 = $NR)#1 E0RMSGFD31 TAPE COUNT 2   Tape Count 2 = $R)# F0VMSGFD32 DRIVE STATE (& Drive State = $V)$  (X) H0ZMSGFD33READ/WRITE STATE ,* Read/Write State = $ZT)$  (X) J0^MSGFD34OPERATION FLAGSt ,* Operation Flags = $^)$2  (X) (L0MSGFD19&$ RESERVED STI COMMUNICATION ERRORTZ Reserved$)#8 N0EWORD0P0EWORD1R0BEWORD2T0nEWORD3V0vEWORD4X0zEWORD5 e,Z0MSGFD19" RESERVED STI FORMATTER ERRORia Reserved$a)#r \0EWORD0^0EWORD1i`0BEWORD2Mb0nEWORD3ed0vEWORD4f0zEWORD5h0~EWORD6j0EWORD7Cl0EWORD8fn0EWORD9lp0EWORD10r0EWORD11e~t0MSGFD19RESERVED STI DRIVE ERROR E Reservedl$E)#r v0EWORD0rx0EWORD1az0BEWORD2x|000cO b EWORD190FEWORD200JEWORD210NEWORD220REWORD230VEWORD240ZEWORD250^EWORD260bEWORD270fEWORD280jEWORD290rEWORD30fv $sc  2*Reserved HSC50 UDA50 RC25 VMS Software Server  TU81a UDA50AS RD/RX TOPS 10/20 Software Server! TK50 RUX50e KFBTA KDA50R TQK70T RV20 RRD50-QBUSn KDB50 RQDX3 UQSSP/DSSI Tape UQSSP/DSSI Disk UQSSP/DSSI Disk and Tapei UQSSP/DSSI Other TUK50 RRD50-UNIBUSc RQZX1T` RF30ya RF71 b TF85bc TF70F$& VarwZ*Reserved TA78 TU81 TK50 TA81 TA79 TK70 RV20 TA85 TZ87 TLZ04 TLZ06 TZK10 TZ86 TA92! TKZ09" TKZ15# TLZ07% TKZ60& STK42' TZK11( TSZ07) TZ85- TZ30 TZ30 TZ50 TZ70 TZ85 TLZ04 TLZ06 TZxxnFr$etZ T RWXMSCP DisklMSCP TapeRDiagnostic Utility Protocolv e$edx Sequential Message'Datagram MessageSCredit Notification MessageIMaintenance MessagePr$ lSuccessInvalid CommandCommand AbortedUnit OfflineeUnit AvailableCWrite ProtectedCompare ErroraData Error Host Buffer ErrorG Controller ErrorG Drive Error Formatter Error BOT EncounteredTape Mark EncounteredRecord Data TruncatedRPosition LostSerious ExceptioncLEOT DetectedrDiagnostic Message$ ` Unknown UnitKnown but R/S out or no mediaInoperative Unitj*$  >BNormalStill ConnectedDuplicate Unit NumberAlready OnlineStill Online EOT Encountered$ ` FSoftware Write ProtectHardware Write ProtectSoftware and Hardware$  2$Long Gap EncounteredData Sync TimeoutWrite Lost Data ErrorRead Data ErrorUnrecoverable Read Errorn*)$  >"BHost Buffer Access ErrorNon-existent Memory ErrorHost Memory Parity ErrorInvaldi Page Table Entry\$ $ @ n drCommunications Channel TimeoutInternal inconsistencynO$  d$Drive Command Timeout00c TADATADATADATADATADATAController Detected Xmt ErrorRecoverable Drive FaultUnrecoverable Drive Fault$ b  Hardware Write ProtectDrive FaultCommunication ExceptionWrong TrackSync FailureCommunications Error"Positioning Error#Channel B Overrun'Channel A Overruno$u  rDoneuRetrycHard ErrorTape Mark ReadLogical EOT Detected End of Media Drive ErrorCommunications Exception End of DatadFailed to Find Append Target$Leaving EOT Trailer RegionuECC Correction on DataECC Correction on Tape Mark BOT EncounteredData Synchronization ErrorEOT detectedo Seek Aborted "UnloadFailure to load to BOT$Failure to unload TapeGeneral Motor or Tach FailureMotor A Failure$Motor B FailureLost Control or Bad Tach/Excessive Drag in Transport$Failure to Stop or Stay StopdCartridge Insert Error/Cartridge Extract ErrorCU Attempt to Move Tape Error$Deceleration Timeout ErroreSecond Balance Reels FailedL8155 RAM Self Test FailF8155 Timer Failure)Read Amplitude to low HD1yRead Amplitude to low HD2nEOT sensed in R/W/S stateaBOT sensed in R/W/S stateDrive block address overflownDrive block address underflowServo Error Excess Speed Vari Failure in Tracking Command Not RecognizeduIllegal Command Incomp State Write Lock ErrorrWrite Gate at wrong time/No Write gate for Cal TrackpError sensing Cal Track 1bError sensing Cal Track 2EDet edge of Cal Trk 1 out Det edge of Cal Trk 2 outOffset Cal Trk 1-2 too large'Search Bottom Edge FailedIBottom Edge Tolerance ErrorrDrive is overheatingNo Current in LED BOT sensorHall Switch Sense Motor ATachometer Failuree$)#FT$ ll'F l$X$l*Unknown value FD$)# Co$ a' e$$e*Unknown Value Fr$)# $v r' p$$*Unknown Value Ft$vs)# $nas l$v2*>e$r '* $B R2$r nl' rr$ 2i$r e' $ 2$r ' iQ$ U 2*>$r '* 0$B  2\nT$r '\ T$r  2$r 7' $  j Z$& Unknown Value of i$r)#  B $n" *UNUSED x *UNUSED $ B' $$B*Unknown Value fA$)# T$ ' xT$$x*Unknown Value f$)#F v$ 'v epe$"ap * Unassigned e$#)#* FV$ ' 'F "$Z" * Unassigned e`$`)#  `$)) $hPort s$I)#g  Subunit $)# N/Au' $J)#N/AunN/Au N/AueN/Au N/AurN/Au $ $n'$:) $ $fIllegal formatController ErrorHost Memory Access ErrorTape Transfer Error STI Communication ErroriSTI Drive Error LogiSTI Formatter Error LogiT)i  $$!1FCValue!25FCInterpretation!FLrL!2FL!1FC!DP!25FC!DP!2FLa.$&!25FC!DP!75FC!DP!CE! !25FC!DP!CEs)00cO b b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rk"p*s"Ss"xu"u"~"6U"s]"fH7$7$_7$j7$@v7$&M'Z'_y:';T?@ABCDEFGHIJKLMNOPQR FORMATTER_ERX  HOST_BUFFER BINTERMOD_DEVERR       INVALID_STX  MAJOR_STATUS MSG_TYP OFFLINE_FORMAT REPORTT SUCCESS_CODE UNIT_TAB1 6VAR     WRITE_PROTECTED 7 DEVICE_ENTRY 7(H ~"LDEV" v7"UNTrLA?" Ca^ =] nmZ^ b_ z` fa"ClsRDe}"s  n i"si)j $0>MSGFD17(&"UNIT SOFTWARE VERSION NUMBER FIELDMU *( Unit Firmware Version = B$>#)#N %0BMSGFD18(&"UNIT HARDWARE VERSION NUMBER FIELDV *( Unit Hadb $ )`$f#$)`GFD19$ 0 MSGFD1MESSAGE ENVELOPE FIELD d   Connection I.D. = E$RS OU  Message Type = b$nt W)   Credits = p,$F)#A ER (& Message Length = $rm  wordsm 0 MSGFD20$"COMMAND REFERENCE NUMBER FIELD V H Command reference numberF(# Error does not relate to a commando0MSGFD3UNIT NUMBER FIELDeIV   Unit number = Lv$B)#7 0MSGFD4SMESSAGE SEQUENCE NUMBERt B B"*Error Packet is Only Partialo Error Packet is Completet 0MSGFD5MESSAGE FORMAT FIELDZ  MESSAGE FORMAT = 1$*Illegal format *Controller Erroro*Host Memory Access Errore*Disk Transfer Error *SDI Error*Small Disk Error *Tape Transfer Error*STI Communication Error*STI Drive Error Log*STI Formatter Error Log&) 0MSGFD6 FLAGS FIELDr28  Operation successfulnap  Operation continuingnM *Reserved bits set *(# Sequence no. reset (end of packet)o0MSGFD7EVENT CODE FIELDM   *Subcode = F$^ ta *Major Status = $j ADWMSGFD8E0.Controller I.D. (S/N) = =$))$  (X)X 0MSGFD9RCONTROLLER MODEL FIELD   Model = R$V 0MSGFD10CONTROLLER CLASS FIELDFD   Class = RD$*Illegal subsystem numbero *Reserved Mass Storage Controllers Disk Class Devices Tape Class Devicess Disk Class Devicesf Loader Class i SCSI Class Devicesi) 0MSGFD11.,(CONTROLLER SOFTWARE VERSION NUMBER FIELD 0. Controller firmware version = B$)# 0MSGFD12.,(CONTROLLER HARDWARE VERSION NUMBER FIELDZ 0. Controller hardware version = B$)# 0MSGFD13MULTIUNIT CODE FIELD 42# Access path (shared controller) = F$)# B5 $" Spindle (shared) = 3$)#  QMSGFD14,* Unit I.D. (S/N) = D$ ))k  (X) "0MSGFD15UNIT MODEL FIELDth   Model = LK$v #0MSGFD16UNIT CLASS FIELD   Class = S$*Illegal subsystem numberr *ReservedE Mass Storage Controllers Disk Class Devices Tape Class Devicess Disk Class Devicesf Loader Cl00c TADATADATADATADATADATAass i SCSI Class Devicesir) $0MSGFD17(&"UNIT SOFTWARE VERSION NUMBER FIELD50 *( Unit Firmware Version = B$)# %0MSGFD18(&"UNIT HARDWARE VERSION NUMBER FIELD *( Unit Hardware Version = B5$)#  $bU.&0MSGFD19 LEVEL   Level = d$)# '0MSGFD19B RETRYlP   Retry = d$)#P (0 MSGFD20POSITION (OBJECT COUNT)=$ ,* Position (object Count) = Rl$s)#e ,0MSGFD21.,'FORMATTER SOFTWARE VERSION NUMBER FIELDen ., Formatter Firmware Version = $)# -0MSGFD22.,'FORMATTER HARDWARE VERSION NUMBER FIELD ., Formatter Hardware Version = e$)# .0BYTE_0a TU81 EXTENDED SENSE BYTE 0 *Command RejectE *Intervention Requiredve *Unused bit seteer *Equipment Checker  *Data CheckCnc *Unused bit setknc  *Unit Check *Unit Exceptionk/0BYTE_1D TU81 EXTENDED SENSE BYTE 1 *Illegal Chan CMDSkn *Device CMD CheckSKn *Unused bit setca *File protectedc  *Reset Key *Unused bit setc *Device Not ReadySl *Device offlined00BYTE_2 TU81 EXTENDED SENSE BYTE 2 *Channel Parity ErrorYEO *Channel Response CheckE$ *Read Hdwre Check *Write Hdwre Check *Device Response Check *Device Hdwre Checkem *Velocity Checkh *Device Interruptc10BYTE_3 TU81 EXTENDED SENSE BYTE 3ro  *AGC Faulta  *PE CRC Check re *Read Data Check  *ID Faulta *Unused bit setkAc  *UNRECV No  *BOTor  *Tape Moved 20BYTE_4d TU81 EXTENDED SENSE BYTE 4d *( Formatter Command Code = a$n)$h 30BYTE_5i TU81 EXTENDED SENSE BYTE 5  *GCR ModeNiv *High Speed Mode *Auto Speed Modero *File Mark Detected *Diagnostic Modeul *Start Stop Mode  *Variable Gap Mode (Long)5ct  *Variable Gap Mode (Short)40 BYTE_6 TU81 EXTENDED SENSE BYTE 6 ,* Write Error Symptom Code = C$ u)$a 50BYTE_7n TU81 EXTENDED SENSE BYTE 7B *Write Transfer CheckYOv  *Residual Byte Count Check *Write CRC Parity Errore *4 to 5 Parity Error *Unused bit setE " *Write Aux CRC Parity Error *Unused bit setPte *Unused bit setP60BYTE_8r TU81 EXTENDED SENSE BYTE 8on *Residual CheckEDa *Read CRC CheckEle *Read AUX CRC Check vi  *Resync Check  *ECC3 Checkca *Uncorrectable Data e *No Track Pointert *Excessive Pointers 70BYTE_9 TU81 EXTENDED SENSE BYTE 9  *Noise Check *Postamble Errorre  *Skew ErrorE *Read Time Out *Write Tape Mark Checklu  *ID Checkp *ARA Burst Checklu  *ARA ID Checke80BYTE_10" TU81 EXTENDED SENSE BYTE 10 re *EC Hardware Checktr  *Read Buff in Parity Error E *Read Transfer Checkt *Read Data Parity ErrorrTi *End Mark Checktla *Dual Track Correctionlf *Single Track Correctionur *Track in Error Pr90BYTE_11" TU81 EXTENDED SENSE BYTE 11 R *Track in Error 7Sin *Track in Error 6Sck *Track in Error 5Slo *Track in Error 3S E *Track in Error 9Slu *Track in Error 1Som *Track in Error 8SI *Track in Error 2S:0BYTE_12" TU81 EXTENDED SENSE BYTE 12 ,* Read Error Symptom Code = $s)$ ;0BYTE_13" TU81 EXTENDED SENSE BYTE 13 T  *Readyet  *OnlineT o  *RewindTl *File ProtectedEh  *Gap Control  *High Speedl E  *BOT i  *EOT<000cO b 0BYTE_16" TU81 EXTENDED SENSE BYTE 16   *CMD RejectE *Intervention Required *Diag. Request  *Equip. ChecktB  *AGC Check2  *Reset Keya' *Reverse in BOTe *Velocity Checke?0BYTE_17" TU81 EXTENDED SENSE BYTE 17 kn ,* Marginal Condition Code = $ )& M@0MSGFD13&$ RESERVED STI COMMUNICATION ERROR  Reserved$$)# B0EWORD0D0 EWORD1$F0LEWORD2H0xEWORD3J0EWORD4iL0EWORD5e,N0MSGFD13" RESERVED STI FORMATTER ERROR Reservedo$)# P0EWORD0uR0 EWORD1T0LEWORD2uV0xEWORD3$X0EWORD4aZ0EWORD5\0EWORD6e^0EWORD7`0EWORD8eb0EWORD9cd0$EWORD10f0(EWORD11e~h0MSGFD13RESERVED STI DRIVE ERRORLr Reserved!$!)#2 j0EWORD0l0 EWORD1Cn0LEWORD2)p0xEWORD3tr0EWORD4rt0EWORD5 v0EWORD6x0EWORD7z0EWORD8|0EWORD9o~0$EWORD100(EWORD110,EWORD1200EWORD1304EWORD1408EWORD150<EWORD160@EWORD170DEWORD180HEWORD190PEWORD200TEWORD210XEWORD220\EWORD230`EWORD240dEWORD250hEWORD260lEWORD270pEWORD280tEWORD290|EWORD30tl$  |e a*ReservedE HSC50e UDA50r RC25a VMS Software Servera TU81o UDA50AE RD/RXe TOPS 10/20 Software Servere TK50u RUX50c KFBTAc KDA50r TQK70 RV20t RRD50-QBUSt KDB50M RQDX3F UQSSP/DSSI TapeF UQSSP/DSSI Diskt UQSSP/DSSI Disk and Tapee UQSSP/DSSI Othert TUK50e RRD50-UNIBUSe RQZX1p` RF30ta RF71ab TF85 c TF70e 0l$el @ud D*Reserved TA78 TU81 TK50 TA81 TA79 TK70 RV20 TZ30 TZ50 TZ70 TZ85 TLZ04 TLZ06*r$ sZ 8ete<MSCP DiskeMSCP TapefDiagnostic Utility ProtocolSa $ttx ovrSequential MessagenDatagram MessagehCredit Notification MessageeMaintenance Message$$s) ueFSuccessInvalid Command)Command Aborted$Unit OfflineUnit Available/Media Format Error$Write ProtectedCompare ErrorlData Error Host Buffer Error Controller Error Drive Error Formatter Error BOT EncounteredTape Mark Encountered$Record Data TruncatedPosition LostSerious Exception00c TADATADATADATADATADATALEOT DetectedDiagnostic ErrorC$  Unknown UnitKnown but R/S out or no mediaInoperative UnitDisabled by FS or diagnosticDuplicate Unit NumberoV$ue  (nko,Still ConnectedDuplicate Unit NumberAlready OnlineStill Online EOT Encountered~$$I) ` Hardware Write ProtectSoftware Write ProtectSoftware and Hardware$$   ga Invalid MSG Length@Invalid OpcodePInvalid Modifiers`Invalid Byte CountpInvalid Invalid Unit FlagsInvalid Format`Invalid MSCP VersionpInvalid Controller FlagsPF$DP ` Long Gap EncounteredAGC FaultID FaultRead Data CheckUnit ExceptionFIFO Overrun/OverflowFMTR Read Parity ErrorUnrecoverable Read ErrorFIFO Parity Error I/F Parity Error LESI Parity Errorn<t$ @ NRNXMParity Error@o$ee @ RFVGross Time OutData LaterM$or   BFDevice Response CheckDevice Hardware CheckVelocity CheckDevice Command CheckAirflow/Temp. Checkt t$rr  4ou 8Equipment CheckIntervention RequiredCommand RejectFormatter Response CheckFormatter Sense Read Error2r$es)#n*8t$ '* nRi$<$SR*Unknown value ec$d)#s o$ el' dn $$ln*Unknown Value es$e)#V ir$ rk' j$$mj*Unknown Value e$)#l gzo$ptZi^ r$2r(a$  wn' ^$, rZ2ar$  nn' T^ $ bZ2T$  td' C^r$ tZ2C~ $  '~  ^T$  Z2 d$  l' B^m$ TZ 2D<No$  tg'< ^$R rZ 2o@Rl$  h'Z e^F$V Z 2$$  T' ^$ Z 2 4 $  F'   ^$8 $Z Z $$$Z&^ Unknown Value of s$ )# $l|r$ p'l V$"kV * Unassigned $)# 0@a$ '0 v$D"v * Unassigned e$)# 'tN/An $ $b x$vxN/AnpN/Anr r$ )#N/An|N/AnpN/AnN/AnN/AnlN/An $Z r$^ '$j) U $$Illegal formatController ErrorHost Memory Access ErrorTape Transfer Error STI Communication ErroriSTI Drive Error LogiSTI Formatter Error Logi)j $$!1FCValue!25FCInterpretation!FLrL!2FL!1FC!DP!25FC!DP!2FLa.x$!25FC!DP!75FC!DP!CE! !25FC!DP!CE ) @4b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rk"p*s"Ss"xu"u"u"XJ~"6U"s]"fH7$7$_7$j7$@v7$&M'Z'_y:';TMSGFD17(&"UNIT SOFTWARE VERSION NUMBER FIELDMU *( Unit Firmware Version = B$>#)#N %0BMSGFD18(&"UNIT HARDWARE VERSION NUMBER FIELDV *( Unit Hardware Version = B$B)#Z &0FMSGFD19 LEVEL  J  Level = d\$J)# '0NMSGFD19B RETRYl   Retry = d$N)#R (0 fMSGFD20POSITI00c TADATADATADATADATADATAON (OBJECT COUNT)=0 ,* Position (Object Count) = R$fW)#1 ,0jMSGFD21.,'FORMATTER SOFTWARE VERSION NUMBER FIELD E ., Formatter Firmware Version = W$j0)# -0nMSGFD22.,'FORMATTER HARDWARE VERSION NUMBER FIELDz ., Formatter Hardware Version = R$n)# .0rMSGFD23 RESERVED00vMSGFD24 DRIVE FLAGSH&  Reserved Bit 7w  Drive is in Run State16  Positioned at BOTE   Hardware Write ProtectedoWO  Reserved Bit 3 0  Tape UnloadedWO  Head at Track ZerotZ  Cartridge Present10zMSGFD25 TRACK NUMBERRD   Track Number = $zs)# 20~MSGFD26PHYSICAL BLOCK NUMBERcC5 *( Physical Block Number = o$~)# 40MSGFD27LOGICAL BLOCK NUMBERre (& Logical Block Number = $)# 50MSGFD28 TAPE COUNT 0   Tape Count 0 = $2)#o 60MSGFD29 TAPE COUNT 1   Tape Count 1 = $ )#B 70MSGFD30 TAPE COUNT 2   Tape Count 2 = $)# 80MSGFD31 DRIVE STATE (& Drive State = $)$  (X) :0MSGFD32READ/WRITE STATEap ,* Read/Write State = i$)$  (X) <0MSGFD33OPERATION FLAGSt ,* Operation Flags = $)$  (X)D >0MSGFD34 DRIVE STATUS *Drive Status = $ ?0MSGFD35DRIVE ERROR CODE  *Drive Error Code= $ v$  *Reserved  HSC50 UDA50 RC25 VMS Software Server TU815 UDA50A RD/RX TOPS 10/20 Software Server TK50Z RUX50 KFBTA KDA50 TQK70  RV20 RRD50-QBUS KDB50 RQDX3 UQSSP/DSSI Tape0 UQSSP/DSSI Disk UQSSP/DSSI Disk and Tape UQSSP/DSSI Other TUK50L RRD50-UNIBUS RQZX1` RF30a RF71b TF85lc TF70$l *Reserved TA78 TU81 TK50 TA81 TA79 TK70 RV20 TZ30 TZ50 TZ70 TZ85 TLZ04 TLZ06Fr$ttZ TerdXMSCP DisktMSCP TapecDiagnostic Utility Protocol4r$iax Bow FSequential MessageuDatagram MessagerCredit Notification MessageMaintenance Messagem$ ,ict0SuccesslInvalid CommandCommand AbortedUnit OfflinenUnit AvailableWrite ProtectedCompare ErroreData Errora Host Buffer Error Controller Error Drive Error Formatter Erroro BOT EncounteredTape Mark EncounteredRecord Data TruncatedtPosition LosteSerious ExceptionLEOT DetecteddDiagnostic MessageJ$ ` `emrdUnknown UnitKnown but R/S out or no mediaInoperative Unitz$ d  NormalStill ConnectedDuplicate Unit NumberAlready OnlineStill Online EOT Encountered$ ` Software Write ProtectHardware Write Protect00cO b eceBHost Buffer Access ErrorNon-existent Memory ErrorHost Memory Parity ErrorInvaldi Page Table Entry\$d @ nnrCommunications Channel TimeoutInternal inconsistencyBE$ou  OTdDrive Command TimeoutController Detected Xmt ErrorRecoverable Drive FaultUnrecoverable Drive Faulttn$ad  lueHardware Write ProtectDrive FaultCommunication ExceptionWrong TrackSync FailureCommunications Error"Positioning Error#Channel B Overrun'Channel A Overrunla$ed  DoneRetryHard ErrorTape Mark ReadLogical EOT Detectedo End of Medial Drive ErroraCommunications ExceptionEnd of DataFailed to Find Append TargettLeaving EOT Trailer RegionECC Correction on DataECC Correction on Tape MarkkBOT EncounteredData Synchronization ErrorEOT Detected Seek Aborted"UnloadgFailure to load to BOTFailure to unload TaperGeneral Motor or Tach FailureMotor A FailureoMotor B FailureLost Control or Bad TachExcessive Drag in TransportFailure to Stop or Stay StopCartridge Insert Error Cartridge Extract ErrorCU Attempt to Move Tape Error$Deceleration Timeout ErrorSecond Balance Reels FailedV8155 RAM Self Test Fail8155 Timer FailureRead Amplitude to low HD1'Read Amplitude to low HD2EOT sensed in R/W/S staterBOT sensed in R/W/S stateiDrive block address overflow$Drive block address underflowServo Error Excess Speed VariUFailure in TrackingCommand Not RecognizedIllegal Command Incomp StateWrite Lock ErrorWrite Gate at wrong timeNo Write gate for Cal TrackError sensing Cal Track 1aError sensing Cal Track 2nDet edge of Cal Trk 1 outUDet edge of Cal Trk 2 outOffset Cal Trk 1-2 too largelSearch Bottom Edge FailedBottom Edge Tolerance ErrorkDrive is overheatingNo Current in LED BOT sensorHall Switch Sense Motor ATachometer Failure$Zas)#dFT#$R `'F $X$*Unknown value F$R)#S u4B$^ '4 u $F$)*Unknown Value FN$^)# ,$ u' /$0$/*Unknown Value F$)# $ ll$2ozo$ te'z c $ 2 J`m$ tn'J iI$d  2mr$ i' $ 2Ct$ F' $ 1 2*>5$ 7C'* !5$B C 2\n $ ra'\ $r  2$ G ' t$  n $& Unknown Value of i$)# dr$ ' r$$a*Unknown Value f*$$)# $ ' ou$$c*Unknown Value fe$t)# mvr$ s'v rr$"r * Unassigned eg$a)# t$6  ' $" * Unassigned en$6h)#e T u$2I))nn$iPort s$*)#$ Subunit $.)# N/Aum T$o)#N/AutN/AucN/AuoN/AuaN/AuaN/Au r$ a D$a '$$)00c TADATADATADATADATADATA $  $Illegal formatController ErrorHost Memory Access ErrorTape Transfer Error STI Communication ErroriSTI Drive Error LogiSTI Formatter Error Logi) ou$o$!1FCValue!25FCInterpretation!FLrL!2FL!1FC!DP!25FC!DP!2FLa.$v!25FC!DP!75FC!DP!CE! !25FC!DP!CE$)ro@b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rk"p*k"is"Ss"xu"u"u"XJ~"6U"s]"fH7$7$_7$j7$@v7$&M'Z'_y:';T(O EUNAIVP01.00V2.00MDISPC ERROR_MSG FUNCTION BINTERMOD_DEVERR      LREGISTERT     " $REPORTL   DEVICE_ENTRYMSG 60,0$6  er0ERRB  *Unuset bits setng  Error code = $ 0CSR0 an *Status error interrupt s *Command error interruptt *Receive ring interruptt6 *Transmit ring interrupt e  *Command success interrupt ,*%*Receive buffer unavailable interruptrML  *RESERVEDb* *Fatal error interruptOE *Interrupt summary  Interrupt enabley t   UNA resethe  UNA remote consoleuML   Function = e$ 0CSR1 :*Transciever power failure Transciever power oki21 &*Cabling failure  Cabling oki .( Self-test return code = e$#)%-  *Command errorRE ("*Unused bits set = o$o)%t ar   DELUA  DEUNA. *Unused bit sett E   Reset state Primary load stateo  Ready state Running state Unknown state Unibus halted  NI halted Unibus and NI haltede  U d i tkc0EFLG  t  *ErrorE_  *Receiver framing error= LJ*$ $*Transmitter multiple retries needed*Receiver overflowb)se HF$00cO b h( L NRK67VM01.00V2.00M4INTERMOD_DEVERR  NOTE_NUMBERSI NOTES0MSG6(#!3FLNotes on RK06, RK07 errors:!2FL  D  'D $$X@<* The reason that Drive Off Track is set is that Write83 Gate was set and Drive Ready was clear.!3FLh$ UNKNWNNOTa e$X3)#$@ D@b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rk"p*k"is"Ss"xu"u"u"XJ~"6U"s]"@"fH7$7$_7$j7$@v7$&M'Z'_y:';T(L NRM05VM01.00V2.00M4INTERMOD_DEVERR  NOTE_NUMBERSI pNOTES0MSG^6"!3FLNotes on RM05 errors:!2FLc D 'D& ' $X$:6* RMDA bits 5,6,7 are unused, however if they are :6 set, they will be interpreted as the high ordere:6 bits of the sector address. This may result ina($ an Invalid Address Error.!3FL$ UNKNWNNOT  m$X )# $@ D@b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rk"p*k"is"Ss"xu"u"u"XJ~"6U"s]"@"fH7$7$_7$j7$@v7$&M'Z'_y:';T(7CM NRM23VM01.00V2.00M4INTERMOD_DEVERR  NOTE_NUMBERSI vNOTES0MSGd6(#!3FLNotes on RM02, RM03 errors:!2FLs D  'D& $$X:6* RMDA bits 5,6,7 are unused, however if they are:6 set, they will be interpreted as the high order:6 bits of the sector address. This may result in($ an Invalid Address Error.!3FL$ UNKNWNNOT  #$X )#D$@ D@b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rk"p*k"is"Ss"xu"u"u"XJ~"6U"s]"@"fH7$7$_7$j7$@v7$&M'Z'_y:';T(M NTS11VM01.00V2.00M4INTERMOD_DEVERR  NOTE_NUMBERSI &NOTES0MSG6"!3FLNotes on TS11 errors:!2FLm D 'D ' $X$:6* When the 'Deskew Buffer Fail' (DBF) bit is set,y62 the 'Dead Track' bits indicate which of thei" deskew buffers failed.i$ UNKNWNNOTs a$Xe)#i$@ D@b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rk"p*k"is"Ss"xu"u"u"XJ~"6U"s]"@"fH7$7$_7$j7$@v7$&M'Z'_y:';T(dtN NT0310M01.00V2.00M NOTE_NUMBERSM NOTES0MSG60,!3FLNotes on TS03, TE10 and TU10 errors:!2FL * X'*B 6$> :6* The Error Logging control files cannot tell the :5 TS03, TE10 and TU10 tape drives apart from onees<7 another. This is not a problem in that all threeL 62 tape drives log identical error information0 UNKNWNNOTp n$> )#TS03/TE10/TU10 *@ b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rk"p*k"is"Ss"xu"u"u"XJ~"6U"s]"@"fH7$7$_7$j7$@v7$&M'Z'_y:';Tx(^ PARS1MM01.01V2.00MDEFINED_REPORTE DPARSE       "REPORTC   6SWITCHC   USER_REPORT zPASS_1K_SWITCHXW$WWWNW$WWWW$WtDl\)$\W  $\!)DW  NEXT_FILE)$` D $h=E NEXT_FILE)A$` NOINPFILE) D $\K)DM SYNTAXERR)N|C GU$$tI)E> D$t$L(| IT$t2$!)| $| SYNTAXERR)F|C$t/R) 4 $|)&USERLB:[1,6]ERRDEFINE.CFS ))T S USER)U(USER) USER)Q! 5!$!!z :$$)-M$,''g)STm$$"x $ $8!)'!)1!$TD$x!USERF)D USER!)PPC$tC"T$$|!/()R)M!l$r$g$|t"m$R$ )! t $t $| $a$|" PARSEM NEXT_SWITCH, PARSEM CHECK_SWITCH ! D$ll)D TOOFEWARGTF$p $l)D: PARSEM NEXT_ARGUMENT] *$*@ $T X'*V$D ER)$C T T$T RT' M$ EH)$  NOREMATCHM$T PARSEM NEXT_SECTIONRt$ NEXT_FILEAY A$\E)Id`Mhd|F$\,=()[]F) T O$|d INTERR001)2N`$\$|S $` RdBIdR$`) I $d ILLFILSPC)M$`d| M$|Y$\M)Y*Uh Y$\T$|\A$\O$|!T)Ah\|T$|$dT"" R S$|P"MtY$t$`P$dI!H$|LT `C$`T$d@b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rk"p*k"is"Ss"xu"u"u"XJ~"6U"s]"@"fH7$7$_7$j7$@v7$&M'Z'_y:';T(_( PARS2MM01.01V2.00M4PARSE  SWITCH_NAME ZPASS_2CHESP _ _$BH PARSEM NEXT_SWITCH PARSEM CHECK_SWITCH>H PRS2AM PASS_2AW $> PRS2BM PASS_2BW $:$6J  PARSECLSTT$:  PARSECTONT$6 INTERR001T1NCHECK_MUL_QUALF PARSEM NEXT_SECTION $ $6  NOMULQUALIM$XRD@b 8>(Y PARS3MM01.04V2.00MDEVICES  FIL_ERR  PACKET_RANGEE PARSEfREPORTV        !#%')+-/16SWITCH_  PASS_3CHESPH __$ BRIEFQ X$"W R M $E WRRR A_$ $RR S$B4RRRARR 00c TADATADATADATADATADATAR$T6)T) T$1CRQ P$E*RI I$ XZrn $*8<@$INPUTQ$LB0:[1,6]LOG.ERR)T INPUT1)U $ CNV_ERR_MSGG OPNINPFILS&REPORT $SY0:ERRREPORT.LST U)T REPORTR)UI$ CNV_ERR_MSGR OPNREPFILS CNV_ERR_MSG SD)$! R V'')VT)R $$Vx $R$V)C!!RT$V)C"USERLB:[1,2]QIOSYM.MSG)T USER")U>$ $R/.)USERPr))R t$RR"f )!$V ,&Directive Error -_$R" )#P M I/O Error - $Rl)#D  FILERRCOD $R USER)P V@b 8 _INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rk"p*k"is"Ss"xu"u"u"XJ~"6U"s]"@"fH7$7$_7$j7$@v7$&M'Z'_y:';Tder (RBN)!2FL!4FC!33DP!2FL 4  $ )#<$)# 4 $ (Primary RBN)e(SecondaryR(V V 'V / $h!2FL!5FC!DF!13FC!DP $d:N$RSX-11M/M-Plus Error Logging System )  ))*  Page8 P:5!7DP!10FC!20DP!32FC!18DP!52FC!6DP!60FC!30DP!92FC!39DP9l!25FC!DP!75FC!DP!CE!T FMTWP1:N$RSX-11M/M-Plus Error Logging System )R   !)c)*  Pagel P<8!7DP!10FC!20DP!32FC!18DP!52FC!6DP!FL!10FC!30DP!42FC!39DPl !25FC!DP!CE0T FMTNP1p|$:p| M  $XBRIEF1F$(P   XDATEyDEVICE FORMATcPACKET REPORTrSERIAL SUMMARY TYPE VOLUMEiWIDTHIf,a$on-- >-- BDATEPREVIOUSDATERANGEDATETODAYDATEYESTERDAYDEVICEALLFORMATBRIEFFORMATFULLFORMATNONEFORMATREGISTERSKINDALLKINDCRASHKINDNORMALSERIALDRIVESERIALPACKSUMMARYALLSUMMARYERRORSUMMARYGEOMETRYSUMMARYHISTORYSUMMARYNONETYPEALLTYPECONTROLTYPEERRORSTYPEMEMORYTYPEPERIPHERALTYPEPROCESSORTYPESYSTEM_INFOWIDTHNARROWWIDTHWIDEu Yin EWRtsinon     si   Le n= A8Lubo, o$DSB(TBPossible corruption i * $C Zh @ foPmDSYSTEM/SU:(HISTORY,ERROR)TWEEK/SU:(HISTORY,ERROR)/DA:PREVIOUS:700cO b L$X$T$B) ',` &, , ',B ,>$X$T$B) ', ARGNOTUNQ)$T ,` $$T)C$B)  ILLSWTARG)g$TT2$B UNKNWNARG)$T CHECK_SWITCH FF!$!$X) !'F UNKNWNSWT)$`&F F $W'F:F$n$X) i'F SWTNOTUNQ)-$ F`@ b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rk"p*k"is"Ss"xu"u"u"XJ~"6U"s]"@"fH7$7$_7$j7$@v7$&M'Z'_y:';T( PRS2AMM01.04V2.00MDEVICES   PACKET_RANGE 0PARSE    REPORTD "SWITCH     SWITCH_NAME PASS_2ASPAS C$ S) DATE4 I$ MULSWTSPC $| PARSEM NEXT_ARGUMENT PARSEM DCL_PARSEM $l RANGEA PARSEM NEXT_ARGUMENT $l*E R)~ ($l(6$l$l)) l$l$l)"P $l)6 I $) SYNTAXERRM PARSEM NEXT_ARGUMENT $l*E ) (@$l($$lP$l))[, Gl$l$lP) "$ C$l:A)NIl$l  23:59:59M Y R$lO)6 S U$ ) SYNTAXERRM TODAYXN)I $_) YESTERDAYMF))) $) $) $x) PREVIOUSh PARSEM NEXT_ARGUMENT) $E)B2$O$l.E)T)2 )U)) $)E PARS2MCHECK_MUL_QUAL DEVICEB V$ MULSWTSPC_$|tU U )\ $t ALLSR o -$R$# ILLARGCOM_$tL)*8<@f GE$ ILLARGCOM_ $tL$ $t:GT) $"$t$t:G )" $tN)M$H)T! ILLSWTARG_T$t $ *_*8$tE<@.*8$t|< \$)00c TADATADATADATADATADATA5@N  $t|) ILLSWTARG_2$t*8$t<@t PARSEM NEXT_SECTION d$tE KIND PACKET M$ MULSWTSPCIT$| PARSEM NEXT_ARGUMENTL $l*E l  $lS) P ILLPACSPCM$l C$$lT)Z S6M$lF$D.AR$l$W0I$l$9 ILLPACSPCM$l$lpL PARSEM NEXT_ARGUMENTL $l4 $  ILLSWTARGM*L$&  $l*L l=$lD\$X$ PARSEM NEXT_SECTION $tE REPORT MULSWTSPCI$| xU_D@b 8_INPW_ZT!Ə"""ƺ""("0 "H "(  """`'#"2#"9("XF("La"mc"rk"p*k"is"Ss"xu"u"u"XJ~"6U"s]"@"fH7$7$_7$j7$@v7$&M'Z'_y:';T PARSEM NEXT_ARGUMENTLX )$6,)0GE\E PACKf C$ MULSWTSPCMl$> PARSEM NEXT_ARGUMENTLt U$6 )0EYxE PARSEM NEXT_SECTION $:E SUMMARYCR $ MULSWTSPCI$BhU`U)dURUUMUA PARSEM NEXT_ARGUMENTL PARSEM DCL_PARSEM )x$6 HISTORYS: $ MULARGSPCMM$>LhUIU ERRORG: SS$ MULARGSPCM$>U`UU GEOMETRY: $#$ MULARGSPCMt$>dUU ALLAn f$$$ MULARGSPCM$>hU$UG`U$UdUU NONE hO`O$dO PARSEM NEXT_SECTION $:E TYPE $ MULSWTSPCI*$BTU|U$UlUUUURUUU PARSEM NEXT_ARGUMENTL PARSEM DCL_PARSEM $6 CONTROLS: C$ MULARGSPCMW$>TUU PERIPHERAL: MT$ MULARGSPCL$>$|UU PROCESSORL: $ MULARGSPCL$>UU MEMORY: $$ MULARGSPCL$>PlUU SYSTEM_INFON: R$ MULARGSPCF$>UU ERRORSn $$$ MULARGSPCF$>|UU$UUSlUTU ALLA $ $R$R$ $L MULARGSPCF$>Y|UUU,TUUUUlUUUEU PARSEM NEXT_SECTION $:E VOLUME $ MULSWTSPCIH$B PARSEM NEXT_ARGUMENTL ($6"$6$6)"D 00cd  b $X@ '*2*8A$X<$T@ D'*1 pS<0b "@czx<{ .GOTO CPUTYP;D; The acceptable CPU types are:F;D; 11/23, 11/24, 11/44 ; 11/70, 11/74; 11/83, 11/84, 11/53, 11/73; 11/93, 11/94U;R.GOTO 15.;.CPUTYP:.;..; Now check to see if we recognize the answer.;.IF TEMP EQ "11/23" .GOTO C11XXR.IF TEMP EQ "11/24" .GOTO C11XXU.IF TEMP EQ "11/44" .GOTO C1144L.IF TEMP EQ "11/70" .GOTO C117X .IF TEMP EQ "11/74" .GOTO C117Xs.IF TEMP EQ "11/53" .GOTO C118XP.IF TEMP EQ "11/73" .GOTO C118XE.IF TEMP EQ "11/83" .GOTO C118XF.IF TEMP EQ "11/93" .GOTO C119X .IF TEMP EQ "11/94" .GOTO C119X ;25; Unrecognized CPU type 'TEMP' - Please enter again5; .GOTO 15.;.DEVXXX:;RE; Now enter the devices in your configuration separated by commas.nE; Terminate by entering a period. Hit the escape key for a list of1; acceptable device names. T;1.20:.ENABLE ESCAPE!.ASKS DEVLST Enter device name(s)4.IFT .GOTO 21.IF DEVLST EQ "" .GOTO 20I .GOTO COMPAR.;.21:;8E; Below is a list of acceptable device names. If you have more thanE; one type of device listed as "x or y or z" you need enter only one. E; For example, if you have RP04s and RP06s you need only enter RP04 ; or RP06 - not both.u;i"; The acceptable device names are:;b; TU56 (DECtape); TU58 (DECtape II)e; TU60 (Cassette) ; RP04 or RP05 or RP06; RP07; RS11; RK03 or RK05; RL01 or RL02; RK06 or RK07; RP02 or RP03; RM02 or RM03; RM05; RM80; RS03 or RS04; RA60; RA70; RA80 or RA81 or RA82; RA90 or RA92; RC25>; RD51 or RD52 or RD53 or RD54 or RD31 or RD32 or RX50 or RX33; RX01; RX02; ML11; TE16 or TU16 or TU45; TU77; TE10 or TU10 or TS03.; TU78n; TS11; TU80 ; TSV05,TK25; TK50,TU81,TK70;c.GOTO 20.;.COMPAR:.;.; Parse DEVLSTp.;.PARSE DEVLST "," TEMP REST( .TEST TEMP+.IF DOT NE TEMP[:] .GOTO 223 .SETT GIVEUP.SETS TEMP TEMP[1:-1]P.;.22:.;/.; Now check to see if we recognize this deviceA.;.IF TEMP EQ "TU60" .GOTO TA11.IF TEMP EQ "RP04" .GOTO RP456.IF TEMP EQ "RP05" .GOTO RP456.IF TEMP EQ "RP06" .GOTO RP456.IF TEMP EQ "TU58" .GOTO TU58o.IF TEMP EQ "RS11" .GOTO RS11o.IF TEMP EQ "RK03" .GOTO RK050.IF TEMP EQ "RK05" .GOTO RK050.IF TEMP EQ "RL01" .GOTO RL12;.IF TEMP EQ "RL02" .GOTO RL12D.IF TEMP EQ "RK06" .GOTO RK67P.IF TEMP EQ "RK07" .GOTO RK67L.IF TEMP EQ "RP02" .GOTO RP23S.IF TEMP EQ "RP03" .GOTO RP23;.IF TEMP EQ "RM02" .GOTO RM23 .IF TEMP EQ "RM03" .GOTO RM23;.IF TEMP EQ "RM05" .GOTO RM05.IF TEMP EQ "RM80" .GOTO RM806.IF TEMP EQ "RP07" .GOTO RP076.IF TEMP EQ "RS03" .GOTO RS346.IF TEMP EQ "RS04" .GOTO RS34o.IF TEMP EQ "TU56" .GOTO TC11o.IF TEMP EQ "RA80" .GOTO MSCP8.IF TEMP EQ "RA81" .GOTO MSCP8.IF TEMP EQ "RA82" .GOTO MSCP8.IF TEMP EQ "RA60" .GOTO MSCP6.IF TEMP EQ "RA70" .GOTO MSCP7.IF TEMP EQ "RA90" .GOTO MSCP9.IF TEMP EQ "RA92" .GOTO MSCP9.IF TEMP EQ "RC25" .GOTO MSCPS.IF TEMP EQ "RD51" .GOTO MSCP5.IF TEMP EQ "RD52" .GOTO MSCP5.IF TEMP EQ "RD53" .GOTO MSCP5.IF TEMP EQ "RD54" .GOTO MSCP5.IF TEMP EQ "RD31" .GOTO MSCP5.IF TEMP EQ "RD32" .GOTO MSCP5.IF TEMP EQ "RX33" .GOTO MSCP5.IF TEMP EQ "RX50" .GOTO MSCP5.IF TEMP EQ "R00d` TADATADATADATADATADATAX01" .GOTO RX018.IF TEMP EQ "RX02" .GOTO RX028.IF TEMP EQ "ML11" .GOTO ML118.IF TEMP EQ "TU78" .GOTO TU786.IF TEMP EQ "TE16" .GOTO T1645.IF TEMP EQ "TU16" .GOTO T1645.IF TEMP EQ "TU45" .GOTO T1645.IF TEMP EQ "TU77" .GOTO TU77S.IF TEMP EQ "TE10" .GOTO T0310.IF TEMP EQ "TU10" .GOTO T0310.IF TEMP EQ "TS03" .GOTO T0310.IF TEMP EQ "TS11" .GOTO TS115.IF TEMP EQ "TU80" .GOTO TU805.IF TEMP EQ "TSV05" .GOTO TSV05.IF TEMP EQ "TK25" .GOTO TSV05.IF TEMP EQ "TK70" .GOTO TK70.IF TEMP EQ "TU81" .GOTO TU81.IF TEMP EQ "TK50" .GOTO TK50.;.; Check for end of input.;.IF TEMP EQ "" .GOTO DONE; 3; Unrecognized device 'TEMP' - Please enter againT;5 .GOTO NEXT.;.; CPU Modules.;.C11XX: #.DATA #0 E11XX.ICF = 'LOC'/EX:E11XX"#.DATA #1 TEMPLIB.ULB/RP = E11XX.ICFO .GOTO DEVXXX.;.C1144:.#.DATA #0 E1144.ICF = 'LOC'/EX:E1144T#.DATA #1 TEMPLIB.ULB/RP = E1144.ICF .GOTO DEVXXX.;.C117X:S#.DATA #0 E117X.ICF = 'LOC'/EX:E117X#.DATA #1 TEMPLIB.ULB/RP = E117X.ICFE .GOTO DEVXXX.;.C118X:I".DATA #0 E118X.ICF= 'LOC'/EX:E118X!.DATA #1 TEMPLIB.ULB/RP=E118X.ICFE .GOTO DEVXXX.;.C119X: ".DATA #0 E119X.ICF= 'LOC'/EX:E119X!.DATA #1 TEMPLIB.ULB/RP=E119X.ICF .GOTO DEVXXX.;.; Device Modules0.;.TA11:#.DATA #0 ETA11.ICF = 'LOC'/EX:ETA11B#.DATA #1 TEMPLIB.ULB/RP = ETA11.ICFC .GOTO NEXT.;.RP456:F%.DATA #0 ERP456.ICF = 'LOC'/EX:ERP456B$.DATA #1 TEMPLIB.ULB/RP = ERP456.ICF .GOTO NEXT.;.TU58:#.DATA #0 ETU58.ICF = 'LOC'/EX:ETU58B$.DATA #1 TEMPLIB.ULB/RP = ETU58.ICF .GOTO NEXT.;.RS11:#.DATA #0 ERS11.ICF = 'LOC'/EX:ERS11L$.DATA #1 TEMPLIB.ULB/RP = ERS11.ICF .GOTO NEXT.;.RK05:#.DATA #0 ERK05.ICF = 'LOC'/EX:ERK05L$.DATA #1 TEMPLIB.ULB/RP = ERK05.ICF .GOTO NEXT.;.RL12:#.DATA #0 ERL12.ICF = 'LOC'/EX:ERL12E$.DATA #1 TEMPLIB.ULB/RP = ERL12.ICF .GOTO NEXT.;.RK67:#.DATA #0 ERK67.ICF = 'LOC'/EX:ERK67C#.DATA #0 NRK67.ICF = 'LOC'/EX:NRK67 $.DATA #1 TEMPLIB.ULB/RP = ERK67.ICF $.DATA #1 TEMPLIB.ULB/RP = NRK67.ICF .GOTO NEXT.;.RP23:#.DATA #0 ERP23.ICF = 'LOC'/EX:ERP23$.DATA #1 TEMPLIB.ULB/RP = ERP23.ICF .GOTO NEXT.;.RM23:#.DATA #0 ERM23.ICF = 'LOC'/EX:ERM23#.DATA #0 NRM23.ICF = 'LOC'/EX:NRM23$.DATA #1 TEMPLIB.ULB/RP = ERM23.ICF $.DATA #1 TEMPLIB.ULB/RP = NRM23.ICF .GOTO NEXT.;.RM05:#.DATA #0 ERM05.ICF = 'LOC'/EX:ERM05#.DATA #0 NRM05.ICF = 'LOC'/EX:NRM057$.DATA #1 TEMPLIB.ULB/RP = ERM05.ICF $.DATA #1 TEMPLIB.ULB/RP = NRM05.ICF .GOTO NEXT.;.RM80:#.DATA #0 ERM80.ICF = 'LOC'/EX:ERM80$.DATA #1 TEMPLIB.ULB/RP = ERM80.ICF .GOTO NEXT.;.RP07:#.DATA #0 ERP07.ICF = 'LOC'/EX:ERP07$.DATA #1 TEMPLIB.ULB/RP = ERP07.ICF .GOTO NEXT.;.RS34:#.DATA #0 ERS34.ICF = 'LOC'/EX:ERS34$.DATA #1 TEMPLIB.ULB/RP = ERS34.ICF .GOTO NEXT.;.TC11:#.DATA #0 ETC11.ICF = 'LOC'/EX:ETC11$.DATA #1 TEMPLIB.ULB/RP = ETC11.ICF .GOTO NEXT.;.MSCP8:' .GOSUB EUDA50T%.DATA #0 MSCP80.ICF = 'LOC'/EX:MSCP80 %.DATA #1 TEMPLIB.ULB/RP = MSCP80.ICF E.;%.DATA #0 MSCPCE.ICF = 'LOC'/EX:MSCPCEE%.DATA #1 TEMPLIB.ULB/RP = MSCPCE.ICF 8 .GOTO NEXT.;.MSCP9:R .GOSUB EUDA50E%.DATA #0 MSCP9X.ICF = 'LOC'/EX:MSCP9XM%.DATA #1 TEMPLIB.ULB/RP = MSCP9X.ICF ;.;%.DATA #0 MSCPCE.ICF = 'LOC'/EX:MSCPCE3%.DATA #1 TEMPLIB.ULB/RP = MSCPCE.ICF .GOTO NEXT.;.MSCP6: .GOSUB EUDA50I%.DATA #0 MSCP60.ICF = 'LOC'/EX:MSCP60U%.DATA #1 TEMPLIB.ULB/RP = MSCP60.ICF C.;%.DATA #0 MSCPCE.ICF = 'LOC'/EX:MSCPCE %.DATA #1 TEMPLIB.ULB/RP = MSCPCE.ICF R .GOTO NEXT.;.MSCP7:T .GOSUB EUDA50 %.DATA #0 MSCP70.ICF = 'LOC'/EX:MSCP70B%.DATA #1 TEMPLIB.ULB/RP = MSCP70.ICF C.;%.DATA #0 MSCPCE.ICF = 'LOC'/EX:MSCPCE %.DATA #1 TEMPLIB.ULB/RP = MSCPCE.ICF R .GOTO NEXT.;.MSCP5:T .GOSUB EUDA50 %.DATA #0 MSCP5X.ICF = 'LOC'/EX:MSCP5XB%.DATA #1 TEMPLIB.ULB/RP = MSCP5X.ICF C .GOTO NEXT.;.MSCPS:T .GOSUB EUDA50 %.DATA #0 MSCPSD.ICF = 'LOC'/EX:MSCPSDB%.DATA #1 TEMPLIB.ULB/RP = MSCPSD.ICF . .GOTO NEXT.;.EUDA50:%.DATA #0 MSCPEN.ICF = 'LOC'/EX:MSCPENG%.DATA #1 TEMPLIB.ULB/RP = MSCPEN.ICF .;$.DATA #0 MSCPCE.ICF ='LOC'/EX:MSCPCE .D00dhn b ; produce this message. This type of message can be ignored. ;TLBR @TEMPTUNE1.TMP;S; Now clean up. ;.LBR TEMPLIB.ULB/CO=TEMPLIB.ULBPIP TEMPLIB.ULB/PUPIP TEMPLIB.ULB/TR PIP ERRLOG.ULB/RE/NV=TEMPLIB.ULB.PIP *.ICF;*,TEMPTUNE0.TMP;*,TEMPTUNE1.TMP;*/DE; ; Finished.P;0.FINI:d the new li;F%; ODL file for the new RMSDSP utility ;t .Root RMSROT-DSP,*ERR,*RMSALL.DSP: .Fctr ROOT-SYSSUP-DATA-*(OV1,OV2,OV3,OV4) ROOT: .Fctr DSPCTL-DSPSUB-DSPMEMGSYSSUP: .Fctr LB:[1,1]VMLIB/LB:INIDM:EXTSK-LB:[1,1]SYSLIB/LB:EDTMG-SYS1DDSYS1: .Fctr SY:[1,24]RMSUTL/LB:$CDTTA:$DIVQ:DIVD:$MULQ:$MONTB:MULUNSDATA: .Fctr DSPDAT-DSPRMS OV1: .Fctr DSPHLP[*OV2: .Fctr DSPGCM-LB:[1,1]RMSLIB/LB:R0GCML1OV3: .Fctr DSPPAR-DSPACT-LB:[1,1]SYSLIB/LB:.TPARS/(OV4: .Fctr DSPMAI-*(OVA1,OVA2,OVA3,OVA4)OVA1: .Fctr DSPAREOVA2: .Fctr DSPBACOVA3: .Fctr DSPBASOVA4: .Fctr DSPKEY ERR: .Fctr DSPERR-*(AV1,AV2,AV3)AV1: .Fctr DSPUTEVAV2: .Fctr DSPRMETAV3: .Fctr DSPRSXU;M; Module definitions;]'DSPACT: .Fctr SY:[1,24]RMSUTL/LB:DSPACTG'DSPARE: .Fctr SY:[1,24]RMSUTL/LB:DSPARED'DSPBAC: .Fctr SY:[1,24]RMSUTL/LB:DSPBAC 'DSPBAS: .Fctr SY:[1,24]RMSUTL/LB:DSPBAS'DSPCTL: .Fctr SY:[1,24]RMSUTL/LB:DSPCTLL'DSPDAT: .Fctr SY:[1,24]RMSUTL/LB:DSPDAT/'DSPERR: .Fctr SY:[1,24]RMSUTL/LB:DSPERR,'DSPGCM: .Fctr SY:[1,24]RMS00pqrguhwDATADATADATADATAUTL/LB:DSPGCMt'DSPHLP: .Fctr SY:[1,24]RMSUTL/LB:DSPHLP 'DSPKEY: .Fctr SY:[1,24]RMSUTL/LB:DSPKEY'DSPMAI: .Fctr SY:[1,24]RMSUTL/LB:DSPMAIV'DSPMEM: .Fctr SY:[1,24]RMSUTL/LB:DSPMEMo'DSPPAR: .Fctr SY:[1,24]RMSUTL/LB:DSPPARB'DSPPRE: .Fctr SY:[1,24]RMSUTL/LB:DSPPREB'DSPRME: .Fctr SY:[1,24]RMSUTL/LB:DSPRMEB'DSPRMS: .Fctr SY:[1,24]RMSUTL/LB:DSPRMSB'DSPRSX: .Fctr SY:[1,24]RMSUTL/LB:DSPRSXB'DSPSUB: .Fctr SY:[1,24]RMSUTL/LB:DSPSUBB'DSPUTE: .Fctr SY:[1,24]RMSUTL/LB:DSPUTEB@LB:[1,1]RMSRLX.ODL  .EndR;; RMS-11 Version 2.100; (RSX-11M/M-Plus, V2.1/4.1);:;; DSPNON - RMSDSP utility with overlayed local RMS support.;*LB:RMSDSP/CP,SY:RMSDSP/MA/-SP=SY:DSPNON/MP TASK=...DSP/R=RMSRES:RO/CNVDEF:T$MODE:4UNITS=7S TASK=...CNVT/VDEF:T$MODE:4UNITS=7K TASK=...CNVD/$$SEG6:1060GBLDEF=IE.LNF:177753PAR=RMSRES:0:0STACK=0sUNITS=0t//pdated procedure is re-run (two-staged build)A?LB:[1,1]RMSRESAB/-HD/MM/PI/LI,LB:[1,34]RMSRESAB/-SP=RMSRESAB/MP1GBLDEF=$$SEG1:00172LGBLDEF=$$SEG2:0036;/%; ODL file for the new RMSDSP utilityT;B .Root RMSROT-DSP,*ERR,*RMSALL.DSP: .Fctr ROOT-SYSSUP-DATA-*(OV1,OV2,OV3,OV4) ROOT: .Fctr DSPCTL-DSPSUB-DSPMEMGSYSSUP: .Fctr LB:[1,1]VMLIB/LB:INIDM:EXTSK-LB:[1,1]SYSLIB/LB:EDTMG-SYS1tDSYS1: .Fctr SY:[1,24]RMSUTL/LB:$CDTTA:$DIVQ:DIVD:$MULQ:$MONTB:MULUNSDATA: .Fctr DSPDAT-DSPRMSSOV1: .Fctr DSPHLPR*OV2: .Fctr DSPGCM-LB:[1,1]RMSLIB/LB:R0GCML1OV3: .Fctr DSPPAR-DSPACT-LB:[1,1]SYSLIB/LB:.TPARSY(OV4: .Fctr DSPMAI-*(OVA1,OVA2,OVA3,OVA4)OVA1: .Fctr DSPAREOVA2: .Fctr DSPBACOVA3: .Fctr DSPBASOVA4: .Fctr DSPKEY ERR: .Fctr DSPERR-*(AV1,AV2,AV3)AV1: .Fctr DSPUTEVAV2: .Fctr DSPRMETAV3: .Fctr DSPRSXU;M; Module definitions;]'DSPACT: .Fctr SY:[1,24]RMSUTL/LB:DSPACTG'DSPARE: .Fctr SY:[1,24]RMSUTL/LB:DSPARED'DSPBAC: .Fctr SY:[1,24]RMSUTL/LB:DSPBAC 'DSPBAS: .Fctr SY:[1,24]RMSUTL/LB:DSPBAS'DSPCTL: .Fctr SY:[1,24]RMSUTL/LB:DSPCTLL'DSPDAT: .Fctr SY:[1,24]RMSUTL/LB:DSPDAT/'DSPERR: .Fctr SY:[1,24]RMSUTL/LB:DSPERR,'DSPGCM: .Fctr SY:[1,24]RMSUTL/LB:DSPGCMt'DSPHLP: .Fctr SY:[1,24]RMSUTL/LB:DSPHLP 'DSPKEY: .Fctr SY:[1,24]RMSUTL/LB:DSPKEY'DSPMAI: .Fctr SY:[1,24]RMSUTL/LB:DSPMAIV'DSPMEM: .Fctr SY:[1,24]RMSUTL/LB:DSPMEMo'DSPPAR: .Fctr SY:[1,24]RMSUTL/LB:DSPPARB'DSPPRE: .Fctr SY:[1,24]RMSUTL/LB:DSPPREB'DSPRME: .Fctr SY:[1,24]RMSUTL/LB:DSPRMEB'DSPRMS: .Fctr SY:[1,24]RMSUTL/LB:DSPRMSB'DSPRSX: .Fctr SY:[1,24]RMSUTL/LB:DSPRSXB'DSPSUB: .Fctr SY:[1,24]RMSUTL/LB:DSPSUBB'DSPUTE: .Fctr SY:[1,24]RMSUTL/LB:DSPUTEB@LB:[1,1]RMS11X.ODL  .EndR .ONERR ERXIT .ENABLE SUBSTITUTION .ENABLE GLOBAL .SETF $UTYP1.; I.; GENERATE MCLBLD.CMD.;  .OPEN '$CL'MCLBLD.CMD/ .DATA ; 6 .DATA ; TKB .CMD FILE FOR KMC-11 LP MICROCODE LOADER .DATA ; '$COM' .DATA ; CREATED BY '$BLDID'T .DATA ; ( .DATA '$TK'MCL/PR/-FP/CP,'$MP'MCL/-SP= .DATA '$LI'MCL, .DATA '$TK'RSX11M.STB/SS,LB:[1,1]EXELIB/LB .DATA /A .DATA TASK=MCL...D .DATA UNITS=3 .DATA ASG=LB:1,CO:2S .DATA // .CLOSE .EXIT 1.;$.; Exit for error encountered by IND.;.ERXIT: .EXIT 4UTION .ENABLE GLOBAL .SETF $UTYP1.; I.; GENERATE MCLBLD.CMD.;  .OPEN '$CL'MCLBLD.CMD/ .DATA ; 6 .DATA ; TKB .CMD FILE FOR KMC-11 LP MICROCODE LOADER .DATA ; '$COM' .DATA ; CREATED BY '$BLDID'T .DATA ; ( .DATA '$TK'MCL/PR/-FP/CP,'$MP'MCL/-SP= .DATA '$LI'MCL, .DATA '$TK'RSX11M.STB/SS,LB:[1,1]EXELIB/LB .DATA /A .DATA TASK=MCL...D .DATA UNITS=3 .DATA ASG=LB:1,CO:2S .DATA // .CLOSE .EXIT 1.;$.; Exit for error encoun .ONERR ERXIT .ENABLE SUBSTITUTION .ENABLE GLOBAL .SETF $UTYP1.; I.; GENERATE NCTCTLBLD.CMD;.;  .OPEN '$CL'NCTCTLBLD.CMD .DATA ; < .DATA ; TKB .CMD FILE FOR TERMINAL MANAGEMENT CONTROL TASK .DATA ; '$COM' .DATA ; CREATED BY '$BLDID' .DATA ; . .DATA '$TK'NCTCTL/PR/-FP/CP,'$MP'NCTCTL/-SP= .DATA '$LI'NCTCTL., .DATA '$TK'RSX11M.STB/SS,LB:[1,1]EXELIB/LB .DATA /D .DATA TASK=NCT...  .DATA IDENT=103.00 .DATA UNITS=40 .DATA // .CLOSE .EXIT 1.;$.; E00hxyz~ .DATA ; 4 logfile print job is to be put in the hold queue2 .DATA ; 10 print job flag pages before the job/ .DATA ; 20 a lower case printer is required6 .DATA ; 100 print file flag pages before each file( .DATA ; 200 print job is restartable .DATA ; .DATA GBLDEF=LO$GDF:10e .DATA ;K .DATA ; The page length of the logfile can be set here. Place the octalAM .DATA ; value of the desired number of lines per page in the GBLDEF below.; .DATA ; .DATA GBLDEF=P$LNTH:74 .DATA ;M .DATA ; The default CPU time limit can be set here. Place the octal valueaI .DATA ; of the desired maximum CPU time in minutes per user job in the  .DATA ; GBLDEF below. .DATA ; .DATA GBLDEF=D$ELPS:3 .DATA / .CLOSEa.;.; Generate BPRBLD.ODL.; .OPEN '$CL'BPRBLD.ODL .DATA ; .DATA ; TKB .ODL FILE FOR BPR .DATA ; '$COM'c .DATA ; USING SYSLIBv .DATA ; CREATED BY '$BLDID' .DATA ;: .DATA .ROOT BPR-QMGSM-RMSROT-BPR3,BPRCT0,BPRCT1,RMSALLD .DATA BPR: .FCTR '$LI'BPR/LB:BPRRT:BPRIO:BPRSRV:BPRAST:BPRCV-BPR2< .DATA BPR2: .FCTR '$LI'BPR/LB:BPREOJ:BPRPRF:BPRSPW:BPRTOT( .DATA QMGSM: .FCTR '$LI'QMG/LB:QMGSYM3 .DATA BPR3: .FCTR *(BPF1,BPF3,BPF4,BST,BPPR,BRM)$' .DATA BPF1: .FCTR '$LI'BPR/LB:BPRPF1n' .DATA BPF3: .FCTR '$LI'BPR/LB:BPRPF3D' .DATA BPF4: .FCTR '$LI'BPR/LB:BPRPF4E% .DATA BST: .FCTR '$LI'BPR/LB:BPRST;& .DATA BPPR: .FCTR '$LI'BPR/LB:BPRPR% .DATA BRM: .FCTR '$LI'BPR/LB:BPRRM-' .DATA BOUT: .FCTR '$LI'BPR/LB:OUTREQ , .DATA BIN: .FCTR '$LI'BPR/LB:INREQ:BPRD00kyz~ .DATA ; LUN 8 = LUN W$KLUN = STATIC (SEE BELOW) FOR WORKFILE .DATA ;T .DATA ASG=TI:1:2,OV:8 .DATA TASK=...MAC .;.; IF NOT USING FCSFSL.;.IFF $FSLTK .DATA PAR='$GENB' .;.; IF USING FCSFSL.;.IFT $FSLTK .DATA PAR='$GEN'.IFT $FSLTK .DATA EXTTSK=4200S.;.IFF $FCSTK .DATA '$LIBOP' .DATA ;T .DATA ; SET STACK SIZE .DATA ; ? .DATA ; NOTE THAT STACK SIZE CONTROLS NESTED EXPRESSION DEPTH .DATA ;A .DATA STACK=192R .DATA ; > .DATA ; INHIBIT INCLUSION OF UNUSED FCS READ/WRITE LONG CODE .DATA ;S .DATA GBLDEF=..RWLG:0K .DATA ;TD .DATA ; SPECIFY GLOBAL DEFINITIONS FOR THE VIRTUAL MEMORY ROUTINES .DATA ;( .DATA GBLDEF=W$KLUN:10 ;WORK FILE LUN9 .DATA GBLDEF=N$MPAG:10 ;PAGE THRESHOLD FOR FAST SEARCHS@ .DATA GBLDEF=W$KEXT:24 ;WORK FILE EXTENSION (20. CONTIG BLKS) .DATA ; > .DATA ; SPECIFY GLOBAL DEFINITIONS TO CONTROL TASK EXPANSION0 .DATA ; (WORKS ONLY ON A MAPPED RSX-11 SYSTEM) .DATA ;>.IFT $MAPM .DATA GBLDEF=T$KINC:4100 ;TASK EXTENSION INCREMENT>.IFF $MAPM .DATA GBLDEF=T$KINC:4000 ;TASK EXTENSION INCREMENT9.IFT $MAPM .DATA GBLDEF=T$KMAX:177700 ;MAXIMUM TASK SIZEOH.IFF $MAPM .DATA GBLDEF=T$KMAX:0 ;MAXIMUM TASK SIZE (SUPPRESS EXTENDS) .DATA ;0M .DATA ; SPECIFY GLOBAL DEFINITIONS TO CONTROL INITIAL HASH TABLE ALLOCATIONI. .DATA ; FOR PERMANENT AND USER SYMBOL TABLES .DATA ;D= .DATA GBLDEF=N$PSPG:5 ;INITIAL NUMBER OF PERMANENT SYMBOLA+ .DATA ; ; TABLE PAGES. SET TO 4 IF NOM .DATA ; ; CIS SUPPORT.A8 .DATA GBLDEF=N$SYPG:30 ;INITIAL NUMBER OF USER SYMBOL) .DATA ; ; TABLE PAGES. DECREASE FORA$ .DATA ; ; SMALLER, SLOWER TASK. .DATA ;F* .DATA ; SPECIFY DEFAUL00r~
.DATA ; WHERE "OOOOOO" REPRESENTS AN OCTAL NUMBER. NOTE THAT? .DATA ; MACRO ALWAYS USES THE FIRST THREE LINES AT THE TOP OFF: .DATA ; THE PAGE FOR TITLE, SUB-TITLE, AND A BLANK LINE. .DATA ;PI .DATA ; DEFAULT FROM ASSEMBLY IS 60. LINES (3 HEADER + 57 SOURCE LINES): .DATA ;L .DATA ;U/ .DATA ; SPECIFY DEFAULT LISTING OUTPUT FORMAT .DATA ;T$ .DATA ; GBLPAT=ASSEM:LCBITS:XXXXXX .DATA ;T6 .DATA ; WHERE THE FOLLOWING BIT SIGNIFICANCE APPLIES* .DATA ; (BIT ASSERTED IMPLIES ".NLIST"): .DATA ; BEX = 2 .DATA ; BIN = 4 .DATA ; CND = 10T .DATA ; COM = 20A .DATA ; LD = 40E .DATA ; LOC = 100 .DATA ; MC = 200 .DATA ; MD = 400 .DATA ; ME = 1000T .DATA ; MEB = 2000  .DATA ; SEQ = 4000N .DATA ; SRC = 10000 .DATA ; SYM = 20000 .DATA ; TOC = 40000 .DATA ; TTM = 100000T .DATA ; + .DATA ; THE DEFAULT FROM ASSEMBLY IS 3040X .DATA ;T" .DATA GBLPAT=ASSEM:LCBITS:103040 .DATA ;E- .DATA ; SPECIFY LISTING FILE EXTENSION SIZES .DATA ;T$ .DATA ; GBLPAT=MACIO:$LSEXT:OOOOOO .DATA ;=C .DATA ; WHERE "OOOOOO" REPRESENTS AN OCTAL NUMBER (NOTE: POSITIVE0E .DATA ; MEANS CONTIGUOUS EXTEND AND NEGATIVE MEANS NON-CONTIGUOUS). .DATA ;B= .DATA ; DEFAULT FROM ASSEMBLY IS 15. NON-CONTIGUOUS BLOCKS.T .DATA ;2 .DATA ;TA .DATA ; REMOVING THE SEMICOLON FROM IN FRONT OF THE NEXT GBLPATH9 .DATA ; ALLOWS ABS PSECT SIZES TO BE STORED IN THE GSD.T> .DATA ; THIS IS DONE BY THE RT-11 ASSEMBLER AND IS THEREFORE6 .DATA ; USEFUL WHEN ASSEMBLING "NATIVE" FOR RTEM-11. .DATA ; .DATA ;GBLPAT=MACIO:ABSSZ:240O .DATA ;T8 .DATA ; ADDING A SEMICOLON IN FRONT OF THE NEXT GBLPAT; .DATA ; CHANGES THE DEFAULT FOR THE LISTING FILE FROM /SP .DATA ; TO /-SP. .DATA ;  .DATA GBLPAT=MACIO:SPOPT:0 .DATA ;2 .DATA /T .CLOSE.;.; Generate MACBLD.ODL.; .OPEN '$CL'MAC'$TYP1'BLD.ODL .DATA ;S4 .DATA ; TKB ODL FILE FOR THE HASH SYMBOL TABLE MAC .DATA ; '$COM''.IFF $FCSTK .DATA ; LINKING TO '$RSLIB'T .IFT $FCSTK .DATA ; USING SYSLIB .DATA ; CREATED BY '$BLDID'D .DATA ;= .DATA .ROOT MROOT,COTREE .DATA  .DATA .NAME MACROA.IFT $FCSTK .DATA MROOT: .FCTR MACRO-R1-R2-R3-R4-V-S1-*(O1,O2,O3)T>.IFF $FCSTK .DATA MROOT: .FCTR MACRO-R1-R2-R3-R4-V-*(O1,O2,O3) .DATA A .DATA R1: .FCTR '$LI'MAC/LB:MACRO:MROOT:CODHD:ENDLN:EXPRS:GETLNL/ .DATA R2: .FCTR '$LI'MAC/LB:LSTNG:ROLHD:SYMBL2 .DATA R3: .FCTR '$LI'MAC/LB:READ:WRITE:CRFIO:PST< .DATA R4: .FCTR '$LI'MAC/LB:PROSW:PROCSI:SPACE:NDRCT:GMARG( .DATA V: .FCTR '$LI'MAC/LB:VMRES:EXTSKG.IFT $FCSTK .DATA S1: .FCTR LB:[1,1]SYSLIB/LB:SAVR1:.ODCVT:RQLCB:ASSLUN  .DATA *.IFT $FCSTK .DATA O1: .FCTR P1-P2-P3-F1-V3'.IFF $FCSTK .DATA O1: .FCTR P1-P2-P3-V3F .DATA  .DATA .NAME MACIO .DATA .PSECT ERRMG0,D,GBL@ .DATA P1: .FCTR MACIO-'$LI'MAC/LB:INFIL:INIFL:INOFL-CRF-ERRMG0 .DATA .PSECT CRFSEC,D,GBL, .DATA CRF: .FCTR '$LI'MAC/LB:CRFFIL-CRFSEC .DATA ) .DATA P2: .FCTR LB:[1,1]SYSLIB/LB:.GCML  .DATA ; .DATA P3: .FCTR '$LI'MAC/LB:SETDN:ENDPS:ISDMP:SETMX:R5UNPB .DATA 9.IFT $FCSTK .DATA F1: .FCTR LB:[1,1]SYSLIB/LB:.CSI1:.CSI2C .DATA # .DATA V3: .FCTR '$LI'MAC/LB:INIVM1 .DATA  .DATA  .DATA O2: .FCTR P4-P5-P6-P7  .DATA ? .DATA P4: .FCTR '$LI'MAC/LB:MACRS:MLIBS:SETDIR:MCALL:REPT-P4A2 .DATA P4A: .FCTR '$LI'MAC/LB:MACROC:MACROD:MPUSH .DATA / .DATA P5: .FCTR '$LI'MAC/LB:CNDTL:DATDR:MSCDRC .DATA  .DATA P6: .FCTR P61-P62 * .DATA P61: .FCTR '$LI'MAC/LB:STMNT:PROPC+ .DATA P62: .FCTR '$LI'MAC/LB:SETIMM:WORDBD .DATA  .DATA .PSECT EDTSEC,D,GBL .DATA .PSECT LCTSEC,D,GBL .DATA .PSECT LSBTST,I,GBLJ .DATA P7: .FCTR '$LI'MAC/LB:SETMX:ENBDS:SECTR:LISTC-EDTSEC-LCTSEC-LSBTST .DATA  .DATA  .DATA .PSECT PSTSEC,D,GBL+ .DATA O3: .FCTR '$LI'MAC/LB:HSHPST-PSTSEC .DATA  .DATA  .DATA .NAME FCS/.IFT $FCSTK .DATA COTREE: .FCTR FCS-*(F3,F4,F5)C,.IFF $FCSTK .DATA COTREE: .FCTR FCS-*(F3,F5) .DATA  .DATA F3: .FCT00rrTADATADATAR R5-CL1 .DATA .NAME ASSEM .DATA .PSECT ERRMSG,D,GBLR .DATA R5: .FCTR ASSEM-'$LI'MAC/LB:ASSEM:INIDM:OPTERR-'$LI'PIPUTL/LB:GTKNM-ERRMSG9.IFT $FCSTK .DATA CL1: .FCTR LB:[1,1]SYSLIB/LB:CLOSE:C5TAC3.IFF $FCSTK .DATA CL1: .FCTR LB:[1,1]SYSLIB/LB:C5TAD .DATA B.IFT $FCSTK .DATA F4: .FCTR LB:[1,1]SYSLIB/LB:OPFNB-OP1-OP2-OP3-F24.IFT $FCSTK .DATA OP1: .FCTR LB:[1,1]SYSLIB/LB:FINITE.IFT $FCSTK .DATA OP2: .FCTR LB:[1,1]SYSLIB/LB:CREATE:DEL:MKDL:DIRECTR5.IFT $FCSTK .DATA OP3: .FCTR LB:[1,1]SYSLIB/LB:RDWAITC9.IFT $FCSTK .DATA F2: .FCTR LB:[1,1]SYSLIB/LB:PARSE:XQIOUD.IFT $FCSTK .DATA X.IFT $FCSTK .DATA F5: .FCTR LB:[1,1]SYSLIB/LB:GETSQ:PUTSQ:PNTMRK-RW1-GP1-GP2-P43-P63-P64'.IFF $FCSTK .DATA F5: .FCTR P43-P63-P64 9.IFT $FCSTK .DATA RW1: .FCTR LB:[1,1]SYSLIB/LB:READ:WRITEC5.IFT $FCSTK .DATA GP1: .FCTR LB:[1,1]SYSLIB/LB:RDWAIT-5.IFT $FCSTK .DATA GP2: .FCTR LB:[1,1]SYSLIB/LB:WTWAITT% .DATA P43: .FCTR '$LI'MAC/LB:SCNLIBS$ .DATA P63: .FCTR '$LI'MAC/LB:FLOAT% .DATA P64: .FCTR '$LI'MAC/LB:PACKED/ .DATA .DATA .ENDD .CLOSE .EXIT 1].;$.; Exit for error encountered by IND.;.ERXIT: .EXIT 4: .FCTR LB:[1,1]SYSLIB/LB:GETSQ:PUTSQ:PNTMRK-RW1-GP1-GP2-P43-P63-P64'.IFF $FCSTK .DATA F5: .FCTR P43-P63-P64 9.IFT $FCSTK .DATA RW1: .FCTR LB:[1,1]SYSLIB/LB:READ:WRITEC5.IFT $FCSTK .DATA GP1: .FCTR LB:[1,1]SYSLIB/LB:RDWAIT-5.IFT $FCSTK .DATA GP2: .FCTR LB:[1,1]SYSLIB/LB:WTWAITT% .DATA P43: .FCTR '$LI'MAC/LB:SCNLIBS$ .DATA P63: .FCTR '$LI'MAC/LB:FLOAT% .DATA P64: .FCTR '$LI'MAC/LB:PACKED/ S3: .FCTR LB:[1,24]RMSUTL/LB:B16FTN:B16SAV:B16STPV; .NAME RMSACC;COTRE1: .FCTR RMSACC-*RMSALLe .NAME ERRMSGSCOTRE3: .FCTR ERRMSG-ERROR;M ; The overlayR;C .NAME OVRLAYD%COTRE1: .FCTR OVRLAY-*(OVER1A,OVER1B)R .NAME OVR1AOVER1A: .FCTR *(OVR1-DESSUP) .NAME OVR2SOVER1B: .FCTR *(OVR2-RMSALL) .NAME OVRLAA%COTRE2: .FCTR OVRLAA-*(OVER2A,OVER2B)- .NAME OVR2A,OVER2A: .FCTR DESCLC-*(OVE2A1,OVE2A2,OVE2A3) .NAME OVR2A14OVE2A1: .FCTR OVR2A1-DESCRE .NAME OVR2A2/"OVE2A2: .FCTR OVR2A2-DESSET-DESALL .NAME OVR2A3B,OVE2A3: .FCTR OVR2A3-DESSAV-DESSHA-*(OV2A3B); .NAME OVR23A;OV2A3A: .FCTR OVR23A-DESSAV .NAME OVR23BE"OV2A3B: .FCTR OVR23B-DESSHO-DESGVL .NAME OVR2B+OVER2B: .FCTR OVR2B-*(DESGET-DESOPE,DESCLR)A;R; DES component definitionsA;O+DESALL: .FCTR LB:[1,24]RMSUTL/LB:DESALL.OBJV+DESDEC: .FCTR LB:[1,24]RMSUTL/LB:DESDEC.OBJ+DESMAI: .FCTR LB:[1,24]RMSUTL/LB:DESMAI.OBJV+DESSHA: .FCTR LB:[1,24]RMSUTL/LB:DESSHA.OBJV+DESCLC: .FCTR LB:[1,24]RMSUTL/LB:DESCLC.OBJV+DESOPE: .FCTR LB:[1,24]RMSUTL/LB:DESOPE.OBJF+DESSHO: .FCTR LB:[1,24]RMSUTL/LB:DESSHO.OBJV+DESCLR: .FCTR LB:[1,24]RMSUTL/LB:DESCLR.OBJR+DESGET: .FCTR LB:[1,24]RMSUTL/LB:DESGET.OBJ+DESSAV: .FCTR LB:[1,24]RMSUTL/LB:DESSAV.OBJS+DESSUP: .FCTR LB:[1,24]RMSUTL/LB:DESSUP.OBJn+DESCRE: .FCTR LB:[1,24]RMSUTL/LB:DESCRE.OBJL+DESGVL: .FCTR LB:[1,24]RMSUTL/LB:DESGVL.OBJE+DESSET: .FCTR LB:[1,24]RMSUTL/LB:DESSET.OBJA+DESDAT: .FCTR LB:[1,24]RMSUTL/LB:DESDAT.OBJH;V; Error message handlerR;TBERROR: .FCTR *(EDMSG,ERR1,ERR2,ERR3,ERR4,ERR5,ERR6,ERR7,ERR8,ERR9)ERR1: .FCTR (ER0-ER4)TERR2: .FCTR (ER1-ER2)RERR3: .FCTR (ER3-ER5)/ERR4: .FCTR (ER6-ER7) ERR5: .FCTR (ER8-ER9)BERR6: .FCTR (ERG-ERA)FERR7: .FCTR (ERB-ERC)DERR8: .FCTR (ERD-ERE)TERR9: .FCTR (ERF-ERH)S$ER0: .FCTR LB:[1,24]RMSUTL/LB:DESER0$ER1: .FCTR LB:[1,24]RMSUTL/LB:DESER1$ER2: .FCTR LB:[1,24]RMSUTL/LB:DESER2$ER3: .FCTR LB:[1,24]RMSUTL/LB:DESER3$ER4: .FCTR LB:[1,24]RMSUTL/LB:DESER4$ER5: .FCTR LB:[1,24]RMSUTL/LB:CNVER5$ER6: .FCTR LB:[1,24]RMSUTL/LB:CNVER6$ER7: .FCTR LB:[1,24]RMSUTL/LB:CNVER7$ER8: .FCTR LB:[1,24]RMSUTL/LB:CNVER8$ER9: .FCTR LB:[1,24]RMSUTL/LB:CNVER9$ERA: .FCTR LB:[1,24]RMSUTL/LB:CNVERA$ERB: .FCTR LB:[1,24]RMSUTL/LB:CNVERB$ERC: .FCTR LB:[1,24]RMSUTL/LB:CNVERC$ERD: .FCTR LB:[1,24]RMSUTL/LB:CNVERD$ERE: .FCTR LB:[1,24]RMSUTL/LB:CNVERE$ERF: .FCTR LB:[1,24]RMSUTL/LB:CNVERF$ERG: .FCTR LB:[1,24]RMSUTL/LB:CNVERG$ERH: .FCTR LB:[1,24]RMSUTL/LB:CNVERH$EDMSG: .FCTR LB:[1,1]SYSLIB/LB:EDTMG@LB:[1,1]RMS11X.ODL: .END:00~; record operations, plus the common internal EXTEND function:;I*SEG2: .FCTR SEQALL-SG2-SCOM-GENFNC-BIO-XTD#SG2: .FCTR LB:[1,1]RMSLIB/LB:RMSEG2FCSCOM: .FCTR LB:[1,1]RMSLIB/LB:R1NXBK:R1RLBK-SCLO-SCD-SDEL-STRN-SGPUB$SCLO: .FCTR LB:[1,1]RMSLIB/LB:R1CLOS*SCD: .FCTR LB:[1,1]RMSLIB/LB:R1CONP:R1DISC$SDEL: .FCTR LB:[1,1]RMSLIB/LB:R1DELE$STRN: .FCTR LB:[1,1]RMSLIB/LB:R1TRUN.SGPU: .FCTR LB:[1,1]RMSLIB/LB:R1CKEF-SGET-SPUD1SGET: .FCTR LB:[1,1]RMSLIB/LB:R1GBLD:R1GET:R1GSET,FSPUD: .FCTR LB:[1,1]RMSLIB/LB:R1PBLD:R1PSET:R1PUNR:R1PUT:R1UBLD:R1UPDA;GENFNC: .FCTR LB:[1,1]RMSLIB/LB:R0FREE:R0MAGT:R0RWIN:R0WATRE#BIO: .FCTR LB:[1,1]RMSLIB/LB:R0RWBII#XTD: .FCTR LB:[1,1]RMSLIB/LB:R0XPFNL .END1;S; RMSLBL.ODL - RMS-11 V2.0;IL; ODL to build 'C'/'D' segment satellite region RMSLBL for use with RMSRESAB;3 .NAME DUMMY .NAME RELALLB .NAME INDEX1: .ROOT DUMMY-*!(SEG3,SEG4);TF; The SEG3 library segment supports all Relative file operations, plusC; the $EXTEND function (included here so that it can share R2BFMT):a;s1SEG3: .FCTR RELALL-SG3-RELFIL-RELCD-RELREC-EXTENDT#SG3: .FCTR LB:[1,1]RMSLIB/LB:RMSEG3e4RELFIL: .FCTR LB:[1,1]RMSLIB/LB:R2CLOS:R2OPFL:R2WPLG,RELCD: .FCTR LB:[1,1]RMSLIB/LB:R2CONP:R2DISC;RELREC: .FCTR LB:[1,1]RMSLIB/LB:R2BFMT:R2EXTD:R2FIND-RELRC1g<RELRC1: .FCTR LB:[1,1]RMSLIB/LB:R2GSET:R2IOCK-RDEL-RGET-RPUD$RDEL: .FCTR LB:[1,1]RMSLIB/LB:R2DELE#RGET: .FCTR LB:[1,1]RMSLIB/LB:R2GETg1RPUD: .FCTR LB:[1,1]RMSLIB/LB:R2PSET:R2PUT:R2UPDA 6EXTEND: .FCTR LB:[1,1]RMSLIB/LB:R0EXT0-RMSROTAB.STB/SS;B;)I; The SEG4 library segment supports Indexed file $OPEN, $CLOSE, $CONNECT,1*; $DISCONNECT, $FIND, and $GET operations:;L#SEG4: .FCTR INDEX1-SG4-IOCCD-IDXGETC#SG4: .FCTR LB:[1,1]RMSLIB/LB:RMSEG4E:IOCCD: .FCTR LB:[1,1]RMSLIB/LB:R3OPFL:R3CLOS:R3CONP:R3DISC;IDXGET: .FCTR LB:[1,1]RMSLIB/LB:R3FIND:R3FRKE:R3FRRF-IDXGT1AIDXGT1: .FCTR LB:[1,1]RMSLIB/LB:R3FRSE:R3GET:R3GRPT:R3GSET-IDXGT2:DIDXGT2: .FCTR LB:[1,1]RMSLIB/LB:R3GTRE:R3POSE:R3POSR-RMSROTAB.STB/SS .END[00tq; The SEG5 library segment supports Indexed file $DELETE/$PUT/; $UPDATE operations:T;P2SEG5: .FCTR INDEX2-SG5-COMDPU-COMPU-IDEL-IPUT-IUPD#SG5: .FCTR LB:[1,1]RMSLIB/LB:RMSEG5S4COMDPU: .FCTR LB:[1,1]RMSLIB/LB:R3DLSI:R3RPLC:R3SKDLACOMPU: .FCTR LB:[1,1]RMSLIB/LB:R3BSRT:R3FPAT:R3ISID:R3ISDI-COMPU1M-COMPU1: .FCTR LB:[1,1]RMSLIB/LB:R3MKID:R3SSPLD+IDEL: .FCTR LB:[1,1]RMSLIB/LB:R3DELE:R3DSETR2IPUT: .FCTR LB:[1,1]RMSLIB/LB:R3PIXC:R3PUTL:R3PSET;IUPD: .FCTR LB:[1,1]RMSLIB/LB:R3UPDL:R3USET-RMSROTAB.STB/SS ; ; J; The SEG6 library segment supports data record insertion and index-updateJ; for Indexed $PUT/$UPDATE, plus the bucket allocation routine and indexed ; $CREATE:;R*SEG6: .FCTR INDEX3-SG6-ICRE-IUDR-UIDX-ALOC#SG6: .FCTR LB:[1,1]RMSLIB/LB:RMSEG61$ICRE: .FCTR LB:[1,1]RMSLIB/LB:R3WPLG?IUDR: .FCTR LB:[1,1]RMSLIB/LB:R3BRRV:R3BSPL:R3BSRT:R3IUDC-IUDR1F3IUDR1: .FCTR LB:[1,1]RMSLIB/LB:R3IUDI:R3IUDL:R3URRV[@UIDX: .FCTR LB:[1,1]RMSLIB/LB:R3IKEY:R3IKYI:R3KSPL:R3ROOT:R3UIDL4ALOC: .FCTR LB:[1,1]RMSLIB/LB:R3ALOL-RMSROTAB.STB/SS .ENDg .ONERR ERXIT .ENABLE SUBSTITUTION .ENABLE GLOBAL.;1.; Modified for RSX-11M-PLUS / Micro/RSX V4.3 by: .;.; L. B. McCulley 20-Oct-89I2.; LBM215 -- Conditionalize for Micro inst system.;%.; Modified for RSX-11M-PLUS V4.4 by:o.;!.; J. C. Franzini 4-Sep-90 06.01I2.; JCF396 -- Add .TSK for SYSGEN under VAX-11 RSX.; .; L. M. Peterson 4-Apr-91 06.02;.; LMP162 -- Fix INS version for Micro installation system$.;%.; Modified for RSX-11M-PLUS V4.6 by:F.;.; D. Carroll 26-Mar-1998 07.00O,.; DC501 -- Include support for 32-bit LBNs.;.;.; Generate BADBLD.CMD.; L .SETF $UTYP1!.IFF $MINST .OPEN '$CL'BADBLD.CMDO$.IFT $MINST .OPEN '$CL'BADINSBLD.CMD .DATA ; " .DATA ; TKB COMMAND FILE FOR BAD .DATA ; '$COM' .DATA ; USING SYSLIB .DATA ; CREATED BY '$BLDID'd .DATA ; E.IFT $MINST .DATA '$TK'BADINS/-SG/-FP/CP/PR:0'$MMSW','$MP'BADINS/-SP=2M.IFF $IAS .IFF $MINST .DATA '$TK'BAD.TSK/-SG/-FP/CP/PR:0'$MMSW','$MP'BAD/-SP=-7.IFT $IAS .DATA '$TK'BAD/-FP/CP/PR'$MUSW','$,SY:3:4:5:6  .DATA PAR='$GEN'B.IFF $FCSTK .DATA '$LIBOP'E6 .DATA GBLDEF=A$UDEF:10 ;DEFAULT SIZE OF AUDIT TRAIL- .DATA GBLDEF=L$LGTH:130 ;DEFAULT LINE SIZE;) .DATA GBLDEF=P$GLGH:67 ;LINES PER PAGER .DATA ;" .DATA ; SLP ACTION CONTROL WORD .DATA ;H .DATA ; THE FOLLOWING WORD DETERMINES WHAT SLP WILL DO BY DEFAULT. ITI .DATA ; IS DETERMINED IN THE BUILD FILE VIA GBLDEF=D$FLTS:X WHERE X IS'8 .DATA ; THE DEFAULTS TO BE WRITTEN TO THE SWITCH WORD% .DATA ; SOME IMPORTANT VALUES ARE:: .DATA ;# .DATA ; X=000000 NORMAL BEHAVIORL= .DATA ; X=020000 DEVELOPMENT SLP - INFERS /SQ ON ALL FILESA .DATA ; X=100001 BASE-LEVEL SLP - INFERS /-AU,/NS ON ALL FILESL .DATA ;2 .DATA GBLDEF=D$FLTS:100001 ;DEFAULT SWITCH WORD .DATA ;1 .DATA EXTSCT=$$AUD0:20 ;MAX AUDIT TRAIL LENGTHA) .DATA EXTSCT=$$LNB0:204 ;MAX LINE SIZE .DATA / .CLOSE .;.; GENERATE SLNBLD.ODL.; .OPEN '$CL'SLN'$TYP1'BLD.ODLB .DATA ; .DATA ; TKB ODL FILE FOR SLN  .DATA ; '$COM'E(.IFF $FCSTK .DATA ; LINKING TO '$RSLIB'!.IFT $FCSTK .DATA ; USING SYSLIBE .DATA ; CREATED BY '$BLDID' .DATA ; .DATA .NAME SLP%.IFT $FCSTK .DATA .ROOT SLPTR,FCSTRL.IFF $FCSTK .DATA .ROOT SLPTRL2.IFT $FCSTK .DATA SLPTR: .FCTR SLP-R1-R2-*(O1,O2)/.IFF $FCSTK .DATA SLPTR: .FCTR SLP-R1-R2-O1-O2A= .DATA R1: .FCTR '$LI'SLP/LB:SLPR11:CMPRS:GETLN:GTSLP:IOSLP;> .DATA R2: .FCTR '$LI'SLP/LB:PUTLN:ERSLP:SLPSB:SLPCRC:SLPPRE .DATA ;* .DATA O1: .FCTR '$LI'SLP/LB:OPNFL:SCSLPG00}eTADATADATA.IFF $FCSTK .DATA O2: .FCTR '$LI'SLP/LB:POSIT-LB:[1,1]SYSLIB/LB:.TPARSUG.IFT $FCSTK .DATA O2: .FCTR '$LI'SLP/LB:POSIT-LB:[1,1]SYSLIB/LB:.TPARS .IFT $FCSTK .DATA ;.IFT $FCSTK .DATA ;.IFT $FCSTK .DATA .NAME FCST5.IFT $FCSTK .DATA FCSTR: .FCTR FCS-*(F1,F2,F3,F4,F5)4.IFT $FCSTK .DATA F1: .FCTR LB:[1,1]SYSLIB/LB:PARSE4.IFT $FCSTK .DATA F2: .FCTR LB:[1,1]SYSLIB/LB:OPFNB@.IFT $FCSTK .DATA F3: .FCTR LB:[1,1]SYSLIB/LB:.CSI1:.CSI2:OD2CT:.IFT $FCSTK .DATA F4: .FCTR LB:[1,1]SYSLIB/LB:GETSQ:PUTSQ@.IFT $FCSTK .DATA F5: .FCTR LB:[1,1]SYSLIB/LB:CLOSE:DSPAT:DLFNB.IFT $FCSTK .DATA ; .DATA .END .CLOSEP .EXIT 1.;$.; Exit for error encountered by IND.;.ERXIT: .EXIT 4IFT $FCSTK .DATA .NAME FCST5.IFT $FCSTK .DATA FCSTR: .FCTR FCS-*(F1,F2,F3,F4,F5)4.IFT $FCSTK .DATA F1: .FCTR LB:[1,1]SYSLIB/LB:PARSE4.IFT $FCSTK .DATA F2: .FCTR LB:[1,1]SYSLIB/LB:OPFNB@.IFT $FCSTK .DATA F3: .FCTR LB:[1,1]SYSLIB/LB:.CSI1:.CSI2:OD2CT:.IFT $FCSTK .DATA F4: .FCTR LB:[1,1]SYSLIB/LB:GETSQ:PUTSQ .ONERR ERXITA .ENABLE SUBSTITUTIONI .ENABLE GLOBALF .SETT $UTYP1..;.; Generate PRTBLD.CMD.; .OPEN '$CL'PRT'$TYP1'BLD.CMDr .DATA ; .DATA ; TKB .CMD FILE FOR PRT .DATA ; '$COM'N(.IFF $FCSTK .DATA ; LINKING TO '$RSLIB'!.IFT $FCSTK .DATA ; USING SYSLIB  .DATA ; CREATED BY '$BLDID' .DATA ;> .DATA '$TK'PRT'$TYP2'/-FP/CP/SL'$MMSW','$MP'PRT'$TYP2'/-SP= .DATA '$OD'PRT'$TYP1'BLD/MP .DATA TASK=PRT... .DATA STACK=64F .DATA UNITS=4 .DATA ASG=TI:2Q .DATA ASG=LP:3 .DATA PAR='$PRPAR'I .DATA PRI=70A .DATA UIC=[10,1].IFF $FCSTK .DATA '$LIBOP';".IFT $FCSTK .DATA GBLDEF=$CDDMG:0 .DATA ;A .DATA ; SPECIFY FLAG TO CONTROL THE PRINTING OF FILE FLAG PAGE.B .DATA ; THE VALUE IN $FLAG IS THE NUMBER OF FLAG PAGES TO PRINT .DATA ;? .DATA ; GBLPAT=PRT:$FLAG:1 TO ENABLE PRINTING OF 1 FLAG PAGEM> .DATA ; PRT:$FLAG:0 TO DISABLE PRINTING OF FLAG PAGE .DATA ;; .DATA ; DEFAULT FROM ASSEMBLY IS PRINTING OF 1 FLAG PAGE .DATA ; .DATA GBLPAT=PRT:$FLAG:1I .DATA ; .DATA ;: .DATA ; SPECIFY SPACING (IN DOUBLE LINES) IN FLAG PAGE.0 .DATA ; FLAG PAGE LENGTH = 34 + (6 * $LINSP). .DATA ;@ .DATA ; GBLPAT=FLGEN:$LINSP:3 TO MAKE FLAG PAGE 52 LINES LONG .DATA ;J .DATA ; DEFAULT FROM ASSEMBLY IS 4, MAKING THE FLAG PAGE 58 LINES LONG. .DATA ; .DATA GBLPAT=FLGEN:$LINSP:4 .DATA ; .DATA ;H .DATA ; SPECIFY WHETHER A TRAILING FORM FEED SHOULD BE OUTPUT OR NOT.J .DATA ; (A TRAILING FORM FEED IS USEFUL ON LV-11 ELECTROSTATIC PRINTERS2 .DATA ; TO AVOID A BLACK BAR ON THE LAST PAGE). .DATA ;C .DATA ; GBLPAT=PRT:$TFF:1 TO ENABLE OUTPUT OF TRAILING FORM FEED.D .DATA ; PRT:$TFF:0 TO DISABLE OUTPUT OF TRAILING FORM FEED .DATA ;@ .DATA ; DEFAULT FROM ASSEMBLY IS TRAILING FLAG PAGE DISABLED. .DATA ; .DATA GBLPAT=PRT:$TFF:0 .DATA ; .DATA ;G .DATA ; DEFINE DEFAULT MODULE TO DETERMINE WHETHER INPUT FILE SHOULDBI .DATA ; BE DELETED. IF USER-WRITTEN MODULE IS SUPPLIED, PRT WILL CALLRK .DATA ; IT WITH THE FILE FDB ADDRESS IN R0 (R0 MUST BE PRESERVED). USERAD .DATA ; SUPPLIED $DELCK MUST RETURN C-BIT SET TO DELETE THE FILE. .DATA ;G .DATA ; TO INCLUDE USER-SUPPLIED $DELCK, INSERT THE OBJECT MODULE INC .DATA ; PRT.OLB AND DELETE THE FOLLOWING GLOBAL DEFINITION LINE.. .DATA ; .DATA GBLDEF=$DELCK:0 .DATA ;I .DATA ; IN THE ABSENCE OF A USER-SUPPLIED $DELCK MODULE, THE FOLLOWINGS? .DATA ; GLOBAL PATCHES MAY BE USED TO CONTROL FILE DELETION:D .DATA ;8 .DATA ; GBLPAT=PRT:$DELET:1 TO ENABLE FILE DELETION9 .DATA ; PRT:$DELET:0 TO DISABLE FILE DELETIONE .DATA ;; .DATA ; DEFAULT FROM ASSEMBLY IS FILE DELETION ENABLED!!R .DATA ;I .DATA ; NOTE: WHEN FILE DELETION IS DISABLED, THE FOLLOWING FILES WILLW .DATA ; STILL BE DELETED: .DATA ; .DATA ; LP.LST;* .DATA ; LP.MAP;* .DATA ; *.DMP;*F .DATA ; *.PMD;*C .DATA ; .DATA GBLPAT=PRT:$DELET:0 .DATA / .CLOSEO.;00"u%q.IFT $FCSTK .DATA DEL: .FCTR '$LI'PRT/LB:PRTDN-'$LI'PRT/LB-S2<.IFF $FCSTK .DATA DEL: .FCTR '$LI'PRT/LB:PRTDN-'$LI'PRT/LB :.IFT $FCSTK .DATA S2: .FCTR LB:[1,1]SYSLIB/LB:DLFNB:CLOSE .DATA $ .DATA .END .CLOSE[ .EXIT 1.;$.; Exit for error encountered by IND.;.ERXIT: .EXIT 4DWAIT6.IFT $FCSTK .DATA OP3: .FCTR LB:[1,1]SYSL;; RMS-11 Version 2.000; (RSX-11M/M-Plus, V2.0/4.0);F; RMSODL - Utilities common ODL providing overlayed local RMS support.;;+;; RMS11 ODL NAMING CONVENTIONS; ; ODL NAMES;; RMNXYZ.ODL WHERE:;!; N = TYPE OF OVERLAY ENVIRONMENT/; 0 -- NO RESIDENT LIBRARY OR RUN-TIME SYSTEM,; 1 -- RESIDENT LIBRARY OR RUN-TIME SYSTEM;; A = SYSTEM ENVIRONMENT ; 0 -- SYNCHRONOUS; 1 -- ASYNCHRONOUS;; B = FILE ORGANIZATION; 1 -- SEQUENTIAL; 2 -- RELATIVE; 3 -- INDEXED;r; C = OPERATION SUPPORTP; 0 -- FILE OPEN; 1 -- FILE CREATION; 2 -- INPUT ($GET,$FIND)o; 4 -- OUTPUT ($PUT).; 6 -- I/O ($GET,$FIND,$PUT,$UPDATE,$DELETE);E; ODL FILE CONVENTIONS;<; WHENEVER AN A, B, OR C DOES NOT APPLY, THEN AN "X" IS USED ; EXAMPLE:?; RM013X.ODL = SELECTS THE ASYNC ENVIRONMENT WITH INDEX SUPPORT3; BUT CONTAINS NO OPERATION SUPPORT ODL INFORMATION ; *; THE INTERNAL ODL FILES CONTAIN DIRECTORY; SPECIFICATIONS AS FOLLOWS:; [1,1] FOR RMSLIB.OLB;X8; ******************************************************/; THIS PROTOTYPE ODL IS TO BE USED IN THE .ROOT#; STATEMENT OF THE USER PROGRAM ODL(8; ******************************************************;;-;H7; NOTE: IF ALL RMS SYMBOLS ARE LOCALLY DEFINED THEN THE3; LB:[1,1]RMSLIB/LB:RMSSYM REFERENCE MAY BE DELETEDE; IN THE RMSXXX FACTOR BELOW;T6; CHANGE THE RMSXXX FACTOR NAME TO THE FACTOR NAMED IN5; YOUR TASK'S ODL .ROOT STATEMENT, AND REFERENCE THIS >; FILE BY THE NAME YOU GAVE IT BY @LB:[1,24]LB:FILENAME AT THE*; LEFT HAND MARGIN OF YOUR TASK'S ODL FILE;Y0; CHANGE THE RMXXXX TERM TO ONE OF THE FOLLOWING*; RM0X0X, RM0X3X, OR RMS11X AND DELETE ALL*; REQUIRED SEMICOLLONS (;) FROM THE FACTOR; STATEMENTS BELOW.R;SRMSROT: .FCTR RM0X3X;D; NO INDEX-IO REQUIRED;B0;RM0X0X: .FCTR RMSIO-RMSCBL-RMSCOM-RMSCM1-RMSEXC; ; INDEX-IO REQUIREDH;E6RM0X3X: .FCTR RMSIO-RMSCBL-RMSCOM-RMSCM1-RMSEXC-UTLIDX;'6; THE FOLLOWING IS TO BE USED IF LINKING TO A RESIDENT?; LIBRARY OR RUN-TIME SYSTEM (RSTS/E ) WHICH CONTAINS NECESSARYA; RMS11 ROOT CODE.7; NOTE: DELETE THE RMSIX0 TERM IF INDEX-IO NOT REQUIREDO;G;RMS11X: .FCTR RMSCM1-RMSIX0; 'UTLIDX: .FCTR LB:[1,24]RMSUTL/LB:IDXORGOARMSIO: .FCTR LB:[1,1]RMSLIB/LB:R0CACH:R0RLCH:R0MAPC:R0RWBF:R0UNLK ;RMSCBL: .FCTR LB:[1,1]RMSLIB/LB:R0RTCB:R0ACBB:R0RTDB:R0MDATR4RMSCOM: .FCTR LB:[1,1]RMSLIB/LB:R0RMSE:R0SAVR:R0IDPB.;RMSCM1: .FCTR LB:[1,1]RMSLIB/LB:R0AUTL:RMSSYM4RMSCM1: .FCTR LB:[1,1]RMSLIB/LB:R0AUTO:R0IMPA:RMSSYM;; SYNC S00u*}eTADATADATAYSTEMS;MBRMSEXC: .FCTR LB:[1,1]RMSLIB/LB:R0EXSY:R0RSES:R0WTBS:R0RMSA:R0IFLF;E(; ASYNC SYSTEMS (RSX BASED SYSTEMS ONLY);I2; (V2.0: RMS utilities are no longer asynchronous)C;RMSEXC: .FCTR LB:[1,1]RMSLIB/LB:R0EXEC:R0RSET:R0WATB:R0RMSA:R0IFLFC;0A; THE FOLLOWING FACTOR IS ONLY NEEDED IF INDEX-IO IS REQUIRED ANDR*; IF LINKING WITH THE RESIDENT LIBRARY ...;L.;RMSIX0: .FCTR LB:[1,1]RMSLIB/LB:R0RLSB:R0GETB;+;I; RMS11 ODL NAMING CONVENTIONS;B ; ODL NAMESL;0; RMNXYZ.ODL WHERE:; !; N = TYPE OF OVERLAY ENVIRONMENT[/; 0 -- NO RESIDENT LIBRARY OR RUN-TIME SYSTEM,; 1 -- RESIDENT LIBRARY OR RUN-TIME SYSTEM;; A = SYSTEM ENVIRONMENT n; 0 -- SYNCHRONOUS; 1 -- ASYNCHRONOUS1;S; B = FILE ORGANIZATIONT; 1 -- SEQUENTIAL; 2 -- RELATIVET; 3 -- INDEXED;I; C = OPERATION SUPPORT; 0 -- FILE OPEN; 1 -- FILE CREATION; 2 -- INPUT ($GET,$FIND)S; 4 -- OUTPUT ($PUT).; 6 -- I/O ($GET,$FIND,$PUT,$UPDATE,$DELETE);E; ODL FILE CONVENTIONS;<; WHENEVER AN A, B, OR C DOES NOT APPLY, THEN AN "X" IS USED ; EXAMPLE:9; RM013X.ODL = SELECTS THE ASYNC ENVIR WITH INDEX SUPPORTT3; BUT CONTAINS NO OPERATION SUPPORT ODL INFORMATIONO;*; THE INTERNAL ODL FILES CONTAIN DIRECTORY; SPECIFICATIONS AS FOLLOWS:; [1,1] FOR RMSLIB.OLB;-8; ******************************************************4; THIS PROTOTYPE ODL IS TO BE USED AS AN INDEPENDENT*; OVERLAY OR CO-TREE IN A USER PROGRAM ODL8; ******************************************************;2; REMOVE ALL SEMICOLONS (;) THAT APPLY AND REPLACE&; ALL "XXXX" WITH DESIRED FACTOR NAMES;S;-;Y .NAME RMS11 .NAME RMSFAB .NAME RMSRABN .NAME RMSCREP .NAME RMSCD .NAME RMOPINH .NAME RMSSEQF .NAME RMSRELR .NAME R2GUPDF .NAME RMSIDXL .NAME RMSBMC .NAME RMSMIS .NAME RMDEXT* .NAME RMDRLB* .NAME RMDWTL*;*<; **********************************************************; (; RMSLE (FAB) FUNCTIONS - COMMON FACTORS;*RMSFIL: .FCTR RMSFAB-RMSFL3RMSFL: .FCTR LB:[1,1]RMSLIB/LB:R0CLCM-RMFILE-RMSFL0 BRMSFNM: .FCTR LB:[1,1]RMSLIB/LB:R0PRFN:R0XPFN:R0MKWA:R0ASLN-RMSFL14RMSDPC: .FCTR LB:[1,1]RMSLIB/LB:R0DPYC:R0CKSM-RMSFL14RMSFL1: .FCTR LB:[1,1]RMSLIB/LB:R0ALDB:R0ALBD:R0ALIO;RMSCLS: .FCTR LB:[1,1]RMSLIB/LB:R1CLOS:R2CLOS:R3CLOS-RMSCL0.4RMSCL0: .FCTR LB:[1,1]RMSLIB/LB:R0CKSM-RMEXTD-RMR1RL6RMSOPN: .FCTR (LB:[1,1]RMSLIB/LB:R0OPFL-RMSOP0,RM0XY0)4RMCRCK: .FCTR LB:[1,1]RMSLIB/LB:R1CRCK:R2CRCK:R3CRCK;RMCREA: .FCTR LB:[1,1]RMSLIB/LB:R0CRFL:R0MFNB:R0RD50-RMSCR2F4RMSCR0: .FCTR RMSCRE-LB:[1,1]RMSLIB/LB:R0CRXI-RMSCR1; <; **********************************************************;C; RSX SYSTEM DEPENDENT FACTORS;C&RMFILE: .FCTR LB:[1,1]RMSLIB/LB:R0RXAC4RMSOP0: .FCTR LB:[1,1]RMSLIB/LB:R0RXDI:R0MFNB:R0RD504RMSCR2: .FCTR LB:[1,1]RMSLIB/LB:R0RXCR:R0RXMD:R0RXDI-RMSER1: .FCTR LB:[1,1]RMSLIB/LB:R0RXMD-RMSOP0 ;:!; RSTS/E SYSTEM DEPENDENT FACTORS);M';RMFILE: .FCTR LB:[1,1]RMSLIB/LB:R0REOPC.;RMSOP0: .FCTR LB:[1,1]RMSLIB/LB:R0MFNB:R0RD50';RMSCR2: .FCTR LB:[1,1]RMSLIB/LB:R0RECRC;RMSER1: .FCTR RMSOP0C;-<; **********************************************************;*0; FACTORS TO BE USED IF NOT LINKING TO THE RMS11%; RESIDENT LIBRARY OR RUN-TIME SYSTEMM;0&RMEXTD: .FCTR LB:[1,1]RMSLIB/LB:R0EXTD-RMR1RL: .FCTR LB:[1,1]RMSLIB/LB:R1RLBK:R1NXBKR&RMR1WL: .FCTR LB:[1,1]RMSLIB/LB:R1WTLS;L,; FACTORS TO BE USED IF LINKING TO THE RMS11%; RESIDENT LIBRARY OR RUN-TIME SYSTEMR;I;RMEXTD: .FCTR RMDEXT.;RMR1RL: .FCTR RMDRLBR;RMR1WL: .FCTR RMDWTL.;R<; **********************************************************;*; TOP LEVEL OVERLAY STRUCTURE*;*,; CHANGE THE RMXXXX: FACTOR NAME TO THE NAME5; USED IN YOUR TASK'S ODL FILE AND REFERENCE THE NAMESB; YOU GIVE THIS FILE WITH A @LB:[1,24]LB:FILENAME AT THE LEFT HAND ; MARGIN IN YOUR TASK'S ODL FILE;L$RMSOVR: .FCTR RMS11-*(RMSFIL,RMSREC);A'; FILE (FAB) FUNCTION OVERLAY STRUCTURE;E9RMSFL0: .FCTR (RMSFNM,RMSDPC,RMSCLS,RMSOPN,RMSCR0,RMSMIC)X;F; IN THE ABOVE FACTOR IF AUXILIARY FILE FUNCTIONS ARE DESIRED THEN ADD9; THE RMSMIC00u2%q
2028 display.;%.; Modified for RSX-11M-PLUS V4.6 by:I.;.; D. Carroll 24-Feb-1998 09.106.; DC494 - Remove IDENT to use ident from source file.;.; .SETF $UTYP1; .OPEN '$CL'BROBLD.CMD .DATA ;! .DATA ; TKB BUILD FILE FOR BRO .DATA ; '$COM'n .DATA ; CREATED BY '$BLDID' .DATA ;5 .DATA '$TK'BRO.TSK/PR/-FP'$MMSW'/-IP,'$MP'BRO/-SP=y1 .DATA '$LI'MLTUSR/LB:BROADC,'$LI'PRL/LB:BLKSUBN1 .DATA LB:[3,54]RSXVEC.STB/SS,LB:[1,1]EXELIB/LB0 .DATA / .DATA TASK=...BRO .DATA ;Q .DATA ; BRO uses its first two LUNs for GCML$ and error messages. BRO assigns1M .DATA ; all its other LUNs to terminals for broadcasts. If there are moreTK .DATA ; terminals than LUNs, BRO does the broadcasts in multiple passes.P .DATA ; Increasing the number of LUNs will decrease the number of passes thatQ .DATA ; BRO has to make to broadcast to all the terminals. The maximum usefulBO .DATA ; number of LUNs is n+2 where n is the number of terminals that can beT' .DATA ; broadcast to on your system.e .DATA ; .DATA UNITS=25a# .DATA ASG=TI:1 ; LUN for GCML$., .DATA ASG=TI:2 ; LUN for error messages .DATA PAR='$GEN'e .DATA / .CLOSEi .EXIT 1.;$.; Exit for error encountered by IND.;.ERXIT: .EXIT 4easing the number of LUNs will decrease the number of passes thatQ .DATA ; BRO has to make to broadcast to all the terminals. The maximum usefulBO .DATA ; number of LUNs is n+2 where n is the number of terminals that can beT' ..;.; PREVIOUSLY MODIFIED BY:.;.; R. Krishna 2.;..; MODIFIED FOR RSX-11M-PLUS V3.0 UPDATE C BY:.;.; R. D. Haney 24-Mar-86=.; RDH031 Change BYEBLD.CMD for V06.01 on M and V04.01 on M+e.;&.; MODIFIED FOR RSX-11M-PLUS V4.0. BY:.;.; R. D. Haney 21-May-860.; RDH053 Vector BYE task and make V05.00 on M+.;%.; Modified for RSX-11M-PLUS V4.4 by:.;!.; J. C. Franzini 4-Sep-90 05.01V2.; JCF396 -- Add .TSK for SYSGEN under VAX-11 RSX.; .ONERR ERXITB .ENABLE SUBSTITUTIONM .ENABLE GLOBALL .SETF $UTYP1; .OPEN '$CL'BYEBLD.CMD .DATA ;! .DATA ; TKB BUILD FILE FOR BYE .DATA ; '$COM'2 .DATA ; CREATED BY '$BLDID' .DATA ;I.IFF $11MPL .DATA '$TK'BYE/-FP/AL/PR'$MMSW','$MP'BYE/-SP='$LI'MCR/LB:BYE;P.IFT $11MPL .DATA '$TK'BYE.TSK/-FP/CP/PR'$MMSW','$MP'BYE/-SP='$LI'MLTUSR/LB:BYE/.IFT $11M .DATA '$LI'MCR/LB:NETSUB:COLOG:FMTDV G.IFT $11MPL .DATA '$LI'PRL/LB:BLKSUB:COLOG:FMTDV,'$LI'MLTUSR/LB:NETSUB-8.IFT $11M .DATA '$TK'RSX11M.STB/SS,LB:[1,1]EXELIB/LB/SS>.IFT $11MPL .DATA LB:[3,54]RSXVEC.STB/SS,LB:[1,1]EXELIB/LB/SS .DATA / .DATA TASK=...BYE .DATA UNITS=7.IFT $11M .DATA IDENT=06.01,.IFT $11MPL .DATA IDENT=05.01 ; M-PLUS V4.4.; .DATA STACK=100.; .DATA ASG=TI:1:7,CO:3.; .DATA PAR='$GEN'TC .DATA GBLDEF=$USRSB:0 ; ADDRESS OF USER SUBROUTINE (0=NOT USED) P .DATA GBLDEF=$MALSB:0 ; ADDRESS OF MAIL NOTIFICATION SUBROUTINE (0=NOT USED); .DATA GBLDEF=INDTIM:36 ; TIMEOUT FOR INDIRECT (SECONDS)S; .DATA GBLDEF=ABOTIM00Z[Q@{ATADATADATA:0 ; TIMEOUT FOR ABORT AST (SECONDS)C .DATA / .CLOSEL .EXIT 1.;$.; Exit for error encountered by IND.;.ERXIT: .EXIT 4ENT=06.01,.IFT $11MPL .DATA IDENT=05.01 ; M-PLUS V4.4.; .DATA STACK=100.; .DATA ASG=TI:1:7,CO:3.; .DATA PAR='$GEN'TC .DATA GBLDEF=$USRSB:0 ; ADDRESS OF USER SUBROUTINE (0=NOT USED) P .DATA GBLDEF=$MALSB:0 ; ADDRESS OF MAIL NOTIFICATION SUBROUTINE (0=NOT USED); .DATA GBLDEF=INDTIM:36 ; TIMEOUT FOR INDIRECT (SECONDS)S; .DATA GBLDEF=ABOTIM.;.; Previously modified by:.;.; Eric Postpischil:.; Paul K. M. WeissR.; Brian MccarthyT.; J. C. FranziniS.;%.; Modified for RSX-11M-PLUS V4.6 by:A.; .; D. Carroll 19-Jan-1996 123.009.; DC436 -- Update ident, and allow building so that theT+.; output file is not spooled by defaultT.; .ONERR ERXIT: .ENABLE SUBSTITUTIONT .ENABLE GLOBALC .IFNDF $SYGRP .SETN $SYGRP 1X .SETT $UTYP1S .SETS TYP1 "RES"S .SETS TYP2 "RES"S .IF $TYP1 = "" .SETS TYP1 ""T .IF $TYP2 = "" .SETS TYP2 ""d.;.; GENERATE CDABLD.CMD.; .OPEN '$CL'CDA'TYP1'BLD.CMD .DATA ; .DATA ; TKB .CMD FILE FOR CDA .DATA ; '$COM'.&.IFF $FCSTK .DATA ; LINKING TO FCSRES!.IFT $FCSTK .DATA ; USING SYSLIBd .DATA ; CREATED BY '$BLDID' .DATA ;= .DATA '$TK'CDA'TYP2'.TSK/-FP/CP'$MMSW','$MP'CDA'TYP2'/-SP=E .DATA '$OD'CDA'TYP1'BLD/MPA .DATA STACK=192 .DATA TASK=...CDA .DATA IDENT=123.00T .DATA ASG=SY:1S .DATA ASG=TI:2F .DATA ASG=SY:3Y .DATA ASG=SY:42 .DATA ASG=SY:5d .DATA ASG=TI:6D .DATA PAR='$GENB'(.IFF $FCSTK .DATA RESLIB=[1,1]FCSRES/RO .DATA ; .DATA ; SWITCH DEFAULTS .DATA ;# .DATA GBLDEF=LIN$MX:74 ; /LINESI$ .DATA GBLDEF=PAG$MX:454 ; /LIMIT .DATA ;. .DATA ; MAXIMUM COUNTS (TO PREVENT LOOPING) .DATA ;K .DATA GBLDEF=ASN$MX:144 ; MAX NUMBER OF LOGICAL ASSIGNMENT BLKS TO DUMPK; .DATA GBLDEF=ATD$MX:62 ; ATTACHMENT DESCRIPTORS PER PCBA0 .DATA GBLDEF=ATL$MX:144 ; ACTIVE TASK TCB''S, .DATA GBLDEF=CAP$MX:30 ; CKPT ALLOC PCBS5 .DATA GBLDEF=CBD$MX:30 ; COMMON BLOCK DIR ENTRIESR# .DATA GBLDEF=DCB$MX:62 ; DCB''S.. .DATA GBLDEF=HDR$MX:1130 ; WORDS IN HEADER1 .DATA GBLDEF=IOP$MX:144 ; I/O PACKETS PER SCB46 .DATA GBLDEF=PCB$MX:144 ; PARTITION CONTROL BLOCKS8 .DATA GBLDEF=POL$MX:17 ; ALLOCATION CONSTANT MAXIMUM- .DATA GBLDEF=STD$MX:310 ; INSTALLED TASKS+ .DATA GBLDEF=UCB$MX:77 ; UCB''S PER DCBI7 .DATA GBLDEF=WTQ$MX:62 ; WAIT QUEUE ENTRIES PER PCB 8 .DATA GBLDEF=$DFSPL:0 ; SPOOL OUTPUT FILE BY DEFAULTD .DATA ;GBLDEF=$DFSPL:177777 ; DON''T SPOOL OUTPUT FILE BY DEFAULT .DATA / .CLOSE..;.; GENERATE CDABLD.ODL.; .OPEN '$CL'CDA'TYP1'BLD.ODL .DATA ; .DATA ; TKB .ODL FILE FOR CDA .DATA ; '$COM'T&.IFF $FCSTK .DATA ; LINKING TO FCSRES!.IFT $FCSTK .DATA ; USING SYSLIBM .DATA ; CREATED BY '$BLDID' .DATA ; .DATA ; VERSION: 28 .DATA ; .DATA ;& .DATA ; ESTABLISH CO-TREE STRUCTURE .DATA ;' .DATA .ROOT TREE1,TREE2,TREE4,TREE5P .DATA ;/ .DATA ; DEFINE MAIN TREE -- CDA ROOT SEGMENTD .DATA ; .DATA TREE1: .FCTR C1-SUBSA .DATA ; .DATA ; CDA SUBROUTINES .DATA ;5 .DATA SUBS: .FCTR C4-C19-E-C5-C8-C9-C6-C10-C11-C13. .DATA ; .DATA ; DEFINE FCS CO-TREE$ .DATA ;,.IFT $FCSTK .DATA TREE2: .FCTR *(S5-T2OVLY)Y.IFT $FCSTK .DATA T2OVLY: .FCTR (PARSE,OPEN,CLOSE,S1-PUT-READ,WRITE,GET,GETSQ,POINT,CSI)!.IFF $FCSTK .DATA .NAME T2ROOT-&.IFF $FCSTK .DATA TREE2: .FCTR T2ROOT .DATA ;+ .DATA ; DEFINE CDA SWITCH OPTION CO-TREEN .DATA ; .DATA .NAME T4ROOT= .DATA TREE4: .FCTR T4ROOT-*(T4OV1,T4OV2,T4OV3,T4OV4,T4OV5);5 .DATA T4OV1: .FCTR (U1-E,U2-E,U3-E,U4-E,U5-E,U6-E)1T .DATA T4OV2: .FCTR (C14-S2,C15-S3,C16,C3,C2,C17-C50-E,C18-C20-C7-C29-C47-E,C51-E)W .DATA T4OV3: .FCTR (C23-C24-C25-C26-C49-E,C27-C25-C26-C28-E,C36-C38-C37-C25-E,T4ADD)N5 .DATA T4ADD: .FCTR (C43-E,C44-C26-E,C45-C25-E,C12)CD .DATA T4OV4: .FCTR (C30-C31-C33-C26-C48-E-*(C32-E,C35-C34-C25-E))T .DA00bSW .DATA CONTRL: .FCTR GLODAT-RPTOWN-FILES-CTLCFL-MEMORY-VALUTL/ .DATA GLODAT: .FCTR '$LI'RPT/LB:GLODAT:COMGLOI< .DATA FILES: .FCTR '$LI'RPT/LB:FILEIO:FILERE:FILEDA:FILEGE6 .DATA CTLCFL: .FCTR '$LI'RPT/LB:CTLCFL:COMSUB:COMCTL/ .DATA MEMORY: .FCTR '$LI'RPT/LB:MEMORY:LIMITSF. .DATA VALUTL: .FCTR '$LI'RPT/LB:VALUTL:ARITH .DATA &.IFT $UTYP1 .DATA OTS: .FCTR OTS1-OTS2+.IFF $UTYP1 .DATA OTS: .FCTR OTS1-OTS2-OTS3R7 .DATA OTS1: .FCTR '$LI'NEISLB/LB:B16CH2:B16PG2:B16PG4A. .DATA OTS2: .FCTR LB:[1,1]'$DFLIB'/LB:FCSFSR;.IFF $UTYP1 .DATA OTS3: .FCTR LB:[1,1]'$DFLIB'/LB:C5TA:CBTA  .DATA  .DATA  .DATA .NAME CFLSTAIU .DATA START: .FCTR CFLSTA-'$LI'RPT/LB:FILEOP:FILECM:FILEMD:SRCDAT:UTLCFL:COMLIS-LIBT .DATA  .DATA .NAME CFLMESY3 .DATA MESSAG: .FCTR CFLMES-PDP11-*(MSGCFL,MSGCOM)F* .DATA PDP11: .FCTR '$LI'RPT/LB:PDP11-LIB( .DATA MSGCFL: .FCTR '$LI'RPT/LB:MSGCFL( .DATA MSGCOM: .FCTR '$LI'RPT/LB:MSGCOM .DATA  .DATA .NAME CFLCOMB; .DATA COMPIL: .FCTR CFLCOM-COMPAR-*(FUNC01,FUNC02,FUNC03):N .DATA COMPAR: .FCTR '$LI'RPT/LB:COMPIL:GALILE:PARSER:SCANER:VOCAB:RHSTBL-LIB .DATA ( .DATA FUNC01: .FCTR '$LI'RPT/LB:CNVFUN/ .DATA FUNC02: .FCTR '$LI'RPT/LB:CNDFUN:CODFUN:( .DATA FUNC03: .FCTR '$LI'RPT/LB:COMFUN .DATA ; .DATA ; Operator co-tree .DATA ;G .DATA .NAME OPTREE: .DATA OPRFUN: .FCTR OPTREE-*(RADIX,OPERAT,TIMCNV,STRFUN). .DATA RADIX: .FCTR '$LI'RPT/LB:RADVAL:VALRAD/ .DATA OPERAT: .FCTR '$LI'RPT/LB:OPERAT:OPRSUBD6 .DATA TIMCNV: .FCTR '$LI'RPT/LB:TIMCNV:RSXASC:ARITHE, .DATA STRFUN: .FCTR '$LI'RPT/LB:STRFUN-LIB .DATA 5 .DATA LIB: .FCTR '$LI'NEISLB/LB-LB:[1,1]'$DFLIB'/LBT .DATA: .DATA .END  .CLOSE .EXIT 1T.;$.; Exit for error encountered by IND.;.ERXIT: .EXIT 4DATA ; .DATA ; Operator co-tree .DATA ;G .DATA .NAME OPTREE: .DATA OPRF.;.; CATHY Z 21-FEB-83.; CDZ029 - ADD TASK IDENTS .;.;=.; JL155 - Change task name to 2-character name for Micro/RSXL#.; JWB049 - Add reference to $gtknmT.;.;L.; Alex Conta 06/08/84 Delete the conditionalizing for Micro/RSX tasknames.;4.; Ritu Krishna 14-JAN-85 Update the Ident to 3.00.;%.; Modified for RSX-11M-PLUS V4.4 by:.;!.; J. C. Franzini 4-Sep-90 03.01n2.; JCF396 -- Add .TSK for SYSGEN under VAX-11 RSX.; .ONERR ERXIT .ENABLE SUBSTITUTION .ENABLE GLOBAL.; .; Generate CMPBLD.CMD.; C .SETT $UTYP1 .OPEN '$CL'CMP'$TYP1'BLD.CMD .DATA ; " .DATA ; TKB COMMAND FILE FOR CMP .DATA ; '$COM''.IFF $FCSTK .DATA ; LINKING TO '$RSLIB't .IFT $FCSTK .DATA ; USING SYSLIB .DATA ; CREATED BY '$BLDID' .DATA ; ^.IFF $IAS .DATA '$TK'CMP'$TYP2'.TSK/-FP/CP'$MMSW','$MP'CMP'$TYP2'/-SP/MA='$OD'CMP'$TYP1'BLD/MP;.IFT $IAS .DATA '$TK'CMP/-FP/CP/MU,'$MP'CMP/-SP/CR='$LI'CMPS5.IFT $IAS .DATA '$LI'CMPMAIN,CMPRTNS,CMPDATA,CMPSAVRGU.IFT $IAS .DATA /L .DATA TA00zQ@{ATADATADATASK=...CMPn! .DATA IDENT=03.01 ; M-PLUS V4.4Y .DATA PAR='$GENX'$.IFF $FCSTK .DATA '$LIBOP' .DATA UNITS=5N .DATA ASG=TI:1:2 .DATA ; G.IFT $IAS .DATA ; THE TASK SHOULD BE EXTENDED TO INCREASE THE AMOUNT OFLG.IFT $IAS .DATA ; SPACE AVAILABLE TO HOLD LINES AWAITING MATCHING. THE$D.IFT $IAS .DATA ; SAME EFFECT CAN BE ACHIEVED BY USING THE /INCREASE).IFT $IAS .DATA ; SWITCH AT INSTALL TIME./.IFT $IAS .DATA EXTTSK=10000.IFT $11MPL .DATA EXTTSK=2048A .DATA GBLDEF=HT:11 .DATA GBLDEF=FF:14 .DATA /  .CLOSE.; 0.; Generate CMPBLD.ODL.;'.IFF $IAS .OPEN '$CL'CMP'$TYP1'BLD.ODL .IFF $IAS .DATA ; T'.IFF $IAS .DATA ; TKB ODL FILE FOR CMP .IFF $IAS .DATA ; '$COM'E1.IFF $IAS .IFF $FCSTK .DATA ; LINKING TO '$RSLIB'C*.IFF $IAS .IFT $FCSTK .DATA ; USING SYSLIB&.IFF $IAS .DATA ; CREATED BY '$BLDID'.IFF $IAS .DATA ; GC.IFF $IAS .IFT $FCSTK .DATA .ROOT A-*(OV1,OV2,OV3,OV4,OV5,OV6),COT (.IFF $IAS .IFF $FCSTK .DATA .ROOT A-COTW.IFF $IAS .IFT $FCSTK .DATA A: .FCTR '$LI'CMP/LB:CMP:DATA-LB:[1,1]SYSLIB/LB:RQLCB-GTKNMr?.IFF $IAS .IFF $FCSTK .DATA A: .FCTR '$LI'CMP/LB:CMP:DATA-GTKNMFD.IFF $IAS .IFT $FCSTK .DATA OV1: .FCTR LB:[1,1]SYSLIB/LB:.CSI1:.CSI2>.IFF $IAS .IFT $FCSTK .DATA OV2: .FCTR LB:[1,1]SYSLIB/LB:PARSEJ.IFF $IAS .IFT $FCSTK .DATA OV3: .FCTR LB:[1,1]SYSLIB/LB:OPFNB-(OV3A,OV3B)F.IFF $IAS .IFT $FCSTK .DATA OV3A: .FCTR LB:[1,1]SYSLIB/LB:FINIT:ASSLUN@.IFF $IAS .IFT $FCSTK .DATA OV3B: .FCTR LB:[1,1]SYSLIB/LB:RDWAITD.IFF $IAS .IFT $FCSTK .DATA OV4: .FCTR LB:[1,1]SYSLIB/LB:GETSQ:PUTSQ>.IFF $IAS .IFT $FCSTK .DATA OV5: .FCTR LB:[1,1]SYSLIB/LB:EDTMGJ.IFF $IAS .IFT $FCSTK .DATA OV6: .FCTR LB:[1,1]SYSLIB/LB:CLOSE:$PRINT:EXST3.IFF $IAS .DATA GTKNM: .FCTR '$LI'PIPUTL/LB:GTKNM .IFF $IAS .DATA S$.IFF $IAS .IFF $FSLTK .DATA .NAME X5.IFF $IAS .IFF $FSLTK .DATA COT: .FCTR X-*(GCML,CMPX)I0.IFF $IAS .IFT $FSLTK .DATA COT: .FCTR GCML-CMPX4.IFF $IAS .DATA GCML: .FCTR LB:[1,1]SYSLIB/LB:.GCML9.IFF $IAS .DATA CMPX: .FCTR '$LI'CMP/LB:MAIN:RTNS:SAVREG .IFF $IAS .DATA S.IFF $IAS .DATA .END.IFF $IAS .CLOSE .EXIT 1.;$.; Exit for error encountered by IND.;.ERXIT: .EXIT 4CTR LB:[1,1]SYSLIB/LB:CLOSE:$PRINT:EXST3.IFF $IAS .DATA GTKNM: .FCTR '$LI'PIPUTL/LB:GTKNM .IFF $IAS .DATA S$.IFF $IAS .IFF $FSLTK .DATA .NAME X5.IFF $IAS .IFF $FSLTK .DATA COT: .FCTR X-*(GCML,CMPX)I0.IFF $IAS .IFT $FSLTK .DATA COT: .FCTR GCML-CMPX4.IFF $IAS .DATA GCML: .FCTR LB:[1,1]SYSLIB/LB:.GCML9.IFF $IAS .DATA CMPX: .FCTR '$LI'CMP/LB:MAIN:RTNS:SAVREG .IFF $IAS .DATA S.IFF $.; PREVIOUSLY MODIFIED BY:.; .; P.J. KOBAR1 .; L. KOGAN .;%.; MODIFIED FOR RSX-11M-PLUS V4.1 BY: .;#.; PAUL K. M. WEISS 5-NOV-1987 2.03:$.; PKW134 - DON'T BUILD FSL VERSION.;%.; Modified for RSX-11M-PLUS V4.4 by:I.;!.; J. C. Franzini 4-Sep-90 02.04F2.; JCF396 -- Add .TSK for SYSGEN under VAX-11 RSX.; .ONERR ERXIT  .ENABLE SUBSTITUTIONX .ENABLE GLOBALG.;.; Generate COTBLD.CMD.; .SETT $UTYP1A .SETS TYP1 "RES"M .SETS TYP2 "RES"  .IF $TYP1 = "" .SETS TYP1 ""P .IF $TYP2 = "" .SETS TYP2 ""J .OPEN '$CL'COT'TYP1'BLD.CMD .DATA ;! .DATA ; TKB BUILD FILE FOR COT  .DATA ; '$COM'9&.IFF $FCSTK .DATA ; LINKING TO FCSRES .DATA ; CREATED BY '$BLDID' .DATA ;W .DATA '$TK'COT'TYP2'.TSK/-SE/PR/CP'$MMSW','$MP'COT'TYP2'/-SP/MA='$OD'COT'TYP1'BLD/MPA .DATA STACK=128 .DATA ASG = CO0:3 .DATA TASK=COT..." .DATA IDENT=02.04 ; M-PLUS V4.4 .DATA PRI = 145 .DATA PAR='$GEN' (.IFF $FCSTK .DATA RESLIB=[1,1]FCSRES/RO .DATA GBLPAT=FCSERR:.EREFN:11 .DATA GBLPAT=FCSERR:.ERLUN:5C .DATA ;GBLPAT=COTROT:.TMOUT:5= .DATA ; HALF-FILLED LOGFILE BUFFER WRITTEN AFTER 5 SECONDST .DATA / .CLOSEC.;.; Generate COTBLD.ODL.; .OPEN '$CL'COT'TYP1'BLD.ODL .DATA ; .DATA ; TKB ODL FILE FOR COT/&.IFF $FCSTK .DATA ; LINKING TO FCSRES .DATA ; '$COM'A .DATA ; CREATED BY '$BLDID' .DATA ; .DATA ;4 .DATA .ROOT '$LI'COT/LB:COT:COTDSP:COTERR-*OVERL+ .DATA OVERL: .FCTR (INI,OPN,CMD,WRT,ERR) 5.IFF $FC00W .DATA ; Comment out the following if you include a password> .DATA ; encription routine (it should be the same module as> .DATA ; that which is used for HELLO). Include the name of( .DATA ; the module in segment CRPACC. .DATA ; .DATA GBLDEF=ENCRPT:0 .DATA ;= .DATA ; Define default job name as three RAD50 word valuesrE .DATA ; (3 characters/word * 3 words = 9 characters for job name). .DATA ;+ .DATA GBLPAT=CRP:$DFJNM:35200:6274:12000. .DATA / .CLOSE.;.; Generate CRPBLD.ODL.; .OPEN '$CL'CRP'$TYP1'BLD.ODL .DATA ; .DATA ; TKB .ODL FILE FOR CRP .DATA ; '$COM'd(.IFF $FCSTK .DATA ; LINKING TO '$RSLIB'!.IFT $FCSTK .DATA ; USING SYSLIBA .DATA ; CREATED BY '$BLDID' .DATA ; .DATA .NAME CRPND.IFT $FCSTK .DATA .ROOT CRP-ROT-QSYM-*(PRS,PAS,ACC,IVL,OPJ,PT,CLJ)A.IFF $FCSTK .DATA .ROOT CRP-ROT-QSYM-*(PRS,PAS,ACC,IVL,OPJ,CLJ)sH.IFT $FCSTK .DATA ROT: .FCTR '$LI'CRP/LB:CRPROT:CRPFUN:CRPPRO:CRPERR-ARE.IFF $FCSTK .DATA ROT: .FCTR '$LI'CRP/LB:CRPROT:CRPFUN:CRPPRO:CRPERR'4.IFT $FCSTK .DATA AR: .FCTR LB:[1,1]SYSLIB/LB:ARITH' .DATA QSYM: .FCTR '$LI'QMG/LB:QMGSYMT& .DATA PRS: .FCTR '$LI'CRP/LB:CRPPRS& .DATA PAS: .FCTR '$LI'CRP/LB:CRPPASP.IFT $FCSTK .DATA ACC: .FCTR '$LI'CRP/LB:CRPACC-'$LI'MCR/LB:ACTFIL-XSYM-(OP,CL)H.IFF $FCSTK .DATA ACC: .FCTR '$LI'CRP/LB:CRPACC-'$LI'MCR/LB:ACTFIL-XSYM+ .DATA IVL: .FCTR '$LI'CRP/LB:CRPIVL-XSYMT2 .DATA OPJ: .FCTR '$LI'CRP/LB:CRPOPJ:CRPSND-XSYM2 .DATA CLJ: .FCTR '$LI'CRP/LB:CRPCLJ:CRPSND-XSYM8.IFT $FCSTK .DATA PT: .FCTR LB:[1,1]SYSLIB/LB:PUT:DLFNB3.IFT $FCSTK .DATA OP: .FCTR00Q@{ATADATADATA LB:[1,1]SYSLIB/LB:OPEN'4.IFT $FCSTK .DATA CL: .FCTR LB:[1,1]SYSLIB/LB:CLOSE= .DATA XSYM: .FCTR LB:[3,54]RSXVEC.STB/SS-LB:[1,1]EXELIB/LBC .DATA .END .CLOSE' .EXIT 1.;$.; Exit for error encountered by IND.;.ERXIT: .EXIT 4ACC-'$LI'MCR/LB:ACTFIL-XSYM+ .DATA IVL: .FCTR '$LI'CRP/LB:CRPIVL-XSYMT2 .DATA OPJ: .FCTR '$LI'CRP/LB:CRPOPJ:CRPSND-XSYM2 .DATA CLJ: .FCTR '$LI'CRP/LB:CRPCLJ:CRPSND-XSYM8.IFT $FCSTK .DATA PT: .FCTR LB:[1,1]SYSLIB/LB:PUT:DLFNB3.IFT $FCSTK .DATA OP: .FCTR.; Previously modified by :X.; .; L. SilerA.; C. Petrovic.; J. Albanese.;(.; Last modification date : 09-Jan-1996%.; Modified for RSX-11M-PLUS 4.0 by :O.;+.; LMP034 - Increment task IDENT to 4.0 and.1.; add new SYSLIB routine to LINK for SPR 80917A.;8.; DMK206 - Allow BROadcast to use alphanumeric username.; SPR 92878 IDENT V4.015.; DMK216 - Add SHO DEV/SYS spr 96181 IDENT V4.02A.;%.; Modified for RSX-11M-PLUS V4.1 by::.;/.; DMK220 - Increment task IDENT to 5.0 (#9417).;%.; Modified for RSX-11M-PLUS V4.2 by:e.;6.; LMP116 - Fix BASIC and increment task IDENT to 5.01.;%.; Modified for RSX-11M-PLUS V4.3 by:1.;>.; LMP134 - Add PDP C support and increment task IDENT to 5.02.;%.; Modified for RSX-11M-PLUS V4.4 by: .;!.; J. C. Franzini 4-Sep-90 05.03 2.; JCF396 -- Add .TSK for SYSGEN under VAX-11 RSX.;!.; L. M. Peterson 28-Feb-91 05.04r!.; LMP159 -- Increase stack sizef.;%.; Modified for RSX-11M-PLUS V4.6 by:2.;.; D. Carroll 09-Jan-1996 06.007-.; DC431 -- Include support for DUMP command.;.;".; Chris Suddick 27-Aug-1998 06.01).; CS251 - Include support for TYPE/PAGE-.;.; .ONERR ERXITP .ENABLE SUBSTITUTIONn .ENABLE GLOBALE .SETF $UTYP1; .IFNDF $MICRO .SETF $MICRO .;.; GENERATE DCLBLD.CMD.; .OPEN '$CL'DCLBLD.CMD .DATA ; .DATA ; TKB .CMD FILE FOR DCL .DATA ; '$COM'F .DATA ; USING SYSLIB- .DATA ; CREATED BY '$BLDID' .DATA ;/ .DATA '$MMSW'/CP/NM,,'$TK'DCL='$OD'DCDBLD/MP1 .DATA TASK=...DCL .DATA STACK=750 .DATA PRI=160 .DATA PAR='$GEN'i .DATA IDENT=06.01K .DATA ;DCL IS TASKBUILT TWICE. THE FIRST PASS (ABOVE) DOES NOTHING BUT BI .DATA ;CREATE A SYMBOL TABLE. THE SYMBOL TABLE IS USED IN THE SECOND EK .DATA ;PASS (BELOW) TO CREATE A COMPLETE TASK IMAGE AND MAP. NOTE THAT AG .DATA ;THERE ARE TWO ODL FILES FOR THIS PROCESS. THE INPUT FOR THE G@ .DATA ;FIRST PASS IS DCDBLD.ODL. THE INPUT FOR THE SECOND ISI .DATA ;DCLBLD.ODL. THE ONLY DIFFERENCE IN THESE FILES IS THE PRESENCE7= .DATA ;OR ABSENCE OF A REFERENCE TO THE SYMBOL TABLE FILE.1 .DATA ;B .DATA ; DCL HAS A CATCHALL FACILITY. BY DEFAULT, THIS FACILITY> .DATA ; IS ENABLED. WHEN THE CATCHALL FACILITY IS ENABLED,? .DATA ; ALL COMMANDS RECEIVED BY DCL WHICH DO NOT HAVE VALIDED .DATA ; DCL COMMAND VERBS ARE SENT TO THE MCR CLI FOR PROCESSING.B .DATA ; FOR EXAMPLE, IN THE COMMAND "PIP /BR", THE COMMAND VERBB .DATA ; IS "PIP", WHICH IS AN INVALID DCL COMMAND VERB. IF THEA .DATA ; CATCHALL FACILITY IS ENABLED, THIS ENTIRE COMMAND LINECG .DATA ; WILL BE PASSED TO THE MCR CLI. IF THE CATCHALL FACILITY IS A@ .DATA ; DISABLED, THE COMMAND "PIP /BR" WILL BE FLAGGED AS AN .DATA ; ILLEGAL COMMAND.E .DATA ;= .DATA ; TO ENABLE THE CATCHALL FACILITY, THE GLOBAL SYMBOLAA .DATA ; "D$$CAT" MUST BE NON-ZERO. I.E., THE TKB OPTION BELOW." .DATA ; SHOULD READ AS FOLLOWS: .DATA ; GBLDEF=D$$CAT:1 .DATA ;> .DATA ; TO DISABLE THE CATCHALL FACILITY, THE GLOBAL SYMBOL? .DATA ; "D$$CAT" MUST BE ZERO. IN THIS CASE, THE TKB OPTIONA .DATA ; SHOULD READ:M .DATA ; GBLDEF=D$$CAT:0 .DATA ;2 .DATA GBLDEF=D$$CAT:1 ;MCR CATCHALL FACILITY ON .DATA ;9 .DATA ; IN ADDITION TO THE CATCHALL FACILITY, COMMANDSB6 .DATA ; MAY BE SENT TO THE MCR CLI FROM THE DCL CLI6 .DATA ; BY PREFIXING THE COMMANDS WITH EITHER A "."7 .DATA ; OR "MCR " (E.G., ".PIP /BR", "MCR PIP /BR").=7 .DATA ; (BE AWARE THAT THE "." FORM WILL NOT WORK INF; .DATA ; IND00W .DATA A: .FCTR AB-'$LI'DCLO/LB:ABORT:ALLOCAT:AT:BACKUP/SS-L .DATA ; .DATA .NAME BCL .DATA B: .FCTR BC-'$LI'DCLO/LB:BASIC:BROADCAST:CANCEL:CC:COBOL:DIBOL/SS-L .DATA ; .DATA .NAME CC? .DATA B1: .FCTR CC-'$LI'DCLO/LB:CONTINUE:CONVERT:CREATE/SS-L] .DATA ; .DATA .NAME CD> .DATA C: .FCTR CD-'$LI'DCLO/LB:ANALYZE:CORAL:DEALLOCAT/SS-L .DATA ;* .DATA C1: .FCTR '$LI'DCLO/LB:COMMAND/SS .DATA ; .DATA .NAME DUF .DATA D: .FCTR DU-'$LI'DCLO/LB:DEBUG:DIFFERENCE:DISMOUNT:DUMP/SS-D08 .DATA D0: .FCTR '$LI'DCLO/LB:EDIT:FIX:HELP:UNFIX/SS-L .DATA ;+ .DATA D1: .FCTR '$LI'DCLO/LB:DELETE/SS-L: .DATA ;. .DATA D2: .FCTR '$LI'DCLO/LB:DIRECTORY/SS-L .DATA ; .DATA .NAME FI6 .DATA F: .FCTR FI-'$LI'DCLO/LB:FORTRAN:INSTALL/SS-L .DATA ;H .DATA L0: .FCTR ('$LI'DCLO/LB:LINK/SS-L,'$LI'DCLO/LB:TLINK/SS-L,LIN1)F .DATA LIN1: .FCTR '$LI'DCLO/LB:LINK1/SS-LIN2-(LINOPE,LINPUT,LINCLO)9 .DATA LIN2: .FCTR LB:[1,1]SYSLIB/LB:FCSGBL:CBTA:RWFSR2:2 .DATA LINOPE: .FCTR LB:[1,1]SYSLIB/LB:OPEN-SYSL3 .DATA LINCLO: .FCTR LB:[1,1]SYSLIB/LB:CLOSE-SYSL.1 .DATA LINPUT: .FCTR LB:[1,1]SYSLIB/LB:PUT-SYSL; .DATA ; .DATA .NAME LRG .DATA L1: .FCTR LR-'$LI'DCLO/LB:MCR:MOUNT:PASCAL:REMOVE:REQUEST/SS-LL .DATA ; .DATA .NAME LSI .DATA L2: .FCTR LS-'$LI'DCLO/LB:LIBRARY:LOGIN:LOGOUT:MESSAGE:00Q@{ATADATADATASORT/SS-LS .DATA ; .DATA .NAME MR0 .DATA M: .FCTR MR-'$LI'DCLO/LB:MACRO:RUN/SS-L .DATA ; .DATA .NAME OVRIJ .DATA O: .FCTR OVR-'$LI'DCLO/LB:ERR:DBUG:DSPCMD:ERRORO:DISPATCH/SS-SYSL .DATA .NAME OVR12 .DATA O1: .FCTR OVR1-'$LI'DCLO/LB:ASTOV/SS-SYSL .DATA ; .DATA .NAME PIPL .DATA P: .FCTR PIP-'$LI'DCLO/LB:APPEND:COPY:PURGE:RENAME:TYPE:UNLOCK/SS-L .DATA ; .DATA .NAME QM9 .DATA Q: .FCTR QM-'$LI'DCLO/LB:HOLD:INITIAL:MERGE/SS-L/ .DATA .NAME QM1UR .DATA Q1: .FCTR QM1-'$LI'DCLO/LB:ASSIGN:DEASSIGN:DEFINE:RELEASE:START:STOP/SS-L .DATA .NAME QM2 5 .DATA Q2: .FCTR QM2-'$LI'DCLO/LB:PRINT:SUBMIT/SS-L$ .DATA ;W .DATA S: .FCTR ('$LI'DCLO/LB:SET/SS-L,'$LI'DCLO/LB:TSET/SS-L,'$LI'DCLO/LB:SET1/SS-L)I .DATA ;C .DATA S1: .FCTR ('$LI'DCLO/LB:SHOW/SS-L,'$LI'DCLO/LB:TSHOW/SS-L)$ .DATA ;& .DATA L: .FCTR '$LI'DCLO/LB/SS-SYSL& .DATA SYSL: .FCTR LB:[1,1]SYSLIB/LB .DATA ; .DATA .END .CLOSEL.;.; GENERATE DCDBLD.ODL.; .OPEN '$CL'DCDBLD.ODL .DATA ; .DATA ; TKB .ODL FILE FOR DCD .DATA ; '$COM'. .DATA ; USING SYSLIBA .DATA ; CREATED BY '$BLDID' .DATA ;& .DATA .ROOT ROOT-'$LI'DCLR/DL-OLAY .DATA ;F .DATA ROOT: .FCTR '$LI'DCLR/LB:XDCL:COMMAN-'$LI'DCLR/LB-ROOT1-ROOT2K .DATA ROOT1: .FCTR LB:[1,1]SYSLIB/LB:ALERR:ARITH:CAT5:FCSFSR:FCSGBL:LOAD E .DATA ROOT2: .FCTR LB:[1,1]SYSLIB/LB:OVCTL:OVDAT:OVRES:SAVRG:SAVR1I .DATA ;K .DATA OLAY: .FCTR (A,B,B1,C,C1,D,D1,D2,F,L0,L1,L2,M,O,O1,P,Q,Q1,Q2,S,S1)C .DATA ; .DATA .NAME AB> .DATA A: .FCTR AB-'$LI'DCLO/LB:ABORT:ALLOCAT:AT:BACKUP/SS-L .DATA ; .DATA .NAME BCL .DATA B: .FCTR BC-'$LI'DCLO/LB:BASIC:BROADCAST:CANCEL:CC:COBOL:DIBOL/SS-L .DATA ; .DATA .NAME CC? .DATA B1: .FCTR CC-'$LI'DCLO/LB:CONTINUE:CONVERT:CREATE/SS-L] .DATA ; .DATA .NAME CD> .DATA C: .FCTR CD-'$LI'DCLO/LB:ANALYZE:CORAL:DEALLOCAT/SS-L .DATA ;* .DATA C1: .FCTR '$LI'DCLO/LB:COMMAND/SS .DATA ; .DATA .NAME DUF .DATA D: .FCTR DU-'$LI'DCLO/LB:DEBUG:DIFFERENCE:DISMOUNT:DUMP/SS-D08 .DATA D0: .FCTR '$LI'DCLO/LB:EDIT:FIX:HELP:UNFIX/SS-L .DATA ;+ .DATA D1: .FCTR '$LI'DCLO/LB:DELETE/SS-L: .DATA ;. .DATA D2: .FCTR '$LI'DCLO/LB:DIRECTORY/SS-L .DATA ; .DATA .NAME FI6 .DATA F: .FCTR FI-'$LI'DCLO/LB:FORTRAN:INSTALL/SS-L .DATA ;H .DATA L0: .FCTR ('$LI'DCLO/LB:LINK/SS-L,'$LI'DCLO/LB:TLINK/SS-L,LIN1)F .DATA LIN1: .FCTR '$LI'DCLO/LB:LINK1/SS-LIN2-(LINOPE,LINPUT,LINCLO)9 .DATA LIN2: .FCTR LB:[1,1]SYSLIB/LB:FCSGBL:CBTA:RWFSR2:2 .DATA LINOPE: .FCTR LB:[1,1]SYSLIB/LB:OPEN-SYSL3 .DATA LINCLO: .FCTR LB:[1,1]SYSLIB/LB:CLOSE-SYSL.1 .DATA LINPUT: .FCTR LB:[1,1]SYSLIB/LB:PUT-SYSL; .DATA ; .DATA .NAME LRG .DATA L1: .FCTR LR-'$LI'DCLO/LB:MCR:MOUNT:PASCAL:REMOVE:REQUEST/SS-LL .DATA ; .DATA .NAME LSI .DATA L2: .FCTR LS-'$LI'DCLO/LB:LIBRARY:LOGIN:LOGOUT:MESSAGE:SORT/SS-LS .DATA ; .DATA .NAME MR0 .DATA M: .FCTR MR-'$LI'DCLO/LB:MACRO:RUN/SS-L .DATA ; .DATA .NAME OVRIJ .DATA O: .FCTR OVR-'$LI'DCLO/LB:ERR:DBUG:DSPCMD:ERRORO:DISPATCH/SS-SYSL .DATA .NAME OVR12 .DATA O1: .FCTR OVR1-'$LI'DCLO/LB:ASTOV/SS-SYSL .DATA ; .DATA .NAME PIPL .DATA P: .FCTR PIP-'$LI'DCLO/LB:APPEND:COPY:PURGE:RENAME:TYPE:UNLOCK/SS-L .DATA ; .DATA .NAME QM9 .DATA Q: .FCTR QM-'$LI'DCLO/LB:HOLD:INITIAL:MERGE/SS-L/ .DATA .NAME QM1UR .DATA Q1: .FCTR QM1-'$LI'DCLO/LB:ASSIGN:DEASSIGN:DEFINE:RELEASE:START:STOP/SS-L .DATA .NAME QM2 5 .DATA Q2: .FCTR QM2-'$LI'DCLO/LB:PRINT:SUBMIT/SS-L$ .DATA ;W .DATA S: .FCTR ('$LI'DCLO/LB:SET/SS-L,'$LI'DCLO/LB:TSET/SS-L,'$LI'DCLO/LB:SET1/SS-L)I .DATA ;C .DATA S1: .FCTR ('$LI'DCLO/LB:SHOW/SS-L,'$LI'DCLO/LB:TSHOW/SS-L)$ .DATA ;& .DATA L: .FCTR '$LI'DCLO/LB/SS-SYSL& .DATA SYSL: .FCTR LB:[1,1]SYSLIB/LB .DATA ; .DATA .END .CLOSEL .EXIT 1.;$.; Exit for error encountered by IND.;.ERXIT: .EXIT 4N:DEASSIGN:DEFINE:RELEASE:START:STOP/SS-L .DATA .NAME QM2 5 .DATA Q2: .FCTR QM2-'$LI'DCLO00 .DATA '$TK'DTE.TSK/PR:0/FU/MM,'$MP'DTE/MA/-SP='$OD'DTEBLD/MP .DATA TASK=...DTE! .DATA IDENT=04.01 ; M-PLUS V4.4; .DATA PAR='$GENX'- .DATA PRI=65 .DATA LIBR = RMSRES:RO .DATA GBLDEF = CM$LUN:15 .DATA /K .CLOSE.; e.; Generate DTEBLD.ODL.; .OPEN '$CL'DTEBLD.ODLI .DATA ; TKB ODL FILE FOR DTE .DATA ; '$COM' .DATA ; USING SYSLIB .DATA ; CREATED BY '$BLDID' .DATA ; &.DATA .ROOT P0-P1-P2-P3-P4-XTF-RMSROT.DATA P0: .FCTR '$LI'DTE/LB:RTEY>.DATA P1: .FCTR '$LI'DTE/LB:XTSERV:XTSACC:XTHAST:XTHBMG:XTSCMP>.DATA P2: .FCTR '$LI'DTE/LB:XTSCNF:XTSTRN:XTSCTL:XTSDAT:XTHDLC>.DATA P3: .FCTR '$LI'DTE/LB:XTSFAB:XTHIMP:XTSSTA:XTHSRV:MSGPRC;.DATA P4: .FCTR '$LI'DTE/LB:XTDDAT:XTDCP:XTDLX:XTTRAN:XTDBGC*.DATA XTF: .FCTR '$LI'DTE/LB:XTHRMS:RMSWLD.DATA @LB:[1,1]RMSRLX .DATA .ENDD .CLOSED .EXIT 1.;$.; Exit for error encountered by IND.;.ERXIT: .EXIT 4 .END ; &.DATA .ROOT P0-P1-P2-P3-P4-XTF-RMSROT.DATA P0: 00 .DATA HROOT1: .FCTR SCRINM-KEYFMT-CHMPRS-SYSIID-YROOT-ZROOT .DATA .NAME FLAT .DATA .NAME LANDM .DATA F12345: .FCTR FLAT-*!(COT1FL,COT2,COT3FL,COT8-COT7-COT4,COT5-SYSINI)3V .DATA H12345: .FCTR FLAT-*!(LAND-*(HCOT1,COT2,HCOT5-SYSINI),COT3FH,COT8-COT9D-COT4) .DATA ; .DATA .NAME ROOT# .DATA QP: .FCTR STARTEDT-OVTRACEL= .DATA RES: .FCTR ROOT-STARTE-MAIN-EXEC-FILEIO-WORKIO-RES01BD .DATA RES01: .FCTR ARITH-BADKEY-CALLFI-CALLWI-CHMCHK-CHMCLR-RES02A .DATA RES02: .FCTR CHMMRK-CHMPRN-CHMSEL-DATA-EMOV-EXECNO-RES03T00Q@{ATADATADATAF .DATA RES03: .FCTR FCHAR-FCOLIN-FCRLF-FDEC-FPUT-FPUTCH-FPUTME-RES04I .DATA RES04: .FCTR FSTRIN-FTEXT-INPUT-LDIVIS-LFLNO-LXCOMN-LXPRIN-RES05I; .DATA RES05: .FCTR MESS-NOOPEN-PAUDIT-FLITER-RQLCB-RES06SE .DATA RES06: .FCTR PRPARN-REAJOU-SCRCUR-SCRDEL-SCRELI-SCRFCU-RES07AE .DATA RES07: .FCTR SCRFND-SCRINS-SCRNDL-SCRNIN-SCRNOR-SCRREV-RES08-E .DATA RES08: .FCTR SCUPDM-SCUPDN-TIAUTO-TICLRA-TISAVE-UFBUFF-RES09C> .DATA RES09: .FCTR UGBUFF-USSTRI-USSUBS-WFAPPB-WFBOTT-RES10E .DATA RES10: .FCTR WFCMPL-WFDELB-WFDELL-WFGETB-WFINSL-WFIOGN-RES11PE .DATA RES11: .FCTR WFOPNB-WFRBUK-WFREAB-WFREAC-WFREAF-WFREAI-RES12-D .DATA RES12: .FCTR WFREPB-WFREPL-WFSPLB-WFTOP-WFWRIB-UCVTCA-RES131 .DATA RES13: .FCTR WFIOGW-WFIOPW-WFFINB-SCRCOMA .DATA ;? .DATA BLISS: .FCTR B16SAV-B16FTN-B16CH5-B16CH1-B16CH3-B16ABSC .DATA ; .DATA .NAME LMODE B .DATA COT1: .FCTR LMODE-LXCOM-RANRPO-RANNEX-LFCOUN-UFSTRI-COT1AM .DATA COT1A: .FCTR WFLOCL-*(LX1,LX2,LX3,LX4,LX5,LX6,LX7,LX8,LX9,LX10,LX11)0D .DATA HCOT1: .FCTR LMODE-LXCOM-RANRPO-RANNEX-LFCOUN-UFSTRI-HCOT1AN .DATA HCOT1A: .FCTR WFLOCL-*(HLX1-L6-L9-L11,L5-L13-LC4,L8-L12-LX11,L14-LC4)' .DATA LX1: .FCTR L1-L2-L3-L4-LC2-LC5A$ .DATA HLX1: .FCTR L1-L2-L3-L4-LC2 .DATA LX2: .FCTR L5-LC3 .DATA LX3: .FCTR L6-LC1-LC6 .DATA LX4: .FCTR L7 .DATA LX5: .FCTR L8-LC1 .DATA LX6: .FCTR L9-LC1 .DATA LX7: .FCTR L11-LC1-LC2P .DATA LX8: .FCTR L12-LC1 .DATA LX9: .FCTR L13-LC3-LC41( .DATA LX10: .FCTR L14-LC3-LC4-LC5-LC7 .DATA LX11: .FCTR L15-LC2 .DATA L1: .FCTR LCLEAR-WFCLEA .DATA L2: .FCTR LDEFK-LDEFM .DATA L3: .FCTR LDELET- .DATA L4: .FCTR MACCAL) .DATA L5: .FCTR LWRITE- .DATA L6: .FCTR LFILL-LNONCTC .DATA L7: .FCTR HLPLIN-HLPTOP .DATA L8: .FCTR LINCL .DATA L9: .FCTR LINSERA. .DATA L11: .FCTR LMOVE-WFCOPL-WFECOP-WFSCOP% .DATA L12: .FCTR LTYPE-LPRINT-LRESF .DATA L13: .FCTR LSET-SETCOMF .DATA L14: .FCTR LSHOW-KEYPAD9 .DATA L15: .FCTR LSUBS-LGETST-LSUB-LSUBSN-LPUTCH-LTADJ.( .DATA LC1: .FCTR WFENDI-WFSTRI-WFRESE .DATA LC2: .FCTR LQUERY .DATA LC3: .FCTR SCRWID .DATA LC4: .FCTR HLPSET! .DATA LC5: .FCTR DEFKEY-CLRKEY. .DATA LC6: .FCTR FILL .DATA LC7: .FCTR FINDKED .DATA COT1FL: .FCTR LMODE-LXCOM-RANRPO-RANNEX-LFCOUN-UFSTRI-COT1C> .DATA COT1C: .FCTR WFLOCL-L1-L2-L3-L4-L5-L6-L8-L9-L11-COT1D5 .DATA COT1D: .FCTR L12-L13-L14-L15-LC2-LC3-LC4-LC5 .DATA ; .DATA .NAME LPARSEK .DATA COT2: .FCTR LPARSE-PRPARC-PRMACC-PRPARD-PRGETT-PRAPPN-PRGETC-COT2AA1 .DATA COT2A: .FCTR PRNUMR-PRPUSH-PRSEMR-PRISTOF .DATA ; .DATA .NAME CMODEW4 .DATA COT3: .FCTR CMODE-COT3I-CC1-COT3B-CC2-COT3O5 .DATA COT3Z: .FCTR CMODE-COT3I-CC1-COT3B-CC2-COT3YF# .DATA COT3A: .FCTR CHMINI-SCRRESO> .DATA COT3B: .FCTR CHMIST-CHMICH-CHMSPL-CHMDCH-CHMSLI-COT3CL .DATA COT3C: .FCTR CHMDLI-CHMFST-CHMCMB-CHMONS-CHMREP-CHMSPO-WORDWR-COT3D7 .DATA COT3D: .FCTR CHMSCH-MCTOP-MCBOTT-CHMGDI-CHMGIN0 .DATA COT3O: .FCTR COT3F-*(COT3A,COT3G,COT3H)* .DATA COT3Y: .FCTR COT3F-*(COT3A,COT3X)T .DATA COT3F: .FCTR CHMGCO-CHMGQU-CHMGSU-SCRINI-CHMPAR-CHMKEY-CHMGBU-SCRWID-SCRREM@ .DATA HCOT3F: .FCTR CHMGCO-CHMGQU-CHMGSU-CHMPAR-CHMKEY-CHMGBU/ .DATA COT3G: .FCTR CHMEXC-*(COT3W-C5,C7-CC4)T> .DATA COT3H: .FCTR CHMEXV-C11-*(C12,C13,COT3V-C5,COT3U,C21)R .DATA COT3X: .FCTR CHMEXC-CHMEXV-C11-C5-*(COT3W,C7-CC4,C12,C13,COT3V,COT3U,C21), .DATA COT3W: .FCTR C1-C2-C3-CC3-C4-C6-C10! .DATA COT3V: .FCTR C14-C15-C16T% .DATA COT3U: .FCTR C17-C18-C19-C20 E .DATA COT3I: .FCTR CHMCHA-TITYPA-SCRINM-MCCHAN-MCLEFT-MCGETL-COT3JC@ .DATA HCOT3I: .FCTR CHMCHA-TITYPA-CHMEIN-MCLEFT-MCGETL-HCOT3J> .DATA COT3J: .FCTR TSTKEY-KEYCOM-KEYCHR-CHMEME-KEYPUT-COT3K@ .DATA HCOT3J: .FCTR TSTKEY-KEYCOM-KEYCHR-CHMEME-KEYPUT-HCOT3K> .DATA COT3K: .FCTR KEYIMM-SCRESC-CHMNEW-SCRNOS-CHMBEL-COT3L9 .DATA HCOT3K: .FCTR KEYIMM-CHMNEW-SCRNOS-CHMBEL-HCOT3L< .DATA COT3L: .FCTR TIDELE-MCRIGH-CHMBWR-MCUP-KEYTRN-COT3M> .DATA HCOT3L: .FCTR TIDELE-MCRIGH-CHMBWR-MCUP-KEYTRN-HCOT3M> .DATA00.; The following patch defines the default filter mask for the>.; selected error logging feature. Each bit is related to the<.; error log type packet code. A bit set indicates that the=.; error log packets for that type WILL be logged in LOG.ERR.>.; A zero indicates that those packet types are to be ignored..;5.; bit packet type categoryU:.; --- ------------------ ------------------.; 0 error log control control.; 1 device errors peripheralG".; 2 device information peripheral+.; 3 device control info system_informationc.; 4 memory errors memory+.; 5 system control info system_information +.; 6 control information system_information;".; 7 CPU detected errors processor.; 8 software detected softwarer.;.; Default = /ALLp.;$ .DATA GBLPAT=ERRELI:DEFLTR:003777 .DATA / .CLOSEp.;.; Generate ELIBLD.ODL.; .OPEN '$CL'ELI'TYP1'BLD.ODL .DATA ; .DATA ; TKB ODL FILE FOR ERLc .DATA ; '$COM'e(.IFF $FCSTK .DATA ; LINKING TO '$RSLIB'#.IFT $FCSTK .DATA ; USING '$DFLIB'n .DATA ; CREATED BY '$BLDID' .DATA ;.;9.; This overlay structure is for when FCS is in the task.r.; .IFT $FCSTK .DATA .ROOT ELI,FCS.IFT $FCSTK .DATA ;sk.IFT $FCSTK .DATA ELI: .FCTR '$LI'ERL/LB:ERRELI:ERRRSB:ERRRDT:ERRPAR:ERRMSG:ERRUCB:ERRSHO:ERRSHN-LIB1-LIB27?.IFT $FCSTK .DATA LIB1: .FCTR LB:[1,1]SYSLIB/LB:CATB:CBTA:EDTMGNH.IFT $FCSTK .DATA LIB2: .FCTR LB:[3,54]RSXVEC.STB/SS-LB:[1,1]EXELIB/LB.IFT $FCSTK .DATA ;$/.IFT $FCSTK .DATA ; THIS IS THE COMMON FCS CODE..IFT $FCSTK .DATA ;n=.IFT $FCSTK .DATA FCS: .FCTR FCSRT-*(FCSB1,FCSB2,FCSB3,FCSB4)a.IFT $FCSTK .DATA ;ef.IFT $FCSTK .DATA FCSR1A: .FCTR LB:[1,1]SYSLIB/LB:XQIOU:XQIOI:WAITI:COMMON:DARITH:ASSLUN:UDIREC:PPNASCR.IFT $FCSTK .DATA FCSR1B: .FCTR LB:[1,1]SYSLIB/LB:BKRG:DIRECT:ANSPAD:BIGBUF:RWFSR2X.IFT $FCSTK .DATA FCSR1C: .FCTR LB:[1,1]SYSLIB/LB:RETADR:RDWAIT:WTWAIT:RWBLK:RQLCB:OD2CTM.IFT $FCSTK .DATA FCSR1D: .FCTR LB:[1,1]SYSLIB/LB:EOFCHK:WATNOD:WATSET:CKALOCI7.IFT $FCSTK .DATA FCSR1F: .FCTR LB:[1,1]SYSLIB/LB:PARSET.IFT $FCSTK .DATA ;T).IFT $FCSTK .DATA ; BUILD THE FCS CO-TREE3.IFT $FCSTK .DATA ; .IFT $FCSTK .DATA .NAME FCSROTA.IFT $FCSTK .DATA FCSRT: .FCTR FCSR1A-FCSR1B-FCSR1C-FCSR1D-FCSR1FI.IFT $FCSTK .DATA ;T(.IFT $FCSTK .DATA ; THIS IS THE OPEN LEG.IFT $FCSTK .DATA ;U .IFT $FCSTK .DATA .NAME FCSBR1,.IFT $FCSTK .DATA FCSB1: .FCTR FCSB1A-FCSB1B.IFT $FCSTK .DATA ;I<.IFT $FCSTK .DATA FCSB1A: .FCTR LB:[1,1]SYSLIB/LB:OPEN:FINIT7.IFT $FCSTK .DATA FCSB1B: .FCTR LB:[1,1]SYSLIB/LB:.CSI1Y.IFT $FCSTK .DATA ;$-.IFT $FCSTK .DATA ; THIS IS THE "GET/PUT" LEGC.IFT $FCSTK .DATA ;T .IFT $FCSTK .DATA .NAME FCSBR2Y.IFT $FCSTK .DATA FCSB2: .FCTR LB:[1,1]SYSLIB/LB:GET:GETSQ:PUT:POSIT:POSREC:PNTMRK:EXTEND .IFT $FCSTK .DATA ; ).IFT $FCSTK .DATA ; THIS IS THE CLOSE LEGD.IFT $FCSTK .DATA ;D6.IFT $FCSTK .DATA FCSB3: .FCTR LB:[1,1]SYSLIB/LB:CLOSE.IFT $FCSTK .DATA ; (.IFT $FCSTK .DATA ; THIS IS THE CSI2 LEG.IFT $FCSTK .DATA ;N6.IFT $FCSTK .DATA FCSB4: .FCTR LB:[1,1]SYSLIB/LB:.CSI2.IFT $FCSTK .DATA ; .;N.; This structure is used when there is a resident or supervisor mode librar00@{ATADATADATAy..;.IFF $FCSTK .DATA .ROOT ELI$.IFF $FCSTK .DATA ;Cd.IFF $FCSTK .DATA ELI: .FCTR '$LI'ERL/LB:ERRELI:ERRRSB:ERRRDT:ERRPAR:ERRMSG:ERRSHO:ERRSHN:ERRUCB-LIBG.IFF $FCSTK .DATA LIB: .FCTR LB:[3,54]RSXVEC.STB/SS-LB:[1,1]EXELIB/LB: .DATA .ENDS .CLOSE .EXIT 1$.;$.; Exit for error encountered by IND.;.ERXIT: .EXIT 4CSTK .DATA ;N6.IFT $FCSTK .DATA FCSB4: .FCTR LB:[1,1]SYSLIB/LB:.CSI2.IFT $FCSTK .DATA ; .;N.; This structure is used when there is a resident or supervisor mode librar.;1.; JJM311 14-JUN-86 UPDATE IDENT TO 05.00 T..; GM001 17-OCT-86 UPDATE IDENT TO 05.01.;%.; Modified for RSX-11M-PLUS V4.4 by:R.;!.; J. C. Franzini 4-Sep-90 05.02.2.; JCF396 -- Add .TSK for SYSGEN under VAX-11 RSX.;!.; J. J. MELVIN 10-FEB-1992 05.03*.; UPDATE IDENT DUE TO CHANGES IN CODE .ONERR ERXITT .ENABLE SUBSTITUTIOND .ENABLE GLOBAL:.;.; Generate ERLBLD.CMD.; .SETF $UTYP1; .OPEN '$CL'ERLBLD.CMD .DATA ;$ .DATA ; TKB BUILD FILE FOR ERRLOG .DATA ; '$COM'- .DATA ; USING '$DFLIB'5 .DATA ; CREATED BY '$BLDID' .DATA ;& .DATA ; BUILD ERL.TSK (ERRLOG TASK) .DATA ;8 .DATA '$TK'ERL.TSK/FU/PR/-FP/-IP'$MMSW','$MP'ERL/-SP= .DATA '$OD'ERLBLD/MP .DATA ; .DATA TASK=ERRLOG" .DATA IDENT=05.03 ; M-PLUS V4.4 .DATA UIC=[1,6] .DATA UNITS=12 .DATA ASG=LB:1 .DATA ASG=TI:2 .DATA ASG=CO:3$ .DATA ASG=LB:10 ;ERRORS.LOG LUN$ .DATA ASG=LB:11 ;ERRORS.ACC LUN& .DATA ASG=SY:12 ;USER OUTPUT FILE .DATA ASG=TI:2 .DATA ASG=CO:3D .DATA STACK=64C .DATA PAR='$GENX' .DATA PRI=148 .DATA / .CLOSEG.;.; Generate ERLBLD.ODL.; .OPEN '$CL'ERLBLD.ODL .DATA ; .DATA ; TKB ODL FILE FOR ERL  .DATA ; '$COM'T .DATA ; USING '$DFLIB'0 .DATA ; CREATED BY '$BLDID' .DATA ;.;9.; This overlay structure is for when FCS is in the task.T.;< .DATA .ROOT ERLOG-LIB-COL-FCS,FCSOVR,LB:[1,1]'$DFLIB'/DL .DATA ;K .DATA ERLOG: .FCTR '$LI'ERL/LB:ERRLOG:ERRRSB:ERRRDT:ERRPRC:ERRUCB-MISC-STBA .DATA ;* .DATA STB: .FCTR LB:[3,54]RSXVEC.STB/SS .DATA ;; .DATA MISC: .FCTR LB:[1,1]SYSLIB/LB:CBTA:CDDMG:CATB:C5TA .DATA ;% .DATA LIB: .FCTR LB:[1,1]EXELIB/LBB .DATA ;/.IFF $11MPL .DATA COL: .FCTR '$LI'MCR/LB:COLOGL5.IFT $11MPL .DATA COL: .FCTR '$LI'PRL/LB:COLOG:TISET; .DATA ;& .DATA ; THIS IS THE COMMON FCS CODE .DATA ;= .DATA FCS: .FCTR FCSR1A-FCSR1B-FCSR1C-FCSR1D-FCSR1E-FCSR1F. .DATA ;C .DATA FCSR1A: .FCTR LB:[1,1]'$DFLIB'/LB:XQIOU:XQIOI:WAITI:COMMONTJ .DATA FCSR1B: .FCTR LB:[1,1]'$DFLIB'/LB:PARSE:PARSDV:ANSPAD:BKRG:DIRECTL .DATA FCSR1C: .FCTR LB:[1,1]'$DFLIB'/LB:RETADR:RDWAIT:WTWAIT:BIGBUF:RWBLKF .DATA FCSR1D: .FCTR LB:[1,1]'$DFLIB'/LB:EOFCHK:WATNOD:WATSET:CKALOCD .DATA FCSR1E: .FCTR LB:[1,1]'$DFLIB'/LB:RSTFDB:DELETE:CLOSE:FINITK .DATA FCSR1F: .FCTR LB:[1,1]'$DFLIB'/LB:RWFSR2:EDTMG:ASCPPN::.CSI1:.CSI2A8 .DATA FCSB2A: .FCTR LB:[1,1]'$DFLIB'/LB:PNTMRK:EXTEND .DATA ; .DATA ; BUILD THE FCS CO-TREE .DATA ; .DATA .NAME FCSROT, .DATA FCSOVR: .FCTR FCSROT-*(FCSB1,FCSB2) .DATA ;! .DATA ; THIS IS THE "OPEN" LEG. .DATA ;. .DATA FCSB1: .FCTR LB:[1,1]'$DFLIB'/LB:OPEN .DATA ;" .DATA ; THIS IS THE "OPFID" LEG .DATA ;/ .DATA FCSB2: .FCTR LB:[1,1]'$DFLIB'/LB:OPFIDB .DATA ; .DATA .END .CLOSEA .EXIT 1.;$.; Exit for error encountered by IND.;.ERXIT: .EXIT 4A FCSB2A: .FCTR LB:[1,1]'$DFLIB'/LB:PNTMRK:EXTEND .DATA ; .DATA ; BUILD THE FCS CO-TREE  .ONERR ERXIT .ENABLE SUBSTITUTION .ENABLE GLOBAL.; O.; Modified by:.; A).; R.KRISHNA 31-MAR-86 02.01 RSX-11M-PLUS ;.; RK041 -- Add support for RX33. Add the module FMTDU and. .; update the ident to 02.01..;.; T. Schoeller 2-May-87 02.02@.; TMS056 -- Allow /@Y and /BAD on RX33s. Also, emit warning6.; status when user says "No" when queried as to-.; whether to continue with formatting.:.;%.; Modified for RSX-11M-PLUS V4.4 by:.;!.; J. C. Franzini 4-Sep-90 00.IFT $IAS .DATA '$TK'FMT/-FP/CP/PR,'$MP'FMT/-SP='$OD'FMTBLD/MP .DATA TASK=...FMTi! .DATA IDENT=02.03 ; M-PLUS V4.4L .DATA PRI=65 .DATA ASG=TI:2,SY:3S# .DATA ASG=TI:4 ;ERROR MESSAGE LUNf .DATA PAR='$GENB'1 .DATA /; .CLOSE.; D.; Generate FMTBLD.ODL.; 6 .OPEN '$CL'FMTBLD.ODL .DATA ;  .DATA ; TKB ODL FILE FOR FMT .DATA ; '$COM' .DATA ; USING SYSLIB .DATA ; CREATED BY '$BLDID'D .DATA ; I.IFF $IAS .DATA .ROOT ROOT-*(PRS,RK5,RK6,RL1,RM8,RP4,RP7,RX2,RP2,UDA,DU)PG.IFT $IAS .DATA .ROOT ROOT-EXEC-*(PRS,RK5,RK6,RL1,RM8,RP4,RP7,RX2,RP2) A .DATA ROOT: .FCTR '$LI'FMT/LB:FMTROT:FMTIO:FMTMSG:FMTDAT:FMTSUB 3.IFT $IAS .DATA EXEC: .FCTR LB:[11,17]EXECUTIVE.STB % .DATA PRS: .FCTR '$LI'FMT/LB:FMTPRS% .DATA RK5: .FCTR '$LI'FMT/LB:FMTRK5% .DATA RK6: .FCTR '$LI'FMT/LB:FMTRK6 % .DATA RL1: .FCTR '$LI'FMT/LB:FMTRL1D% .DATA RM8: .FCTR '$LI'FMT/LB:FMTRM8 % .DATA RP4: .FCTR '$LI'FMT/LB:FMTRP4 % .DATA RP7: .FCTR '$LI'FMT/LB:FMTRP7,% .DATA RX2: .FCTR '$LI'FMT/LB:FMTRX2I% .DATA RP2: .FCTR '$LI'FMT/LB:FMTRP25-.IFF $IAS .DATA UDA: .FCTR '$LI'FMT/LB:FMTUDAF+.IFF $IAS .DATA DU: .FCTR '$LI'FMT/LB:FMTDUT .DATA .END  .CLOSE .EXIT 1.;$.; Exit for error encountered by IND.;.ERXIT: .EXIT 4TA RK5: .FCTR '$LI'FMT/LB:FMTRK5% .DATA RK6: .FCTR '$LI'FMT/LB:FMTRK6 % .DATA RL1: .FCTR '$LI'FMT/LB:FMTRL1D% .DATA RM8: .FCTR '$LI'FMT/LB:FMTRM8 % .DATA RP4: .FCTR '$LI'FMT/LB:FMTRP4 % .DATA RP7: .FCTR '$LI'FMT/LB:FMTRP7,% .DATA RX2: .FCTR '$LI'FMT/LB:FMTRX2I% .DATA RP2: .FCTR '$LI'FMT/LB:FMTRP25-.IFF $IAS .DATA UDA: .FCTR '$LI'FMT/LB:FMTUDAF+.IFF $IAS .DATA DU: .FCTR '$LI'FMT/LB:FMTDUT .DATA .END  .CLOSE  . .ENABLE SUBSTITUTIONr .ENABLE GLOBALI .SETT $UTYP1 .; .; UPDATES TO RSX-11M-PLUS V2.2:.;3.; DPR002 - Change IDENT to M41.00 for Release V2.2..; .; UPDATES TO RSX-11M-PLUS V3.0:.;<.; LMP025 - Add global def to use system default page length.; .; UPDATES TO RSX-11M-PLUS V4.1:.;;.; LMP107 - Make more room for dynamic memory since FCS hasL6.; grown (change RES PAR length and use NOANSLIB for.; plain FTB) IDENT 8.00.;%.; Modified for RSX-11M-PLUS V4.4 by:.;!.; J. C. Franzini 4-Sep-90 08.01O2.; JCF396 -- Add .TSK for SYSGEN under VAX-11 RSX.;.; GENERATE FTBBLD.CMD.; .OPEN '$CL'FTB'$TYP1'BLD.CMD0 .DATA ;4 .DATA ; TKB .CMD FILE FOR FTB (FAST TASK BUILDER) .DATA ; '$COM'd .DATA ;!.IFT $FCSTK .DATA ; USING SYSLIBD(.IFF $FCSTK .DATA ; LINKING TO '$RSLIB' .DATA ; CREATED BY '$BLDID' .DATA ;C .DATA '$TK'FTB'$TYP2'.TSK/-FP/-SG/CP'$MMSW','$MP'FTB'$TYP2'/-SP=p .DATA '$OD'FTB'$TYP1'BLD/MP .DATA TASK=...FTB" .DATA IDENT=08.01 ; M-PLUS V4.4 .DATA STACK=128 .DATA UNITS=6 .DATA ASG=TI:1A .DATA ASG=TI:2N .DATA ASG=SY:3; .DATA ASG=SY:4' .DATA ASG=SY:5.%.IFF $MAP .DATA PAR=GEN:40000:120000B6.IFT $11M .IFT $MAP .IFF $FCSTK .DATA PAR=GEN:0:1400006.IFT $11M .IFT $MAP .IFT $FCSTK .DATA PAR=GEN:0:177700:.IFT $11MPL .IFF $FCSTK .IFF $FSLTK .DATA PAR=GEN:0:160000:.IFT $11MPL .IFT $FCSTK .IFF $FSLTK .DATA PAR=GEN:0:177700..IFT $11MPL .IFT $FSLTK .DATA PAR=GEN:0:177700 .DATA EXTSCT=$$LBR1:221108 .DATA GBLDEF=P$LNTH:74 ; SET NUMBER OF LINES PER PAGE.IFF $FCSTK .DATA '$LIBOP'. .DATA / .CLOSEA.;.; GENERATE FTBBLD.ODL.; .OPEN '$CL'FTB'$TYP1'BLD.ODLA .DATA ;4 .DATA ; TKB .ODL FILE FOR FTB (FAST TASK BUILDER) .DATA ; '$COM'T .DATA ;!.IFT $FCSTK .DATA ; USING SYSLIB7(.IFF $FCSTK .DATA ; LINKING TO '$RSLIB' .DATA ; CREATED BY '$BLDID' .DATA ; .DATA .NAME FTBAd.IFT $11MPL .IFF $FCSTK .IFF $FSLTK .DATA .ROOT FTB-ROOT1-ROOT2-*(LEFT-LEFT0,MIDDLE-MIDL,RIGHT-RGHT)00@{ATADATADATAj.IFT $11MPL .IFT $FCSTK .IFF $FSLTK .DATA .ROOT FTB-DFLIB-ROOT1-ROOT2-*(LEFT-LEFT0,MIDDLE-MIDL,RIGHT-RGHT)J.IFT $11MPL .IFT $FCSTK .IFF $FSLTK .DATA DFLIB: .FCTR LB:[1,1]NOANSLIB/DLX.IFT $11MPL .IFT $FSLTK .DATA .ROOT FTB-ROOT1-ROOT2-*(LEFT-LEFT0,MIDDLE-MIDL,RIGHT-RGHT) .DATA ;U.IFT $FCSTK .DATA ROOT1: .FCTR '$LI'FTB/LB:TASKB:ALBLK:ALELD:ERMSG:GTWRD:GTPPR-ARITHIO.IFF $FCSTK .DATA ROOT1: .FCTR '$LI'FTB/LB:TASKB:ALBLK:ALELD:ERMSG:GTWRD:GTPPRR7.IFT $FCSTK .DATA ARITH: .FCTR LB:[1,1]SYSLIB/LB:ARITH .DATA ;: .DATA ROOT2: .FCTR '$LI'FTB/LB:IODAT:SRCINS:STINP:TABLS .DATA ; .DATA .NAME LEFT)J .DATA LEFT0: .FCTR '$LI'FTB/LB:BLDSG:GTCML:INITL:P2OPT:SCAN:SCVTR-LEFT19 .DATA LEFT1: .FCTR '$LI'FTB/LB:P2POP:P2LBR:PRFND:RESLBT .DATA ; .DATA .NAME MIDDLE.& .DATA MIDL: .FCTR '$LI'FTB/LB:P3MDS .DATA ; .DATA .NAME RIGHT .DATA RGHT: .FCTR RGHT1-RGHT2K .DATA RGHT1: .FCTR '$LI'FTB/LB:ALALO:DKALO:DSALO:HEADR:MPOUT:P4MAL:P5ELMC? .DATA RGHT2: .FCTR '$LI'FTB/LB:P5EOS:P5IMG:P5MDS:SGALO:TPMEM. .DATA ; .DATA .ENDL .CLOSEINS:STINP:TABLS .DATA ; .DATA .NAME LEFT)J .DATA LEFT0: .FCTR '$LI'FTB/LB:BLDSG:GTCML:INITL:P2OPT:SCAN:SCVTR-LEFT19 .DATA LEFT1: .FCTR '$LI'FTB/LB:P2POP:P2LBR:PRFND:RESLBT .DATA ; .DATA .NAME MIDDLE.& .DATA MIDL: .FCTR '$LI'FTB/LB:P3MDS .DATA ; .DATA .NAME RIGHT .DATA RGHT: .FCTR RGHT1-RGHT2K .DATA RGHT1: .FCTR '$LI'FTB/LB:ALALO:DKALO:DSALO:HEADR:MPOUT:P4MAL:P5ELMC? .DATA RGHT2: .FCTR '$LI'FTB/LB:P5EOS:P5IM .ONERR ERXITE .ENABLE SUBSTITUTION. .ENABLE GLOBALS .SETF $UTYP1A.;.; GENERATE FXRBLD.CMD.;.;%.; MODIFIED FOR RSX-11M-PLUS V4.0 BY:N.;.; J. R. KAUFFMAN 12-MAY-860.; JRK330 -- VECTOR THE TASK AND BUMP THE IDENT.;%.; Modified for RSX-11M-PLUS V4.4 by:..;!.; J. C. Franzini 4-Sep-90 03.02.2.; JCF396 -- Add .TSK for SYSGEN under VAX-11 RSX.; .OPEN '$CL'FXRBLD.CMD .DATA ;" .DATA ; TKB .CMD FILE FOR FIXER .DATA ; '$COM'A .DATA ; CREATED BY '$BLDID' .DATA ;5 .DATA '$TK'FXR.TSK/-FP/-CP/-SE/MM/PR,'$MP'FXR/-SP=S .DATA '$LI'EUT/LB:FIXER .DATA LB:[1,1]EXELIB/LB/SSM .DATA LB:[3,54]RSXVEC.STB/SSN .DATA /" .DATA IDENT=03.02 ; M-PLUS V4.4 .DATA UNITS=1 .DATA WNDWS=1 .DATA PRI=100 .DATA TASK=FXR... .DATA PAR='$GEN'a .DATA / .CLOSE .EXIT 1.;$.; Exit for error encountered by IND.;.ERXIT: .EXIT 4CMD .DATA ;" .DATA ; TKB .CMD FILE FOR FIXER .DATA ; '$COM'A .DATA ; CREATED BY '$BLDID'  .ONERR ERXITM .ENABLE SUBSTITUTION  .ENABLE GLOBALe.;.; Generate INIBLD.CMD0.; JML109 Correct Multiply Defined symbol $INDEX.;.;3.; CBP - Add GBLDEFs for the /POS switch defaultsS.;'.; Last Modification Date : 17-July-861.; Modified by :.;.; Todd Schoeller 23.011.; TMS033 -- Update task IDENT.;.; Todd Schoeller 23.02A-.; TMS038 -- Correct this file for vectoring.A.;%.; Modified for RSX-11M-PLUS V4.4 by:T.;!.; J. C. Franzini 4-Sep-90 23.032.; JCF396 -- Add .TSK for SYSGEN under VAX-11 RSX.;.; R. SPINNEY 7-SEP-90 23.04=.; RWS025 - Mark MFD as contiguous when it is created. s6.; This change is needed when creating the boot disk 6.; for the PRO used as the console device on VAX8xxx.-.; This change has no effect on RSX systems.e.;.; R. SPINNEY 4-APR-91 23.05/.; RWS028 - ANSI Standard Label Version 4 --.; Year 2000 Supportv.;.; D. Carroll 4-Sep-1998 24.00?.; DC516 - Include support for system specific date formatC2.; and full date information into the home block.;.; .SETF $UTYP14 .OPEN '$CL'INIBLD.CMD! .DATA ; TKB BUILD FILE FOR INI  .DATA ; '$COM'  .DATA ; CREATED BY '$BLDID' .DATA ;G.IFF $IAS .DATA '$TK'INI.TSK/PR/-FP'$MMSW','$MP'INI/-SP='$OD'INIBLD/MPo?.IFT $IAS .DATA '$TK'INIT/PR/-FP,'$MP'INIT/-SP='$OD'INITBLD/MP  .DATA TASK=...INI .DATA STACK=32- .DATA IDENT=24.00 .DATA UNITS=3 .DATA ASG=TI:10& .DATA ASG=TI:3 ; ERROR MESSAGE LUN.IFF $IAS .DATA PAR='$GEN'; .DA00.IFF $IAS .DATA PART2: .FCTR '$LI'INI/LB:INIBAD-MCR-EXE-STBSSS.IFF $IAS .DATA PART3: .FCTR '$LI'INI/LB:INIALL:INIBIT:INIHOM:INIMAG-MCR-EXE-STBSST>.IFF $IAS .DATA PART4: .FCTR '$LI'INI/LB:ININDX-MCR-EXE-STBSSD.IFT $IAS .DATA PART1: .FCTR '$LI'INIT/LB:INIPAR:INIUPD-COTTG-STBSS7.IFT $IAS .DATA PART2: .FCTR '$LI'INIT/LB:INIBAD-STBSSTL.IFT $IAS .DATA PART3: .FCTR '$LI'INIT/LB:INIALL:INIBIT:INIHOM:INIMAG-STBSS7.IFT $IAS .DATA PART4: .FCTR '$LI'INIT/LB:ININDX-STBSS:.IFF $IAS .DATA ;'.IFF $IAS .DATA MCR: .FCTR '$LI'PRL/LBF-.IFF $IAS .DATA EXE: .FCTR LB:[1,1]EXELIB/LB .DATA ; .DATA .END .CLOSEI .EXIT 1.;$.; Exit for error encountered by IND.;.ERXIT: .EXIT 4:ININDX-MCR-EXE-STBSSD.IFT $IAS .DATA PART1: .FCTR '$LI'INIT/LB:INIPAR:INIUPD-COTTG-STBSS7.IFT $IAS .DATA PART2: .FCTR '$LI'INIT/LB:INIBAD-STBSSTL.IFT $IAS .DATA PART3: .FCTR '$LI'INIT/LB:INIALL:INIBIT:INIHOM:INIMAG-STBSS7.IFT $IAS .DATA PART4: .FCTR '$LI'INIT/LB:ININDX-STBSS:.IFF $IAS .DATA ;'.IFF $IAS .DATA MCR: .FCTR '$LI'PRL/LBF-.IFF $IAS .00  @{ATADATADATA .; IPPBLD.BLDI.;>.; Build Indirect Pre-Processor (IPP) for M-PLUS and Micro/RSX.;.; Written by:.;.; R. D. Haney 30-Oct-86.;,.; MODIFIED FOR RSX-11M-PLUS VERSION 4.1 BY:.;#.; PAUL K. M. WEISS 5-NOV-1987 1.01;$.; PKW134 - DON'T BUILD FSL VERSION.; 8%.; Modified for RSX-11M-PLUS V4.4 by:Y.;!.; J. C. Franzini 4-Sep-90 01.0252.; JCF396 -- Add .TSK for SYSGEN under VAX-11 RSX.; .ENABLE GLOBALN .ENABLE SUBSTITUTIONA .SETS TYP1 "RES"R .SETS TYP2 "RES"4 .IF $TYP1 = "" .SETS TYP1 ""P .IF $TYP2 = "" .SETS TYP2 "" .; Create IPPBLD.CMD.- .OPEN '$CL'IPP'TYP1'BLD.CMDn .DATA ;;3 .DATA ; TKB .CMD file for IPP variant "IPP'TYP1'"L .DATA ; '$COM';.IFF $FCSTK .DATA ; linking to FCSFSL as a resident libraryT2 .DATA ; created by '$BLDID' at '' '
:2 ZDD``CT@DKDL0DM  FDP DU0H0`Fx@hRH ,FRH ,FRH,FRH,FRH,FDF\FtF,FRH,FDYxZDD,DTfMTRF(F@ZX,pf8 zMSRMU@LPLLPPRh z$<Tl fPPlfYLp,YL@,YL,YM@f f8,P,h, 0 FYJ F8 8 B B F F H H L L YHXXQ Xh h r r v v x x | | XU          XW          OG          XM          YZKM            ZA        $ $ OI( ( 2 2 6 6 8 8 < < OJ@ @ J J N N P P T T OKX X b b f f h h l l ZLp p z z ~ ~     LA          OC          ZZ          ZY          XA          XB          XD  " " & & ( ( , , XP0 0 : : > > @ @ D D ISH H R R V V X X \ \ ZB` ` j j n n p p t t XEx x         DUTX           YN          ZC          MUZE            YVh hX X \ \    &&<  SY   Aq v5 w0 -w| 6wp* * <Vw6z} *2G g@G gFR6Z*^D~r<|V0Fߕ8 NN5 $> 0  " r 8(:>C Xj|Z  @    5  > 0P  N  C 4FxC~C( 0 }w.&<0"  qBE? E U%4CK {9r }4::00vATADATADATA<@N:j@DLd $*06%DNzNG?7 .EE@E?%E 2 $* 0"6&0:n 00:eEE EE `}eE%E EEB  ERE?ER%E0:6`p?|Eh xE^E[GDE%@EL%E5@EPE :% 5|^;F`;Ff;FEEU5?EU E%0EU@%P 5EE %EU E5t;FEME?E7|@   | Ap 65 Hz @  5 et$;F$:F6^;F4 h;F5 z;F4 ?U0N x x   ` #ߋff   ɋ ɋ  !U        E    E`wQX 58U0N 5(.;F4 N;F4 R;FX;F\ѫBxp;F5 ?5 2 %e  E? `5+U0N D  U7;F4 R;F4 v;Fz;F4 EzN  TAC @&,MT J2,YL ,DY ,DP Hp2&&  r  25  le%4 3, x n1  B4 || E NE @5   H e@ 5   *Nj 5DX  57 %7 p 0 >,RH@ 5 65 $d>t2A 5*  5 w, 7 vwn5@  0  q ,DM-  ^0Uɋ   5w wE 0 ,DL! UI5 P0vl  5w7 0 ,DKO  P#57  : E 5  15@J0 0Xz0U    5  1 5@  ,DU,MUt Yb 08lbd,MUe w e@w UU` P %- w V`|J4TTTw:w:0 1 E   UB 5. b > E % 40f>\E%AE%%(: 75 4De '  5@  `]wXwTR    4 A%MU%DUB` E e ߕ0 p&& z "4 eT%MU%DU 5 %YV CE% %  GIOQ͋&  ^&%@>%% Et C PU  B>2tߐ ,MU נ  (e ߕwf<H5 ͋ t6fTZ͋ .<&   < f <͋͋ < H  E  I  *D j   X  @ Z A 8  @ " &% lv\   D!x5    T%&LV U@  @  1      H  @5   5 ~5   @   xv,MUh  7V  H tH 5@  0005 45 *  ɋ    f -H%@  JT<h  , &@   @  %  FE g%(e7&f :Z^(w&f5 e( wdT (. %DU%MUA  2(R(V.5 e` e 6 #  8(p(  (     4 X$6 ('.<&%t4hp!>(Ne;^`;h`w78  ,)&ff >H0  A H0  e  HPteCa @> !b zaDs@<&@p@:2@`@@گf@'@<&%t@:t @ձ@?T@z:@X@:@' q@t @`;@ @hp!@ ""@h""h""@hyh""h,vh*""h""h""hy(  File open failureFile read failureFile system failureFile close failureFile deletion failureFile write failurq e ACO -- Illegal command line 6;SHOWSYSGENRK05RK05FRK06RK07RL01RL02DOUBLERP02RP03DSRS03$6(;z zDSRS03 DSRS04 DSRS04 MMTU16q MMTE16 MMTU45 DBRP04 DBRP05v DBRP06 DRRM03 DRRM02 DRRM80 DRRM05e DRRPXXF DRRP07i MMTU16e MMTE16l MMTU45   MMTU77n MFTU78WEMML11AEMML11BDRRM0622u2XXUNKNOWNrz   "'*()*, AHI"200jrz $(,048<@DHLP*TX\` dhl"p20074232444553R707A7383l84U93949523-PLUSLSI-11/73KXJ11M11 (MENTEC)%NProcessor Type: 11/%I%NProcessor Type: %I%10SMemory Size: %M. Kw%2NOptions: X Name Vector CSR Unit Type Remark Mixed MASSBUS devicesTM02TM03TM78Priority %QFailed to interrup%tSector interleavedDual accessB%2E%E %P%6S%Q%21S%N%VS%I%N%29S%5<%I%Q%5>%2S%9<%I%9>%NQ_HHd 2Rm  Floating Point Processor (FP11)%N Commercial Instruction Set (CIS)%N Ext6d  2Rm ended Instruction Set (EIS)%N Floating Instruction Set (FIS)%N Extended (22-Bit) Addressing%N Switch@ Register (SWR)%N Display Register%N Cache Memory%N Line Frequency: 60 Hz%N KW11-P Programmuable Clock%N Extended Arithmetic Element (EAE)%N Parity Memory%N KW11-W Watchdog Timer%Ni.i. E m .ENABLE GLOBAL.ENABLE SUBSTITUTIONS.SETS A "A".IFF $ACFDF .SETS A "$":    E  m        .SETS 'A'R$TPR "11/%I" ! Processor Type.SETS 'A'R$TPR "%I" ! Processor Type.SETN 'A'S$YSZ %5<%M.%5> ! Memory Size in K -word Blocks%I'A'F$LPP ! Floating Point Processor%I'A'F$LTP ! Floating Instruction Set%I'A'S$WRG ! Switch Register %I'A'P$D70 ! Cache Memory%I'A'L$50H ! Line Frequency F=60Hz T=50Hz%IAKW11P ! KW11-P Programmable ClockRH DK 4 v |  DM <DL 4DP 4DU 4MU $CT MS DT DX DY DD LP MT PP PR YL YH 00vATADATADATAYMYV YZ R$N     $ * 0 6 < B H N T Z ` f r x  H11R$K11R$611R$L11R$P11R$UDAR$MYAT$A11T$U58T$C11R$X11R$X21T$S11L$P11T$M11P$P11P$R11D$L11D$H11D$V11D$Z11. DBDRDSEMMM@6 6 L> > .SETN 'A'%2A%A%M %Q.SETN 'A'%I %Q.SETN 'A'%2AA %Q%I'A'%2AB.SETN %I%2A%QA %Q.SETS %I%2A%QC "%A".SETS %I%2A%QD "%A".SET S %I%2A%QE "%I".SETN A%2A%A %Q%I'A'%2A%QB.SETN 'A'%2A%QF %Q.SETN 'A'%2A%QE %Q.SETN 'A'T$M03 %Q%I'A'RH1.SETF .SETT 6 AB A'A'NB 0B  ) :2  $    $ $ &&<8 8 SY< < t <&^ ^ b b      SY  7 .l    w: n Q$,E w   Rt  # ” @ .l s 0n 6,B^Xb f' ql<&%trhp!x6w( ” w( ” f w ” R w” B 5< # 8 ձ"6`;<J`P`r< v'|hp!” wZ T 5J Y o {     @ e,:t T ,J4Y.JLRHz( &/ f4  Z   7 7 7  -e7 5 \ p%YV5 B / 4?T2 D@ |  n Ze7R w: RX  D7 64e.*Ur DNX4  5J???,RH U(U  D( 5 > 4?Tdx5ŜE wx 5d  4  .< (5j g &8D H4L?TRZf*ew"  %YHYMœ wf w 5"%YZ5+f7 5 8%RHh $ X |%YVx7 7 :407* H,Tn4r0RH""MF"MM % QUZ "DS5UD 5U4Q4   D. 5VZ^4b?TtEW A EW | 5j 5X >5E5? >  $0BT`;%RH8= ,ew$%DK: 7 7 | ew 5  %G 7  W= (: >| P dGr = hQ5 J5@G777 7| Few 45 ewb U/ H= :| L j x/ ( @  5 = & 2 7" @77 7 7 7* w7 (  = . L t z7 = 777 7| ^  5l57v\r%YL hR 7Z @w 5 = *| hR #%DK6 >(: 8 *w  a 5 ( 7r %RHN 77a &6  $8 6 Ha X( br p ~a r '5( 5/ 7r `5@7w7 :e bj "( Z J( &/ 0r V n v( / N > &B 6T ) N < ” 3,DK B5G</   > "B 00WJ\ZajhvmDU,MUAf E \ A A A A E : A A A A A E E w r:xb e@P4& ,e%YV E ~e5 ef7  4p:2~T )fŜ &f& "  "E< $ &  T d<Zf, 5 ec  e 瀱 5   < p ”$Ldh< lv |D  *+ f :  "e گf, f&5,Ew7 4e E!E 57- 8T~&(53Ewl7he E C~ e EE ,57- R~ 5 ec  e 瀱 5   < p ”$Ldh< lv |D  *+ f :  "e گf, f&5,Ew7 4e E!E 57- 8T~&<0b ->@5, G y     X oY 2g <XoY$p{VN> ""VN[ (&L w#$8r%%%%%(%(&W/\}0\}Cz DDGGye(eiZq(pr`s7F`sBGv8vX Z ۩K۩Q䩂vL`-k6`;`7"7""(7g'7y7y7z7\}X`Y0\X\\r`kQq#wwBxɪZ ɪ} ʪͪv(۪+(۪0(۪0(۪0(۪0(۪0(۪0(۪0(۪0(۪0(۪0(۪0(۪0(۪0(۪0(۪0(۪0(۪0(۪1(۪1(۪ 1(۪ 1(۪ 1(۪ 1(۪1(۪1(۪1(۪.1(۪/1(۪01(۪11(۪21(۪81(۪`1(۪1(۪1(۪1(۪1(۪(۪A(۪i(۪Y(^KLg'&& A}sLt LkLLLL#R:`T+NTrTs`r`s`t  ʫl̫?F̫@F̫s ̫: (̫> (̫? (̫@ (̫_ (̫` (̫f (̫g (̫h (̫ (̫ (̫ (̫qF̫F̫F̫hLF̫vQF̫BaF̫GdF̫HdF̫LqF̫sF̫4xF̫F̫ąFϫ/ϫ NϫvQϫBaϫsϫ4xϫąѫy}F+N5q je;`s 00vATADATADATA F k    < &  D, :` N vQ ?T(Fb 뀻* 뀻D b d0z d0Dϫs@ͪv@:2@ϫ N@ʫl@v8@v@ϫ4x@}@ϫBa@&W@ϫvQ@zϫą@@J@@ϫ/@۪1@ ̫4xh̫qh̫h̫h̫Bah*̫vQh8̫h̫ąh4J̫Hdhz̫?h0̫@h>̫Gdhr}h̫Lqhl̫shf̫hLh$ l7  % wR |:2v8:2v8vJv$ϫ4x*ϫ N0ϫBa6ϫ/:ϫą>ϫvQD}L}R۪1VͪvZ^&Wd}h(ϫs ʫlJJ b 뀻z k뀻D @je;@@n_@s@ϫs@@^K@5q@/\}@g'@ 2g@zͪv@@Bx@0\}@# z@s7F@$9k@X@:t @ϫ N@[@@ʫl@:br@$p@zv8@7g'@D@D@X@s@`Y@-k@<&z@ϫ4x@e@ϫBa@&W@$9΅@6`;@zϫvQ@ϫą@G@%%@;@%%@ @̫s @w@L@@:w@䩂@@ɪZ@z۪0@̫` @ϫ/@̫h @ѫy@e(@7\}@۪0@۪1@̫ @A}s@<&B@7"@{VN@%(@2ʪ@@ hh ( X7 777777777 ~  # z ̫s  wѫyʫl ϫvQ$ϫą(ϫs,ϫBa0ϫ N4ϫ/8ϫ4x<&WJe(LPe(RV$pT& & A!?mE7 7%%% fw7 tGn_ ʪsʪ(ʪ,%%4%(7 7 cw cw   -e--$w e ^K`YX`YXs7F$^K(^K08e>BxD^KJ^KTfjpϫBav۪0z̫` dw   7 7  7 7 g'ͪv ^K^KϫBa " 2g2/\}6^K<0\}@[HLPɪZTXX`Y\X^-kb%(^    mw 7 7 7 7 7w3ww3mts6`; ʫlje;5q$L&`Y*X07g'47"8D۪0BXH<R۪0VprZX``YfwjpLtXz`Y| 7 f  %DBE f  ׭   --  %% &&%%`YX :br; $ϫs*ѫy08e>;Bs7FHʫlR7yT$9kZ-kbsjp ׭   A B e  r #e \ <[ 2g X$`Y* X. oY: BTsV 2gZX^`YboYhXr`st Cd ~b 뀻z <뀻D<&Kq@p@> H""VNHXHoYHHTBxH<&9@$pHTsH`sHz H HHH~<&D@{VNH XH:@ oYH  h۩Kh@khh8Lkhzhϫsh4h#whLhLhLh^Kh|/\}hwhg'h, 2ghh&h۩Qhz0\}hϫ Nh1sBGh[hQhʫlh5v8h<7g'hXDhTDhVvh>shXh`YhTrhz`rhL#h-khzϫ4xh7ehϫBah07yh\7yhd&Wh7zhlϫvQh2 hϫąh3t hGhzLt h%%h hB̫s h.0\h`X\hh\hpwhxLh( | |P(((DD\dl\ dlxxm۶     \ t DMiB DMB DRD"" DRa 22\ :&t@@ (DR`  DR  ` DR DL((( DLP(( ??*??b d0z &d0Dje;@@ϫs@ͪv@@#""@[@@۪+@X@ɪ}@`Y@z-k@ϫ4x@Cz@:@ϫBa@۪@̫s @۪0@۪0@̫: @q@ XhZh   4  #     7 w % -k ϫBa"q*[.Cz:`Y>XBɪ}N[RϫsVje;\je;b۪0f̫: jͪvnϫ4xt|>| Е.wD ۪ &#""(̫s .:8۪0<۪+b d0z D,d0Dg'@ͪv@vL@̫4x@̫q@̫@̫@̫Ba@ϫ N@̫vQ@̫@̫ą@zv@ϫ4x@0# @̫Hd@̫?@̫@@̫Gd@ϫvQ@ϫą@}@̫Lq@۪0@̫@ @ϫ/@̫s@J̫hL@ PA}sh̫e  yh GhS T #     whvL  ̫e 0# }"v&ϫ4x,ϫ/2ϫą8ϫvQ>ϫ NF۪0J̫@ Ng'Rͪv̫e ҂҂:/&̫00vATADATADATA ̫̫̫qLI  ̫e VVOVR  ̫e \\MAN  ̫e ""bb  UPD    ̫e &&hh RETRY  ̫e **~~ READ    ̫e .. LIST    ̫e 22VV OVERRIDE  ̫e 66\\( (MANUAL ( (̫e ::bb/ /UPDATE / /̫e >>hh66PAT 6 6̫e BB: :PATTERN : :̫e FFBBALO B B̫e JJnnF FALLOCATE F F̫e NNnnOOSIL O O̫e RPR:=‚:†p ̫hL ̫Ba̫vQ̫ą"̫?(̫@*.2̫s48̫Lq:@̫GdF̫HdHL̫4xNb rh|R:h ~p& 77"$ % sBG n^nL`s7y s&7y,$9Z&.7y47y8<7yRϫ4xX7y^sd7""f7yliZqn7yr7yx۪18z7  Е.w۪17y 7y:۪1 ͪv"$95$۪0&$9f(۪0*$9f ,۪0.$9B 0۪02$9 4۪16$9) J e@ --|۪81$9Z  $9  $9& ۪0$9k $9C $9#  ۪1$s.X2`Y<^KD^Kv  %DBEw    &PНН |-k:;  ϫsѫy e&;.%%2s<@H%%Pg'Z%%^۪0hv8lv8pvjfЕ:Е P 55 uЋ f%7|:_%% ""VN"Gn_ &ϫ4x,G0:22n^6nL`:nL`>nL`FnL`R$9΅TsZg'`Gd:sfn^|Pf 0 b `%  ~%%nL` $p n_nL`$9! Gy$Gy*Gy4۪08̫f >۪0B̫g Fg'N۩QV?Sl۩Kr۩Kx۪0:D 2w fCmh hwD̫f  #w̫s ۪0̫@ $۩Qf,۩Qh2۩Qh8b <0z N<0Dk@@@#w@^K@ͪv@ݪK@@s7F@[@Q@L@z:br@X@s@`Y@Ts@ @$8r@ @;@i@%%@@̫> @@۪0@z۪0@۪0@̫: @̫? @۪0@̫_ @۪ 1@̫ @۪1@̫ @:@&&@ X@:@ʪ@B#@ oY@ ` h2+NhT+Nhqh & ,w00 (۪0,̫_ 4:br; :s>s7FF`YJXVQX`Y\X`d#wpʪR%  RRRR% $% wAE @@` CeRʪ6F%%L۪ 1P̫ Tͪv^bݪKlpݪKvk"B@ 7w f   LLL&&b d0z vQd0D:(}@@n_@+N@L@L@nL`@L@^K@X@ 2g@ͪv@z&@@oY@:p@@s7F@sBG@[@L@:br@$p@۪A@X@ɪ}@s@z:#@۪i@`Y@Z@Tr@`r@L#@Ts@`s@ @Cz@ϫBa@7y@&W@ϫvQ@zϫą@ @G@t @;@Lt @%%@%%@@T;;"@<@$9#@T+N@ <@r@z۪0@ϫ/@۪/1@۪01@۪ 1@Gy@۪1@$9!@۪.1@۪21@۪11@۪ 1@۪ 1@۪1@۪1@b%(@۪Y@۪1@R:@۪1@ X@ʪ@ oY@ ɪZh&&hx 72B/ %   :ȋ     ^%% ϫvQϫ/ϫą"ϫBa(ʪ2T+NP۪ 1T۪i` <f[j 2gt%%~Xp|7 w7   A Eew --~`Y %%`YXZX$`Y*s.2:br; 6s7FDCzN`YT`YXX^^K`Xf^Kh`Y|w 0 B7 Dw& ww e ~۪1 ۪1ͪv&W&X*`Y.%%DLHLNLR:#VsBGnL` ZLt ^L#bLh&rs7Ft`%    hȋ M   %wsBGnL`  $9#  7y۪/1۪Y ۪21$r0۪ 14۪iH&R:pVsBGnL` Zt d&hs7Fn۪.1j    e   77   w~ͪv ۪01r &* 4:<&BD&J۪11NrT <Z 2g^[\6w H  ~%% s`YXZ^KX ^K"`Y&,ϫBa2+N: >%%B:br; Fs7FN`YRXV w TT  BTTew ` T B҂ `TT ew$ l۪ 1ͪv %%Cz%%[& <0[BFZh`YlXr۪1z$p|Gn_   a`b37 K¥: C :׭ W"1C *fNl %fD`N %XR:$9! GyGy%% %%$%((L< J[^L~^K+7!(C fNl fD`N  %7! 0 % T ^KL4^K<^KB۪1F۪AP۪0TrdT;;"fGyl00vATADATADATA۪ 1rR:~%(Ҕ  &@ Š2 Е Е 1  A 2  Е:     % Lr %%,LF:(}N<X b:(}h%%p$prGn_ vR:~ rЕ Е   A 2  Е:    e    0 @%%L2:(}:<J:(}P%%X$pZGn_ ^R: a ff a Q % %ea e`q  ¥#Ћ ¥.Ћȋȥ ȥ ȥ:ȥ,Ћȥ ȥ xvww [ew   1 w`w ׭> cW ~ X`Yɪ}`Y X,L.X2L4`Y:`Y>XBɪ}L`YPXTɪ}Z[d pLr oYvLxt!ԝԊ% 4 e7 ׭7 cW tew %wc X %%LLTr*Ts , <0%%6[@ L PTb۪1fͪvpLroYvLX^L % 4 4 e7cLew %wTX %%LL`r,`s . <2%%@DR۪1Vͪv:b d0z ?Td0D#w@#@@# z@sBG@n^@ϫ4x@:@̫s @pr@w@y@z ͪvhh۪Ah=۪+h۪ihj۪h̫: h̫? h۪0h۪0h۪0h۪0h۪0h۪0hz۪0h۪0h#۪0hJ̫> h̫@ h̫g h۪0hd۪0hy۪0h۪0h۪0h̫_ h̫` h̫f h̫h hz۪0h۪0h۪/1h۪81h9۪01h8۪21hp۪1h۪ 1h۪`1hJ۪1h۪.1h۪ 1hw۪0h۪11hW۪1hz۪ 1hJ۪1h+۪1h̫ h̫ h۪Yh+۪ 1h۪1hs̫ h7""h۪1h۪1h۪1hiZqh 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 etrrorFailed to read Manufacturer's Bad Sector FileBAD -- Invalid switchBad block found - LBN= 000000000000BAD -- Command I/O errorBAD -- Command too longBAD>LBN(S)= BAD -- Invalid block number - 000000000000BAD -- Duplicate block number - 00l0000000000Bad 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= 000000000000LBNS allocated to BADBLK.SYS= LBNS in bad b#dlock file= Allocation failureSv # w &J - &wwr #w"̫s &ϫ4x,w4̫s :wBJFprL̫s N# zT#V̫s Zpr^sBGb:dn^lp̫s tyt foundFailed to read Software Bad Sector File Volume label incorrectHome block not foundFailed to read BADBLK.SYS headerBAD -- Block already allocated LBN= 000000000000LBNS allocated to BADBLK.SYS= LBNS in bad b#dlock file= Allocation failureSv # w &J - &wwr #w"̫s &ϫ4x,w4̫s :wBJFprL̫s N# zT#V̫s Zpr^sBGb:dn^lp̫s <0b (*@<r00 ""#K& 'xx'I'J'q'q.y25 ;F ;F ;FVDM_M2VNVNRyRyX@:d rr0Mt vPv gwp:x yzP<~y`;$$ $$$$$$t!$!$g'$($^K$L$Q$`e$y$Z$$ą$$$irZrtvxkxxSxxykyyxݪK.yr ΫGGK}`eą$b dXz}dXD@$@Hg@&@L@l6p@ @p@nr@:2@ q@Ϋ@zHCT@^K@& HsE@+{p@}@-@2@$ą@;@5 HӪ@$Z@$t!@$@z#""@$@$!@3{@v@VNHz}@G#@:br@> HK@;F. @;F4 @C @4@z$@}@$^K@(@f@;FV@LT@eĊ@VNH6F@nH@rZ@ X@$ @$L@zRy@nOH@$`e@X@$@sE4 @H @f@J@w@\f@ѫBx@Eq@0u@$g'@zw@ @Xu@u@GQ@ @@$@@$@$@$(@'q@@'q@zZ>!@Z?!@`;H!@t H@@:d HC@/Ip&@*;@ت@6F4 @$Q@6F. @z6F3 @x@x@L N@y@@3I@W@@  ""hyhKh6"&hݪKh:z2hyh4{yh h"Mxxh;F hvPh*zPB`;hPsh #KhDMh rr0Mh(wp:h.'Ih_M2h"'xxh'Jh:x:h uh uh Hvh h8y(  0;F. ;F4  +{p 3{wCH HCTL NeĊC xx J"$}&-(Ӫ*Hg,nr.2$,00vATADATADATA44&ѫBx z} LT ;4HWPAWBFXf(@ @ j"rj"  )( (sz<<LBD:D @"  "d&:br @":246"8d < BOO -- Syntax error BOO -- File not found BOO -- Invalid load device BOO -- File not contiguous BOO -- DPB error BOO -|- Label or boot block read error BOO -- Not a system image or device BOO -- No transfer address BOO -- Device not mounted BOO -- Privileged command BOO -- Device not in system BOO -- Device offline BOO -- Cannot map virtual device to physica tl - xCxXX000: BOO -- System image is using incompatable bootstrap - mXX BOO -- System image has not been saved BOO -- Incompatable boot block BOO -- Processor A is onlinei  f  Bl0 65 "t ;   bXB'q 'q&;FV,Ry2Ry:u>lBFR\fTZ b"fltp^K )1w*w"w5w 55$oNH 5 wwwx w5l w ( 18$(<$@l6pbxf}~$(www L އ * @wAw%DZ%DWXT %DB%DR%EMRHJ$^K$^KL"ت($ ,$ :$g'H$NnHR$Vvt e wwv~OVOP @ wEw@ 0 6%DY5 5HW !W@LPT`$hp v~ 7l&m($Dwvwlwb <ŝ%DKWut "5EW#WN $$^K$$^K*DD qF(J$LP$XWbh"7 $wmw www5@%05 A e?WtE oHww e vw b $L$$^K$^K"$(($L.$<$b$t!$`e@ f$Qj$Lp$L~$( %0]  @e~eMe7 5:`"5Ze5,R5-wLw`wwwL$($$$2$>"NZKhp$t$x$| |<mw  ` ~5wf&L wP%v$(L L$  Z>!Z?! $"Z>!&Z?!*Ϋ.$:Ϋ@KHZ?!LZ>!bLfnتn F|< <]5^w^m7 57 l7 v%DU | L w"$ą*6$Z:$Z>GQG# @3IF$ZJ/Ip&NEqP$ZT$Q^rZ$`e h$Zj w`w 7` `w w`w 7`~5 ߕX  n &  5$XDU WE |0u0u XuXuZ>!Z?!Z>!"Z?!&Z?!*.K2rZ<$B FfHfT \ Xh rnOHz ~  XE WH XH <   A~0  mB m?    d    8$^K<$^K@$ F$ N6F. Z$Qb$t!$`e f6F3 j$`er$zΫ~6F4 b 5_#H vd H,@Ћ @wf 6F4 6F*;sE4 "sE&$!$`e *0H6<BHNTvZd`Hf,lr* 7\w7  \#""y"db dpz`edpD5 @6F@*S@$@f@y@*;@6F5 @6F4 @6F2 @6F3 @ z$h$Zhx$t!h$h$h$!h$yhx$h$^Kh|;FVh*rZhF$ hRyh$Lh$`ehZ$hrhF$g'h$h$h$h$(h'qh 'qh$Qh00 6F4 @6F3 J6F2 PfT*St*;|6FUC~E   T>8U06F5 y4y xp@0.E4 *  hh-VFdF!$ $  mA m 5f̦ A>5 *b XzXD6F4 @  Ϋhth` xkhb Gh Gh> ykh xh yh< xxh yxh *xSh h" *}Bvh *}8DT p ` W  f DXH D j  j  DY ~ z  p `  f H D j " ,j . 2 4~ 6 4<  B " <  B ` ` ׭YQU͕͋  5@@E͕5@͕e   u͋ 5DE͕  (׭C7;E41U(D D X   ͕ zu p5 fކ B͵  e Fe0 (6F4 \6F4  ~ ĝ(͵% A @% A ``` ` <eP ׭aЋНWA HEU@7=7]5  7P7P6   vu n5 fԆ ҁ B@5 > D  > 5  5@ $ `e~ 5  ĝ1͵ PH A @5 LLUF% A ``` ` Nb t0ząt0D:@$@""@L@l6p@ @:2@"&@# z@E @@:br@z> @K@$^K@vP@VN@;F @:+@)W@v g@D@$k@Ps@$g'@$@@Bt @u@u@y@@ z$ąhR R  N0 NN:+VNȂ > : VNȂ"> $N(0<:br>VNȂ@> BNFRR52e-7 $< <%XT%RH%DM%DU7 ~ 6w vt $g'$k$k$$k"$k( ,$.L2L6:KVXE `$kd$r6zunEW w w > : &6 w  w h""Ps($^K,$^K0"&)W 4"&)W 8@uJDR:2\6hu00vATADATADATAv# zzy4Jx! ELP*xv g";F &vP*l6p.DDM%DU7 ~ 6w vt $g'$k$k$$k"$k( ,$.L2L6:KVXE `$kd$r6zunEW w w > : &6 w  w h""Ps($^K,$^K0"&)W 4"&)W 8@uJDR:2\6hu<0b + 5@,<`+T+l+ +! %:+(3Z+3g+C(}+K+!%+!>+# # #p # # # #8 # # # # # # # #( #@ #@ # # # #0 #X # #0 #X # # # # # %4}+@ +E\}8H@!sM,+sM&.+FO+!yU!UW!Y_+ `+:dw8n !q+qH+q+qL +[y +\y-y\}8y@`+ {!{ { { {@ { { 0{9-0{D-0{n-0{-0{-0{-0{-0{-0{-0{D-0{-}!f!"!r}=%:+/K+2g p+ r+$$%$,$p%&+DpD$w!G> +GVN+GZa~ i|q+oL!prtrt]H vr+]H  (P  > ? ?T  !M:4L !`;(P=M+s+k+ĩK+X.d.!..6L .6Yq5Rt +_ _+ q!%q!T +yK!1C%>g?g@gAgBgCgpM7M!f8f8+-ڪG+kS!&d&:"!&.&\K!,r,L .-~!-:Ar!GK+GZ+Q+R!RK^bU,L +z(PrrW+ X}d2rƫƫȫ !ȫW!̫$ .D̫@`̫P`(P̫s.D̫u~+ͫ !ѫ1`^5R+뫵W+a4f! = +5s+DL 0r< ! " :eeedfbf!r(Ps+Wy-y.y.Dl4:!5@Mxs8aYq:rb zL Ds@?T@$9΅@{@#@ hƫhZ Xhƫh2kh &Ol|GOl|Ol|"  "2f2p $) p&% @BW R 2.<$9΅>sD{# H?TLb z0DGP}@h: ?h@  |m   mU E5h5aK%1%3&fEp   !%"k*D$w. %:0k4sM&.6/K<Jȫ PX$9΅Zsh$9jszȫ e W e e7`nWp(w`f.%1% )UsB:.B$9΅DsR$9TsZ{#@ ^?TrqL t/K$ EEqL /KsM&./KV b z"D#XH'#HCg@Bg@#0H&`;@k@#H뫵W@R@{H{@Hz{H#H W@#H#H#H#(H#0H(#XH)#H*!%@?T@#H#@H#Hz%4}@ ?@{H{H{H%&@#H#pH #H #H #H#H#H#8H#@H Z#H#H##H#H$#H#H% ?Th:2gzԀ| >##((((%NBPR -- *DIAGFATAL*- (%2R)%N:##( ( ((2g Ԁ.Illegal error - severity code %P %P %P %P 2g  ԀԀ**I/O error 2g * Ԁ*Ԁ4$4Batch job %3R still in progress 2g 4 Ԁ4ԀTTSpawn failure 2g  T ԀTԀbbLog file close failure 2g b ԀbԀyyLog file output error 2g y ԀyԀBatch file already open 2g  ԀԀBatch file close failureP 2g  ԀԀ Batch file deletion failure 2g   ԀԀLabel %2R undefined 2g$ $  ԀԀ'Error during send to Queue Manager 2g( (  ԀԀ3Incorrect ESB address returned by spawned task 2g, ,  ԀԀB.BSyntax error - $JOB does not appear first 2g0 0B ԀBԀllBatch file input errorc 2g4 4l ԀlԀ2Input request from incorrect virtual terminal 2g8 8 ԀԀ3Output request from incorrect virtual terminal 2g< < ԀԀSyntax errorg 2g@ @ ԀԀCannot spool log file %Ip 2gD D ԀԀ&Unable to create virtual terminal 2gH H ԀԀ(9(Log file00!vATADATADATA directory not found - aborted batch job %3Rg 2gL L( Ԁ(Ԁ]]Log file open error 2gP P] Ԁ]Ԁq1qCPU time limit exceeded, user job terminated 2gT T q ԀqԀLogin privilege violation 2gX X# ԀԀSystem I/O errorl 2g\ \$ ԀԀ%Virtual terminal I/O was abortedr 2g` `% ԀԀSystem error 2gd d& ԀԀ0Virtual terminal output too long for buffer 2gh h' ԀԀ#)#Specified maximum CPU time too largee 2gl l(# Ԁ#ԀHHJob was aborted via CLI 2gp p)H ԀHԀ` `I/O error -- file not found 2gt t*` Ԁ`::w De +W# f  . B 1 @| f& ZW 2g.%&26?T<@?TD.H?TR?TV1Z뫵W^?Tb%&l |CgF f  U B%& BgCg%&R,!%%4} .k8`;@ ? b Xz:XDk@뫵W@@{@@(Hl@#z z@\g@u'@J$@?T@_@zݩ݁@@!%@GK@7M@R@?T@+"!@#@sM,@DhZ@)x@,@GZ@{@zG]\@U݁@i{@($@#8@Db@ 1hCh>gh?ghDBgh@ghCghMhz+hZ=h$,hѫ1h-h$ph  = h\$%hU,hphDph~%hp}h2Agh{`Z{@{( YT WT2_M`ZhRyhX2ghVDh$h N$H$P>H 22 % PP _M`B B ppPz zZ Z3SP:[1,7].LOG PR ,_M`R pp WT ($ Db G]\  i{ J$(( ݩ݁00U݁_M`PPVVxx%FQMG Batch Job - %3R%6SBPR V%2R %Y %2Z%7SPage %MProcessor %2R%2N%3Z%8S%VA%9STERM%3S%VA%9SDATA%3S%VA%9SSKIP%3S%VA%11S.%4S%VA%9S%VA  n% = P7 Xv% XW ttP%XXVxDhZGKR$(R,R0R 8<_M`XBFDhZHGK\djp_M`Xv|_M`X % P%XX< % P%XX" % tDhZGK"(_M`X.4_M`X:BDhZDGKNV\_M`Xbh_M`XnvDhZxGK~P7 X d% 7 X R R5pf& e%w ~_M`X DhZ"GK._M`X 6_M`R:>?T B_M`RFsM,HkNd\gn#z zv{@# z?Trz-VV   V5#f& e Rx7 GK _M`V _M`_M`V "_M` (_M` 0_M`2_M`V8kDRu'\GZbGK f_M`Rjxn_X JR :5'( B~ f& e%U % w&f v_M`X _M`R뫵Wl k &_M`2 @,J+"!R!%TkZ#z zb{#8 f?Tp7Mt7M2dȥ"ȥaȥzÀ N~  _M` 7M>b 0ze0D00)PDRP?TTX^fȫ lt$9΅vs|{#@ `(UsE 5 U% wt?T qL  /K qL "/K(# z* 0sM&.2/K6ڪG>$9΅@sN{# V?TZ{# l T$ x    T$ {#0  CgTBg%&x"&=M*=M0ȫ 6?T:%&>BgBL; RXBg\TdBghCgVb zeDͫ @ b@Cg@Ag@k@@{@$,@-~@K@#z z@?T@zT @!%@7M@$p@W@#@ȫW@ = @>@$%@f@&\K@E`@@{@j&@$@ q@%q@#p@S@ L..h4̫@`h&.h GZhXh4 ȥ/  w nww 5Y Fw f& e%jf&tS>W(ȫW,&\K.K2&\K4K:K>KB$,F!%HkX$pf{p#z zr bx$%|| e%Zf& e%Lf& e%<E  | #z z b&E`0#z z2 b8$pF&P#z zR bX!%Zk^CgdhKlKr{#p v?T\w  - -  7  w wx>W = $ q%qf"K$T *K,T 2-~@ͫ D$H7MLAgX{# b XzeXD"@Y_@#w@#@k@ @}@#""@?T@f@&:"@/K@Z&\K@{@.@S@ `@#@ &h.hT}h ""wU  t7 7 7%U%wwE Z 8 E BX# #""#w `k*&:"0&:":f>"F&\KJ&\KR `Tkf |U%7 %wpU%%E~%W  "e  W#_W#Y W#RW#Y^ S".0{# 4?T<@F"J}`{# d?T$ W-_UEY_/KY_ /K b ~zf~D b@s@k@y@`@ @#@%&@=@nt @ĩK@n@:Z@znz@:@#z z@q@n&@# z@; @{@`@n'@?T@a@`@W@nK@a8@zD$w@#@$p@#@/K@$%@l2X@T; z@U,@n4@E`@a@qH@{@Lk@z&@n@[(}@axZ@ny@Dp@ %:@}@k@K@i|q@ RK^hp Nw 55w 7 7 7 5UUUW %: ky@`k{# }"001vATADATADATA?T&D$w*k./K2ĩK6`8/K> %:@/KF %:HkL %:@JU W7 -d/K# z Lknt Kkn'"i|q&l2X(ny0i|q4q:sa@`LE`V#z zX b@^wf& e%w \ĩK{#  ?T$p&(#z z* b0{# 4?T8Dpg@Cg@Bg@3Z@ b@#w@&@s@#0@n H#@zk@C(}@ {H _ @@FO+H{@ĩK@..@`^@$,@3g@H@Hl@!>@z# z@#""@#z z@̫@`@UWH#@?T@W@.@}@p@@!%@?T@$p@zW@#@&.@#@@/K@GZ@ = @>@2@$9΅@$%@f@%4}@T@{@z@@{@@ @{@%&@$@#@"@[y @yUH#@#@ +H `@z %:@#@X@K@ "hͫ h hRh}h-~hKh4L hfh,ȫ hzD$whoLh87Mh.&:"h*ȫWh&\Kh0fh.hk~ qh%qh~ k:d@QArhSh    |  . .HuH'%I' exit status returned - %IWARNINGERRORSEVEREERRORenabling action in "ON" commandstopping user batch job&uog,.wyw&ww@#wu#"" o #g&.̫@` GZ$.. kpk@w  k _ !w  k >ydw  k̫@`**&}w  kGZ kk8888,.]w  kX k " kFFFF09JJw  k . k " kTTTT_XXw  k & kkbbbbwffw  k }pp!ttw  k h5 5 h E  ] ~ O  H55%4}k$,!%k>$lC(} &k6 = :$ >k Bk~FfV{# Z?T`3Zbkv@U%@ E  0%09 5& \   5%wU~@ k @ k@ k"{# &?T8%4}:kV!>Xk^f$9΅hsn{#@ r?T`swE% 55 5  Ex[y /KW[y  /K$*{# .?T4C(}6k< %:>kD$,H!%JkP>V$Z`^jwE%F5B5-0 - w7~C(}3gT k W# zY_/K$( `*k04#:HCgLX^{#0 b?TftH  E|%&7 pd Х$ ȥ!w EFC`˥~%& H?T%&Bg Cg$ `&k*# z::d@QB# zL$P2Z2lWp3Zrkz$-U009g$p,{6#z z8 b>$%LV#z zX b^K`kp"z#z z| b&l7  JĩK ĩK{# {# {# "?TNb 0zr0D#@ b@k@y@`@R@Rt @0{D@nXq@@{@!>@#z z@z`@dl@@_@?T@lD @ r@ȫ @D$w@#X@npl@!%@?T@@/K@dlV@zsM,@Q@%4}@ ?@ƫ@dlAy@@ƫ@{@%&@[y @Dp@%@dl@ %:@2 `;hzh̫P`h hD  . %3Z Batch job - %3R completed on VT%O: ,dl8d8055 E 7 dU 5dlAy dlV dl@ r %:k %4}"k({#X ,?T0!%%4} 2k6@ ?P rX!>Zkb`h@ U8 E5U5  5%/K nXq@ƫy@`k 8$ƫ*y@`,k0[y 2/K8 %::/K@ %:BkHD$wPV\Dp`sM,bk^f& e% E 2 = ~%#z z b${# (?T,sM,.k2lD 4Rt :2>Q@nplDQFnplJƫPZ .V  f J__ _ȫ 0{D  %& ?T&%&*R`b @zs@DY_H3ZH@s@G> H`;@y@`HC(}H a@0{D@R@3gH@dl&@z{@z@lH !>H̫P`@`H?T@ȫ @#@!%H@#@@RK^@dlV@$9΅@zsM,HGVNH%4}HM:@ƫ@TH6x@̫$ @sM&.H@ H{@ @qL H6L @̫s@z[y H `H %:H,L @KH qhJkh<뫵Wh(%:hLRt h9hdĩKh> phlshFzqhL h@5sh_h=MhN rh8T hHGKhRhTWh6/Kh:QhBڪGhqHhNGZh&*%&h̫u~hh@i|qh6(l :K,KOl|JVT>$ ,Ja 6L ",L 8>hh7d? 7 7 7 x%w$@k,tdlVdl&d(6x8>s@DsFȫ 0{D JsR$9΅TsZ{# ^?Tb$j@t,EP5L'5DE}@; @-@ax@`@f@n)L@_@?T@a@`@W@nK@ r@ȫ @lD @zn@@dlY@n4@#@#@#(@npl@aW@?T@n@$kul@sMf,@/K@$kLl@c&~@zT;@sM,@Q@n_@T; z@axZ@n@qH@nD@ƫ@GZ@{@n@&@%&@z@[(}@̫u~@p@dl@nU@axZ@dl00AvATADATADATA:@@nt @%@nz@nZ@+"6@#@Jnf@k@n&@n?@ 8̫$ h̫shp %3Z Batch job - %3R started on VT%O:- queue %2R does not exist- queue %2R marked for delete- error code returned by QMG |= %MM  w -"W qsT; zp1 Nw7 7 7 www| p r{@# _ _&_,?T0 r4k8/KRt ldRt $sM,&k.M6+:_>[(}B_F[(}J_N[(}R+Vkz~EJPA Е: eҕ[ҔB~ҕ] ҕ.ҕLҕOҕG|%% a@`+axZlD Rt ѫ1"nz&nz,:6qH:nK@nzRn_X; lѫ1p%taxZxѫ1ff e%$%wUff e%wpf& ezaW#z z b$+"6& b0lD 2Rt 6`8/K<%@1BaWFCHaxZV`#z zb blpz&Np%wLw:wwz#z z blD Rt  $dlY&n(*sMf,,nt 0n)L2Q6n)L8QnplBQDnplH_Jn@\1 1 211 1 %&% A_n@ _ n@nDnDnfnM"nU&n',n?0ƫ6lD 8Rt <@$kulF&L$kLlRAVQR_2 C>:8zQ _{# ?T$(dl:*n(.Q0npl4Q6npl@ڪG@{@#@@ %:@" ahzM:h  7VT  zhz5(& x% 0,.0,0   w sZ %:kȫ 0{D $# z&s, H{#@ L?TP>TWXڪG"b z:!D@g@k@C(}@ {@0{D@3g@$,@{@-~@(@l@?T@zȫ @oL@a~@!%@7M@t]H@$p@#@2g@ bz@ = @2@$9΅@D@f@bT;@T@@ @$@$9!@:y@:@#@ 6Yqh `^h   $  )wF5w &f&r  s5  UP5  z ȫ 0{D {# @ k:$p> bzB$,FJ$TT;Z!%\kjC(}lkr$vC(}xk^E A ȥ$U  Q U5"5 |C(}3gT  k2C(} k& = *a~.t]H2f8 {kD:JlLkR3gTkZ2g % P~Е 7 % % 3 rDD(Q 2g$7M*2g07M4$8@g<D$9΅L{00IN2:dwhy\}hE\}h  <!5xf7 7    Xt#e!#JL#Fe Iw7   ^3ZkT  7M($ ,̫e 00# ʆFr2І4>ʆFf   4 " > F &r ,.2 24 8> >Flw  w ww w7 w` }WT  &8WH$Pȫ 0{9 Vȫ 0{D ZAr^ddb zaYqD#X@?g@y@k@0{D@(@?T@ȫ @:s@2g@$9΅@D@b$9@T; z@U,@{@{@@ @#@#@#@ -h"  :s "r"%w&ff5"- f% | ȫ 0{D {# ?T*@ ,k2D( 62gDHDTT; z`$9΅hDj2gn{#X w&ŝť1 ť+ ŋ Е ť0Е Е 1 Nf%6r,sm*ť$ŋЕ 7ҥ 0?T2g8FT; zR$9΅\$9v2gzD  %ʥ  7 7 ť .ť  ť   ť        D y2g2?gB?gFU,R?gX?g\?g`?gd?g~?gZ 7 ʇ ~wX  b2g2gD D$2g.2g4D62gH{# L?TR{# V?TNf<0b . @*};;;;;;;n;~;!;e";&;I[;s;y;4;;;;;;" ( ;F VN; aH ?TU4O :(<O 2g;O s;O ; 4R;k;kBx;zox;z};zK?T^;t!;z;<;;f;&;(;{8;R;S;W;Z;E`;y;;4;#;xQ;s;sMx%?T;&k;&;&kf;&Kq;@&;A&;;;y&;@9;C9;4R; ;;;;k;z;;!;&;^K;R;4R;S; T;_; g;s;0u;u;8};4;ԅ; ;މ;<K;"";&;4;;G};H};z.zBx;z;z=;z0;z;{De;{4;2g;!;ttJSt>N   t#  t>ttt00QvATADATADATA2ttLtqt+-<tVttltntzt6t=tCktttt&t4tXtutttnt t%!>!t!t!>t"t"t%t%%tJ&t&t't{(t(t2tl3tB4t4tu5t5t58t8t85989t::f;>;UKtDMQtQt4Rt8RtRTtsTW>WW"XttXtYtYYtZt]ZtZtv^N`tZakf>ft"qtLqtstttt>xtxxtxtytzzz>8}t ttt4t5t{Dtbttt‹tt$t>~>N>> ;> p;> ;> ;> ;t!^K;t!s;t!s;""VN;""4;#g';#2;&K;&;& ;&K;z&kf;&Bx;a'\/;U(^K;(;+K;D,k;D,u:;zD,K;v,VN;,C ;, U4,k,,ZU4,M:;,y:U4,:U4,vLU4,VN;,Y;,aU4,h;l-';,.vLU4.;)0h;)0h;,05;20W;2;2;2t!;2!2V;z2;2k;2;2^K;2kf;22g;e4@;ze4^K;8 ;8;8p!;t:;:s[:<};H ;H;Ht ;H ;H ;HO ;Hk;H;H;H;H;H;Hz;H{;Hm;H;Ht!;H"";H#;H#;H%);H2;H8;HI:;Hy:;H:;H*K;HK;HvQ;HQ;HR;HS;H_X;HY;HY;HY;Ha;HBa;Hf;Hp;Hp;H[q;H_q;Ht;Hw;H4x;H6x;Hy;Hy;Hz;H;H4;H;H;H;H6;^K`K" ;KKq;_M!;M&;VN;xQ;xQ2g;Q;Q&;zQ8};Q0;zQlL;Q;Q2&;Q*};QlQ" QO ;QB;Q;Q ;Q!;Q&;Q(;Q2;Qy:;Q N;QDV;QBx;Q|;4Rp ;z4R!;4R#;4R2;4R^K;4RZ;4RDf;4R2g;4Rs;4RBx;4R;SS~;?T*};W2g;_X2g;_Xy`Z;Z`;Zk;Z q;Zs;ZZ;_2g;:d"";e&[e2[fwff4;k*} !q;!qMx-qsIqIqIqLqE;[q[qqs;s X;z s(# sD ; s ;zsH;sZ;zsZ;s;s;s;zsq;zs &;s;s;s;s&;s;s ;s#;s#;sQ;s4R;sS;sd;sx;sz;s4};v,;vk;vv;v!;v#;v&;v@8;vDf;vkf;vqv0u;vu;w0;zwZ;wZ;wZ;wZ;wy:wYU4wYwowU4x;x;x;y;y;y;4}k;4};4}kf;4}Bx;8}"";8}*}>lM;lBx;?T>;%';9"";9VN;9?T;4;4p ;z4> ;4!;4"";42;4^K;4xQ;4Df;42g;4Bx;4;;ąxQ[9 =2g;K;;; Z;Ό;Ό;Pd;8;b;鍒;`(;=f;Mx.<22[PK2g;\};Z;^K;"";g';';t;4q;[M-N;1; ;6-#t;4q;k;t!&;De;;y;;z"@""t"҅"$k;$xQ8%%;%X*;z%*;z>/K;C<C&CdCfCzC4D%;D`[EdJO:;M+q;N}au~;bVKb4MbOMe;ey;e e0.e;ipHip;i+qHixx;i kkN`k8tnM;s6F;sF;s-G;sGslHt.tvm1vm1Lp;y;};4}tKMxK;zlL;=M;x;xQ;z [00YNOM;VN;<;xQ;z[[; k; R{l* ;z*;z,^;6;6}6;6;6't686L:6s:;6 ;6p;.6y;6;7;@&;@(; ;W;Z;ɪ^f;ɪf[ɪg[ɪ;̪k;̪;̪z;̪;̪;̪ ;̪"";̪"&;̪&;̪g';̪';̪2;z̪y:̪q;̪s;̪w̪Bx;̪y;̪z;̪ ̪;̪=;̪;̪;Ϊ;ΪD;Ϊ;ת;RT;,`;=;Ԙ[;;[s$-;-;-;-y;-z;-z;-;/;IWOv;R;R;R&;R&;Rg'[R^K;RS;R];Rw;Rw;R8};R4;Rމ;{3};z}?;}@;}A;}B;O (224RSY z;X.;D[ 0Qy>;r ;k;>"&;&;zg';';w;z4;zމ;+;Z;;xQ;RT;2X` ;};W}h~ ~XH;ǫ+;ǫ,;ȫ0u;ȫXu;ʫf;̫;̫;̫̫ϫQ>ϫQϫQϫRϫ.ϫ.ϫ.ѫ&;ѫ^K;d>d;=f;De;z﫪;;;y;z;qr=; [[`;;r;8;6@#B;Y`;.Yd;Y;YrtZ0;zaW;jO jj&j!j!j2jYj}j4 X;zŭ X;zy}b ?SU4BSU4Z  F GO p:#O :(<k<;zR%,e,-e 1e 8e<;ezHe{Le&MxeE,U4e2[ee4{let:}e:deIqes %jL\ly::""`t^K`Qp SP} ve?T[qr>r}Fwz8} .8}?T> r00avATADATADATA b 0z F0Da'\/@s@:2@Q@x@%X*@sZ@%*@n`@%'@#g'@nL`@zH@̪@k@s@6@n^@R&@}@@}B@}A@%?T@Z q@@& @De@z'@H @?T@!q@Iq@[qq@Zs@H@H@y@T; z@vq@B@9VN@s@RLq@̪g'@7@2@lM@s@ Iqhh jw   55 55 5e`e07 5~vqxxHH  }A&H (}B.H0}@:!q@!qJ!qP!qTlMX6\Q^̪g'd̪hyfy-uE !  \k` 0`H a @]77a -5 U5@eewmhn`s Z qsZZs.lMJZ qNlMRsZVsZXZs`a'\/fsh'na'\/vs|s 55   22e55 ueef f!anL`!q !qnL`nL`x&xPnL`VnL`^n^hn`rst7v q^3 !5 3 f)%  7   5 5 w w vyxy$T; z&y,lM2lM6y87>yJlMTx\xl[qqrvqvszsZ~Zs7 ,U    7 "whee 55 5 `500| xy2HH 4}A:H <}BBHD}@J%X*N%X*`P!q^a'\/d%*0f!qj%*t%X*0v!qz%X*V0 `&  `e zB `  HC7 D7Af4B!qD!qH JsPsZVZ q\Zs`!qj7z& ~De7 7 7  & & & & f& & & Ε U  wu2#g' kBsIq& R& Lq *De0%?T48b Xz GXD"X@C9@a'\/@x@%X*@%*@y@H@ZZ@8}""@nL`@$@z> @H@R@:@$97@@@K@ @:!@}A@}B@}@@n^@H*K@z@:br@@@,`@H@}@g'@'@Z@!@!@@^@$9@zW@:@>/K@6s:@m @@?T@6@Hw@!@8}@e"@7@W@&Kq@z$939@$9!@%@$9!@Zk@@Hy@:Fy@z@UK@""@:@ j00iNX:DX:L PX:ZW\>/KbHd`5cP5ww55 7 7 7 7   5}@ H }A:brn^%X*PnL`H }@.H0}@6H8}A>ZZBZZFZkJZkNZZR%*Z #  %Ҕ 1OP5C5? 8 |/006RH*K}A   0%*%4@%*OFnL`JHL}ARHT}@Z%*\nL`f,`hnL`nnL` |X:6j<RRP \zPvRP D 8 P   X: nL`nL`X:P$X:R (X:P*nL`4:!6n^@:Bn^F&KqHnL`NnL`V\:br^n^b%X*dnL`V -P(׭% UP|nL`z yy$97y Z($97*y2y8:Fy:n^@nL`DzHWJ>/KN%X*PPnL`T:brjeP Pe eP leP b ^55~n^ y 78}""8}nL` nL`*nL`0nL`8$9!:y@!B8}""D8}JnL`TnL``Hb}@hHw\ZR$ .P 5( e}@ }nL`:Fyn^"nL`*:br,n^0%X*P2nL`<%X*@%*DWF>/KT%X*P^ X%X*P^ x P P%HD%R16005& %HD %R2&T z?TK ,`^ %X*P^ %X*P,`&%X*P 6X:6DHF}@ PX:XUK \%X* pX:T"^& f V5%55)}UK %X* &KqC9%X**Hy,}B2H4}A:H<}@B:Dn^ JnL` NT> %Z%ER$ ))׭%|:brn^  y$939Hy}B"X"" ,UK 28<> FyLyN$9!TyV7R%% 5%5 5R $9 y$ :n^:! n^&H(}@0Z688}"":8}>@8}""B8} J!Lg'Z$57 5 D =P5 H}@ Hy}B%""  $X:7(:.x4:!6n^@:Bn^ FX:HnL`NnL`Ta'\/Bz 'PPR P~X:X: X: X: X:PnL`X:X:P"X:$X:R*X:,X:0X:2X: nL`lPR   5 lP beP XFU@%~X:X:P X: X:R:!n^(%X**nL`.:br0n^4Hy6}BBnL`LnL`V%X* \X:bx hX:p 777P7RP$   E ) 7U{H}@ X:X:X:PX:R X: %X*8UK >xDJN> Xy^$9!d$9!j7ne":L w77 7 VOL1BACKUPD%B1111001001 HDR1HDR29'! Wm 6s: 6s:$6(6 X: 00010001000100 00000 00000 000000DECFILE11A U0414404144 M 8| 00 EOF1EOF2EOV1EOV2. b 0zO p:0Dx@a'\/@Q&@ @4R#@s@,VN@x@,k@%*@n`@sH@zVN@#g'@nL`@C<@R@OM@k@s6F@v,VN@6@n^@$9k@00qvATADATADATA4R!@Q @}B@z}A@VN@n^@> @_M!@:br@$9f@4Rs@& @$9B@O :@x@68@H@'@zv#@89@8 @y&@H @6y@Iq@8R@6L:@t:@D@H@e4@@@H@z6p;@x@}@B@@4RZ@4R@̪g'@6@20W@l@2@8@s@@BH:@@QDV@@ b6@hP6-h H5 5 ~Q&̪g'68s6FVN' VN"OM&v,VN,VN20W .VN4,VN:VN<@VNBFVNND E 4 4  C<a'\/6> n^:brn^"}$nL`*nL`.nL`2nL`66y8n`<,kBs6FDRHn`J$9Bn7     d  Eet  d   n` $9f  }e4@nL`nL`",k*e4@@nL`FnL`JnL`Nn`P$9kTx\e4@le4@,Z- - 5 $  558e4@ 8 e4@8 e4@ xe4@ x"D&e4@*62H:4}A>s6F@RBRQ&T̪g'LN555 5@ 5  H }B HH }AQDVQ  ̪g'H}A&x,Q QDV .̪g'46L::6p;>t:@sD%*F2V7 7 7  %%cc7 |& k B#g'y&y&y& Iq$89(s*sH0#g'8e4@@e4@F& JkLBP%*R2`      7  m~s #g'Iqy&y&$y&,l04Rs2s64RZ:%*<2B& H#g'LIqP8RTsV4RZZv#\4R#"D5 >_M!4R _M! 4R_M!4R!Q&̪g'O :v b 0zO :0D@9@(@C9@ @x@-@%X*@,k@%*@ϫ@sH@n`@z-qs@nL`@u5@ϫ@H@̪@R@HY@@s6F@6@n^@Q @Iq@}A@z}?@}@@n^@> @@:br@@H@@̪@}@Z`@6@@@6y@z@t:@H@e4@@@H@Y`;@ϫR@}@ϫQ@Hw@@s@PK@̪g'@Z6@@Ha@@@Ql@:@QDV@ O :h 7  % e@J ", @ 5 5 5r@9 e4@@9&.4@9@HwB}@H}NHaP}AV-\6`nHap}Av-|6||  E` e 55w5@ n j5!5t:sH0C94HH 6}A<Q QDV >̪g'LxRϫZϫ`fnL`jHl}ArHt}@z}Z  e1UH E@ e }nL`PKe4@nL`:n^PK"*x, 06@6x<:br>n^B%X*DnL`HLY`;RnL`VTJR$ R$ 5 0 ~Y`;} %X*  e4@0u5 4%*6nL`:%X*<nL` @HB}@JnL` N:brPn^ `w85@ w& w55 |Iq : n^:n^ x"ϫR,ϫQ8Z`<̪>BHD}@JHYL}?R-qsV6Z> \n^H4 4  7 55}:brn^ } nL`nL`nL`nL`6y n`$,k*s6F,R.  2}6H8}A>H@}@F}`00yN̪DH̪L}P%X*V55R$ 5  t e4@ H}@HY}?s,u5 0%X*26H8}@@Z`D:brF(JQlP:R(Nb >@2R%>@D %? b Xze,XDC9@@9@@&@@RT@Ϊ@Cd@nL`@ k@* @5@@(@z:d""@D%@H2@Q @}?@*@@Ov@6@Z0@ɪ@HO @-@e4@@ @zHk@$k@sT@i @ @vm@4R@N @̪g'@xQ@Ht!@H@f@HR@@ [Mh \5-d - 57 7  5~ H2}?C9 "&e4@.2e4@:>H@6DHF6JHO L}?R6V6jX 7 55-U   |HR}? 66Ht!}?Hk }?&Ov(6,Ov.64@9>Ht!@}?DZ0THXH`i t wW 7w me5emmw5W cW  D%i  RTxQxQ e4@$Cd(0Q 2̪g'<@&@ D@(H@&LC9PH2R}?X@(psTr:d""n.---5w  e2    |fɪ ɪɪ Ht!"}?(6,604R2666:RTB6F6L$kV kh- _EeK  eK 0 &  --vm 6"Ϊ&4R(Ϊ,Ϊ062Ϊ668xQ<6>xQVe4@Zd6j6pɪz , 5&   f&f "ɜ {@&Q ̪g' & 2 8 k:-> k@-D-nL` HvmP5R:d""Tf`dtxQ  Rfĝd b fĝd Nĝ @SefEbN --hRT 6@(N :d"" f$*f(*d2 8* f<* dF$kJ$k^$kxH E /f& N N  %6  NW!W!%%U% 4H6xQs@7Ds-Gv: -e--75tpr\ 5R -y-y7s-GR5&VN4H \HBa^}?d j-n-xHvQz}?z& BSW/W/Lw   W:ы   W#Cw4 fD`N % A, " (,Z<@RwD,ZHRw\-^:d""`f l -7! W    Е Е  1  A 2  Еd:d""f 0V2:d""4f <9?TnL` BZ0JZ0N%?TZ t:(}|<~r:    7% 7w7 7   f wd f wd  ʋ U:(}%?T9?TnL` "9?T.9?TnL` 6Rw: @Z0H*fLZ0T*d\* fd* dj |s $ W!f ww Oew   - w`wg'2 :d"" f h n cW t~ԝrԊl% 4 e7\  cW tV % ,>Z0LZ0r t:d""vf|Z0   A B %  w J    jZ0<-@-DQ0TQ0VwZZQ0\wZ`Q0fQ0lQ0v+x:d""zf~R^`w ew 5 w= fRNz:d""f -y 7s-GR%:d""f -nL` ,-0-}?H-L-X- w *R%  RRRRW#W! .W#W! h- --w0 Q0$w06Q0:w0PQ0\w0fw0t-yv7zs-G|R6AE @@` C e@ 7w  f | p%:d""fݪK$ݪKB X:brZ-n^ `:b-n^ h-nL` l-t-y~s7s-G R b d0ze d0DRT@$@nL`@* @@@(@*@6@Z0@[qq@-@ @Zvq@$k@vm@i @vm@xQ@H@‹@ $xQh  w   ew    w7 W ~  frZ0 -nL` ,xQ.-2xQ4-8RT>vmD-H-PHTH\i f| U%E   qA `  W  1 F f d f V N  H$Z0.>Z0JRvmV*f^ d* fl$ktRT|  %7    "$   E w |HHRT$(RT*.0- 4xQ6-:xQ<-@vmbi vvqzZ0p    ҁ  L`d wD q1 qA ,$   b-nL` xQRT6 @(2i 6-:xQ@xQVvmZ‹^Z0dZ0r.% eL  w vm$ vm$$*[qqvb d0zk<d0DsqHQ&H s HkBxHKsZH&KH <@L Xh)%X*h%*h)wh;z* hE4hGKhKhEkhJ{3}hAQ0hA*hC4p h?DehAŭ Xh;Z0hIw0h?4Rp hCe4@hGbxQh=t!hK}h;&hED,u:hIsh̪2hoxhxQh;s Xh2VhIb 00N H Q(H@H H4HH_qHD,KH8H {8HH[qHHt H&HHI[H zQHHHHYHHYH bHHYH@sH(HQO HHHHzH sdHH:t @<&%t@zH{HQ NH<&9@Q HH2H :br@4HH*KHHfHPdHyH> HRHHmH HH@z~HHtH HHHKHHɪ^fH\sHH HSHH%)HH HQBxHHO HE`H)0hH zH)0hHQ|HQ!H l-'H@HHHHsxH@H xQ@HkHzHxH=fH Qy:Hz9VNHsQH HwHs4RHHHz=HH4xHH6xH@H4H@szHD,u:@> pH > H yH !H@zsH,05He"H 20WH HBaHH8H,hH@z0H HaHWHsSHzHH@H6H Ht!Hz> HHvQHHQH@4> HHyH<&D@HyHxQ@HzH H""H@s HHI:HKHsHs&HzHy:H:@H:Hs4}H@HRH<HHHHQDVHHHHH#HHHH#Hz J2kfh ghxhlBxhlC9h (hL̪khNwZhB#2hP ,Yha'\/h4!h RSh@9h z zhZ&h, 4hshzQ2&h,VNhlzhΪh*2^Kh&hsZh8 O 2ghbsh xh̪zhNzΌh4R#h 4""hb xh-h^KhXRThΌh@&h^ {4hh " ( h@yh22ghPsHh<hz-yhRF VNh\\}h8}""hΪhJVNhr khB#g'h0 wZhV -zhnM&hR ZZh.9?Th2h+hz̪hZhR8}hf&h4}khT4}kfhXJO:hR̪h+Kh"Zh^4^KhhRމhn sD hF ΪDh.zQ8}hRh`̪ hl}h|wZhDѫ&h:yh@(h\ v,h0uhrhHv@8h̪BxhRhP2hL zSS~h6 kh2thr h<h|OMhfuht:d""hѫ^Kh6v,VNhdh h _X2ghZhD%hZ zs6Fh$lLhLRTh h6haWh4R!h" 2gh@R&hh4RhR&hd4}hVsFhd&khމhzs-GhD` hzeh`}Bhv}AhtR^Khl4RDfhx 9""h&Bxhtv!h}?hp}@hr=hvVNhn%?Thn zQlLhZZ qh2 zBxhpxQhH _M!h xQhL=2ghN̪yhh~=Mh4R2h4qh̪""hht4qhz4Rshz Rh& h>Ovheyhdh̪zh2kht!^Khh`;hb!hau~h( 6hFhzD,kh4R2gh4Dfh@ hl}hU(^Khh4R^Kh_hg'h 'h Z`hNs &hB 42hv#h. hz4h$ 8 h6K" hDy&h" ɪhZh6yh6!qh6 =fh:<}hd h 42gh#hHwZhZsh4 zH}hR]h﫪hVh G}hf4h\ Wht:h>/Kh6s:h8p!h!hp4h -hV̫hxzԅhjixxhתh&h -h: h` -hr4}BxhZʫfh\4hxkhQhM+qhO hyhzRhh hl4RhD ""4hZ "&h|ȫXuht!sht!shT RwhpRwhjBh(6h%%hxhj$kh>zkh@̪qh|phzȫ0uhh W2ghF4RZhv 2gh̪"&hvDfh> hf4xQhJ vkfhvkh8hz 4Rh<yhxQ2ghR̫hJhvyhv&h* O sh<Kh 2hg'h,M:h2t!hN sh: R4hbzShbǫ+h̪&hZDeh4Rh  Thd^Kh^̪g'h6h'h&Kqh {Dehǫ,h7h^rhz̪hRvheh/hKKqhB̪'h,shJ4RBxh̪sh~h&kfhhlMh< xQhNhDz@&h& A&h( 2h 8}h̪=hXZkh*=hJ8h44Bxhsh HhV̪hLqEhFe4^Khthz`Zh_2gh""hH&kfh&hrމh\h,yhrhb ̪hP.h&Kh$iph`Nh2v0uhz00vATADATADATAhB&hnMh,C hvuhh̪hJ-zhy?T*} ?T*}hQ*} Q*}h*} *}h  ddjjpp||@@VV``hhpp @@bbpp,22 ::: :HHb b  V*V2  v v  `   UFD      6 06 DECNOVOCTSEPAUGJULJUNMAYAPRMARFEBJAN**: :ZZXXrrrr= ?     < <<&9<&Kq<&D &&700\ BRU>\D,u:B BZZ <&%t #  <&%t  l lXXllNZ[000,000]N NZBACKUP.SYS;1L n  n XX:n :2(n D :t   6:br 6:: R:br RVV n:br nxQrr :br xQ       :br  :br HH" b XzezXD(@HS@n_@^K@x@%X*@%*@y@ϫ@nL`@@9?T@z> @̪@̪w@H[q@y@S@@s6F@6@}A@%?T@}B@}@@n^@:br@z@̪@}@g'@Z`@@Z@:t@?T@﫪@6L:@Q!@6p;@O @Hw@zX@̪g'@9@7@&Kq@$9!@$9!@@:Fy@z@މ@ip@@  ah^iphi+qh d U  NP %P%U 56p; ϫxX"nL`&:Fy(n^4nL`8%*:nL`>:br@n^JyR%*&Kq XZg'`% &E P%P%UF :% 6%UFU 5 jHw}@nL`%*$x*nL`6yJ%*Pydxnpg'v:txn^ |zf)W 5W w 5  5~ > y$9!$x*$9!072<6L:BZFs6FH6n_ LHSN}ATSZO ^̪`dHwv>1 " W,COW,NT e w!w`f 5 ew |}@ Z`%X*:br(̪ 﫪,%X*4%X*<%X*H﫪P%X*RipVipbHSd}Al̪wr^KZ  E  x:55% / 5~^K9 yމyމ̪wZ`"%*$(Q!*̪g'.̪2%*4ip>Hw@}@H%*T̪XQ!)%HE%AD!%UF 5%UF %HE%AD   55R$*x̪g' %*%*%*$̪(Q00N 8e v "!  e~> H[q }Bip%*Z*8JZN>dvn%*~~` e ]  ȕ]  ew%NVOL%M. %VA%A%VA%A%Y %3Z*%?T?T:9?TnL` >9?Tvv%N[%3R]%N%X b Oze{ODa'\/@x@%X*@ @%*@H@2@}@@k@2t!@@ lh h5 EE 5 E  577 7 ~xxa'\/2 &a'\/.a'\/428>H@}@F%*J2N%*P2t!V%X*Z2^%X* `2t!dk d kb 0ze&0D&@:@:@ z@s@Z@^K`@&@@%X*@:2@,^@z-y@VN@nL`@M&@w@@ѫ&@Rމ@{8@:@H[q@_X2g@ѫ^K@lL@n@zR&@R&@R^K@}B@}A@n^@sG@y@N`@ s @De@slH@8@9x@s@zD@[qq@:s@Zs@E`@>/K@-@:+@H@H@@xQ@vq@Rw@&@zR4@g'@@s@'@7@@sS@Ԙ@_2g@s@@@ p!qh"Kh*h shv  V # #5, 5& #7 7  $| DeDeDeDeDe De&ssS (g'.2s4g':ѫ&@xQD-H-LsGRѫ^KV\-DX  U5U-  -|ѫ^KVNxQslHԘ s"g'&{8(>/K.&0>/K46Zs:< s FHZsLN s R&V E4 7 5 |5 5 w|lLM& ^K`yZ >/K_2gs _X2g$ z,E`.>/Kg'F-nL` JsLg'RԘ7e055=f&& 00"(&&  v`N 6,   p` a e(HH }A H[q"}B| % % ewF5e0XB %    :  7w w w(&s(g'8_X2gd_X2g  $(    `` ఐ    `d %   $)7e  $:8 hR&j t ($) 47e "  `A Ae  `L $)U4-E& >R^KR^K  $ԘJ8 fh>/Ktv>/KVe %w 5rwww5sSg'(&*'.'0R&4w6':w/K-nL` -nL` -"-y(-y*7,N` :E`<>/K@sBg':tb777|:s-n^ %X*-nL` :2-n^ -nL` "-nL` &-*-.-2-<`<7 E5>7 us7-y-y7n -nL` $&-nL` *s,g'2-nL` 6%X*Z775' $ 7 7`w 5~-nL` - -sg'%X*"sG2-6%X*@-D-HsSJg'P-RRމX->J ^ 557 7 7 7 {R^K slHsSg' ">/K(:+*-n^ .-nL` 2-nL` 600vATADATADATA-nL` :RމTEm^ 7 7  ww   - E` >/K-y-y7  -nL` (R&,Rw4D8R&/KP@% A ``` ` w  We0,a  C`B W  R C`B H ,vq6s C0w,  w!"Aapp&0 e     p pm0NT_2gZ_X2g,H p mp  e -w "([qqL b 0zeE,0D#w@RS@s@x@<&Kq@`@DM@@$9p@)@}s@Ѳ:@zwY@)Ty@@:d""@-0@HY@s@<&9@:t @)p@)P@D,k@)@h'@u@z @ (@:@wy:@:@ ~G@)W@X@)L@o@:@wo@Rw@ 8r@=@z)'@=@)Ps@' q@,h@$9!@)p@:@<&D@f@q@Hy:@y@y@|' @z:@'@ &,ZhvwYh,vLhf, h,.vLhwh ?ThBShL?Sh,ah,y:h,:h  w 5 funhj ruhg B  waaw,  Tw&  AJo*)P0)TyF,hR)P\$9!^)Pj<&9l)r:t xѲ:|)Ps|dBbAep$f P aAAf@pnp C֋ 8Ë/AB`f P&: ~G *Ѳ:L)pP)pT X)Ps\)Ph)Pl)Pst)px)pPa `WaWz ajVu-nhw8ɥ;Ma+wנ$å0@j  a  0V$9pb$9!tw@ ŀajTI& af ^`V @e,ɥ@Iaujk,. ` <&9<&Kq<&D ")6)Ps>)Psbp 5f f݇ ȕf  ͇ 4eSY e,5 funhwe,=4u8=laja`W- f`nwvuhnw@ Dllja!Ce###33@ &"@`^)Wr' qt)xh'  jDl@ TeT5l@ @  ed :)P$9!)Ps"()P8 8rB)WF)P^`fsj (pXv)Wz)'~|' d  @ An5jP a@@` > ~ @ . ePa-eP N)L}s' q)h'<&9)$:*Ѳ:Zsh-0P|-0PBAnB X/   @   RՀaePÕwePP)K@j a&D-0PH$9p P-0PZ-0P\ajaabd z@bd d5bd N*bd 8 N,hD,kaD,kaD,k&RS2D,k<HD,kR^D,khr~D,k bd   U ahBmfʕ 7 `WWWWWag q&x*,:d"".f 8,h:D,ka>D,khDD,kfNRwRD,k`tyx,hzD,kaTww W#  B0  e ff e U  %ee e`u W.  V#wy ' ::d""fDM:d""f :":d""$f(RwW From: To: Initialize output disk [Y/N]: BRU>LBN(s)=NOYES *DwYFwoHHYNwy:PwoRHy:$$>b 0ze20D2kf@lBx@X@:@tX@wZ@a'\/@ z@4@WW@s00N @4Bx@WZ@s@H@xQ@Hz@s @`Z@_2g@s@:@zN@&kf@s&@s4}@@@@&@s@'@@  hąxQhhtze&hZ Rg'hDhɪfh@ɪghR:sh h2he2hh^hD`hԘhh       z: 4>  :<}:q!"4> $:<}26::4> <:<}@BN:rR4> T:<}bf:j4> l:<}p~:po|   d4> :<} :4>  :<}$,2:264> 8:<}<J:+N4> P:<}Vl$" $8r  t<z* *4#4f ) R[ 4> :<} R\\]2^j^ 5) w xlh^nz7 7 " w|C< sS g's-Gx,t<@M&Ds-GF'J'Ns-GP'Ts-GV"&"Z'\- d\}f2gH  kB - kxQ266$lL(*s.:br0-4ת:#g'>IqBתFs@5U=s g'-ksxg'ΪD4R2"ΪD$4R2(Ϊ*4R^K.Ϊ04R^K44R64RBx:4R<4RBx~DeP  er 7 7  7 em~44R2g 4R2g-xQ6 6*-.xQ4xQFwZLvkTlLX2^2kfb2khlLn&t&kfzLm5E55   |@&   Qy:̪g'Qy:̪g' HH "}A(H[q*}B0 z46 ;8_2g:O 2g> zBO 2gD_2gn5w`w55 f".,,bw5e55  {g' sz g'KHH }A"H[q$}BD LsxNg'V,^ZW2g^HH `}AfH[qh}BhpU  `7 7 777 5 `E $U5zC& sz g',^"g'(N,N2lBx8lBxxQ2gB22gD=2gH`ZLKPsszsS Rg'~ U , wew(5= /  ԅ  w! mb  r w xQ2g s g'22gxQ2g22g=2g6szsS 8g'NNTNZs^NdNnNrsvNzNdR ]  ]w5w>Es #NNx#lL&s,xQ0N4N:xQ>g'D22gJKNsSPg'Zg'bszs V7 %7 e7  5U|g'މމlLlL lL&"&*'.WWWWzW 0'4'8W2gFH_XH}@PWZTW2gV5-5)# U*¥wwz~R&4"" R4sg'Qy:̪g'% q$h'*s,g'4$9~Z:7<N` B' JlLN'P&T'lV 7*wXwjA A ww#5# *¥7 7 }w`7 "fa*&0"&6"&:%#% @HzB}@H%ZN"&Rh'\$9bs-GdRhR&xU¥vt& v  AfP    ŀ }R4$ s g'$9X7N` X "lL&'(&,'.wTlLZ4n tW2gvR&V2U Aww w &< 7*%+ ]Z s g'K"&"& ""& *'.`678 @'D:F-J'L- Pr R-F wawa7 7 7  U{,^ r  r r r -- -$-,s.704-y:-y<7> Dsz9fֵ & 7 7 @5N5^ʕeʝ5-~g' |'R&R4$s&g',s.g'g'BZNlLTwZZsd\g'fg'nszpg'tsd 7wJ wBE5 U5=7  W D E E dg' lLlLg'"lL(wZ0s&s#sz 2g'>s&@g'DsdFg'NlLRlLl  `w  eLULP -% -~2k6-6--"-&-.2k2xQ:sz<00NxQDsFg'JNZf     7 5%5-   ~N&kwZvks#s4}  g'&&kf(&kf,&.&2wZ4&k8s#:g'@wZB4}kH-P4}kRwZv 7 7 7 M    =eB  w5w 4}kf&kf 4} &4}Bx4}BxNN"v.&0v4&kf6vkf:wZ4}BxBvD4}HvkfJ4}kfNvkxz 5v55Uw L 7 `  * E e  t 5~4}k s& g'HH }AH[q}B n$n&g'*lL.vq6%X*:2>IqBɪ^fPlLfU(^KjU(^K 51 w w"e w %ffV\ ww  e w ꇷ7   x&g' 42gs4Rg'4R2g [qq$lL(s,lL6t!sLU(^KRU(^KX_2gft!slt!spts~Lje 5 2EUxs4}g'4}Bx4}Bx"4}$v(4}kf*vkf.4}k0vk6s#s& 8g'<>g'B4""DR4HW2gJR&pU w w5    C} s g'&kv& vkf"&kf&vk(&k4s4}6g'@vB4}FvkfH4}kfLvkN4}kVv`vkfLjeB 55E5  "7 7  vks&g' s4}"g'&s#(g'.&kf04}kf4&64}:wZ<4}k@&kH&kfN&kfT&\&`&kd&f&-   w m=e--  &kf&kf &k wZ-&kwZ(&kf.xQ2&6&kf>&B&JwZLvkZwZf&l&kfxvkfz&kf~v- xm=M Pw w e- 7 m|&wZ vkvkwZxQ&"&kf&8*&kf<&kfB&kfH&L&X&^&kfn-rxQxxQ~wZz|r  - mr  $E55  ~wZ-wZRT(xQ.xQ4wZNsxs4R Pg'THH V}A\H[q^}Bf4l4r4v4PU5 5w&S  |C4 sx g'H}Aj44 4""$4&4""*4,4""0sS2g'  ȕ]  N w*00vATADATADATAE5?|4[(}""&&'*N.,z8"&*<$9fBs-GDRFJ4LR4P$9~ZV7X5 ^H4`}AdtX |\nw < w .w &0 w Hw s-G s-Gs-Gs-Gs-G"s-G(s-G.s-G484<4@4FrL8X^:<}fn0vHx`U&ww w w 5 E  U   w`5  sxsz  g't< (08s:g'@s4RBg'Ls4RNg'ZlL`4n4r,^ } F(H*J, 5UwՀ U Vɪ^f 8t<LszNg'TsxVg'^-`42d-f42xs&zg'  `ee   `eѕѕ   0 f 7w7@"au~FNJNPNVNZN`Nx4^K|4^Kw  ҕeeN e%%J L 7 84Bx4Bx4^K4Bx4^K^4p4t42gdw &W     5  w|vq4R2g44R 4R^K"-&4R^K(-.4R^K0-44R^K6-:4>sGD4R2gHs4RJg'`4R2gvd w 5wW &   ww ww  fVX+4slH [qqs4Rg'42g"4*4.4^K0-44^K6-:slH@4H42gP42gVvqZ-^-&f z7 RRE sas Ü ceע e ` \Q$eQ   w NN@bt[qqdR  ep 5w  w w  w w |4sG(sxss4RsS *g'0vq44^K6-:4^K<-@4DslHH[qqNvqR-Z[qq`vqv w w   w 7 7 w 5E E- [qqvq--&[qq6k8B<s@#g'DlLHlLLxQN2RתVIqZת^lLbYhjg'v$ pw  2) 5g' 2^K -2^K-CzslH":br.704:@7Bds-GfRls-GnRptszr&VQow  ؃ `DA!  ` v w ׭f  W!? e@ Dg'`ZvqxQ2g4xQ2gF`ZJ[qqN`ZV`ZZxQ2gbxQ2glUw 5ʝ  07e 7w s g'vq22g=2gQ ̪g'"22g&=2g*`Z.`Z8̪Bx>̪BxFyLyT2^xQ2gbɪ^f dxQ2gh`ZzJҊRw 5  5@`e   5 w - X[qqvqa'\/",^ 0a'\/<,^D<R` VEd\a'\/l[qqrlLtɪ|J&  W D E E  ~`w eL Tw  ÝE jlL42k>6@-D6F-J-N-R-Z2k^xQjvqpU(^KzU(^K~U(^Kdr  BPE E E  eL  w  w 0U(^K:wZ@wZHxQRU(^KVU(^K`[qqb pzee4pDx@-@# @VN@wZ@Z@ѫ&@{8@}@:d""@HY@@zѫ^K@D%@aW@Q @}?@}A@Hf@R@,`@au~@slH@s@ɪ@R]@>/K@z-@e4@@@}@%%@@H@g'@̪g'@Ha@H6@HQ@f@@H#@ 00N/K} }(HY*}A0}4}6ѫ^K:}<ѫ^K@ѫ&F# H:d""Jf PxTRP7 U7 7  75775{ZR  ZRsg'--"slH&e4@,D%0HQ2}?:ɪ@DHHaJ}A|eeST 5  5$7$5,5-7-5~- wZ&wZ,{8.>/K4ѫ^K<ѫ^K@ѫ^KDHfF}?LR]TR]XH6Z}?`aWfH#h}?n}v}zH".e< P }? %%au~ b Xzet:XD@&@%X*@RT@Ϊ@-y@* @nL`@ k@ΪD@@(@Q @sG@z}B@*@@@au~@t<@slH@6@Z0@59@y&@H @ɪ@-@ @BDe@̪g'@7@xQ@s@ Z6hh  (08@HPX`t:#z xQz kzNNz*O:zt:#zt:#z kz Hz7 Uw X (0 8 @HPX`l6n-r6t-x-nL` |ɪ~new   p^Z-     mme5e7wv --"-(-.@&8y&@y&H Ny&VZ@&^ fQ h̪g'r%X*v-nL` v    ew   ew   ~e    |-nL` -nL` --.-2-:-nL` H-L-h kl kr6v  V4  e  @ S 3ee@  N w > F6@(xQxQ,xQ0xQ8RTl*t-nL`    w     w 5p t<Ϊ,Ϊ2Ϊ8-nL` @-BΪDF-HΪDd* l r-nL` zQ |̪g'n  & T    UU W 5%``e " 6.>De* HQ J̪g'P`V``Ϊb-fΪh-  - 55u  5  - ` D Dae*y& Q "̪g'JH L}B``f fe T D Da -- %-%! -@au~,y&<y&Ry&b hy&ny&v@&~y& -5 -  - e & 0y&@&y&"y&(Q *̪g'd@&^ S ee@ 7hwfdw'  W D E E |6~-n`w tww@ @ d 6- --Z0sGZ0 slH"s&-.-y6-y87:59<@Z0D-nL` h-DB `w  ---83b 0ze:d0D:(}@HS@,Y@RS@s@̪z@,VN@x@-@:2@H@F VN@zH_X@""@@Ȭ F@VN@Hp@<@@9?T@Hp@ @Z@@&@,Z@zY@H@v^@K@̪ @}@@H @H[q@H_q@k00vATADATADATA@SS~@t@Q@H@z,vL@HY@HY@HY@:d""@I[@# z@s6F@RT@H@:t @Hz@C@aW@ @zH2@sF@Q @H{@s-G@=M@}?@}A@&Bx@}B@}@@VN@n^@H*K@Hf@z6'@4}@zBx@@e@4q@Q&@Hm@Ov@d@~@`;@au~@8@:<@z@}@HK@g'@'@x@9x@@@ɪ@H @u@T;w@=f@ @zHO @[qq@{@>/K@R]@z@40y@W@8p!@ ?T@z@H@H@ixx@Hk@z:@4@O @@&K@,a@;@vq@Rw@@@%%@p@,0σ@J@z@S@Hw@,02@H@,M:@H6x@H4@D,u:@H4x@,y:@,@=@@,:@z̪&@@=@@[(}@6@̪g'@q@@H8@Ha@HBa@/@H6@HvQ@zHt!@HQ@Yr@f@Hy@Hz@H""@q@Hy:@H:@""@K@&@HR@@z@@ @@.@QDV@@nM@W@,C @H@H#@H@H#@ 2,hr"҅hwYh wy:hV woh /t APPEND 6 BACKUP_SET &BAD.t  H6 Hw& (&*,, BUFFERS  H<<l &<COMPAREl & <LL 8CREATED  8\\ DENSITY  Hll  DIRECTORY  Hz~~ DISPLAY  H{!. ERRORSt EXCLUDE".  H""t H#!: EXTENDJ HEADERSY":  H#J H2' IDENTIFICATION VIMAGEP   H8  VC V INITIALIZE` INVOLUMEt LENGTH MAXIMUM>V  Hy:` H:(t *,HK6 8:HQ..t MOUNTEDt  HS>> NEW_VERSION  H_XR=R NOINITIALIZE t NOPRESERVE NOSUPERSEDE0  HYt HY, .0HY OUTVOLUME  Ha5 POSITION PROTECTION$ 8REVISED*   ($ *,81t REWIND@ SILENT B SUPERSEDE0t  H_q@ H4x"B $&Hz! j TAPE_LABELt UFD,"j  H*Kt H4!\ &fVERIFYL WINDOWS \ & fL H6:g: DOUBLEBUFFER SINGLEBUFFER DOUBLEBUFFER SINGLEBUFFERGROUP,8 HmH6x24HmFHH6x\`HfOWNERO HfSYSTEM WORLD HfHf BEGINNING HO BLOCK HkENDHHt!%MIDDLE AUTOMATICHHRH 1MANUALOVERRIDEAFTER&HvQHBa&H(HpF#FBEFORERESTOREFHHpH[qfFfSAVERWED / .; 89.[,]H @2 2 7 7  55U n: 9?Tn^ $9?T8d>s6FFZJKPKTO jT;wlsr~tg'xQ&&K |K|<      etw-U5wE  w| }(,C 2K8KBD,u:F.JN.40y VX'\H H[q ^}Bd/p:(}tD,u:x9x\E  w7 - -[] U~KD,u: .:(}D,u:"9x&K*K,0K26K:,YBRTJzL:d""NfRnMZ~  zE00NW EW W ŌeW |W  ȕ>g'K nMg'RS 'VRSZRS^[(}fRSh4}lRSn4}rRStYrxRSzYrF w   mzRS6' RS 6'RS ?TRS ?TRS ?T",vL(vq,,M:4 8au~<:<@ $PPH& %dde  ep   w 5 & & Ev SS~$au~ .au~2:<@ D:<H L:<P  T:<X[qq`H4xb}Bh# z|}@FD  E  5  5 |HHHpHp  }@H_XHzHY }@H}@$}?*HHKH ,}@24:d""6fh f5  5w"  5},:8:d""f"Hz$}@0}?6HHzH_qHwH"" 8}@B;D:d""FfP,a`v^b:d""df~L  -5 -  +55~Hy:HY }? s-GH}@,y: }?"HY(Y*:d"",f0s-G6s6F<HHKH_q >}@DH*KF}A:2-&"U 5}q:d""f  s6Fs-Gs6Fs-Gx:d"" f$H&}A*}?02:d""4f8H_XHzHY :Hh U5 555}@ q :d""f H}AHHK }@"$:d""&f.H40}A6HY8}?>@:d""BfFH^5 5R 5  U5~}A  :d""fH}@ >/K&,08p!>Hz@}@Fs6FLs6FNs-GRs6FTs-GXH[qZ}Bfw6 7R  7R NN7  HzH H[q }Bs6F̪ s6F̪ ̪ &zBx*4.̪z<&Bx@&D̪&PVZ`&Nhz55UU5w5~& &&&HH }A"$:d""&f*H ,}B2QDV4̪g':Q <̪g'@HwB}@LHYx5w5wx5wl׽$# w D  7 }? HS }AH }B"H[q$}B.k6z8:d"":f>}$T}Xk\dkhkl=rRwvzd& ȕf  ׽(Cw F7--~:d""f ku=$k,.248k>eF`;JeLs6FR`;Ts6F\e^s-Gj ׽  7B  ׽; | {:d""f `;s-G:d""f k$k (k ,zBx2̪z>HkP^&d&T   TW. @ wW;  77 7 5A5~&& kk̪&"9x89x@&R&XZ:d""\f`RwdsFhH j}BrsFxH[qz}BNh 05  55 55sF Hz }@s6Fs6Fs-Gs6F s-G$H H[q &}B,H.}A6HY8}?>HS@}AFH:d""Jfp W/ W W 7 w   w N  wm~:29?Tn^ Rw&Rw*.q>{@:d""BfFJH:d""JfNkRZk^kb=hklRwd  XjUȕf   ׽m5U 5~kz :d"" fI[g' k.u2=>kFkJkPH HvQHBa R}?XH Z}?^p~ UE5wHX  7  00vATADATADATAewl5w X  @   jUExH""}@ H""}@""pH""}@"H HvQHBa $}?:%%JtRH H[q T}Bz|>/Kn 5[X5PX :7 . ,7 751X ~H}@ H{}A:t 9?Tn^ 9?T$Hz&}@,:t .9?Tn^ 29?T@pP}\bHYd}?dd w w 7 7 U7 5 X5X5X{6 W(ɪ2x6 8"" DHzHYH F}@NHy:P}?XHzH_X Z}@b w@5  < w     @W,w ew wn:d""f -HO HRHt!Hk }?(Ov,,Z02:d""4f:R]DXR]p4qz}@ X5X  75UXUXX׽  wCww f-wJ7~HYH_X  }@aW"H_X$}@*H,}@2H4}@<kJzL:d""Nf\kbeferk|RwZ w6 U U= ==`;F VNZVN,VN *,,VN,02 24'<,>VN,02 DF'JVN,0σ RVN,0σ wȋtȊ -qhcwde^&=sȋ[ 5--L׭׭DenVN,0σ =f=fQ:VN,0σ HsFLH H[q N}BTsF\ ^:d""`fdsFfQ|Нȝ -MFU $,55 -MUE-MU U E e`;ZZe"$>/K0H6x2}B8Hm:}BHePHyR}BXedHyf}BpHyr}BxCz:d""L7 7 7 ׽ T|f :d"" fRw :d""fRw ":d""$f(Rw,.:d""0f4z6:d""8f<kN- e@:d""@fLs-GRs-GTixxZH[q\}Bbs6Fdixxhs6FnsFtzv:d""xf>2T W(  W)  W:w Xx}? }@}A}B$&:d""(f<BqVSX:d""Zf^`:d""bffzh:d""jftRwzq: 5U  w B0 1 . ,`*`(W.w  w Bd S :d""f:d""fHH }@$Hm&}B,Rw4Rw>RwnRwxRw0    `W8 W9W-w  W0W9 5 b b SӁ ԋˋ.2RwJL:d""NfT~Vg'nr2 Df W( & W:EW:Af t l=&lW-3 ^&/ ,W-) J&%5au~smv 6 e e$  Rww & &W- Hppe eUUUs&SS~$PSS~*W-e , ed d lW%dde D0se?@eUW   e B + Ȭ FNs  , < W:  <  W) |Օ0 uU r e0e0U hf 4*Rw Rw8z::d""<fX<x"W! U `&E ȋ W*U W:w00N @R@$97@n^@@:br@y@:vr@@g'@%!@>/K@ɪg@-@-@zf;@p@sQ@> p@g'@y@8}@7@sS@$939@@$9!@@:By@s@*$9Z@@ J0h 4h05$0zh z :brn^ %*nL` nL` s g'&:br(n^ ,%X*.nL` 0bp[)w.:@)wW "HE:nL` p z> p(%X*,z0z6z>F:H zLT> ^%*byfyly"DA%U UE2%.UE'"UF-$EOF# 5wwH5yg' Z">/K&y(>/K6y8>/K<Z>>/KPf;R8}""T8}XZR\fϫjslg'zsQ|g'R(E55U 5  -h-sQg' f>/KsQg'sQ g'( , z2-nL` 6ssS 8g'>B-FɪgJ zLhbvp)) 7 5u zp > p> &$9!, z0746R:$9Z@$97DF JpP%!R8}""T8}XsZg'KZ L Hw $w5wNwbnL`  :vrn^ $939y"y&y,nL` 4:br6n^ :y>yHsJg'X:By$*w)0n^ %*nL` > V b Xz[qrXD4@a'\/@ z@&@,VN@x@y@ϫ@f@Cd@VN@nL`@zϫ@> @+@H@6@R8}@R@{8@H[q@OM@v,VN@ѫ^K@D%@H@R&@z@s-G@}?@}@@}B@}A@VN@n^@sG@=@̪""@@R@H@,`@zx@Ht@68@slH@6@'@s@ɪ@Z@!@:-t@S@6L:@>/K@ @ze4@@-@R@H@H@6p;@xQ@@ϫR@0@ϫQ@ @> p@g'@20W@z@sS@[M@$9!@$9!@D`@@H@$xQ@:Fy@s@Hy:@@ yh"e4hϫQhh V5 U5U 5 U5U | HH  }A686p;a'\/ H"}@(H*}A.ϫ2H[q4}B:68>6L:Da'\/HHJ}@PHR}AHR5U5 7 zϫQS >/KsSg's-GVN'$VN&OM*v,VN0VN20W 2VN8,VN>HBVNDHH55 EEU {VNH H }@Hy:}?R"[M&$xQ*60f2>/K6sS 8g'<ss >g'FD55 5+ 5 7 ~ zHH  }A0 zH[q}B " z&*ssS ,g'4-nL` 8D`g'>7 7  5 yR&  ,`--00vATADATADATAslH{8& >/K$xQ(ѫ^K*-.ѫ^K0-4sG8ѫ^K:xQBT 5e5U EE7 U|ѫ^KxQ slHHH }AH}@HtH  }A$ϫ(Ht*}A.H0}@4= 4s6g'<B> LsNg'T> p^d> J)׭ 5%5U}y$9! :Fyn^ nL` > (y*$9!0y4! 8H[q:}B@HB}@HHtH hB EE7 wdUE |vpn5;}AϫR Ht}AH}@="x&Z(R,+.R4̪""64 /K@-@sZ@vq@sz@g'@s@sS@Z_2g@s@N@@ shh6 ;hh$h@    X7 7 5EP5, 5Us_2g s_X2gsSg'"M&$lL,s2szs 4g':ѫ^KBѫ^KHJg'PlLRѫ&Vxpm%&E waw   5  5 Нwaw$ 7g's sZ&_2g(N,N8sz:g'JsSLg'RމZމ^މbމflLnlLrsd- 5e5&VQw -7w5~_2g _2g_2gszsS g'"_X2g$_2g*_2g0_2g2_X2g8_X2g>sz@g'NvqRlLTѫ&Zѫ^K^ѫ^Kb{8D ewE B!WsSee w 53,X &`D 3 F>/K ѫ^Kѫ^Kѫ^K_X2g_2gD_X2gJ_2gN[qqTsVg'3 D  Kӊ KӊSe#a#c$ ӊS `@ e ew e w !&0_X2g:_2gX_2g`_X2gfvqz_2gz< w KӊS HȊe Ha` H7e % w  @a  @a r [qq_2g,_2g4_X2g8<sZ>B&F sD J[qqP T,^Zy}^b,^ hy}n!qtx-nL` 0b O2 OD qh  /:,+-) 7 f wfe xS   j   `E    ` EJ|ew W0WZW9WA &ȋPwF6~b 0Z 0Db@o@Z@ Da  ۭ0y}h Da m<< ۭw EeW ɕ0ы~(eɋ e   % % %  11 `   oRZVb| BW# 5 %  Ce   ۇ` %# #$)& &   BeA @ S   JDa t% .0fU U U M U B A eU M eU U M   f D0% %D0 %  a a w6t&    bA @ l@ l s s  b XBSP}XD Da 2bh$Zh Da 5JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC  b Xz%jLXDB4@:@00N @z}?@_M!@@@=@Pd@:br@=M@4q@4q@4Rs@& @H@!@H@z'@v#@4@8 @y&@H @ɪ@Z@6y@?T@S@)8@^H )0h@)0h@z8R@>/K@-@-@:+@l-'@H@H@ת@-@R@@ȫXu@=f@)%@zB@ȫ0u@4RZ@vDf@2t!@2@R4@g'@v&@s@s@S@ǫ+@ T@:w@z)%@s@%@{De@ǫ,@7@A&@> @@&@2@8@s@t@_2g@s@zHy:@""@<@@@:@.@v0u@@vu@@H@H#@H@ N z,khCdhp -qsh C<hEdhj}hCfh:C&hsGh C4h.,`h 68h~slHh$ j4hIqh jt!h[qqhCzh\ vqh?Th i h h vh` N}h4lh" hx[qh  & )7w 7  llC  4+le DE t > n`n`7*s.B286Pd:22D:brFn^LnL`Pn^Vn^Zn``n`hn^nתt4~[ww  C C`e AE@ w` 0 )e  {4  nL`)%_M!)%_M!)%"_M!2v#:xQJsPs\v#bsfBj#g'tnL`x#g'h,,, e ww &f& f ^@ee >#g'8s=fת8$s&sH,84y&B " ee     e 11+e ZSS~~4|`e5- - 557 5   525U0{R4R&R&x{44"{4$4*H,}A4x8< /KnHpp}@xa'\/b 5U(5UP 5 UH U. 4q`  H}@a'\/t` "Hp$}@,a'\/04q2` 8H:}@@tB` Ha'\/L` T<V>/K\=M65U%H# %p-p- e%5 5  % % %L= H }Af>/KKTH#H V}A\=bH#d}AwQ%w#D%w-<w-8    U2% % %K-s-&K=M"42@&:A&Ta'\/.s- % s-  %  s- e55 D 5 p5 (52DH#F}AVHX}AdHf}ArH t}BR T 5 BU57& |H[q}BHt }A"Ht $}A*:t ,6n^ 0s6F2R6s6F86n_ <> >6n^ BD'B7 U7556nL` 6nL` 6nL` :6n^ 6 s"6y(6y.6y6HS8}A<00vATADATADATA@HSJ6 7 7 7 % w)x}A :+n^6 6nL` 6nL` 6nL` 6,ȫ0u26:> DB4Hs6FJ|5  5 5ǫ+)0h s6F ǫ+)0h ǫ+HS}Aǫ,$l-'&ǫ,,6.""04ǫ,:l-'<ǫ,B=D""FR757 7 )|6y s6F R7$9fHS}A "%&ȫXu,70R4:w66n^ :6@> N-nL` 65=& 7 ~s-G-n_  s-G -n_ s-G-n_ :t -n^ s-GR"$'2-nL` DBU7U5 5~-nL`  -nL` :-n^ -s-y$-y*-y2S4>/K8Hy::}?>BHy:N5 7 7 7 % R)~}? H }@:+n^- -nL` -nL` "-nL` &-2ȫ0u8-@> ȂJB4Z55   5 w 5w7s-Gǫ+)0h  s-G ǫ+)0h ǫ+Hy:}? HY"}?(ǫ,,0ǫ,6l-'8ǫ,Bǫ,Hl-'Jǫ,T-yJ"U5 557 7 |7s-G R$9fS>/KHy:}? "%&H(}@.Hy:0}?67:R>ȫXuD:wF-n^ \h)5J55B5> U7lw 7l 5,5- > H}AH }A&H(}@.s0g'62.40uw Xx^4`>/KfR&lR&p4rR4xR&q57 5D  w%NTotal of %T. blocks in %M. files%Nh xR{De Z $H{&}A,{De2%?T6 :>?TB9?TnL` F9?T P    %  e  * w! 8%*nL`6 8 nL`6 8 nL`6 "6.R&0 6%*F%*΀j w f   ! aW ef eM  7 Bp6nL` 6nL` ݪK8y&Z%*\2`kbBf4Rshsn& r#g'z_M!|4R! e _vߋt ***THIS VOLUME DOES NOT CONTAIN A HARDWARE BOOTABLE SYSTEM *** && s4RZb d W c W  5 E 5U  7   wsɪ@&$@&.@&2HY4}A>s@g'DZ JsdLg'Ty&Zy&`y&d@&jy&ly&p   @ B     Rd   77::br<-n^ D-yF7HL:N-n^ V-yX7Z^-nL` b-nL` f-ns-GJ  & ( R 5@$(  @  hR -ys-GR Z&S*( :x@v,D( Rv0uVvu\&`v&fsZlst@ h ~&  7 e7E~_2g8RR R"4R!00 N TB TFsH_2gNxR%*T2X%*Z2t!^sq` sD . . 6 6 J J b ƀz\ƀDu@a'\/@z@(@4R@:2@@x@%X*@%*@y@ZZ@z%'@8}""@#g'@nL`@ϫ@ϫ@> @H@@5@+K@ݪK@R@:@2@zl@k@H@R&@R&@}@@%?T@}B@}A@n^@=@@:br@@@z& @@x@H@De@g'@HK@'@6@@%!@4@Z@?T@Iq@2X@z[qq@6s:@8p!@z@<@""4@k@@vq@B@9VN@X@6@p@v@z<K@R4@> p@@2t!@2@S@8}@Lq@!@e"@7@@$9!@%@z$9!@2@Zk@@s@Hy@Hy@:By@2@l3@""@[q@&@&K@:@J@  bVKhIqh b4MhYd;h̫hh@  pmw 5 PEmw &f w`w  5e0mw 5@ 5|+K6 6a'\/a'\/"8p!$6(62<K6k:ݪK>6B6JkTx^&K`6d6jxVl55w*E  E 5GU~H}A H}@Hy}B,:.n^ 2:4n^ :a'\/Ba'\/FnL` JP%X*R2 U5w6)E t e)U %wEU  B gUr %n`EX%X*2t! a'\/a'\/ > p,a'\/0z<> L$9!Xa'\/byt$9!~a'\/: U5w)E  )U %;EU   "UpnL`  %*2%*2t!"a'\/(a'\/2> >a'\/ByN> p^$9!fa'\/pzl%)55-Ƈ-557 5 RE UK7 55~$9!HK}@H}A6 6s:(6*6s:0$9!6a'\/>a'\/DkJa'\/Ra'\/Xx^=bHd}AjH`wEUU U 5 E E }@7R H}A"x$ *x0Z8x<ϫ@e"B'HvL[qRa'\/Xx\4RlzEwU@ E@wj E5n5U5}U  5S Xxx6@$x(2X0v4Hy6}B:H<}ABHD}@JHL}@RHT}A^Zd6@jHy^E 05EwUw5U U |}B a'\/2X:brn^ nL` "x*x4x}BDHyF}BJϫP[qVxZ4RV<E05E wU 5@J0 jE|S Xx:brn^ nL`  Hy"}B*a'\/4x8ϫ>xFnL` N%*P2v/5 5 EU -EU  wb5EU U5E |a'\/ xa'\/ a'\/&x,H.}A4x8::n^ >ϫJxRxXa'\/\%X*^2da'\/jxrx U7 55.5)E  UPUH w5)E b2 <xkH}@"Hy$}B,a'\/2> p>a'\/Bzda'\/j> va'\/zyl| U55U Eww 5 w w0%N5I5!Pp !g'H}AHy}B$x(ϫ.!0g':vqF[qqN$9!THV}@d:brfn^ J) *-P,%EO(PnL` %X* nL` > pz&z0%X*6%8"":>:br@n^ Fn00vATADATADATAL` h*) -P %EO5. $E %*nL`  > y"y,%*478:R<>xB7N%X*RnL` ^zd%*Ew!-P5%DAw %UFw%HEwE!0( D!E eUnL` y$x.l <4>R4@ Ll3 zR&~""4 5Uee7!lIW!0  ee"7!040".e  D`D!AR42 5"" <&>""@ xݪK 7!*e5 UfE w "7  7 w w,mPu""  $ HpN%!P8}""R8}Z[qq`xz& ~Dep7 7 7 nf v & & & & f& & & Ε 5!5{2#g' kBsIq& R& Lq *De0%?T4 8v Lq HDeN%?TR Vv Z?Th%?Tr%'v9VNz:2T  E #eBae5e0e0 w%(w $ 5E5U5)%X* %*&xD%X*H%*X | U 5U5") V %%wE7 s x$Hy&}B,2> p<zH$9!N$9!X7\^R` d%*f2la'\/pkxnL` .H )ف\n^ :By n^ > %* nL` $n^ (yv $v %NFile ID %P,%P LBN %T.%N "   Fb XzlXD(@ z@Z@%X*@ @%*@f@@nL`@̪@Q N@:br@zy@̪""@8@@̪@g'@Z`@@Q@[qq@﫪@>/K@ɪg@-@Q!@j-@ϫR@vq@sQ@g'@y@̪g'@sS@s@ BQhT h TE 57 7 7 m5-iw dNT zQ!̪g'"%*(:br*(4s6g'<%X*bQ!d̪g'~| 7 p7 j w-VUVFmD"HE,AD)"DA,TA!"UFD ,CO9,8Z`̪̪$﫪.﫪6Q!8̪g'<﫪NT5 2+ (U,@y  e-7 7 Uww".],&Q!(̪g'dQ!f̪g'tY,bU  *7 x7 vnmlW".W,,b V PeH-H ->47 60(-(mx~  m-U7 7   -'- # m m 8Z`Z`Z`̪﫪 﫪"Z`(Q!*̪g'l-7 - e &ptrnj f^m\X mR-U>8 4000N/K4y6>/KDyF>/KJZL>/KXQ NZ̪g'`ϫRhsQjg'psQrg'vfx>/Kd U -7 -v7 x5  w HmF< : P .'dsQg' sQg'" 2 z8-nL` <ssS >g'DH-LɪgTvqf ($ m w w     ` eeW 0W! w www /[qq vqL8N̪""PQ T[qqb[qq.b 0z0D(@a'\/@(@4R@:2@@x@%X*@%*@%'@#g'@+@zH@@̪@̪@R@2@l@k@s@H@R&@R&@}@@}A@%?T@z̪y@@:br@@& @@x@H@De@@̪@'@Z`@6@@@z4@Z@?T@Iq@2X@﫪@<@""4@k@ϫQ@ϫR@B@9VN@X@v@zR4@@2t!@2@S@Lq@7@2@s@2@l3@[q@:@@  2k8thbOMh Y;h̫hxQlh ` 555@w50U  zkH}AH}@ x,a'\/4a'\/8k>k@Z`D%*FJ̪LP:R(V̪Z%X*\2`\ U5wJE 4EwbE  |%X*2t! a'\/a'\/"a'\/&﫪.a'\/8a'\/a'\/DsF'Na'\/TxZ7^+`Rb fHh}AFh"U U  E Ew`U@ E@wH 5\5}x  xZxϫR"v&k(B,[q2a'\/8x<4RFxJ6@PxT2X\v`Hb}ArC5kUD 5EwUw  U H}@ H}@H}A Z&6@,2X0:br2(8Z`>xFxPxXϫR^k`Bd[qjxn4R~E wE 5@N vE35 5 EE 1EE S Xx:br(Z`&x*ϫR0x8Z`@%*B2Ha'\/PxXa'\/da'\/jxpHr}Axx|:zn57 w5EU U5E  U7 5(s 'ϫRx$x*a'\/.%X*026a'\/%*Bl3 H4JR4L R%*\%*lR&r""4tR4v2 ~%*yXT2Ef   B!e7v7v7r wal77 7 7 :2ul  %*2%*L& PDeR2V#g'Zk\B`sdIqj& lR&nLq xDe~%?T & & & & f& 00!vATADATADATA& & Ε  E &eBae5ee w%UF(wL ?T%?T&%'*9VN.:2J%X*P%*Vxl%X*z%X*~%*P $ 5E5U5Uz 5rUj wA Vx\Z``%X*bf̪j﫪t̪yz7~+E7 )R  %* 2a'\/kj$%NFile ID %P,%P LBN %T.%N "  b 0zy:0DB4@C9@(@:@̪k@HS@n_@a'\/@Q2@s@2^K@^K@z,VN@@x@%X*@RT@%*@22g@H@VN@#g'@nL`@* @e&@H@6@z̪w@̪@Q(@n@̪Bx@R@@(@H[q@y@@Q@@OM@HY@HY@zs6F@v,VN@lL@QO @Hz@k@6@@H2@:t @Q N@6@=@s-G@}?@z}@@@}B@}A@VN@n^@*@Hf@@QlL@=2g@̪y@:br@@$9f@z̪""@ey@@4p @H@8@@̪@}@'@Z`@@ɪ^f@ɪ@Z@zQ@D@h~@Iq@HO @[qq@)8@R]@)0h@﫪@Cz@)0h@ɪg@-@-@zR@Q!@4Rp @:+@l-'@e4@@ת@xQ@:@:s@@ȫXu@)%@Qy:@vq@zB@O @ȫ0u@ 4R@y@xQ2g@y@g'@2@s@̪2@> @ǫ+@De@4R@z̪g'@20W@%@ǫ,@7@̪@@e@&Kq@[M@@2@̪=@=@HQ@zs@H@̪@$xQ@`Z@UK@Hy:@N@""@@@މ@@̪@:@z@2V@ rthjO h hj2hW}h̪y:h2hz2h&6L:he h9hj!hFj&h `BRUBACKUPVOL5 wrwww5M& 7 v:t en^ ȫ0u Q$s6F(H[q*}B0s-G .ey4ey}BDHSF}AJ8555 7 7 7 xHY}? H[q}BHS}A HY"}?&*:+,en^ 0enL` 4enL` X% Z)%Kww+55 5enL` ee> Ƃ&B4*:t ,en^ 2ǫ+)0h 8ǫ+)0h <ǫ+DH[qF}BLHSN}AVHy:X.5  5 575}? HY }?ǫ,ǫ, l-'"ǫ,(6*"",0ǫ,6l-'8ǫ,>=@""BFeyL7P$9fVH[q`55e wU77 7 5 FE~}B HS }AHY}?%.a'\/2Z67:R>ȫXuF:Hen^ Na'\/Za'\/^6n_ Rw E7 5  55|en_ e-n_ en_ evq Q!"̪g'&މ,މ0Q(2̪g'B4p F%X*V*d`d*fXd 7`f  @`  f  we- R  z* d * f"H(H>BDɪHJDePɪTɪ^ɪbRjne4@xZ|[ML U   ~e4@̪ e4@ ̪e4@̪$xQ6Qy: ̪g'$(*̪.=0̪=46̪>̪BfP P mme7 7  |4Rp %*2V%*(RT,@(8H:̪Bx>H@̪BxD̪BxH̪BxL`ZP̪BxRNV̪BxXN^lLT~7e  w 7 ]ʝxQ22g 22gxQ2gɪ^f xQ2gxQ2g=2g =2g$e&(N,N0N4:s8N<NB22gF=2gJ`ZN`Z`  7 Ew  ` e |)%̪Bx )8̪Bx)8yy 2$-(ɪg, 4R.4R2 4R44R8g'̪g'B[qq^*  5U@55652 תlL D-2^K-2^KlL"Q N$̪g',x0HY2}?8H:}@BZHHJ}@RlLZ̪2N  & 5 7 |މ)% މ )%މ̪Bxމ̪Bx"Z`&:br((,%X*.6̪<%X*Ba'\/H%X*L:d   w  5  R  T|( ̪yމyމh~"y$^K(y*^K0vq6lL:H<}@JxQN̪2^y`^KL. w 7 5- ew Uw |y^K ^K^KމމH}@$Z,y.މ2y4މ:މ>މBh~FQ2H̪g'Lv7 7 t[qq BתתlLQlL#g'"̪k$B(̪2*2.s2Iq88:̪""<Q@תDBJ:V pw  ̪n^ Cz̪̪y s-G"R$*vq0މ6^K:^K@Z`D%X*FJ:brL(PމRyf 5# W,COW,NTe w!B`$  waw w fމy ̪﫪Hz}@$%X*,%X*:﫪B%X*H}Zy^yb[qq#b 0z:0D4@x@(@Q2@̪k@a'\/@s@WW@Q&@HS@t@Q2&@z @4@^K@s@ @sZ@Q@x@-@,k@%*@,^@H@@%'@z-qs@#g'@W@* @+@H@̪@̪@@Q(@̪Bx@R@W@jO @v@8@zy@ @Wz@HY@s6F@lL@$9k@Hz@k@6@Q N@sF@Q @s-G@}?@z}@@@:br@}B@}A@001vATADATADATA> @Z q@@QlL@Iq@̪y@$9f@̪""@@$9B@zH@R@x@Ht@W}@au~@H@De@̪@8@@@Z`@Z0@@zɪ^f@4@89@2@H @Z@h~@6y@Q@!q@Q@2X@Iq@QBx@[qq@zZs@!@t"@﫪@4R@8R@D@Q|@-@Q!@-@"@e4@@ixx@ת@z-@M+q@x@k@}@t!s@vq@B@9VN@@̪q@"&@W2g@̪"&@Hw@zy@y@H4x@sz@kN`@g'@@s@s@̪2@k@̪g'@6@e2@'@z̪'@ w@9@7@̪@sS@/@&Kq@̪s@j!@j&@2@̪=@WZ@xQ@z̪@@s@H:@6-@:y@&@މ@̪@:@QDV@ |@'@@2V@b  ̪wh Shr jYhLYh ϫQh(h<ϫRhO hϫQhp Fw 5U yvq ixxRH}AZR +"R(x,!.̪""0Q 4ixx6R:j!>y@yDyS^Bwh5ww75w www5 55|y s-GQ ̪g's6F̪$̪(,H .}B66>-D-J-NHP}@VHzX}@Zwww 5(5@5 U5}H}Avq̪+R"H$}A,x2QDV4̪g':j!@xDZFRL̪""N4 R+TRXHt"h7 5@Uw U<75@450 5}}A ZxQ|̪g'$j!*x.Z0R6̪""84 >B̪HxNHzP}@VXsF^fQ HV  57 57777`|̪g' s6Fs6F+s6Fs6F6$s-G*s-G,+0s-G6s-G8--Bs-GD-zw 5>5v5 5  j5 5  5 P E |+ ̪QDV̪g'Hz}@$H&}@,HY.}?@HB}AHHYJ}?VW}\HY^}?jjO pxx̪""fU w55 :  55@5}  xH}@:("HS$}A4̪8:br:(@Z`D%*FJHL}ATxZ^QDV`̪g'+@RDZFRR>5  5505+7 7 |H}AxRH }B HY"}?*HS,}A2:y4̪8 |:̪>̪ B̪F̪NsP̪yU5:  xQ̪""Q H4x}Bp $:br9VN %' `5  U ~ p w̪̪s̪y$Z(Q(*̪g'4e4@8sBQ(D̪g'L%*NTZ`X:brZ(^̪LzE E U  wH5~Q! ̪g'̪Q N̪g'%*Q N ̪g'$Z&%* ,k.̪""0Q 4Z> Bt F P" E : -  E U5|Hw}@ 9Q!̪g'yމyމ(Z`,%*.2̪6%* >Q N@̪g'D%*JQ NL̪g'f R$ U5 5FR ׭|H:}A %*6 +"R(x,Z.R2H4}A:H<}@D̪""Ft" N̪""P" X%*\&Kqfp0 009N}?D8F̪""HQV%*^%*b5U -* 5{%* ̪H}@xZ R$&R,̪"".4 2j!8Z@2VD%*Re4@VDeZHY\}?:~0  5    4 4  z%*xQ %* HY}?$* (%* 6̪:> @:brF}Z6y`,kfM+qhRn$9Br x$9f|7     d  Eet  d  - - {  } e4@,ke4@D$9kHxPe4@`e4@b̪fe4@h̪le4@n̪re4@ txze4@ |x}f&5555 5$ $ 5~De4@ 6Q ̪g'H}@ H"}A(-0QDV2̪g'8H::}ADFRHT Xe4@^Z-"7 H}@ Z̪s"Z0$2(̪k*B0QlL6ת:ת>#g'BIqF89JתNsP̪=TQ2&VsV7 U E* 2 QlL#g'Iq8RZs sZ$s*Zs.* 0!q6Z q:Q2&<sBsZFQH̪g'LIqPQR̪g'r0% e %H %z 77 7  e |ssZ Zs4R* *4RDQlLH̪kJBN#g'RsV̪2X2\Iq`4d̪2fv@8jɪ^f lv@8pv@8P  w`7 7 5U~t!s v@8t!s^K^K"^K&މ,މ0̪22̪Bx6̪28̪Bx}@D̪2F̪BxJ̪2L̪Bxt-*P 5 P 5   U E |Q2̪g' Z2V%*$e4@(De,HY.}?4%*8xQ<%* LHYN}?T* X%* hQBxj̪g'n2XFZew E 7 7 " U~a'\/ ̪Bx̪BxQBx̪g'-qsk s-G"'&'*s-G,'0s-G2"&"6'8- g'l pp   ~ /044484<>4BD4HJ4N R4V4Z4^̪2z e e   7 5 E5~̪2 ,^W2g&(au~4lL8>̪BxD̪BxPe2TމZމ^sz`g'fsh7jnj&tQ!v̪g'Lz U5 5E |Ht}A Q&̪g'H }Bs-G6 6-$2X(H *}B0Q&2̪g'6s6F86<̪q@'FZ>  57 |R̪q ̪'̪s̪'WZWWWWzW ̪'&̪',H .}B4s-G6̪':̪'J "   7 5ss-G̪' s-G ̪"&"̪'- ̪"&kN`̪'"k&̪'*މ0މ4Hz6}@>Z`B%*DH:brVB  E U 5 R$ (̪ ̪Q N̪g'%*Q N ̪g'$Z&%* ,k.̪""0Q4H:6}A<%*@6PT+^ U5 53R  R xZRH}AH}@&̪""(t" 0̪""2" :%*>&KqH}JPZ`T:brV(Z̪`  %UF%HE%AD 00AvATADATADATA e   w`~e4@ ̪%*̪%*"%**%*04lL:lL>2B̪2Dv@8Hɪ^f Jv@8Pv@8Zv@8\t!sLJ 7`w E7 |t!sh~ yyyy y$y&y*y,y0y2^K6y8^K{(HH*Hx@H -y@8}""@nL`@<H,u5H'$HGH-H z HYHCR8}@5HYH)nHR@ZHRމ@]ZHlH ?T*}@zHI[@:d""@zZH26HnHkHR&@R&@:t @Q @=HHR^K@HH9""@%?T@}B@z}A@n^@d@H HHHHA̪""@5HR@4HN`H4xH8xH0zxHD8H Hg'@8H+yH989H(!H?T@QHQHH%)@[qq@!Ht"H:z4RH/8RH.DHBbH@IW@"H;H ~G@-@:@Q*}@H?H&vq@Rw@zRw@TH R4@H4x@H1HLqH"qH8}HLH ̪g'@%H7@*}@Hz%HJ&H2HfHHIUKH<l3H$""@y@&H"@QDV@sH7'H!H6Z‹HFH=  6'hT4}h.Yrh@"hj?T*} (Q*} *} $  lYl%N%VA%VR on %VA%O:%VA%D%N [%3R] %X Tape %M Disk %M . Press "RETURN" when doneo%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 jjw 7 P D7  54E 55 .ZRE,>@:%""dvq̪""RR8x>H%)@}AF.R#wTyXH%)Z}Af@l#wnyt#vyTE U.U7    e<0  eL  jTx"x&.,#w.y2 ~G49""n^ 8RB̪""NQ*}RQ*}b""n*}r*}bO e<  } e5 7Tw4 7V  l &r V:d""IW"8}"".d8?T*}R&B̪""J`%?Td9""nL` h9""n7zZrR7 7 w ~ %h ^ZL~7 %?T?T7 9""nL` $9""*Rމ0R&6Rw̪""JRNH4xP}BVyZ$ & & 5~Q ̪g' -n^ -y-y:-n^ -8Q :̪g'@-yF:t H-n^ L-R-yV-yzД  D  ( . W   "00IN>""`Iqv+a \C^v ?T*}TT> >PP""`Iqv+ & ?T*}XXP  P\\""`Iqv+ &2 ?T*}\\\ \ll! =rp_sp ?T*}``l  lxx#t!w:vK ?T*}ddx x&Hl"Iq_sp ?T*}hh &Hl"ZI9r ?T*}ll &IIquqE_sp ?T*}pp &I} uHZZ ^K ?T*}tt &I!s!NJ"""` ?T*}xx &I4K`H fwL ?T*}|| &M 'K@ ?T*}   &N`' X ?T*}    &N`z#" ?T*} ""62p`[q8Z ?T*}" "002l*"h)""` ?T*}0 0DD2""` ?T*}D  DPP ?T*}P PRRe4B[MD"h)""` ?T*}R Rbbt:#&Hl"Iq_sp ?T*}b bvvt:#vv, ?T*}v  v*:`M sZL"K69#"_a\gUN@ ?T*}& :" ""` ?T*}  :)e j)R ?T*} :)!y; ?T*}  4REplr ?T*} 4R""` ?T*}  SZ ?T*} SZE~p ?T*}  Y&8"' X ?T*}  Y z2 & #yxfX ?T*}   E`W_sp ?T*}     a\gxxge!X[qj@ ?T*}   2 2 f] y_w~W ?T*}2  2 @ @ pm}%:dF%:lv ?T*}@  @ R R wqp_\C^%: ?T*}R  R f f yx5a|qXap:*y}au: ?T*}f  f z z ysX ?T*}z  z   ysXZI9y ?T*}     8}LK"h)""` ?T*}     8}Rlr ?T*}     8}WqE_sp ?T*}    ( I~vC;LY00QvATADATADATAZp:H B,`SLH! ?T*} $   & 4j!;vZfs%Z_2v ?T*} "    4*"h)""` ?T*}     Ѕ`ỹT ?T*}     މ? }W%: ?T*}     & & ZI9y ?T*}&  & . . M?}Qd ?T*}.  . > > M?}l@ ?T*}>  > J J Me;} ?T*}J  J X X X H} ?T*}  X  X d d X:`MT ?T*}$$d  d t t xQ/] #s:Iqwyqqp Q*}t  t  $ {D`^w{Ma}`xx Q*}     :)C;r} Q*}     t!^ Q*}      SZ Q*}     eus_,0 *}     Y8dW`:i _M *}     8? }a}K *}     8? }a}Qq- *}      lf!t8K2*"h)""` *}   * * lf!t8(}Kq`uqE_sp *}*  * B (B meeu&LqSHqY4oM_Tx~K8}8" *}B $ B f $f meeu&LqSHq`ZI9?}Ѕ` *}f  f  & lf!t8K8 Opa *"h)""` *}  "   @b 0z^K`0DZ@" ( @ݪK@{3}@Q @}A@y@g'@y@K" @[qq@Zs@z>/K@H@H@ת@ʫf@vq@s@y@̪g'@KKq@LqE@QDV@ "^K`h( s(#h _Xyh  7 555w55 5e Uq q, pyg'$H&}A,Q QDV .̪g'8H:}ABZsFsNZP>/KVyX>/KfZh>/KU7 |7 zv- < w@w<602, ( $ =- 8  @y>/Kʫf Zs,{3}0Zs2{3}@{3}F{3} -  eW!u 55  d | -B.y2{3}4{3}>{3}F{3}N{3}R{3}Z{3}^{3}dz| ^-tt!l Z 6D\ H $C7<782. @pwaAaef 8@sFsNsTs`תjݪKnst{3}`&a     -w7 7  6U  e qZs.s0" ( 6KKq: /KrZsvs~ q,   w~w B  @Cm -:<-24 @`   -w 2$vq(" ( 6KKqD" ( HLqE`KKqvK" |[qq,@pw תݪKb 0zQp0D(@:@:@Q2@s@HS@^K@x@@:2@n`@%'@znL`@H@̪@̪Bx@Rމ@H[q@v@8@HY@lL@n@R&@}B@}@@%?T@:br@z}?@}A@n^@@@̪y@̪""@N`@De@@Z`@@2@H @?T@z[qq@:s@H}@﫪@G}@Q!@:+@t!s@vq@Rw@9VN@@̪2@̪g'@'@Z̪'@7@މ@:@ \9hQ"h,̪hh~hk*}h L;L%NBackup file ID %P,%P LBN %T.%NRecovered  fw 7 5w5555--00YN}BD(F:brL:sN(T(V:\:2^(5 -4w.Um$w & -i  Ҧ t(:br Q2̪g'̪Bx̪Bxމ"މ6Q!8̪g'>މBމJTv@8\v@8^t!sd^Kh^Krw  W!f@ `%D D >-Dm m|5mrw 9mzG} H}G}H}H}"&.^K8<BF^KHL^KNXH}^j﫪nt^Kx^K~H}m5Re Ee C C` fe w  --fH}﫪 H}t!s$v@8(^K.^K4^K>̪2`lLdlLh2llLx(z:brPj-e w --7  w ~(:s (:2މމމ ̪Bx(މ*̪Bx0﫪6މ:މ>[qqD'FR&J:L̪n^ 6%55r'̪nL`  :s (:̪n^ H }B H"}@(̪'*̪nL` .̪'0R&4N%-*w$U̪nL`  ̪nL` ̪̪y̪y7N`"$̪nL` ((*̪n^ .:s0(>މB2 rQ!̪g'̪nL` މ̪މ̪"̪*s,7.n2̪y8̪y:7<n@,p-7 7 7 7 7 m~̪nL` ( :s̪nL` :+̪n^ ̪nL` ̪nL` "̪nL` &RމXw %HD7 7 w#  # rމމ :s(މމ ̪&̪y,̪y.704R&8Rw>﫪FDeJPDeT,,w   7 -E  * ^7 77a ewmw >vq Z` *.̪y0n`\7rnL`z[qq 55fw %777  7 U 7x7tnfwnL`nL`nL`nL` ("n^*.̪y4̪y67>vqB:D(HVR&\̪""^ lx$jb pJ J ee:w 4 ,& & & &  w& & & Ε w w A ̪"" Rw\%'`9VNd:2n[qqtvqx%?T|V & & & & f& & & Ε Uw -   C C`e   E `D 7!VV?T%?T %'$9VN(:28[qq>̪2FlLLlLP2TlLX̪2~މDw!e   @ 6 މt!s lL&lL*2.lL6v@8:މ b t0zve?Tt0D Hm# Hp+Hq-HlDMH[VHrHUH_YHX5Htv^HcHfzHdCHSHn8HbxHZ59HuHi2HoZaHy{HjzHT:H\:HVRHvzHez;HWHRsTHxJHPSHOH^HYHQN HkqHaH]%Hs HgHhWH`BWHw IWhf fhfw  fwh ` ffwJm9ahw~W f  fwfw  Jm9a)&p f  fw fw&i'XmnL9v f fwfw**8|X8 f  *  fw*fw448? }WLH! f4 fw4fwBB8?}Ѕ` fB fwBfwPPmy&mnL9 fP fwPfw``""`Iqv+_tK f` fw`fwrr,:Y Kw^z`)&p f  r fwr00avATADATADATAfws:`L;!vi;)HmnL9v f$$ fwfw&y:i~LQt99#"v8Wp`8;8}@ f((" fwfw:`8tvp`8 f,, fwfw:`vLT`fM+ f00 fwfw:)%:W@ f44  fwfw:)5OpM f88 fwfwR6x+_W f<<  fwfw  ST62K !^t:;_ f@@  fw fw""WE} uH,]a w!@~ fDD" fw"fw: :Y% mnL9|X8v +-Lq fHH: fw:fwVVYq:`8yX fLLV fwVfwjjYqa\gMK;w: fPPj fwjfw~~e= 6]zp8"`Y fTT~ fw~fw z@}r fXX fwfw8}T]?}Ѕ` f\\ fwfwg h[8v f``  fwfwg h[&Sd99:v fdd fwfw{YW)g_ fhh  fwfw{YWt99" fll  fwfw$,9^w~W`z}K# v_RuL`; fpp  fwfw \C^(}""` ftt fwfw   \C^K(K fxx  fw fwox# v_RBx@ f|| fwfw,,}[MDv f,  fw,fw88}[MDv`ԅ f8 fw8fwFF{DvWoLYZ fF fwFfwZZXkLe \C^va fZ fwZfwjj%K/ \C^K fj fwjfw~~e4B[MDqE_sp f~ fw~fwt:#&WqE_sp f fwfwvQ1ZqQ`&Iv`ԅ f fwfwY \C^(}&Fa f fwfw&ZZ ^Exss:`L;!@~Q]:FQ%:v f" fwfw"5aYs:)h;?WL 2@ f  fwb Xzr}XD#2@x@%X*@%*@"҅@y@n@H@R8}@t@n@R@zH[q@S@2@HY@# z@H@Hz@R&@}?@}@@}B@}A@=@R@H@zg'@H @t!@2X@"@̫@H@H@ת@X@H4x@2t!@L@ip@6-@Jt@y@"@i+q@ "h6"@h"hl(  i j7 6p7 7 7 5& 5 e55|"̫ # zyת6&ת*̫2#26=:"҅>H4x@}BHRHT}AZy`Hb}AhHzdx5 V S N5 G555 4 5}@ H[q }Bipi+q6-"2X(H[q*}B0y6H 8}B>H@}@FHYH}?NSR6-V2X\6-`yH57 U 5E{H}@ %*2%*2t!ng' R&"n(x*" 0%X*226%X* 82t!nDxHRLRPR8}Bj5  w5  & & 3KL H H[q  }BttH H[q  }B&t,t&b zFwzD g@s@#2@a'\/@4!@&@Q&@@Z@^K`@s@x@z{(@Ό@x@%X*@sZ@Ό@%*@`@ZZ@f@#g'@-qs@n@H@4@zK@v,@00iN/K@!@4Rp @ԅ@H@H@sx@4@zYd;@Y;@""4@k@z@ @4R@t!s@vq@B@̪q@4RZ@T@vDf@4xQ@z@v&@z=@2@R4@g'@2t!@s@s@̫@!@"q@Lq@̫@̪g'@zz0@z@̪s@A&@@@&@2@lM@@s@Hy@Hy@_2g@&@v0u@zQDV@'@vu@@2V@H#@ j4Rh2Xh<h Xh(kN`hL2h khR V7 UE7 EEE b |k xx%*2%*2t!"=(a'\/.sq0 sD 4s6_2g:4Rp a'\/L4RsN4RDfTvDfX4R!^vDf`sZd4RDffsj4RZlZsrZ qv4Rp x!q~a'\/T m U5A? 5s sZ4R!xIq"4R &sZ(vDf,s.4RDf2lM44R!:lMBxH2NkRQ& `5mw 7  z E555   ̪g' QBx̪g'k̪Bx̪Bxk"%X*$2(%X**2t!:x>H@}AFHH}@NHyP}BV\ZZlzU7 wU w%wxw e5 ZZHy }B=-qs8R a'\/$k.sq0 sD >sZ@vDfDsF4RDfJlML4R!PlMX4Rp \4Rp bxh0ue w%z'5%N%N--- - -5--tzz0Q& ̪g'(06&>&F&N&V&`̪qf̪slQ&n̪g't|p^- 77%5e 5Ewd75 7̪q̪sz&a'\/0C4:f<>/KBfD>/KPzR& V4Xg'^4`f4d@&ff4jA&lf4L77E7 7  w7e {z=4 z= @&z=A&a'\/2V2"s&#g'*k,B0Iq648R4:z BR&HR&&`7,5 5 55w557 U{2V 2Vng'2V $x(T .x4QBx6̪g':' DxJQBxL̪g'P{( VR&Z4\>/Kdn E7  55x  5wU2VCf4>/KxQ4xQ4Rs s &$_M!&4!*_M!,4!0_M!6_M!>4DfDa'\/La'\/VsxXg'^5 m wE@a'\/ x!4!ԅ4Df$xQ(4xQ, 0 44!>s &@ZsD4DfFsZJ4p L!qRZ qV4xQXsN(  wx}a'\/sZ ΌsΌΌ4!v! Iq&4(R4*4 04!4s64xQ:sZ<4DfBlMLsZvr- e5 %%z%e w5 E4Dfs 4xQlM4!4!lMlM4!"lM*4p .4p 4x:u>zFzNz0Vzjxrx00qvATADATADATAU15555 e 55 5 U -@5t&& xng'a'\/&a'\/,H#.}A8C&JxRa'\/Za'\/fa'\/pzr& v2x2t!~HR`55m5mw 7  55@}A HH  }AH }Bk2 QBx"̪g'(k*̪Bx.̪Bx2k6%X*82<%X*>2t!HnJg'd-55 %DAE@ 7 7 ew}x _2g _Hy}Bx$%X*,x4262:#g'>k@BDsHIqN4PR4TR&ZR&\Lq H  5., &e  55  ,5wZ5595k2x&4(R4,R&2R&>xDQBxF̪g'J' Zx^{( hxlT tx|a'\/2fE e  5#fE ee&f R  5 w 5 >2$a'\/.2H<T` XEdba'\/p2tCf|a'\/x V5wUw5 $w  w-w &555m5| sx g'a'\/"x028k<sFsH sD RkXHZ}A`HH b}AhH j}Bpkr2vQBxFzmw 7  545|̪g' k ̪Bx̪Bxk%X*2%X* 2t!&f4(""42Zs6 sD 8Zs<HH >}ADQ QDV <5,w     a@ e &f    e@ e@ eew`w 7`w w w EU w l̪g' QBx ̪g'vqsZsV̪BxZ̪Bx^̪Bxb[qqjvqnyZ p>/Kvxz^K`~[qqn85@RRreE@U (U@55 5 |x gsZss._2g4x:s<sBsZHxRa'\/VHH X}A^H `}BfHh}@X5   $5 55%X*!q Z qa'\/%*!q"%X*$!q*Z q.Iq2"q 6Hy@}BF!Hg'Ra'\/XHH Z}AvR 55 5 5U E 7 7 5H }B QBx̪g'H}Ax$H&}@.x>xFsqH sD LsN_2gRv0uVZv,hv0ulvupv& ww~E U% ww5E ze wtx& v&s sD xQ,_2g0s:& >sDsH_2gLt!sRt!sXx`xp2tv#~v#V@ Uw55ww w w5 w w5~&  xHH }AH }B&k8t*vq.2[qq8bVK}BDY;H̫LYd;P̫THH \ 5 w w5 w  w 5 55|}A H  }BY;bOMYd;b4M$x*vq0k48[qq>H @}BFY;LYd;RHH T}AZH  e E e  5%%?  55 w d}Bj}DxJ%*L2R%X*T2Z2`kfHH h}AnH p}Bvj4|vqPf 7555m5mw 7 kH}AHH }AH  }B&k(2,QBx.̪g'4k6̪Bx:̪Bx>%X*@2D%X*F2t!Jk U -j-b TR  (f4""44""44f4@& f4$A&&f4*4,g'024484@00yN/KRZT>/KpH r}B\ 5ew 7  --5e|H }BkQBx̪g'̪Bx ̪Bx$%X*&2*%X*,2t!0k<2>%X*D2F%*NkRQBxT̪g'r w 7   ww 7 7  E `w e  )5r̪Bx̪Bx %X*2%X*2t!k&242:vqFv#JxQNsnv#tv#v& zH|}AV 5  %  7 7 ƆyH }B#2#22 2$2(De*2.#g'2k4B8s @H@@R8}@n@R@H_q@$97@Q@H@ @H*K@@j@:br@z$9f@R@@ey@H@d@Ht@x@@H@}@g'@'@Z@:t@z:-t@!@=f@[qq@t"@)0h@)0h@:@>/K@-@"@@l-'@H@e4@@zH@f;@:@@ȫXu@}@~@vq@ȫ0u@Hw@@@> @ǫ+@:w@z8}@6@2!@%@7@e@ǫ,@W@@&Kq@@$9!@$9!@$9!@:x@z8}@N@kf@@j!@Hy@:By@:Fy@@H:@""@:y@@@:@zW@@@  ϫhϫh ϫhN6p;hY`;hXh@h4e0h zhfth  J N555%wwwt:t en^  ȫ0uQdH }A&('02'8:t :en^ @RDǫ+)0h VF '5#7 ww)% w7|ǫ+)0h ǫ+ǫ,l-'ǫ,R$en_ *n_ .e6> Ƃ@B4DeyJ:Len^ RRbe U777 w 5'Uz7$9f %6""$a'\/(8},Z074ȫXuFvqJHL}ARZTR8}XZR`xH w^5  LUwy4 j!H}@:Fyn^ "nL` *y0W2>/K:kf<8}"">8}BdDn_ 'F:75%  5 5dn_  8}H_q}@:tn^  y&$9!(y.y074t68}""88}}@DHzb|5ww  5 w45wf7 5U ~}@ H }A:w n^ *y4H6}@@:yBn^ FnL` NHP}@XnL` `:brL z-P׭%~n^ %* nL` nL` %*y"y*$97,y0Z8$97:yByHyJ7L"U5 ---5" v g'%*H*K}A  ( .24g'<nL` @:FyBn^ J:br8jP 00vATADATADATA%zn^ %* nL` nL` yy 7"(%*&Kq .0""26:FyF %E#5zn^  nL` yg' $9!"y(y*7.$9!0y688}"":8}>!@8}""B8}P 5w5wDU P5 5{HH }@ H}AW8}""8} H*K"}A,:w.n^ 2W4>/K>yDHF}@L~N8}""Z,Us5oEgw 5?5@#5 wU8} H }@H}@N8}""8}  H"}@(vq,02R6H8}A@xFHH}ANj!^5 ׭7 7 5@w '%$7}xZ R8} 4 RHt}AZ&:t(n^,Z2Z8xB:-tDn^LyR$9!X7\tb wtU \&%#75@58}""8}  j!:tn^x"Z$R8}&4 *,R4y:$9!B8}FLxRHzT}@Z8}\=f\: 7`5w5 5U 5  5~8} dddn_"n_$n_ (nL`,H.}@6nL`<W>>/KD:wFn^R:yTn^f 5  L 5%E5M5 EE UU w5}H}@ Zg'$H&}A,.g'2Hz4}@:H<}ABjFWH>/KNxVxX ^x,X  055@5U|H}@ :n^:brn^$nL`(%**nL`.H0}A8x>8}BHD}AJLRRxVZPH55w ) %U R8}HHt  }AH}@t" " [qq$*> 8:-t:n^ @RB>/KF:xHn^ h"5 5  Ux)   rEy R >/KRZR8}$x*R8}0x2x :@> N:wPn^ \:y^n^ fR*T)  >/K > y$9!y"$9!$y*y,7028}""48} :!<8}"">8}BHN:brPn^ RH -P(׭% z%*nL`  nL` yy"$97$y($9!*y0$9!2y8Z@$97ByJyP:FyZ UP z%HD%R17%R2}n^  nL` g'y7(nL` .Z8:8}""<8} @D%*J%*R%*yh7%VOQ%L1M5 -D-@-< ) )|%* %*%*R H*K"}A(%** 0%*2 8%*: D> R> \ybyd7dP  )P t  w5G{8}""8} > $nL`0Z2%* 8:8}""<8} @ZJ Nt R XHwZ}@`%*.tR$ <׭  P %V1%F1}Z:Fy n^&nL`2:br4n^:nL`>%*@nL`N%*T!V8}""X8}^%*df;f8}""h8}l:Fynn^b  5 R$ U5|nL`:brn^%*nL`H: }A&%**6:nL`J$9!LyTy\%*dyf7jl8}""n8}rx^ `7P 8 47%EO%F1|:Fyn^ nL`y7kf 8}"""8}&:br(n^.nL`2%*4nL`@yF7JL8}""N8}T%*XtZR %V1   " 5 hE|%* %*n%*R8}\ ?$5)"}R4  j!ZH}@":By$n^*:Fy,n^2nL`6<> FyL$9!NyTyV7Zkf\> ) %75 UU E8}""8}  :-t n^>  y&$9!,70t28}""48} /KTyL E%5*5&5"57  ~ >/K  H}A y&H(}@.W0>/K4$8R:$ < @:-tBn^ * ) wv2t8}""8} > yt8}"" 8}4b t0z8}?Tt0DtHHH%!H!HzHf;H~H~HNH}kfHWH: dh8}*} 08}*}h?T ?Th ` 8}*}?Tt!w:<% N  8}*} ?T?Tt!w:<0  8}*} ?T?T$t!^UNEX"` H}`' X 8}*}  ?T?T>>""`uL`;#  8}*}  > ?T>?TLL:)r} 8}*}L ?TL?TZZKq`?}U< 8}*}Z ?TZ?Tj j_qt:r 8}*}j ?Tj?Trr8}LK_sp 8}*}r  ?Tr?T~$~8}N`` ]" X`t!& 8}*}  ~  ?T~?T$8}O`^w{Ma}`!d 8}*}$$  ?T?T 8}P`w~X+_st G%: 8}*}(( ?T?T 8}P`w~X+_stY!-ZLq 8}*},,  ?TL<0b // @ t t "&t 'tataG?@ay?@tvLtO tt!t;'ytD,kt,:":}tI;tvLt2M(t Nt N"&t N'tU#tU]RtUftShtShytlh.tstSy tyty"&ty't+{pt+{P}t0{Gt3{t3{tl.tot^tӍtu~t먫tuXt+gtD~t먓tuLtsttqt""t%tCTtxdt$CTt$u~t$(t:Dt>MtCtCtCtCKtCjtCtD8tD:tDFtEO tE&tF~tGRtG gtH tHtHVNtHCTtHatH:dtHetHptH\}tHtHtH;tHtJ tJtJtJtJg'tJ(tJGtJKtJbTtJ:dtJwtJwtJytJztJtJÅtJLtLtL NtLtMstP\tctctcJXtcTXtczdtcyteĊtetfz`ititiz}trtrtrtrtrtrtvvt00vATADATADATAxtxtxtyft|tCTt tKta't2tKtststttt{tGtKtkMt Ntwt*}tz}tttBxt[(t(tytz}ttC tt!txtxtxtxtDrt©LEt©Ftȩstݩ(tީz}tߩ0 t Nt|&쩔&tCTt t t yt z}tTt+ t,!t,Kt,Kt,Mt1Ut1't1CTt1T[t14ft6}t7t8ty\}t*}ttzdtst-tT.t.t~t˪stӪtӪtӪtת3tتtتlztت*}t۪<}t#te&Hgtttt qtstQ}t~tAqtAvrtAytB !tCtCLtFstFtK tKQtKZtL:dtO`KtOKtODLtO NtO_tOȒtRB9tR9tR,:tRR;tRStRF^tRX^tR*}tTtTTtTz}tWtWEtW|qtWkrtWrtttxtt@ttt!t@wt*}tt2t4tttt""tSt^t\qtt&tYt""t &t(t(tuLtkMtdtJt,ttt̫t̫2t̫` t̫r!t̫g't̫pEt̫stͫdtϫxdtϫdtϫftϫptѫ4tѫO tѫDLtѫ,xtѫBxtѫxtѫhtѫjtѫtStStStStStZtft2gt*}tz}tMtt[tFtxZtttqt,ttLTtbTtgrt5t5sthth Ntht}tv~tt 3toMt,/ 44Lt:,t;t;Tt;W F<KXYZt\{t\Et\Gt\KYt]y zz]zc|@W"tkg't@8<@j<pKqtP}KxZtZtttd*Ietetgtwt7F0SYSYSYktگKxگpYگ qt`;WwLC tCTtCTtCTtCTtCTtK+~Y~Y,kX,,' ,W,zd,y4,YDp,Dptv@81&vktzwtvvtytvvtytǰp&t tŞt eY ږt t t t Sx Sxx+Y:2LtH~Y 44Xt't\}@K:]Ktv?@@~~Y]0ѱ-Xtձtձ+P|~tStHtLtP}tCMttK: X8 X pt wt@tg't*}ttSt!TtbTtv[tg't!vpR#g't$vpR$X)vpR,y3Ft3P}3YZZȌTZ@ΌZԌZڌzZB Ʋp>ɲ}\s[d"S xQSSaF Fa a<a<aRaaa*a"xaD,+a2,ay:1&aFa N azd4adf:af?@aOqParWayX8a zYaz[ta;}pRa\}taz}Xa/a0Ta1a2a3za4a>a|\zL X"H`:0&:.LX.`&.".W .H..4|KS LNSQdxSSxiT]dS,e`@f2%4S%6A%4SGLOBAL%6S%6<%2A%O:%4>%4S%6A%4S%6A%4STI - %6ASystem Logic als:%5S%5SBlock: %Q%5SBlock: %6<%Q%6>Status: (%VA)User Logicals:%3STerminal: %5AGroup Logicals:%3SGroup: %QTask Logicals:%3SCRTask: %2R > > > > > LIST OF LOGICAL NAME BLOCKS FORMS A LOOP.5 5 )5I8U ;Ce CeCe Cerbg'g')|~"*_M$CT*80U6:-FJNnOH^uOXhaOwp,vtOŞ~r‹#PCe Ce  h~   x wB#uO$,*4lO8Y@D.NT^~~&eD fEEe E eD & w N\eD   v& Nltx"k6 w& Y 77 E  EE`  ѝx"482M(<:,Nrx:,s$XY E  XЕ,Е P XX \ % %@& ( X,2XLXRXV\f\ӕ%ӕVӕA!Q ` Qe KX eCe>&:,*2M(.FJPTeĊbXluxuz e  Ce5 Ce5Cmf     m %e @ uX$9,4\_M<^P,TZ dvl8Y eC! e@ Z H 77 e- & O<. @&*D~.Z>H Pal:,rvOr eC' B$ ` Z e#  @^  3 " &^ȋЭ1Н)8 . 26#<@ F^N:,TX3l^ d2b >za>D(@#@sh<}@i@#U<@#T[@@:,@chw@c@;T@uX@znH@5{@|~@nhH@sh@Ş@#5@rh !@i@Aq@u@u@"@ "yh<   CACHE INFORMATION DUMP OF CACHE REGION: %2R -----------------------------DEVICE: %2A%Q: DESCRIPTOR STARTING LOGICA|L LENGTH PHYSICAL ADDRESS BLOCK NUMBER (DISK BLOCKS) ADDRESS %8A %8A %Q %P00> > > > > LOOP FOUND IN LINKED LIST IN POOL AT %P> > > > > CACHE REGION WAS NOT FOUND> > > > > CACHE REGION IS NOT IN MEMORY> > > > > REQUESTED PARTITION IS NOT tA CACHE REGION> > > > > LOOP FOUND IN CACHE STATISTICS BLOCKS AT %P00> > > > > LOOP FOUND IN CACHE EXTENT DESCRIPTORS AT %;8ANO DEVICES HAVE CACHING ASSOCIATED WITH THIS REGION-<<e1 J $D!N <!FCf&e e00vATADATADATATŞ |~":, "":,&,126AqrnhHx" Be!*e e -e!eC ' O w J"sh nhH&"2"8shHshZb'jOr:,v~4 w ee5e J7we N ,  :  E 8 :,sh<}&i,rh !sh<} Dchwrh !   D D D D D D f& ee0,ee eE`7QZ&:5{HnHR,T:,ZunH buu jinuXu z:,~Q,aeA je:`D jeD  , `D JeD   E`D eD (a($c>#T[^#T[|#T[~ ,  f&f, eD  D eD  L#T[:,,;T 2:,6,8;T>#\#U<h#U<#5 rb tzatD\df@\f@\Z@@\s@\@\'L@H\}@@\X@C @0L@z0y@|~@\w@/ @0W@iw@0z}@\#@0r@*@0@\?T@ @8h  NUL MSG LGO DSB PRV SGL NIO RST EXT POL CLI PARSER BLOCKS CLI TASK NAME %2R CPB ADDRESS = %P>\Z \?T\'L\\f$\w*\X0\s6\#<\df| CLI NAME = %2R C.PSTS: %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A CPB DUMP:e5apC |* ]@7CKee 5UTeeje  R@|~H\}(0z}40y<\dfBiwJTT0Wdjl0yrv/ zLtee`e`B eeJ  *0r0z}0L(0< b zaRD 3g@ 3s@ 3@sh<}@@:,@Hp@,y@qz@qU:@ 3cZ@ 3k@r 3x@ 3r@|~@nhH@sh@Ş@rh !@Aq@ S@ 3L @shU<@ "ph6  CPR INFORMATIONRSX TO VMS RINGS:VMS TO RSX RINGS:PACKETS IN RSX-CONTROLLED AREA: FLAGS: %P %R %R %R %R %R %R %R %R |ADDRESS: %P00, LENGTH: %Q MEMORY AT %P00 IS FREE FOR %Q00 BYTES. PACKET AT %P00 OCCUPIES %Q00 BYTES. LENGTH INDEX TYPE ITEMS TCB UNIT ------ ------ ------ ------ ------ ------ %Q %Q %Q %Q %P CP%M: LENGTH ADDRESS RETURN APR NET STATUS t ------ -------- ------ ------ ------ ------ ------ %Q %P00 %P %P %Q %P %P FLAGS: %P %R %R %R %R %R %R %R %R ITEM OFFSET: %Q, LENGTH: %Q, ID CODE: %Q ITEM BUFFER BEGINS AT %Q:> > > > > LOOP FOUND IN LINKED LIST IN POOL AT %P> > > > > ClPRBUF REGION WAS NOT FOUND> > > > > CPRBUF REGION IS NOT IN MEMORY> > > > > CORRUPTION DETECTED IN CPRBUF> > > > > ITEM NOT IN PACKET-0zU:xL skcZgrBqzqU: 3x 3L  3s 3k 3cZ" 3g& 3r* 3&&66eJ $D!J <!BCf&e Re 4e!&e*Ş |~AqVnhHnsh Re e!eCa  w/ eee@m HnhHsh,sh>aFN:,R/\sh<}drh !sh<} nshU<rh ! .  N n  l  $  R  e?D E?ww~w|m"6<LP$Vfvn6 ^  w &eD & VeD eD { H Hp6"0B:,JN,yTV\:,h:,r{x&w  -we` Eww`00B:,Ks &  f& jw7  f&eD 7!>w!. Ks :,*.,y4:: eD f&PP\ZmB mD 7!Hw!BE  4:,.<:,F:,Z:,`:,dl S|b ưzaưD@ @ZJCv.:~ BSY| @ Z~JC "$&y(v*,y.0.2y4:6~8T|F-MNT FOR MDM OFL-RED PUB UMD PDF SIO TRN MUN MNT F11 COM PSE OSP 32B SWL UMDxTS T'TQT^TLq$TJg*TL0Td6T7x > > > > REDIRECT ERROR (U.RED=0)INPUT OUTPUT N/A .%  7  CeE%TTUeCeT|~eĊձ  $ձ*ձ0Ş8Ş>ձNZnHru~ue  ^wlETCeL55<U455&CeCeCe8uX &:D9Zg'j t~y5 Ce5wC  PCeCe J 9 Ce5T{8{)^ T^(,,28<BPZn9t,zz 65  Ce Ce 5Ce Ce kCe5 Vf S @, 6C l8YH dzb xm m VzxC Ce  pe 4E8 3{0{G *:08J<\<8Yhx Ce  *v  m &fPCe CeCeCe58<26<@FmX<dDph$   TASK HEADERS %2R ------ ( OUT OF POOL ) %4SHEADER ADDRESS = %P%6STCB ADDRESS = %P%4SPS=%P%5SPC=%P%4SR0=%P R1yl ઀|=%P R2=%P R3=%P R4=%P R5=%P SP=%P%4SINITIAL PS = %P INITIAL PC = %P INITIAL SP = %P%4SHEADER SIZE = %D. NO. OF WINDOWS = %D. NO. OF LUNS = %D.%4SCURRENT UIC = [%O,%O] DEFAULT UIC = [%O,%O]%4SH.WND = %P H.GARD = %P H.VEXtT = %P H.SPRI = %D.%4SDSW = %P H.FCS = %P H.FORT = %P H.OVLY = %P%10S INSTRUCTION SPACE%10S D A T A S P A C E%10S -------------------%4SHEADER:W%88&7 B:<|~BFFNձR8Z8`ձfձlŞvŞ|ձle%7 e%e5 ee5wRwb tձ"ձ(ձ.Ş4Ş:ձFձJձRs<}X#`pfsh<}ngaxR(  e e e" 5 &Ce%P &p.6hh@rh !hh F"L\5bjg6 |U]Rde % Cee  _ %Cep CeCeC4U]R c6@y@_FZc6@ybphni6fxi6xde CeCeCe Ce Ce  CeCeTi6@yh6$w6 X2n6VN:@Fc6Vd6djpw6 Xzg6 \CeCeO CeCeCeCee e 5e`v6#s6fO"(d6Xz2f6!+()U PARTITION INFORMATION%23SM E M O R Y M A PPARTITION PCB ADR BASE SIZE U TYPE OCCUPIED BY--------- ------- ---- ---- ---- ----------- %2R%5S%P%5S%P00 %P00%4S%p4A %7A %A%2R%A %8A %2R%5S%P%5S%P00 %P00%4S%4A %7A %A%2A:%A%6S%8A<--ERROR %23S%P00 %P00%5S %16S%P00 %P00 %16S00%P 00%P %16S00%P 00%Pee   j:BD|~LPX\b hlBxv~Aqh%7 tw H m  ^   F <ձ ձձ$Ş,Ş2ձDձJձPŞZŞ`ձxU]R` E 5`w e w5e%%@*;CTS@rh !\zdbձfձnAqrձv~7 t*H 62e%&7 fձձŞŞ"ձ,t4H8,zdO_FO_Vdxls<}v|Pz ~ P .5  e e*e& 5UeBz~*ir:mhFohX <}`T fj  <} tz~erA  2bbb$+29@7!$5* 5z nH"r&08>@2BDbFHbJLbN$PR+TV2XZ9\^@`jg%vC |d&#HU-  7! 7!259+5'@$5+5@*4@2DidfL9RiUZ@`dg%l+pix|C .5U - $5~ d&#$ ir( b wzadfwD4L@ODL@@:,@@]K@C @O_@J @|~@L:d@K @zrh !@L@H@i@P}@ S@<.@Bx@3P}@shU<@*df@ F KhKh0 * + - "" POOL DUMP%27SS Y S T E M P O O L%6S* = NEXT WORD ALLOCATED FIRST FREE BLOCK ($CRAVL) = %P%4S%P %2A%P %2A%P %2A%P %2A%P !%R %R %R %R!!%8E!%23S[ABOVE LINE REPEATED %D. TIMES]%6S > > > > > INCONSISTENCY IN DYNAMIC STORAGE%6S+ = NEXT WORD IS IN $PKAVL LIST $PKAVL = %P%6S- = NEXT WORD IS IN $PKAVL AND ALSO IN $CRAVL > > > > > $PKAVL LINK ERROR AT %P -- FWD PTR = %P SECONDARY POOL DUMP%25SS E C O N D A R Y P O O L%6SNUMBER OF FREE BYTE00B4LVBx`O_  $7     e5d _ e eZ &,C 6*dfYF ? *&f  ^    e AP P z  "R  S> n"r:,~ &    l \  \ PNNf&"7 D B@]KB H3P}Nf:,j" R$  .& @%    $"R " RS @0:,8<BJ:,R"V:,Z:,dh"z~v e 7  7~&f&f    F   . :,$i.:,@N4LTK fpO_X  C f5-- "<.P}6O_JP#b γzafγD/d@Z@g'@ @[;@y@ N@zw@g'@g'@D,k@fLy@z9x@["@}@0# @a@w@Ie@vL@e@3F@H@y@L@@J@zP@ ږ@[Y@@@@@ @ @ @"@ p@y@YZ@xZ@ :vhd̫e zayh\aGh %NCDA -- Command line syntax error%NCDA -- Illegal switch%NCDA -- No output file specified%N %VA%NCDA -- Analysis output must be directedto an explicit device or file%NCDA -- Output dump file name must be explicit%NCDA -- Crash dump must bea input from an explicit device or file%VS/\%N%NCDA -- No input file specified%N%VA%N/\%Nd\d fh& (56565`6  45  55@ |  D,kfD,kh ̫e 0# $g',g'4g': N[Y @ N[; Hg'N [Y Vg't.5 # m-h^& 3K5 tV h ["  g' [Y  m(-,D,kh2^>3FKN5Vt^flV̫e .,=,xțx/&-JC , g'g'x x g'$&(,J  EXIT  ̫e **Z  g' Z LIMIT  ̫e 44hh  LINES    ̫e 88ppSP  ̫e << g'SP^  ̫e JDJ:b†:†:†ț/_g' g'b   &( .04 6:g'>B  MEMSIZ'    ̫e 0:†&ȁ,,/ʆ,C g'  & ",$( ,, STB    ̫e ,,ʄ,  g' ,""ALL " "̫e g' &&CLI & &̫e  g' **CPB 00vATADATADATA* *̫e  g' ..ATL . .̫e g' 22ACT 2 2̫e g' 66STD 6 6̫e g' ::TCB : :̫e g' >>TAL > >̫e  g' BBHDR B B̫e  @g' FFDEV   F F̫e  g' JJDCB ""J J̫e  g' NNSCB $$N N̫e & &g' RRUCB &&R R̫e . .g' VVPCB ((V V̫e 6 6g' ZZPAR **Z Z̫e > >g' ^ ^POOL ,,^ ^̫e F Fg' ccPOL ..c c̫e N Ng' g gSECPOL 00g g̫e VV g'   nnTIS 22n n̫e d djg' jrrTDS 44r r̫e l ljg' jvvTAS 66v v̫e t tjg' jzzADV 88z z̫e | |g' ~~TSK ::~ ~̫e  jg' j TASK << ̫e  jg' jDMP >> ̫e   g'  DUMP @@ ̫e   g' KIS BB ̫e  g' KDS DD ̫e  g' KMR FF ̫e   g' BL HH ̫e CLQ JJ ̫e  g' CTL LL ̫e  g'  DECNETI NN ̫e  g' NET PP ̫e  g'  CACHE RR ̫e  @Tg' TCPR TT ̫e N-DDENS $I$T$Y$$=,:,l>Rg' Dg'" &$*.$26$:$>$B,F, JlL>LOW VV ̫e 2 2> > HIGH XX ̫e 88>" > SYS ZZ ̫e DhD=`:`=r:r΂:~‚Z:†:‚:†:‚:‚~g' g'`` "$(,r0r 48~< @Z FHLP T Z\ bR:† :‚ :†6:‚L:†b:†x,/ʄ[ ȃy       6  &L ,b. 4x6:> F J LPb F.H;X:\[ <<*Ά0,‚$]2~   H X \    $&<*< .0* 460 <$ @2 DF8<;X.H\BP;X\̂Jhb$b_bZ< XH\ BPX"\ &J *h0b 68b >00 7 05(5$w555     eEn ږ PJ ږPJ &P,J. 6g'>g'D Ng'Vg'^g'dPjJ 7w75`\ U 5U@wwN7-@ - w675Z YZg'"&[;*[Y2g'6 556557 7 7 yg' [" "*xZ,Z2xZ4ZB}Jg'Rg'\g'dg'j3Fnzwrwx w w w  w  w` 5 5 ~zw w9x3F 9x$3F*09x43F>9xB3FH3FXP`g'hg'nJpzwvJZ| 5 5   |w J zwJwP g'(g'.J0zw6J8w>J@zwDJFwLPRJTLd5X5M C5? 854~P J HPPe J"e*P0P2Ie6J8Ie>PFJLJN@TP\JbJ2 -5) "5 5 5ww  ERvy PJJy P(J.J0y6P>JDJFyLPRJT p\g'bynl 158( #0, 0 0  - -  [" }"&[Y,[".[Y2[":[">["D[Y L}TZ}d[; Nw̥,  `-m.   ` %7 qPJ"[; &2}:>}H[Y PX[Y hz}R2 w  wee*"9x"9x""> b zaOqDv@Ӎ@CT@CT@Uf@Jy@S@CT@*jL@@Sh@CT@zCT@g'@C @g'@@S@O_@J @v@I;@̫@|~@J(@g@U#@:J@*;@*}@@ ձ+h^  A  VOLATILE REGISTERS AFTER CRASH: PS=%P SP(K)=%P SP(U)=%P AFTER CRASH: PS=%P SP(K)=%P SP(S)=%P SP(U)=%P BEFORE CRASH: PC=%P PS=%P R0=%P R1=%P R2=%P R3=%P R4=%P R5=%P MMR0=%P MMR1=%P MMR2=%P MMR3=%P%20SU S E R%29SU N I B U S M A P%5SI S P A C E%11SD S P A C E%16S%VS%D %8A%5SPDR%7SPAR%11SPDR%7SPAR%16S%VS%D %8A%14SS U P E R V I S O R%25S%VS%D %8A%18SK E R N E L%29S%VS%D %8A KERNEL STACK KERNEL STACK:> > > > > KERNEL PAR'S CLOBBERED%4S%P %P %P %P%14S%VS%D %8A%58S%VS%D %8A%4S%P %P %P %P%20SU S E R%5SI S P A C E%11SD S Px A C E%5SPDR%7SPAR%11SPDR%7SPAR%14SS U P E R V I S O R%18SK E R N E L PROCESSOR %A %VA (FIRST PROCESSOR TO CRASH)<<<>>>>%16SCPU ERR = %P%3SMEM SYS ERR = %P%3SCACHE CTL REG = %P^^5wH% %  ee %\g'vI; v"&S.S4I;:S@SDSLPvrU#`@eeeee5wJ00vATADATADATA  %­^J O_O_C  CT*CT4CT>CTHCTNg'X Z|~`UffpJ(vJ(V eÝ m%e -w 5!R $*}*2J8J@FJPUf\Jyt*jLvCT|!M %   $     0 M Sh<$BV\tzN e7 %Q7 ~ $%+ & & v |& n6*0U#6Q@JU#T&^&hvr&& d& Z P&e e    P&&"&,06@DJTShlrt|~zF  w -5    %]NӍ̫g&Uf06Uf@g'FvJJydvvU#|]  h ^N  0 ` &5%% 0 &f NT5ZU#h> %  C CE e) @%<%8%%$-n5-` %Ýd*;fCTzUf>D m 5  (%ee *}*;CT2b zarD#@\{@ @*}@Sy @:,@;@# z@#""@g'@;T@|~@JX@Ş@ɲ}@y@گ q@ |@h$`;hT(  !ieAe]0} 5 W#tX "*}&Sy ,Ş0Sy F:,J;L;TP\{R|~ZSy ^:,b\{d|~hɲ}l# zpSy vg'*|T w)wT #""گ q#(yb v?zayv?D3@z]@|@@`;@~@~@,W@@~@zc@~@+@H~@JS@S@S@,:@,@گp@ P h .0~,:,:,: ,: ,:,:0~~,@~~+S S"H~$گp&z](zc*|@,`;**%" e^3,WS"Xb wza zwDvL@:2@2M(@ N"&@@:,@;@)p@g'@@@;T@zk@CM@?T@,k@P}@g@ ږ@ @ @گ q@ ~3h^~h~h~hJ+hh eh.H~hShShShn,hگphD   %NCDA -- Error writing analysis file%N > > > > > LIST COUNT EXPIRED%6S%P %VPf&f& 7 :2|f&ff&f7 a 0  ee m  &f BE 5,g$g(,a@:,TgVE E&  ` EEm  D `D E& &$P}(k.,kTxvL|?Tt p&&f e?  f5<   `vL&*?Hg'NRZ` f jnt N"&xCMz)p~)p|    W p   5- &f~  vL:,"?T&2M(. N"&2vL4)p8)p< BJ:,N;P;T\گ qbg'h ږjگ qxh- )b γzazγD*@*@<+Zz@ 3r@+@*f@<+@@d&U@CT@*R@CT@00@d&4&B$Dd&#FJHd&6Fw 1 [ { - ~wd& d&U d&gY*; *jL1 *S[ *" { "*$ &*ww( **df, .*0 2*4- 6xR  9 k  B *";R *,  *p * *p *hz9 *yk  *" $*& (* * ,*y. 0*2B 4*f6\ }  E q ~\ *R}  *L  * * *} *f * E "*kr$q &*x( **w, .*0 2* 466^4e*"6*9g ^ *~*|K*X**_M4 *W"e$*'&(**,*.0*24* X69Z)Vu~9*MZ +f ++s+b^+)+Z V"+X$u&+s(*+2q,.+gr02+K46@=iDu++ = +dZi+#+<+x<+ <+8"D$<+Zz&u(<+*,<+.0<+B24 3r.Z =a SYSTEM COMMON CRASH OCCURRED AT %3Z %Y CURRENT TASK = %2R TCB ADDRESt. 3 Z 3j  3 3H 3r 3;  3q =" 3jE$a& 3M(* 3,. 3 0S = %P CURRENT TASK = NULL TASK CURRENT TASKS%6SPROCESSOR %A: %2R TCB = %P%6SPROCESSOR %A: NULL TASK $SYSID = %j4A $EXSIZ = %P $SYSIZ = %M./%MK $SYUIC = [%O,%O] $STKDP = %P $COMEF: <33-48> %P <49-64> %P $COMEF: <33-48> %P <49-64> %P SYSTEM NAME = %6A $NTUIC = [%O,%O] LOAD DEVICE = %2A%O LBN = %8A FILE SIZE = %D. LOAD DEVICE b= %2A%O LBN = %Q,%P FILE SIZE = %D. SYSTEM HAS STANDARD EXECUTIVE -----------------------------  PRE-GENERATED DISTRIBUTION KIT SYSTEM FEATURE MASK (FIRST WORD) = %P SYSTEM FEATURE MASK (SECOND WORD) = %P Z SYSTEM FEATURE MASK (THIRD WORD) = %P SYSTEM FEATURE MASK (FOURTH WORD) = %P SYSTEM FEATURE MASK (FIFTH WORD) = %P SYSTEM FEATURE MASK (SIXTH WORD) = %P SYSTEM HARDWARE FEATURE MASK (FIRST WORD) = %P%8SBIT SET%14SMEANING%8S-------%14S---R---- POOL STATISTICS POOL SIZE (BYTES) = %M. LARGEST FREE BLOCK (BYTES) = %M. TOTAL FREE BYTES = %M. NUMBER OF FRAGMENTS = %D. MINIMUM BLOCK SIZE (BYTES) = %D. POOL BITMAP (CONSTRUCTED FROM LINKED POOL, BLOCK FREE IF BIT SET): > >J > > > POOL LINK ERROR AT %P -- FWD PTR = %P SIZE = %P%NCDA -- Pool link error found - continuing%N%10SEXT%8S22-BIT EXTENDED MEMORY SUPPORT%10SMUP%8SMULTI-USER PROTECTION SUPPORT%10SEXV%8S20K EXEC SUPPORTED%10SDRV%8SLOADABL00vATADATADATAE DRIVER SUPPORTB%10SPLA%8SPLAS SUPPORT%10SCAL%8SDYNAMIC CHECKPOINT SPACE ALLOCATION%10SPKT%8SPREALLOCATION OF I/O PACKETS%10SEXP%8SEXTEND TASK DIRECTIVE SUPPORTED%10SLSI%8SPROCESSOR IS LSI-11%10SOFF%8SPARENT/OFFSPRING TASKING SUPPORTED%10SFDT%8SFULL DUPLEX :TERMINAL DRIVER%10SX25%8SX.25 COMMUNICATIONS EXEC IS LOADED%10SDYM%8SDYNAMIC MEMORY ALLOCATION SUPPORTED%10SCEX%8SCOMMUNICATIONS EXEC IS LOADED%10SMXT%8SMCR EXIT AFTER EACH COMMAND%10SNLG%8SLOGINS DISABLED%10SDAS%8SKERNEL DATA SPACE SUPPORT%2 10SLIB%8SSUPERVISOR MODE LIBRARY SUPPORT%10SMP%9SMULTIPROCESSOR SUPPORT%10SEVT%8SEVENT TRACE FEATURE%10SACN%8SACCOUNTING  SUPPORTED%10SSDW%8SSHADOW RECORDING SUPPORTED%10SPOL%8SSECONDARY POOL SUPPORTED%10SWND%8SSECONDARY POOL FILE WINDOWS SYST* EM%10SDPR%8SDIRECTIVE PARTITION SYSTEM%10SIRR%8SINSTALL, REQUEST, AND REMOVE TASK SUPPORT%10SGGF%8SGROUP GLOBAL EVENT FLA G SUPPORT%10SRAS%8SRECEIVE/SEND DATA PACKET SUPPORT%10SAHR%8SALTERNATE HEADER REFRESH AREAS SUPPORTED%10SRBN%8SROUND ROBI" N SCHEDULING SUPPORTED%10SSWP%8SEXECUTIVE LEVEL DISK SWAPPING SUPPORTED%10SSTP%8SEVENT FLAG MASK IS IN THE TCB%10SCRA%8SS YSTEM SPONTANEOUSLY CRASHED%10SXCR%8SSYSTEM CRASHED FROM XDT%10SEIS%8SSYSTEM REQUIRES THE EXTENDED INSTRUCTION SET%10SSTM %8SSYSTEM HAS SET SYSTEM TIME DIRECTIVE%10SUDS%8SUSER DATA SPACE%10SPRO%8SPROTO TCBS OUT OF POOL%10SXHR%8SEXTERNAL HEADER SUPPORT%10SAST%8SSYSTEM HAS AST SUPPORT%10S11S%8SRSX-11S SYSTEM%10SCLI%8SMULTIPLE CLI SUPPORT%10STCM%8SSYSTEM HAS TTCOM SUPPORT%10SPMN%8SSYSTEM SUPPORTS POOL MONITORING%10SWAT%8SSYSTEM HAS WATCHDOG TIMER SUPPORT%10SRLK%8SSYSTEM SUPPORTS RMS RECORD LOCKING%10SSHF%8SSYSTEM SUPPORTS SHUFFLER%10SSEC%8SSYSTEM SUPPORTS ENHANCED SECURITY%10SCXD%8SCOMM EXEC HAS BEEN  DEALLOCATED%10SXT%9SSYSTEM IS AN XT SYSTEM%10SERL%8SSYSTEM SUPPORTS ERROR LOGGING%10SPTY%8SSYSTEM SUPPORTS PARITY MEMORY%10SDVN%8SSYSTEM SUPPORTS DECIMAL VERSIONS%10SLCD%8SSYSTEM SUPPORTS LOADABLE CRASH%10SNIM%8SSYSTEM SUPPORTS DELETED TASK IMAGES%10SCHE%8SSYSTEM SUPPORTS DISK DATA CACHING%10SLOG%8SSYSTEM SUPPORTS EXTENDED LOGICAL NAMES%10SNAM%8SSYSTEM SUPPORTS~ NAMED DIRECTORIES%10SFMP%8SSYSTEM SUPPORTS FAST MAP DIRECTIVE%10SDCL%8SDCL IS DEFAULT CLI%10SDDS%8SNAMED DIRECTORY MODE BY DEFAULT%10SACD%8SSYSTEM SUPPORTS ANCILLARY CONTROL DRIVERS%10SNCT%8SSYSTEM HAS NCT SUPPORT%10SLSD%8SSYSTEM HAS LUT SCAvN DISABLED%10SPRO%8SSYSTEM SUPPORTS PROFESSIONAL 3XX SERIES%10SDFB%8SSYSTEM HAS DEFERRED BINDING%10SRTB%8SRUNTIME BINDING%10SODB%8SOVERRIDABLE DEFAULT TO USE DEFERRED BINDING%10SXDJ%8SXDT IS USING KXJ INTERFACE FOR I/O%10SNSY%8SNO LOCAL SYSTEnM DISK%10SNCO%8SNO LOCAL CONSOLE%10SRTK%8SREMOTE TASK SERVICES%10SRDR%8SREMOTE DIRECTORY STORAGE%10SRLG%8SREMOTE LOGICAL SUPPORT%10SLDR%8SREMOTE LOAD/OVERLAYS%10SVTL%8SVIRTUAL TERMINAL LOGONS DISABLED%10SANT%8SAUTOMATIC NETWORK STARTUP BY SAfVE%10SNRT%8SNETWORK REMOTE SYSTEM%10SEXE%8STASK FILE NAMES DEFAULT TO .EXE%10SCMO%8SRESIDENT OVERLAYS DEFAULT TO 512. BYTE ALIGNMENT%10SSLS%8SSYSTEM SUPPORTS SHADOW LOAD SHARING%10SUBM%8SSYSTEM SUPPORTS UNIBUS MEMORY%10SICP%8SSYSTEM USES ICB ^POOL AS PRIMARY BACKUP%10SSWB%8SSYSTEM SUPPORTS SWITCHED BUSSES%10SACK%8SSYSTEM SUPPORTS ALTERNATE CHECKPOINT ALGORITHM%10SABO%8SSYSTEM HAS USED ABORT/FUBAR COMMAND%10S32B%8SSYSTEM HAS 32-BIT LBN SUPPORT%10SUBM%8SSYSTEM HAS UNIBUS MAPPING SUPPVORT%10SEIS%8SSYSTEM HAS EXTENDED INSTRUCTION SET%10SQB%9SSYSTEM HAS A QBUS%10SDSP%8SHARDWARE SUPPORTS DATA SPACE%10SKXJ%8SPROCESSOR TYPE IS KXJ%10SRMT%8SREMOTE SERVICES REQUIRED%10SCIS%8SSYSTEM HAS COMMERCIAL INSTRUCTION SET%10STOY%8SPROCESSNOR HAS A TOY CLOCK%10SKDJ%8SPROCESSOR IS A KDJ11 CPU%10SUME%8SSYSTEM INCLUDES UNIBUS MEMORY%10SBMV%8SSYSTEM SUPPORTS BLOCK MOVE INSTRUCTION%10SXME%8SSYSTEM SUPPORTS EXPANDED MEMORY%10SFPP%8SSYSTEM HAS ENHANCED FLOATING POINT PROCESSOR SUPPORTYF GROUP GLOBAL EVENT FLAGS GROUP NUMBER =%00YDJPTC \bfrCTx|0 T eY  ^e  :e r CTTCT $Y*.CT2>CTDHNRCTVbCThlrvCTz e T e p 5 eC5d CTCT"T.CT8<BFpR 3(X^bfC t*,zߩ0 Fe eCW 7 7 7 7   w 5we`.F |~,08Y&W(|~.]KLJ | v`pwl-k i=fZ baw!\^    6  $5B i64L(4L>O_D4L^]KbP}ng'xO_~i     e  e % L$,264L<DHP4Lt]Kx]teeC e +A5 DeDea eFC$(4+:AR'0s^#0Zhanrx%0g'|,08Y Ceb vDza;}vDDy@sh<}@CT@@@zw@F@@p@U]R@"zd@*@zga@|~@w6 X@sP@w@rh !@3F@hh@t@"(@" L@ S@l@"5@"^@2"N@ l!vhR$vh<)vh6  y TASK DUMP%29STASK DUMP OF %2R%29S-------------------%10S INSTRUCTION SPACE %10S D A T A S P A C E %10S ------------------- %14STCB ADDRESS = %P HEADER ADDRESS = %P > > > > > TASK '%2R' NOT IN MEMORY%4SWINDOW #%D -- TASK VIRTUAL LIMITS %P-%P%4S----------------------------------------------%NCDA -- Task '%2R' not in memory%N%6SPHYSICAL STARTING ADDRESS = %8A%6S------------------------------------%6S------------ THIS TASK HAS NO D-SPACE ---------------%6S > > > SPECIFIED VIRTUAL ADDRESS RANGE NOT IN WINDOW 7 57 U U e*`b|~jn3Fr3FvFzzwe w-- ee5wbe7F3e5,KeJt&3F,3F4poMh #g'h vh&h6 vLhLhzKZh ZhHgh ^h0 grhӍh y\}hp 2Lh\GhϫfhnMhkMhjJhCTh &hB zCThz}hvsh, O`Kh h NhUfhXuXh 'h \{h` *}h" }hxdhDh6g'hkhz$CTh8 h JÅh Jyh ,KhX #h v~hީz}h@ R*}h qhJzh E&ht3{hShyhdxZh zTh4LhTh Sh8OKh N"&hf DphCTh%h8H:dhODLh*}h{hX,Kh^ u~h z\KYhb +{ph xhJLh Nh uLh&Sy hHCThz hN :,hCLhtShxh+{P}h Hah4zHph(D~h cyhShh^ת3hZF~hh -h 2h ;hnvvh WEhshjKQh ӪhTCThz\qh>@hӪhH yh*}hݩ(h: ӪhNJGhyh(hH ѫhh |h(H\}h P\h ѱ-XhzhO h!ThHhKhdhD Nh 3{h hShShbTh z}hzwhShzO Nh 1CTh5sh xh rh"+gh (hN ^hvhRHehh,h",Mhd WhG ght zShohphz}h T.h<h N'h 먓h& Jhf CTh]KhZh J:dh""h* Fh zQ}hFsh h~JbTh g'h lh.h EO hnt!hTTh Cjh\ѫDLhshTz}h Sh.hBzC h. g'hh&4h$ rh hrhShrh rh̫pEh ̫r!h rhl.hxh zձhyfh ,hl hتh`1UhU]RhR©LEhѫO h qh2 cTXhȩshhh,cJXhzD,khO_h تlzhf;Th2ghczdhfh *}hJ h vh|Jh I;hFLTh wheĊh zbThAyh hhL~hqh̫hx xh y"&h& Kh4:}hCMhP 0{Gh8h* hz:DhPhh©Fh4 z}hh Chb|~hzdhv D8h\ DrhL:dhC hJKh RF^hah zh h ̫2h~ Jg'h ѫjheh W|qh RX^hwhIehJ(hK hDFhb H hzt!hzzh2whp h ehت*}hly'h ~h Şh̫` hJWrhyht'hCTh.Lh3Fhzѫ,xh WkrhѫBxh Kqh$u~h> HVNhHh,th˪sh OȒhih ;'yh@D:hh$(hJѫh zih""h< ghhh먫h ͫdh\14fhѫxh ߩ0 h>MhD hxHhsh| hChJ z ږhJhB !h\Eh6}hj Aqh U#hLMsh t[hHh. NhF ̫g'hP5hhL RB9h z@hBxh( Lh[(hR9h Avrh + h1T[h̫shVChVhChP (hϫxdhb""h2zϫdhhGRhn Fh h۪<}hr2h Jwh h:ϫpht1'h  3hJhsh h @wh z ht!ha'h vLhsh@R,:h vkh"h phhFdh` xhxhxhKh:zh|,!hyh Gh^Yh ChL Nh*}h0HhJwhxh "&h yhuLhT CThR z00 | |P   \}ZfMMMSMTDY Kvv@8"Ʋp&fz*ձ+.v2گK6;W:Z>ZBZ@FH!vLN)vRT$vXZd^`vdP>@  @v <KDp  " &(@j,.K24K8:K>@@8DFyJLpZZ Z`;4   :wN N t <&t t * <&ex x  v v P         t<       <&%t         H H &J J     N  SY  a  SY  sy  SYu~  먫  D~" " 먓( ( s. . q4 4 $CT: : $u~@ @ >MF F CL L CR R CKX X D8^ ^ DFd d F~j j GRp p G gv v HCT| | H\}  J   J  Jg'  JK  JbT  Jw  Jy  Jz  JÅ  JL  Ms  P\  eĊ  e  i  r  x  x  x  vv  yf    a'  2  s  N  *}$ $ Bx* * C 0 0 ©F6 6 ݩ(< < ީz}B B NH H N N CTT T ,KZ Z ,K` ` ,Mf f 6}l l y\}r r zdx x s~ ~ -  ~  ˪s  #  Hg    Aq  Avr  Ay  Fs  KQ  KZ  O_  O`K  OK  O N  RB9  R9  R,:  RR;  RS  T  TT  Tz}  W|q  @w  2  4& & "", , ^2 2 &8 8 ""> > &D D (J J (P P uLV V kM\ \ db b Jh h ,n n tt t ̫z z ̫2  ̫r!  ̫pE  ѫO   ѫ,x  ѫBx  ѫx  ѫh  ѫ  Z  f  z}  F  xZ    LT  5s  Ӎ  Y  lh.  +{p  +{P}  0{G3{  3{l.uX+g""uL((..""44%::CT@@xdFF$(LL:DRRCXXCj^00vATADATADATA^CddD:jjEO ppE&vvH ||HH:dHHH;JJJ(JGJ:dJwJLL NLcccJXcTXczdcyiiz}r  rrrr$$|**CT00K66K<<sBBHHNNTT{ZZG``KffkMllwrrz}xx~~[((yz}t!xxxxDr©LEȩsߩ0    y z}T+ ,!1U1'1CT1T[14f  7&&8,,*}2288T.>>.DDӪJJӪPPӪVVת3\\تbbتlzhhت*}nn۪<}ttzz qsQ}~B !CCLFK L:dODLOȒRX^RF^R*}WWEWkrWrx@  t!*}""((..44S::\q@@FF̫` LL̫g'RR̫sXXͫd^^ϫxdddϫdjjϫfppϫpvvѫ4||ѫDLѫjSSSSS2g*}Mt[q,tbTgr5hh Nh}v~oM   3HeHVN$$Hp**H00Ha66<<;'yBBI;HHU#NNU]RTTUfZZSh``Shyffsllorr^xxb v@zaz}v@D#g'@y@s<}@T@$X@l @F@@ձ@|~@Ş@#@*t@  hz<Khd e ACTIVE TASKS SYSTEM TASK DIRECTORY (PRIMARY POOL) SYSTEM TASK DIRECTORY (SECONDARY POOL) ydd 7 tV%@@&7 e%t#g' |~l #g' "|~(y.F2:ձ>@F@LձRձXŞbŞhձttxձ|7 e%5e5 e5 & dձձŞ Ş&ձ2ձ6ձ@#g'Fs<}L#R\$X`tl#g't|TD\ :U  e  .:|~#g'y$.$X2t:bb 00g'F pJYZN "&R\EV2Llѱ-Xvvk~]c  e # 0p YV SP   $ &e0J ]ѱ-X&\E,)sE0)sE4e;::}@`;F:}\\En)Wr~tp /, )&  & & & & & & & & & Ε E@U > p  e)sE)sE e;:}`;:}(ѱ-XH:tTg'Zg'^ [" b [" f>p:}t)W xsz)W q )WqFb vza|vD<&`@2L@<&Kq@ N"&@`@[8@Dp@@ѱ-X@g'@)P@@zD,k@ w@y"&@:t@[Z@)W@)p@t'@sگ qBt'FeL2LX^v w|Dpe e< e<Pefh5G5? 9feXDp&.2D,kf6D,kh:Bg'Jg'P N"&T)Ph)p|)W[8 e!e 5f 2 eA  E  50 & & | [8[8 [Z[8 &`,<&Kq<&` 8sb v?zXv?Ds@#w@:2@ N"&@`@O @t!@$9@y@ "&@ s[dh,:hb ?SY f| CDA -- Exiting due to illegal trap - Snapshot dump being attempted.& O t!hs||eG& & & & e %<)& & &  D& & & Ε (D$9Fshz:2  w& N"& ` "&`#wyb <zH<D`@tS@!T@bT@g'@e@y"&@|@)W@쩔@ vfzhn  %NCDA -- Symbol file %X has illegal format%N%NCDA -- Symbol %2R not defined in symbol file%N5 7 7 Q$%fg'vbT7   %J w   D &X1-LtS e|쩔4<쩔FV`bdfhjlpr+-(̵ %$ #-@ %$%%  = 8bTBbTP!TVy"&Z``dy"&)W l=b vz:vDs@$9k@n^@:br@:}@$9!@$9!@vk@ p@ ]hR7FhF  I%NCDA -- Error reading crash dump%N%NCDA -- Device driver missing%NXFbFm f5 f%$ ŝť ťť H pvkvk :br"n^.s4$<:}D$9kJ$9!P$9!Vxb z&:D)sE@)2H@ձ@:}@)W@)Ps@$9!@`;@ "&@ nwLh" %%NCDA -- Error reading file %X%N"P"&0 0  e 00) > > > > ADDRESS OUT OF RANGE&x&&f5      e  e^  A  `g'wLѱ-X :&7F,:,6:@DŞJձPձTձb2Ll\Gpt'^b r.`D}@)p@y"&@)W@)Ps@$9!@ eh*|h,쩔hp ,%NCDA -- Error reading symbol file %X%N,X,   e 77 & U2y"&}"$9!$)Ps.)W2:)p@)pb vr."vD;T@uX@nH@?T@i@u@u@@ ,h %6<%2A%O:%4>NONE f&f&&  !eeCeCe eC`E :$;T4 :DnHNuXu`iduXx|;T|e ?T ;Tb س2.WسD H,'h$  4F.q"|(+N0swbrt  ' r q! +s2#p G@$s|pra  s s. @vrtBy Fy@yPw`-tpx!28& z1q&R H---T .(.0.8@6HWyPWXbY`{fI  ؙ:b vJ.HvD@nH@iw@ F,Wh J   5 ee iw.nH>b tz.tDsh<}@dhzd@wh@mh@sh@nhH@sh@rh !@hh@lh8Y@ah @shҒ@:phq@phr@shU<@th@ @,zdh" D&fCe nlh8YphqnhH nhH shmhrh !shU<whshҒdhzdthsh<}sh phr"ah $hh0b B.D\KY@ X,yh/ h \ff  ff  C5 e `\KYb v~zLNSv~DBsh<}@l6p@f@s<}@@:,@T'@@p@O_@w*@z@zga@,@w6 X@sP@@TS@rh !@ly@#@" L@S@Bx@l@@@@Bop&@"^@%@n6VN@@ h )?%4SLOGICAL UNIT TABLE:%4S# DEV WINDOW W.CTL W.FCB F.FNUM F.FSEQ F.STAT NAC NLCK%4S- --- --  )?|---- ----- ----- ------ ------ ------ --- ----%4S%D %5A%P %P %P %P %P %P %D. %D.%4S%D %5A%P %P %P  %P %P %P %D. %D.%4S%D %5A%P%4S%D %5A%P%4S%D %5A%P %P %P%4S%D %5A%P %P %P > > > > > ACP OUT OF MEMORY ORt NOT IN EXECUTION%N > > > > > REDIRECTED DEVICES FORM A LOOP FROM UCB AT %P.fCe9%e)oXn6VNltx)~oCe P eE (%  A T 7 e &fz&@Ce   l6p,FTbthlCe  efw wdCeE%ICeµB-? (:,,:,06:,DJSw*%flyz NSw*z V\TST' bO_R :ee%.-'  eeeee  "Bx.O_4@vL  &eE001vATADATADATAe5=7 eeee5"e5 J @*s<}4#@op&LsPTp^sh<}hganrh !x|l>3 e2m*3 3 e   " w6 X" L"^ lb z|KSDoM@&@xd@J@JÅ@,K@S@,K@JL@%@@WE@zHa@Hp@2@P\@H@He@z}@@@x@,M@W@z}@J:d@@z4@̫pE@x@ت@©LE@@تlz@;T@2g@q@x@|~@RF^@RX^@H @z̫` @HVN@,t@i@OȒ@ͫd@H@J@Ms@H@@[(@Avr@+ @̫s@z۪<}@ 3@""@ @Jw@t!@@w@@K@H@y@CT@t@ Xht  X""% xdH HHVNHa He$Hp(H,H0H4J8J:dnxW,"   4S%BPw  1S%PB   ` 2;T>;Tb vBQdvD@ H Sh Sh (o(%4S%8A %4P !%R %R %R %R!!%8E!%6S%P %4P !%R %R %R %R!!%8E!%23S[ABOVE LINE REPEATED %D. TIMES]fwd7 \&fVT7RwPEHE@7 R7 P7 NE,(& D j 2  7!w!7hw  f eD 7 R$   $,JN7 7  &ff NJeDB@ Pp p( L% ,& o T(^LvzoD w` rew  7 (b zSSDUf@R*}@@*}@*}@bT@|~@ت*}@*}@ 8h ~HNYi MULTIPROCESSOR TABLES%30SPROCESSOR%18SA%18SA%10SB%18SA%10SB%10SC%18SA%10SB%10SC%10SF*}ت*}R*} *} *}bT~H N"Y$i|D%6S%2R%4S%P%6S%2R%4S%P%5S%P%6S%2R%4S%P%5S%P%5S%P%6S%2R%4S%P%5S%P%5S%P%5S%P "e:  A,VUf^"`|~hl:rvUf|DeD%  A " $Uf2Uf8>b ZiT]Dn^@]@Kq@:By@vk@ .:h 2& 5 fw&vk:Byn^Kq*Kq0]db (zdS(009<@BН$НН6Н(" gL i*:HDLNnhHv1 &P   |  e  7! e e H &P/ *|48@lh.L\bf,lVb v~:,e`v~D G\}\}hbb ưrf2ưDvL@Dp@@@?T@|~@ @ @ L@~h %F CRASH DUMP ANALYZER V %Y %2Z PAGE %D%NCDA -- Analysis terminated after %D. pages%N > > >.| > > ANALYSIS TERMINATED AFTER %D. PAGESf( 7 e- u p 0(4M@Aq@C@B !@6}@t[@H@s@@ N@5@@RB9@zBx@L@̫g'@R9@+ @1T[@ϫxd@ϫp@C@ϫd@(@GR@1'@C@F@z @2@ 3@s@@w@t!@a'@s@R,:@C@d@x@x@x@@zx@L N@H@Jw@G@*}@uL@CT@RR;@kM@CK@c@RS@c@H;@2ѫ4@7@iz}@ h> .먫u~D~ GR TeĊZ(CCCKѫBxW|q ,"ȩs$~&+ (J **},+g.*5s->M ת3    y z}CLC$($u~ i"iz}$C&6}(©F*C ,x.Txxx t! CTRSDFG gAqsF:Dߩ0 ީz} ݩ("zd$5&#(q*RB9,.~ NTTT Ay ~Q}.grLTz}RR;O NR9R,: Fs"O`K$OK&J(""*uL,d.kM czd cccTXcJXcy8\q^ """G${&K(w*kM,z}.*} N h N hhFϫprrrrrr K"JG$Jw&Jz(J*JK,.x@ ϫd ϫxdϫfyf$CTCTs( &|CT 2" $a'&(s*s,.&s qL vv ѫ4ѫBx먓fxZCK KZMS S"S$S&S(t[*7,.PiL Ny\} LT }HCT1CT14f1U1T[̫r!̫g'̫2 Wr"H:d$Ӫ&Ӫ(Ӫ*,Dr.z1'Wkr*} *} R*}ت*}bTJbTJg'J(B !(L:dODL "ѫDL$&uX(uL*ѫj,Cj SYSTEM COMMON DUMP ADDR LABEL VALUE ADDR LABEL VALUE ADDR LABEL VAPT.D8F~ H\} ˪sH HHH;RF^RX^v~ѫx LUE%P %2R %P%10S%P %2R %P%10S%P %2R %P%7S%2R %P%17S%2R %P%17S%2R %P%P %2R %P%10S%P %2R %P%7S%2R %P%17S%2R %P%P %2R %P% 7S%2R %PH$}fH $ }f0u~먫uX +g D~먓uLsqCT$CT$u~ $(":D$>M&C(C*C,CK.Cj.CD8DF F~ GRG gH HHVNHCTHaH:dHeHp H\}"H$H;&H(J *J,Jg'2J(JGJK JbTJwJzLL NLP\cc cJX"cTX$czd&cy(eĊ*i,i.iz}0r0Lrrr r rvvyf|CT Ka'2 s"s$&({*G,K.kM0x Nw*} z} Bx(C t!xxx x"Dr$©F&ȩs(ݩ(*ީz},ߩ0 . N2CT   y z}T+ ,K,K,M1U 1'"1CT$1T[&14f(6}*7,8.*}0y\}4zd s -T..~˪sӪӪӪת3ت*} #"Hg&(,00I GFL FMP CTC MUT LDD PRO PRV DSP SNC<D, l'llTlK$lf*lf0l6lxzz%2S%2R%2S------%4STCB ADDRESS = %P%5SPAR = %2R%5SPCB ADDRESS = %P%4SLOAD ADDRESS = %P00%5SLOAD DEVICE = %6A LBN = %8A%4SLOAD ADDRESS = %P%5SLOAD DEVICE = %6A LBN = %8A%4SLOAD ADDRESS = %P%5SLOAD DEVICE = %6A TrASK INDEX = %P IMAGE INDEX = %P%4SPRI = %D.%5SI/O COUNT = %D.%5SUIC = [%O,%O]%5STI = %6A%4SMAX SIZE = %P%5SEVENT FLAGS = <1-16> %P <17-32> %P%4SCOMMON PCB VECTOR%4ST.STAT:%2S%P%2S%4A %4A %4A %4A %4A %4A 00QvATADATADATA%4A %4A %4A%4A %4A %4A %4A %4A %4A %4Aj%4ST.ST2:%3S%P%2S%4A %4A %4A %4A %4A %4A %4A %4A %4A%4A %4A %4A %4A %4A %4A %4A%4SPRE-AST STATUS:%2S%4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A%4ST.ST3:%3S%P%2S%4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A%b4ST.ST4:%3S%P%2S%4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A%4STCB DUMP:%6SRECEIVE QUEUE%6S-------------%6SRECEIVE BLOCK ADDRESS = %P TASK NAME = %2R%6SCOMMAND LINE INPUT BUFFER ADDRESS = %P UCB = %P%6SAST QUEUE%6S---Z------%6SAST BLOCK ADDRESS = %P A.CBL = %P%6SA.BYT = %P A.AST = %P A.NPR = %P%6SRECEIVE BY REFERENCE QUEUE%6S--------------------------%6SRRQ ADDRESS = %P SENDER TCB = %P%6SEVENT FLAG MASK = %P EVENT FLAG MASK ADDR = %P%6STASKR = %2R%6SREGION ID OF RECEIVER = %P OFFSET IN PARTITION = %P%6SLENGTH TO MAP = %P ACCESS RIGHTS = %P%12S<<<<<>>>>>%6SMCR COMMAND BLOCKS%6S------------------%6SBUFFER ADDRESS = %P TCB = %P%6S%6A: %VAJ%6S%VA%6S > > > > > UNKNOWN AST TYPE%6SUNSOLICITED CHARACTER AST%6SFLOATING POINT AST%6SRECEIVE DATA AST%6SRECEIVE BY REFERENCE AST%6SPARITY ERROR AST%6SREQUESTED EXIT AST%6SPOWER FAIL AST%6SCLI COMMAND ARRIVAL AST%6SBUFFERED I/O AST%6BSOFFSPRING TASK EXIT AST%6SSEGMENTED BUFFERED I/O COMPLETION AST%6STASK FORCE T-BIT TRAP AST%6SDELAYED I/O COMPLETION AST%6SGROUP GLOBAL RUN DOWN AST%6SEMIT STATUS AST%6SCOMPLETION AST FROM: QIO$, MRKT$, SPWN$, CNCT$, OR CINT$%6SSPECIFIED AS: T FROM: SFPA$, SRDA$, SRRA$, SPEA$, SREA$, OR SPFA$%6SEXIT EVENT FLAG (O.EFN) = %P%6SPARENT TASK NAME = %2R%6SMCR COMMAND LINE ADDRESS = %P%6SPARENT TASK HAS EXITED%6SOCB DUMP:%4S---------%4SOCB LIST: > > > > > REDIRECTED DEVICES FORM A LOO2 P FROM UCB AT %P.f&f" 7 e5UCe"Q$"~ "| e# Fs(LDZnH e$WU e$KU  e$|U H5 Cee(JPV^#g'dppznhH* e  Cee5-e $e e ee` Xp&sh<},ga8rh !BLhhTrh !hh Zjw6 Xr"^z  Ce f%F%B&Ce  Ce  efw Blp,$oM, 3:L^j:,n:,r x:," B B eeFe  % CeCeCeRoM 3$t(F,i8t(F 4FDJsR8V/ Zk`dL jyNy pt/ x~ Ce  Ce a  C5Dm    @efs(/ $sP,0/ 4a:>Dl.NC Vd&^^ojn t ~,b8Y% e % ee n  ee  eF#g'&Shy2D%b'LPn V\3b<}l rx-b  e   effew7 5Ce5r ^  0bz}  $ *,b. 4>r<R*dfTCT\s(dD|Zjx~ e~^ r3  Oee58  j6 z    ~PV00YrRX,.`f,.nt,.|YRrKdD,V=@H6[ :/,(!^,. L ,.",.*0,.8,><.F@L,b.T[bh Lpv<.~v e +  eee EmD%0g',08Y",b.*8+ >,.DJ `T y^ ffw f5\eVe IEe ee0C $d&e*r|q6<DPflnK eeY ee 5  (K.Y4Lvzxf&feK >E e̕ %̥  W!PP K>,,6;h;b v?z~}v?D@ @L @3@s@,@/ @w@u@ @@Ny@*pq@y@ H,yh  AST DST-CHK SEF HLT ABO STP SPN WFR%7STASK TCB ADR TI T.PRI STATE BITS (T.ST2)%7S---- -8L    w3"(y.Ny4|------ -- ----- ------------------%6S%2R %P %6A %D. %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4AP8p&fe ee  08 pu&,,pq6s<@/ Db vzSvD"Bx@@U]R@"zd@"t @nhH@"Z@w6 X@;x@"(@" L@"5@2"M@"^@"N@ bh` %4SWINDOW BLOCKS:%5SPAR VIRT LIMITS ATT DESC WND SIZE OFFSET 1ST PDR NO. LAST PDR%5S--- ----------- ---|----- -------- ------ ------- --- --------%4S%2R %P %P %P %P %P %P %D %P%5SPAR VIRT LIMITS ATT DESC WND SIZE OFFSET%5S--- ----------- -------- -------- ------%4S%2R %P %P %P %P %PfeCvCtw6 Xtr%ee% `BCe2E`5>Ce  e<"(U]R.4`:@FLBR"(n"zd~nhHveCeCeCeCeCeCeeCeCee >"N"5("t 2"Bx<"^F"(P;xX"Zb"Ml" Lb v~ZlSv~D@4@@wh@lh8Y@ ^h %6SWAIT QUEUE:P&feeCe  e( wh (,2B4Flh8Y<b @za@D%'@xZ@u~@@!y@,.@f@d;@|~@4@2`m@DF@2nH@58@4H:@ H@jh~  CLOCK QUEUE%6SADDRESS = %P REQUEST TYPE = %D TCB = %P TASK = %2R%6SADDRESS = %P REQUEST TYPE = %D%6STIME RE|QUEST BECOMES DUE = %5Z%6SC.AST = %P C.SRC = %P C.DST = %P EVENT FLAG = %D.%6SC.RSI = %P%P C.UIC = %P%6SC.UIC} = %P%6SC.SUB = %P C.AR5 = %P%12S<<<<<< INVALID REQUEST TYPE >>>>>>%12S<<<<<>>>>>rrI Ar= ePMťťe X%00avATADATADATAee J  DF |~.r6>2`mHMZ4jnHz & Ee f&f&e eB e8 ,. (DxZ\u~dfn4H:jA eA < eA < ePr f&f%eeee0d;d;$d;6f>rDf58p!yfe % etA   5 eA 2%' t(.28VZA`b za"D@#s!@g'@g'@#u~@|~@ S@t @2@ گKh n t ""e$$`r`r``l[1,6]  lx x""` SY22 ERROR LOG BUFFERS%6SBUFFER ADDRESS = %P00 ENTRY TYPE CODE = %P%3SENTRY TYPE SUBCODE = %P%6STIME = %Y %3Z%12S<<<<<>>>>>%12S>>>>>UNABLE TO CREATE ERROR.TMP IN THE CURRENT DIRECTORY>>>>>%12S>>>>>Warning: ERROR.TMP cannot be created in [1,6]>>>>>%NCDA -- ERROR.TMP cannot be created in [1,6]%N5 5 ng'xg'P K||@ D D D D D D eD   @eD  :2 2|~"F#s!N#s!^dl`eEBaD CB e  f&feD eD  S 8#u~Rb zaDNQ@G@@N@;@,y@nOH@sO@N6@kOp@N@(IHg@znH@nOH@|~@G]f@Gx@dO@GQ@/Ip&@G^@L N@Gxw@3I@GS@G@ .Kh Q6^xwQS]fx CONTROLLER INFORMATION%4S%2A%4S--%6SCTB ADDRESS = %P JNNQ NN6G^GxwG"GQ&GS*G]f.G2Gx| L.DCB = %P%6SL.STS: %R %R %R %R %R %R %R %R%6SCONTROLLER TABLE BLOCK:%6SDEVICES INTERFACED BY THIS CONTROLLER:%6SCOMMON INTERRUPT ADDRESS = %P%8SDCB DEVICE NAME%8S--- -----------%6S%P%8S%2A%6SKRB ADDRESS = %P%6SK.STS: %R %R %Rt %R %R %R %R %R%6SCONTROLLER REQUEST BLOCK:%12S> > > > > LINK ERROR AT %P, FORWARD POINTER = %P%&@PHjL Np@r|~~L N4 4,0(  \eC  CeY` Cef Ce< 44JnOHP;T;XY^`dldOtfzl  Cee EC5eef Ce51Ce *CZsO ,y&nOH,kOp <NN\bhsOnN6vdO * 6,C) &eA*Ce eH$*,6BnHJ;N;RAZ`*hdOvnH~;dAefCee =89C3 M e a J; AnOH&kOp28LMRV3I\`,ydajnRe eC` ee %5   $/Ip&(IHg(BFLb zaFDv@CT@@:,@y@g'@@v@|~@y@ e@*;@" ,vhBvh^  KERNEL INSTRUCTION SPACE DUMP KERNEL DATA SPACE DUMP%6S%P %4P !%R %R %R %R!!%8E!%23S[ABOVE LINE REPEATED %D. TIMES]%12SVIRTUAL ADDRESS: %P PHYSICAL ADDRESS: %8A > > > > > INVALID ADDRESS RANGE WITH STANDEARD MAPPING%NCDA -- Invalid address range with standard mappingBB 00inByFyRg'^fj  B  L7 D 7 >  0 ,&fe AP P &  d R&@tx: Y-7 f&7 R$   3- t{ !f Y&*jr{xzR RS Ye (7 "&f eeF:, :,.2Y::,N:,\ edhp B  L7 D 7 >  0 ,&fe AP P &  d R&@tx: Y-7 f&7 R$   3- t{ <0b ./@;Xknv!:_MSYa#$S$"$;$sw%&$:)i)t)q)|-wH-xH/|3U<3<}34Ҟ=X`|'``|'`|'%`|'`|'n`|'p&`|'0M`|'Q`|'x`|'Oy`|'c}`~:Q` L!` Lf9` Lf`NQ`fO `hO`lOp!`lOY`nOK`sOP<`tO `lz {\q { { { {@ { {!{ N`#{Z`#{`%{^`&{``&{Z`,{Y`-{` `.{"`0{``3{P<`4{@``""ꨤ``:`:PE:dPi% i &`ixP<}`_```k`©H"`©2`vLP*P,vLP6?&`6@&`V}`}`Q`ɪp: (:PR!PR:PU~PvLPX``ȫv`ΫOq"&`````<@`qQW svPvOqb zDaHi &@@@#w@s@@!H k@<&Kq@H:Hz|'%@`@-xHH=X@|'c}@ɪp:@-wHH#$SH:@}s@_@`@6?&@,vL@6@&@z3H.{"@NQ@'@SH# z@#""@#{@@)iH)tH$swH<&9@@Q@z,{Y@|'0M@h'@)qH)|Hu@|'@:@|'`@$"HU~@|'n@|'p&@4ҞH$;H z}@?S@"&@&$:H_MH@F@|'x@=@YH(:@nH=@|'Oy@!{ N@[(}@z@~:Q@%H0ȫv@©H"@|'Q@<}@©2@ @|'@<&D@vH|' @y@3U|'Q@kF|'xHkJoN|'c}-LVBhSP6k kh|'OykQ":( '<&9<&Kq<&D 7 : CMP> :  0 differences found No differences found/ @\B  W# Q&&& 0 |ȫv #w <}"&"&B}s"'(h'.# z0<}4NQ6}&:~:Q<6?&&@=XB6@&&FȫvJXXX0 0  7 f& & Af?A`e  P!t0 b `Aw fh,{Y#{ .{"!{ NX©H"©24sR:XQ\|'0M|'n|' ^k b<@tj?S hfp -    ` BJ  ʕ=: : w4l <@=&<@.<@4<@8<@<<@T<@X<@^6?&b_h(:n6@&r`x(:DP  w ȕf  D  $<@ ,<@8u<=Zg@) -- Illegal switch or switch value @  % ww 6eB eB&wB$&< n F Zg@[(}"& Zg@& 0<@<<@F}R"&Z}&b}f}Br|' x}s~'  # h'Zg@&&& -- Open failure on output file @2 & &" w 8 F Zg@&[(}"& Zg@&& .QZg@HH -- Illegal /LI value @BhB H H w  5E5 Ew F Zg@H[(}"& Zg@H& .<&Kq6<&D><&Kq<&D J<@NU~R|'TkZ|'n\k`|'xbk65E7 E 8 ||'|'n|'0M|'Oy k |'%|'c}|'Q  k|'`|'p& ki &ɪp: i &&# z(<},"&0}8v5 2 &     ɥ= f |}|'x k <@U~ $<@(: .<@: @XD,vLHL,vL P<@\ `<@l<@p<@>J 8 5    wRU~ #"" <}}|'Oyk":(`,6?&0`46@&8`Zg@`` -- Command syntax error% @< ` ` w wB F Zg@`[(}"& Zg@`& ."&2`6<}:yhb ϳzqQWϳD@i &@k@,vL@E:d@fO @0{`@#{@Q@-{` @V}@U~@z|'n@:@4{@`@ix@ L!@vL@|'x@!{ N@@nOK@lOY@ΫOq@R:@|'@X@B#{Z@ @  ɪp:h<@i%hZg@2 Zg@6************************************************** <@ @`w 7   A 5f  |ΫOq <@XvLixvL"ix&X*#{.2#{6E:d<|'>kHR:N L!PfO V L!XfO j\0D qBCr r &  rŝ~<@X #{0{`#{ZvL#{ 0{`$!{ N*4{@`.#{2E:d80{`BvLV#{X-{` \-{` `<@dQr &  r3  5 2  2 w|XvLvLE:d <@$-{` (#{,!{ N0-{` 4#{>i &B|'DkJR4{@`VR:Z-{` `nOKh#{h0 5!2  2  T 5I~nOKR:|'nkX Zg@"U~&,vL*4{00|n$9!H%{^L.{"RnOKX4{@`^,{Yb,{YdlOYh.{"l {^p5 5 W 5  |we~)p)p|'`k|'p&k$p&* {0<@4|'%|'Q|'c} 6k <<@D<@ J<@R<@Z<@` hOZg@2 -- Too many differences for available core @\  . w3auqss  5| F Zg@[(}"& Zg@)p")p& *"". {2,{Y6,{Y8lOYkD {J:\ {blOp!ftO lV}xV}X B` ʠ   & cc ԕ 5 Эȋ @ A! <f w <8|'x:k@ {DlOp!JNV}bV}lV}rV}|ΫOqC  3w 1 ee w   w 5|©2 4{@` {sOP<nOK LffO $(4{@`0ΫOq4lOp!6lOp!>lOp!DtO HtO \ΫOqb<@ n 5z|'%|kP; D АP 9 А&e  5; 5ӕ 5 & <<@ .<@ B 5N|'%Pk\|'Q^kn|'c}pk,    Е6$ {( {Zg@rr %1A) %2A%Q:%VA%X @|w eee%ĝĝSe r f Fw EvΫOq <@&{Z&{`)W$)W(6?&.28<H)WRV} VZg@r Z<@^?TdV}nΫOqx {l 6w  0Е &ȕf  C?##5#e\©2 {ΫOq: {6k>lzJuN=h6?&n6@&t6@&z6?&~)Wl1 1111ee e  T6@&)' <)W@)TyD)'H|' J)LN}sT' qV)00vATADATADATAZh'h6?&Zg@( -- Open failure on input file #1 @P,P  $ wF F Zg@[(}"& Zg@)p")p& *""Zg@( -- Open failure on input file #2 @xTx  $ w fpp n F Zg@[(}"& Zg@)p")p& *"".})P 8}>)pD)pH Zg@$ -- Error writing output file @,   w> F Zg@[(}"& Zg@)p")p& *""tb OHz<@OHD<&@p@|'%H&{`H|'c}H@ LfH%{^Hk@&{ZH.{"H fO H0{`Hz#{H$sw@,{YH-{` H |'0MHtO HlOp!H<&e@|'H|'`H|'nH|'p&H4{@`H Lf9H L!HzhOH|'xH3{P >k$sw & <&e" "k$sw  kQSY SY%  12"22D'D2(22 D 2D\\  b OYzvOqOYD {H {H {H {\qH {H {@H {H @  ΫOqh<@Zg@  @$&f&f kQSY SY%  12"22D'D2(22 D 2D\\  b OYzvOqOYD<0b 1 %JF >x:%(  (},0 ,VN,f,y,'_Me\/l,lll""ly:lt^lN`ll "%"p,"F `,"<`,"`,"%`," &`,"'`,")`,"'9`,",:`,"T`,"oY`,"Y`,"Lq`,"x`,"z`,".`,">`&p2:p::E\};F v_M"&QKqQ:d\zggg'gYgYgYg^g_grgxgLygTympTq8^Lw@Qw`'y\}yk~M~K>䒲'Ty,v2gZگ2gگr`گyy$Wv`;jw2gwy shXEwމ $ <Z-aust !T}!,00nh,yhLw@Qhh}hگ2ghhush2hZh:d\zh"yhTyhzhzyhZh w`'h-ahhމh2ghKhh:p:hmph ~hw2ghTq8^h,vhz_M"&hk~Mh;F vh $Whگyhh e\/hx:hwyh䒲'h:h%(h$F >h sh(}hy  &  & @,TTj"w$G g&e(r#*,7&.;F4 0zT2[M4#{6}8̫d:髲t ?<&<<>>zzXX%r!%  &$y@_MLBb z,D @,"<@l6p@,y@,">@,".@@GP}@گ2g@@gY@gY@z@gY@us@g@g@:d\z@Z@Ty@gr@@Z@g'@$9f@@,@z,VN@,"x@@nH@,"'9@,"F @~@0# @g^@'@,",:@rh !@,"z@d@y@gx@zg_@hh@@k~M@;F v@$W@گy@@@gLy@gTy@%(@,"Y@ s@(}@Zs@ NEwhp̫e y\}h,fhE\}h2 TT  7> e7 be7 X,VN%(.%(4 s8>@N,"'9Pگ2gVگ2gZ:d\z d t̫e x:d\z|0# j|e7 H5e=5 7 /55 5#e,"zگ2gگ2g:d\zgx:d\z ,"x"گ2g(گ2g.%(>$9f@D:d\zJL,yRg_T:d\zZg^\:d\zb,"Ydگ2gH7 5 ^5 5 E5U7 گ2g:d\zggTygY :d\zggrgLy :d\z&g'gY (:d\z.'0,y4g'6:d\z<'>,yDs&N AW,VT  q E5(B e%7 .CO|7 z 5|Nk~MnHs$~.s4,6,y:<,yBF(}Ld@yR,"<Tگ2gZگ2g`گybگ2gh:d\z|~,yf555 & 5 5 5U 5TT7 gTy :d\zگyگ2ggY:d\zgTy :d\z,g.:d\z46,y@B,yH,J,yRT,y\`Zd00nXگ2g^,".`گ2gfگ2gxeTT7 ~ P&B5 5 E,">گ2g گ2g &*~2;F v6hh;F vFl6p,VN J;F vN(}X^'`,ynگ2grt,y F,"F گ2g p ,VN$WB 8-CO1-NL--VT)5$C 5 &B| pZ ",",:$گ2g(08@RV~^;F vbhhhrh !j;F vrl6p,VN v;F vp|eUe%57 7 7 5 75   P-گ2g,yگ2gگ2g"g$:d\z*Ty.Ty2Ty6gr8:d\z>usDTy HTyNgLyP:d\zVZTyn%( 7a   %( COLOG  ̫e =0/gx :d\z0 COTERM:  ̫e DD  NOCOTERM    ̫e  gY:d\z  LOGFILE  ̫e $$ffNOLOGFILE  ̫e ( (gY:d\z ((ON   ( (̫e 0 0.g_ggg' :d\z ++OFF   + +̫e 8.8@ʄ=TĂcg^gYgY :d\z @gTy:d\zTg:d\z" $gY&:d\z( ,  ̫e bDb:=r~*| rg:d\z  ~ "& ( .2 4 :*<@ BgYbĀ:[.],.]Ā].].;"D:d\z $26>DJP Z"//NL / /̫e  L7 -UUD"*2gr4:d\z:gLy<:d\z@Husvb z,D @l6p@>@,y@hX@Lw@Q@@گ2g@@gY@:d\z@@zy@@w`'@-a@,@2g@K@,VN@mp@~@w2g@rh !@hh@_M@k~M@r;F v@گy@v`;@:@Ew@F >@,"Lq@ s@(}@6@گr@  $ h( `8&B % 7 7  K F >8~;F v"hh(rh !*;F v2l6p,VN 4>8;F v>v`;BگyDگ2gJگrN2gRw2gVZ s~\    7  l55 Dm w$~w`'w`'$w`'( s.8:,y@~D HJ,yP(}XLw@Q\-a`Lw@Qdyj2gpw2gv  4 * e w w  5?5;553 z2g w2gEw(~0mp62g<:@mpFw2gPhX\^,yd,f,yl_Mn,ytgYv:d\z|(}R 5 Aue  7 wf %  V*,"Lq,گ2g2گ2gJ6Nw2gRZw2g`hگyjگ2gpگrtxk~M|~D0(}> b tXz,""tXD[X@,y@@گ2g@@""f@Z@@Ty@r@Z@,@z?T@[@00vATADATADATA)W@_M"&@_M@[W@گy@)Ps@ ,"<h5,"'h,".h,">h گrh,")hj,"h,"xh,"Th],"'9hp,"F h,",:h,"zh,"oYh,"Lqh,"Yh6,"%h," &h pp%NConsole = %I%NLogfile = %INone%I%2A%B:%I%2A%B:%VA%X%ILogfile OPEN error Logfile CLOSE error Logfile WRITE error )LUN assignment to console terminal failedIllegal console terminal&Console driver not loaded, COT exiting#Max writeh errors, disabling logfile3Not logging on a terminal or to a file, COT exitingBUnable to redirect CO: to a terminal - CO: is offline, COT exiting Syntax error+Will attempt console LUN assignment to TT0:8Illegal command - Console logging has no`t been turned onEInternal error, command ignored - TI: is a VT marked for deallocation-Will attempt console LUN assignment to %2A%O:”    e-  :P5^گy (._M"&2)Ps>H""fPگ2gXگyZگ2g`fPj,l,yrvzZRX5  pP B~ _M,y_M"&)W[ _M"&)W[X  Ty$r(_M"&)W[W 8<@pDHPL?T"   P PZ"b r,y:D>@,y@~@(@X@k~M@:@(}@ Jv`;h N0 5 ueD!0  7 ew6(} 0k~M~,>6X>(B,yJ:b Xz,N`XD,y@,"'@`@@)@}@گ2g@@}s@gY@)Ty@g@z:d\z@'@gr@,@މ@h'@[@~@g^@)W@g_@_M@_M"&@)'@gLy@BQ@,"oY@,"%@(}@6@ hXh D57E )5(e ~gYggrgLy :d\z,"%گ2g_M ,y_M"&`$gY&:d\z,,"'.گ2g2_M"&8)W<)Ty@)'T@%NL 7 Ue& 555U}s )W[ ')h'މ$މ(Q*}._M0,y8گ2g>,_M @,yFH,yNP,yj  u55 5E5  e  Z(}(~2g_4:d\z:<,yBD,yHg^J:d\zR,"oYTگ2gZگ2gd6b tXZ,tXD[8@Ѳ:@)W@&{t @:@ $t h  ( e7w* &{t :)W[8 &Ѳ:b 0z,0D<@,y@t @$9p@@}@گ2g@gY@QKq@,")@@@:d\z@z)p@@,@މ@@Q@,VN@:p:@a@,"T@'@Tq8^@}@T; z@)%@_M@Z_M"&@)%@@:$@wy@x:@,0 @(}@ phV *=  :$ ,VN,0 88 COT -- Date is VV 5 E  wJwJ-|-r 6 n8a7 T5DR-H:09ȵ^  ,y,y_M"&@"t 08<@<N8Rwy\'^,yjwy ȥ    .ȵ*Р(ȵ"Р ȵȵРȵРȵ ȵРȵNР.  !  5``````57,7,e&&&TTT  ~@ .<_M>,yD)%FމL)%NމV)%Zމnt  0 $I  w8%f CABl}0Ia,<2<:D@QH8L00  ee<,")گ2g} گ2g$,"T&گ2g*gY,:d\z2گ2gA& W D4@ @ ` e ʵ        (x:wywy(}":p:(ʵ    5E7p  ,U5 5wl2_M4,y:<,y@_M"&D)%FމJ_M"&N)pR)pV}`b,yfh,yt,v,y6>  e<0b -iD(%HP"6#dp:B:,PK`eh(i&PipqP} 4''!.'}".pq"8:#Bu:Ps$y:$y;%xyy(Hb Xz%XD# z@։@J`&@J&@J(@J!(@J"(@y@  & &0B`;hJ0 h&( &F eH &  &# zyJ&J(J!( J"($J`&(y,։Fb P*PD b zPD > GX w>  > w  CC   w C  C DD*  w  D  D EE#w  wE  E w  FF%10<%D-%D%8>  w F  Fw w  w  w  w  RRREGISTER SYMBOL6   R{(N[ L R aaSYMBOL REFERENCES  ""a :  a w w w  w  ww s  sw  s s w s  s yy wy  yw  z  z w  zz  w z  z {{#w  w {  { ||*I  w##|  | w[  }}%10<%D-%D%8>  w  }  }w  w w&&  w&&  w   MACRO  2 2{(N[ L  MACRO NAME REFERENCES  ::"((:   w" w w(  w(  ww" "  w    w     | w%%  w( (   w((    w+ +   #  w11   w  %10<%D-%D%8>  w   w(( w(( w..  w44  w  PERMANENT SYMBOL TABLE  J J{(N[ L  SYMBOL REFERENCES  RR**06:   w* w* w0  w6  ww* *  w**    w- -     w33  w0 0   w6 6   w  %10<%D-%D%8>  w   w00 w66 w66  w<<  w   SECTIONS  b b{(N[ L  SECTION NAME REFERENCES  jj288> :   w2 w8 w8  w>  w w2 2  w88    w; ;    wAA  w8 8   w>>    wA A   #  wGGw   w  E  %10<%D-%D%8>  w##   w88 wDD w>>  wJJ  w&&  & &ERRORw  z z&{(N[ L & ++ERROR REFERENCES  +:F@L(:  + w: wF w@  wL  w(w: :<  <wFF  < < wI I<  < BB wOOB  Bw@ @C  C wLL  CC  wO OC  C DD#  wUUD  D w((  EE%10<%D-%D%8>  w++ E[  Ew@@ wRR wFF  wXX  w.. Q    ~    Q QGLOBAL   Q{(N[ L Q W!WSYMBOL VALUE REFERENCES...  WBTHZ0:  W00>.b z"D#H#w@p @#H`;@:2@{H#HU#""@։@#@HW@z?T@#H#@H#H{H#hHI{H#HK#HL#H#Hy@#H ?ThJ"hD2g6Ԁ "+00  "+00 :2p "%"CRF -- *DIAGFATAL*- < %2R > - 2g Ԁ0ILLEGAL ERROR-SEVERITY CODE %P %P %P %P %2N 2g  ԀԀ,,FILE %X NOT FOUND %2N 2g , Ԁ,ԀBBOPEN FAILURE ON FILE %X%2NT 2g B ԀBԀ]]I/O ERROR ON FILE %X%2N 2g  ] Ԁ]Ԁu$uNO DYNAMIC STORAGE AVAILABLE%2N 2g u ԀuԀINPUT FROM UNKNOWN TASK%2N 2g  ԀԀ'INVALID OUTPUT FORMAT SPECIFIED%2NL 2g  ԀԀ-CREF INPUT FILE %X HAS ILLEGAL FORMAT%2N 2g  ԀԀ FAILED TO DELETE FILE %X%2N 2g   ԀԀWORK FILE I/O ERROR%2N/ 2g$ $I ԀԀ/ /UNABLE TO OPEN WORK FILE%2N 2g( (K/ Ԁ/ԀK*KNO VIRTUAL MEMORY STORAGE AVALABLE%2N 2g, ,LK ԀKԀq*qSYMBOL TABLE SEARCH STACK OVERFLOW%2N 2g0 0Uq ԀqDD w De EW= f"  6 B Bj ()J W 2g4p 8":_D{g'L<P{g'TʫXbl?Tb Xz`XDt@<&@2x@Jb^@{'@@@)p@e@)t @#@@J&@J)W@{@[W@ @)}@ zJ'h>J(h hѕ ѕ p 7 7e7f@  eE 5|Jb^ <&)t )p )p$ *)}.)p2e:)W[W >{#@ DeL)}dt dV" 2xJ& {'t 4b XzeXDJ8@Jb^@e@A-@?T@J4&@)W@J(@[W@%2R %2R%N%VA%NnZRR  . S Z Jb^)W[W ))J4&,A-0@h'@{g'@@)W@t(N@92@J(@{@{@Q@{@[W@'@jS@' q@j#@@N`r@M@KNq@K@쩖@;^@$@#@ J(h \w   \ ^R  w 0N`r4jS8{Nq<{Nq@tLB{g'FKH{NMVM8 e x;^ J8')W[W {#  J8$`*{# .J8)W[W 4{#@ J8)W[W b z(iD{Nq@;@)@Jb^@FOQ@)p@W@'@h'@GK@@?T@z@Jb'@)W@t(N@J'@J(@JV(@J(@{@[W@N`r@©2@)@<(N@;Z@J)@k@#@ 8eh A-hJ!(h)}h  %VSw   7D a7 S K ed WGK$FOQ04)8Jb^<'>)Bh'H)pX;hJb'lJ'v{Nq~t(Nf &     R:   e^kN`r"&;Z,0JV(:J'LPT?TXJ'^J(dnt(Nr©2v|<(N4 5"e 7" 6 ))W[W {# 0J(b 0zPi0D`@:@)@Jb^@'@d@)p@W@df@)t @h'@ @z#@@Jg'@)W@{@[W@'@)Ps@#@$9!@Jbw@ @:@#@ J"(h  d5D00`TH taHKNqHtH@KH LJ8h։h.©Bxh*J4&hJ&hJ&hh,2Jg'hJ(h h©2h&yh$ % ((b 0Z''0D@J&@#@{@)@ h e w#.)  )J&{# b 0b'}0D#@{@>`T@)@<(N@)@ "$h &f @Ίe ,>`T ))<(N"{# bb 0z.pq0DJ8@<6(N@)Bx@)p@D@~@ @#@@)W@{@[W@)Ps@$9!@ 4쩖h 8  h<6(NJ8)Bx  J8 D@~)Bx)p$$9!&)Ps,{#@ 0J8)W[W b 0z8:0DJ8@[X@Jb^@d@։@W@tt@ X@#@[@[Z@Jg'@b)W@tv^@{@[W@[@;VN@Jbw@ta@[8@ +qh lw  Nq 8 5 . . + qUq ezW ։J8[tt [Z$;VN* X0Jb^8;VN> XDJbwLtv^N[TdVJg'Zta\[X`;VNh)W<hBef։[W [W[W[[Z[8 [8$[8([,[X4[W8{# b 0bu:Ps0D`;@)@'@J@h'@%@ 6""h  w(J %'  )h'`;b 0By:0Ds@©2@ R68h, A ?   ,*,f E s©2bb Xzy;XDGG@` HFOBxH#@>6YH F6e^HW@_H J6PH@=OBxH@z{fHH {T[H>6:H{@QH{@{HjS@d@N`r@M@©2@D6PHA6zHk@:JOYH 4;hHʫhdʫ>h;^h @@@!! w&) c 6 0` %  `7R @,N`r`N`rw & A 7*@m7  ,1 C7 pM w"  7 / WkPN`rdN`r8 *w 7w `  efA   \wr 7fwd 8N`rjSGG&N`r*jSXN`rjGGzN`r~jSL D v& & % N  V 00vATADATADATA    . P s e`N`r|M0w    A C  w CB fw eC %E@& 7 pB  4 jS*©22:WJN`rVWZh@|N`r 2wV  cAcA & 7A &e Cm  &mTd(`e` ` f`B` Z    f  !d   `p f& `,,&  mV  B{# x  ce b 0Ryy0Dzy@z L@z(N@zg'@ @ʫh D& @N ECBN e@A  zg'"zg'*z(N8z L_M1~Q2_Lrh.ɪѪxZתW2 (@1-"&A}sA\zLp!R:R@&R^RwRWy-i5}"wzr Xl,xƫ6 ̫@`r̫srѫѫVNM800H)^Hs@\)KH<&@`;@VNHÄHy@`H)nEHz)sEHp@)EH(&{PH`[8Hf:H&{HC}H )H#)H4)Hz@)_GH))H2@z)TyH$&{ZH'@)H0̫@`@)GH[#H)2HH4) H,)BxH) H-CFLH)[MH )pH?T@z;F4 @)w H.4@)H)PH8)KqH;H#@[YH[YH)H\) H2)t H)ZHP#P@00vATADATADATAzeĊ@)H|r@3SH)[}HR@@)8H)!H@.{V&H[HGVNHR^H[ZH@)ZHz$9΅@)WHH)WHB[<}HX@)pH")LH<) H:)%HH)H@ H[WH)dH:)4H=z~RH@!{YH )'H&!{YH)PsH*)%H [H JH&{t H)'H(t @JVNH̫s@3|XH'KHz)pH),H/)VgH<[8H)XH^\)zH#zH\)H&{WHL@&{WH\) H&{WHwslH8Hz lhf@hXJhhkhVh~v ghѫhjѪxZh/KhQ2hh.hGfh9 qh_hz7wh Lp!h=MhתWhMhh-"&h$vPh 2h}"hrm\hA\zhvh;F h htza@hhv gh rh2hɪhRwhv XhP8hf hb#KhJhfѫhlhnffh^*R:hwh@,xhpy( <K8GOl|Ol|6;F4 eĊ |r 24"*8X X: ffCRll$$t <&66 44PFFHH GG '# SP0:[1,7]000000.XXX wwwww 7 k  ff 8%Ol%| AW  W @̫@` zL̫s`; X2<LR@X `8h   s!s7(%1~ 2< #P?T:(B$9΅DsR#V~Zs^?Tb2b Xz(XDVN@k@y@`@J@n@@n@CFL@:t @n(@?T@;@z-"&@#x@#@R^@GVN@:@dlAy@ X@@ @f @'@ ~L @n@J@JVN@jff@'K@nf@w@:4F@#@ `;hTzh2̫@`h̫shfLhD L H  <:t  ~L  JVN Hw: JVN6:4F8JVNfdfww Aff& COwwww~nJ nJJJJVN&n,n0VNBVNLn(Nf Rn(Tf XnfZff^nf`ffj - UB  U&L |VN GVN " (*0;2k6<H#xL?TP#T?TZy@`\kbLfdlAy`,E!5U55 0 3j X y@`kR^@  k&CFL(k.@ 0k6'K8k>-"&B'F0LR#V?Tb XzfXDl@#@k@y@`@#@f:@@D@@/K@9 q@Q2@h.@zdl@@CFL@Gf@#@@(@@i@)p@_@?T@Lp!@@@$9B@;@#(@-"&@z3S@}"@:s@ @#@R^@dlV@}@r@2@ɪ@T; z@Rw@@ X@z@ @'@J@)Ps@#@RWy@JVN@$9!@'K@R:@A}s@#@#8@#z@wsl@ VR@hP 6 2+)(:sJVN J 29 q4JPP :P5 |  rP M55E, P J N w5 .5ggxy@`k|,9 q0A}s63S8/K>#zf: @/KF,R9 qVRWy\@b(@hy@`jktCFLvk|$9B 0x H5 6HP N0 ֆŝJ C : ! ,xwsl/K2-"&6)p:}@#8DH-"&)Ps N?TT#X\9 q`?Tf#j_n?Tt#x_|?TjH %  w00kDR^NR^Z#(^?Tbl|*5("  .NÝ  7 7 7 7 7 7 ~;k("&#(*?T..4T; z<$9!H$9BP#T^?Td j nRwrRwvRwzRw~/K7 7 7 7 7 7 7 27 7 77 7PBѥ_R~ Pҕ ѥ ~~Q2 2___}"}"$R:*Gf.h.2h.6Lp!:ɪ>rH9 qZ9 qPhlzl~Rw8"R~ R~a lRw*9 q b Xz""XD#HVN@k@J@#H@#@H#H ;@#H#H#Hz#(H#PH#xH?T@#H#@H#HGVN@J@#H:$@#Hc#pH #H #H z#H#H #H#H:_@#8H#`H#H#H:4F@#H ?Th2gԀ  >   :$ :4F2g Ԁ&Illegal error message number = %M 2g SF ԀԀ!.! - parameter address = %PReader spooled 2g ID< Ԁ<ԀKKReader unspooled 2g  IDK ԀKԀ\%\Job %3R was entered in queue %2R# 2g ID\ Ԁ\Ԁ}2}Illegal $SUBMIT or $PRINT card - job flushing 2g ID} Ԁ}ԀV%N%7SInvalid card was "%80A"$PASSWORD card illegal or missing - job %3R flushing 2g ID ԀԀ1Invalid account was given - job %3R flushingd 2g$ $ID ԀԀ)-)Sequence number check - job %3R flushingd 2g* *ID) Ԁ)ԀQJQ%N%7SInvalid card was "%80A"Job %3R flushing due to operator request 2g0 0IDn ԀnԀAccount file open error 2g6 6 SF ԀԀAccount file close errorD 2g< < SF ԀԀAccount record locked 2gB B SD ԀԀCouldn't find physical LB: 2gH H SF ԀԀ Account file read error %D. 2gN N SF ԀԀCard reader read error %D.0 2gT TSD ԀԀ0 0Output file write error %D. 2gZ ZSF0 Ԁ0ԀLLOutput file open error %D. 2g` `SDL ԀLԀg gOutput file close error %D. 2gf fSFg ԀgԀ0Queue %2R does not exist - job %3R flushing 2gl lID ԀԀ3Queue %2R marked for delete - job %3R flushing 2gr rSD ԀԀ5No queue file space available - job %3R flushing 2gx xSD ԀԀ6Error code %D. returned by QMG - function code of 2g~ ~SD ԀԀ@:@%N%7Spacket sent = %BSend directive failed - DSW=%D. 2g SFV ԀVԀvvCard reader not ready 2g IDv ԀvԀ&Illegal function code sent by QMG 2g SD ԀԀ!Failed to attach card reader 2g SF ԀԀExiting due to fatal error 2g cSX Ԁ  DEe  Е Е-Е-Е B 15åS 2 (L00vATADATADATA 2g$,J0J6:_N?TRV^;`klGVNvVN`nåFcåX 3ff) Bw&  ,Lb XzfXDf@@Ä@f:@C}@ѪxZ@/K@Q2@h.@Gf@_@Lp!@תW@z9x@M@@3S@}"@}@v@/K@0# @a@@r@2@ɪ@8@@zf @~R@J@P@R8@dl<@dl@3|X@ff@dl@dld@R:@dl#@#z@dl @b8@dlD @wsl@}@ NA}sh&̫e yhNGh6 (>J&zQQAA wL^Y&&7    ̫e 0# ̫e $  SUBMIT  ̫e  #z/K  PRINT  ̫e ( !/Ef:/K 3S/K,  " &   AFTER    ̫e 0 0  HOLD  ̫e 66 dl Q2 LOGFILE  ̫e @ @   QUEUE     ̫e F F" "& &RESTART   & &̫e LL dl  Q2. .SEQUENCE . .̫e VV wsl /K7 7USER 7 7̫e ``, , < <NAME < <̫e jj    A ANOHOLD A A̫e tt dl 2HHNOLOGFILE H H̫e ~~ dld 2RRNOPRINTER R R̫e  dlD  2\\NORESTART \ \̫e  dl  2ffNOSEQUENCE f f̫e   q qPRINTER q q̫e " dlD  Q2 y yPRIORITY   y y̫e (!DʆD/A     D D &  AFTER "" ̫e   COPIES $$ ̫e   DEVICE && ̫e " " HOLD (( ̫e  dl Q2 JOBPAGE ** ̫e  dl Q2 QUEUE ,, ̫e " " RESTART .. ̫e & dl  Q2  FLAGPAGE 00 ̫e  dl< Q2 FORMS 22 ̫e    LENGTH 44 ̫e   LOWERCASE 66 ̫e $$ dl# Q2 NAME 88 ̫e . .   PAGECOUNT :: ̫e 4 4& & PRIORITY << ̫e : :, ,UPPERCASE >> ̫e @@ 00^^$^'^!^-^.^ȁĆΆȁ̆ȁ{ F ^^ ^$^(^,^0^ 4: >D F NPT XZB̆ȁ̆ȁ̆ȁ̆2:=.:f    " &2(<< f c-_-W p e H 7 @ =- 9 2-M.-\lP JJJa@"}*09x6LתWRPXJ^JfJhתWnPtJ|J*S5G- - -;e-&I  lJ  תW$(a@0P6J>J@vFPLJTJVѪxZb}n}"xP~J4-  -ڂ Ђѕ ~~5- & -^JJ8PJ$J,J.84}DMNRMd}p_z}& S -  - - - n h.9x*P0J8J:R:@PFJLJTJVGf\PbJjJlrrPxJN, w5 5 ~JLp! PJɪÄ8  /K&_,f@._2f@4_8f@:_>#z@/KF}"Lf Pv   M7P|}"f  }"h.ffh.ffh. }&}",ff.}"2ff4}"8R8<2@Q2H/K7'$! @   70&/K /K/K/K"/K>]w7P3|X/Kb Xr;dXDA\z@0# @s!s@ 0RWyh̫e ;dyh;dGh     ̫e 0# ̫e $  PASSWORD.  ̫e   ʄ  " ~   A\zs!sA\zs!sb tXztXD$9K@Ä@`@V}@ѫ@ 8@@)@)@ P@}@/K@z:@<&%t@%x@#@?T@M@VN@A\z@2@:s@ p!@ s@K@i@8@z' q@ @ѫ@@$9!@#p@#@ Y@hp!@#@R:@#@ @8@ \z@",x@ |@00vATADATADATAh0    6    ,LB6 L:sVN V}K@#D?TH#L?TP#pT?Tbf2 lE6 f  7 5  di6VNF}J%x' q L)P<&%tR)Vhp!\}``jÄl/Krv8|: 7 4 &15 e~ ---e~ n5R8 :*V}.80/K8 Y<MN sV s^ Pf \zjA\zeтt,n7 let ׭X%R &) 2ŕJ 5 e^ p! p!$9!"K 0$9K>#B?TH&^#bfl?TrÄt/K| Y~ e Hw @w׭׭2e w 0Wt0PWt0PbM s8$8(80R::R:> @ѫF NѫR TX 8Z,xzdb tXr;tXDXÄ@J@/K@:@M@rm\@A\z@8@ >_Mh, ,v, Е Е,ЕBН5 C~  P~000000PPH PJ Ä"/K288:<8B:HM`A\zjnrrm\&b tXzJ`tXDXk@J@ѫ@@C}@ѪxZ@/K@:@Q2@h.@c6@Gf@z?T@_@Lp!@=M@תW@vP@M@-"&@@}"@;F @v@a@@)W@r@zv g@ɪ@ƫ@8@@ @[W@~R@)Ps@ѫ@@dl@dl:@dl@'K@dlJ`@JR:@hp!@#`@#z@,x@v g@ (@h* *v* : LU U @  ŝJ |  Е.5|'Kk@ k.#`26-"&)Ps z>D&:""@+ @+ @p@Bn@K@ X@؁@@|L@@@Zy@X!@p@Z@r@w@w@ |0 |쨰"h |0 X*@>Pf~py y* Xw"y &(w. X2K:|L>>BpF|LJPL|LPfT X,T 1: 1 :(Z؁ XZ$؁&&&f& & Ε  m7 5C'f&5wa 52 BnX!,X!6+ F+ J+ l+ ,|wa wI+ :""rpb 0JL 0a0D@'@E@ nh  &7 & &  E'Fb 0rQN000 ƀzip>ƀDs@0@ X@y@s""@:@p@%u&@r@ h|0  <;h  |0  Xy l&f@W &ff& m@` Е.ȕ w8 %u&0:0Fs""HrLs""Xs^:jpFb 0r0D:@ X@""@y@p@@r@ D|0  M8h |0  Xy H&f@Е[ Е, Е]@`w.: &:@""BrFpJb 0z0Dp@ X@؁@|L@d@w@é!@@`;@+!@w@@2 |0 GhGhp  |0 V"Z(> )b X|L +!p|L"|L "Z& X*؁0|L46>8؁>bBpF|LJdLN|LRé!TVR~(|L p|Ld|Lé!" X&|L*+!,~0p4|L8:|L>@D XH؁N|LRTR )b m|؁ bp|Ld|Lé! "|L&*p.|L2d46|L:é!<@ XD|LHJmNp A`; SYSTEM |0  A   `;  OWNER |0  A   `;  GROUP |0   A   `;  WORLDL |0 u>RWECD ) expectedIllegal protection codef   X|Ldw|L">$(w.p2؁8؁>؁D؁J؁@b 0rd0D@`@p@ X@؁@|L@ |0 2K!hGwh  |0 2&:=&Fp|L |L&p؁ ؁&&* X.@` : |0 ..   b pz%vQpDw@Q@,@;d@@@QF @_Mp:@*y}@@Q@* @` @zQVq@QTq@QUq@Q` @Q@Q@[qM@Q@jLp@ @Qj@Qz@8@SZ@'@zQ@Q2@Qf@Q'@ zR@,9^@QZg@_@(@@_Ma@Q@Q@x@Q'@X@zz@fZ@Qs@e"@y@Qd4@{S@qO@s@Q@yd@_@@QQ@e @zm@2d@Q]R@:4}@t!@|C^@Q;@}@Q@ys@Qw@QS@kQr@Q@Qx@zUd@@'@bK@Q@Q*@Q@Q@Q(@kQ@Q@Tq{@y:i~@Qy@e@zQv@Q|@K f9@y@Qy@Qy@Q z@vLD@ H@u:@s@_@Qy:@~@Q:@zQ@nZ&@2@v@ 8@Yq@j_@L@Zg,@Rv@VqM@&Z@Uq5a@&v~@Q;d@zd4@R,@Qq@_@  hLXh~L]h˪hThL hLH h~hN .   .      M?QQQQ      H@ 2dQ2    ABORT` Q`    00$vATADATADATA &&ALLOCATEsQ ,  , 66ANALYZEQ,9^,  <  < FF`APPENDqOQq  L  L TTxeASSIGNt!Q Z  Z bbglBACKUPK f9QF  h  h ppBASIC He v  v ~~ BROADCAST 8      CANCEL__     CCCNQ     COBOL8Q;     CONTINUE_Q    8CONVERTK&v~[qM    8COPY&ZQ     xeCORALR(@Q( ""   `CREATE* Q* $$   8DCLe Q &&     DEALLOCATE ((   `DEASSIGNLQ **$  $ ..glDEBUGOyQ ,,4  4 <<HDEFINEXQ ..B  B JJglDELETEu:Q 00P  P XXDIBOLRe"Q 22^  ^ ff DIFFERENCESj_Qj 44l  l zzH DIRECTORYnZ&Q 66   DISMOUNTzQz 88   HDUMP{S ::   HEDITUdQ <<   HFIXE}Q >>   HFORTRANR'Q' @@   &HELP'Q' BB   HHOLD2dQ2 DD   Hl INITIALIZEd4Qd4 FF   HlINSTALLy:i~Qy: HH    &LIBRARY:4}Q: JJ   MLINKjLpbK LL    &&LOGINOvLD~ NN,  , 44MLOGOUT_Mp:2 PP:  : BBMMACROO_Mam RRH  H PPTMCRNkQrkQ TTV  V \\MMERGElQQQ VVb  b jjHlMESSAGE&R,Q]R XXp  p zzMMOUNTRvQy ZZ   MPASCALSZQS \\   MPRINTM;dQ;d ^^   hlPURGEMfZQf ``   xeRELEASEZg,QZg bb   glREMOVETq{QTq dd   MRENAMEUq5aQUq ff   xeREQUESTOVqMQVq hh   MRUNYq_ jj   TSETMsQs ll   SHOWwQw nn    SORTxQx pp   MSTART*y}y rr$  $ ,,glSTOPysQy tt2  2 88glSUBMITydQy vv>  > FFhlTYPE zRQ z x00, wD XHwLPXH^bwh XlHbb 0ze+0Dk@@-}@nL`@ k@nW@9@nW@n @E\@˪@@R?T@%p&@A@e@:@@@ bh l%VA%D%VA%D%2S%VAB%DPS9,--- f --|A(e.E\0˪6E\8>E\@H%p&L%p&N-}nL` R-}nL` V:\ebE\djE\h-   7  v&fB  @0 ef6 6 E\ ˪e" k8Fz~?Tw ee f&f!`E, fՋ ff efH-}nL`  -}nL` :29:nW@FnWJRn `6 w ee " ef6 w eeeh?T-}nL` -}nL`  :VZ?T^-}nL` b-}nL` f:xk  b 0jX0D X@ p@ X@`;@ |0  QhXh  |0 P" X p߂ X`; DEB |0 @   Xnb >z>D&:""@+ @+ @p@Bn@K@ X@؁@@|L@@@ry@X!@p@Z@r@w@w@ LhLe^h|0 eheHhN |0 ^ "6:Z X|L py"y "6& X*w.y 24w: X>KDZJ؁R XV|LZZZp   :Device syntax errorIllegal device: ":" expectedIllpy py Xw"y &(*w0 X4K:<ZB؁Hlegal device &&&f& & Ε 0m5e% % 7 5C>f&52 BnX!0X!:+ H+ h+ l+ ||!wa 5wa wI %̥:̥:  wҕ:U2+ *+ 6:""8r>]<[ *!Illegal directory formatn X|L Yp|L |L 8$ X(؁.L2P4؁< X@؁FLJPL؁UKb tzu:tD X@p@ X@L@؁@@|L@ :@y@K@Ps@d@bZ@w@嫈r@`;@^%:@w@ |0 Qhu:h  |0 VV 0y D`|py Ps XV|L"0$y(|L,D.`4 X8w  C X|Ld X X$Z M MOctal group number expected |0 M/=   M K  X`; i iDFL |0 (i=@:  i X ؁ X X p$`; o oGBL |0  o  o`; t tTERM= |0 " "tB A  tB`; { {GRP |0 **{N  {N `; FIN |0 4 4  `; LOGo |0 <<=Equivalent name string? Logical name? Group number? &Function requires logical name s(  X X X؁ X upportb XJ{zi^p>Dp@ X@@L@؁@|L@K@ |0 ;h;h |0 d ,D[]h<\> [\ ]~ X|L p|L,|L D"(|L,h0 X4؁:|L>\@؁H XL؁R|LV\X؁` X@`z<>>]*<[ !Illegal directory format$Lz X؁؁$Kp6b zvLDD X@ p@K@K@@`@p@e@ X@ y@@؁@|L@zK@Ps@d@Z@Z@@H@é!@`;@+!@ |0  vLDh  |0 d @@ @\ Q :@x  S ~ X ؁ |L\|L K$& X* 0|L4:6|L:x> XBD|LHé!R|LVKX \`pP`@y  . B \ X XPsy  X y&|L*.p2 X:< XF XJ|LN Option?  |0     OPTIONS |0 V  0 hA@H @ A^  p |L0p|L"h*|L.68|L<DF|LJR`;  FAST |0 !v y  1I,  v Xy p`;  DEBUG |0 F 1I   F `;  MAP |0 &&V"   p`; ## CONCATENATE |0 8 8#  #`; 00DEFAULTLIBRARY |0 @ @0  0`; @ @GLOBALS00DvATADATADATA |0 H H@   @`; I IINCLUDEF |0 PPI   I `; R RLIBRARY |0 Z ZR   R`; [[SELECTIVESEARCH |0 bb[D A  [ p`; llANCILLARYPROCESSOR |0 ppl   l `; BASIC |0 zz     `;  CHECKPOINT |0  F   F `; CODE |0  A   `;  COMPATIBLE |0 v  v `; CROSSREFERENCE |0   I  `;  EXECUTABLE |0 d A  d `;  ERRORLIMIT |0 ~ A  ~ `;  FULLSEARCH |0 "v  v `; HEADER |0  $ E  `; IOPAGE |0 Lv E  v `; NOIOPAGE |0 Iv A  v `; LONG |0 )v I  v `; MEMORYMANAGEMENT |0 , A   `;   OPTIONS |0  .2  2 `; OVERLAYDESCRIPTION |0 0 A  `; (( POSTMORTEM |0 (1v I  (v `; 44 PRIVILEGED |0 42L I  4L `; @ @RECEIVE |0 ((@4v I  @v `; IIRESIDENTOVERLAYS |0 22I6v M  Iv `; [ [SAVE |0 <<[dv M  [v `; aa SEGREGATE |0 FFaFv A  av `; ll SEQUENTIAL |0 PPl8v A  lv `; xx SHAREABLE |0 ZZx9 A  x `;  SLAVE |0 dd:v A  v `;  SLOW |0 nn;v A  v `;  SYMBOLTABLE |0 xx< I   `; SYSTEMLIBRARYDISPLAY |0 >v I  v `;  TASK |0 d A  d `;  TKB |0 @v A  v `;  TRACE |0 Av I  v `;  WIDE |0 Bv E  v `;  NOWARNINGS |0 HvA  v `; WARNINGS |0  v I  v`;  PRINTERR |0 _v I  v `; EXTERNAL |0 av"  v p`;  C81 |0    `; COBOL-81 |0    p `;  SORT_MERGE |0  (   ( `;  OTS |0  (   ( `;  RMS |0  (   ( `;  FMSR |0  B!  B `;  NORMSN |0  !  `; % %NOFMS |0 "@"%VdPV d  % p|LdV|Ld X$p(|L,d.V0Ps4 8 X<`; ,,RESIDENT |0 ^`^,P:H :" (  , X؁PsH  X ؁&Ps*" . X2|L6+!8<p@|LDF|LJLP XT؁Z|L^` )=  " ؁ =  X|Lp |L$é!&(|L,.00L d@D XH|LLN" RpV pf(0Y4Y5YX pz X|L d|L(p؁"؁*؁4p8|L XF XJ yP|LTdV|LZp^pb`;  6 6TASK |0 x x6  6`; < <SYSTEM |0 Z<( )= ~  < X X|L+!p"|L&(|L,.2 X6؁<|L@BD؁J= NpR|LVé!X6 " T|L |L X|Ld X$|L(*" .p2`; D DEAE |0  D  D`; II DATASPACE |0  Ic  I`; T TCLI |0  Tf  T`; YYFAST_MAP |0   Yh  Y`; ccOTS_FAST |0 ( (cj  c`; m mFPPJ |0 0 0m  m`; r rPIC |0 8 8r  r`; wwPOSITIONINDEPENDENT* |0 @d@w       w X y|Ld|LK( X, y2|L6d8|Ld@|LDHpL`;  COMMON |0  N  `;  LIBRARY |0  O  `;  TASK |0 @ FB B  p X X"p& X. X8p<`;  ABORTT |0     `;  ABSPAT |0 Z   Z `;  ACTFIL |0     `;  ASG |0     `;  COMMON |0 &&    `;  CLSTR |0 00    `;  CMPRT |0 ::    `;  DSPPAT |0 DD Z   Z `;  EXTSCT |0 NN ~   ~ `;  EXTTSK |0 XX    `;   FMTBUF |0 bb     `;  GBLDEF |0 ll    `;  GBLINC |0 vv    `; % %GBLPAT |0 %   % `; - -GBLREF |0 -   - `; 5 5GBLXCL |0 5   5 `; = =IDENT |0 =   = `; D DLIBR |0 D.   D. `; J JMAXBUF |0 J   J `; R RODTV |0 R   R `; X X00TvATADATADATAPAR |0 X<   X< `; ] ]PRI |0 ]   ] `; b bRESCOM |0 bx   bx `; j jRESLIB |0 j   j `; r rRESSUP |0 r   r `; z zROPAR |0 z   z `;  STACK |0     `;  SUPLIB |0  V   V `;  TASK |0     `;  TSKV |0      `;  UIC |0 **    `;  UNITS |0 44!    `;  VARRAY |0 >>"    `;  VSECT |0 HH#>   > `;  WNDWS |0 R\R$ = e : e : e  = e ~   X؁|L e ؁$|L( *e ,؁2|L6 8e :|L> B XF؁L|LPRe T|LXX | e  e  ,= e  : e | X|L | e |L e |L X$؁*|L.2 X6؁<|L@ Be D|LH J؁P|LT Ve \@ = e : e @" = e : e @ ||L X؁|L e ؁$|L( *e ,|L0" 4 X8؁>|LB De F؁L|LP Re T|LX ^V = e : e @" = e : e = ~ X؁|L e ؁|L "e $|L(" , X0؁6|L: ؁D|LH Je N XR؁X|L\ ^ e : e = e  = e : e  e :e ؁ |L e  X؁ |L$ &e (|L, 0 X4؁:|L> @e B؁H|LL Ne P|LT Ve X؁^  e  = e : e = e @V : ~|L  e |L  X؁|L" $e &؁,|L0 2e 6 X:؁@|LD Fe H|LLV P XT؁Z|L^d e : e = p e / e @" = p e /  e ؁|L e  X؁"|L&p (e *؁0|L4 6e 8|L<" @ XD؁J|LNp Pe R؁X|L\ ^ e @ = p e / e @" = e = e |e |L   X؁|Lp e ؁&|L* ,e .|L2" 6 X:؁@|LD Fe J XN؁T|LX Ze  = , e 0 X؁|L, e p`;  CON |0 4 4   `;  OVR |0 : \:  L e = e : e : e @ =    X |LL e  X؁ |L$ &e (؁.|L2 4e 6؁<|L@ Be D|LH L XP؁V|LZ P e : e : e RWROSVfe  X ؁|L e  X ؁&|L* ,e 0p4:BpFL`;  -SV |0 `  e  e +-:6 J : e ~   X |L e |L e p"؁(؁.؁6p:|L>6 @|LDJ H XL؁R|LV Xe \ X^: :: e " @\ : e  |L e  X|L" |L"\ & X*؁0|L4 6e : X>|LBKF XJ|LNeR XV|LZr , e = e =~ X؁|L e  X؁"|L& (e , X0؁6H> XBZJ XNHV XZZb XfHn00\ ;׭  % 0׭׭@` ~} }~E &s($9:.S:4""6rBsD$9JsL$9΅R""TrZs""\r`s""lsfЕ.ȕ 7 w7ʥ  ɥ ɋ Bʋ 2 ҕ ҕ ҋB:""r}}"&~*p6E\Eh&f- - -  Q|"| w%w %AC|Q 77b EveE\$E\&˪,E\.89x@˪rF˪r^%p&f˪rl˪rz˪r^|w%|7 7 T&f--- ȥ? w@НE%? B|˪r ˪r˪r˪r$c1M(c1M4FM8E\:@E\B˪HE\JZ9x^c1Mfc1Mj0nWrZk e9Ee0P  w- wINS $/TASK=/CMD="L :&0.9x2c1M6c1M8F@WDWHWJFNᩀWBB&f0    5    ;  Z00Gh0Gh6˪r<[(}B5JGhPc1MT[(}Xc1M\[(}l;tGh~Ghlҕ"ҕ ʕ|:`:7w ( H e`˪r ˪r$c1M,c1M008e>-}nL` B-}nL` F:Rt VtH  b >ƀzUd>ƀD X@K@p@`@ X@@؁@|L@d@Z@`;@ *|0 <QhUdh  |0 * (@ X |L X|LK("p&`; ASCII |0 & &   `;  BASE |0 ..    `;  BLOCK- |0 88    `;  BYTE |0 B B  `;  DECIMAL |0 J J   `; # #DENSITYQ |0 RR#,  #, `; ,, HEADER_FORMAT |0 \ \,  ,`; ; ;HEADER |0 d d;   ;`; C CHEX |0 l lC   C`; H HIDENT |0 t tH   H`; OO LOGICAL_BLOCK |0 | |O   O`; ^^ LOWER_CASE |0 ^   ^`; j jLIMIT |0 j@  j@ `; qqLONGWORD |0 q A  q`; {{ MEMORY_DUMP |0 00dvATADATADATA{T  {T `; OCTAL |0   `; RECORD |0   `; REWIND |0   `; RAD50 |0    `;  SPACE_BLOCKS |0 h   h `;  SPACE_FILES |0 h  h `; PRINT |0 A  `; OUTPUT |0 d|A~  | X|Ld` X"|L&d(`0 X48 X<|L@dB`L XP|LTdVZ` XXDv|Ld Z X|LdZ( X,|L0d2Z< X@|LDdF|LJKP XT`; DMP |0 4@ =@N  |L  X X X"&p* X0`; TI: |0  AMDAS BA BLBYDC DEHFHD HX ID LB LCt  p p$,.68@HPRZbjrz D `; LIM |0 JJLWOCRCRWR5 SB SFSP::A:z   "*2:<DFP XT؁Z Xb Xf؁l Xrv Xz؁z:::::Input File/device? b X X؁ X X"؁( X0 X4؁: XB XF؁L XT XX؁^ Xb >ƀja>ƀDp@ X@؁@|L@Z@ |0 -8h(-8h |0 b^ L p^Lp/ ,| X|L ^Z|LLZ"$|L(p, X0|L4^6Z<|L@LBZH|LLpPpT؁Z؁F^< [> ]Illegal UIC: numeral expected&p؁؁p؁ ؁ b XzxeXD X@p@ X@@؁@|L@`;@ |0 Idh L |0 p0p|L |L X`; PIP |0 b8@<@v@B/V&EXTD TDz  |L 8 |L<|Lv X X$ X*؁0|L4V6؁>pBJR^`;  DD: |0 zzB 1  `;  DD:X |0   1   `;  DD: |0 n$:** - - ~   $ X|L؁|L"&p*|L.0؁8p<|L@B؁J XN XT؁Z X`؁f Xl--:dRdRd= X X؁ X؁ X( X,|L02؁8|L<@pD XJRL|LPdRRV XZ|L^d`؁h XJh/Pel,PeTSB\؁ |L X Xl|L"& X*؁0 X6T:p>F`;  -SB |0 .UFUP BLZCO4   Z"*`;  -CO |0  1SU 1NVCDRW} ABSf6FOCDRW} QBSfHFO:g:r  $,466>F00l ؁D XLpPXblvb 1BRe 1FRj 1FUk 1TBPA 1LImRE{UNNMoRW  L",4>FNV^`;  EOF$ |0 .n.FENTR ABSf APUyRW}SRFOCDSR  l  F  X X*p.68@BJRZbj`; $ $EOF |0 d$FENTRNMoRW:g:zj  $F ", X0 X8 X<؁B XJ XN؁T X\ X``; ) )PIP |0 L)e8,epLj  )|L  X X|L8|L"& X*؁0 X6 X<|L@LD XH`; / //PR6 |0 @6@/pL@j@|@@V  /|L L X|Lj|L| |L$&|L*. X2`; 4 4/SY: |0 rr4$  4 X X`; : :/OW: |0 :$  : X X`; @ @/GR: |0 @$  @ X X`; F F/WO: |0 F  F Xb z@D X@@`@p@Id@a}@a}@ X@|L@ :@}@é!@`;@B+!@^%:@ |0 @hQhn [ |0 "^ SFe.e6 X^ |LF|L.@` TI: |0 jd @gB^ CF      X X^|Lé! |L$F&(,p0|L4 :<|L@^%:DpH|LLT|LX`|Ldf|L 1p `;  LOG |0  1   p`;  TODAY |0   1  `;  EXCLUDE |0   1A    `;  SINCE |0 4 1   4 `;  THROUGH |0  \ 1   \ `; ) )DATE |0 )J  ) J `; / /PAGE |0 /  /`; 5 5SHARED |0 5!  5 p`; ==WARNINGS |0 =@ 1  =`; GG NOWARNINGS |0 &Go@ .  G p|Lp"`; S SMACY11 |0 TS |  S X|L+!|L^%: X"|L&+!(|L,a}4 X8|L<+!>|LBa}F XJ|LN+!P|L.j D  File(s)? &a}p |L}|LId b ~z|C^~D X@p@Id@a}@a}@ X@|L@é!@`;@+!@^%:@ *|0 |C^hQ|h 2 |0 H<,, e 1l X< |L,|L X X"|L&é!(|L,,0 X4|L8^%::@pD`; TODAY |0 DD`   `;  EXCLUDE |0 NN݂ 1A   `;  SINCE |0 XX 1   `;  THROUGH! |0 dd@ 1   `;  DATE |0 pp `00tvATADATADATA   `; && NOWARNINGS |0 |T|&o |  & X|L+!|L^%: X"|L&+!(|L,a}4 X8|L<+!>|LBa}F XJ|LN+!P|L File(s)? a} X |LIdLb >ƀZ>ƀD X@p@ X@؁@ |0 \8^h |0 `A[,A,8A,DA,P]f X؁,؁8؁D ؁&P(؁0p4 X<p@ XHpL XTpX XWb @zqO@D X@ p@K@K!@p@`@ @a}@a}@H @K@ X@z@L@؁@R@|L@K@Ps@d@"@Z@H@w@`;@w@쨰"@2 |0 qOhQqh  C |0 p|L  Analyze what?  |0    Ps Illegal analyze function |0 "@/& 4   X ؁|L&p`; ( (MEDIA |0 ..(\   ( \ `; // CRASHDUMP |0 ::/   /  `; ::ERRORLOG |0 FF:   : `; DD EVENT_LOG |0 RRD n ,  D  Xn|L" O ODevice? |0 hhO !A  O p`; XXEXERCISE |0 vvX   X `; bb NOEXERCISE |0 b   b `; nn BADBLOCKS; |0 n  n `; yyALLOCATE |0 y  y`; SHOW |0   `; OVERRIDE |0   `; RETRY |0 b @( , @)PAz  X|Ld؁H"؁(H0؁8 X<|L@K!B|LFH J XNP|LTKZp^`;  OUTPUT |0   !  `; SINCE |0  1   `; TODAY |0 (( 1  `;  YESTERDAY |0 22 1  `;  PREVIOUSDAYS |0 <<, !   , `; THROUGH |0 HH> A  > `; DEVICES |0 RR  1   `; BRIEFP |0 \\  1  `; FULL |0 ff  1  `; NODETAIL |0 pp  1  `;  REGISTERSE |0 zz    `; COMMAND |0     `;  WIDE |0     `;   NOWIDE |0   A   `;  ENTRY |0      `;  SERIALNUMBER |0   A  `; ) )INCLUDE |0 )   ) `; 22 VOLUMELABELT |0 28 A  28 `; ?? STATISTICS |0 T?J (|  ?J X|Ld|LK X$|L(d*|L.2p6|L: <|L@a}D XH؁N|LRa}ZP)Pb(||LR ؁ X|LdH& X*|L.d0|L4P8p<|L@bB|LFa}J00| rP)X|LR ؁ X|Ld|L"&p*|L.2|L6:`; K KALL |0 bK(),   K X |L X؁|L"$|L(*؁2 X6؁<|L@D XH|LL쨰"P XT|LXdZ p2 <TjP X|L d|Lp|L <"|L&T(|L,j.Ps PPIllegal ENTRY parameter |0 8>8P(T) vT  P X ؁|LT؁ X$|L(.|L2v6 X:`; h hALL |0 rbrh,@:|  h X ؁|L X|L"$|L(,p0|L46|L:> XB؁H|LLP XTZZH6*R X؁ X|Ld|L"p&|L*,|L02Ps m#mIllegal SERIALNUMBER parameter |0 ^m()<Tll,  m X ؁|L؁ p$|L(<*|L.T0|L4l6|L:> XB|LFlH؁N|LRV XZ|L\,l*؁ |Ll X`;  PACK |0 tt0  |L d K X`;  DRIVE |0 < `  |L d K X|Ld |L$(p,|L02|L68Ps Illegal INCLUDE parameter |0 @(),Z   X ؁|L|L؁& X*؁0|L48p<`;  ALL |0  !  `;  CONTROL |0   "  `;  ERRORS |0  #  `;  MEMORY |0  $  `;  PERIPHERALS0 |0 " "%  `;  PROCESSOR |0 * *&  `; SYSTEMINFORMATION |0 2B2'\tl   X|Ld|L  X |L$d&|L*\.p2|L68|LPs !Illegal STATISTICS parameterS |0 p@p(), 1Z   X ؁|L|L؁& X*؁0|L48p<`;  ALL; |0 (   `;  ERROR |0  )  `; %% DISKGEOMETRY |0  %*  %`; 3 3HISTORYL |0  3+ 1  3`; < <NONE |0 J<, 4Q[Ct / n  < X|L4Q|L |L$K&C(t, 0 X4؁:|L> BpF`; B BLIST |0  B*  B*`; H HBINARY |0  H  H`; P PSYMBOLS |0 $$P 4  P X|Ld|LK YY List file? |0 ::YF(  Y|L Fp`; ee /ERRORLIMIT |0 N Ne|  e|`; rr /PAGECOUNT |0 V Vr  r`; ~~ /PAGELENGTH |0 ^ ^~  ~`; /PRINTER |0 f f  `;  /NOPRINTER |0 n n   `;  /-PRINTERX |0 vVv 00vATADATADATA x   X|Ld` X"|L&d(`2 X6|L:d<`F XJ|LNdP|LTK  Binary file? |0 (  |L p`;  /MEMORYSIZE |0 .  L   X|Ld` X"|L&d(|L,K Symbol Table file? |0    p`;  ALL |0     `;  DEVICES |0     `;  BLOCKP |0 $ $ A  `;  CACHE |0 ,,.    `;  CLOCKQUEUE |0 6 6  `;  CONTROLLERS |0 > >  `;  DENSITYm |0 F F  `;  HEADERS; |0 N N  `; "" PARTITION |0 V V"  "`; - -SYSTEM |0 ^ ^-  -`; 5 5ACTIVE |0 f f5  5`; ==DATASTRUCTURES |0 n n=  =`; M MKERNEL |0 v vM    M `; U UDUMP |0 ~~UD  UD `; [ [DUMP |0  [  [`; a aPOOL |0  a' A  a`; gg SECONDARYPOOL; |0 g(   g `; v vTASKS |0  vh  vh`; } }TASKS |0 `} ()~  } X|Ld` X"|L&d(`2 X6|L:d<؁B|LFH|LLN؁V XZ|L^d^()( )(T @l ؁ |L|L؁ X"|L&d(؁.|L2 4|L8:؁B XF|LJdL؁R|LVT X|L\l J`)(  ),d؁ X|Ld؁|L "|L& (؁0 X4؁:|L>BpF`;  DEVICES` |0    `;  TASKSL |0 $,4   X؁|Lp `;  COMMANDPARSER |0    `;  DEVICE |0    `;  PARTITION |0     `;  STATUS |0  !  `;  TASK |0  "  `;  UNIT |0 $#,  4   X؁|L p `;  DATA |0   $0   0 `;  INSTRUCTION |0  %N   N `;  REGISTERS |0 * T* &(T )(T ),t   X|LK!؁|LT ؁( X,|L0K!2؁8|L؁F XJ؁P`;  ADDRESS |0 z Nz (T ),  n  |L d ` X|Ld ؁&|L*T ,؁4 X8؁>|LB FpJ`;  ADDRESS |0  *    `;  DATA |0  +    `;  DIRECTORY |0  )   `;   INSTRUCTION, |0 \ , ( , T )( @~   X|LK!؁|L "؁( X, 0 X4|L8T :؁B XF00 `; * *OUTPUT |0  * 1  * `; 2 2SPOOL |0  2 1  2 `; 9 9BRIEF |0  9 1  9 `; @ @FULL |0  @ 1  @ `; F FDELETE |0   F  1  F `; N NALL |0  N v 1   N `; S SEVENT |0   S l 1   S l `; Z ZSOURCE |0 " " Z 1  Z `; b bENTITY |0 . . b@ 1  b `; jjPREVIOUS |0 : : j, 1  j , `; t tTODAY |0 F F t 1  t `; {{ YESTERDAY |0 P P { !  { `;  SINCE |0 Z Z  !   `;  THROUGH |0 d `d >~        > X|Ld|L~ p"|L& *|L. 4 X8|L<d>|LB FpJ|LN R|LV \ X`    (  ), !z|Ld |L p|L |L" ( X,؁2|L6 8|L< >؁F XJ؁P|LT Xp\`;   ALL |0   ~ !Y  `;  AREA |0 $ $ p !Y  p `;  CIRCUIT |0 . . p !Y  p `;  LINE |0 8 8 p !Y  p `;  MODULE |0 B B p !  p `;  NULL |0 L L  !Q  `;  NODE |0 T T @p !Q  p `;  NONODE |0 ^ ^ @p !Q  p `;  -NODE |0 h `h @p    (  ),   p X|LK!|L p"|L& (|L, 0 X4؁:|L> @|LD F؁N XR؁X|L\ N   B 6B x B B` Xw Lwp|L  &|L*60|L4x :|L>F XJ`;  BAD |0   @  .   X X p`;  UPDATE |0 & &    `;  MAN |0 2 2   `;  PAT |0 : : Z "  Z  X`;  LIST |0 H <H  : : H   X X X؁ X&؁, X4 X8`;  RPT |0 :  =@@  T  |L ؁ X X p$ X*|L. 2 X6`;  TI: |0   @  `;  /W:N |0  0   p`;  DA: |0    `;  DE: |0  FF:b&  Fb`;   RE: |0  W:&  `;  PA: |0    `;  SE:X |0  T:&00vATADATADATAV:0  &`;  SU: |0 fTYP:>R:Jbz:   p؁؁$>&,J. X2 X:p>|LBbD|LHzJ|LNR XV|LZ\؁b|Lnv:**:(@)--| X |L X$|L(, X0؁6|L:<|L@B؁J XN XT؁Z X`؁f Xx (@4)--  | X؁ X X؁ |L$&|L*4,؁4 X8 X>؁D XJ؁P XX X\؁b Xjpn XT `;   ALL |0 XhX  B F N R WN  `  p؁؁"؁*؁4 X8 X@pD؁L؁VpZ Xd`; % %(*:*) |0 n%(,)P:D: ~  %p|L|L|L"& X*؁0|L46؁<|L@B؁J XNT X\ X`f X& B A(r`),rA!C"E#M$PE%~p|L B؁ X$؁*|L.r0|L4`6؁> XB؁H|LLrPpT؁\؁d؁l؁t|PR&S' @ A@(),A(E)~؁ X Xp"|L&,؁: X>؁D|LHJ|LNP؁X X\؁b|Lfjpn؁v؁~؁$G*H+N," ؁؁ X `; , ,CDA |0 >F>,@f@=@@xh  ,|L f |L؁|L X$ X(, X0 X6|L:x>pB`; 2 2/EXIT: |0  2  2`; : :/LIMIT: |0  :  :`; C C/LINES:X |0  C  C`; L L/-SP |0 NL ,A^  L X X X X" X& X. X2؁8 X> XBF XJ`; RR/MEMSIZ: |0 R *  R X X X`; \ \/STB |0 \,$  \؁p`; b bALL |0   b   b`; g gADV |0  g   g`; l lTSK |0  l   l`; q qBL: |0 $ $q  q`; v vCLQ& |0 , ,v  v`; { {CTLM |0 4 4{  {`;  DENS: |0 < <  `;  HDR |0 D D  `;  PAR |0 L L  `;  -SYS |0 T T  `;  DEV |0 \ \  `;  ATL |0 d d  `;  CPB |0 l l  `;  DCB |0 t t  `;  PCB |0 | |   `;  SCB |0  !  `;  TCB |0  "  `;  UCBS |0  #  `;  KMR |0  &  `;  KDS |0    `;  KIS |0  &  &`;  DMP 00  XBF XJ XP XTX X\ Xb Xfh\*+,A: X X X X X X$( X, X2 X6: X>|LBD XHL XP؁V X^ Xb|LfbA-:/z X X|L X X" X* X. X4 X8< X@ XH XL؁R XZ X^`;  EVF |0 H@4=@p@F@RSPd  |L 4 ؁|Lp X|L"F$ X(R, X0 X8p<D`;   FO:BR, |0 b b   `;  FO:FUb |0 j@j@@DE AL P   X|L X X X(p,4<`;  EV:X |0      `;  NOEV: |0      `; # #SO: |0 #    # `; ( (NOSO:$ |0 (   ( `; / /EN: |0 /  / `; 4 4DA: |0 F4TOYER  4 X X X X" X& X.p2:B`; 9 9PR: |0  9(  9(`; > >RA: |0 "~">JCrash output ? Crash input ?"Illegal crash output specification!Illegal crash input specification/) ,   >J X XyKb Xz""XD#w@-}@ @nL`@cK@E\@""@@˪@ve@?T@*:^@z@b@sd@%p&@A@R""@r@:@FM@ hXhvhsh %VA%2S--%2S%VA ^-c ^&^bAjrlR""rr|\|  G-H-HH |A rA(A.r0r4%p&6r:rBLP%p&R-}nL` VX-}nL` FX  (e(-HHv:X rr-}nL` r-}nL` :&r*r,26@DrB /) & & 7 -|-}nL`  -}nL` :/-}nL` -}nL` :"ve(#w* . <*:^@rT  7 w3  &f ef6 w eep"" %p&%p&˪E\sdve$cK.b4FM^b?Tf-}nL` j-}nL` n:b z""`D  ""h?Thc#?ThE""h""hݩPshG""hK""hP""h}""h""h?z&?Thت""h""h""h5?ThQmPshO?Th?Th9""h[""hR""h l?Th`*""hsPshR""hi_""h?Th, 00vATADATADATASorry, line too long)Sorry, "-" not supported through indirectSorry, low poolIFORM QUEUE FULLDelimiter expectedINPUT BU|FFER FULLSorry, task not installed Not logged in5Extraneous input - Check for proper command structureOVERLAY LOADING ERROR!Illegal use of wildcard characterTRANSLATION MAPPING ERRORERROR TRANSLATING FILENAMEINDEX EXCEEDS JUMP TABLEPrivilege tviolationTerminator expectedLiteral expected0ILLEGAL SYNTAX ELEMENT IN TRANSLATION DEFINITION+ILLEGAL SYNTAX ELEMENT IN SYNTAX DEFINITIONOctal number expectedBinary number expected A-Z expectedA-Z and/or 0-9 expectedRADIX 50 expected>BCT FAILlED - Check command line for proper structure and usage>BST FAILED - Check command line for proper structure and usage>CBM FA<ILED - Check command line for proper structure and usageb z&D&5p@s@@+ @+ @W@p@e@K@ X@@L@z؁@@|L@@y@FVN@X!@K@p@$98@Fy@r@@w@@Rip@w@iZq@ |0 NKhKhKh0Mh2 |0 P = 2=jH| X|L = X|L2= p$y(*j,y026p:y>@HByFHL XfL    |w yFyy w" X&w.y2Fy4y 8:wD XHwP|LTVZ X^wn @ @P$ @ "  P:@ ""|Le|Lip؁|L"$|L(5p.w8p<؁FH|LL P XTLX:Z|L^ bpfl:" P  @@"Illegal filespec.؁ XK|LW(K  & & & & && & & & Ε& Ε %w 5>59555UJX!(+ ,+ 2FVND$98FsLiZqNrRpVX!p|5@5&U55 U 55U@55U E &2H^hb 0j99K0DK@ X@؁@|L@w@ |0 5.%:h. :h |0 9 $@Illegal filespec4 X|L $ Xw؁ |L$Kbb 0rz0D0@:@ X@""@y@p@r@ X|0  ѫh |0  Xy \&f& SY@НН Е:@`w60,00040::T""VrZpb 0J}(d0Dp@؁@ |0 é!h |0 ,+p؁؁b 0zf0D p@@`@p@K@ X@@؁@|L@Z@w@@w@:@ |0 R8^hR_h  |0 J,:Jlfp|L  p XK"|L&,(؁0p4|L8J:|L>l@ZF@` 0 |0 FjF000 :   X wZ $w* X.2w6؁<ZBFwL XP؁Xp\|L`b p,: XK|L,؁b 0z*K0D p@p@ X@@L@؁@|L@K@w@w@ |0 c" hH h  |0   X|L  00 |LBLFpJP:R؁\K%b >zR,>D X@K@K!@@`@p@ X@ y@@؁@|L@Ps@?T@bd@Z@H@é!@`;@+!@ |0 B Q]RhR,h  |0 TH. t XH |LK|L. |L$K&*2 X6|L:é!<|L@KDLpP`; COLLATINGSEQUENCEJ |0 PP)    `;  CHECKSEQUENCE |0 Z Z  `; "" DUPLICATES |0 b b" 1  "`; .. NODUPLICATES |0 hh.*@  . `; < <KEYS |0 rr<P  1   <`; B BSTABLE |0 B@   B `; JJ STATISTICS |0 J!   J`; VV SPECIFICATIONC |0 V   V  `; ee TREESPACEE |0 e|"  e| p`; p pFORMAT |0 p E  p `; xxINDEXEDSEQUENTIAL |0 x@  x@ `;  SHAREABLE |0 #   p`;  ALLOCATION |0 h   h `;  BUCKETSIZE |0 ,   , `;  CONTIGUOUS |0   `; FORMAT |0  E   `; INDEXEDSEQUENTIAL |0 @  @ `; LOADFILL |0   &   `; OVERLAY |0  ' 1  `; RELATIVE |0   1  `;  SEQUENTIAL |0 $\$    |  X|L+!H?T X$|L(+!*H4 X8|L<+!>ZD?TH XL|LP+!RHX?TX| | X|L +!H?T X|L d"|L&*p.|L24|L8:Ps>B XF yL|LPTpb - B  (  )D|L |L X|L X - (p,|L02|L6 : X>؁D|LH J؁PT XX|L\D^|L..2,D v :2 X ؁|LDp|L"v*`; SIZE |0 XX  , &   , X`;  FSZ |0 n.n%, J  , X|L|LK!H"?T&p*`;   FIXED |0     `;  STREAM |0    `; VARIABLE |0    `; "" RMSSTREAM |0  "  "`; -- CONTROLLED |0 -"  - X@` 99F |0 9  9 X @` ;;S |0 ;  ; X @` ==V |0 =  = X @` ??C |0 ?   ? X `; AA BLOCKSIZE |0 `A ,( )2Jbb,r~  A , X؁|L00vATADATADATA؁$(p,|L022|L6J8|L`; bb ASCIIZONED |0  b  b`; nn ASCIIFLOATING |0 n-"  n|L `; }} DIBOLZONED |0 $ $},  }`;  CHARACTER |0 ,, 1"  |L `;  DFLOATINGH |0 :: 1    `;  FFLOATING |0 FF    `;  PACKEDDECIMAL: |0 R R  `;  ASCENDING |0 Z Z.  `;  DESCENDING |0 b b/  `; POSITION |0 jj0T   T`;  SIZE |0 x*x1 12  Ps X X&@` 8 |0  1$   X X@` 4 |0 $ <   X |L+!H?T X `;  BINARY |0 6 @ @,D  |L  X X ؁&|L*.p2`;  SIGNED |0    `; UNSIGNED |0 +   X`;  DECIMAL8 |0 6 @4 @ ,FD  |L 4 X X ؁&|L*F.p2`; UNSIGNED |0 N N  `; OVERPUNCHEDSIGN |0 V Vt  t`; "" SEPARATESIGN |0 ^ ^"  "`; 00 TRAILINGSIGN |0 f f0  0`; >> LEADINGSIGN+ |0 nn>  > p`; KK ,TRAILINGSIGN |0 | |K  K`; ZZ ,LEADINGSIGN |0 Z$  Z Xp`; hh ,TRAILINGSIGN; |0  h  h`; ww ,LEADINGSIGN |0 @w  b  w X X|L+!|LK & X*|L.d0|L48p<`;  ASCII |0    `;  EBCDIC |0    `;  MULTINATIONALI |0  "    X@` A |0    X @` E |0    X @` M |0    X `;  MGE |0 FPX=PD@,Pb   X X؁ X|L D"|L&* X.؁4 X:>pB`;  AL: |0 ` `  `;  BL: |0 h h  `;  BU: |0 ppCO"  `;  FO: |0 RE SE (  `;  SI:G |0 xLO&OV' AIN@  00 > AIN !&  `;  KE: |0 PP ST"   `;  -ST |0 bb SS!SH#$  `;  CS: |0 zzND*"  `;  PT: |0 j~:@@h01~  ~ X X X X" X&؁, X4 X8|L<>|LBF XJ XP|LTV|LZh\ Xb X:ZSCDJKIFPA-L,U+l X؁|Lp؁"؁*؁2؁:؁B؁J؁R؁Z؁b؁j؁r؁|pBlN.O/), F؁ ؁ X X" X& X. X2؁8 X>`;  /SF |0  Input file? Specification file? Output file? Illegal qualifier value ) expectedPosition value requiredSize value r    & equiredRecord size requiredb 0Zw0D X@p@؁@ |0 (dh+!h |0 ,:=:=,p؁؁ Xp؁$؁b 0J}0DD@K@ |0 h |0 /=,KDb 0Zu~@0D X@؁@|L@H@ |0 0Rh |0 4:@:6 XH؁H|L" X&؁,Hnb >z}@Q>DLe^@@`@p@ X@@؁@@|L@y@d@"@Z@Bw@`;@w@ |0 x嫈rh  |0 4TT>HT>VT>TI>RT>Hp>>> &>(.>0`; TERMINAL |0 040Pd :V  Py d XZ؁$p(|L,d."0@`  TI: |0 `` (   X wyLe^wDb 0zh~0DZ@:@ X@""@y@p@W@r@ :|0  h |0  Xy >&f@НН Е:@`w.WWZ:6""8rIllegal UIC: [ expectedIllegal UIC: numeral expectedIllegal UIC: , expectedIllegal UIC: ] expectedp؁؁b ~̀bZ~̀Dp@ X@؁@|L@H@ |0 *5ph |0 .P-;.0 X|L ؁Hp ؁&؁b tXriptXDp@ X@L@؁@|L@K@ |0 q\;h\;h |0 u X 8[PP]<00vATADATADATAPP>>]<[ !Illegal directory formatn X|L Xp|L |L 8$ X(؁.L2P4؁< X@؁FLJPL؁UKb ҀzKҀD&s@@+ @+ @p@n"@aK@e@ X@@L@؁@z@|L@@p0@y@FVN@X!@K@p@$98@\;@Fy@r@w@&@B@w@iZq@ |0 ^ :h^%:h |0 ` $F  @ X|L py$y"$F( X,w4y8Fy:y >@wJ XNwV|LZet\ @ @ " P@""" P  |L\;|L|Ln"w(p,؁68|L<@ XDLHJ|LNRpV\^؁f Xj&$ @@"Illegal filespec|Lp0K & & & && & & & Ε& Ε %w5H5U5@ U5VX!+ "+ (FVN:$98  p |L&|LN X"؁(`; % %ENTRY |0 4 4%  %@` ,,/EN |0 :&:, @/@  ,|L Gw Z?T X؁"`; 0 0JOB |0 \6\0 t@ \  0|L R8^ |Lt X |L$ip& p߂. X2`; 5 5QUE |0 5  5 X `; ; ;/REL |0 N;Illegal queue nameEntry number? Illegal job name Job name? Queue?   ;:-b z*y}D X@K@K!@@`@p@K@ X@ y@@؁@|L@Ps@z?T@d@Z@Z@@H@é!@`;@+!@ |0  *y}hyh u |0 THz .  t XH |LKz |L. |L$K& *2 X6|L:é!<|L@KDLpP`; COLLATINGSEQUENCE |0 PP)2  2 `;  DUPLICATES |0 Z Z 1  `;  NODUPLICATES |0 ``*@   `; - -KEYS |0 jj-P   -`; 3 3PROCESS |0 z z3 1   3`; < <STABLE |0 <@   < `; DD STATISTICS |0 D!   D`; PP SPECIFICATIONE |0 Pf  P f `; __ WORKFILEST |0 _|   _|`; jj TREESPACE |0 j"  j p`; u uFORMAT |0 u A  u `; }}INDEXEDSEQUENTIAL |0 }2J  }J `;  SHAREABLE |0 #   p`;  ALLOCATION |0 r   r `;  BUCKETSIZE |0 6  00 +!@ZF?TJ XN|LR+!THZ?T:   @^ X|L +!H?T X|L +!"|L&( *|L.2 X6@` : |0 ^@:,   |L  XKZ؁& X*|L.d0|L48p<|L@B|LF,HPsL P XT yZ|LdNhB  B Tn(n ) p |LN|Lh X|L"B$ X( 0p4|L8T:|L>nB XF؁L|LPnR؁X \ X`|L4v,  D|L  X؁|L p$|L(0`;  SIZE |0   6< &   6 X<`;   FSZ8 |0 . %6 J  6 X|L|LK!H"?T&p*`;  FIXED |0      `;  STREAM |0    `; VARIABLE |0  $  $`; )) RMSSTREAM |0  )  )`; 44 CONTROLLED |0 40"  40 X@` @@F |0 @  @ X @` BBS |0  B  B X @` DDV |0 ,,D  D X @` FFC |0 88F   F X `; HH BLOCKSIZE |0 D`DH 6(h ) ,~  H 6 X؁|Lh؁$ (p,|L02|L68|L<@ XD|LHJ؁P|LTX X\|L, *؁ |L X`; SS RECORDSIZE |0 S6 "  S6 X`; __FILESIZE |0 Z_6  ( ) 0 ~  _6 X|L+!|L p$|L(*|L.2 X6؁<|L@B؁H L XP|LT0V XB B BTB,TT X  X|LT |L$B( X,؁2|L6T:p>`; ii ASCIIZONED |0 \ \i  i`; uu ASCIIFLOATING |0 ddu-"  u|L `;  DIBOLZONED |0 r r,  `;  CHARACTER |0 zzb 1"  |L b`;  DFLOATINGH |0  1    `;  FFLOATING |0     `;  PACKEDDECIMAL: |0    `;  ASCENDING |0  .  `;  DESCENDING |0  /  `; POSITION |0 0^   ^`;  SIZE |0 *1  12  Ps  X X&@` 8 |0 00vATADATADATA 1$   X X@` 4 |0 $ <   X |L+!H?T X `;  BINARY |0 "6" @: @,LD  |L : X X ؁&|L*L.p2`;  SIGNED |0 T T  `; UNSIGNED |0 \\+   X`;  DECIMAL8 |0 j6j @ @ ,D  |L  X X ؁&|L*.p2`; UNSIGNED |0    `; OVERPUNCHEDSIGN |0    `; )) SEPARATESIGN |0  )  )`; 77 TRAILINGSIGN |0  7  7`; EE LEADINGSIGN+ |0 E  E p`; RR ,TRAILINGSIGN |0  R  R`; aa ,LEADINGSIGN |0 a$  a Xp`; oo ,TRAILINGSIGN; |0  o  o`; ~~ ,LEADINGSIGN |0 .~  D  ~ X X|L+!|L &p*`;  RECORD |0  6  6`;  TAG |0   B  B`; ADDRESSROUTING |0 ( (N  N`;  INDEX |0 00Z"  Z X@` R |0 >>   X @` T |0 JJ   X @` A |0 VV   X @` I |0 bXb  ( )~   X |L+!|LK  X"|L&d(|L,0p4|L8:|L>B XF؁L|LPR؁4 , J  X |L|L X؁$|L(,p0`;  NUMBER |0 6   6 `;  DEVICE |0     `;  ALLOCATION |0  1   `;  CONTIGUOUS |0  !   `;  NOCONTIGUOUS |0     `;  SIZE |0 :6  D\  6 X|L+!H?T X$|L(d*|L.D2p6`;  ASCII |0 L Lb  b`;  EBCDIC |0 T Tn  n`;  MULTINATIONAL |0 \\z"  z X@` A |0 jj   X @` E |0 vv   X @` M |0    X `;  SRT |0 FP=P@b ,Pb   X ؁ X|L "|L&b * X.؁4 X:>pB`;  AL: |0  (  (`; # #BL: |0  #4  #4`; ( (BU: |0 (@CO"  (@`; - -FO: |0 -LRE SE (  -L`; 2 2SI:R |0 x2^LO&OV' AINj@| :|  2^ j$ X( X0 X4 X< X@ XH XL XR|LV|Z X^ Xf Xj؁p X|:%( X؁ X00  ST"  \> `; a a-ST |0 a SS!SH#$  a`; f fCS: |0  fV ND*"  fV `; k kPT: |0  h kJ :h  @ @ ~  kJ X X X X" X& X. X2؁8 X@ XD|LHh J|LN R XV X\|L` b|Lf ~ 01:h ZSCDJKIFPA-L,l X X X؁|L h $p(؁0؁8؁@؁H؁P؁X؁`؁h؁p؁x؁ U+N.O/ ), z؁p؁؁$ X( X0 X4 X< X@ XH XL XT XX X` Xd Xl Xp؁v X|`;  p p/SF |0 v v p Input file? Specification file? Output file? Illegal deviceIllegal qualifier value ) expectedPosition value requir   p/ edSize value requiredRecord size requiredb >j>Dp@ X@؁@|L@`@ |0 m8hm8h. |0 h Rv  ,  dR,d[< X|L Rv`؁ `&(|L,d.2 X6|L:R<`B؁H`N|LRdVpZ؁`؁|d]>Illegal UIC: [ expectedIllegal UIC: numeral expectedIllegal UIC: , expectedIllegal UIC: ] expectedp؁؁b ~̀b5p~̀Dp@ X@؁@|L@H@ |0 <n"h |0 @P-*;.*F X|L ؁|L*p ؁&؁.p2؁8Hb 0RW0D X@؁@&@ |0 p0h |0 . X؁&b 0R.0DK@ X@؁@ |0 Wh |0 . X؁K b zt!D X@K@p@Id@a}@a}@ X@G@؁@|L@ :@Z@Z}@é!@`;@+!@^%:@ |0 1Qht!h  |0 6~p S@eXe S@Tp|L ~|L Xp|L @"&(|L,X0|L4@ To?  |0 2d2dd p C@  ~   Xp|L :"|L&^%:* X.p0|L4é!6|L:@<>BpF|LJR|LV^|Lb 1 |L p`;  TODAYQ |0 0 1A   `;  SINCE |0   1    `;  THROUGH |0   1    `;  DATE |0 0 1    `; " "EXCLUDE |0 "@t 1  " t `; + +SHARED |0 + 1  + `; 3 3REWIND |0 3} 00vATADATADATA1  3 p`; ; ;LOGQ |0 ;!  ; p`; @@WARNINGS |0  @ 1  @`; JJ NOWARNINGS |0 &Jo (.  J p|L(p"`; VVDATATYPE |0 0 0V  V`; ` `SUBMIT |0 8 8`n  ``; h hPRINT |0 @ @h  h`; o oMACY11 |0 H Ho  o`; ww TRANSFERMODE |0 P Pw  w`;  PROTECTION |0 X X   `; OWNERo |0 `T`p0 |  0 |L|L X|L +!"|L&^%:, X0|L4+!6|L:a}B XF|LJ+!L|LPa}0P X|L +!|La} X|L+! |L$(p,`; ASCII |0  g  `; IMAGET |0 $j:  X|L+!|Lp `;  AUTOMATIC |0    `; BLOCK |0     `; RECORD |0  0  X|L+!|LG Protection code? |0 *`*pD [ l  ]/ , |  X|L+!|LD X"؁(Z.0|L4l6Z<>؁FpJ؁P؁X X\`;  /ERRORLOG |0  @  `; /DELETE |0   @(  |LK`; /DELETE |0 > B D F  p|L|L"}*|L.Id6 X:`; ELI |0    X `; /AP |0  @  `; /DEJ |0 C File(s)? File to append? Illegal UIC: numeral expected   b 0zvLI0D]@`@""@:Z@)@'@@)p@2&@ X@@""@z6@[Z@y@)W@K@'""@}@p@%p&@Bx@E@r@e@hp!@Z@*s g@;M)@ |0    |0 |0  Xy p{&f{E`W &   Mne"]&;M)(s g,e26Bx:PTX2&\E`'b)fhp!lZdn 7 wՕ\g&  ȥ Ћ w& e|E)W[Z  :Zs g s g%p&"" r$p(K2]HE)p LE)p TEX}Lw w  wwpE)p E)p E}]"E&`064%p&:'""K@ DDHpL`; LIBRARYp |0 L L  `;  PASS |0 T(T Z:1:2 1A4  Z p p$`;  LIST |0 xx!   `;  NOLI00 (b ) p|L  X؁|Lb؁$ ( X,|L02p6p:|L>é!@B|LFH|LLP XT|LXd   1. X |L p`; ~~ABSOLUTE |0 ~ 1  ~ `;  AUTOMCALL |0 = 1  `; BINARY |0  1  `;  CARDFORMAT |0  1  `;  CASEMATCH |0 ? 1  `; DEBUG |0 A 1  `; GLOBAL |0 @ 1  `; LOCAL; |0  1  `;  LOWERCASE |0  1  `; REGISTERDEFINITIONS |0  1  `;  TRUNCATION |0 ^(<~(V ) d~  X|L+!(p|L"<$|L(*~. X2؁8|L؁D H XL|LPRdVpZ|L:l~   1^é!|L ~|L X|Ld $ X(|L,. 2p6`; ABSOLUTE |0  1  `;  AUTOMCALL |0 > 1  `;   BINARY |0   1   `;  CARDFORMAT |0  1   `;  CASEMATCH2 |0 @ 1   `; ( (DEBUG |0 (B 1  ( `; / /GLOBAL |0 /@ 1  / `; 7 7LOCAL; |0 7 1  7 `; >> LOWERCASE |0 > 1  > `; IIREGISTERDEFINITIONS |0 I 1  I `; ^^ TRUNCATION |0 ^ * .  ^ p|Ld*@` jjALL |0 \ j<"@>(X ) f|  jp|L>|L" X&؁,|L0X2؁8 < X@|LDFfJpN|LRé!TV|LZ0x   J|L X|Ld X|L"$ (p,`; n nALL |0 n<"@   n `; s sNOALL |0 sC"@   s `; z zBINARY |0 z"   z `; NOBINARY |0 ,"    `;  CALLSL |0 "    `;  NOCALLSL |0 -"    `; COMMENTS |0  "    `;  NOCOMMENTS |0 00vATADATADATA."    `;  CONDITIONALS |0 !"    `; NOCONDITIONALS |0 /"    `; CONTENTS |0 ""    `;  NOCONTENTS |0 ((0"    `;  COUNTER |0 44#"    `;  NOCOUNTER |0 @@1"    `;  DEFINITIONS |0 LL$"@    `;  NODEFINITIONS |0 XX2"@    `;  EXPANSIONS |0 dd%"    `; "" NOEXPANSIONS |0 pp"3"   " `; 00 EXTENSIONS |0 ||0&"   0 `; << NOEXTENSIONS |0 <4"   < `; JJLISTINGDIRECTIVES |0 J'"   J `; ]]NOLISTINGDIRECTIVES |0 ]5"   ] `; rr OBJECTBINARY |0 r("   r `; NOOBJECTBINARY |0 6"    `; SEQUENCENUMBERS |0 )"    `; NOSEQUENCENUMBERS |0 7"    `;  SOURCE |0 *"    `; NOSOURCE |0 8"    `;  SYMBOLS |0 +"    `;  NOSYMBOLS |0 9" " .  p|Ld"@` ALL |0 Z"@6x(P ) ^x|   p|L6|Lx X$؁*|L.P0؁6 : X>|LBD^HpL|LPé!RT|LXx0p   J|L X|Ld X|L"$ (p,`;  ALL |0 C"@    `;  BINARY |0 ,"    `;  CALLS |0 -"    `; COMMENTS |0 ."    `;  CONDITIONALS |0 /"    `;  CONTENTS |0  0"    `;  COUNTER |0 1"    `;  DEFINITIONS |0 2"@    `; ** EXPANSIONS |0 *3"   * `; 66 EXTENSIONS |0 64"   6 `; BBLISTINGDIRECTIVES |0 B5"   B `; UU OBJECTBINARY |0  U6"   U `; ccSEQUENCENUMBERS0 |0 ,,c7"   c `; t tSOURCE |0 88t8"   t `; | |SYMBOLS |0 DPD|9"    B\  | X X X X$ X* X2p6|L:@|LDH XL`;  MAC @N |0 $   X X`;  MAC |0 nA@,A@=l   1EN  1DS b  |L  ؁|L؁"|L&l *p. X4 X:W@WHpLVXbbfpj`;   :AMA |0     `;  :ABS |0    `;  :CDR |0    `;  :DBG |0 $ $A  `;  :GBL |0 , ,  `;  :LCM |0 4 4?  `;00   `;  :REG |0    `;  :FPT |0 N    d   p XW|L"$(p, X2 X8 X> XF XJ`;  /-SP |0  $   X W`;  /SP |0 T 1LI< !LIP 1NLC !NLCR ^^^  p P *24> XB|LF^H^LpP`;  :MEB |0 f f  `; % %:MC |0 n n%  %`; * *:COM |0 v v*   *`; 0 0:CND |0 ~ ~0!  0`; 6 6:TOC |0  6"  6`; < <:LOC |0  <#  <`; B B:MD |0  B$  B`; G G:ME |0  G%  G`; L L:BEX |0  L&  L`; R R:LD |0  R'  R`; W W:BIN |0  W(  W`; ] ]:SEQ |0  ])  ]`; c c:SRC |0  c*  c`; i i:SYM |0  i+  i`; o o:TTM |0 $o;8  o X|L|Lp `; u u:MEB |0  u,  u`; { {:MC |0  {-  {`;  :COM |0   .  `;  :CND |0   /  `;  :TOC |0   0  `;  :LOC |0   1  `;  :MD |0 & & 2  `;  :ME |0 . . 3  `;  :BEX |0 6 6 4  `;  :LD |0 > > 5  `;  :BIN |0 F F 6  `;  :SEQ |0 N N 7  `;  :SRC |0 V V 8  `;  :SYM |0 ^ ^ 9  `;  :TTM |0 f f :P  ,P MLPA  File(s)? Illegal qualifier value ) expecte\   X X |L  X"؁( X. 2p6>D H XL X d$b 0r` 0D X@ X@L@؁@K@ |0 $` hQ` h  |0  P" XL " File? |0  @@"  X؁ XKb ҀzyXKҀD&s@+ @@+ @p@n"@K@ X@@L@؁@@z|L@00vATADATADATA@p0@y@FVN@X!@K@p@Z@$98@\;@Fy@r@@w@J&@@w@iZq@ |0 b :h%:h |0 V Q 2J@ X|L Qp|L |L 2$ X(y,.|L2J6 X:y>@wDF|LJNpR|L`R\   \|L  Xw|L$y(Fy*y .0w6 X:wByFFyHy LNwT XXwp @4 @ @ " PL@"""~|L4|L\;|L|L"n"(w2p6؁@B|LFJ XNLRLT|LX\p`fh؁L P  @@:"]Illegal filespec@ X&|Lp0 X"K(Z.؁8K & & & && & & & Ε& Ε %w55(E5U5@U\X!+ "+ (FVN:$98 >SHARED |0 ` `>  >`; FF PRESERVE_DATE |0 h hF 1  F`; U UOVERLAY |0 ppU   U `; ^^ NONEW_VERSION |0 zz^   ^ `; mm -NEW_VERSION |0 m 1  m p`; { {REMOTE |0 {@!  { p`; WARNINGS |0   1  `;  NOWARNINGS |0 o  p`;  CONCATENATE |0  1  `; LOG |0   `;  DATACHECK |0 :  NE nDB  p|L|LN&|L*n2p6`; DATATYPE |0   ,  ,`; PRINT |0    `; SUBMIT |0  n  `; MACY11 |0 " "  `;  TRANSFERMODE |0 * *T  T`;  PROTECTION00  f 6   |L>|Lfp`;  ALLOCATION |0 VV   `;  OWN |0 ` `  `;   SPANBLOCKS |0 hh    p`;  CONTIGUOUS |0 v v  `; ! !REPLACE |0 ~ ~!  !`; ** NEWVERSION |0  *  *`; 66 NOSPANBLOCKS |0  6  6`; DD -SPANBLOCKSL |0 D   D `; Q QDOS |0 Q@   Q `; V VSILENT |0 XVB@ |  V X|L+!|L^%:" X&|L*+!,|L0a}8 X<|L@+!B|LFa}J XN|LR+!T|LJg>ha} X |Ld` X |L$K!&`0 X4|L8+!:|L>>BpF`; ^ ^ASCII |0 F F^g  ^`; e eIMAGE; |0 N$Nejf:  e X|L+!|Lfp `; l lAUTO |0 n nl  l`; r rBLOCK |0 v vr  r`; y yRECORD |0 ~~y 0  y X|L+!|LG Protection code? |0 np [   ]/ , B@F B~   X|L+!|L X"؁(Z.0|L46Z<>؁FpJ؁P؁Xp\ XdFf X& D 2|L }|LId X"`;  MFT |0  d@   X `;  /REM |0 ,,=e@$  ؁ X`;  /REM |0 @@   X`;  FLX |0 NNd@   X `;  /DO |0 Z ZB  `;  /SIJ |0 b b  `;  /IM/UI/-RW= |0 jje@   X `;  /DO |0 vKvFrom? To? Illegal UIC: numeral expectedMust supply a filespec   b zXD X@p@ X@@؁@|L@`;@ |0 }h 6 |0  X`; NFT |0 d@" 6@@pPd^=PeJ,Pe~  |L " |L6 Xp X" X(^*؁2 X6 X<>|LBJF XJ؁P XVZp^|LbhAPdDEh 1AT 1BRe 1CFUk 1CLImMELONMoRE{v|L p|L|Lp"*2<FPR\^fnv~fDC:ASgAXBKCOIMjNVRCSUX X؁ Xp"*2:BJRZb`;  RAT:NOSPAN |0 F F  `;  RAT:MACY11 |0 NzNSBnSP FO QPRpEXi:SYOWGRWOFO   "*,6 X:؁@ XHpLRTZ\bdjlrv X::::ASgAXBKCOIMjNVt؁ X X؁ X$ X(؁00vATADATADATA. X6 X:؁@ XHpLT\dlt|@RCSU`;  RAT:NOSPAN |0 P P  `; ** RAT:MACY11 |0 XzX*SBnSP FO QPRpEXi:SYOWGRWOFO  * "*,6 X:؁@ XHpLRTZ\bdjlrv XH::::D؁ X X؁ X$ X(؁. X6 X:؁@ Xb @ze @D<;@ X@K@K@@`@p@Id@ѫ@8^@H @K@ X@zG@؁@|L@G@ :@d@W@Z@;@}@Z@@w@`;@+!@:w@ |0 Ge hQh P |0  p`;  /DIRECTORY |0     `;  /CFL |0 $ fD P>   |Lf XDw|L "   DIR` |0 22 P  0  w |L;p`;  ALLOCATION |0 LL    `; ## PROTECTION |0 VV#   # G `; / /LABEL |0 bb/ t   /t `; 66OWNERUIC |0 l^l6  :  6 X|L+!|LH  X"|L&+!(Z0 X4|L8d:|L>B XFKLZR؁Z X  |L K @@ Source file? |0 @P*  @|L Kp`; N NOPTIONS |0 N !A  N`; WWINTERMEDIATEFORM |0 W* 1  W* `; iiNOINTERMEDIATEFORM |0 i 1A  i `; } }LIST |0 }8 1  } 8 `; NOLIST |0   1A  `;  SYMBOLFILE |0 F 1   F `;  NOSYMBOLFILE |0 "f"TTT "d @gB|  X|LT X|L"T( X,|L0T6 X:|L>d@|LDKH XLN|LRT"X Xb@`  TI: |0 He   `  p|L :|LK p$|L(.|L28|L<@pD`; LOG |0 !  p`; WARNINGS |0   1  `;  NOWARNINGS |0 o  p`; SUBMIT |0  n  `; PRINT |0    `;  CONTIGUOUS |0    `; MACY11 |0    `;  NEWVERSION |0    `; NOSPAN |0    `; REPLACE; |0    `;  PROTECTION |0 & &6   6`;  OWNER |0 ..pL 4  L X|L+!|LG Protection code? |0 FhFp` [ ) ) ]/ ,J~   X|L+!|L` X"؁(Z.)0|L46Z<)>؁FpJ؁P؁Xp\|L`Jdp& B8|L}|L|LId X"`;00 pB`; / /PRO= |0 /B  / 8^`; 5 5ALLOC= |0  52  52`; = =OWNER= |0 $2$=>  @  => X X X X" X* X.`; E ECFL |0 R.RE@@=@@L  E|L  |L|L؁ X$|L(*`; K K/OP |0 |v|K, , @,  K p X X|L" X&؁,|L08p< XB|LFL XP؁V؁`|Ldhpl Xr|L],Device and UFD?File? Illegal UIC: numeral expected$ XW X؁ Xb >zY>Dp@K@ X@@L@؁@|L@K@-8@ |0 Xh2hh |0 j @D::@D:: ::Vn" XK|LD X"K(|L,D.6 X:K@HpL|LPVR|LVnZ X^؁dLhff"/@::@/P@/؁ X؁|Lp"|L&-8(L,.2p6<|L@D XH؁NLRT|LX\ X`؁(P":/:Illegal node nameLKKKb >ze^>DLe^@p@K@ X@؁@@|L@@y@Z@w@w@* |0 "h"hN |0 ^ "6 :Z~ X|L py"y "6& X*w.y2Le^4w: X>KDZJ؁R XV|LZZkZp  :Device syntax errorIllegal device^bpy py Xw"y&Le^(w. X2K8:Z@؁b zysD X@ p@K@p@ X@@L@؁@|L@R8^@K@Ps@b?T@d@Z@嫈r@`;@+!@ |0 jyshQyh  |0 \ 08~ @ /P[V?|p|L 0|L8|L~|L"(|L,4 X8؁>|LBPD|LHR8^JVL?PTpX`;  PROCESSOR |0 X X   `;  APPLICATIONSPROCESSOR |0 ^^   `; " "DEVICE |0 h h"  "`; * *PRINTER |0 n n*   *`; 33BATCHPROCESSOR |0 tt3   3 `; CC CARDREADER |0 ~~C   C `; O OINPUT, |0 O    O p`; V VALIGNC |0 V0  V `; ]] BACKSPACEO |0 ]0$   ]$`; hhCONTINUE |0 h   h `; rrFLAGPAGE |0 r0$  r $`; | |FORMS |0 |0$  | $`;  FORWARDSPACE |0 0$  $`; NEXTJOB |0    `; PAGE |0 0$  $`; RESTART |0    00$vATADATADATA  `;  TOPOFFILE |0 2   /AB   X|L+!Z ?T$ X(؁.`; QUEUE |0 FFRd ,  R|L dp`; MANAGER |0 Z6ZB b, /D  p X|LR8^ b",( X,؁2`;  ACCOUNTING |0 ,PP>  L K X p߂$p(`; UNBLOCK |0   /0  |L 嫈r X؁`; ERRORLOG |0 8@ AZ  |L  X|L X |L$+!&|L*K0p4`; INCLUDE |0 0  0 `;  NEWVERSION |0    `; LIMITING |0   1  `;  UPDATE |0  1   `;   ZERO |0 (,( BTD   X|Ld|LBp"|L&T(Ps "Illegal or ambiguous argument |0 PRPf(),t  p |L|Lf X؁$|L(*|L.0؁8 X<؁B|LFJpN`; . .ALL |0  .  .`; 3 3CONTROL |0  3  3`; < <ERRORS |0  <  <`; D DMEMORY |0  D  D`; LL PERIPHERALSi |0  L  L`; YY PROCESSOR |0  Y  Y`; ddSYSTEMINFORMATION |0 Ld B B B RB@,`  d p|L|L|L"(|L,2|L6R<|L@,D XH`; w wQUE |0 w  w X `; } }/STA |0 ""}@2@h2  }|L 2 Xhp`;  :PA: |0 : :  `;  :BA: |0 B B  `;  :FW: |0 J J  `;  :NE |0 R R  `;  :RE" |0 Z Z   `;  :PA:0 |0 bb AL$   p`;  FL: |0 x x  `;  FO:; |0 N^   X X X X" X& X. X2 X: X> XF XJ`;  QUE |0     X `; /STA:QUE |0    X `;  QUE /STA:QMG |0 (@@>   X |L X X p$`;  UNB |0    `;  UNS |0   p `;  TERM= |0   .    X X X`;  START/ACC |0 4*4@@ :  |L @ X؁ X" X&`;  ELI |0 ZZ@A   X `;  /LOG |0 ffl"  l p`;  TY: |0 ttNV"  `;  LIM |0    `;  -LIM |0 ,UPZE  4  p|L"(00, pB`;  ALL |0 xCEMPEPRSYIllegal queue nameIllegal processor name Processor? Queue? .  ؁؁؁ (0b Xz* XD X@K@p@K@ X@@؁@|L@d@W@Z@H@Bé!@`;@ |0 * hQ*h } |0 <0 0  1` X0 |LK|L X 0"|L&é!(|L,K.4p8`; CHECKI |0 88   `;  CODE |0 BBN 1  N `;  EXTENDSOURCE |0 LL  1A  `;  LIST |0 VV  1    `; ! !NOLIST |0 bb! 1  ! `; ) )-LIST |0 ll)   ) `; 00 MACHINECODEK |0 vv0 $  0`; == NOMACHINECODEH |0 = $  =`; LL -MACHINECODE |0 L $   L`; Z ZNAMES |0 Z  1A  Z `; a aOBJECT |0 a@ 1  a  `; iiNOOBJECT |0 i@ 1  i `; s s-OBJECT |0 s@ 1A  s `; ||OPTIMIZE |0 | 1  |  `;  NOOPTIMIZE |0  1  `;  -OPTIMIZEE |0  A  `; READONLY |0 HA  H `; SHOW |0 $~  ~`; NOSHOW |0  $  `; -SHOWC |0 $   `; STANDARD |0 &&" A  `; TEST |0 22 1   `;  TRACEBACKM |0 <<   `; WIDTHE |0 FjF @(  |B )B    X|Ld؁ |L$&(|L,|2|L6: X>|LBé!D|LHLpP؁Z X^fp 1`; EIS |0  1  `; FIS |0  1  `; FPP |0   1  `; PIC |0 ! 1  `; POSITIONINDEPENDENTCODE |0 b! @6  X|Ld|LK X$|L(d*|L.K4 X8|L<d>KH XL|LPdR|LV6XH 6 X`;   LEVEL |0 >(> :Z 1@  ؁ X|Ld|LZ p$`;  NONE |0 bb 1   `; PUREDATA |0 ll 1   `; " "ALL |0 vjv" @(  B )B |  " X|Ld؁ |L$&(|L,2|L6: X>|LBé!D|LHLpP؁Z X^fp`; '' EXPANSIONS |0 '$  '`; 33 NOEXPANSIONS |0 3$   3`; AA -EXPANSIONS |0 A$ 004vATADATADATA  A`; N NSYMBOLS |0 N$@  N`; WW NOSYMBOLS |0  W$  W`; bb-SYMBOLS |0 00b$  b`; ll STATISTICS |0 @@l $  l`; xx NOSTATISTICS |0 PPx $  x`;  -STATISTICS |0 `` $  `;  SOURCE |0 pp@$  `; NOSOURCE |0 @$  `;  -SOURCE |0 @$  `; OVERRIDE |0  $  `;  NOOVERRIDE |0  $   `;  -OVERRIDE |0  $   `;  ALL |0 "*  `;  NONE |0 D"T  V   X|LdZ$ X(|L,d.0Z6< X@`;  COR |0 d@:@X=,j |  |L : |LX؁|L p$ X* X0W6W> XB؁H|LLjPpT XZ\Wb ~ B* X  X X`;  /-SP |0 $   X W`;  /SP |0 @P,PBCT   X X|L X ؁& X,0p4<`;  -BC |0     `;  IS: |0 PI!"   `;  -CRZ |0 CR   `;  PS: |0      `;  OP: |0    `;  OP:0 |0 & &   `;   RO: |0 .F.  LIB NLB8tIET    8" X(t* X02 X8:B`;  -IE |0 p p   `;  TE: |0 xxTR"   `;  -TR |0     `;  WI: |0 x  10121|   p X X X$ X( X0p4 X:؁BpF؁N؁V؁^؁f Xj|Lnptp`; # #:MEX |0   #  #`; ) ):SYM |0  )  )`; / /:STA |0  /  /`; 5 5:SRC |0 " "5  5`; ; ;:ONL |0 * *;   ;`; A A:OBJ |0 2 2A FF2  A X|LFFp`; G G:MEX |0 N NG  G`; M M:SYM |0 V VM  M`; S S:STA |0 ^ ^S  S`; Y Y:SRC |0 f fY  Y`; _ _:OBJ |0 nn_ LI.  _ X|L`; e e:ONL |0 "eNL4  e X |L X`; kk:MEX:SYM:STA:SRC |0 \k0 File(s)? Illegal valueIllegal argument or missing )(  kp X؁ X Xb 0jQ0D X@ X@L@K@ |0 00< ƀrRv>ƀD X@ X@L@K@`;@ |0 (QyhRvh  |0  X`;  /ERRORLOGX |0 .  L K X`;  SSM |0     Xb z;dD X@K@K@K!@p@K@ X@ y@@؁@|L@d@RW@Z@é!@`;@ |0 ;dhQ;dh$ ? |0 ft@ 2 2B H \\t Xt |Lp|L2 |L$2*|L.H6 X:|L>K@D|LH\L XP|LTKX|L\\` Xdtb  2|Lé! |LKp`; CHECK |0 ||E  `;  CODE |0 M  `;  ERRORLIMIT |0    `; IDENTIFICATION |0    `; ))NOIDENTIFICATION |0 )   ) `; ;;-IDENTIFICATIONL |0 ;A  ; `; L LLIST |0 L   L`; R RNOLIST |0 R0   R `; Z Z-LISTM |0 Z0   Z `; aa MACHINECODE |0 a A  a`; n nOBJECT |0 n @  n`; vvNOOBJECT |0 v@  v`; -OBJECT |0 $$@   `; STANDARD |0 22E  `;  TRACEBACK |0 @@  `;  NOTRACEBACK |0 PP  `;  -TRACEBACK |0 ^^  `; USING |0 l>lxV   x X|LK!K$ X(|L,d.|L26p:`; FIS |0    `; FPP |0    `; EIS |0 6R   X |LdZ X |L$d&|L*.p2`; LINES |0    `; NONE |0    `; BLOCKS |0 @  :d   X |LK!|LK X |L$K!&|L*K0p4 X::<`; PAS |0 4P4: Nx @,@=r  : p yN|Lx X"؁(|L,.؁4|L8:؁@|LDH XL`; /ID |0 ^       t  p X XW W(p, X24W:< XBDWJL XRV XZ`; /-SP |0  B  `; /MA |0  $  XW`; /SP |0  B  `; /MA. |0 B P(,P(CKT  X X(|L X"؁( X.(2p6>`;  -CK |0 88~00DvATADATADATA,  |L ~|L`;  -ER |0 PPIDST$  `;   -ST |0 h h   `;  -TR |0 p p2  |L p|L`;  CD:EIS |0    X `;  CD: |0 .   Xp|L`; " "ER:30. |0 "  " X `; * *ER: |0 *.  * Xp|L`; // TR:BLOCKS |0 /  / X `; : :TR: |0 : File(s)?   : Xb Pze"PD X@ p@K@K!@@`@p@Id@a}@a}@H @K@ X@z؁@|L@ :@R8^@?T@d@Gw@Z@}@@H@é!@^ :@ip@`;@:+!@ |0 ]Qh e"h } |0  p`; /ENTRY |0 F   F `;  /JOB |0 j  j `;  /QUEUE |0    `;  /PROCESSOR |0 $ $  `; "" /DIRECTORY |0 ,&,"j/@  "j؁|L|L X"@` ../EN |0 NTN. -P%P@ |  .|L Gw H-?T|L X$|L(R8^*%,|L024|L8> XB|LFH p߂P X`; 22 /FILEPOSITION |0 (2  % F  2|L K! H?T X|LR8^ %$`; A A/ERASE |0 (A< B  A< X|L|LR8^ p$`; II PROCESSOR |0 I  I`; TTAPPLICATIONSPROCESSORw |0 T  T`; kkBATCHPROCESSOR |0 k  k`; {{ CARDREADER |0 {  {`; DEVICE |0    `; INPUT |0    `; PRINTER |0 ~ L*   X ~|LL  FILE |0 * e2h~ LF  |L 2 X X~|L é!"|L&L(  FILE |0 F,Fe Af @  p|L :|L^ : f$ X(@` ;* |0 n4nD~  1>  Xp|L$|L(,p0`; CONFIRM |0 ~ 1  `; QUERY |0 ~ 1  `; TODAY |0 `   `; EXCLUDE& |0   1A    `; SINCE |0  0 1   0 `; THROUGH |0 @X 1   X `; DATE |0 `F 1"   Fp`; LOGR |0 !  `; WARNINGS |0   1  `;  NOWARNINGS |0 *o Q  @  X|L+!|L^ : " X&@` ;* |0 (R(  P  X|L+!|La}" X&|L*+!,|L0a}4 X8|L<+!>|LB00L @|LDH XL|LPKT`; $ $/REMOTE |0 $   $ X`; - -/REMOTE |0 D- e6f~l  -|L Kp|L6|L f"|L&~(|L,.|L24|L8< X@`; 6 6QUE |0 >>6@T(  6 X |LT`; < </DEL |0 PP<  < X `; B B/FI |0 \\B$  B X X`; G GQUE |0 nnG  G X `; M M/DEL:Q |0 zzM  M X `; U UQUE |0 U  U X `; [ [/UNSPL |0 ,[ D <  [p |L}|LId$ X(`; b bUFD |0 b@@ A*  b X X X`; h h/DEL |0 $h4  h p X X X `; n nMFT |0 n e  n X`; t t/DE/REM |0 at File(s)? Job name? Processor? Queue? Entry number? Required qualifier not specified   tb t`zK f9t`Ds@ X@ p@K@p@_@c&_M@a}@K@ X@@L@z؁@T;w@|L@ :@y@R8^@K@Ps@?T@d@R_@"@"@Z@Z@bH@w@嫈r@`;@+!@w@ |0 *QF hK f9h F |0 @ .   /Jp|L .|L|L &|L*2 X6؁<`; QUEUE9 |0 <*< 2[~ZJ  |L R_ 2|LR8^~Z"p&`; ADJACENT |0 b b  `;  -ADJACENT |0 j j  `;  NOADJACENT |0 r r   `; ( (AFTER |0 zz(   ( `; //FLAGPAGE |0 /"   / `; 9 9FORMS |0 9   9 `; @ @HOLD |0 @"@   @ `; FFJOBCOUNT |0 F    F `; P PJOBPAGE |0 P"   P `; Y YLENGTH |0 Y    Y `; aa LOWERCASE |0 a "   a `; l lNAME |0 l    l `; rr NOFLAGPAGE |0 r"   r `; ~~ -FLAGPAGEO |0 ~"   ~ `; NOHOLD |0 "@   `; -HOLD |0 "@   `;  NOJOBPAGEE |0  "   `; -JOBPAGE |0 "   `;  NOLOWERCASEE |0 $$"   `;  -LOWERCASE |0 00"   `;  NORESTARTG |0 <<"   `; -RESTART |0 HH"   `; 00TvATADATADATA NOUPPERCASE |0 TT "   `;  -UPPERCASE |0 `` "   `;  PAGECOUNT |0 ll    `; PRIORITY |0 vv    `;   RESTART |0  "    `;  UPPERCASE |0 "    p`; WARNINGS |0 "    `; '' NOWARNINGS |0 .'o"D  'p|L|L X$|L(+!*`; 33TOMORROW |0 r3 @TX @(@ : @:@ )@@|  3|L d|LX" X&|L*+!,؁6|L::<>|LB:H|LLPpT؁^ XfPsjnpn>   X:Pxc: ||La}|LX X"H(؁.H4|L8x> XB؁HHP XT|LX+!ZZ`?Td Xh|Ll+!  /& p  X؁`; ==REDIRECT |0 *= w /D  =|L " w|L" X ؁&`; G GTASK |0 XG  n  * FE~  G|L +! p|L"n"Z(*?T0p4y 8>*@|LDH XLN|LRFTE`:  d~ :|L p|L :|Ld |L$&|L*K. X2w6|L:~<|L@BwH XLKRZX؁Z/ .| Xw |L"|Lwp"؁(*_.؁6p:|L>@LD.H XL|LP"R|LV:/ n   1Vp_ ؁ X|L ""n&|L*",2p6`; M MGLOBAL |0 ""M  1  M `; U USYSTEM |0 ,,U !  U `; ] ]LOCAL |0 6 6] 1  ]`; d dLOGIN |0 >>d A  d `; k kGROUP |0 HHk B   k `; r rFINALL |0 VVrB   r `; yyTRANSLATIONATTRIBUTES |0 b2byBv 1 J  y v |L嫈r X|L d"|L&*p.`; TERMINAL |0 * _ >   X|Ld X_ X$Z  Octal group number expected |0 > B tB B BL  p |L|Lt |L$*|L.6 X:`;  QUE |0 B @.   X X X`;  /AS: |0 AD*   Xp`;  -AD |0 " "   `;  AF:X |0 **FL"   `;  FO: |0 <<8HO"  8`;  CO: |0 LLDJO"  D`;  LE: |0 \ \P  P`;  LOW |0 d d   `;  -FL |0 l l  `;  -HO |0 t t  `;  -JO |0 | |  `;  -RES |0    `;  PA: |0  \  \00\ ؁D|LH`J|LNR8^PRVZpd`;  PROCESSOR |0 h h   `; APPLICATIONSPROCESSOR |0 n n  `; - -DEVICE |0 t t-  -`; 5 5PRINTER |0 z z5  5`; >>BATCHPROCESSOR |0 >!  >`; NN CARDREADER |0 N!  N`; Z ZINPUT: |0 Z 1  Z p`; a aABORT |0 a 1  a `; h hFILEEND |0 h 1  h `; q qJOBEND |0 q!  q `; y yPAUSE |0 y/A$  y X؁`; QUEUEE |0  ,  |L p`; MANAGER |0    `; ABORT |0 6BB / D  p X|LR8^ "( X,؁2`; ABORT |0 $  />  9?T|L R8^ X؁ `;  ACCOUNTING |0 @"@ PN /4  L NK X؁`; BLOCK |0 ^2^@pP @/F   X p p߂p|L嫈r$ X(؁.`; ERRORLOG |0 B  B  $B PB8Z  p|L|L |L"$(|L,P2|L688|L<>`;  ELI /-LOG |0    X`;00dvATADATADATA QUE |0    X `; /STOP |0 @(  |L p`; :AB |0    `; :EOF |0    `; :EOJ |0   X`; QUE |0    X `;  /STOP:QUE |0     X `;  QUE /STOP:QMG |0 , ,@  `;  :AB |0 22   X`;   QUE |0 @@    X `;  /KIL |0 LL   X `;  BLK |0 XX@@h.   X Xhp`;  TERM= |0 ppv .  v X X X`; "" STOP/ACC U |0 N" @ Illegal queue nameIllegal processor name Processor? Queue?   " XTb zZg,D X@p@Id@a}@a}@ X@ y@|L@Z@é!@`;@+!@:^%:@ |0 &QZghZg,h D |0 \P& yy e8P e ~ XP |L&|Lp y" X* X.|L2^%:488< X@PB|LFé!H|LL^%:NTpX`;  KEEP |0 XXy   `;  LOG |0 b b  `;  NOLOG |0 j j 1  `;  TODAY |0 pp`    `;  EXCLUDE |0 zzݮ 1A   `; " "SINCE |0 " 1  " `; ) )THROUGHX |0 )@ 1  ) `; 2 2DATE |0 2`  2 `; 88 NOWARNINGS |0 T8o |  8 X|L+!|L^%: X"|L&+!(|L,a}4 X8|L<+!>|LBa}F XJ|LN+!P|L2z File(s)? 2a} X |L+!Z X |L$Id b >ƀzj_>ƀD X@K@p@ X@@؁@|L@d@W@H@é!@`;@2 |0 Qjhj_h  |0 @4 4 1A` X4 |LK|L X 4"|L&é!(|L,K.8p<`; LIST |0 << 1   `;  NOLIST |0 HH    `;  LIBRARY |0 RRB 1A   `;  OBJECT |0 ^^ 1   `; NOOBJECT |0 jj   `; ) )BUILD |0 t t)  )`; 00CROSSREFERENCE |0 | |0  0`; @ @DEBUG |0 @   @`; GGOPTIMIZE |0 G   G`; QQPAGESIZE |0 Q  Q `; [[STANDARD |0 [ 1A  [`; e eSHOW |0 e 1  e `; k kNOSHOW |0 k  k `; ssWARNINGS |0 Zs  s X|Ld|LK X"|L&d(|L,K2 X6|L:d<HD XH|LLdN|LRVpX :00l  XB؁H|LL^PpT`; } }ALL |0 f f}  }`; NONE |0 n n  `;  CONDITIONALS |0 v v  `; INCLUDEX |0 ~ ~  `; TABLES |0    `; SOURCE |0   X`; DIB |0 h@@=A<,~  |L  |L؁|L<"p& X, X2W8W@ XD؁J|LNRpV X\Wb X:",@H X W X X|L""& X*؁0 X6`; /LB |0 6L6BCD O P:N ASP  p؁؁؁&؁.46؁>؁FH`; S:N |0 ~F~W:AV  ؁ X X X"؁(|L,.|L26p:؁B`; NOA |0 C  ؁`; NOCW |0 I  ؁`; NOI |0 T  ؁`; NOT |0 S  ؁`; NOS |0  File(s)? ) expected   , b >znZ&>D X@K@K!@@`@p@K@ X@@؁@|L@d@Z@Jé!@`;@+!@ |0 QhdnZ&h   |0 :. h@ t\ X. |L X|LKh |L$é!&|L*K,t2p6`; IGNORE |0 66 1"  p `;  NONUMBERS) |0 BB 1   `; -NUMBERS |0 LL!   `;  NUMBERS |0 V V   `; & &LINES |0 ^^& A  & `; - -OUTPUT |0 h h-P A  -P`; 5 5SLP |0 pp5: A  5: `; :: CHANGEBAR |0 z0z:  F  : X|LdZ X$|L(+!*Z EEIllegal qualifier value |0 E $  E X |Ld ]]Illegal qualifier value |0 :] @(  X  ] X؁|L |L"$|L(, X0|L4é!6@` uu, |0 .u  )B  :  u|L p؁ X&p*`; ww BLANKLINES |0  w  w`;  FORMFEEDS |0    `; SPACING |0 $ $  `; TRAILINGBLANKS |0 , ,   `; COMMENTS |0 44 *  X|LK!K Illegal qualifier value |0 J&J  <  X|Ld|LK X"`; CMP |0 l:l@ =, P  |L  X X؁$ X,p0 X6`; TI: |0  !!2  p |L|L`; -MB |0    `; -LN |0 00tvATADATADATA   `; -CO |0    `; -TBd |0 * .!@ ASL<  |L .|L@"p&`; -BL |0 BL$  p`; -FF |0 *FF: 6   X؁ X" X&`; LI: |0 66  $   Xp`; CB/VB: |0 HH V  V `; -CB |0 RR$  p X`;  041L |0 d d Filespec1? Filespec2?   b zVqMD X@p@Id@a}@a}@ X@|L@ :@}@`;@+!@^%:@2 |0 MQVqhVqMh m |0 : " X: |L" Old file name? |0  e "  |L " New file name? |0 Td{  ^ n 1f   Xp|L : |L$^%:(p,|L0^8|L|LBa}F XJ|LN+!P|LTa}5 D Contradictory syntax p|L }|LIdb Dz zRDD X@ p@@`@p@a}@ X@@؁@|L@ :@Ps@?T@rd@R_@}@H@é!@^ :@`;@+!@ |0  zRhQ zh  |0 `X 2heX 2heh h@W~ XX |L2h|L X X"|L&é!*|L.20h6p:|L> :@hH|LL^ :NhTPsXW\p@\ @ @ |@ H|L|L|L|&|L*0|L48p<`; REMOTE |0 i   p`;  SNA |0    `;  KEEP |0    `;  TRANSLATE |0   `;  TABL |0    `; ## RECORDSIZE |0 #(!"  #( p`; //WARNINGS |0 / 1  /`; 99 NOWARNINGS |0 9o  9 p`; E ELOGFILE |0 E   E p`; N NAFTER |0 N 1  N `; U UHOLD |0 U   U `; [ [NAME |0 [ 1  [ `; a aNOHOLD |0 ""a 1  a `; i i-HOLD |0 ,,i 1  i `; pp NOLOGFILEA |0 66p 0 1  p `; {{-LOGFILE |0 @@{ 0 1  { `;  NOPRINTER; |0 J00| |LBdDHNpR؁\ XdPshlp&^ x *|Lx|Lp"`; ))TOMORROW |0 d):Pc:  r ~  )|L a} XH؁ H&|L*0 X4؁:HB XF|LJ+!L pRrV XZ|L^d`|L6D  DTR_D X|L+!H?T X$|L(+!* p0D2@` 33: |0 H3 <D@ @ @ NBV  3p |L<|L"|L&. X2|L6N8@ XD`; 5 5RJS |0 VZV5BB@=e@,z  5 X X X؁ |L$&|L*. X2 X8 X<@ XD؁J|LNRpV`; ; ;NOHO |0  ;  ;`; A ANOLO |0 A LO  A`; G GNOPRIN |0 G KE  G`; O ONOKE |0  O  O`; U UPRI: |0 *UN BB  UN|L  X|L}" X&`; [ [SUB |0 T[BB@N=.<eZ,.t  [ X X XN؁|L".$|L(<, X0 X6Z: X>؁D|LH.LpP`; a a-HO |0 V Va  a`; f f-LOG |0 ^ ^f   f`; l lLOG; |0 ffl  l `; q q-PRIN |0 rrq   qp `; x x-RES |0 ~ ~x   x`; ~ ~RES |0  ~  ~`;  PRIO: |0 N ,  N|L p`;  AF: |0 HO C"   `;  PRIN |0 <NMo"  < `;  NOTIFY |0    `;  -NOTIFY |0 @ @:B@:P   X|L؁|L"&p* X0؁8p<`; TOMORROW |0 n --:@l@|  |L  X X؁ X&؁, X6 X:؁@ XH XL XT XX|L\l00vATADATADATA^|Lbfpj`;   /DE |0 tt   X`;  /-DE |0 D   X`;  /DEL |0     X`;  /-DE |0 D  p`;  /-TR |0      X`;  /TRX |0  D    X`;  /-TR |0      X`;  /TR |0 DXL$  p`;  NOXL |0    `;  TAB |0     `;  NOTAB |0 ( (   `;  RS: |0 008Illegal queue nameIllegal filespec File(s)? Illegal job nameIllegal qualifier value ) expected;Must   8 X Xosupply REMOTE qualifier with DECnet node specification4Must supply SNA when specifying other SNA qualifiers.Mb zwDs@ X@ p@0@X@. :@K@K!@$96M@,@@`@p@z`@_@e@a}@K@ X@ y@ y@@G@L@؁@@R@|L@z :@y@s""@R8^@:@K@Ps@d@Gw@p@$9pw@"@Z@Z@@zH@@é!@w@r@^ :@ip@`;@+!@w@-8@ `|0 wh   |0 p|L   Function?  |0    Ps  Illegal function |0 ^  . .>bw    p |L.|L."p&|L*,|L02|L6>8|L|LBD,L|LPR|LV X|L\ Pj  B@/@pp|L |L|L  X |L$& X0 X4|L8:؁@|LDHpL`;  DAY |0    `; ! !TIME |0 !   !`; ' 'DAYTIME |0 '   '`; 00SYNCHRONIZATION* |0 0=    0`; AATOYCLOCK |0 bA   @, @/ t  A|L|L",0 X4|L8+!:|L>a}B XF|LJ+!L|LPRT XX؁^`; KKDEFAULTS |0 LBLK\ @ @d Z  K |L\ Xy  $|L(*|L.d0 X:p>`; UUNAMEDDIRECTORIES |0 U@  U `; ggNONAMEDDIRECTORIES |0 "g@,  gp|L|L  {{New default(s)? L |0 p{@@ @PP P[]D @A @` @B%@|  { X|LP*|L.-86|L:B|LFN XRyVXL\%^|Lbf Xj|LnK!l !@*     ||L*p|L|L &|L*4 X8w<|L@eBwHpL XT X\ yb yhPs Illegal directory |0 D [<]>V   X |LK|L p$؁*؁2p6؁<؁d׭ ׭@` Е.ȕ w%[]%<>h 00s$96M"s$$9pw*s""00 >    `; SYSTEM |0 NN    `; WIDTH |0 ^^   N  N`;  WRITECHECK |0 pp   A  `; CACHEI |0     `;  NOCACHE |0 n  "@ gy ( ), y~  |L" X$|L(d*|L.0g2y8 X<؁B|LFH|LLN؁V XZ؁`|Ldfyjp !Q`;   CREATE |0   !   `;  REGION |0  | !Q  | `;  DIRECTORY |0 !   `; (( NODIRECTORY |0  ( !Q  (`; 5 5OVERLAY |0 &&5 !  5 `; >> NOOVERLAYX |0 0 0> !Q  >`; I IVIRTUAL |0 88I@!  I `; RR NOVIRTUAL |0 B BR@ !Q  R`; ]] READ_AHEAD |0 JJ]!  ] `; ii NOREAD_AHEAD |0 T Ti !Q  i`; w wLOGICALI |0 \\w!  w `;  NOLOGICAL |0 f f!  `;  DEFER_WRITES |0 n n!  `; NODEFER_WRITES |0 vVv@@|   X|LK!|L X |L$K!&H. X2w6|L:K!<|L@B|LFHwN XR|LT@@@ ~K!|L  |L|L X p߂& X*|L.K!0`6: X>|LBK!D|LHLpP`; FIRSTFIT |0    `;  TOPDOWN |0 Z  B|   X |L+!|L" X y$|L(+!*Z04 X8|L<+!>ZDH XL|LPR Xt  X Groupflag required |0 x,x@@@/ >   X|L؁|L $p(`;  GROUPFLAGS |0  @"   |L`;  CREATE |0  1  `;  DELETE |0 R @ B f   X|L+!H X"|L&(|L,0p4 X>|LB J XN X Library UFD required |0 ,@@@/4 >   X|L؁|L 4$p(`;  SYSTEM |0 <<    `;  LIBRARYR |0 HH"   |L`;  DIRECTORY |0 bb @  `;  NETWORKUIC |0 rr @  `; (( UTILITYUIC |0 ( @  (`; 44EXTENSIONLIMIT |0 4 00vATADATADATA@V  4V`; D DPACKETS |0 D @.  D.`; M MPOOL |0 M 6 @  M`; S SPOOL |0 S6 @B  SB`; Y YLOGINS |0 Y @  Y`; aa CHECKPOINT |0 a @p  ap`; mm CRASHDEVICE; |0 m @A  m`; zz NOCRASHDEVICE |0 ` z{ @     z X|L+!|L"-8& X*|L.+!0Z6: X>|LB+!DHJN XR|LV+!X`^(hPK <؁ X|Ld|L p$`;  RSX |0    `;  POSS |0  0   X |LGw|L" Crash device? |0 x@(   X p`; REGISTER |0    `;  PARTITION: |0 T|zy/v   X|LdZ X"|L&d( p߂2 X6|L:+!<|L@"F XJ؁P`;  LIMITS |0 @F@(4@),F`  |L d |LF؁|L4؁& X*؁0|L4F8p<`;  HIGH |0 N Nl  l`;  LOW |0 V V  `;  MINIMUMSIZE |0 ^ ^  `;  TASKPRIORITY |0 f,f D   X|Ld|Lp"`(`;  ICBPOOL |0 `      X |Ld|L X |L$d&`0 X4|L8d:`D XH|LLdN|LR-8X X\|L@ B. `d|L -8 X|Ld|L-8$ X(|L, . X6|L:. < X Queue attibute required |0 & (&  N ` @2   p|LN |L` $Ps Entry or Job required |0 J J x (  p |Lx Ps Entry number required |0 \ \  x "   X |Lx  22Queue name required |0 j j 2   2 X FFJob name required |0 p @p F@@/  P  F X y X|L "؁(|L, . X8p<`; X XQUEUE |0  X  X `; _ _ENTRY |0  _P   _`; f fJOB |0  f @  f`; k kAFTER |0  k   k `; r rCOPIES |0  r   r `; z zDELETE |0  z 1  z`;  FILEPOSITION |0       `;  FORMS |0       `;  HOLD |0 " "   `; JOBCOUNT |0 0 0     `;  LENGTH |0 @ @      `;  LOWERCASE |0 P P    `;  PAGECOUNT |0 ^ ^      `; PRIORITY |0 n n      `;  00   |L |L R8^,|L0 > XB@` /EN |0 N @  6 ( V x  |L Gw H X|Lip p߂&p*|L. 0|L46 8 X<|L@+!B؁H|LLV  Date or Time required |0 & *& @V )@( V D  |L V ؁ X|L+!؁$|L(V  Date or Time required |0 L jL @)l :P c: |  ؁p|La}|Ll $ X(H.؁4H:|L> D XH؁NHV XZ|L^K!`Hf    X`;  ACCOUNTING |0 $  P @/4   L K X؁ `; ( (UIC |0  (*  (|L +! |L-8 - -UIC? |0  -@n @/(  - Xn ؁`; 3 3HOST |0  > 3@   F $V  3|L +! |L  Xp |L$,|L0F 8|LLBD|LHLpPVX؁` X^* ^ - A|Ld |LK X|LdZ"&p*|L.^0|L4 8 X<|L@dBKH؁NKV XZ`;   X29; |0 8    @/@   pH|L . :* X.؁4`;  FILE |0 @ S0  |L 00vATADATADATA X@|L  File(s)? |0 ,e . SF   |L X. X |L$é!&|L*   File(s)? |0 > e   ( P   p|L :|L ^ :$p(|L,(6p:`;  PROTECTION |0 0 0L   L`; ! !OWNER |0 888!pbt d   0 1F  !b p|Lt|Ld"|L&0p4`; ( (LOG |0 ll(   ( p`; -- NOWARNINGS |0 ||-o"   - `; 99WARNINGS |0 9"A  9 p`; CC ENDOFFILEp |0 C"`  C `; N NENTER |0 N"@6   N 6`; U UREMOVE |0 U|"@  U `; ] ]REWIND |0  ]   ]`; eeTRUNCATE |0 @e"`(@,)V  e X|Ld؁|L"$؁*|L.0؁8p<`; o oBLOCK |0 o$.  o$|L Gwp`; v vBYTE |0 2v$ X  v$|L Gw X|LK!`" X&|L*d,|L0^ : ||Synonym file name? |0 FF|d 0  | X|L+!|LG Protection code? |0 \\\pv B B~   X|L+!|Lv X"|L&(Z.B0|L46Z|LBF XJ|LNP|LTXp / ,@/ (؁ ؁ X؁`; ERRORLOG |0 >d/ X   |Lp|L|L d$ X(؁.|L26p:`;  BACKUPFILE |0  $   $ `;  NEWLOGFILE |0 8  8 `; LIMITING |0 <` C`Nf   X|L+!|LK` X"|L&+!(|L,K.`0N4p8`;  NEWVERSION |0 V V   `;  DELETE |0 ^^  |2   X|L+!|L|  Device(s)? |0 v`v(), 1   p|L|L X ؁&|L*,؁4 X8|L<">|LBF XJ؁P|LT"Xp\`;   HARDLIMITL |0  1    `;  SOFTLIMIT |0  1    `;  RESETCOUNTS |0 6L   X|LdH X"_&|L*.p2 X  Time? |0    X  Date?  |0 **`    X  Device? L |0 88D@    X ((Device attribute? |0 DD(D   ( X ; ;Flag?  |0 PP;D@   ; X BB Library UFD? |0 \\BD@   B X PPEntry or Job?  |0 h(hPD`   @ ,  P X X"$ X __ Job name?  |0 _D0   _ X jjQueue attribute? |0 jD   j X || System UFD? c |0 |D@$  |00  >DMO |0 (>@ @@:  > X ؁ X X p$`; D DDEV |0 D  D`; I IUSER |0 I  I`; O OLOCK=N |0 O  O`; W WLOCK=U |0 W  W`; _ _LOCK=V |0 _"  _|L `; g gSIL |0 g   g X`; l lTERM= |0 lDevice? X  l X b XzzXD X@K@K@@`@p@Id@a}@a}@ X@؁@|L@ :@r?T@}@Z@é!@^ :@`;@+!@^%:@ |0 Qzh*zh  |0 hd@mdLe .@d  Le  Xd |L X Xd|L"L&|L*.2 X6d8|L<é!B|LFLHJPpT|LX :`|Ld^ :Nd E A @ &@ zNp|L |L |L$,|L0&8|L>Re  1  R `; Y YFULL |0 HHYk`  Y `; _ _OUTPUT |0 RR_!  _ `; ggWARNINGS |0 ` `g 1  g`; qq NOWARNINGS |0 hhqo 1  q `; }} -WARNINGS |0 rr}o  } p`; WIDTHB |0 Z      X|L+!|L^%:$ X(|L,+!.|L2a}: X>|LB+!D|LHa00vATADATADATA}L XP|LT+!V|L<d Va} X |L+!|Lp |L$K&|L*K4 X8@` LP0: |0 F  B JBd   X |L+!Z?Tp"|L&},|L0J6|L:Id> XB`; DSP |0 RR@h,  |L h |L`; /FU2 |0 dBd B Bd=dP  p X X" X& X,؁4 X8 X>`;  DSPPRINT.TMP=* |0 e(  p X`; *.* |0 5,e File(s)? Illegal filespec   X ؁ X b z}D X@ p@K@.%:@K@p@ X@@L@؁@|L@K@jd@Gw@W@H@é!@`;@+!@ |0 @}hQht  |0 ^/Z$P44~p؁Z|L$ XL"( X,.|L2448p<|L@KD|LH.%:N XRT|LX4Z Z p`; EDI |0 bb   `;  EDTX |0 ll$  $`;  KED |0 || J  J`;  K52 |0 J  J`;  SLP |0 $   $`;  SOS |0     `;  TECO |0     `; $ $MAKE |0 $   $ `; * *MUNG |0 *  * `; 0 0USINGE |0 04A"  04 p`; 7 7COMMAND |0 7N  7N`; @@ NOCOMMAND |0 @  @`; KK-COMMAND |0 KA  K`; U UJOURNAL |0 Uv  Uv`; ^^ NOJOURNAL |0 ""^  ^`; ii-JOURNAL |0 22i !A  i`; s sOUTPUT |0 BBs 1  s `; {{NOOUTPUT |0 LL{ 1  { `; -OUTPUT |0 VV  `; READONLY |0 ``  `;  NOREADONLY |0 pp  `;  -READONLY |0 ~~  `; RECOVER |0   `;  NORECOVER |0   `; -RECOVER |0   `; CREATE |0  A  `; CHECKSUM |0    `;  NOCHECKSUM |0    `;  -CHECKSUM |0  A  `; LIST |0 @b  b`; NOLIST |0  @  `;  -LIST |0  @  `;   REPORT |0 &&    `; NOREPORT |0 66  `;  -REPORT |0 DD  `; & &TAB |0 RR&   &`; + +NOTAB00  XB|LFdH|LLKR XV|LZd\|L`~K X|Ld|LK X"|L&d(H2 X6|L:d<HF XJ|LNdP|LTXp\|LTA:$(A: )5::H:~|L : $ X؁|L: "؁(5,p0|L4d6:8|L<é!>:@|LDHHpL|LPdR:$0: H :|Lé! : X|LHp `; POSITION |0 PP b   b `;  SIZE |0 ZFZbAbrAb  b X|LGwHp" X(b* X02 X8r: X@B`;  EDT |0 b@t @@`@   X Xt؁|L X&|L*`. X2|L68|L<>|LBFpJ XP XV X^p:====<>؁ ؁؁؁&p* X0|L4<6`;  /NOJOURNAL |0 0n0N,,, @@t |  |L N X؁ X" X&؁,W4 X8؁> XF XJ؁P|LTV XZt\؁b Xj Xp@D @@=CRIN||L |L|LDp X"W* X.؁4|L8: X@ XDH XL XR؁Zp^f , 2,,===   1RO|p|L |L2 X"؁( X0 X4؁:WBpF؁N؁V؁` Xd؁j Xrpv: ACSTR BF ACM AU@ X $,.46`;  -AU |0 CR  `;  -CRX |0 |A :::File? Illegal qualifier value ) expectedZ   p X؁ X$ X, X0؁6 X> XB؁H XQKb b z 8D X@ p@K@K@p@ X@L@؁@|L@K@d@H@B`;@+!@ |0 b hh 8h  |0 * @@ P !A2 X ؁|LK"p&`; BP2 |0 &&   `; 00vATADATADATA B11u |0 00  `;  USING |0 >>    `;  BUILD |0 L L  `;  CHAIN |0 T T Y  `;  CROSS |0 \\   `; & &DEBUG |0 f f& Y  &`; - -FLAG |0 nn-   - `; 3 3LINES |0 x x3 Y  3`; : :LIST |0 :4 Y  :4 `; @ @MACRO |0 @4 Y  @4 `; G GOBJECT |0 G4   G4 `; O OSCALE |0 O    O  `; V VVARIANT; |0 V  V `; __WARNINGS |0 0_X F  _|L X X|LK X$|L(+!* p ii User basic? |0 iPF,  iP X|LF`; vvKEYWORDS |0 vF(  v X |LF`;  DECLINING |0 dP-F:=d/~   X |LdH X|L"d$؁*H2 X6|L:F<|L@KDpH؁N؁V XZL^dfX Kh$h@@: X|L |L Xp `; BAS |0    X`; BP2 |0 | @@B   |   X ؁؁ X$p( X. X4 X: X@ XF XL XR XX X^ Xd Xj Xp Xv X X `; SCALE: |0  8  8`; VARIANT: |0 F DIllegal task name8  D X X X X X( X, Xb Xz2dXD X@ p@K@p@ X@L@؁@|L@K@Gw@`;@ *|0 \Q2h2dh p |0 .@"@%PZ6 X X "؁L Z&p*`; CLI |0 **!  `;  DCL |0 : :  `;  FILE |0 BB   `;  GROUP2 |0 RR  `;  LOCAL |0 ``  `;  MCRd |0 nn   `; # #OUTPUT |0 |*|#   4  # p߂ X|L"Gw$ p ++CLI name required |0 "+A<  + X |LGw|LK X`; = =HELP |0 2=@ 0 1D  =|L  X؁ X"p& X.`; C CLOC |0 C !  C `; H HFIL |0 H0 1  H0 `; M MGRO |0 M0  M X`; R ROUT |0  RN !  RN`; WW FIL:LB:[1,2] |0 W<   W< `; e eDCL |0 &(&e 0  e X X X X$`; j j.HLP |0 JJj  j X XKpb 0rv<0D X@ p@p@ X@`;@ |0 qQvh.vh )00 ƀz&Z>ƀD X@:""@K@K!@p@K@ X@@؁@|L@y@?T@zGw@p@Z@H@w@r@@`;@w@@ |0 Qh&Zh e  |0 (   1@ X |LK|LK p$`; APPEND |0 $$!  `; NOAPPEND |0 . .!  `;  -APPEND |0 6 6   `;  BLOCKSIZE |0 >>0 1  0 `; && FIXEDCONTROL |0 HH&!  & `; 44NOFIXEDCONTROL |0 R R4!  4`; DD -FIXEDCONTROL |0 Z ZD 1  D`; SSIDENTIFICATION |0 bbS!  S `; ccNOIDENTIFICATION |0 l lc!  c`; uu-IDENTIFICATION |0 t tu 1  u`; INDEXED |0 ||  E  `; KEYL |0  J 1A  J `; LOGFILER |0  b!   b `;  NOLOGFILE |0 !  `; -LOGFILE |0  1  `;  MASSINSERT |0  !  `;  NOMASSINSERT |0  !  `;  -MASSINSERT |0  !  `; MERGE |0  1A  `; PAD |0 @t!   t `; NOPAD |0 @!  `; -PAD |0 @ 1  `; RELATIVE |0  1  `; REPLACE |0 !  `;  NOREPLACE |0 !  `; -REPLACE |0   1  `;  SEQUENTIAL |0  1   00vATADATADATA`; &&TRUNCATE |0 &!  & `; 00 NOTRUNCATE |0 " "0!  0`; << -TRUNCATE |0 *X*< @. |  < X|LGwH?T؁$ X(|L,K!.H4?T< X@|LDK!F|LJKN XR|LVK!`~ P#" "z|L p|L|LK& X*؁0Z8 X<w@D؁Jy NP؁VZw ͋  wR :""rp|0   X`; G GCNV |0 FGP=PAPBLbWFIDT  G X ؁ Xp"*0b2:B`; M MFO:IDX |0 $$$M SLnMA PDz2  Mnz `; U UFO:REL |0 DDUSU  U`; ] ]FO:SEQ |0 TT]TR KR @:0 Input file? Output file? Illegal paV  ] X X X" X* X. X6p:@D XH XNdding characterb >z,9^>D X@p@K@ X@؁@|L@Gw@"@Z@嫈r@`;@쨰"@2 |0 ,h,9^h ! |0 & :P 1> X |L:|L"p"`; TYPE |0 ""   `;  DEVICE |0 .n.Zp 1: 1 :~  |L 嫈r X|L쨰"p"|L&Z(|L,p0 X4Z>؁F XJZT؁\ X`|LdGwfK  X`;  ALL |0 4@@=J   X |L X X؁$ X,p0`;  TERM= |0   `;  TYPE |0 :Device? Illegal device&   X X X X&b z HD X@K@K@K!@@`@p@8^@a}@H @ X@ y@@zL@؁@R@|L@G@K@d@Gw@Z@`;@+!@^%:@ |0 eh" Hh  |0 d@(@ @l V,|p؁|L( X|L K", X02|L6@8|L >DELETE |0 >  1  > `; F FDENSITY |0 F   F  `; OO DIRECTORYE |0 O$ 1  O`; ZZ ERRORLIMIT |0 Z p  Z p `; f fEXCLUDE |0  f 1  f`; oo EXTENSIONR |0 o@p   o p `; zzFILEPROTECTI00 |LBH F XJ|LNGwPZ/ X؁`;  QUERYE |0 $&:   X|LGw|Lp `;  800 |0    `;  1600 |0    `;  6250 |0 X"(")~   X |LGw|Lp|L"$|L(a}*|L.R4 X8؁>|LBa}D|LHRL؁T X,|L+! |Lp`;  AUTOMATIC |0 & &  `;  MANUAL |0 , ,  `; OVERRIDE |0 2 2  @`  AUTO |0 8(8NbD  p |LN|Lb X|L"d$`;  SINGLE_BUFFERp |0 \\)*   X|Ld`;  DOUBLE_BUFFER |0 p$p*:   X|LGw|Lp `;  SAVE |0    `;  RESTORE |0 ":   X |L+!|Lp`;  BEGINNING |0    `;  MIDDLE |0    `;  END |0 (  1@  Z X|Ld|L p$`;   INPUT |0  L 1   L `;  TAPE_LABEL |0 L 1   L `;  OUTPUT |0  @L 1@,   L |L X@` '': |0 ,' 8B00vATADATADATAJD  '|L H p|L8|L J$ X(`; ) )BRU @ |0 @@)A$  ) X X`; 0 0BRU |0 RbR0 v@ @@,v @  0؁|Lv|L؁ |L$( X, X2|L6: X>؁D|LHvL XP XV|LZ^ X>,@,R؁ |L X X|L $ X(؁.|L26p:`; 6 6APP |0  6  6`; ; ;BAC |0  ;  ;`; @ @BAD: |0  @   @ `; F FBUFFERS |0  F A  F`; O OCOM |0  O8  A&  O8 y`; T TDEL |0 T N  TN `; Y YDEN |0 & &Y"  Y"`; ^ ^UFD |0 . .^$  ^`; c cDIR |0 6 6c   c`; h hDISPLAY |0 > >h   h`; q qERRORS |0 F Fq.  q.`; y yEXC; |0 N Ny   y`; ~ ~EXT |0 V V~:  ~:`;  HEA |0 ^^F%"  F X`;  INVOL |0 l lR  R`;  LEN |0 t t^  ^`;  MAX |0 | |j  j`;  MOU |0    `;  NEW_VERSION |0 ID(  `;  INI |0  '  `;  NOINI |0    `;  NOSUP |0    `;  NOPRE |0    `;  OUTVOL |0  v  v`;  POS: |0    `;  SUP |0    `;  CRE |0  !  `;  REV |0    `;  REW |0    `;  TAPE_LABEL |0   A  `;  VER |0 8  8 `;  WIN |0     `;  PRO: |0 0#!bzD  8^ X Xp X"b$|L(z,`;  CRE |0 22b"  b p`;  :SIN |0 @ @)  `;  :DOU |0 HH*:$   X؁`;  CON |0 \*\&::   X؁ X|L" X&`;  REV: |0 l"(-- ")|   X |Lp|L|L"$ X, X0؁6 X<؁B XH؁N XT؁Z X`؁h X--   X ؁ X؁ X$p( X0 X4 X< X@ XH XL XT XX X` Xd Xl Xp Xx X| X^f/ File(s)? From? To? D X X X X X$ X, X0 X8 X< XGK,b @z'@D X@K@K!@p@K@K@ X@ y@@؁@00 |LBK!DKN XR|LVK!X|L\Kb Xf|L`@<@<~K!|L K X|L|L<" X&|L*d,Z6 X:|L>@|LD<H XL|LPdRK\ X ( @( 60|L( |L+!؁|L6 kkValue expected |0 Jk B@6 )B `  k|L |L X|L é!"|L&6*p.؁8 XBpF`; zz ARITHMETIC |0 >>z"   z `;  EAE |0 JJ"    `; EXTENDED |0 VV"    `;  EIS |0 bb"    `;  FLOATINGPOINT |0 nn"    `;  FIS@ |0 zz"    `; THREADED |0 H"<< f   X|L+!Z |L$<( X,|L0<2|L6d8|L<@pD`;  ALL; |0 %"    `;  NONE |0  "    `;  SYNTAX |0 "    `;  SOURCE |0 J&" *   `  p y* y " y(* y02|L6:|L>B XF`;  FOR |0 2P28 Lv @,@=Br  8 p yL|Lv X"؁(|L,.؁4|L8:؁@|LDBH XL`;  /ID |0 ~~   X`;  F4P |0 $88  |L  X X8 X `;  F77 |0 @"  |L  `;  /NOF77 |0 j v @,@,=j~   p y|Lv X"؁(|L,.؁4|L8,:؁@|LDjHpL XR XXW^Wf X`>>       ||L> |L X|L>|L $p( X.0W68W>@WFHWNPWVX X^.z   > X  X X X"& X*`;  /-SP |0 $   X W`;  /SP |0   p `;  /LI:0 00  >/LI:2 |0  >*  >`; E E/LI:3 |0  E   E`; L L/LI:2 |0 & &L  L`; S S/LI:1 |0 . .S  S`; Z Z/LI:0 |0 6 6Z  Z`; a a/LI |0 >l>aPV,PP~,PDEID|  a X X|LV X ؁& X,0 X4 X:<|L@~D XH؁N XTXp\dI4( `; f f-I4 |0 f)EXSN $  f`; k kNOSN |0  k'  k`; q qNOVA |0  q   q`; w wNOWR |0 w RO  w`; } }CD: |0 2} DEEXIDI4(:  } p&.`;  -I4 |0   )  `;  NOWR |0   CK  `;  -CK |0 0 0 RO   `;  CO: |0 @ @  CTR &    `;  NOTR |0 T T   `;  WF:D |0 \ \   &   |L  `;  -ST |0 l l  DB!  `;  -DB |0 | | "OP#  `;  -OP |0  $   p`;  EAE |0   "  |L `;  FIS |0    `;  THR |0     p`;  FIS |0    `;  EIS |0 L  5:^   X X X|L p$ X*؁2 X6؁< XDpH`;  -ST |0      `;  ST:ALL |0   %  `;  ST:SOURCE |0 ? &ST File(s)? $Qualifier inconsistent with compiler  b 0zL0D X@p@ X@|L@"@嫈r@`;@ |0 QhNLh   |0 6*BF X* |Lp X|L""$.p2`; ALL |0 22  `;  DEVICE |0 @@ 1*  |L 嫈r X`;  DEA |0 VV @@f.   X Xfp`;  TERM= |0 nntDevice?   t X X b XzyXDs@ X@p@c&_M@ X@L@؁@T;w@|L@y@R8^@K@bd@R_@"@Z@嫈r@`;@ |0 |QhByh  |0 ,  D00vATADATADATA/6p|L |LD X"؁(`; QUEUE |0 (Z( m a \jB~~  |L R_ m|LR8^a p$y (.\0|L48 X<>|LBjFpJ XR|LV~Z~ @" uC@"B2f X؁LuC ؁( X,.|L26p: XB|LF"H2RpV`;  ALL |0 , 1  `;  GLOBAL |0  !  `;  LOCAL |0  1  `;  LOGIN |0  1   `; " "SYSTEM |0 "A  " `; * *GROUP@ |0 :*B 1 R 4 N  * |L嫈r X|L"d$ X(R,40 X4Z 1 1Octal group number expected |0 >4>1 fB B BB  1p |Lf|L |L$, X0`; M MQUE |0 nnM  M X `; S S/DEA: |0 zzS$  S X X`; Z ZASN = |0 Z@@.  Z X X X`; a aDFL =" |0 "a"@4  a X ؁ Xp`; i iGBL |0  i  i`; n nLOGIN |0  n  n`; u uTERM= |0  u  u`; | |ALL |0  | A  |`; GRP |0 = Illegal queue nameIllegal processor nameLogical device? Logical name? Group numbe,   X X X؁" X!^r? Processor? Queue? /=" K 5c&_MT;wspb Xr'XD X@ p@p@ X@`;@ |0 qQ'h.'h ) |0  jX 1. X pjXp`; READONLYSEGMENT |0  1  `;  REGION |0 &&   X`;  FIX |0 66PB(   X Bp`;  RON& |0 J J  `; $ $REG |0 R#R$Illegal task nameTask?   $ b ~̀zd4~̀D X@ p@@`@p@ X@؁@|L@R8^@?T@Gw@Z@ip@:`;@ |0 Qd4hd4h @ |0   X|L  Entry or Job? |0     Entry or Job required |0 , &N@/>  p |L&|LN X"؁(`; % %ENTRYe |0 4 4%  %@` ,,/EN |0 :&:, @/@  ,|L Gw Z?T X؁"`; 0 0JOB |0 \6\0 t@ \  0|L R8^ |Lt X |L$ip& p߂. X2`; 5 5QUE |0 5  5 X `; ; ;/HO |0 N;Illegal queue nameEntry number? Illegal job name Job name? Queue?   ;0b >ƀzy:i~>ƀD X@ p@@`@p@H @ X@@؁@|L@G@R8^@Ps@z?T@d@R_@"@Z@H@&@`;@+!@@ |0  y:i~hQy:h /  |0 @00  |LBbD Ff JNpR`; yy PROCESSOR |0 y`   y `; APPLICATIONSPROCESSOR |0 ((   `; DEVICE |0 22   `; PRINTER |0 <<   `; BATCHPROCESSOR |0 FF   `;  CARDREADER |0 PP   `; INPUT2 |0 ZZ  p`; BAP |0 j&jF@ ~4  ~|LR8^ XH"@` : |0   p `;  BATCHQUEUE |0 Df  f`; CONSOLE |0 B|   |`; FLAGPAGE |0 B    `; FORMS |0 B    `;  LOWERCASE |0 B   `;  NOLOWERCASEL |0 B   `;  -LOWERCASE |0 B   `;   NOSHAREABLE |0  !B   `; -- -SHAREABLE |0  -!B   -`; 99 NOUPPERCASE |0 9B   9`; FF -UPPERCASE |0 &&FB   F`; RR PRINTERQUEUE |0 44R Df  Rf`; `` SHAREABLE |0 DD`B   ``; kk UPPERCASE |0 RRkB   k`; vv NOWARNINGS |0 `R`v# J ]  /|  v X|L+!|LR_ J X$|L(+!*|L."0] 4 X8|L<+!>ZD?TH XL؁`;  QUEUE |0 [ J  16  |L R8^ J p`;  BATCH |0 !   `;  PRINTER |0  @  `;  NOWARNINGS |0 ." ]   H   X|L"] |LH  &p*`; ACCESSED |0    `;  BADBLOCKS |0   `;  DENSITY |0 " "^   ^`;  EXTENSION |0 **     `; FI00vATADATADATALEPROTECTION |0 44  G `;  HEADERS |0 >>  `;  INDEX |0 NN   `;  LABEL |0 \\v   v`;  LABEL |0 jjB8    8`;  MAXIMUMFILES |0 xx    `;  OWNERUIC |0  b   b `;  PROTECTION |0   G `;   SHOW |0     `; & &NOSHOW |0  &  &`; . .-SHOWE |0  .   .`; 5 5UPDATE |0 5   5 `; = =WINDOWS |0 =  = `; FF PROFESSIONAL |0 ZF} (L )   F p|L|LPs} " X&|L*+!,؁2|L68|L؁D H XL|LP+!R|LV  p`; TT AUTOMATIC |0 T   T `; _ _MANUAL |0 **_@   _ `; gg NOAUTOMATIC |0 66g   g `; ttOVERRIDE |0 B0Bt, tD  t X؁|L X$|L(+!*|L.t ~~Illegal magtape density |0 nn~    ~ p`;  800 |0 ||    `;  1600 |0     `;  6250 |0    `;  HIGH |0    `;  LOWI |0 "   X@`  HIGH |0    X @` LOW |0 :  } \   X |L+!Z?T X |L$+!&|L*,} 2p6`;  BEGINNING |0    `;  MIDDLE |0      `;  END |0 ,N,  ,|L N X@` BEG |0    X @` MID |0 ((   X @` END |0 4&4  } >   X |L+! p }  X"@`  BLK:E |0 V V    Z Illegal file location |0 ^^0   X |L+!|L  UIC? |0 rr*   X |Ld`; VOLUMEACCESSIBILITYX |0 t""!&"'()+-./  |L d ؁|L؁"p&&,|L2|L8؁>؁D؁J؁P؁V؁\؁b؁h؁n؁ :,<>?(؁ ؁؁`;  |0 D  HB B B BR  ؁p|LH|L &|L*0|L4< X@`;  FMT |0 PPP \(   X \p`;  BAD |0 d d#  `; " "DENS= |0 l l"  "`; ) )ERL= |0 t t)  )`; / /MAN |0 ||/%VE&  /`; 4 4NOVE |0  4'  4`; : :OVR |0  :(00    X|L X X 4$p(`;  INI |0 &&   `;  HOM |0 00  p `;  DENS= |0 < <  `;  EXT= |0 D D  `;  INF= |0 L L  `;  INDX=( |0 T T  `;  MXF= |0 \ \   `;  BAD=[p |0 dd   `;  UIC= |0 n n    `;  FPRO=p |0 vv    `;  WIN= |0      `;  PRO= |0     `;  LRU= |0  VI"   `;  NAME= |0      `;   ACCESS= |0       `;  POS |0 N   @Z   X X X X" X& X. X2 X: X> XF XJ`;  NOAUTO |0 B: @"   |L: `;  AUTO |0  B V @"   |LV `; % %OVR |0   %r @"  % |Lr `; * *MAN |0 , , *B@]@, @,@,""v  * ؁p X X&؁.p2 X: XB؁JpN XV X^؁f Xj؁p Xv؁~ Xz [ , ,& ,8 ]*~ X X X X X& X* X2 X6؁< >؁D F؁L& N؁T8 V؁^pb Xh؁ppt X ***Illegal queue nameDevice? Illegal processor nameIllegal qualifier value Proc,؁ p X؁p" X(؁& essor? Queue? ) expectedLabel? b >z_>D X@K@p@e@K@ X00$vATADATADATA@@L@؁@|L@K@Z@:`;@ |0 _h_h ! |0 x f @{ 18p \ 1 .! ~ X|L f|L{$p(|L,82|L6p:|L>B|LFJKR\TK` Xd؁jKt Xt@/!؁ `; ALL |0 ~~@/!$  X؁`; LOGGEDIN |0 J @!P6@`   X؁|LK" X&L*60p4|L8:|L>B XF`;  BRO |0 .  |L X X`;  BRO |0 $*4   Xp X X* `;  LOG: |0 ~ :TTTHTT :Destination expected Message? To? j   X X؁ X"؁+K,p06T8>T@|LDeH XLZR؁Zb >j>D X@ p@ X@`;@ |0 +Qhh  |0  $ X p$ Illegal Task Name |0    X`;  CAN |0 Task?    X8,b Xz_XD X@K@K!@@`@p@`@e@K@K@ X@@؁@r|L@Ps@d@Gw@W@Z@é!@`;@ |0  _hQh T |0 nt p  w 2H^BBB~ Xt |LKp |Lw p"|L&2(|L,H.|L2^6 X: XB XL XP XX Xb Xf Xj Xp`; C11 |0 ||  `;  C81 |0  !  `;  USING |0  XA  X `;  LIST |0 l   l`;  NOLIST |0     `;  -LIST |0 A   `; & &OBJECT |0 &  &`; ..NOOBJECT |0 .  .`; 8 8-OBJECT |0 8  8`; AA DIAGNOSTICS |0 A+  A`; NN NODIAGNOSTICS |0  N-  N`; ]] -DIAGNOSTICS |0 ]-   ]`; kkCROSSREFERENCE |0 **k   k `; {{ ANSIFORMAT |0 88{   { `; SHOW |0 DD4    `; NOSHOW |0 NN5    `; OVERLAYDESCRIPTION |0 XX   `;  POOLLITERALS |0 dd    `; READONLY |0 rrE   `; WARNINGS |0  1  `;  NOWARNINGS |0  1  `;  -WARNINGS |0   `; NEST |0 d   d`; LARGESYMBOLTABLE |0 |   |`; NAMES |0 E   `;  CHECK |0   `;00, >P)   P `; VV CONDITIONALS |0 LdLV7Lw ~  V L X|LK!K$ X(|L,K!.|L2K8 X<|L@K!B|LFKLpP XXPs\w `pbw @, (~ X Psw  X|L|L"& X*|L.K!0|L4K: X>|LBdD|LHLpP|LTe\K.  (, 1@  X|Ld|L,|L"&p*`; d dCIS |0 44d*!  d `; i iNOCIS |0 > >i!  i`; p p-CIS |0 FnFp@^(|)  ~  p X|L^|L X |L$d&؁,|L0|2؁:p>|LBJ|LNX X\Kf Xj|LH, @(@>\|L  X؁|L X$K. X2|L6d8؁B|LF> vvValue expected |0 Vv B@&@> )B@@j  v |L|L|L &$ X(|L,é!.|L2>6p:؁D XNpR`;  NONE |0 F F.  `;  BOUNDS |0 N N/  `;  PERFORM |0 V V0  `; NOBOUNDS |0 ^ ^1  `;  -BOUNDS |0 f f1  `;  NOPERFORM |0 n n2  `; -PERFORM |0 v v2  `;  ALL |0 ~.~ D   X |Ld|L|L"&p*`; NOINFORMATIONAL |0  3  `; -INFORMATIONAL |0  3  `;  INFORMATIONAL |0 f  P( B*~   X Xp|L X* X.|L2d4|L8< X@؁J|LNBP|LTV|LZ*^ Xb|L é!@` , |0 . B )B  :  |L Bp؁ X&p*`; COPYLIST |0 JJ   `;  MAPN |0 ZZ   `;   VERBLOCATION |0 jj  @  `;  NOMAP |0 zz6   `;  -MAP |0 j6     X|L|L" X&|L*,|L04 X8 X@pD|LHL XX X\|L`db|Lf4 P( @(L X؁|L@|L|L"(& X*|L.é!0@` %%, |0 .%@ )B   1:  %|L @p؁ X&p*`;004vATADATADATA ''COPYLIST |0 HH'  1  ' `; 1 1MAP |0 RR1 1  1 `; 66 VERBLOCATION |0 \`\6@  6 X|L|LGwZ$ X(|L,.|L2Gw4`< X@|LDGwFKN XR|LVX|L\ p`; D DCBL |0  D   D`; I IC81 |0 I@   I X`; N NC81 |0 lN@ @X,@v@=B@,@,-,+~  N X؁|LX؁"|L&v(|L,.؁4|L8< X@ XH؁N|LR,VpZ X` XfWxB+LP~ X L XWp X$ X*W0W8p< XBWH XNR XVW^ Xb Xhlpp|Lt|L `; S SCVF |0 ,S 4 5@  S|L |L |L |L$(`; X X-PLT |0 $XROT ~ 2  X|LT |L~ `; ^ ^PFM |0   ^   ^ `; c cSYM |0  c   c `; h hKER |0 "h > 6  h |L |L>  X`; m mDEB |0 8 8m  m`; r r-DEB |0 @ @r   r`; x xTRU |0 H Hx!  x`; } }-TRU |0 P P}"  }`;  -SKL |0 X X$  `;  SUB |0 `$`% '( )< 76  |L  |L( |L< `;  -CON |0 8    p`;  CRF |0 B@   `;  CREF |0    p `;  -CRF |0 B@    p`;  BLD |0 B@OV $   p`;  -BLD |0 $B@ B@.   p|Lp `;  -PER/-BOU |0 . /"  |L  `;  PER |0 0* 1"  |L * `;  -PER |0  2  `;  PER/BOU |0     p `;  BOU/PER |0   0  `;  BOU |0 & &   p `;  -BOU/-PER |0 2 2 2  `;  -BOU |0 : :    p `;  -PER/-BOU |0 F F B@   `;  -BOU |0 P P  j B@(  p |Lj `;  ERR:1 |0 f f   p `;  -INF |0 r r 3  `;   INF |0 z z    p `;  -INF |0  B@   `;  ERR:2 |0 >  B@L   X X X X X$ X,p0|L4 :`;  MAP |0     `; # #OBJ: |0  #   # p`; ( (-MAP |0  (6  (`; . .MAP |0  .   .p `; 3 3-MAP |0  300< |LB+!D|LH0T XX|L\+!^|Lb0n Xr|Lv+!f  +-*0PK x|Lp؁ "؁(*|L.2p6؁<|L@0D XH`N؁V XZ|L^+!` p Subpartition name? |0 RR   Subpartition name required |0 T T B .  X|L X X Priority number requiredB |0 pp@    X Task name required |0 z4z @ @/ D   X|L ؁|L " X,p0`; //PRIORITY |0 H/ @ @/ L  / |L p߂( X,|L0+!2`: X>؁D`; 99 PROTECTION |0 9 "  9 |L X EEProtection code required |0 E   00DvATADATADATAE X ^^File spec required |0 :^@ "/6zR  ^ X|L |L"p"؁(6*|L.z2p6`; q qDEFAULT |0 >>q (8  q`; zz NODEFAULT |0 LRLz         1V  z|L|L&|L*2p6|L:B|LFJpN`;  TODAY |0 `    `;  EXCLUDE |0 $ 1  $ `;  SINCE |0  8 1   8 `;  THROUGH |0 @J 1   J `;  DATE |0 `8 "   8p`;  OWNER |0 r 1  r `;  LOG |0 !   p`; WARNINGS |0   1  `;  NOWARNINGS |0 nopNe@ <e@N  |   X|L+!|LG&p*|L.N8|L<<F XJ|LNé!P|LTNXp\|L` :h|Ll^ :jd e    / ,[~|L X|L+!|L & X*|L.0Z6 8|L<>ZD F|LJNpR؁X؁`pd؁r<]> @ @ P  @ @~؁ p؁؁ X"w&|L*e0|L4\;:&D|LHp0N|LRn"Xw^ Xb|Lfdh|Ll>8zB b X|L +!|La} X|L+! |L$a}( X,|L0z2 X: X  Terminal attribute required |0 r4r@@ @/ D   X|L ؁|L " X,p0`; TERMINAL |0 F  (  4  F F   |L|L($|L(4 0|L4F >pB`; TRANSLATION_ROUTINE |0  (@   `; NOTRANSLATION_ROUTINE |0 B (@   X   X|Ld  X $(p,Z2L6 :p>`;  ASR33 |0 00 @  `; & &ASR35 |0 @@& @  &`; - -CRFILL |0 PP-  @   - `; 5 5DCLT |0 ``5! @   5`; : :ECHO |0 pp:" @   :`; @@EIGHTBIT |0 ~~@$ @   @`; J JESCAPE |0 J& @   J`; RRFORMFEED |0 R( @   R`; \\ FULLDUPLEX |0 \* @  \`; hhHARDCOPY |0 h, @   h`; rr HOLDSCREEN |0 r. @   r`; ~~ INTERACTIVE |0 ~0 @  ~`;  KSR33 |0 2 @  `;  LA30P |0 3 @  `;  LA30S |0 4 @  `;  LA36 |0 5 @  `;  LA120 |0 ""6 @  `;  LA180S |0 227 @   `;  LFFILL |0 BB8 @  `;  LOCAL |0 PP: @  `; 00L  @l   l `;  PAGELENGTH |0 ? @     `;  PASSALL |0 @D@  `;  REMOTE |0 BD@  `;  SCOPE |0 D @  `;  SPEED |0 F @     `;  TAB |0 H @U  `;  TYPEAHEAD |0 J@ @    `;  NOTYPEAHEAD |0 K@ @  `;  MODEL |0 L @    `; ## UPPERCASE@ |0 #N  @  #`; . .VT05B@ |0  .P @  .`; 5 5VT52 |0 005Q @  5`; ; ;VT55 |0 @@;R @  ;`; A AVT61 |0 PPAS @  A`; G GVT100 |0 ``GT @  G`; N NWIDTH |0 ppNU @    N `; U UWRAP |0 UV @   U`; [ [SLAVE@ |0 [X @  [`; b bVT50 |0 bZ @   b`; hh PRIVILEGED |0 h\ @   h`; tt BROADCAST |0 t^ @   t`; AUTOBAUD |0 ` @  `;  CLI |0 b @D   D `;  LA12 |0 c @  `;  LA100 |0 d @  `;  LA34 |0   e @  `;  LA38 |0   f @  `;  VT101 |0 & & i @  `;  VT102D |0 6 6 j @  `;  VT105 |0 F F k @  `;  VT125 |0 V V l @  `;  VT131 |0 f f m @  `;  VT132 |0 v v n @  `;  PASTHRU |0   @  `;  TTSYNC |0   @  `; HOSTSYNC |0   @  `;  SERIAL |0  p @M  `;  CONTROL |0  s @~    ~ `;  ADVANCEDVIDEO |0  u @   `;   ANSICRT |0  w @   `;  BLOCKMODE |0  y @   `;   DEC_CRT |0  { @   `; ))EDITMODE |0   )} @E  )`; 3 3PARITY |0   3 @   3 `; ;;NOPARITY |0 & & ; @   ;`; E EREGIS |0 4 4 E @   E`; LLSOFTCHARACTERS |0 B B L @  L`; \\ VT200SERIES |0 P P \ @  \`; i iINQUIRE |0 ^ ^ i @  i`; r rLA50 |0 l l r @  r`; xx PC300SERIES |0 z z x @  x`;  PROSERIES |0   @  `;  LN03 |0   @00TvATADATADATA  `;  DTC01 |0   @  `;  LQP02 |0   @  `;  PRINTERPORT |0   @  `;  LQP01 |0   @  `;  LQP03 |0   @  `;  LA210 |0   @  `; CHARACTERLENGTH |0    @    `;  LA75 |0    @  `;  LA200SERIES@ |0 & j&  @X TTv HTv TIv  :   X|L+!|L X $ X(|L,+!.|L2e6p:@v BHv JPv T XXZ^؁f X"   2|L+! |L pZ p  Illegal value |0 \  Z  Z  Z r@(     X |L+!ZZ  X |L$+!&Z,Z 0 X4|L8d:Z@Z F XJ|LN+!P؁V|LZ * k 2 P G@):k |L 2 |L ؁p H&`;  EXTA |0 ( (   `;  EXTB |0 . 4. V X  p |Lé!|L+! X|L"+!$|L(V ,p0`;  MCR |0 ^ ^ l    l  p  CLI name required |0 h Hh  C p  p y |L  X|L"d$؁, X0|L4d6|L: @pD`;  EVEN |0    `; ! !ODD |0  !  !p Ps &%& Invalid Command Line InterpreterX |0 4 & Z   P  & X |LdHZ  X _$|L( ,p0 X GGPartition name? |0  GD`@   G X XXBase address? |0  XD   X X g gSize? |0   gD   g X n nTop? |0   n    n X tt Priority? s |0  tD@   t X  Task? |0 , , D    X  File?  |0 8 8 D    X  Code? i |0 D D D    X Terminal attribute? s |0 P FP D@Numeral requiredNumeral, EXTA or EXTB expected  > XB`; PASSWORD |0 f Illegal UIC: numeral expectedSeparator expected Numeral or logical name required/    XeK c&T;wsb z:4}D X@ p@K@@`@p@K@ X@L@؁@|L@K@d@ZZ@H@`;@+!@-8@ |0 t:4}hQ:h|  |0 4 H@ ( 1J X |LKH|Lp |L$(,p0`;  CHECKPOINT |0 00 1  `;  NOCHECKPOINT |0 ::  1  `;  -CHECKPOINT |0 DD !   `; '' EXTENSIONL |0 NN'   ' `; 22 PARTITION8 |0 XX2 1  2 `; ==POSTMORTEMDUMP |0 bb= 1  = `; MMNOPOSTMORTEMDUMP |0 llM  1  M `; __-POSTMORTEMDUMP |0 v00\ |LBH XLLPpT XX|L\+!^؁l,] K ؁K؁ X"|L&+!(Z2 X6|L:+!< p߂D XH|LL+!N|LR-8X X\|L`+!bZ2JdMSD X|L +!H|Ldp"؁(؁.@` S |0 x,x  D8  p |L|L$ X(`;  ACD INSTALL |0 "@@8   X |L|L X`;  AS NUMBER K |0 $   X X`;  ASSIGN |0 $   X X`;  INS |0 @.   X Xp`;   CKP=YES |0     `; ) )PMD=YES |0  )  )`; 2 2SLV=YES |0 * 2J  2|L |L|L|L |L$&`; ; ;CKP=NO |0 0 0;   ;`; C CPMD=NO |0 8 8C   C`; K KSLV=NO |0 @ @K  K`; S SCLI=YESp |0 H HS  S`; \ \RON=YES |0 PP\ 6$6  \|L |L6|L$`; e eXHR=YES |0 j je  e`; n nXHR=NO |0 r rn  n`; v vWB=YES |00dvATADATADATA0 z zv  v`; ~ ~WB=NO |0  ~  ~`;  DFB=YES |0    `;  DFB=NO |0    `; FMAP=YES |0    `;  URT=YESL |0    `;  PRV=YES |0    `;  PRV=NO |0    X`;  INC= |0 $   X X`;  PAR= |0 $   X X`;  TASK= |0 $   X X`;  UIC= |0 $   X X`;  PRI= |0  $   X X`;  ROPAR= |0  $   X X`;  AFF= |0 ,,$   X X`;  TIME= |0 >:>File? Numeral or logical name required/    X9Kb DƀzfZDƀD X@ p@@`@p@a}@ X@ y@@؁@|L@ :@R8^@zPs@?T@d@}@Z@H@é!@`;@+!@^%:@ |0 QfhfZh ]  |0 fn 8ye@Zn 8ye E Xn |L8y|L|LZ" X&n(|L,é!0|L486y<p@|LD :L|LP^%:R^ Xb@`  LP: |0 b<bd   1B  p|L |L$,|L04p8`;  LOG |0    `;  REMOTE |0  @!  p`; WARNINGS |0  1  `;  NOWARNINGS |0 o   p`; ''ADJACENT |0 '  '`; 11 -ADJACENT |0 1  1`; << NOADJACENT |0 <   <`; H HAFTER |0 H^ 1  H^ `; O OCOPIES |0 O8 1  O 8 `; W WDELETE |0 W 1  W `; _ _DEVICE |0 _L 1  _ L `; ggFLAGPAGE |0 g   g `; q qFORMS |0 q8 1  q8 `; x xHOLD |0 ((x@   x `; ~~JOBCOUNT |0 22~ 8 1  ~8 `; JOBPAGE |0 <<   `; LENGTH |0 FF 8 1  8 `;  LOWERCASE |0 PP    `; NAME |0 ZZ ` 1  ` `; NODELETE |0 dd  1  `; -DELETE |0 nn  1  `;  NOFLAGPAGE |0 xx 1  `;  -FLAGPAGE |0  1  `; NOHOLD |0 @ 1  `; -HOLD |0 @ 1  `;  NOJOBPAGE |0  1  `; -JOBPAGE |0  1  `;  NOLOWERCASE |0  1  `;  -LOWERCASE |0  1   `;  NORESTART |0  1   `; -RESTA00l |LBH|LLPpT؁^ XfPsjnpn   :P&c: ||La}|L X"H(؁.H4|L8&> XB؁HHP XT|LX+!ZZ`?Td Xh|Ll+!ZV    f D |LR8^  X|L+! p" X&|L*+!,|L0R8^2f6p:|L>}F|LJR XV`;  PRI |0 \BB @=ef,ADz   X X X؁|L"$|L(, X0 X6f: X>؁D|LHLpPX`;  -ADL |0     `;  AF: |0  FL"   `;  FO: |0 *HO"  *`;  CO:F |0 ..6JO"  6`;  LE: |0 > >B  B`;  LOW |0 F F   `;  -FL0 |0 N N  `;  -HO |0 V V  `;  -JO |0 ^ ^  `;  -RES |0 f f  `;  -NOT |0 n n  `;  NOTIFY |0 v v  `;  PA: |0 ~ ~N  N`;  PRIO: |0  Z  Z`;  RES |0    `;   -LOW |0 @ NMo @: JBJ  p|L|L $ X(؁2 X<`;  :TOMORROW |0 x @:@:-- ~   X|L؁|L"&p* X0؁8 X< XB؁H XN؁T X\ X` Xh Xl Xt XDF @~@@X X X X X X$ X(|L,~.|L24|L8<p@`;  /CO: |0  @   `; $ $/CO: |0 $@@ "  $  y`; * */CO:1 |0 .*D 6  * X X X X&p*`; 1 1/DE |0 1  1 X`; 6 6/-DE |0 6 D 00tvATADATADATA  6 X`; < </DE |0 <   < X`; A A/-DE |0 AD  Ap`; G G/-TR |0  G  G X`; M M/TR |0 44MD  M X`; R R/-TR |0 HHR   R X`; X X/TR |0 \\XDIllegal queue name File(s)? Illegal deviceIllegal job nameIllegal qualifier value ) expected;Must supply DECne   X.t node specification with REMOTE qualifierpb ̀zjLp̀D X@ p@K@K@K!@p@K@ X@ y@@؁@|L@bd@W@Z@é!@`;@+!@ |0 jLphbKh  |0 >(@ @/ >Zp|L |L( X؁"|L&K(, X0؁6|L:>< Illegal operation |0 ::   p `;  CREATE |0 FFL   L `;  INSERT |0 PPf   f `; " "REPLACE |0 ZZ"f   "f `; + +DELETE |0 dd+   + `; 3 3LIST |0 nn3   3 `; 99COMPRESS |0 xx9F   9F `; C CEXTRACTn |0 Cv   Cv `; L LREMOVE |0 fL      ,  ~  L X p|L" X& p,0|L48p<|L@K!BD؁JN XR pX^pb|Lb,    6  6,  ~K!؁ X p" X&|L*K.|L266 X:|L>K@D|LH6L XP؁V|LZK\0L@^ @( F X|L ^|L X|LK! ؁*|L. TTValue expected |0 x2xT B@ 1N  T|L |L X|L é!"|L&*p.`; c cBLOCKS |0 c@ 1  c @ `; k kGLOBALS |0 k@ 1  k @ `; t tMODULES6 |0 Ft@ )B  @  1X  t @p؁ X& X*,|L0K26|L: >pB`; } }MACROV |0 } 1E  } `;  UNIVERSAL |0  R!   R `; OBJECT |0   1  `;  NOGLOBALS |0  1  `; -GLOBALS |0 ((!  `; GLOBALS |0 2 2  `; SQUEEZE |0 :P: ~    1r  X|L+!Z X |L$d&K0 X4~6|L:K<@|LD HpL`;  NOGLOBALS |0  1  `; -GLOBALS |0 !  `; GLOBALSG |0    `; SELECTIVESEARCH |0    `; SQUEEZE |0 V    @|  X|LK|L X$|L(K*.|L26 X:|L>@|LDH XL|LPK!R|L$    16K X|LKp `; NAMES |0 !00| @|LDKFJ|LNP|LTK   X`;  OUTPUT |0 0@ F   |L X|Ld|L"K( X,`; # #LBR |0 `#  ( n    pN|  #|L p X|L p$ y*(, y2n4 y:< yBD yJL yRpT|LXN\ Xn,P h@<=P h= CR INP RPP | X h |L< X؁|L"& X* X0h2؁8|L<@pDLNVPX`Pd Xh XD, : @@@X|L X؁ X X"؁( X.|L26 X:|L>@`; ) )/SS |0  )@  )`; . ./SZB |0  .@  .`; 3 3/NOEP |0 N3:@:@:@:"^  3 X؁ X؁ X&؁, X2؁8|L<"@pD XJ`; : :UNI: |0 0 0:D  :D`; @ @UNI |0 8 8@  @`; E EOBJECT |0 @@E @*  E X X X`; M M/NOEP |0 X XM@  M`; T T/SS |0 ` `T@  T`; Y Y/SZ@ |0 hhY $  Y X X`; ^ ^/DE |0 ||^ .  ^|L  X X`; c c/DG |0 0c L  c|L p|L X"p&|L*,`; h h/FU |0  h  h`; m m/LE |0  m  m`; r r/LI |0 r  r X `; w w/FU |0  w  w`; | |/LE |0 $| , 0  | X X؁ X `;  /-SP |0 42  |L  X|L4`;  /CO* |0 rPF=  :@:@:@= ~  |L F؁ Xp X& X. X2؁8 X>؁D XJ؁P XX X\|L`b؁h Xn`;   /EX |0  .  |L p X`;  TI: |0 G Library? File? Module(s)? Operation? Symbol? To?   WDb t0z8t0D X@ X@L@|L@K@`;@ |0 .8hQ;h  |0 (P< X|L  XLK X$`; CCC |0 $$@   Xb Xz&v~XD X@ p@ X@|L@嫈r@`;@ |0 H[qMh&v~h  |0 *P8 X p߂ X|L嫈r" X&`; RESUME |0 &&@@6.   X X6 X`;  TERM= |0 >>    X(Ib 00vATADATADATApzxpDs@ X@ p@0@K@$96M@@`@p@e@ X@eH@@zL@؁@@|L@y@R8^@s""@K@Ps@:@?T@d@p@"@"@zZ@H@w@嫈r@r@ip@`;@+!@w@-8@ P|0 xh v |0 p|L   Function? |0    Ps  Illegal function |0 Z  . .\F  p |L.|L."p&|L*,|L02|L68|L<>|LBD|LH\J|LNP|LTFV|LPf`br~ l~|L ` |L|L|L|L"$|L(b*|L.r0|L46|L:~ <|L@B|LFlH|LL@/  X؁`;  ACCOUNTING |0 PPB@/ A@&:h   LK X|L X* X.؁4|L8>|LB&D:HpL`; (( ASSIGNMENTSP |0 & (: @ 8  (:|L  Xy "`; 55LOGICALS |0 ..5: 1"  5:p`; ? ?GLOBAL |0 BB? 1  ? `; G GLOCAL |0 LLG 1  G `; N NLOGIN |0 VVN  N `; U USYSTEM |0 ``U  U`; ]]TERMINAL |0 nn] 10  ] |L|L`; g gALL |0 g 1*  g Xy`; l lGROUP |0  l@ 14  l |L Xy`; ssTRANSLATION:FINAL |0 ZsTTHTRTVT   s X|Ld|L p$*,24:<BD|LH"L XP|LTdV X Group number? |0  "   XZ Octal group number expected |0 "'"B /<   X ywLBw%KFF@/  X؁`; CACHE |0 TT @b 1Q(  Xbp`; DEVICE1L |0 jj 1    `; REGION |0 vv 1    `; RATE |0 .    X|Ld@` = |0   :  |L "  X|Ld@` = |0 4   p  X|Ld@` = |0 @/ .  H  X؁`;  CLOCKQUEUE |0 BB@/  P  X|L X X$؁*|L. 0 X:p>`; COMMON |0 ((  `; TASK |0 44 N"  |L N`; ALL |0 HJHtB@/ b  X|L+! p߂ X |L$t& X0 X4؁:|L>BpF`; DAY |0    `; TIME |0    `; DAYTIME |0   `;  ROMAN |0 @/ $  00 J XN؁T|LX,Z Xdph`;  DEVICES |0 44 x   x`; " "PUBLIC |0 BB"   "`; * *SYSTEM |0 PP*   *`; 2 2WIDTHX |0 ^^2   2`; 99 WRITECHECK |0 ll9  1  9p`; E E/CACHE |0 E  1  E `; MM/NOCACHE |0 M  A  M `; WW/MOUNTED |0 W  A  W `; a a/ERROR |0 a  A  a `; i i/FULL |0 i A  i `; p p/MASS |0 p A  p `; w w/FILES |0 Tw@/ ~  w p|L|L" X&|L*+!,|L0e4 X8|L<+!>|LB"F XJ؁P`;  GROUPFLAGS |0 : @(B@/: J   X|L( X X$؁*|L.:2p6`;  SYSTEM |0 BB    `;  LIBRARY |0 NN!   `;  DIRECTORY |0 Z Z  `;  NETWORKUIC |0 bb  `;  NETUIC |0 pp  `;  UTILITYUIC |0 ~~   `;  NETWORK |0    `;  POOL |0    `;  POOL |0   `;  SECONDARYPOOL |0   `;  CRASHDEVICE |0   `;  CHECKPOINT |0   1  `;  CLI |0    `;   PACKETS |0    `; EXTENSIONLIMIT |0 /$   X؁`; " "LIMITS |0 @",B@/F P  " X|L, X X"؁(|L,F. X8p<`; * *MEMORY |0 NN*   * `; 2 2DYNAMIC; |0 ZBZ2vB@/ P  2 X|Lv X X$؁*|L.0 X:p>`; ;; PARTITIONS |0 b; B@/ r  ; |L X|L"+!$ p߂, X0|L46 X@ XD؁J|LNP XZp^`; GG PROCESSOR |0 G!  G `; R RALL |0  R  R`; WW CARDREADER |0  W  W`; c cDEVICE |0 c  c`; k kINPUT |0 &&k  k`; r rBATCH |0 44r  r`; y yPRINTER |0 B,By@/ 0  y|LR8^ X"؁(`;  PROTECTION |0 jj@/ $   X؁`;  QUEUEE |0 . 1P!>   |L X|LR8^&p*`;  ALL00vATADATADATA |0   1  `;  BATCH |0  1   `;  BRIEF; |0  1   `;  DEVICE |0  1   `;  ENTRY |0   1    `;  FILES |0  1A   `;  FORMS |0 0 1   0 `;  FULL |0  1   `;  NAME |0  B 1   B `; OWNERUIC |0  Z 1   Z `;  PRINTER |0 X @ |   X|L+!H?T X$|L(d*H2 X6|L:+!<|L@ipB p߂J XN|LR+!T|Lzh B@B@B@/~-8 X X|L X"|L&( X2p6|L:< XF XJ XR X\ X`؁f|Ljl XvpA`;  TASKS |0 d    d `;  ACTIVE |0   `;  INSTALLEDd |0 @0  `;  DEVICE |0    @    `;  LOGICALUNITS |0   @0    `;  BRIEF& |0 . . @@0  `;  FULL |0 > > @@   `; ! !ALL |0 N N ! @   !`; & &DYNAMIC |0 ^ ^ &    &`; // CONTINUOUS |0 l l /    /`; ; ;RATE |0 z z ;  @   ; `; A AOWNER |0  A @   A `; HHPRIORITY |0 V H  @ 4 F@ F Z  H |L4 $|L(F 0 X4|L8d:|L>eHDpH XP p RR Task name? |0  R  R ]]Illegal task name |0 D ]D  ^  ] X|L+!H" X&|L*+!,|L0 4p8|L<"@`; o oALL |0 . v. o  @  B @/  o X|L+!|L嫈r X |L$+!& p߂: X>|LBdD p߂T XX|L\ ^ Xh Xl؁r|L    Xp`; ttTERMINAL |0  t    t `; ~ ~ASR33 |0  ~ @   ~`;  ASR35L |0   @  `;  CRFILL |0   @  `;  DCL |0   @   `;  ECHO |0    @   `; EIGHTBIT |0     @   `;  ESCAPE |0    @   `; FORMFEED |0 " "  @   `;  FULLDUPLEX |0 0 0  @   `; HARDCOPY |0 > >  @   `;  HOLDSCREEN |0 L L  @   `;  INTERACTIVE |0 Z Z  @   `;  KSR33 |0 h h  @   `;  LA30S |0 v v  @   `;  LA30P |0   @   `;  00  @   }`;  UPPERCASEG |0  @ @   `;  VT05BO |0  B @   `;  VT50 |0  D @   `;  VT52 |0  F @   `;  VT55 |0  H @   `;  VT61 |0  J @   `;  VT100 |0  L @  `;  WIDTH |0  N @   `;  WRAP |0  P @  `;  ALL |0  Z @  `; LOGGEDON |0   [ @   `;  BROADCAST |0   ^ @   `; AUTOBAUD |0 * * ` @  `;  CLIT |0 8 8 b @   `;  LA12 |0 H H c @   `;  LA100R |0 V V  @   `;  LA34 |0 d d e @   `;  LA38 |0 r r  @   `;  VT101 |0  i @   `;  VT102 |0   @   `;  VT105 |0  k @   `;  VT125 |0   @   `; $ $VT131 |0  $m @   $`; + +VT132 |0  + @   +`; 2 2SERIAL |0  2p @   2`; : :CONTROL |0  :r   : `; C CLN03 |0  CV @  C`; I IDTC01T |0  IX @  I`; P PLQP02T |0  P\ @  P`; WW PRINTERPORT |0 WR @   W`; dd ADVANCEDVIDEO |0 ((dt @   d`; s sANSICRT |0 66sv @   s`; || BLOCKMODE |0 DD|x @   |`;  DECCRT |0 RRz @   `; EDITMODE |0 ``| @   `;  PARITY |0 nn~ @   `;  REGIS |0 || @   `; SOFTCHARACTERS |0  @   `;  VT200SERIES |0  @  `;  LA50 |0 00vATADATADATAT @   `;  PASTHRU |0  @   `;  TTSYNC |0  @   `;  PC300SERIES |0  @   `;  PROSERIES |0  @   `; HOSTSYNC |0  @   `;  LQP01 |0  @   `;  LQP03 |0  @   `;   LA210 |0   @  `; CHARACTER_LENGTH |0 $$ @   `; % %LA75 |0 22% @   %`; ++ LA200SERIES |0 @j@+ @ d vTTHTTI|  +|Ld|Lv( X,|L0+!2|L6: X>|LB+!D|LH"LpPVX^`f6 :C@/ F XZ؁ X|Ld ؁( X,؁2`; 8 8USERS |0 8@@/ $  8 X؁`; ? ?UIC |0  ?  ?T׭@` Е.ȕ w%[]T 00s$96M"s""$r(s""4s::FpL0|0 @/  X؁`; DDERRORLOG |0 dDr 1P$6N(N)`  D |L Xr|L$$p(|L,6.|L2N6 X:؁@|LDNF؁N XR|LV"X|L\`` Xd, A(؁ |L"p`; N NOUTPUT |0 zzN 1  N `; V VRECENT |0 V 1  V `; ^ ^CURRENT |0 ^ 1  ^ `; g gHISTORY |0 .g@/ B  g X|Ld|LK X$؁*`; p pHOST |0 2pDevice? Region name? Refresh rate?   pb tXz_Mp:tXD X@p@ X@L@؁@|L@K@`;@-8@ |0 _Mp:h2h>  |0 Jo@*j/mf X|L o|L*p|L -8$L(j. X2؁8L >XPRESS |0 ` `>  >`; FF NOTLIKELY |0 h hF   F*b XzSZXD X@ p@K!@@`@p@`@ @8^@H @K@ X@@zL@؁@|L@G@Ps@Gw@d@"@"@Z@H@w@é!@`;@+!@Bw@-8@ |0  SZhQSh  |0 j00  @)B L  @( X |L|LT X؁&|L*",L 0|L4>6؁B XF|LJé!L|LP"RL X X\؁f|L>fU   @)B U  1R U |L؁ X$|L(é!*|L. 0U 6p:`; DEFAULT |0  !    `;  DENSITY |0   1   `; FILEPROTECTION |0    G `; " "FOREIGN |0 "   "`; ++OVERRIDE |0 +   + `; 5 5OWNER |0 5 !  5 `; << PARAMETERS |0 < !  < `; HH PROCESSOR |0 H 0   H0 `; SS PROTECTION |0 S 1  SG `; _ _PUBLIC |0 _x@ 1  _ `; gg SHAREABLE |0  g@ 1  g `; r rSYSTEM |0 rx@ 1  r `; z zWAIT |0  z 1  z `; NOWAIT |0 ** 1  `; -WAIT |0 44 1  `; WRITE |0 >> 1  `; NOWRITE |0 HH 1  `; -WRITE |0 RR  `; SHOW |0 \ \  `; NOSHOW |0 d d  `; ACCESSED |0 jjh  h`;  EXTENSION |0 ||h  h`; UNLOCK |0   `; WINDOW |0 z   z`;  BLOCKSIZE |0 V  V`; CARRIAGECONTROL |0 @  @`; HDR3 |0   `; NOHDR3 |0   `;  -HDR3 |0   `;   LABEL |0    `;  NOLABEL |0    `;  -LABEL |0    `; ## RECORDSIZE |0 #V  #V`; // TRANSLATE |0 ../ p  /p`; ::VOLUMEIDENTIFICATION |0 >>: 1A  :`; P PCACHE |0 NNP(b 1  P b `; W WNOCACHE |0 Z^ZW) z * ( ),   !Qz  W X|Ld|Lz  $ X(؁.|L24|L8:؁B XF؁L|LPR VpZ`;  ` `CREATE |0 `T !  `T `; h hREGION |0 h0 !Q  h0 `; pp DIRECTORY |0 pB!  pB `; {{ NODIRECTORY |0  { !Q  {`;  OVERLAY |0  B!  B `;  NOOVERLAY |0   !Q  `;  VIRTUALL |0 @B!  B `;  NOVIRTUAL |0  @ !Q  `;  READ_AHEAD |0 B!  B `;  NOREAD_AHEAD |0   !Q  `;  LOGICALI |0 B!  00vATADATADATAB `;  NOLOGICAL |0  !  `;  DEFER_WRITES |0 " "!  `; NODEFER_WRITES |0 *V*@@t|   X|LK!|L X |L$K!&H. X2w6|L:K!<|L@B|LFtHwN XR|LP|@@  tK!|L  |L X p߂ X$|L(K!*`0 6 X:|L>+!@|LDHpL`;  SAVE |0    `;  UNLOAD |0    `;  NOUNLOAD |0 ` " "~   X|L+!|Lp H* X.|L2+!4|L8-8< X@|LD+!F؁NLRT؁\ X4D ,|Ld |LDp`;  UNIQUE |0 L\L  K X|LGw` X$|L(+!*Z2 X6|L:+!<|L@DpHZP XVX`;  FULL |0 > P(  B @T   X؁|L|L"(|L,0 X4|L8é!:@` "", |0 4" )B  u D  "|L p؁ X$Ps(u ,p0`; $ $USER |0  $  $`; * *INDEXK |0 **.VH  * p|L.|LV X |L$Gw&`; 1 1FULL |0 <"<1R:  1 X |Ld|LRp`; 7 7FORTRANL |0 Z Z7  7`; @ @LIST |0 b b@  @`; F FNONE |0 j$jF:  F X|Ld|Lp `; L LEBCDIC |0  L  L`; T TNONE |0  T  T`; Z ZUT1 |0  Z  Z`; _ _UT2 |0  _  _`; d dUT3T |0 ^d(!)! @(@ J~  d X|Ld؁|LH "|L&(؁0 X4|L8é!:|L> D XH|LL+!N؁X|L\JR] B@, J]  )B@@u  j] |L |L, X|L é!"|L&J(] ,p0؁: XBPsFu JpN`; iiIDENTIFICATION |0 RRi   i `; yyEXPIRATIONDATE |0 ^^y  y`;  ACCESSIBILITY@ |0 ll  `; SETIDENTIFICATION4 |0 z$z  "$   X X `;  MOU |0 h @@,,~  |L  ؁|L X X$ X*|L.2 X6؁< XD XH XN|LRV XZ؁` X@ *p|L |L@`;  FPRO= |0   8^ `;  FORF |0  Rx6  |L R|Lx|L`;  ACP= |0 : :   `;  PRO= |0 BB   8^ `;  PUB |0 L Lx  `;  SHAREX |0 T T  `;  NOSHARE |0 \ \00 @zUq5a>@D X@ p@p@ X@L@|L@K@Z@`;@+!@ |0 "QUqhtUq5ah @ |0 *  T0p|L |LT" X&`; /TRANSLATION_ROUTINE |0 &L& 2 Bf l  |L 2  X|L+!B p$Z*L.2 X6f8 p>D XH`;  REGION |0 n0n D D8   p|L|L( X,`; ACD REMOVE NUMBER |0 $   X X`; 2 2REMOVE L |0 2@.  2 X X X`; ; ;REG |0 5;Task? Numeral or logical name required L  ;4Ktb 0zYq0D X@ X@L@|L@K@`;@ |0 FYqh_h   |0 4<P:@(J X|L < XL: X$|L((, X0`; BRO CO: |0 00 Message?    XK`b zsD X@ p@K@@`@p@_@ X@L@؁@R@|L@K@jPs@d@Z@H@`;@+!@-8@ |0 MQshsh  |0 p> , />  00vATADATADATAh& X> |Lp p ,"|L&K0p4_8؁>>BpF|LJR|LV^|LbhdPsh&lpl !`; UIC |0 pp@0 !  0 `;  STATUS |0 zz 1"   p`;  CHECKPOINT |0   !  `;  COMMAND |0  . 1  . `; "" POSTMORTEM |0 " !  " `; .. EXTENSION |0 . 1  . `; 99 PARTITIONb |0 9 !  9  `; DDPRIORITY |0 D 1  D `; NNTASKNAME |0 N  1  N  `; X XIO_PAGE |0 X@ 1  X `; a aSLAVE |0 a !  a `; hh TIMELIMIT |0 hF 1  hF `; ssREAD_PARTITION |0 s  1"  s p`; DELAY |0  N 1   N `; INTERVAL |0  j !   j `;  SYNCHRONIZE |0  !   `; SCHEDULE |0 &Z&"" & |& &|   X|Ld؁L"$؁, X0|L4+!6H<&>|LB|D&H XL|LP+!RHX&| &0|L & X|L+!@`  |0 * |&H  |L | & X|L+!|L"p&`; TASK |0   `; COMMAND |0 `& & & &  Ps& X|L+! |L$R&&, X0|L4+!6Z<&B XF|LJ+!L pR&V XZ|L^+!X$ & &  & d&MSxZ & X|L+!|L-8 && X*|L.+!0H6&:|L>d@&DpH؁N؁T@` M |0 xx  p `; TICKS |0    `; SECONDS |0    `; MINUTES |0    `; HOURS |0 $   Xp`; TICKS |0    `; SECONDSX |0    `; MINUTES |0    `; HOURS |0 $   X X`; RUN |0 T  d@N@$@<v  |L p|L|L ( X, X2|L6d8|L|LB$D|LH<L XP`;  /RSI= |0 ,, .   X |L X`;   /UIC= |0 DD  $   Xp`; /EST=YES |0 V V  `;  /EST=NO |0 ^p^v@@  TSMH~   p|L|Lv X |L$&|L*. X2؁8 X>|LBFpJ؁R؁Z؁b؁lpjTSMH  @<(v؁ ؁؁؁& X*؁0|L48 X<؁B XJ XN XT|LX<Z|L^(bpf`; $$/CKP=YES |0 0 0$  $00 `; p p/CMD= |0 p$  p X X`; w w/INC= |0 w$  w X X`; ~ ~/PAR= |0 ~$  ~ X X`;  /PRI= |0 $   X X`;  /TASK= |0  $   X X`;  /TIME= |0 $   X X`;  /ROPAR= |0 ? "Task? &Illegal or missing qualifier or value    XKpb 0z~8Y0D"@ X@}@,@p@ X@@؁@|L@""@y@Ps@Zp@W@r@e@`;@s g@ m|0 D~h  |0 l B B8 @=  Z.//~p|L |L|L 8$ X(|L,.4 X< X@|LDF؁L"R|LVX"^|LbfFh vLI @d&d" ,|Ly "$|L(,p0 X6y :&>pB`; FTB |0 !  `;  TKB |0 p @ /  |   X |L|L X"|L&("0p4 X: X@ XF XL XR XX X^ Xd Xj X    X X X X X" X( X. X4 X: X@ XF XL XR XX X^ Xd Xj Xp Xv X| Xl !"#$/ @ ,@>@,@| X X X X X& X*؁0"8 X<|L@B XF H؁N|LR>T XXZ؁`|Ldhp2> X XW|L X"W*p.`;  /SP |0 0 0 _  `;  /-SP |0 8^8`C+(IV( [V( [)( [( [( [>( [?( [~   p X(W(|L"&((|L,0(2|L6:(<|L@D(F|LJN(P|LTX(Z|LlB( [C(=<<@P@,P( |L(p X W&|L*0 X4|L8: X@B|LFJ XN؁T XZ^ Xb Xh`;   /DA |0 8 H, CAC 6ALCP@  " ؁p"6$,4`;  -CP |0 .0. DA PM1EAFP0  $,`;  -FP |0 ZZFU"MM, C$  `; $ $-MM |0 rr$-lSB;"  $l `; ) )-HD |0 6)%~9NMHPI CPR2HIPL>  )|L ~ (H*2`; . .-IP |0  .I  .`;00vATADATADATA 3 3-SE |0 35RO6  3`; 8 8-RO |0 87SGF  8`; = =-SGU |0 6=GSL:SQ8 CXTZTRACM:  = Z"*2`; B B-XH |0 BbIDcCLfFMhFOj:Y:[: :MCON|  B * X.؁4 X< X@؁F XN XR؁X X` Xd؁j Xrpv~*LIOMUCRMA>( p&`; G G-MA |0  G?  G`; L L-WI |0  LC  L`; Q Q-SH |0 Q)  Q p`; V V-CC |0 VDL LB (  V`; [ [-MA |0 4[MP0SSD:<  [ X؁$ X, X0`; ``@LB:[1,2]C81LNK |0 :`@H6  /  AX  `|L H |L6؁|L  X$؁*|L. 2p6`; rr/CLU:RMSRES:SMRES |0 P*Pr P^ Q Q@  r^ |Lp X X$&`; /FMS |0 v v Q  `; :FDVRES0 |0 ~2~ P4 P L  XPs 4p X "|L&*p.`;  /CLU:RMSRES |0     `;  /CLU:RMSRES |0   P  `; /IO:MEMRES:RMSRES |0   p `; :FDVRES |0  P  `; /FMS |0   p `;  /CLU:FDVRES |0   P   `; /FMS |0  Q,   |Lp`; /RES |0  PB$   Xp`; DEB |0    `; MAP |0 .V2,:  X X|L2 X ؁& Xq&f  D~w8OTS or RMS :NORESIDENT is not allowed with SORT:RESIDENT0 s g s g"""$r(p.e4}jSb pz}pD"@s@ X@-}@0@nL`@:@p@Id@ X@ y@@z؁@|L@y@s""@Ps@:@p@@}@r@e@:@`;@ |0 Qwh s |0  B ~ 4B B B B B B@ B B B Bp|L |L~|L 4&|L*0|L4:|L>D|LHN|LRX|L\b|Lfl|Lpv|LzT| B B PB f tB@ B \|L|L |LP"|L&f,|L0t6|L:@|LDL XP`; TIM |0  "   p`;  /SYNC |0     `;  /SETTOY |0      |L Time or date expected |0 t@@  --@X@ @    X X|L  X"؁( X.؁4 X:؁@ XH XL XT|LXXZ|L^`|LdlppyD` 33H  y y *y .< X@`; -- SET /DEF00 D:P0Xexe~X|ʋ  @` Е.ȕ wf000-}nL`  -}nL` $:2s""4r8s""DsJ:Vp|0   p`; H HACS |0 H  H `; N NACS |0  NA  N`; T TSET |0 T"  T p`; Z ZBUF= |0  Zr   Zr`; ` `LOWER= |0 `   ` `; h hPUB= |0 h   h `; n nWCHK=r |0 n    n `; uuNOLOWER= |0 $$u   u `;  NOPUB= |0 ..     `; NOWCHK= |0 88     `; CACHE= |0 BBT   T `; NOCACHE= |0 LJL@f d   X|L|Lf X" X* X.|L24 X<p@ XF`; TI: |0 $   X X`; /BLKS= |0 *   X X X`; /BLKS=0 |0    X `; FLA |0 P 1(   X p`; ELIM |0 !  `; CRE |0   X`;  SET /LIBUIC= |0  $   Xp`;  SET /TOP=K |0     `;  SET /PAR= |0 z^ :  : :: :::  ^ X X؁ X" X& X,؁2 X8؁> XD؁J XR XV X\؁b Xh؁n Xt؁, : 8|L X X؁ X$p(`; TASK |0    `; COM |0    `; DEVR |0    `; DIAG |0    `;  SYS |0    X `;  SET /NOPAR=> |0  $   X X`;  ALT |0    X `;  /PRI= |0 <   (8 L   Xp|L}|L"Id(|L,(4p8`; "" SET /DPRO= |0 00"@  "@ `; .. SET /NODPRO; |0 :v:.[l,~,,]***ˀ  . X؁l؁~؁$&؁,.؁6p: X@؁HpL XR؁Zp^ Xd؁lpp X*؁ X`; ; ;QUE |0 *;B@AB  ; X X|L|L" X&`; A A/FI |0 A$  A Xp`; F F/HO |0  F  F`; K K/REL |0  K  K`;00vATADATADATA Q Q/MOD |0 Q   Qp `; W WAF:p |0 WpCO&  Wp `; \ \DEL |0 " "\  \`; a a-DEL |0 **aFOLE,  a`; g gLOW |0 BBg PA"  g`; l lPRIO |0 R Rl  l`; r rRES |0 Z Zr  r`; w w-RES |0 b bw  w`; } }-LOW |0 jxj} R::--~  } X|L|Lp" X(؁0 X4؁: X@؁F XL؁R XZp^ Xd Xl Xp X`   2Pbt~ X X X X X X(p,|L022|L6P8|L|LBtD|LHJ|LNP|LTXp\`;   SET /SYSUIC= |0 : :h  h`;  SET /NETUIC= |0 B Bt  t`;  SET /UTLUIC= |0 JJ"   X`;  SET /MAXEXT= |0 XX$   X X`;  SET /MAXPKT= |0 jj$   Xp`;  SET /POOL= |0 | |   `;  SET /PLCTL=E |0  "   p`;  SET /LOGON |0    `;  SET /NOLOGON |0    X`;  SET /CKP= |0 $   Xp`; SET /CRASHDEV= |0   A  `; SET /NOCRASHDEV |0 8{x@A|N   X X|L X $ X( X0 X4`; ( (/PAR= |0 l(z=y@ :,@ :D@ :\|  ( X X؁ X X$ X*؁0 X4,8 X< XB؁H XLDP XT XZ؁` Xd\h Xz`@  D D  ~ X X X X X$ X( X0 X4 X<p@|LDL|LP Z X^|Lbd|Lhl Xp"v|L X `; / /SET / |0 / (  /|L p`; 6 6INQUIRE |0 6   6 `; ? ?ASR33 |0 ?  "  ? p`; F FASR33 |0  F   F `; M MASR35 |0 M   M `; T TKSR33 |0  T2   T `; [ [LA30P |0 **[3   [ `; b bLA30S |0 44b4   b `; i iLA36 |0 >>i5   i `; o oLA120 |0 HHo6   o `; v vLA180S |0 RRv7   v `; ~ ~VT05B |0 \\~P   ~ `;  VT52 |0 ffQ    `;  VT55 |0 ppR    `;  VT61 |0 zzS    `;  VT100 |0 T    `;  VT50 |0 Z    `;  LA12 |0 c    `;  LA00     `;  LINESF |0      `;  RPA |0  @    `;  NORPA |0  A    `; $ $REMOTE |0  $B   $ `; ,,NOREMOTE |0  ,C   , `; 6 6CRT |0  6D   6 `; ; ;NOCRT |0  ;E   ; `; B BSPEED |0  B   B `; I IHHT00vATADATADATA |0  IH   I `; N NNOHHT |0  NI J &  N X `; UU NOTYPEAHEAD |0  UK   U `; b bTERM |0  bl   bl `; h hNOLOWER |0   hN   h `; q qLOWER |0   qO   q `; x xBUF |0   x~   x~ `; } }WRAP |0  }V   } `;  NOWRAP |0 * * W    `;  SLAVE |0 4 4 X    `;  NOSLAVE |0 > > Y    `;  PRIV |0 H H \    `;  NOPRIV |0 R R ]    `;  BRO |0 \ \ ^    `;  NOBRO |0 f f _    `;  ABAUD |0 p p `    `;  NOABAUD |0 z z a    `;  CLI |0      `;  SERIAL |0  p    `; NOSERIAL |0  q    `;  CTRLC |0  s    `;  NOCTRLC |0  t    `;  AVO |0  u    `;  NOAVO |0  v    `;  ANSI |0  w    `;  NOANSI |0  x    `;  BLKMOD |0  y    `; NOBLKMOD |0  z    `;  DEC |0  {    `;  NODEC |0  |    `; $ $EDIT |0   $}   $ `; * *NOEDIT |0   *~   * `; 2 2PARITY |0   2   2 `; ::NOPARITY |0 " " :   : `; D DREGIS |0 , , D   D `; K KNOREGIS |0 6 6 K   K `; T TSOFT |0 @ @ T   T `; Z ZNOSOFT |0 J J Z   Z `; b bPASTHRUO |0 T T b   b `; kk NOPASTHRUY |0 ^ ^ k   k `; v vTTSYNC |0 h h v   v `; ~~NOTTSYNC |0 r r ~   ~ `;  HSYNCI |0 | |     `;  NOHSYNC |0      `;  CHAR_LENGTH |0   "   X`;  ACD |0    (  |L p`;  UNLINK |0       `;  LINK |0     2   X؁|L `;  TO NUMBER |0 b  @F   ? (  G< |   X X|L  X X$|L( * X2 X6|L: < XD XH|LL N|LR( VpZ y`< r4 T F:GF:F L U b~|LT X X؁ X$ X( X.؁4 X< X@|LD F XN XR|LV X X` Xd|Lh j XJ  @ =00  XD F`;  TI:X |0 \  r  "8D|   X X X|L  ؁(p,y 04y 8:">pB|LF8J|LNDT XXy@&  X y "7"eeee|0 P P X`;  SET ACC |0 X(X@b :  |L b X؁ X X$`;  SET /PUC= |0 |J| ,    .(R   Xp|L|L (|L,4|L8.B XF`;  SET /HOST= |0   .   X X X`;  DTE |0 &@$ r@8   X X$ X Xr"`;  STE |0 J@P>ID`   X|L XP X X(p,|L0>2 X8B XF`;  DIAL= |0 FF$   Xp`;  AC= |0 X X  `;  AP= |0 ` `  `;   CI= |0 h h   `;  CH= |0 p p  `;  DA= |0 x x  `;  LO= |0    `;  PA= |0    `; # #PR= |0  #   # `; ( (SE= |0  (  (`; - -US= |0 -"WA"  -"`; 2 2NOWA |0 z2    |  2 X X X X" X& X. X2 X: X> XF XJ XR XV X^ Xb Xj Xn Xv X&  X X`; 8 8PAD |0 6p68@@ Z l A   |  8|L @p|LZ|L l( X,2 X: X>؁D XLpP|LT}\|L`Idh Xl`;  = =ELI |0 *=PB  =|L p X|L"p&`; C CHL:X |0  C  C`; H HSL:X |0 PHRE*<n  H X X X" X* X.|L24|L8<p@|LD*F|LJ<L`; M M/LIM |0  M  M`; S S/-LIM; |0 $$S$  S X X`; Z Z/BA |0 88ZA$  Z X X`; _ _/SW |0 J(J_PNV DE 4  _P p X$`; dd SET /PASSWORD |0 n$nd /SNA expected /DTE expected   dIb 0zXa0D"@s@ X@-}@0@nL`@$96M@p@8@ X@@؁@z|L@y@s""@:@p@%p&@r@:@`;@ p|0  Qxh kp |0  p`; CLQ |0 JB B B `B B B B T  |L|L|L"`(|L,2|L6<|L@F`;  FLA |0 NNB@  00vATADATADATA  `;  SET /LIBUIC |0 XX B B "  |L`;  RMD" |0 l,lB PB pB B 6   |LP|Lp|L"(`; DEV /LOG |0 ZB@ 4 B p   *   d   |L4 |Lp |L" (|L,* 2|L6 <|L@F|LJ R XV`; &&SHO ACC |0 &@$  & X X`; 0 0RMD |0 p0 @N ID$AC<,,,  0|L  |LNp؁ $"؁(<, X0؁6 X< XD XH؁N XV XZ؁` Xh Xl`;  6 6CBD |0 hh6P@t(  6 X tp`; < <TASKS |0 | |<  <`; C CALL |0 C  C X`; H HTIM |0  H@  H`; N N/ROMAN |0 N  N X`; VVSET /DEF |0 V  Vlf ׭@` Е.ȕ w%[]~%p& %p&-}nL` -}nL` :"0&0*2s4$96M:s""  0> `; 5 5FIN |0 $ $5  5`; : :ALL |0 ,0,:=<  : p X X؁ X(p,`; ?? SET /PAR=X |0 X X?d  ?d`; J JPAR |0 ``J*  J X00   >LA180S |0 ` `>$  >`; FFNOLA180S |0 h hF%  F`; P PVFILL |0 p pP&  P`; W WNOVFILL |0 x xW'  W`; ``NOREMOTE |0  `(  ``; j jREMOTE |0  j)  j`; r rLOWER |0  r*  r`; y yNOLOWER |0  y+  y`;  MCR |0  ,   `;  TERM= |0 -"   " `;  LINES= |0 ."   " `;  RPA |0  0  `;  NORPA |0  1  `;  PRIV |0  2  `;  NOPRIV |0  3  `;  REMOTE |0  4  `; NOREMOTE |0  5  `;  CRT |0  6  `;  NOCRT |0  7  `;  SLAVE |0  8  `;  NOSLAVE |0  9   `;  SPEED= |0  :"   " `;  HHT |0  <  `;  NOHHT |0  =  `;  TYPEAHEAD |0 & &>  `;  NOTYPEAHEAD |0 . .?  `;   NOLOWER |0 6 6 @  `;  LOWER |0 > >A  `;  VT05B |0 F FB  `; ! !NOVT05B |0 N N!C  !`; * *VT50 |0 V V*D  *`; 0 0NOVT50 |0 ^ ^0E  0`; 8 8VT52 |0 f f8F  8`; > >NOVT52 |0 n n>G  >`; F FVT55 |0 v vFH  F`; L LNOVT55 |0 ~ ~LI  L`; T TVT61 |0  TJ  T`; Z ZNOVT61 |0  ZK  Z`; b bVT100 |0  bL  b`; i iNOVT100 |0  iM   i`; r rBUF= |0 rN"   r" `; x xWRAP |0  xP  x`; ~ ~NOWRAP |0  ~Q  ~`;  BRO |0  ^  `;  NOBRO |0  _  `;  ABAUD |0  `  `;  NOABAUD |0  a   `;  CLI= |0 b"   " `;  LA12 |0  c  `;  NOLA12 |0  d  `;  LA34 |0  e  `;  NOLA34 |0  f  `;  VT101 |0   i  `;  NOVT101 |0  j 00  >REGIS |0 z z >  >`; E ENOREGIS |0  E  E`; N NSOFT |0  N  N`; T TNOSOFT |0  T  T`; \ \VT2XX |0  \  \`; c cNOVT2XX |0  c  c`; l lLA50 |0  lT  l`; r rNOLA50 |0  rU  r`; z zPC3XX |0  z  z`;  NOPC3XX |0    `;  LQP01 |0    `;  NOLQP01 |0    `;  LQP03 |0    `;  NOLQP03 |0    `;  LA210 |0    `;  NOLA210 |0     `;  CHAR_LENGTH= |0  "   " `;00$(vATADATADATA  LA75 |0     `;  NOLA75 |0    `;  LA2XX |0     `;  NOLA2XX |0   $   p X`;  TI: |0 0 0    X `;  QUE |0 < < @   X `;  /LI:DEVT |0 H 4H @R :B:I:P@  |L R p", X0`;  QUE |0 x (x @@  @ B   X |L |L |L p$`;  /EN: |0      `;  /FO: |0 6    F    X X X X" X& X.p2`;   /BR |0    `;  /FU |0    `;  /LI, |0 8 :P:B  F  p p"|L& (؁0 X4`; Protection UIC: |0   8  |L 8 y  X`; - -ELI |0 2 2 -@l @(  -|L l X`; 3 3/SH |0 D D 3@N (  3|L N p`; 8 8/NEW |0 V V 8  8`; > >/CU |0 ^ ^ >  >`; C C/HI |0 f f C (  C p X `; HH ERRORS.LST= |0 | | H=*  H X؁ X`; UU SET /DPRO |0  U  U X `; `` SET /HOST |0  `   `(  3|L N p`; 8 8<0b 2( I@ZS:##q##2####Ş#)p#) #T,#T,##0##0L##0v##0##0##0##0#-0#;M)#_M >Ln #nW#nW#6##@j#k#˦#(6}#~##D#%p&#%u&#9L 9}:""6:@Q:T#:T#E\#E#FM#GHS#Gzd<VGg<VGh<VGh<VGP#I3"I#J#O#bXbwcKc1M#cOe#iZq6qu ->q 0s""#s g#M!##K#pr#s54Psbss54 ##k#r=j۩(#ᩀW#p#r#婐#機# ?xx#zx# d# Vd#*@#*#*QN#*:^#*:d#*σ#+ #+ #+ #+H #7w#9#9@#9h#9?T6<z#>L>L##Bx#Z#E#PX!#ɪ}˪p#˪p#˪r# k#?T6""6 #'""6-}#.p#A#AKAKALA XA}sBZC, C@`D7DZD`Dw7E7EK0|E_5EPs54Ew7FVN#Fy>LJS#JS#JyL`;L]L؁LMN|LN,<NHOZOpP""6Q3"R!!R@8+R]+RpTy;Ty;U X<W&WfW`q^/.#(_# ##8##Y}6^@#ȫ 8n""6 X0#, @#K0|Ps54櫵W8\S#S#00, L.q?AK`z|LYMnMpxQ|Q_XiY}`:dwf:d!f+f+kp /.m3"Lw 6^Ay8nZ;@ ;t<g<VK004(vATADATADATAb 0z&W0Dk@#q@:""@aK@)p@?T@?T@p@l?T@r@ W&h RphAKh  7& &fW0W9WAWZ wR  W.W$ W*L?Tr?TraK"?T$r.#q2#qR:""TrXpJ|W% 5W0W9WAWZ  aK)pk8l?T:r~b 0BA0D#q@ Jyh꫐yh |#qb 0bK`0D]@0@GP@9x@A@FM@ R<h V&f&  ҕT  N f 2 GPFM0"A40<9xF9xL] b 0z&Z0Dk@#q@:""@aK@&?T@)p@?T@?T@p@l?T@r@?T@R HOZhHW`h*BZhXDZhhNHhWfhD`hAKh AZ e09 ]W.Y W7W* NRJ07 A01 909 r1W.V?Tr?Tr0&?T2r6aK@aKN&?TPr^?T`rn?Tpr| .R) *ҕ.$7W* R09 ,W.  ҕ. R w&f& vF?Tr aK*aK8?T:rh:""jrnpx#q|#qTv W7 R   5 vv ,)p.k@l?TBrb 0znMp0D@]@0@@@n@.p@b@e@ @ ~h~:PhphBPshJbshRbXhbwh4 Ba& c  e  w w w &fДД  wT ]e.p".p*b4]:eDbLT\ f0x0,|Ba s*.p .p]n ]*b tpj,tpD#q@:""@+ @+ @""@p@r@ RALh V&ff7 P ͋  wR7 # > + + #q&+ .:""0r4p<"">rB+ b 0z|L0DGzd@k@#q@:""@ k@#2@Gg@ɪ}@)p@""@p@l?T@RPs@r@ L؁h`Lh<`;hz؁hhL`;h  &fef&  50 ;5 1 &e  50   &e  50 8#qɪ}$#2.Gzd8#2J#qV#2n#qz#2|w5 5 %5#W0W9 WAWZW0W9 WAWZD :""rp#2"#2(Ps*r0)p2ktl?Tvr5;&fW- WN,WO)5 7   (ȋ50 wҕN wҕOe> #2.#24 kN#2X:""Zr^pj:""lrpp>t&e  e e w,#qGg#q(#q6""8r#2L#2T#2`#flKt#2|#2|55#2#2b 0Jt@0D#2@M!@ @ *(h .&  55  M!#2(#2b 0rYM0D#q@""@.p@p@r@@ 8L]h]h]h <&& w& >#q #q""rp".p(.p..p2b 0znM0D]@#q@s@""@.p@p@r@M!@ l,h9Lh&C,h  p&& &&     wl.p .p#q#q]s"M!,.p0.p<]BsX]`]h""jrnpb 0zxQ0Dk@ k@9@#2@8@ت""@mPs@p@9h@r@ @ ,hVMh f # 5 @!~#e7  7e wf 5wˋ 5P #29*k0 k< kB kRmPsTrXpd l#2v9|e (5* % p& 66 Xv e Hee e8#2 8k"#2(9Vkdk|ت""~r͋ww5 Q@!K# S! 5͋e@!͋ S!e&89h#2D#2Tkzkteˋ 5e J T& 66 ,v e Hewwww ,kk#2$8(k^klk@W!K# S! 5͋9"#22kb 0z0D@@@@+ @Q@E\@˪@S@GP@QQ@p@P""@%p&@*r@FM@ D9}h H MMCRwfS %p&˪E\Q@QQ@$GP*FM0FM6FM<+ @P""BrFpb 02|Q0D fɪ}h j&ffAB@Q ͋ _  _  a`5 %b 0R0DE""@:T@r@ @ &:@Qh * ?_   :T:T E"""rNb pz%vQpDw@Q@,@;d@@@@QF @_Mp:@*y}@@Q@* @z` @QVq@QTq@QUq@Q` @Q@Q@[qM@Q@jLp@ @Qj@Qz@8@SZ@z'@Q@Q2@Qf@Q'@ zR@,9^@QZg@_@(@@_Ma@Q@Q@x@Q'@zX@z@fZ@Qs@e"@y@Qd4@{S@qO@s@Q@˪@yd@@_@z@QQ@e @m@2d@Q]R@:4}@t!@|C^@Q;@}@Q@ys@Qw@QS@zkQr@Q@Qx@Ud@@'@bK@Q@Q*@Q@Q@Q(@kQ@Q@Tq{@zy:i~@Qy@e@Qv@Q|@K f9@y@Qy@Qy@Q z@vLD@ H@u:@s@_@zQy:@~@Q:@Q@nZ&@2@v@ 8@Yq@j_@L@Zg,@Rv@VqM@&Z@R@Uq5a@&v~@Q;d@d4@R,@Qq@_@ b00D(vATADATADATA 0J_X0D@@  "h="h w b 0JiY}0D#q@M!@ N|Lh|Lh  #q M!b 0R(0D#q@:""@p@r@ $C@`h (&  w #q:""rpb 0Z`0D#2@@#@M!@ 6變phOph :& e% 555&#M!#2$#2,#2b 0b0D@ X@y@cO@A@ |0 h |0  w$ Xy AcO^b >z:dw>D:T@:T@@@k@I@+ @:""@ݩPs@}@ @ k@9@j@j@EK@@[""@p@) @r@Ps@@@ A}sh 77 77 7 7 7 7U #ե  !ե! ͋ͥ*wv9 k@j+ @ "I&:T*:T.26}:) ƀzf:d>ƀD@@@@]@k@LX@L]@""@Bn@E\@SQ@˪@@zɪ}@GP@)p@p@O@%p&@L @r@LH @@9}@FM@ R!h %vQ %  E`w  B @  5Nw5WAWZD]L LH .E\2ɪ}NLXRL]^Od9}h)pjk|W0W9WAWZW0W9 --5-wwwCҐRR wb2SQ8E\:˪@E\BJOPE\RX@\@`GPdE\hFMxBn|%p&~Bn$ww  B "" rpE\ɪ}b 0z<0D&kHL]@"HTy@OZ@Ty@AL@L@T,HL؁@ XH#ŞHz<&@ pHN|L@#qHp@W`@%Z@fH,@T,HJy@#0HnWH`;@,H"z@`H EPs@yH-0HpH'@#0vH#0LH#0H#2HU X@@jHd"@BZ@nWHz ="H!n H`H_H X@HH#0HKH KH XH؁@y@@y@z yH yH HN,@|L@DZ@#0HW&@LHDw@#0H؁HL`;@|LHNH@z)pHDH 變p@6HD@`HEw@#H="@yH FVNHPsHKHE@JH zZHRp00L FhN۩(hvehEh.phh˪phc1Mh*:^h*@h dhZz˪ph Vdhchs""hX!h˪rhWhFOh<h\Ah*hEh(_hzxhN9hhvzWh6rhxxhJeh9@hnhrhtM!hzZhzs gh`*:dhGHShFMhDy|0 Z%p&h%u&he!g HJShe:g JSh~!g HSh~:g Sh t <&""$$` `##F'%Z ``l pSY0:ATLNK.TMP;lp  :$ n n<<Z ZHELP/DCL ddd  d)0 06 6BB?N NnTn'Error dispatching command. DSW = e!gA X~!g Xe!gOp~!g變pe!gN|L~!g|Le!gU X~!g Xe!gFy~!gse!g  AL~!g  se!g  L`;~!g  `;e!gL؁~!g؁e!gL~!ge!gJy~!g꫐ye!gTy~!gye!gTy~!gye!gC@`~!gse!gAK~!gse!gNH~!gse!gAK~!gse!g  W&~!g  se!g""DZ~!g""se!g$$OZ~!g$$se!g&&W`~!g&&se!g((D`~!g((se!g**Wf~!g**se!g,,BZ~!g,,se!g..Rp~!g..se!g00s~!g00櫵We!g22N,~!g22,e!g44EPs~!g44Pse!g66s~!g66"e!g88Ew~!g88se!g::Dw~!g::se!g<<E~!g<<se!g>>D~!g>>se!g@@E_~!g@@se!gBBs~!gBB="e!gDDC,~!gDD,e!gFFL]~!gFF]bb 02f0D R@8h Jb 0zf0D#2@ȫ @Gh@ d@D@ Vd@@˪r@p@q @%u&@*""@2r@ @FM@ R]h W!&Օ &fA@  ȋ ͥ?  w&f  N` 5R%u&%u&", 4q HX*""Zr^phFMp VdzGh`|  ҕ N`  ҕ @  |2 :00T(vATADATADATA#2 DGh(D: dB˪rH˪rLȫ b pzH&pDT,@s@QN@0@Z@q^@T,@#0@*QN@機@-0@#0L@z#0v@#0@p@@*σ@婐@#0@۩(@ve@#0@#0@@r@O@@B*@xx@W@e@GHS@ qu h F777' @ p GHSeT,۩(#0 $T,&۩(#0 *ve.۩(6s>0#0 D0#0 2B7x0#0v 0#0v  機0#0v W0#0 Z *σ"O&*(,*QN.QNp  ʥ$&ʥ #ʥ ʥ;  ʥ ʥʥ! ʥ! x0#0L 0#0  0#0 0#0 pxx 婐(ve,婐-0 4q^:veZGHStGHS  wrb >zkp >Ds@0@:2@-}@ @$9Y@$9f@7w@:s@$9΅@T;@T; z@:T;;"@$9!@ q^h:hp $& $  | *-}-} -}"-}p P:s 7w0  m׭ ׭1--ʕ ʕʕ x p$9΅s07w T; z"7w(7w*$9!07w2$9Y: > P7wRT;X7wZT;;"t0|-}  (7w $9f7w:2-}-}b 0Jx(0Dq^@@r@  q h 7 w q^rb >ƀz%!R>ƀD(@:T@@:T@#Ş@@j@k@:""@ @ k@K""@Y}@z#2@Q@JS@JS@ y@ y@R]@I@p@S@S@M@R@8@:@Q@) @Jr@Ps@bs@@@ &EKhKhZ &ff&5 _5  X5ե  ե" ͥ! ե!5 ͋  ͋Vk :T:T k,#22Y}:#2@:@QF) Hkr#2|R]|  5 $50 7  ww&  e#w5 I y#Ş y#Ş,M4#2: kD:""FrJpRrV\#ŞbJSfJSpK""rrvPsw5 5@ 55 e&fz#2 bs k $:T(:T,k4#2:(B#2HQN#2V#2\R@8hkl:Tp:Ttxtf&5   5 5  &  e#w5wf#2 y#Ş(#2.Y}6#2<:@QBH#ŞNSRS\K""^rbPsl#2rbs:5 5@ e8 :T:Tk#2"(*#20@jb 0zm0D#q@I@ @p@EK@ X@؁@|L@K@ @9?T@ n2@jhRQh$Ih|0 T , R& 7&@ |I I  #q |0 EK$I0 4 :I>4#q B D:#q H|0 N #q $N&@ B + |0  L#q |0 BK0 |0 /   X؁|L   Qualifier? |0     QUALIFIER |0  / 0.  9?T X؁|L0 00\ |@BDFHJLTE""VrZ:T`:Tf#?Thrlt#?TvrzD|74747T7T7D7D7D7DJ?Tr ?Tr"(.4::T@:Tb 0ba'.0Dk@)p@) @  DwhDhEwhEh $UEUE2) k) k)pk)p kb 0ZAy0D""@ @˪r@p@r@ Dȫ h HW w& f&& & & & & e  ""rp .˪rb ̀z'@Q̀D&:""@+ @+ @ k@p@n @EK@K@K@ X@Gh@L@z؁@@|L@@y@FVN@X!@K@p@Z@A@Fy@9h@r@M!@*iZq@ 櫵Wh|0  t&ffE72  w 7s9hn  k$ ,|0 2A6EK8M!ZD؁LpP|LTZV|LZr^ X3^[P]<P>]>8؁ L؁ X؁"L&(؁ * Xy Fyy    &&f& & & && d6& Ε& Ε w55 2w wRX! 6$+ (+ .FVN@iZqBrFpJX!^j+ v:""xr|pI n  b 0zZ0D:T@k@:T@@@ k@9@@8@""@6@K@K@:p@%p&@r@Ps@ Jh NB7   7 7 w wՕd k69k 8"@&%p&*:T.:T2K8Ps@""BrFpJKb 0R 0D@ "TyhTyhyhyh  &  f  b 0jt0D#2@n @Gh@9h@ U XhN,h,h Xh  5&e #29hn Ghb 0jg0D:""@""@p@r@ TGzdh2GhhJGghGhh  Xf  00dhvATADATADATAwȋ  w &""r"p@:""BrFpb ~̀z'|Q~̀D @@ve@@p@R""@*""@r@GHS@ rh 7ʥ"#ʥaʥ{ ʥ ʕ ʥ" rʥ"7ʥ ʥʥʋ L -! hz~J~ w  wJ veGHS " ,R"".r2p<B*""DrHpTb tz(tD&s@:""@+ @+ @Bn@c&_M@T;w@@X!@p@r@ *_M h8hBh`Fyh &&&f& & Ε m7 &f5wa wI5D BnX!.X!6+ >+ B+ `+ l:""nrrp|wa wI5@ wa wI5wa wI55J + :""rp0+ <:"">rBpV+ b:""drhpwa wI5wa wI%%P+ :""rp.+ ::""f eA v  t0%Ee ˦#2J + :""rp0+ <:"">rBpV+ b:""drhpwa wI5wa wI%%P+ :""rp.+ ::""9 gr:0t:t':P<:d:[};Ki}\KC^^K^K_^K`uLvL@Ms[M= RSSSrT[k ^ g at'aadaKqp[}p}q_q`-qDe-q`eIqKqZqprP}rXrls$ syv@yByByFyFyyLyyDz*}މ_މ`"" 9 ghdaKqhD3qh8kh8zp[}hp}h2hLE,zKhyh>v@yhNi}h: kh^KhIqh:P>  SPP^^bbD D``rrttzNz Zg|#Nd0d Zg|#0&2266 <<pp'zz DMP> P4F@\\$F@\\(r:0F#F (  0#6 C0( r:0r:0r:00r:06r:0ff Zg|#pBLHDIDMDFIAS`BY@BALBR5HXLW WDDC ~ X: X: X: X:" (X:* 0X: 8X: @X:B HX: PX: XX: `X: hX:lLIRC@SPDSRWHFSB SF &OCLC@ @z X: X: X: &X:( .X: 6X: >X:@  FX:H& NX: VX: ^X: bX: hX:@BB&"$  \ X:B X:& X:"&8&8&8 $X: (X: .X:$ 4X: :X: 6 6JJSYT T&hhSY~ Zg#~گZg#N && & A&?`5Ew: w8<HHni $>whX:N ͪyr:0sBX::HX:8 LX:<PpT (X ( dZg|#nnXt."v."|X:>Z| P 5   N7  7 z X: ` X:P! }&X:,:2`6:<Ѳ:@X:NDX:HfLy JX:PX:VX: P@7 B7 " 'ww " w w w00thvATADATADATA|X:@X:B X:X:X:X:X:","x&Ud*k.X:2X:"6X:w8X:f ?T X:P}""$X:>*# z.yb dXz SdXDj2@ f@2@!@ g@%C^@kZ@vL@/"@@Ms@Ѳ:@!@z3q@s@!@/"@2@y@s$ @މ_@i}@ `@:br@^K@!@k@Iq@zSr@c(i}@ձ@."@ @:[}@`@."@;Ki}@q_@KqZ@|Z@}@r:0@\KC^@z'O@"&a@$9!@$9!@`;@$9Z@'R@^K_@@"&p:@@ Zg#0}^hT[kh""h vLh Zg#h ~5 TW5@J L75r:0 3q"&p:kZ ^K$kZ&^K*:br2Iq6Ѳ::s> `@:[}JP X:[}^KqZd"&ad  `ew  7 e 0    w" z2 2}vL Sr$'R('O0KqZ4KqZ8KqZ>:[}Dq_H`L|ZRvL^kb"&af2r}v w  7  ew 5 ձ `;"&a2 2&}0vL4Sr8'R<'OBkZHkZN%C^TkZXkZ\:[}bމ_hn^K_r`zR*  fe57 5 % em5 $9Z"&p:* "&a f g}(vL.4|Z:Br:0Hr:0LSrP2XvL\:[}`|Zflr:0vkv*  w -w***ww~|Z$9! "&p:*"&a!! }*s$ .%C^4%C^6\KC^@$9!H$9!P$9ZZ:[}b."d."jyns$ r"&a:  5 w# " -6 - eEm d! !}%C^"*"&p:4c(i}8:[}@:[}F:[}J;Ki}P;Ki}\;Ki}d;Ki}~i}`Ee5ew-  R:[}|Zr:0(/"*/"0y4s$ 8@Ms:vL@"&aD2P}\vLPb Vγz?TVγDj/"H'RH'/"H^K`H- gH(!H/"H'Hb'NH&!H!H'H%z."H%މ`H-."RH/"H'H'."H."RH'H %H!/"RH/"H+."H'H /"RH/"Hzq`H+%HH'H,."H/"H."H'RH."H'Hh'H/"H ͪyhRvz?Ty fh!h/"h'h;!h'h!hb'Mh."hމ_h4."Oh%/"h."hU'hJz'hu%h/"Oh ."Oh/"h4."h'h/"Ohx/"hq_h%hh'h."h;."hpZ'Ohq/"hh'h/"h."h'h/"h_'Oh^K_ha/"h  ?TyFailure from FINIT$, not enough stackCommand syntax error Open failure on input fileOpen failure on output fileCannot find |input fileIllegal switchNo lists or wild cards allowedI/O error on input fileI/O error on output fileFailed to read attributesBad device nameFailed to assign LUNNo input file specifiedBlock switch required in logical block modeIllegal use of /RC swtitch Illegal density valueIllegal value on /HD switchFailed to attach device *** EOF *** *** EOT *** *** EOV *** *** WARNING *** *** FATAL ******** This block has bad parity ***** Dump of %2A%Q:Dump of %2A%Q:%VA%X - File ID %Q,%lQ,%Q %N%P %P %P %P %P %P %P %P %P%N%P %N%P %R %R %R %R %R %R %R %R%N%M. %U. %U. %U. %U. %U. %U. %U. %U.Dump of %2A%Q:%VA%VA%VA;%Q - Rel. Filnum %QDump of %2A%Q:%VA%X - Rel. Filnum %Q%VA Virtual 00| 9 g@k@!@!@E,zK@y@s$ @ZX@i}@$9~Z@:t @rX@!@!@."@z:P<@y@y@."O@/"@y@."@."@:d@h'@:t@."R@:[}@/"O@/"@z."@/"@/"R@KqZ@%@/"@@r:0@%@yL@By@@^ g@s:(x@=@z:d@."@8@."@"&a@$9!@$9!@$9!@/"@8@:By@/"@vw@a@."@z:Fy@."@Yp:@/"@[M= @/"@:y@."@."@@"&p:@@/"@ Zg#0xh Zg#xhf 7f w U@ # 555@5k E,zKhE,zKf=E,zKf"ZX(y,Yp:0>9 g4[M= <@s:(xF^ gJaR:dZadbjp/"r/"|t5 5 EU5y ." ."y."R."O y(.8:@8B8HyPV:d\/"^/"dyjvUB$&< w!Wf5 w&5X:d"&p:r:0(:[}."&p:B@vwF/"H/"Ny^:P<jp:tvѲ:h-@ - w w5  w5  wb :yyy&y.y4y8Ѳ:DJ:FyRFyVѲ:bh:BypBytѲ:5%e5@ 5wUE@ B Bri} i}||":d8>/"@/"FyNT/"V/"\yflryLt"&p:~"&p:B`$&< ^5@ 07 7 !# H     e p 0  L}s&r:0,i}2KqZ6KqZ@h'\yLbyLx"&a|"&aB B$&< # % jU*wwj "&aB}s(h'6:t <Ѳ:FL."N."TyZ$9~Zb."d."jyp."r."xy|s$ nX  ww*聇***wlrX/" /"y"&p:`"&a `$Yp:(/"R*/"O:$9!B$9!J$9!R%T%X."Z."`yhj&>!! !! !"!2b VгzUUVгDj2@2@/"@2@%C^@kZ@vL@/"@'@Ѳ:@>9 g@:p@zp[}@'@/"@2@b'M@y@s$ @r@rP}@M@/"@'@Sr@%@/"@z?T@:[}@%@`@|Z@}@r:0@yL@'@rl@:d@qp@'O@"&a@h'@b-qDe@'R@-q`e@&o~@ #}@@"&p:@/"@ Zg#0lUdh Zg#5wmw 46\^5'   5R BH~B |"&p:%C^kZkZkZ"kZ(Sr,"&p:\0"&p:^4':@>9 gDr^'h'l"&p:Hx"&p:Bj| %wew5, w|'2Sr?T$%&%,y0 #}422 82>D"&aH2N2T}00hvATADATADATAZ/"\/"byfs$ z  w5tF U%w%wSr'R 'Oh'`"&p::p&qp*Ѳ:0/"2/"6rP}<D2L2R/"T/"Zy^r:0bSrn-qDejXF ˇBDF Е Е Е ep -q`e 2"&p::pp[}Ѳ:$"&p:B&r:0*"&p:D,r:00"&p:F2r:06"&a:r:0>yLFMZ"&ab}h/"xw 7 wJ22 Pe~/" ys$ "&p::pqp"Ѳ:(|Z,|Z0:d6:d:r:0@vLF:[}JrlNSrRyLXyLn&o~tb'M>2 p weD eBP""&a?T "&a}s$ >b VسzkVسDjvL@""@'@'@?T@:[}@`@|Z@}@:d@ vL@"&a@R'@'O@@@ |ahT|; hrkh|h 7 `   - ee%$Е Е   e 7 7 5l :d:[}:[}:d :[}&:d.:[}8|Z<:dH"&aT"&a^}d""jvLn vL~:d|055@15   5   E w6w ~ pJ :d:d|Z'":d('<:dB'OR`V:dZvL^ vL   >p  5 E`E wE5  H B >Е ЕZ "&a'|Z?T("&a,"&a4}:""@:dH:dP:dTvLX vLht E e@Е^5@` Е%Е P e0P|+5/57c  .P"&aT|^jt|Z||Zx & 555 ~ p  %"  Ew6"B"&aJ}P""fvLj vLp:dhFh- E  0W 7e`b Vϳz2VϳDj2@2@Ѳ:@:p@p}@W@/"@#8@/"@ k@8@S@2;VN@"&p:@ Zg#0f2h Zg#\w w 7wB"  ߆zW  k228S #8&#8*"&p:."&p:B4"&p:"8;VN<"&p:@:pHp}LѲ:R/"T/"X"&p:XB" "&p:B "&p:";VNb 4VXR24VXDj k@`@ Zg|#Zg#02h Zg|#HEADER AREA%N H.IDOF %B%N H.MPOF %B%N H.FNUM,%N H.FSEQ (%O,%Q)%N H.FLEV %O%N H.FOWN [%B,%B]%N H.FPRO [%VA]%N J|H.UCHA %B = %VA%N H.SCHA %B = %VA%N UC.CON! UC.DLK SC.MDL! SC.BAD Zg#JeJeRRRJe Je ke 2D 5ЕR5ЕW5ЕE5ЕDЕ, $ Zg|#  k2 k6` :Zg|#k| ~J `re 2 @ e er e 2 @ e e ( Zg|# :Zg|# TZg|# pZg|#|`b VR2VDj k@`@ Zg|#Zg#02h Zg|#86q& H.UFAT (Record Management Services, RMS)%N F$FORG %B = FB$%3A!%6A%N F$RATT %B = %VA%VA%VA%VA%N F$RSIZ %O8 6 q&| = %D.%N F$HVBN H:%O L:%P = %T.%N F$HEOF H:%O L:%P = %T.%N F$FFBY %O = %D.%N F$BKSZ %B = %D.%N F$HDSZ %B = %D.%N F$MRS %O = %D.%N F$DEQ %O = %D.%N (REST)%N %P %P %P %P %P %P%2N H.UFAT (File Control Services, FCS)%N F.RTYP %B = F.%3A!%t5A%N F.RATT %B = %VA%VA%VA%VA%N F.RSIZ %O = %D.%N F.HIBK H:%O L:%P = %T.%N F.EFBK H:%O L:%P = %T.%N F.FFBY %O = %D.%N (REST)%N %P %P %P %P %P %P %P %P%N %P%2NSEQRE00 R@XBrDzFHJ^LcNhPmRTVXJlRR.PRN FB$FTN! FB$CR ! FB$PRN! FB$BLK FD.FTN! FD.CR ! FD.PRN! FD.BLK Zg#@e ȵ ȵ #E0Aårår årr2eR Zg|#Zg|# Zg|# Zg|#  &Zg|#(Zg|# 2Zg|## 8Zg|#:Zg|#DZg|#| 2 r 2 r 2 r 2 rU ` U`U`e @e e e   @e E~C~&:Zg|# Zg|#`F kJZg|#N` xZg|#~ k t Be ` Zg|# Zg|#`:b Vr8VDj@Q@ k@`@a@'@ Zg|#X:ZZg#08h Zg|#IDENTIFICATION AREA%N I.FNAM,%N I.FTYP,%N I.FVER %X%N I.RVNO %O%N I.RVDT %I%N I.RVTI %I%N I.CRDT %I%N I.CRTI %I%N I.E|XDT %I%N Zg# D Da    & D aȋ˕-Ӕ > Zg|# k0 k4` 8X:< k XZg|#D\ k``(|  e' a@QPb VγRSVγDj k@`@ Zg|#Zg#0.Sh Zg|#MAP AREA%N M.ESQN %B%N M.ERVN %B%N M.EFNU,%N M.EFSQ (%O,%O)%N M.CTSZ %B%N M.LBSZ %B%N M.USE %B = %D.%N M.MAX %B = %D|.%N M.RTRV%N SIZE LBN%N %D. H:%B L:%P = %T.%N %M. H:%P L:%P = %T.%NCHECKSUM%N H.CKSM %P%N** INVALID CHECKSUM - SHOULD B E %P%N Zg# D Da~eee& e Ί[ e2 22e 2 2   8E0 Zg|# k  k@ kD` JZg|#[r`|e e ΋  22 22 ~  222 2 2 e ~ J 2 k Zg|# Zg|#8`f` tZg|#|`: @d~u J  B BaE Zg|#`2b Vz4VDjѲ:@:p@p}@W@/"@7@ 7@#8@/"@ k@9@S@:;VN@"&p:@ Zg#04h hl Zg#^w w 7wPB"  ܆|W  k7 79S #8$#8(#80"&p:4"&p:B:"&p:">;VNB"&p:F:pNp}RѲ:X/"Z/"NZB" w Е C4 W!Е! DP Ad EA$"&p:"&p:B"&p:";VNWFb VZ7VDj @ k@`@ Zg|#Zg#0H7h Zg|#HEADER AREA%N H.IDOF %B%N H.MPOF %B%N H.ACOF %B%N H.RSOF %B%N H.FSEG %O%N H.FNUM,%N H.FSEQ,%N H.FRVN (%O,%O,%O)%N H.|EFNU,%N H.EFSQ,%N H.ERVN (%O,%O,%O)%N H.FLEV %O%N H.FOWN [%B,%B]%N H.FPRO [%VA]%N H.RPRO [%VA]%N H.PRIV %B%N H.UCHA  %B = %VA%N H.SCHA %B = %VA%N H.BFNU,%N H.BFSQ,%N H.BRVN (%O,%O,%O)%N H.SEMK %P%NUC.CON@UC.DLK UC.CNBUC.WPtCKUC.RCKUC.WBKUC.NBKSC.MDL@SC.BAD SC.DIRSC.SPL Zg#JeJeJeJeR PRR R RRRRJe>Je< e 2D@ J `20 Zg|#  k* k.` 2Zg|#P^ kb`|2D8 r 2` eJe;re42N C4 rre52  C5 r  PH Zg|#` Zg|# FZg|# \Zg|# fZg|# pZg|#|U ` U` 6@e e e   Bee$4` 8Zg|#6n kr` vZg|#  `&b VZ9VDj kB`F k XZg|#\ k``d k vZg|#z k~`*     Е  $t 5Օ: @e e0e0U.ib QN2~QND 6i h :&f!  E D  E E C B Ί Ab QN:i(QND@ ni(h r AUUUU    T T T T ee(e(e(e(T $)T T TU U U U  b QN:תZQND 0תZhabh$ 4JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECQN2~QND 6i h :&f!  E D  E E C B Ί Ab QN:i(QND@ ni(h r AUUU<0b ,+ @600  :,"<,"&<," <," <," <,"! <," <,"><,"<,"W<,"<,"v<,"<,"<,"<,"<,"<,"(<,"z<,"L<,"F"<,"I"<,"&<,"v'<,"'<,"'<,"'<,"(<,"w*<,"2<,"3<,"=9<,"9<,"":<,"3:<,":<,"p;<,"<<,"<<,"<<,"*K<,"K<,"jQ<,"S<,"U<,"W<,"W<,"W<,"!X<,"3X<,"yX<,"X<,"X<,"vY<,"Y<,"T[<,"^<,"_e<,"p<,"!q<,"/q<,"9q<,"q<,"q<,"q<,"q<,"{s<,"s<,"s<,"s<,"Dt<,"x<,"x<,"z<,"}<,"~<,"l~<," <,"މ<,"Z<,"<,"<,"<,"<,"Œ<,"<#:D,g':2:v6:|:p:H:H :H:H:H:H!:H!:H#:H8:Hp;:HkM:HvQ:HT:HW:HW:HX:HX:Hk^:H`:HBa:Ht:Hy:H8}:HZ:H:Hb:H~:aVN: er : e<: e"": e2: e*t: ez: ez:kf`;{chZ:fh8:fh/K:shP<:sh:d:vh:[q "{:"{:"{L:#{G:#{K:${:&{Q:({':){b:){:){4&:){(:-{q:.{M:.{&:.{:2{:3{P<:3{W:3{:d:3{4f:5{w:6{W:6{Bx:%':9VN:y:K:䍽:֌:^K:p:':b:鍒:w!:򍰋:b::P<:>:$ :g':[M:Bx:y*V*V[:$4:$::@):}::G:$2^K:`:`:$މ:%&\%':$%X*:$%*:$/<:$/2:$/2:$0<:$02:$9}:CxCzD%:Mp:Ms:N  ,O:O:O@:O:ablcIqHe$Hft: ,r$xr%r'trl(Jr*Vr *s s1Hs38s$8s<sRbvY:vp:wx\w\w}j:wl~kLw n:<}:g'::::NsD X:/X:X:Y:Bx:w: :@:ܩu~xQtK:'R:$*:*R:. kL. :./K:.z:.:.:.V:.D:.l:.:.:.:.:.D:0p :02:0މ:1މ:4:6x\6:6:6:$6i;:6o;:69qr6*}:68}:6\}:>p :>2:>Z:>*}:?:@p :@2:W::$AY\GY\W:ɪD ,תZlتމsݪM_:/K:::V:D::::D: p : 2: މ:!މ:$:,9qr-:-:-*}:-8}:-\}:-}\.p :.2:.Z:.*}:/:0p :02:o :<:#:2t2t/5<:H[tO[tz:\\\\\\\9M:?M:W: X\5X\@Q:$R:ū:ȫ\ȫ\ȫ# :ȫt!:ȫDf:˫s:̫:̫=z̫<=z̫bz̫bzϫg':ϫi;{ϫo;{⫾L:$Iq嫄R:$vy:$8:t:y::Bx:މ:XrYPP|lh V}:$:x\\}l~~  :2W:6t?K:?4M:$?N:Yi;\Yo;\Y}:YX:Z,`]^\j2j2j2ja;\je;\j=\l<:lU:l#:l<:lz:n:vy:լr:ݬ4$^yU(y!:,uމ:#v:::#:g':B[x,syFwyމ::$::2:,:d::r:^K:%Q:$[!:00vATADATADATAdsHhH X ,($xX%#'t8(Jy*Vz*  1H 388:$<:"<:\:db(j:8kLzn&zsD. SSs(qtxxKvxPx,xЉyxyyp!zlz{}h} X}Yv~@8rv~]r(P#|8hz(`d9}ܩu~תZlݪM:b L(zL(D މ@-*}@-8}@ e<@HT@%*@X@-\}@@ @lz@w@z%X*@z@#@.*}@ȫ@ȫ@H@6@HX@H8}@fh/K@l#@,"(@<@ݪK@zchZ@l<@y@@ X@/X@./K@@H@HZ@/K@o @0މ@ p @@z<@6@l<@Y@H@ 2@N@>*}@?@-@/<@sR@0<@HkM@g'@zլr@/2@/2@̫@|:p@s@Bx@6i;@6o;@Yi;@Yo;@-@fh8@02@,"Z@zP<@n@,"@W@v6@02@@2@2W@02@6*}@<}@@68}@vh@6\}@zY}@@%'@H!@[M@$9!@r@r @R@l@k%@uމ@H#@ ^%hh*[qhsh%dh (h( n    7  5 5լr լr RP<"&/2,%'4̫8sR<6*}@H8}B./KH68}N6R6\}\-*}`H8}b/Kh-8}bj   5wl     7 7 ~--\}>*}y6i;z".*}&*H,/K4uމ<6o;@lzH02L<Rl<X02<} \ 2<} V q 7 --]--3  ~ uމ X[M2W2W"2W$Bx*2W,Bx22W40މ:2W<0މBk%F/2J<Nk%R02p  ^4    B4 5UE  |--  ` ~</2 Y}<}l<$02(Y}2<}6H#8w>H!@/KDH#FwJl<V2WXBx^2W`Bxf#J5 5EU7 7 4 4 5~l#H8} /K02Yo;H!/K H!"/K&H#(w.02<} 2 2<} 8/2<<}@02D<}HHZ    5 5Uw0 0 7 7 w/K g'-sY HZ"/K(H*w.," 2H4w8̫>̫F02J<}N/2R<}VW>"7 7 57 U   |02<} @2<}   2<} >*}6.*}-H8}/K$02<} (HX*w..*}2y6P\4 4 E5   4 7 4 7 v02<} l<}HXw H"/K(r,>*}0y4.*}8<}BHD/KJr N02<} R02n7 5 5w54 4  w w7z<} W XH8}./K H"w2H4/K<02@<}D/2H<}PT/XZ̫b p fNj މNd5 5 7 7 --g  މv6 v62W2W2W 2W"(n,n02W2Bx82W:Bx@0މD2WH0މfDe@ w 4 4 f   e R$2Wk%k%02 <}$/2(<}.<2/26Y}<02@o DnFJnLP%X*TchZZ/<^0<f00  HbH qH rHHHaVNHHZH@z~ LHc e*tH){(HFs@~ 0MH.{MH{ HlHH@HtH#{GH~ YH -{qHR#H򍰋H "Hz2@){bHLft:@&{QHTcIq@H HKHpH} H| HHkMH`H5{wH:z GHbIq@z|:pH){HJ 'H`Pe$@t:@y:@:@ Htfh8H KHzP/Kh^Kho h40މhb^KhZ p h*h h"h <hȫ# h6h8zh,4h6hl<h.Yh0h މh 2hh)1މhRȫDfhh">*}hDg'hr?hz hBxhNvphvyh:8h(-h2.hP.p h rh>2h@)hhX hB*Rh g'hzլrh.hH.2h̫hhBxhJ-hH6i;h6o;h$.h.Zh$.h}hlUhhP z0p hMphj. hnh20p h Wh&.h2h02h@2h2Wh.މhxOhh02hz6*}h$hh Oh68}h\9MhD?MhFvyh<>p h`hY}h  hMsh?Kh<}hzh ūh2˫sh[Mh*yh hvDh Wh[!h.>Zh4@hHhhYXh6Rh:yh@p h2huމh?Nh_h  V    ,.r 0rl2ft:4r6r8wx:<>w @wl~BcIqDe$Fw}HJ2LrNwPXR Tl3bHDR2U0206402064`t: x y:Y l~Iq$}:/5  @sb Κ2dsΚD bh f&f D Dae  ae4 W fՊcB &VP̊̊b ΚX:HΚXD *CxhCzh00vATADATADATA .ff&f @e    b "zh"D,"3@@HT@ݬ@ϫg'@g'@@Bx@j=@މ@/X@#@zaVN@~ L@/K@j2@ p @^K@@މ@ 2@@ȫDf@g'@#@N@-@z/<@. @0<@g'@/2@@s@xQ@lU@Mp@. @02@تމ@P<@v6@z%&@@^K@<}@`@ū@@@@R@,"@y M@~ @`@ cIqh0e$h  t&  w7 w7 7 7 7 7 @fP 7 7 ~ p 0<NBx Bx6:>B 2F%&L<}P p T p v6 X p v6 ^0<pMpp  Հ @A ŀ  w7 $ --    exMp/< ~ L~ @`#"y M&y M60<:N>BxBBxFlUT0<Xتމ\^Kb^Kh^Kn^K|B   0  5  7 7 4 ~މމ/2<}( p ,ݬ0xQ4HT6/KFg'L-P p T@X. b. fRj<}pg'tx-nd]  - ]]]_A@CB&VP 7 w 7 7 wBxBx ϫg'^Kމ s$Bx(Bx,Mp0Mp6MpHBxLBxP#T,"XBx^BxdBxhBxl 7 U1- mw mw 5 77 7BxBx Bx p Mp&g'.Mp0Bx4Bx8Mp:BxBLHTN/KTȫDf\`fȫDft6  -  7}ϫg'-. ,"3 "g'(މ*^K0މ2^K68<>ūDūFJNމRbމX~ B e  7   7 7 -7 t މ 2j2 ϫg'&0<80<Bg'Hϫg'NT-^. djnpvϫg'V  4 4 ]&  4 ~ 2<}  /X/2<}02<} މ$މ*`2aVN6/2:>މBމF p JتމNP<RP<tr 7 7  &  7 00  <}` `/2j=lUމ މ( p ,xQ0:0<>ϫg'DJP` 2dj2hϫg'n7, B  -7 w7 7    u d0< ϫg'0<&ϫg',ϫg'4g'8ϫg'@g'Dϫg'H0<LxQ^hx~&^7  w"g'"g'L b $z X$D @鍒@%*@w@%X*@)@.l@{ @6@fh/K@ e2@@zchZ@b@)G@; @@)Bx@0މ@*@@N@)t @Cx@/<@)T@2@zH[@H @0<@@)@*R@/2@Bx@䍽@xQ@.@}@0p @02@W@ K@zi@%&@02@ er @)@֌@<}@)T@,"<@[(}@:_@_@shP<@9}@uމ@2y M@ ɪDhN h2ft:h  5  -f7 &C`BB  4   D5|6 i鍒$(W,W._.lF.PV^2fz<}     BACKUP @ Е:  et/2 %&<}02%&%X*$ er ,04J6R䍽V֌^:_h0p p; x0p ~0p t Е. Е; AePD  R@ EҝERҝҝ \n [(}[(}(:_@0p DNL0p ) `0p )t  j0p ) n0p )G rxQ  e ee ee eѝѝ      f0p )T 0p )T  0p )Bx 0p "0p (0p N0p T0p Z0p bl PUKCAB  t`t 4`4 4 54 w(|  K 02H[$N(/<,y M0y M4y M802<<}B02F<}JH LwR/2V<}Z02V P P     wwz{  /< Cx<}%*%X*shP< ( e2*fh/KshP< 0chZshP< 40p J/<Ny MPBxTy Ml w7&fȋҕ-ҕ-ȋ ҕ ҕ:ҕ: 6Bx0< N0މ0މ"%*^%*b9}zb Κz(ΚDAY@ e<@fh/K@chZ@ݪK@@`@0p @P<@تމ@v6@%&@:2W@<}@vh@shP<@ rh < 4 f&&eC B%& 2W P<vh 2WP<vh P<chZ  e<P<fh/K &P<shP< *0p .2W2v662W|8 , ) v  w`w v p`  4 E`f   \v6تމ$2W(2W4ݪK<P<chZ FP<J<}NZl`r<}vAYb zXDGY@ e<@HT@fh/K@chZ@ݪK@@/K@ p @N@ 2@,"S@zO[@`@P<@n@تމ@v6@%&@2W@<}@vh@YX@shP<@ rh < 4 f&&eC B%& n P<vh nP<vh P<chZ  e<P<fh/K &P<shP< * p .n2v66n8 V %5D u`u 5`&4 ׆  v  w`w v yv6تމHT/KN"v6&v6*v60 24<}8O[J`P<}TGYX,"S nnrn~ݪKT   E`f   NP<YX"&YX.2W0n42W6nD`J<}NGYb ΚHz#ΚHD%*@,"Dt@ e2@0މ@@N@H[@0p @02@v6@%&@02@"<}@ nrh ^ u`u 5`4  w`w 7`   0p  Nv6v6v602<}"H[&,"Dt ,N00މ40މ80މ<02@%&F<}J%*R e2ZZ P  b Κ8z8Κ8D鍒@%*@/@@6@b@0<@/2@Yi;@fh8@02@P<@bW@%&@2W@r@vh@,"q@,"q@sh:d@k%@ rlh T (7  & 4 4 z 2W2W02r Yi;$,"q*P<fh8 0P<fh8 4W6P<fh8 *}@ @zCx@-@2@H[@&{Q@@)@0<@,"x@K@,"x@Cz@p@){@/2@,"9@z5{w@|:p@䍽@.{&@xQ@0p @. @02@تމ@%&@02@@2@֌@O@02@z3{W@b@<}@,"K@,"<@,"<@ ez@3{:d@Ms@?K@"{@,"X@@W@$9Z@J3{4f@:_@sh:d@shP<@k%@ r hp  >*}Msp |:pW7    @@]   EeB  4 W- W- N p O/2$Cx*CzL$9ZP,"9^OdO@΂h,"Xl<}W- sssswwȋ 55 Be    5Е d,"K?K6鍒"b(b.K4 :D%>$FH8}H/KNHP/KrH8}t/Kv   eȕeȕe  e| 02%&<}%* ez$shP< .%*2sh:d<. @0<D){4&L0<P.{MT$b䍽f֌n:_r0<pЕ Be Be $PePPPe0 h3{Ws6W8O@HX@wF02L@2P0<T){(ZW^Wbf,"<j?Kp edeAR    4 e eM`wW#dV 0<&xQ6?K:,"K>.lR<}VH[Z,"<`%*jNn0<r){(x.z^  5uf 4 eD   ej?K2,"x$تމ(HX*w0-66:>bBbH/2LP,"xT<}Z0<^5{wB # 7  ff 'eʕ77e eM 4 l02<} 2"N*xQ6:0<>"{H@)N@)R0<V"{d0<h5{wt<}xH[|NpV eeM  e 5e|@) 0<"{@)@) 0<$5{w.0<2Cz60<>0p LHXNwT-Z6^0<b5{wfO@hplp  Op ppb Κz ΚDHW@@j=@D%@/K@){(@,"@,"&@d;@0<@Yo;@m @B02@`@`@," @?N@ sh  %77UU#   e eBeAA  B U[` D%``(HW*/K,,"  0D%PD%X0<\){(ld;tD00  @O@@D%@aVN@/K@[@:s@d;@Cz@0# @m @,":@O@<}@zJ@P@,"W@Hy@Ms@HBa@," @y@," @HvQ@," @,"(@$9Z@R@?N@B shh̫e , hQP}h   DSC> LBN(S)=DMi DM DL( DLP DR` DRa 2(DR DR .5   d[fnHvQp/Kz?N w   !DU0& & & & ff& && Ε& ̋ )X?N OO@ O$O@(Ms2R6aVN:yT> Z:sfsn> x> ̋U !  Pe W#5   D%U4 ` HXw,":8HW:/KLaVNPRTZCzj$9ZpHXrwt,":xR|<}D~#  &6     #  ,"W 6,"  ewwww   V5%5%w& U4 eB P/KHHBaJwVaVNZR^d$9ZjHXlwn,":rRv<}D  ]5UDDe  ,8 7.*E  ` C ;,"W Hy w(Hy*w0y@,"(PݪK~m :Bm@  ~e!Ї4    %7    a,"  %X*(R,<}0O@6OHO@PO\D,g'`D,g'h l, t x̫e |0# <5f`A  eBB  U B Uw-w# Ga," D,g'&D%*d;8D%  f  "*.fXf7 7 |xf n b ZT ,J P"J(P8,"  P,"W b ΚHzΚHD@ݪK@O@@D%@W@މ@-@d;@g'@s@i@O@J`@@Q@@?4M@@?N@ s$h      R  A W ~ЋP  P`D% ?N?Nd;d;$D%(ݪK,0?4M>?NB?NFX@QzO~O@΀|7 7 7  Bee  w-w# A-B#ABCeD!W  Ueww Rމ g'WW `(?4M>WDWnWtWxW|W f  - v m  B @   B  8D%d;D%(d;0d;6މ>މNiTfte ,%-     D -$މ&000vATADATADATAF-JsN^g'bމb ҚسzҚسDs@@H@H8}@ݪK@@ xz>hV}hhv%*h,%X*h4h$嫄Rh&[h"%Qh(6h/<h⫾Lh0<h./2hR/2h'Rh02h*Gh`h%'h0@Qh ?4Mh$k%h  -w-$&& & A&?D` E`f m0Be?E?D!CE? R  ,"> 0sBFPݪK^0|     & Y0 S` E`*Sa 7 0 e P n,">0 " 4*BDHP0XZ^ jr: v P  e@  AP  5 wW $55 Z2  & 8 LlH8}n/KtHv/Kt 60206402064/02JRbRZbjrZbjzB2JRbR Z"b$j&r(Z*b,j.z024?b LPz"LPD,"3H+," H,"H>,"&H8,"'H,"{sH',"sHC,"WH :2@,"v'H,"sH;w@z,"H ,"sHI,"T[HF$@,"'HD,"'H%'@@,"DtH.6@HX@$9 @$9 @,"LH,"(H)z$97@,"HK,"jQHP,"H(@$9k@s@,"w*H@,"H?,"^H,,"ŒH<$9&@$9f@4@z$9B@,"vH,"H-,"H/,"SH9-@,"&H0?T@$95@,"xH,"xH0<@$9@,"=9H,"UHz@5{w@̫@,"9H!$9΅@,"3:H,"F"Hfh8@.Z@,"މH6,"":H=,"I"H,"ZH#P<@,"H&zW@,":H!9VN@,"zH$9^@2W@,"*KH,"p;HJ9M@?M@,"WH4,"KH,"WH1,"WHMvh@z,"HL,"qHBz$9Z@,"YHE,"H*,"qH,"H,"H,"H:,"qHG,"}H,"~H ,"l~HH,"zH ,"2H 8shBy 0z  w  ^ "` "` " FF%2A%O:%P,%P,%P%N%VA%NI/O error on DSC -- *FATAL* DSC -- *WARNING* DSC -- j5bTkP7 @E`̫dsnkv<}:6z2 -  W AaɋU eBCD Hz<}<}&<}.<}2< Jy \0z` t|D> & & & & f& & & Ε -7 : ?T$%'(9VN,:26<}><}w"%N%VA2 Conflicting dev. types y w 0z w%N%VA3 Mixed tape types y w 0z w66%N%VA4 Illegal switch y6 w6 0z wLL%N%VA5 File label too long yL wL 0z wgg%N%VA6 Syntax error yg wg 0z w{{%N%VA7 Dup. dev. name y  { w{   0z   w%N%VA8 Too many dev's y   w   0z   w%%N%VA9 Dev. %2A%O: not in system y w 0zl lw%%N%VA10 Dev. %2A%O: not FILES-11 y w 0zl lw#00 >4 w4>>n n0z>>l lws$s%N%VA39 Directive error - %VA%N y@@s ws@@> >0z@@" "w%N%VA40 F yBB wBB& &0zBB w>%N%VA41 I/O error I on %2A%O:%NFile ID %P,%P,%P,VBN %P,%P% yDD wDD   0zDD" "wHN%VA%N%N%VA42 Verification error on %2A%O:%NFile ID %P,%P,%P, VBN yFF wFF 0zFFx xwC%N%VA43 Bad data block on %2A%O:%NFile ID %P,%P,%P,VBN %P,%P%N yHH wHH 0zHH wZ3Z%N%VA44 Mount reel %D on %2A%O: and hit RETURNF yJJZ wZJ00vATADATADATAJ 0zJJ w!%N%VA45 Starting verify passA yLL wLL 0zLLl lw%N%VA46 Resume copying yNN wNN 0zNNl lwE%N%VA47 %2A%O: is write locked. Insert write ring and hit RETURN yPP wPP 0zPP w8%N%VA48 Input file on %2A%O: will be resynchronized yRR wRR 0zRRl lw202%N%VA49 Output device %2A%O: full%NFile ID yTT2 w2TT 0zTT w^:^%N%VA50 Output file header full on %2A%O:%N- File ID yVV^ w^VV 0zVV w?%N%VA51 Output file header on %2A%O: not mapped - File ID V yXX wXX 0zXXx xw%N%VA52 G yZZ wZZ: :0zZZ wF%N%VA53 Failed to read file extension header on %2A%O: - File ID y\\ w\\ 0z\\ w+%N%VA54 Failed to allocate home block y^^ w^^ 0z^^ wB+B%N%VA55 Index file allocation failure y``B wB`` 0z`` wi/i%N%VA56 Output disk %2A%O: is not bootable ybbi wibb 0zbbl lw$%N%VA57 Invalid bad block data ydd wdd 0zdd w!%N%VA58 Bad block file full yff wff 0zff w%%N%VA59 No bad block data found yhh whh 0zhh wF%N%VA60 Output device %2A%O: is a diagnostic pack. Do not use it! yjj wjj 0zjjl lw4=4%N%VA61 Code B on %2A%O:%NFile ID %P,%P,%P%N - VBN %P,%P yll4 w4ll 0zll wmWmexpected, %P,%P found%N%N%VA62 Code C on %2A%O:%NFile ID %P,%P,%P%N - VBN %P,%P%N ynn wnn 0znn w<%N%VA63 Code D on %2A%O:%NFile ID %P,%P,%P expected, %P, ypp wpp 0zpp wV%P,%P found%N%N%VA64 Failed to map output file on %2A%O:%NFile ID %P,%P,%P, VBN yrr  w rr 0zrrx xwJ BJ %N%VA65 Output disk %2A%O: is too small - %P,%P blocks needed yttJ  wJ tt 0zttl lw  %N%VA66 C yvv  w vv: :0zvv w  %N%VA67 H yxx  w xx: :0zxx w  %N%VA68 J yzz  w zz& &0zzz w 0 %N%VA69 Input tape on %2A%O: must be at BOT y||  w || 0z||l lw F %N%VA70 Wrong input tape on %2A%O:%N Expecting "%VA", found "%VA" y~~  w ~~ 0z~~l lw - %N%VA71 Code E on %2A%O: after file ID y  w  0z w= 2= %N%VA72 I/O error K on %2A%O:%NAfter file ID y= 00 2WH@VHXXwhlpWz    x   5   ̋4# \P<vh P<vh w d^t x lՕ%ՕN LeՔ  L Ք  LՔ 8 LeՔ FՔ Օ%ՕN LeL(L:LNLbF|LT Ք \e K\Ք FՔ  LeՔ  \\,F@L b Κxz:ΚxD e<@s@,"&@/@w@H@HX@H8}@fh/K@> @chZ@./K@z@H@aVN@/K@:!@@:br@?@:t@:-t@@@,"9@|:p@,"މ@zfh8@P<@,":@2W@<}@ϫi;@ e""@vh@,"!X@ϫo;@H!@,"! @$9!@$9!@,"!q@z,"/q@:By@:Fy@{:@:@,"z@ ja;hxje;hrhAYhGYh-}hȫhDhzȫhhj=hnhhhh]^hHYi;hYo;h%&h6xhwxhwh Xh5Xh"xhhh &ee5 5w P=5W P3 & & ff& && Ε& TP<P<HX w&H8}(/K.P:H8}<./KJ|:pf> l:brx<}~s|̋ )&V  Ve && & ff& && Ε F > >  $9!DP<^> b|:pf:brrsz<}~?{:  04 & & ff& && Ε D& & & & & & & && Ε )J{: {:{:{:2> 6aVN::brFsN<}h> laVNp:!te5# 5W P & & ff& && Ε e 04   |P< H8} /KH!/K&ϫo;*@> DaVNH:Ts\<}`/{: d{:j{:p{:t{:z<} Uf&ȋ )>ȋ/ ȕ#5U5hHXw,":?$/2> <> J<}N{:X$9!b/hH8}j/KpH!r/KxHXzwzl#5 5U ȋ   &V LU  :UU|/K ./K$9!?H8} H!"./K(H!*./K.ϫi;>{:V,"!q Z e""\P<fh/K pHXrwt,"/q x e""r  55 5 e @E 55|P<fh/K Hw H"/K&,"!q*,"!q .$9!4HX6w@,": NP<RchZ\fh/K` e""d e<jHlwLPDw-w-w- 55,w-w-|H/K ,"!X,"!X fh8fh8$fh8&,H.w4H6/K:,"&>,"& DvhFV 55Ae w`w 5~vh HwH/K,"މ,"މ $chZ26:<2W@B2WF e""Hfh/KL,"!  ̋ )̋̋ )̋U& & & & & f& && Εf P,"z > > "$9!.,"94,"z<00  F> VHXXwZ,":r> x:Byrf& & & & & f& && Εf & & & & & & & && Εf & & & & & & & && Εf &>  :Fy>> D:tb> h:-trb rz:drDHW@," @Hb@Hp;@H~@HT@w@.*}@H@H@H8}@,"L@z,@O@> @:2@O@@./K@HZ@:t @/K@>@,"w*@H@Ht@>*}@,"v@zw*@⫾L@}@p@,"U@0# @|:p@P<@,"3:@Hk^@:@.Z@@ly@,"z@z,"*K@6x@@O@w!@J@:w@H8@H`@HBa@HvQ@W@>Z@,"@k%@b sRhWht:d< h̫e yhGh;pN   :d<DSC> j 7 m  "1,5EE| :d<,:d<HT./K $ (̫e ,0# 2}4,"z8>Z<,"z@>*}D.*}R,"zV./KZH8}`Hp;fH8Z5EE@PU@5E@5U55-v/KH8}H`Hk^,"3: w$H8}&/K.w2H8}4./K*}:d<>Z:d< ./K"/K&./K,:d<.w!2," 6:28:d<<:d<BJNw  "1,&&&"DYF:d<:d<P<:d<&,"L*P<6|:p@,"Fp ":w|:p >  dd "DU  p 6xp ":t |:p >  vv  p 6xp00 ":|:p >  0  p0 6xpH H|:pW^H7Hp H"5 U5 5U | pH O:d<W$P<(:d<0,"U4ly6O./KBHD./KH,"vNw*POT,"w*XHZ./K\e    R 5~:d<,"  P<:d<:d<:d<P< :d<$O@&p*O,p2P<>}F,"*KJN:d<ZH8}T>  ҕ U- E5U\./K}H~ ./K&J(k%00vATADATADATA0J2⫾L6>./KDHBaFwNHWP./Kb سz(سDja;@GY@HT@ݪK@chZ@/K@ p @N@ 2@,"S@O[@`@ZP<@n@تމ@v6@<}@vh@shP<@k%@ w}h Z   4 77e &Y&&eC B~k% P<ݪK<}"P<vh $n(P<vh *n.P<chZ DP<shP< H p LnPv6TnV %5D u`u 5`&4 چ  v  w`w v  yv6تމHT/KNv6 v6$v6* 2.<}2O[D`J<}NGYR,"S hnlnxݪK" E`f  P< ja;ja;Nb z8Dja;@@鍒@$@%*@HW@.*}@j=@@chZ@,"jQ@b@zaVN@/K@,"^@^K@,"@Cx@-@@)@0<@Cz@/2@Yo;@}@lU@. @z02@i@%&@<}@,"W@,"W@vh@?K@w}@y@,"@y@shP<@ n. hwl~h   w: w.,z!" ""  -7 8 . *0<\yjlUp," vlUzy|,"W | e77e ȋee S   ӕ e  Ty0<^K^K-"0<*b.b2$:0<B0<j0<r?Kp uu  - 7 554 4A yCxCz"02&w}*lU0lU8lU:,"jQ >HW@/KD,"W H,"W NHWP/KT,"W `<}d. l%*dCBCmB e #׭׭  f  f t jchZvh-bb%*"shP<&02*ja;.Yo;2,"<BL\-`@)vi%mB    @a HH4 !DB!DM7 !DR!DU7 s鍒 ,"^ bb/2 %&$aVN(2i<}B}F<}Jj=NYo;R,"X.*}hlU|lU\-7 lU ," lU b zzDje;@ݬ@.*}@@@.l@@({'@嫄R@@.z@b@zO@@aVN@s@s@s$@[@j2@ p @ȫ# @%Q@ 2@ȫDf@6@򍰋@-@z,"&@@)@0<@p@5{w@/2@){@Yo;@xQ@.@lU@02@P<@0p @i@z%&@O@02@#{K@<}@`@3{:d@ @Ms@@Q@W@," @3{4f@,"@shP<@:2{@k%@?N@ w hp , xQz kz  8/2%&P<shP< (.*}*Msp aVNW(V(7 e1, , eePe| p OO@?NO?Ns -$0<(5{w,p4p8,"f   B `eBE  NՎ e@ b Κ2SΚD تމh &f  D aeDE  @  U% # `BECeB N`v @EN% 6 % @` % | b (z(q(D@鍒@,"'@,"v'@w@,"'@H@6@HX@b@H@aVN@z/K@@H@ 2@ @-@. @H @@)@Cz@|:p@,"F"@,"I"@تމ@0p @z02@<}@?K@@@,"q@,"@@p @,"2@ 2h 2hH[hO[h6hxQhp  x5&Cle5W W! BClB   d-|02 |:p6HXw0p  @p & 2*aVN.-20p 6@<鍒DHF/KL-R0p Xb`bj?Kt d wJ  W--   w-  q "تމ(,"' 04,"q @,"v' F@H@)T," `," h@l,"' rCzv,"2 |@E hf A C f    <%   *  % 2 H  w\,"F" `@h,"I" n@zHl @ @a4 55 5&  UD<}H/K"H$/K*H,w6-:. @H Bwb Κ zxxKΚ Dg'@,@d@U(@@މ@@#@d;@K@4$^@s@bm @@$@B[@Fw@@@@2@ J#h 7 B eA w   m eE   0  @  膇BXg'Kd; $$$(08މBFN^tB[|$€|CU  7  w  z މU(Fw&#(.d4g'<HJN2RމXsb,fjn4$^rFwvK~m V7w   CeB  CN$ $,2b ΚHzxЉΚHD@,"s@@j=@aVN@,"Œ@މ@g'@Yo;@b@<}@^K@*@R@ tsh p &mB   7  5  mB  ~ g'މbb"R&j=*Yo;.,"Œ6^K<g'@މJRN<}RމV^bbbhaVNlR l,"s00vATADATADATAb ΚXRxΚXDg'@B[@ 0U(h4$^h"Fwh 4 0  P  @UB[.g' b Κryp!ΚD> @aVN@|:p@:y@  ̫bh̫bh̫<=h̫=hp` p :yaVN >   pp :yaVN >   pp00 :y|:p >  0 p0pHH :y|:p >  H  pHb ΚzlzΚD%h@ މ@.V@K@je;@H~@AY@,"@V@%*@69q@,"{s@zw@%X*@!މ@D@@.*}@ȫ@ȫ@H@6@HX@@./K@@H@z,9q@aVN@HZ@/K@0މ@@ p @,"@@H@1މ@>*}@?@ 2@Bx@z-@Z,`@vy@2@2@8@̫b@̫b@.@.p @@,"=9@/2@]^@̫@z,"9@|:p@.2@Bx@P<@Yi;@Yo;@.Z@@0p @:@fh8@,"":@̫<=@02@z%d@P<@n@,"@(@,":@̫=@i@v6@02@2W@H@6x@މ@<}@z9M@?M@>p @vy@5X@H!@@$9!@>Z@{:@shP<@k%@,"z@ kf`;hVϫi;hϫo;h  0 &&   4 e P 4 W PW#EOW-F1'554 w5t <}{:Yi;,"":"{:*<}0P<@D,"":H<}V,"=9bHZd/KjHlwr<}zHX|w|- 5- ̕%W-V14 P W PW#EOW-V2E4 5 5Ez?MHXw9M$|:p(5X,$9!:,"=9><}HL,"": b,"=9 fH!h./Kl<}pHZr/KxHzwbwV 55 w 5 e 7  Hw|:p5XHXwHZ /K.HX0w6?M:P<<-@-D.*}HP<LiP.ZV.*}X-\-lVe 7 &&5  9ȕ05 z9MP< 66>*}P<i>Z$>*}&6*64|:p>HX@wF.p L>p ^HX`wh.p ו 9ȕ0   wH55  2w5w51&q >p .(69q2," :HX02<} BHX6z E?zw p 2 p v6 0p v6  p v6 0p v6  vy"vy(w,K022W8t2W މ މ މމ"& p *0މ.0މ20p v6 41މ6ee0p v6 1މ  p v6  !މ p v6 !މBxBx%*"fh8&*.2%X*j4 4 w 4 wP 5  4 {fh8 /2<}02 <}$̫&,"{s *(.|:p25X6<}FJHXLwR.p \>p x P 5 L B4 P 5  4  q<}|:pȫ6x,"": $(HX*w0:.H<}PTHXVw\Vf.Vt<}x|:p"l̋ 500 7 zBxBx Bx2Wn2Wnމ މ$މ& މ*2W,02W261މ0r55 7 |0p v6 1މ 0p v6 !މ p v6 !މ p v6 vyvy HX"w(H*./KRE 5 57  E4 4 ~02<} HX w82HXw$H&/K, 2<} 4882wB̫F/2J<}N02l7 wW P C($   E e 7 }<}? %h,"": ,"=9 2," 8@:DH!F/KJ?MNP<P-T-X.*}\P<`id.Zj.*} T&& 5   9ȕ0 P HDR19ȕ0 6r--aVN,9q H~"/K(̫b.̫b2.p F.p N.2Rje;VZ,`\bf~6LЕ0 P HDR2P  ULje; V&V.D2je;6:]^>Yo;DHXFwH,":jb Ԛسz}hԚسDje;@%*@Cz@/2@02@P<@<}@shP<@ F~h h0Iqh$h J4  4 ee  4 e f/2 <}shP<je;02<} P<$shP<(Cz,shP<0je;602:<}>%*BshP<Fje;b z} XD މ@,"T[@w@,"s@H@6@HX@fh/K@ e2@./K@[q@@zH@/K@0މ@ p @@N@ 2@Bx@-@/<@vy@8@0<@6@HkM@z/2@|:p@Bx@0p @fh8@02@n@v6@%&@02@ er @<}@,"p@@$9!@J,"_e@@@,"q@shP<@y M@ t:h"/5h hU&&4  555bW-5HXw -|:p /2$<}(shP<,/206$9!@HBwHHJ/KN,"pTHkMV./KZ,"p `fh/Kb er xVdXe77w 555W-~HkM./K ,"_e /<y MBxBx fh8"@&shP<*02.4H6w/KB,"qF,"q J$9!H 55wwwwe 5fh/K e2 HwH/K,"T[,"T[ "[q&fh8(,fh8.2fh848shP<<6BHkMD./KXEw2 554 U4 4 w7  w75,"s HkM ./KHwH/K","T[&<}*HkM,./K0/24<}802<<}DvyH0<LNPBxTBxJN"E7 7 7 &&~HXw HXw p v6  p v6 Bx މ Bx" މ(n,n2 2<} 66@|:pF 7 z p  Bx 0މBx0މ02%& <}$0p *.2Bx4Bx8Bx:Bx>@8DP 8 00$vATADATADATA8jb Κz}YΚDje;@V@/@-}@w@D@ȫ@kf`;@HX@aVN@HZ@/K@z@@@@:@]^@|:p@Yo;@@,":@H@9M@?M@5X@@2H!@D@ y:h:h hU& EOEO F1F2 V1V2EE7 7 P ~HXw]^V(.V6<V@H!B/KFHHwL7PX:\dhdP    7 E5w -je; Dje;]^ ]^$Yo;(,":,aVN0D8ȫ @$97@./K@H@/K@4@Ht@.@>2@@,"=9@.2@/2@V}@,"9@z|:p@.@/2@@̫<=@P<@̫=@H@6x@<}@9M@?M@:w@ X@,"yX@2@$9!@$9!@ Xh D%B1111001001j5 & 555U EE5HXw?M9M69q$H&w,HX.w4/K:./K>H@wFHtL.DP|:pXȫ\6x`HtdHfwt4 5&  t   P w5& & & & & & & && ΕnHXw .2/K>2./K<}"Ht,69q>̫=D̫<=LVHXXw^d.z> ~|:p 5 w^W PW#VOW-L1f ̋W A 4 P w P:w6x6,"=9<|:pDȫH6xN,"9\̫<=`<}hn$9 x$9!|,"=9~l W PW#HDW-R14 JU5E Q 4 P $97,"9"<}*H,w0HX2w8>Ht@./KD.L|:pTȫX6x^$9 d$9!j|:pn Xp,"'r,"9v<}   W PW#HDW-R14 U%5   P +ȋ P    P $9!|:p X,"'$97,"9:<}@,"=9FHXHwN$d4b4  5U7 U7 we W0 W0W0W1 54 & & & & ~ <},"9HXw"Ht$/K(.2<} .Ht0./K4>2<} V,"yX\HX^wdDh/Kn.Dr./Kv<}& & & && Ε 5UEP W PW#HDW-R2 5 1eVOb> |:p:w"6x.H~4H~<@,"9V,"=9ZV}^HX`wf.2l>2p<}xP @,9q@aVN@/K@@.{M@Ht@Z,`@̫b@̫b@.p @@0<@@z.2@V}@]^@@,":@2@%&@H@<}@?M@:w@,"3X@,"X@$9!@$9!@B,"vY@,"}@,"~@,"z@ Yh^p0 aHDR1 00010001000100 00000 00000 000000DECFILE11A D%B1111001001^n^U &  U5U{UE K    THXw?M,9q.2%&&H(/K,H./K4Ht6/KwBHtD/KT̫bZ̫b^aVNb.2fp ":00,    5 EUEW PW#VOW-L1W-01 ̋W A r p -} H~Hb "/K(Hb*/K@,"}J,"3XNRaVNV^ȫb-}h,":t̫bx|aVNPF  U  7 w ff ȫ,"z$9!$9 $$9!(,"~*,":2,":6Ht8/K<,9qB.2<} Jp ":waVN >   5UE   W PW#EOW-F1W-V1@ev p -}H~/K H~"/K&aVN*2ȫ6-}:aVN>FȫJ-}NaVNRV,":t,"vYv,"}0 001 W PW#EOW-F2WU  FVOL1 P R,"XaVN"D&*,":@,"}J,"3XNV}R]^V.2Z<}`.p peH ȕX 0155ЕAЕ Е P P Е Е1 5 B0<.{M&H~(/K.Hb0/KLPl<}tHbv/K|̫b P 55  HDR1#9ȕ0 6Е0 PP b̫bje;Z,`Hb/KH~ /K&̫b*.>#V6hvz.p xP e P P P AЕ M$002P  7 Eh<}0<.{M,je;0D4V82TV$ZV2bje;fj]^nrHXtwb ΚpzΚpD-}@w@H@6@HX@> @,"@./K@aVN@/K@Ht@-@z:s@>2@.2@|:p@T;@6x@9M@?M@:w@ X@,"9q@,"z@ 69qh,9qh$  5  7 d)& & & & & & & && Ε 7<    5THXw-|:p6"|:p*-.aVNP> V:wdh|:pn6xt-}|  qU5$5     UU 5 '5 )& & & & f& && Ε>0Ht2./K8Ht:/KRHT/K\," `,"9q |>  #   5-  5- F  @ w& P:s,"zT;,Ht../K49M<>2DHtF/KL?MT.2j Xn6x(t)w> ,"z> > ,b Κpz(ΚpD މ@AY@%*@w@%X*@6@HX@chZ@@0މ@-@|:p@r02@P<@n@%&@2W@<}@@YX@shP<@k%@ hh t U&& 0 e Eee  `w ~%& HX w-|:p$ މ(n, މ2n:k%BshP<FJYXNHXPwT%*XchZ^%X*bchZpnbp&& 4  -- w`w  e 4 nn 2Wn2W6|:p*.022<}8%&<2W>0މD2WF0މL2WP2WXshP<\4  P<chZ <}AYb Κpz#ΚpD މ@,"T[@w@,"Dt@H@HX@fh/K@ e2@./K@H@/K@0މ@z p @@ 2@N@Bx@vy@0<@6@HkM@Bx@xQ@0p @fh8@02@v6@j%&@02@ er @<}@@$9!@@@,"Y@,"q@shP<@ 6h F5 0  55HXw 202v6 v602v6 v6 02$<}(shP<,0206H8w>H@/KD,"Dt\Bj]W-eW-U-P-L-004vATADATADATAHew @ 78 ,"q $9!fh/K er fh/K e2 "fh8(*fh802fh88shP<>@B6HxQLvyRvyX0<Lw75mw mE  mw m~NBx BxHXwBx0މ0މ"Bx$0މ(HkM*./K.022%&8<}<0p BBxD މH މRP  5U4 w55yBx މ p BxBxBx Bx*HkM,./K0,"T[ 4HkM6./K:<}BHDwJHL/KP,"Dt 0 ,"Y ~b Κz8ΚD e<@fh/K@fh8@02@W@vh@@,"q@sh:d@shP<@,"l~@k%@ Xlh \  e W-W-W-w-  CC`k%shP<02 $,"q(fh/K* e<0fh88fh8@fh8BWHsh:dNvhTsh:dZ,"l~b ՚سzz՚سD"{@$@HT@X@w@,"s@.*}@HX@H8}@fh/K@@.z@zD%@/K@){(@.{M@4@-{q@ @&{Q@@)@0<@6@䍽@xQ@lU@. @z02@#{K@<}@,"p;@ ez@3{P<@,"3X@${@?K@"{@@@@,"@3{4f@sh:d@*shP<@ 4h h T 4  E W-ww5~X 02<}3{P<shP< ,"s(,"3X,fh/K. ez2,"p;6sh:d8. <"{shP< >BHXDwJ$P4\Pwwwww-de  5 5,~0<#{K D%&{Q "{@)"{@) ){(".z&.z0?K4.{M>,"p;FH8}H/KN0<R3{4fX.*}p 5ȋ eE   UEe  }䍽${ lU," HXw$&0<*.{M:0<>-{qDHTF/KLHTN/KR0<\@`6d,"3Xh. 8$  7e xQ@6,"3X b Κ z(Κ Dje;@ݪK@chZ@P<@<}@sh:d@shP<@k%@ 0l~hh*}h  4   4 e C:k% P<ݪK<}"P<chZ (shP<,je;0sh:d.b ҚسJ`ҚسDj=@Yo;@ 2h$Z,`h (&f$ $  $$ j=$Yo;,t,e _vߋt ***THIS VOLUME DOES NOT CONTAIN A HARDWARE BOOTABLE SYSTEM *** 6b ΚzΚDja;@鍒@,"@b@-@Cz@Yo;@P<@@@ 8j2hj2hj2h <e C llB  @P< Cz-@鍒"b&b0ja;4Yo;8,"b Κ2dΚD  ݬh $ @e @aP b Nr. SNDs@:2@D,g'@# z@:s@<}@$9!@y@ ,hP ) $:2 5 XXX -- COMMAND I/O ERROR XXX -- COMMAND TOO LONGPP7 .     s  `-, 7Z4& & &  $s"@LD,g'TD,g'jf&& & Ε *%" ``&az ׭(7  :sf$9!lv7rH & & &  f&& & & Ε  - w  ,0:2<<}@<}F<}N# zX<}\yb ΚXZ9}ΚXD9}h00<? H;K@}8&@?{@:@}(g@$9!@z}@l@$9Z@@{N@?{N@:@X@:4F@}x@} @ ɪ:0shͫk0fhb[~0haC}rKj%&;+w0̫e :dyh:dHh ɪ:( ɪ:c    5U E eR׭ ׭ UR)5p ͫkͫk ͫk(aC}0aC}4ͫk:aC} DrKRJaC}L$9BRrK ZrKbaC} frKR~|U &  XE E w d 5&&  .3zaC}aC}ͫk ;ͫk(aC}.aC}6ͫkd:ͫk@aC}HrKNrK RrKpͫktͫk.`@B7 77 5 E  E 7  rK@X rKB Xy.S<aC}$<*ʫy0aC}4DX:8ͫkBaC}F꨼^PTaC}\ͫkR    E pE 7-@ @ @ @ @ @ E U & & &  f& & & Ε~ͫkͫk ͫkͫkaC}aC}"ͫkp(aC}.aC}LaC} P; T%& XaC}\?T l%&~: :& \ U  5&   35~ rK: ;ͫk rK\ (rK.s 6rK& NEU !w<BaC}DaC}JaC}NaC}> V;baC}haC}z%&tmɝ & & & & 8& & & Ε & & )U@->(9& PaC}aC} %&aC} aC}82: >;haC}laC}> taC}9)& & & & & & & Ε d~& )& & & 00L?;, HrK ^;raC} z;U c&&e55& ) 5&: aC} rKrK  JrK NrKPrK$ \rK4$ w&e F~  5 @5 @5 ;575 f'B rKrK$ aC} (aC} :rK JrKTaC} j[~f*!EC$B  CC D t&U5 $5!5A%``B rKXaC},B`B$Cs sU XEf& 1ХD~, w1 aȢwA:0G&A e% D~  BaC} aC}&aC}*aC}.aC}8ͫk<ͫkNXaC}>l >#E D~>8 >!->OBA -> a>A;#!* JaC}>%&$aC}>*aC}80%&8aC}>>%&DaC}>TaC}>-  90Zazu5y rR ҋ~~ %# WAE@ d& |ͫkdd4 ` @x &  E@& EU !09 B@ @ @7`@z ;4 ͫk rK`aC}@ rKx"ͫk @;DͫkLaC}RaC}naC}BraC}@vaC}@zaC}@~aC}@ @0`@xea : B  7 B B r~ @Dw$@~w W! EbaC}@aC}@.aC}Bx>2Kn,X`  %K`P00TvATADATADATA|,C{.E{0?{p2?{4?{p6@{08A{0:D{0?{N@@{NB@{NDA{FB{NHE{JG{L?{@ hrK jrKPv>`8 02 rK rK8 "rK . 0rK024[1;1!~[1!~ rKzTI    zF:a  ~Y [~&:F:a  ~Y L P[~^:xz)     h n  Z::6:s [~FhN: TaC} V[~nf:p laC} n[~~:Tn   , aC} [~n::4F;K Rw-jwx      2w-wx(6w-Nwxfw-p~w-jL   wx$2wx<H} J}L}(gN}8&P}KXR} T}V}(gX}8&Z}KX\}V}^}`} b}KXd}8&f}xh}8 }5}}]} }(g }s}} }KX}8&}V}}5}}]}}(g }x"}8&$}&}V}(}s*}.:. / 1 - 0 ,h aC}.: aC}/*: 4aC}1B: ~  LaC}-Z: ~  daC}0r: xaC} |aC}, b %&g ; Device? Number please? f*Bv$H?DTE-S-ERROR0, Success!?DTE-F-UNSPROT, Unsupported protocol operation (%P)?DTE-F-MSGFORM, Message format e"*Bv  $Hrror (%P)?DTE-F-REJOPER, Operation rejected (%P)?DTE-F-SYNLOST, Synchronization lost (%P)?DTE-F-ERDDCMP, Transmission [DDcCMP] failure (%P)?DTE-F-FATALER, Internal error (%P)?DTE-F-RMSRERR, Remote RMS-11 error (%P)dt,t ?DTE-F-ACCSERR, Access error on devicerr(:?DTE-F-PORTSEL, Assignment failure on specified device6/?DTE-F-DEVTYPE, Illegal device type for DTE +*%DTE-S-DF03SEQ, Dialing... Please hold&.@.?DTE-F-DF03TMO, Device failed to respond, connection timeout,,<l6l %DTE-S-EMUEXIT, Emulation exiting... Please waitjj2'%DTE-S-DIALHNG, Dialup line hung upE#:%DTE-I-DTETVER, Data Terminal Emulator V4.0 [6-Feb-87]61?DTE-F-MODERR, Unable to determine modem type-.).?DTE-F-DEVBUSY, Device already in use,,%V/V ?DTE-F-LOSTCON, Connection lost on deviceTT+. %DTE-S-MFTCOMP, File operation complete *. %DTE-S-MFTINIT, File operation initiated* ?DTE-F-SYNXERR, Syntax error=?DTE-F-PHONERR, Failure to establish telephone connectionb9676%DTE-S-PHONEOK, Telephone connection established 443l?l?DTE-F-DF03TMO, Telephone connection failure due to timeoutjj; +w@AB$ & 0&&  & Ε ׭  C 8Ue& ~rK@rKAJrKB &; 4aC} B:sLaC} N$9!TaC} daC} p;tͫk|~aC}<|e& az ԋ 0aC}aC}aC}aC}̫e 2;!ȅ"ȅ"/? ,  +w"  $", , ."  DIAL  ̫e . 00\?PBPFPJPNPRPVPZP^PbPfPjPnP r+w vaC}҂:& +w +w +w aC}b 0z30DdA@dH@ƫ?T@?T@(]s@ @ƫ%@ʫy@6&@-K@ƫs@ @z/=M@/L@-&@@y@۪R.@eM@G@@(L"@WK@?L@7-@Ms@?=M@bƫy@@@S@X@6K@ 3 8ƫWhRhRh` 3f&f % (% "%E>UÝR~   E l۪R.6y<y@6&D?=MH6KR6KT?LXdAZ6&\6KbdHd6&f6Kvƫyz |Ms|w@e@`  D @ S Dĥ- @ 4?T &.8L6&P6KjSvWK S @  0ef&f fѕ ѐ BB Wwf&f4 D6&J6K^ƫ?TtwB` ыwtW5wTE.U+W5w.E.U Ww5P6& 6K,ʫy8y>yBDMsRʫy^ydyh(L"jMs|ʫywE.U  D `B ^S ÝĝD A5Dĥ -K B XSEB R5# P yyMs-& -K<@NSZWKvy|eM~6&lK5 D %; 8 4w7 7 5   0 '0d6K yƫsdH6&6K*ƫsB?TFGJGPyV(]s\ƫ%b dMsnƫyTU @@0 U &E%E w>ƫyR?Ttb Qҳz$ QҳDs@@@{@:@\g@J$@W@@Q@a@)x@T; z@z@<@G]\@&@@U݁@i{@($@Db@ $`,b WT:{{0{ j YT $.rWVNh$(-0^byhLby:hhW`hh0fhJb?Thb@h $`, XTDLX DDCMP TRACE OUTPUT -- Unformatted data -- Completion status: Secondary code = Unknown error code =  tx|| Transmit Receive Open Close Initialize Control transmit ,<KSuccessInput argument vali* JNRVZ,^<bKedation errorOperation errorLine initialization errorTransmit failureReceive failureSoftware errorZ-Z`Wrong number of arguments---> <---  `E CONTROL MESSAGE -- DATA MESSAGEMOP MESSAGE -- ERROR  ACKNAKREPSTARTSTACKUNKNOWN XTDLX STATUS AT ; STARTED AT RQ=, TQ=, WQ=; TIP=, RIP=, RST= BUFU=, NRS BE=, NLSE=, ALF= Data errors outbound = Data errors inbound = Local reply timeouts = Remote reply timeouts = Local buffer errors = Remote buffer errors = Data messages received = Data messages sent = Data bytes received = Data,: bytes sent = Error flag word =  WT ($ Db G]\  i{ J$00 U݁88P!  &&h  $.hP%PP=r r$.rhhXTDTRC.LOG $(- 3 0  00dvATADATADATA T=T    <c& n 2 $.0W "$.$$. ($`, 4$.T >$.TPTW`s f$.h$. v$`,n ~$`,2| j Y RF De H %e 3cyR $`, $`,Y ($`,FB$.JT; zX\Whs n$.p$. x$`,y~   :l  %e Е 7    ЕF $`,~ $`, 8$.@T; zNR$.Z$.p$. |$.t 7 v  Rc y~ A  A\$.$. &$.($..2W>s D$.F$. R$`,y ^$`,~ l$`, j   Tf=  &  %e wpcR $`, $`, $.$$. ($.TTT; zbfWvs |$.~$.l  r Fe X 0e  >a D &a , a* $`, ($`, >$`, V$`, n$`, # a + a 1 a  7 a = * $`,# "$`,+ :$`,1 X$`,7 p$`,=da D xa ~K `a f Q Da J j (a . v * $`,D $$`,K @$`,Q \$`,j x$`, a  Z a > a " a  e " $`, 4$`, P$`, l$`,\ e  pe 5 Ze O Da J %e& > $`, $`, 2$`,5 H$`,O`$.hT; zz$.~aЕ  7&P7&fЕ A 7&fЕ A Е. T@Q$.$.&$.4$.B:H$.Z$.f<z$. ~$.T7f &f EC  j f& ff e Pf4$.f  $.$. D^ |Pf e @fPfff e @fP ef<& .P 2$.8$.fH\g hPr{ ~L e b Qгz$@QгDrO0@n_@rO3@rO2@dOL@s@}@q@sO}@@h"@lOhQ@zlOp@tO}@fOW@* &@@lO.@n^@fOHq@sO@hO1@(@lO8T@xO`T@xOcT@xObT@zlO$T@nOF@wO%@nOG@nOG@nOG@nOG@nOG@tO`Z@w@8@2@rOy@rOy@8@zcOa@b@@cO a@rO:@aOK@m@%{}@UH@f@tOK:@tOQ:@tO:@F`@dO~K@zrO!@rO!@fO}@rO}@ q@b?T@p@fOL@ $`DRh$(06\g?Th` shm?Th zĀ_hKq%h .h~ 74qh mhh hzh/gh ,?Th&Ӏ Xh p_hy%h u~ah wh.  $` .ttppppppzz $(t $(t $(p $(p $(p $(p $(p $(p $(z "$( $$( &$( ($( *$( ,$(#0z   & z $( $(z $( $( $( $( $( $( $( $( $( $( $( $( $(& 7O  @  nOGcO a nOGcO a nOGcO a nOGcO a nOGcO a "nOGcO a (nOGcO a /nOGcO a 3nOGcO a  PnOGcO a nOGcO a nOGcO a nOGcO a nOGcO a $(f&fwjIOՕ00l? &wO%* .lO$T0lOhQcO aDcO aHdO~KPrOyVrO}bsO}lsOvsO M7 <E Mf B  @4 f l * &lOp8n_ m8n^ * &"8&,* & 6$`:T* &hdOLn2Le |Ew&f&f . wwD  sf:rO0>. DfO}^rO0b 4  ”¥¥H~4 :@ ҔB~4 m 4 %)    Hb@ x$`|Dҥ EEPe t wwf TwbwH ZwF 84sO}>rOyDsO}JrOyNh"PrO}^rOydsO}nsO},wB Lw0 w0 :w *ww w   $ww 0:lO..lO.4lO.:lO.LrO0P T hlO8TtrOyzrOy<wfBEzC  wT¥ T7@ @ wP $`z(nOF,cO a2cO a6dO~KBtO}RrOyXrOy^rOybqflrOy|lO.U  ww  fAfA&ݝ`RnOG nOGdO~KrO}&sO},nOG6sO}:rO!@rO!LrO0P V tlOhQ|hO14 C`. e֠w@ @  Ί f&&NrOylOhQtO`Z&rOy*lOhQ.h"0tO}:rOy>qBHrOyLwO%nsO}   1    f . - 1%XrO0 .w2p4%{}8FrOyJh"LtO}Ph"RrO}VtOQ:X}hfOWl. , 1 ˥ew    l w   00tvATADATADATA& $ %p NrO3rO3 rO3$rO36rO2:rO2@rO2FrO2V jwn%{}r %  f&ʊ>   & . >f w F`"%{}&RfOWhrOynxO`TtrO0x. $   r7@ @ f 1 %p @rOyrOy rOy$q(.rOy 2$`6pwt%{}x e % &f&f @ F s < *,f :rOyBrOyFrOy N$`FpsO}    & . n  &fc7LsO}sO}rO!"rO!4rOyA:;A9@8(@)+*A./A-@,$%A'@&"@#! A`aAc@bf@gedAl@monAjkAi@hx@y{zA~A}@|tuAw@vr @sqpAP@QSRAVWAU@T\]A_@^Z@[YXAHIAK@JN@OMLAD@EGFABCAA@@b Qҳz$<QҳD:.@sH!sH@@,R@lOp!HP,?T@cOaH-H-H-Hz-H u~a@ $ HNR ^b l5:94':94'5'9'95:9G7:95:94':94'90 2>HN"R&^,b0l$h  f0 ` ttttt  Z   A 1 <F`,  z$.RfOWVm?TbfOLl| Aɋ A%p % )  $44tt t tt2/gw"%{}&z4F`@HT    8A 1Aɋ A %p   9T fOWm?TfOLrOy&fOL*q.z28fOL`wd%{}hzp~rOyt2 %tt t ttA e  A 1 2, z.dxO`Thm?TlӀ X Aɋ A%p % )  92 %P/gw"%{}&z4@HVrOybfph, lzp.ltt t tte A  A 1  Aɋ A%p %,lOpP$rlOp\- fwBe 1 1 1 7 7 7 7 f .% %\$gf"fOHq,dfFfOWJxO`TNrO0RwO% `$dzjlyryzy E%E%   f% %TT|.lOp n_mn^zs "s(,s 0sV-ZlOpd:jyp-t-z-T %& & & & &f& & Νp  ʥE%5 \----y-"-8mlOp@n_DmFn^Jzj:   ʥE   eV f% %TT JmlOpsV:\yb-f-l-r-v-|-D%& & & & &f& & Ν   ʥE,& & & & t& & Ν  F- y--*m.lOp>Ds h$trmvlOpr %5    77  | y 00vATADATADATAU$lOp&n_*m,n^0z@Dby:LtO}PrO}V}U ZcOa^cO ah.ltOK:n408. 4 4 tte 7  Vz rOysO}..yLrO0Pm?TTӀ XX74q^brOyhfOWlw~y%D L D < 2 p ȕ   &&   BxO`TwO%rO0 2 *w.%{}2zFfVdwvs&  p eՔ~  V L B՝՝՝e 1`Ք~VKq%."408&z.tOK:@rO0JxO`TTwO%^tO:brO:frOyrcO avcOa4 & c ef  Abyb Ϛϳz(L ϚϳD}@kq@ɪd@n @ @y@E:@ (L L hXL h (L &f&f  7! 7&f&f 7DɪdE:$ , 2}@n FE:L nkqv zE:"|!  }b Qϳz(QϳDS@Yq@1X@1X@Yq@y@ ( x h kqhxphqhl*n hnphqS(hdqM)h\ ( & c 5J  eV  & c2YqYqS 1X(1XdYqlYqtSh|  "555 e e ezb 0z30DdH@ƫ?T@?T@ @JL"@6&@-K@ƫW@ @-&@y@Dy@jDy@۪_.@eM@@Ms@ƫy@6K@ 3 nRh8R{h@ƫsh 3f&f fѕBB f %! %!% E . .ƫ?T@HR۪_.xƫy| ~Ms|w@2>@e B?T$,6<DJRZbd2l>|Dyz5  %  ewwU%% 5  vMsydH6& 6K4ƫW@DyFDyNyTDyZ\MsdyjDyneMp-&r-KvDy(b Ϛγz3ϚγDƫ?T@?T@ @Z@@ @@Ms@@ƫy@%(@@* 3 RhLƫh 3f&f &f  Wf&f ыы& Nv#2 "*%(0%(Bƫ?Tx%(~%(_|www@@@    <w@ ZZ0ƫy6 8MsPRMsV?TZb Ϛѳz3ϚѳDew@?T@ݩ@ƫ<@y@G@7-@ƫy@ 3 Rh 3Wcf&f _B` ы[WXB "C & T B 5 ы0 B ,-- $2ewrewtGzew|G| , )5ew  7 7  0U@@! &^ewG ewG7-ݩƫ<&y.G2G87-<ݩBGFGE%E wƫy?T4b Ϛгz3<ϚгDƫ?T@ew@?T@ @@7@y@U@G@7-@ƫy@ "3< R<hjƫ<h 3<f&f 'fEѕ-Uѕєєєє`є BB W`f&fED y$00? @l@qS(@ B( ƫ?Th~vLh^.h-h:̫vLhƫht (ff #~wezv ׭   e  f  ffB qS(~$@`DkqP?TVZɪdfjnrɪd~꨼^|ffwD w46 W   E  ffw w8 (> BYe;H NZn `ɪdn W   E  ffwpj W   Rp  Ye;& ,p8np>ɪdLXyh lYe;r xy~Ht xɪdll> <l (l*l> ,.0dBx24dy8l:l> <>@B4>l  L l "$&*L b Qѳz3%QѳD6p@ƫ?T@6%@?T@ @JL"@6f@(@-%@-f@%@ɪ@J7-@Ms@ƫy@|@ 3% VR%hƫ%h 3%f&f ffѕ !"#$%    3 e s ќ 6%"6p| ќ ќ ќ ќќ10ќќ BB Wwf86fbƫ?T&f %| ыyrr r!r"r#rrrr$r%r r r r SSSSSKr1r0rrr-%^%trerr f   ,"e reRR 02-f"|.ɪN-%f7-j(pJL"rMsj @U@  &E%E  w  f  <ƫyL?Tb Qϳz(X:QϳD AhS HDX:h` H YqhlhShewhh6%h\dBxhf,KhZhVz}hʫyhYqh Rh1Xh6&h6fh^ OhhdyhhT-KhK1Xh h7h,2ghlz-%h`꨼^hYqh-fhb/=MhZ/LhM-&hɪhhXyhyhDyhpOhfKhyhz<hE:hGhdWKh?LhL7-hl> hMsh?=Mh f&hlh%(hNyh|hPhZ*ShXh?Th6KhJ AhS877h7 7 7 h7 z`  `  ` h`  ` ` ` ` "`  &` (` h ,` .`  2` 4` 4( 7 ( :`  `  `  ` ( ` ` ( ` J JTTl!lXT Host File Transfer Program,hh ffx    ( ( ( ( b Xz(yXD}@q@ @np@.@E:@G@qS(@qM)@ (y `?Th2?Th8 hqhɪdh00vATADATADATAYe;h (y&    e& !  T hfEe j& qM)( J Nq` |Be&f  5 & fͥ B,np4G8}B}X ^E:d l<  ߀@@Uбf e <.qS(>.b ϚγZ3yϚγDƫ?T@ @y@G@ 3y pƫyh 3ytf &f&f fѕ 5 E pѕBB 5%  ,y@GRƫ?Tb 0z30DR@R@R%@R<@R@R{@R@R@RS@ 3 @JL"h(: h<6L;hh4(L"hhh  3DbR RSRRRSRR"RS&R%*RS.R<2R6RS:R{>RBRS.b Oγz4pOγDs@rO0@lOp@@z@,kfH rOy@p_@y@m@NH@ q@B}@ $`*4r0rh,Rhjh $` 4r44&ff4WtEE EU0PEU@P Е 4ffe *$` \$`|m  4 & c ;@ @7 & & & & f&  I E Be8(rOy.}2z8rOy<$`LTlOpdjs>4ʥ2 & & & f& & Ν  E e ˇ4 e & q4m8lOpHNst &f&fe!wm m X44 & & &rO0@p_& & f&   s@ EEW!0%70WuwW!@%_@]P 4- lOpX$`n$` l ,b Ď z(rĎ DDb@Db@s@Iq@@-@@6%@{@GP}@ʫy@6f@z6&@J$@-K@JE$@@Jm$@ݩ݁@ݩ@ݩ-@7@-%@@-f@-&@y@z]\@\@\@fK@)x@6x@E`@@G@G]\@&@G\@y@G\@U@z@U݁@i{@U-@"@eP@i{@($@f&@i{@eO@e-P@(E$@(m$@|@z6K@Db@ 6phQhj.Shv:h:hPah%h WTNr {x{`{@b YT(r (]shrݩh0(h6;hDyhpUheMh*R`he](hN  WT (m$ Db G\$$ i{  Jm$DD e-PLL \,, ݩ-44 U-<< - (E$ Db G\"" i{  JE$BB ePJJ \** ݩ22 U::  ($ Db G]\  i{ J$@@ eOHH ]\(( ݩ݁00 U݁88P"  &&J JP%PPj{ jr r  P!@ J J%Pj j  J$Jjd00 DJVsd ~j`f&5 5.P5 %cf eff e eL7 y(y . 2P:y @ DNs\{pE0fff e @fBCe7(,& . y  "4j n`Xcff e eJ @s" @JFb Xz3&"XDYq@wxH nL`@?T@?T@vL@R{@q@:t @:br@}V}H9 @z꨼^@y@6;@T;@fK@6L;@T; z@y@E:@l> @Ms@ƫy@l@e](@̫vL@::@X@ 3&" NhRSh* 3&" 5 h0 - ע ɢ׬e   &07 5 t7 D 6;?T MsHqLYqRy^E:bƫyhypy|y|  !& & & & & & & J& Ν ~ U  `5&& b6L;Ms fKe](XXl6J @lD:t PT; zZy^̫vLdqtyV #EWw@@ 8 ꨼^꨼^ vL2y8 :MsDR{N?TRƫy   &07 5 t7 D 6;?T MsHqLYqRy^E:b<0b ,'@,9`;t!  t O p:16ox&h e΁p! 8&oHX X.(&d w&ww+2  & A, 6pkQ D@N\ \v e"p":  }#} t! t!@Q !! !"w"w,"# ,"g' #& #}& #h p&&@!&.(''U( ,Y#P,ZN,=fN,:k,:`,:,:Z,:y00 vATADATADATAL:QM: &U:v: : v:.: : :k : :: :Bx ::`:s:Z :$":s#4FK&;K} xK.(Kd K8 xL{L}[Me .(VN VN kQ kQ kQ kQ""kQ?TkQ@` kQr&kQr&QkQ QL%QwS@#?T?Tp?T?T`?TW+ ZXr`X}`XY|X Yh Z~ZZ ZZ T[]+ _w16_\ _kQ_16E`WE`xZ+2ak a a& avL a\gaXz&5ap/d@ /d&/d ;d}.(dHX d X.(e.(fZfp16m} Iq&IqIqLq`;Vq"&Vq"&[q\qŞrvk v v@+v& v& v~Z8w.(9wW-wk w_wN` wd&wv&Bx@&Bx Bx3! BxO! Bxr! AyHq yW ysy16az} xz *}&}d }h }i }(i }Pi I~v ^&^&^@` hhv @6p6p 6p 6pp: vL0M6pkQq` a z  7Å8 &=pZg' ZI9&}&} &G E z  é -f  V}ȫv ϫ ϫ  d ?W U+ p گrZ|~ y 5 C%16" (8; ))  S xsN""`&@!,Y#PvLS#QL%;T&C`M+2v@+9wW-y.(ys169:6p 7b VӳzVӳD,Y@@avL@`@گr@v: :@v:.:@^@`@ #h@_@Y|X@ak@z:@:Z@a\g@d@@xz@ձW@@\v@)W@Zg'@:@:k@)@&G@b}@K@'@[8@y@:`@  L0ehh  P[Exit] [Illegal file name given in close or exit] [File was not renamed] n557w75w77755  &G dY|X:`a\g$d*&G.'2&G8}<&GBa\gFY|XL:NxzT:kXK\&G`:kd`h\v*j r\vv: : v:.:,Yak:kak)W[8  :[8 $ak)W[8 &:[8 @ 7 7   57 ak)W[8 :[8  ձW   :[8 ak`$گr( #h. 0 4)8.35wE7 7w<^@`y^@`avL Zg'":Z(v:.:,_b VϳzVϳD,=f@^@`@ #h@\@p!@kQ@`@ZZ @h@,:`@ @d@Kd@bxz@\v@Yh@}@ȫv@L:Q@ @Z @  E zh JEEUwwׯ<7B 7 {d #h^@`hKd  kQ@`Yh  xzZ xz,=fZZ \v&L:Q.\6}8 <\> Fыw 7 w K W ɥaɥz W@ WZR wы wwW W D   },:`xz$ȫv*\v.\^,:`l\vpp!6 ɋW W wʋR    "p!db V2 VD h b 7Vҳ00 v&hv&h t hé h?]+hR?WhDwkhT:BxhU( hȫvhkQhTϫhFph$Jt!@Qh:dHXh6QkQhWhxh hPkQhS0S( S(&&<<LL x x)>>@@|||| SY*6*6**<<P PSYvvxx BB   HHv@\>\SY[Page][00000 lines read in] .:24J   ) :s :t 0:SwO p:b VгzVгD::@?T@@,=f@!@,Z@}h@ @"w@a@@p!@zI~v@ϫ@VN@kQ@`@a\g@ZZ @'@h@,:`@VN@@W+@;K}@xz@@zIq@\v@0M@@S@@&G@t @@ @@ϫ@kQ@?T@!@:`@z 0"wh~:$"h`XhfZhp&hbe"hp"h\qŞhvLht!h{L}hTxLh0Zh*`X}h5aph8`;h:sh\ fww7 7w7w,=f ZZ ;K}0MZZ :`$a\g*ϫ0!6ϫ:VN<a@VNBt FVNHLt TZϫ`ZZ ^bwww&Uw wϫ VNaVN t $VN&*h.&G4,=f8W+>p!BkQFkQ@`HxzLPϫXϫzw 2 7w7 ww777w7 2 7w7 ,ZZZ ;K}:`!"a\g&ZZ ,ϫ2'6&G<,:`@a\gHS@N:`R!Va\g^;K}f:`j!na\grZZ 2www0  7w77 62%e;:@09$J?T! ,=fZZ ;K}ZZ ":`&!*a\g0I~v4 H.CCh  ɕ 7׭70 w 70 ɋw$7    ɭda\g ::(*4 8ϫ>\vDa\gH;K}P\vX\;K}b}hh}hx}h|}h*ɥ /P7E Е Е w$Е Е Е 7ww  w 7tp!}h?T"kQ@`$xz(}h4ϫ:'>I~vTa\gZ,=f^ZZ b"wf&GlZZ r,:`vZZ |Iq7 ZZ b 7Vѳzxs7VѳD}@@@w@@,"g'@/d@@avL@`@/d@w@@ZI9@zv@@U+@گr@8@Vq"@ @t!@"w@^@`@Vq"@"@-f@&@@e@:$"@z@Y|X@I~v@Iq@5 @`X@ak@fZ@p&@ϫ@p!@e"00 vATADATADATA@p"@)p@ @z\qŞ@yW@E`xZ@Å8 @&@wd@kQ@`@d X@8w@e@kQ @M: @vL@*}@d@zKd@@t!@W+@;K}@Bx@@ @xz@Bx@@xK@^@\v@0M@{L}@zkQr@kQr@Yh@xL@_\@kQ@S@@aXz@wv@;d}@Bx3!@BxO!@:k@:s@vk@zE z@Bxr!@&G@}@t @é @D@@)Ps@?W@Z@wk@#@ϫ@p@`X}@zt!@Q@5ap@4FK@@@ox@`;@ @&@)p@QL@@! @y@[Me @z #}@:s@X@  rh΁h:hyshL:Qh T[h|s?Th[,:Zh?T`h_kQhnz,:yhw_hkQ?ThH^&h}kQ""h?ThZ|hZXrhU:hkQh?Th4,:kh-?TphE`}hzs0Lq`;h"!h "wh,a\gh`'h"hhV}hF,:`h,:h&Iqhhvh)hIqh)hB}hDh hhj'h!h:`h |s[Ill string const][Line deleted] * [Ill cmd] * [Too many chars][Ill num] * [*EOB*][*BOB*][*EOF*][Buffer capacity |exceeded by][No input file open] * [Macro not defined] * [No match][Secondary file already open] * [Ill num * [Macro numeric arg undefined] * EDI -- Bad file name[Illegal in block on mode][Overlaying previously defined macro]BL OFF+t&T&PAG% BL OFF&T&BL ON P%&N-%&N M1 } `:ADDAPBEGINBLOCKBOTTOMCHANGECLOSECDLCLOSESCCDELETEDPENDEXITEDXERASERASEFINDFILEFFINSERTKILKILLLOCATE|LCLISTLPMMACROMCALLNEXTNPOVERLAYOUTPUTOPENSOLDPAGEPRINTPASTEPAGEPFINDPLOCATERETYPEREADRENEWSIZSIZESAV7ESCSPSSTOPTOFTABTYPEUCUNSAVEVERIFYWRITE*,,,~`;t! s ox eXww8e"p"e #} # "s$"w&&(&@*p&,T|:$" s4FK [Me  xK{L}xLkQrkQrQL`X}Z5apaXz E`xZ"/d$fZ&;d}(/d*d X(|ze\qŞIq Vq" sBx@v@8wwdwv s^*}vL Å8 " $ZI9&}.e:s`X Vq" yM: sd5E-5 $" 7EE7 7 ~& t!&kQ@`xzkQ"kQ (|s",4:t BH@L&PkQ@`RxzVW+ZkQ ^p!`p!`7e7CҐ#נ נ wҕ ʕ 77  w ,&U7f _\\v"p!4t!@ϫDϫZ:s^E z b`, h|s&n&tv~E c 5  S7EE77 0 wN7 & 7~Kd ϫ`X |sc&G Kd&ϫ 2|sS6@:&>kQ@`@xzF?WL;K}P0MV"^;K}f&GpU+tpV&f7 $U7!&$W p  0 7j5 t!@Q;K}I~v;K} I~v*avL.4&G::sB-fZak^)pb)pf lگrv7k70 7w&7O  CCFR 7055=55& |sk 0M |sI~v"(&G2S@8">pJI~vX}`yWfY|Xl:kpyWvd^@` |wkN@$p  7 AQbB`ҕ ʕ $e 7 5wf7Uf ! ,"g')p)p  گr$,"g',)Ps2)pFI~vVé Zjd p|s|Yh~xzv7w77 7w@E7l -  7 l57cE|é &Yh(xz0é 6Bx3!:Bx3!L ""` W vv%Aɋ7ы& Ne:^(045;173wZ)Ps$98)Ps &""`. ::R,"g'X b,"g'hC% l""`r,"g' x""`~,"g'T|77 w77^T ""`  ,"#,"# """`& .,"#6<,"g'BLq`;HysL,"#P,"g'`b Vϳz&@VϳD,"g'@`@گr@)@'@)p@a\g@;K}@,:@fp@Z|@vk@Z&G@K@ @hp!@,:k@T[@:`@ & 0&@h & n  A <   e 7p  7|vk `گr,:k&Gfp$vk(K,vk0'2)6hp!<گr@;K}T,"g'Xvk\)p`)pd jگr8jw7  00 vATADATADATA w8:` a\g;K} vk$`*گr.T[2Z|6,:b VгJ,YVгDp!@Zg'@ ,Y0,Yh ,Y&!7 B¥a¥z   O$!  : :: e3b 3 [ Zg'0p!p|3) ,, ],  3 3 ¥*¥.  ¥;  . VZg'@b VϳzvLSVϳD}h@}i@"@5 @p@t!@Q@ vLS0`}hS@hV:sh  vLSvw -  7 w * &}i"5 }hp5 ""$p(}h*5 .}h0t!@Q6p8}h"T}i\}id}ij"ppr&a a-  / &` `7h5 5  p$"&p*p,"05 8t!@Q@5 L5 Nt!@QT5 Z5 v5 z5 ~pv"2  %e  Eea"wK ae  >"p t!@Qp<5 RpT"Xp\pp5 vb VϳzQLVϳD,"g'@`@E`W@گr@)@Qw@)p@ @,"#@vk@v&@v&@b)Ps@' q@kQ@QkQ@)p@hp!@! @kQ@ QL0QLh QLb 7 7 MCALL.  77~ v&v&v&v&(Qw*,"g'.E`W0,"#4vk8' q:)>hp!DگrH,"#L,"g'PkQTkQX! Z,"g'^vkF^  7`ѕ ɕ ӕeנއ B)p )p گr,"g')Ps")p8QkQ>vkB`b Vϳz;TVϳD@,=f@/d@@?T`@`@,Z@/d@}h@t!@_kQ@ #h@-f@zak@ϫ@p!@:@wN`@yW@&@kQ?T@kQ@`@ZZ @,:`@kQ @΁@^&@d@zW+@xz@Bx@,:@kQ""@Iq@\v@ys@@hv@_\@kQ@:k@d@A,@z&G@}@ @K@@D@@?W@U:@kQ@ϫ@QkQ@,:k@T[@kQ@Z @z?Tp@ ;T0whz/dhZI9hJ8hRVq"hVVq"hZIqhÅ8 hDwdhM: hh*}h>Bx@hb^hkQrhkQrhzaXzh,wvh}h,#hl4FKhhvoxh #}hp ;TB (ɋ‹7wd‹77 7w& wwv&GIq(},&G2-f6&G<>,:kDJdP?WX\vZp!bp!fp!hp!n\vr}hzϫz|wH7ze   >5 UwE,=fQkQkQkQ?TkQ \v$kQzF&PϫV}hXkQ \kQ `U:bkQfkQ@`hxzl pt!t&jҕ ȕ E wwwze w BUwwϫ&kQ ZZ  kQ $,=f(?Tp,QkQ2kQ8kQ""<,:@kQzL,ZVW+ZZ kQ@` \xz`_\bkQfvXf77 -  0  07www~,=f }/d@ZZ Iqϫ /d@"ZZ ./d@2/d6D@:/dN/dV/dZ\A,`ϫh,=flBxr,=fm w w&Uwww7 7ȋ ХOŀϫ&G /d@/d@_kQhv",=f*ϫ0T[:^&>W+Dp!HkQ@`JxzNR,=fVZZ ZIq`ZZ h}n\vnF ȥN ХF  ХF ɕwUUUUE5Uw  b(,:`,:0 #h6::d>΁ByWHwN`N00 ;K}H V d;K}l;K}rt?TxkQ@`zxz~'z ˋҔ 0> 7E wwU7 Uw5  }h]+";K}&oHX.}d4;K}8}d>oHXDF,:yJkQ@`LxzRZZ \'`ϫdKdh}dldHXpK8 rxzX@  77w7m  w<\Kd ZZ dHX?W;K} 0M$ϫ,:`0!4a\g:oHX EDI -- Insufficient buffer space [Exit] [Creating new file] Input[Syntax error][Secondary file currently selec1|ted for input][Secondary file already open][ ys  w w  737 W  7& zȫv az}XU( 68t!@Q$U+.i8 :ysDBxJ&GNt V\~dsjx zys^|7 7 7 7  7777E}O7 7ɥ w|) y(8;"y;K}(8; I~v$V},-f04d8?W@xzHL PZP 7N UESYvv: :v:.: ,Y ysNZg':Z v:.:$a&*v:.: 0<&2ak)t  6Zg'a&DY|XJY|XD"7   77  7:[ :[X  ~Z,"g':k' q)hp!"گr&)t (ak)t  ,,"g'0ak4'6):hp!@گr$b77777):[  )X :[X )v[ )Xv[X )W[8 v[8 ")W[8 <7777 7  7 5 757v[8 )W[8  v[8 ϫϫ(8;y"w"/d@&-f*wN`0 2ys6yWZ]5  73w 7 7 ɋ  7 v ys] Y|X&Gr" $ys3(:,0\v4v&:v&>v&Hv&L,YRTZ|b Vѳz9:VѳD::@:@q`@a@-f@@$9Y@p:@z@@\v@d@j:Bx@$9!@ #}@ 9:h9:0@hh h h0Mh 9:  9:fffwыfQ$weAdw ѕ ѕ ѕ w $ 7 ɥ wDq`(q`.q`4q`Jq`R\hnq`rzva|1ef׭ ?ww ʝB`ҕ ҕ eb ʥ ʥr :::Bx:p:"$9Y$::,::2:6::8$9!>-fD\vH #}LX::j:pd&aʥz 7:: "9:b Vϳz VϳD,"g'@`@E`W@گr@)@I~v@)p@a\g@ @:@fp@v@j,"#@vk@v~Z@)'@)Ps@' q@)p@hp!@! @  0 h  P    77e~ : vk)' fpvvk)' v~Z,"g'"E`W$,"#(vk,' q.)2hp!8گr<,"g'@,"#DI~vN! PLp  7 ebB`ҕ ʕ 7  R,"g'vk )p)p گr,"g'")Ps()p<a\gBvkF`Lگrv@j,"#@vk@v~Z@)'@)Ps@' q@)p@hp!@! @  0 h  P    77e~ : vk)' fpvvk)' v~Z,"g'"E`W$,"#(vk,' q.)2hp!8گr<,"g'@,"#DI~vN! PLp  7 ebB`ҕ ʕ 7  R,"g'vk )p)p گr,"g'")Ps()p<a\gB<0bHx00!$d>$d>$d>$d>$@d>$d?$d?$d?$d?$@d?$d?$d?$d?$@d^$d^$d^$@d^$d^$d^$d^$@d^$d^$d_$d_$d_$vh_$@vh_$d_$d_$@d_$d`$d`$@d`$d`$d`$@d`$da$da$da$da$da$da$db$db$@db$db$db$db$@db$db$dc$dc$dc$dc$@dc$dc$dc$@dd$dd$dd$dd$@dd$dd$dd$dd$dd$de$de$de$@de$de$@de$df$df$df$df$@df$df$df$df$dg$dg$dg$dg$dg$dg$@dg$dg$d$@d$d$d$d$d$@d$d$d$d$d$d$@d$d$d$d$@d$d$d$d$d$@d$d$d$d$d$d$@d$d$d$d$@d$d$d$d$d$d$@d$d$d$@d$d$d$d$@d$d$d$@d$d$d$vh$vh$vh$@vh$d$d$d$vh$d$@d$d$d$d$@d$d$d$d$d$d$d$d$@d$d$d$@d$d$d$@d$d$d$@d$}$}$}$}$@}$}$}$}$@}$}$}$}$}$}$@d$d$d$d$@d$d)0d):2p)frrR)d)})`)8-.,0p!vL-0vL2)vh2)vh:vL:vL:WvL:TyvL:PvL:WvL:fvL:MvL:KvL:rvL:` vL:'vL:BxvL: :vL:y8:% :^ :""sz:%sz:u'sz:'d:8, :,sz:y: :Wsz:,_y8:`y8:` :^a ::dy8:\gsz:p :Kq :Vqy8:qd:s :yvL:-} :;} : :sz:sz:ǐsz:Ȑsz: : 2Id2IdKvLuL`;vL=MY(Rwh`Rwj,RwkR wmR woR wqR wrR wtXS[N T`:d{u,{uڇ{u{uq|uȊH|u@΋||uڬ|u|u@$|uG|u$$}uC}u3}uȒ`}u@_^}uH}uH}u}u@F&}uI}uvh~uȝ~u@Ι~uv~uڰT~uN~u@Ll~uNuuKuUu@M8uLVuڲuvhuNuO4uIhuȣuԬu~u@~uuu%juM8u@V<unfuu(6u@XhuuluO*uRu@#uguYuXu@uuu@RuV<u,uuuuu@*uuuupuu@θd00!vATADATADATAuԻXuZuu@u[$u/u\u@u[&uZu@%uu@u_Pu[u`8u@vu\nu]>u\uGu@Hu"Bu@u:uuuu@Bu!:uutu@Ruuuuu@!zuuu@;u"u#u$2uu$ u!u@:uu(6u_u@οTu;u@TuJuJjuuu@`u`ubudu@vhuvhuuEDu]Ju@D ubuu@ucuuuC&uAuB"u>\u@u>uB^uCu@duԧuڡuBu"u48uDuuTuXuu@cuSduSuLNu@^ruLuNduWTuSuY~uKRuWubuXueu@exuu~u@}ufvpMwd9Mwd:Rwwc}xxyyVy` yKvLyxyvLy;"vLyxKvLyp yc} z4vLzL vhz vLz%vLz #vhzG,zavLzfvL"{[vL({xvL,{xvL4{;d]}-c}-c}xy}X|}}}  ~r  ~s !%`9%8w,0K2` 4x789dDTrvLTu~vLPvLÐvL̐y:T ̐BxvLL 9Ldbl,b,b,b/,XZ/W/Oqhijk̫@` :=00!  zb ,}c tcEd<@dEjW!k#k#m#t!nf& p&vLq &KrR &&sz &:vL &N`y8%&}& }&K& &>&'Y'Yi'}H(}(}( |(q8( 3vL3wT3h`y:}N:`EE%EE'EU:E,dFE\gEKz@K8'K'KKKKaKLKYTL vLTvLwMHl?M XM:dM}M)"XMvvM}TNXa N  Nx N!NB9NdXNe;N_~N_(NqkQqQW~Q`PQ62QfaQl"vQD QQ`9Q@`VQdRXRvRvgRwh`Rwj,RwkR wmR woR wqR wrR wtR{Yd,=d|Nff,fc"*ft"fyfpfZf f f f@fZ!p`XpsIq@4ss9s: szvhsw~ v|JwoJw Jw%JwJwJw)!Jw;"Jw &Jw'BJwy:Jw}:RJw:tJwQJwSJwX:Jw,XJwXJwY!zJwY!:JwOq!JwTq"BJwUq"Jw[q#Jw^q$2Jwir$ Jwą(6Jw,:Jw;Mwd9Mwd:Rw%;ys=i~o>\k~:2>k~M@l~%!Am~B"t~u:B^{~ C&|~C ED΃y}D ED26GCHZ6IKJKJjfKR`LNKLSM4L`M"!Nd,!OH(Q)XQ@r:Sb"SXT ZU^WT^WW`XD^Xh2fYY~jZk[$n[&q\!^r!_P="`8Ð(bÐebÐdĐ@`dǐqe*ex*7Ff00!vATADATADATAUĎ|ĎL {    {8{wh{hUĎ|ĎL {w  N @Ԁ %! - mC a  v  Mk|| z  h  V  D  2   Jk@{8{Kh{ Nh{!h{,h{.h{YXh{hUĎ| ĎL {^w  a@`  SF~& ekV{&"k@{&@{8Z{YhUĎ|!ĎL {Df6D~  f6D~  {8@{&h{'h UĎ|"ĎL {w 74mf&  6-e   ~e   e k,{&| "k@{&@{8{z(hUĎ|#ĎL {4fC~w  ~@h"h@{80{&h{ShUĎ|$ĎL {Fw6   @Ԁm ej>{&"j@{&@{8B{hUĎ|ĎL {  {,     6{ { { {{"{&{2{b,hb/hb,h{8(bl,hUĎ|7eĎL {:w  5 ettCtt@@ii@{86{.hUĎ|8eĎL {Jw  5E5 ettCtt@@ii@{8F{/hUĎ|9eĎL {.f6t@ vtv@ A 6t@@] {8*{gghUĎ|:eĎL {Jw5’6t @ vtB@A  6t@@P5 ii@{8F{hghUĎ|rĎL {*f@  {8&{rhdUĎ|yĎL { 3{8{|hUĎB|(ĎDk@ {09Lh {we~kUĎR|vĎD {0Fkh*hhjhih  {Jf f &f &ff UĎz|wĎDk@{|@yVHyH {0p̫@`h/Whhd,XhR{e{fa"{-Zh/Oqh {Few w  7 77}{|  k{fa{fa {fa{fa "{fa&{fa *{fa.{fa 2{-6{fa:{->{-B{fajB7X e"ee7   e"/ z{-{- {fa{-{fa{fa "{fa&{fa:{fa>{faF{faJ{faR{faX{fa \{faZ5   7e7z{fa {fa{-{fa{- {fa ${fa({fa ,{fa0{fa 4{fa:{faB{faR{faV{-fX6e- w 7 77  7mz{fa{- {fa{fa{fa{fa,{-2{fa >{fa B{faH{faT{faX{fa^{-b{fa`  {fa00!khk6| dA B dB b( @ A B N  TU> E>L GFfW  W ,W W W  W W  u4;$ ";$@u@G8BuhU>pK>pL G4)7  a a  e :',u@*$@u@@:'@G80vu@hU>HN>HL G a euu@G8vuhU> M >L L`; G0  % & & e c$@ L`;|ua$(u@:u@@|u@a$@c$@@L`;G8,u@hU> }>L G  xu}u@"xu@}u@@G8|u@hU>  *> L Gf -  5 --+ׯ  #  --   V $;$u xu28$4$<8$DxuP;$Tuf8$h$nxu~;$|  @uxuJu@xu@xu@;$@$@$@8$@G8|uhU>ƀ T >ƀL L`; G % L`;|u)`*|u@)`@L`;G8u@h U>0 >0Lzu@@u@u@~u@@):2@)`@)@:%@u@u@u@@:@:@~u@|u@zu@u@u@@wu@u@Mwd@u@@u@|u@@zu@u@vu@@wu@?$@c$@za$@a$@`$@@8$@$@>$@@>$@7$@^$@=$@@6$@_$@@#@7$@#9@ Gw   37 T ׯ!  5 7  5 hk ?$@u~u@ #&g$0u66$BwuR^$Z?$@^u@b^$h_$@p#v#9~?$@| w-- w!557 T 7 -w: lb |u@#9#9&:(8$,`$@2e$6^$Hc$P#Vg$`ufwujc$n#9 ~L`;$  -& % [  Ο ] 7  f 71(nu@;$@$"|u($,8$0$4)<):2B8$F):2N):2R8$V8$@`8$@j)r)`z#xt N ׭^ ׭Z׭z7e7`2& Ν 7e$=$@ u@=$@&$.$6$@^$D7$H$J7$Ng$T$@Z$@^$b=$@j:%n^$r=$@t7$5 ^ Z   N C e d55 > 5  W!b$7$uu"=$@,$0u<`$@Ja$Rg$Xzu\uh#nd$xd$|Mwdd & N %  l$  5  %5  l a$uu@a$ .L`;$X>$@\uluput$v6$z$|7$  ! -  - %5 wR Vvu@~uvu@ .u@2$46$H >HL GPw     l  Cxʐ  (i;$ <$@ .L`;2uL`; :<$@@;$@u@i@L`;G8LvuhU>`  >`Lzc$@g$@8$@a$@#@<$@<$@@=$@<$@=$@#@f$@$@u@:@ Gf    5  w7 %55!--5f$$8$:8$a$&u,$6u<$@FuJg$Tc$B)`@u@u@u@u@u@G8vu@hU>H >HL G,7 7 7 7 7 7  7 8=$ <$<$<$@=$=$#$:p(#R:p@#@=$@<$@<$@<$@@=$@=$@G8(wuh8U>ƈ >ƈL Gw -  M @m r 5 we Ne th ;$@$u";$@(a$6u@:uNyuT8$X$Z8$^a$b$f8$j#0ap;$@x$|#0azu@@u@u@yu@u@u@u@@$@8$@8$@@a$@$@;$@@#0a@h@>|f N 5 5   e , uuu@a$*u.yu6uG8xuhjU>  > L Gpw  f % --w  N  e Piu&u.:$4:$::$@:$D8$@N#0aVu`$duh8$bu@u@u@u@:$@8$@@8$@$@#0a@i@G8lyuhU>Ƙ >ƘL Gnw &     B   %Vh 8$@8$"yu,xu@6vu@:$>a$BuFyuJ~uV8$^yufxuzyu@xu@xu@@~u@u@u@yu@vu@@$@8$@@a$@8$@h@G8jyuhU>0  >0L L`;zvu@@|u@:Kq@u@u@u@u@@u@u@{u@u@u@u@u@@>$@@z`$@>$@:$@@$@@`$@#@7$@#@$@$@8$@8$@@c$@$@`$@@z=$@;$@@$@#̯@a$@#@2I@2I@$@?$@$@7$@>$@f$@_$@  D-C. Gw5.+  &B 5-5 5& e w0-  6 Vk`$7$&8$,$6#<;$@>$Fa$Lf$T#̯Z8$@f{&v8$@| - & N& % C eD!Da !P-  P#$$>$@"8$@&8$4{uB$F8$l:$@n7$tu|u -  5  7 %m &  a` & FF a m du@ 8$@ 8$_$u@# $L`;,|u0c$6>$<>$@@uF$N$T|uz:Kqte6  @`a`&  v m  qm-=& Ν& e / -& :c$,u<`$@Dvu@R=$X2I00! $c$u_$ $L`;,|u4u:?$>$J$N2IR$@j8$n8$@z#0a@la  `7 ``e  e2 8$#0au>$@ $@&`$*8$.>$2#0a@k@{&@L`; G8uh>U>p M!>pL GLf 57 7 7  w@& %Pa$g$a$g$g$$`$@(>$,a$.>$2u6>$@>$@DuZu@u@g$@g$@a$@a$@`$@@>$@@>$@G8HzuhDU> t!>L Gpf      ׯ  -ׯ     @J ;$uxu$$.8$6xu<8$>$D8$R;$Vu`xuBu@xu@;$@$@$@8$@G8l}uhU>ƨ !>ƨL G(f  Я  8$8$@G8$uh U>Ƹ #>ƸLzu@~u@u@u@@u@@vu@@u@u@u@zu@u@:@:@u@@~u@zxu@u@@u@@u@u@@u@u@u@u@u@@u@#@e$@@8$@^$@@z$@?$@?$@$@?$@?$@$@?$@^$@c$@:$@d$@f$@@:$@:$@@z9$@$@:$@f$@$@f$@$@@$@@^$@e$@e$@g$@7$@g$@#9@ Gw.  e5dwT  " l 3 *\i:$f$ :$$d$(u TL`;Xu^$b?$fu@l$p?$v$z?$|* 5 f w$ *@a %w7 jfb^7 [ Jf$ ~uu@"u@@~uL?$T?$\?$@d?$@j?$@r^$~^$w e   Ae e ,($ ! 8 ehu:$@u@,7$4$8{S@7$B:$@F8$H:$L9$Te$\e$bu@hunuz7$ڀt e   ~,  \  Ta wp y   o P$@ {Su@uu"e$Bu@Vu^uf?$lc$rc$zxuԀj ge-  - 7 5IE- wpf  1 jnxuf$f$f$&f$*f$2f$8f$>e$D$Le$R8$T$Zg$fg$jg$puzg$laa %m 7r " Q ! 7r7z  7` ] -- \u@f$"g$.u@Bg$Fg$Lg$Vg$\g$buf#9n#9v:x8$~up   7  7 e5@&  %9 e:8$ u@7$8$$"^$@&zu*^$@.)00)4~u87$>8$B$D8$J#Re$@Vu^:$@h7$~T  e7 7 ( ,   ,  ,w  7  eX${S 7$:$@8$:$9$ e$*:$@0f$@Dvu@T=$p$@L`;Jz(BPzvp0L`pv~&,b)0@)@$@8$@?$@@=$@u@i@{S@L`;FG8zuhU>Ɛ #>ƐL L`;z|u@@|u@yu@u@@vu@@u@}u@}u@u@@{u@u@@xu@u@@xu@@~u@zxu@xu@xu@xu@@u@u@u@u@u@u@u@}u@@u@u@u@zu@zu@00!vATADATADATAyu@u@u@u@}u@u@<$@@>$@@$@?$@$@?$@?$@z$@?$@6$@7$@:$@:$@@9$@e$@$@:$@f$@$@@6$@;$@f$@z7$@#9@$@8$@@a$@8$@f$@@$@b$@;$@@$@=$@$@u@ @ BACKADV Gw(&  <& W!)H` %  d w$ ׯ e7  e7 ! Pk$:$(f$,u;$H}ufun7$|{St w wAm Gl4  5}  -     a j vu@=$ ?$ (L`;4,xu2xuD$@JuN;$@P$Zxu@`$@fujxu@puv$@|xuԀ w   ׯ  ׯ    s-% ,-. M F-b |uxu$8$,xu28$>xuF|u@L;$@N$T}u\;$@^$dxup}u@z;$@|$ڀl  -  w8-  - ` 5whChxu}u@;$@$&8$@*8$2xu@<;$@>$J8$@L8$Rxu@Z8$@^8$h8$l$pxu@ n-  5g c[& W!  DD& &    7 b8$@ 8$8$$xu@$a$,8$0$4$68$<;$N}u\;$h;$r}ud2&    57     :   %) w  ~V?$ ;$}u(>$@.b$8;$>b$H}uP;$Z}uj?$rxuzxuȀ   5 !  ew-( l7  -@ 7 j$f$@?$u@(f$4f$@7$L b?$x#0aL % a *a  l-M   w,a"a % v  :uuu &L`;*?$6<$@L<$@n?$|<$@΀ ,a"a % q *a hW!)^wB ^-a     ,,?$8uR?$`uff$@nxuv:$@΀D-*a ze  %& d%D R O (  Pu@?$u&7$.$2{S67$8:$@<8$>:$B9$Je$Tf$@΀ E ,7 8 5(e ! w4 "  (  w 7 Du xu@6$0$4yu>u@Tu@h{ul~ut6$z7$ڀ<    e w  !   w(e    ;nu00!>@DD &&&FFFFbb P2 Gp dp w v  e  e v    Dh8$@ $$8$*vu28$6$:u>xu@N?$^uJ#0a@u@vu@k@h@{S@L`;G8 zu@htU> V&>L Gw     B N`& N&  7           D >k f$f$*xuFu@Lf$Xxu^xudxujxu| D exuJu@@xu@xu@xu@xu@f$@k@G8}uhU>H (>HLzvu@@~u@xu@xu@xu@@u@u@u@u@=$@;$@f$@f$@7$@$@ Gw a    a w v    v    ^5,juf$,xu:ujvu@x=$|    Q 1  f %57 ׯ  - % \xuxu f$*7$.8$4$BuP~uV8$d8$f$lxu@t8$@v8$|8$X     & Ο a  e 08$u&f$,;$4;$8uHu*8$@8$@@j@G8Lu@hU>  %,> L Gw  =G-C -  _  Z   bi6$6$7$ 6$$6$(6$*7$26$8;$>;$N6$^;$hu@tx7$0| V w %2|u7$6$u@7$"u*9$,6$ju@@@|u@u@7$@6$@6$@9$@7$@;$@i@G8}u@hU> G,>L Ghw   !    Wp `@0  > &i6$;$&;$N6$T6$*6$@;$@i@G8dvuhU>  i,> L G6ׯ-7 ׯ+  &6$?$6$?$$?$06$"?$@6$@G82vuhU> 6->L G\f7 - ׯ ׯ^WZWze D f$6$7$u@6$&6$,6$46$J6$P6$Tf$2u@@7$@6$@f$@G8XuhU>ƨ }.>ƨL G>w7  -     >h 6$ :$f$6$6$ 7$&6$*6$8f$:7$@6$@:$@f$@h@G8:u@hjU>ƨ .>ƨL Gjw  77 -    7 -    nh 6$6$:$f$ 7$"6$(6$,6$:f$@6$B:$Fd$J7$L6$R6$V6$dd$J7$@6$@:$@d$@:$@f$@h@G8f}uh^U>ư 3>ưL L`;z|u@)fr@)`@u@u@u@u@u@u@u@u@u00!$vATADATADATA@#9@e$@;$@,GKEYPAD VT100 KEYPAD VT52 Gw-a 7     a & - hj#9 L`; $L`;.#0a2>$6>$ u";$.>$4e$$zuԀ a & %O e  ( rde0v rdC r e0v  r @e06 u"u0u)`H#9 PL`; ZL`;b|uf)`B>$@e$@_$@#0a@j@L`;(G8uhU>X t:>XL G.& aa a e }u&~u"}u@~u@G8*uhU>ƨ y:>ƨL G& 7 e7 7 7 2~u 7$8$$8$^$$@"2IJ~u@^$@$@@7$@2I@$@8$@G8"~u@hU>p 8>pL Gwm r 3-& `Nf f  f w `nha$u@&;$@($0u4xu@:8$>8$B8$@J8$N#0aZ#0a`uj$nuruz:$zu@@u@xu@@u@u@u@:$@8$@@a$@;$@@$@8$@$@#0a@h@|e  :$G8uhU>Ƙ W:>ƘL Gf 5-1  a %W  f f a 7  J `$#9ua$"Mwd,uB8$F$Pxu\yul~uva$ | ryu@~u@xu@Mwd@u@u@a$@`$@#9@$@8$@G8u@huh`U>  L;> L Gw ` (` " `     %!  j@uDxu^xuzu2|!  fN %  u:u@u@xu@xu@j@G8~uh U>ƨ a;>ƨL L`; G`w r  %  B  r  %   "h L`;"u @L`;Hu*u@h@L`;G8\uhU>Ƙ E>ƘL L`;ASC ADV@% APPEND&BELL"BACK CUT):2-CLSS:CHGLBCHGUJCHGCD5`Z(DUPC`*DMOVh)DLWCp%DEFKx'DATE+DESELEX#EXTFILLHELPI$KS PASTEQUITR REF  S SNSHR SHLr  SEL%SSEL"TI!TD TCTOP "TAB;*"TADJ*,TGSEL%<UNDW<UNDLDUNDCXLATE ^^qd*R2LT^BW%BR BLBPARBSEN!BPAGEU C/EWEL'EREPARESEN#EPAGE  LL  NLPARPAGE+SR SEN .VI 4W0: &.4 Gw >      lf W AIW ^FdA W B>W W;:B @`e C -D`8k6$;$ 2L`;f6u HL`;d ^L`;: lL`;Z|`7    &6  C!5 ~E`A "6$7$ ;$N6$L`;ffB;$@7$@6$@u@k@L`;00!,p R>pL Gxf  - 7 -   % & % f w \u a$g$a$"#9*#94g$8u _X>L Gme &a$ a$8$@$8$@8$@*$@8$@@a$@G8uh"U>H `>HL L`;  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{||}~AAAAAACEEEEIIIINOOOOOOUUUUYAAAAAACEEEEIIIINOOOOO׀OUUUUY  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRStTUVWXYZ{|}~π  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkllmnopqrstuvwxyz{|}~AAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuy Gw  5- פ .-* $    l    xk8$8$@&;$@($.xu@68$>^$ JL`;Nu TL`; VL`;^;$ hL`; jL`; pL`; rL`;x8$|   6!  xuL`;"jxu@@xu@;$@@$@^$@8$@@8$@;$@u@k@L`; G8uhnU>H :d>HL Gw 7& W 0) 5   7 W  ` Jj 6$6$ f"6$0u@Fvu@P=$X6$` fr6$v6$| @ Ju@@vu@@ f@6$@=$@j@G8uhu@hJU>( f>(Lzzu@@zu@u@@vu@@}u@@vu@vu@u@@}u@u@u@u@@f$@?$@ Gw-w| #ׯ  ׯ)7 6  a ! w(ׯ( \k7$6$vu@$=$*6$26$86$@?$B?$F6$JvuZvuju@t6$|    W!w%wa -   -  2u8uB?$@V?$h?$j?$x6$~;$Ԁ  ~ 6a 6 . 6-  " ' ) a 8?$@6$vu0vuDvuL7$N6$V6$p6$t 6   ^f %~     vp w 5 vpv )  5"I u$u@Dg$hu@r}u@ W!e8%:v   lw  7  N  5"  & D zu@ 6$ 6L`;:7$@uFf$L}uX\6$d}u@|zu6lW!e @e5%%wx e^$L`;*r?$@7$@^$@6$@6$@g$@?$@@;$@=$@k@L`; G8wuhwuhU00!4vATADATADATA>X f>XL Gf  @ wuu@"wu@u@@G8 fhXU> ;d>Lzu@u@@vu@@xu@xu@@xu@xu@u@@zu@u@u@u@u@@c$@6$@ Gzw7   {7 e % h      h 6$7$u@"7$&c$*$.6$6wuBuFu@JxuP6$R7$Vu@Z;$@`7$dulu@t6$v7$ڀve& Ο % m7   W    &  - -|u;$@;$@u;$@"c$&c$*c$.u6vu@@=$J7$NuXu@dxu@jxun$r$v$|$(    $$ $c$xuzuJ7$@$@;$@@=$@$@wu@h@G8uhU> Xq>L G"   eu@7$#0a~u2u@@~u@7$@#0a@G8uhU>ƨ x>ƨL G2f7  w %,6$7$7$u"u&7$*u2u@u@6$@7$@G8.uhU>ƨ Oy>ƨL G.    e u@7$#0a8$$$:u@@7$@$@8$@#0a@G8*uh U>ƨ y>ƨL GXw ҝ    v ҟ v    2h?$?$ xu28$6xuB?$Pxu:xu@xu@?$@8$@h@G8TuhFU>Ƙ @w>ƘL L`;  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{||}~AAAAAACEEEEIIIINOOOOOOUUUUYAAAAAACEEEEIIIINOOOOO OUUUUY Gw& l Be me!! ҁcmHf e p  >k L`;7$;$@,;$@0;$@Z^$^uj7$p;$@~|: e    me !    e ` %>;$@u"vu@,;$@0;$@FuRvu@\=$f;$@p;$@bvu@@u@u@u@^$@7$@;$@@=$@k@L`;G8uhU> w>L G,--&e % 7$ :$@9$$&wu::$@@$@7$@9$@wu@G8(uh,U>ƨ w>ƨL G\ # -5 ׯ 5ׯ    F;$ uxu8$8$@(xu.8$>8$FxuLxuVxuBu@xu@xu@;$@8$@@8$@G8X}u@hU> Ly>L Gzu@u@u@$@8$@@8$@#0a@u@@u@u@u@zu@,2@2@a$@ff  &  N e%w) -  mz8$ $$u8$@"8$&8$*$.#0a8u@uH$J8$Tj\;$@^$d:$@t8$x$|8$@|  & V aa % I  f N  e  f J8$ u$uzu0,2L8$T#0a\ufunu@|$ha a e   m  %  %\#0a2u $"8$&u*$2u6a$p  z>pL Gw& &  We a    aea  Ph?$$f$@"$&f$@.u@<7$J{SNf$@Vxud7$r |      e#   C~e   e eJ 8$f$@xu.u@>yuB$Ff$J~uN?$Tf$Zxuru@zyu@~u@u@@u@@xu@xu@?$@8$@f$@@$@f$@$@7$@ @h@{S@G8uh0U>ƨ ,}>ƨL G^w -)! @     `%f wp`N %8h $8$@4{u@$HyuLg$Pg$XuRyu@u@{u@g$@g$@$@8$@@h@G8ZuhU> t>L GXw- W @m     &f %     h;$@$6~uHxu:~u@xu@;$@@$@h@G8Tu@hU>E>L Gbw)  @, 6ea6a %%hu":$V222@u@:$@h@G8^vuh U~<@~L ^04dCjF z L`;|          *::::JJJJ Zjjjjj zzzz  )9999IIII Yiiiii  yyyy LF VT CRESCDELINDNELSSAESAHTSHTJVTSPLDPLURISS2SS3DCSPU1PU2STSCCHMWSPAEPACSISTOSCPMAPC!!tC/L-Y-S0X0C0a_<<0^+-2^3^/UP!.^1^o_>>1412??A`A'A^A~A"A*AEC,E`E'E^E"I`I'I^I"N~O`O'O^yO~O"OEO/U`U'U^U"Y"ssa`a'a^a~a"a*aec,e`e'e^e"i`i'i^i"n~o`o'o^o~o"oeo/u`u'u^u"y"fz$@He$@H$H$H$H$@H$H ^ $h6$h7$h=$@h$h8$h8$@hza$h _$h =$h^$@h?$@h?$he$hh$h^$h#1h#h #1h"#h$#1h&z#h(#1h*#h,c$h.# h0T`:h2 Xh4a$h6<$h8^$h:f$h<f$h>c$@h@d$hB_$hDz#hF#ѯhH$hJ`$hL`$@hN6$hPf$hR$hT#hV<$hX<$@hZ=$h\<$h^=$h`=$hbzd$hd#9hf#hh#hj4{;hl7$hn9$@hp9$hr9$ht6$@hv`$hx$hz;$h|;$h7$hzg$hg$hg$h_$@h_$h#hd$h`$h>$h?$h$h?$h$h?$h$hz?$h?$h^$hd$@h_$h$@hc$h:$hf$h:$h d$h <$@h?$@hf$h$hzb$h$ha$h9$h$h#h #h"#̯h$#h&$h(<$h*e$@h,e$h.e$@h0e$h2ze$h4$h6d$h8f$h:$h<:$@hB:$hDa$hFa$hH`$@hJa$hL>$@hN>$hP>$hR>$hTz$hVc$@h\c$h^$@h`:$hf$hh7$@hn7$hp8$hr8$ht7$hv:$hx6$hz<$h|$@h~z;$h8$h:$h#:h`$h2Ih2Ih$h$h$h$@h$h$h$h$@hz;$@h;$h)0h)hX_$hZ8$h\^$h^^$h`^$hb^$hd^$@hf$@hh7$hjb$@hl>$hnz9$hp;$@hr$@ht$hvb$hxb$hzc$h|c$h~$h$h9$hb$h9$hb$hb$hz$hb$@h$hd$hd$hd$h$h$@h$h$hg$hg$hg$h$h:$@hzg$hg$@h$h $h f$@hJ $hL f$h :qh $@h 8$h :00!DvATADATADATA'h $@h $h $h $@h z$h $h: $hZ $hz $h| L`;;$h6$h$hf$@ht$hz$@h$h$h$h|tGŧ`y` d'@Bʚ; TvHrN @zZr$h$h$@h$h$h$h$@h$h$h$@h$h$h$h$hHU>E>L Gw)f 4f 5 ,eaa  Vp7` ,hu$vuL,2b:$n:$~#0a|e%Bu@vu@,2@:$@#0a@h@G8yuhU~:W!~D W!04#0ah W!8f  @ P ``` m RU>P#>PL L`;zyu@@wu@~u@@u@u@vu@@u@)`@wu@)fr@$@7$@$@6$@=$@@QUIT/SAVE! Gw     ! 5w8 70 5 & bj _$@vu@ =$*_$@0_$@4$66$<$H^$R?$@\$byu@lwuvuz)fr|x- - ׯ!2  5-& Ν %  7 7   e e d?$@ _$@wu?$@u"6$4$@:$@>~u@H_$@Xg$\`$@ lL`;p7$t{Sz7$e5 ׭!     5$ ! wh=$@=$@$&u.$2u:$>vu@F_$@T=$duh)`l$n6$r$t7$z$z^$@_$@@?$@@#9@$@$@$@@=$@g$@`$@@u@j@{S@L`; G8tw7 =$_$@zuhzuhU>ƨ#>ƨL Gf  @ zuu"zu@u@G8#Yh,U>P#t!>PLzu@u@@u@)fr@u@u@@:@u@u@vu@@u@)`@+dQ@=MY@u@z|u@@,2@2@c$@a$@^$@8$@$@6$@7$@^$@?$@@#@e$@$@ G !7 -  & 7 7 %  ׯ!  ׯ! t 7$$?$@#9"#9(a$0u4_$:^$>^$BuH+dQP$T=MY^$b6$j?$@pvu@x6$| T-Pa a % V 7   T a  a b?$@ =$$8$:.,2<|u@B#HuL)frPuXu\)`dunu~uj 7  a aa %  7 7 e J g$u@.26`$@8& >8L Gw W  5qW  g@ El^ Ne@V5W  f  -F CDi _$2|u8;$ BL`;X#ѯd_$jun#tc$zc$Ȁ|f  < l  ~> P%&< DX <@te0 9e "@Ee0 9e $@6${&> L`; tr|u@u@#@#ѯ@_$@;$@6$@$@@c$@i@{&@L`;G8):2h~U>p&vL>pL Gw  r e4  - El#5   ԗ  ~ 4h.;$4;$ >L`;J#ѯ\$@`6$f{&|e@ L`; HR#ѯ@00!L  &K> Lz)`@u@:@u@_$@8$@^$@^$@)0@)@a$@$@c$@c$@@e$@@ Gw -7 -    @7 f5A  S-    @h u8$:c$c$@e$@"e$@(c$@4c$@:c$@>)`H^$N^$T)`\^$ba$hc$@je$@pe$@vc$@r|7  e  e7 -    @7~c$@ c$@)c$)0c$ )0$)0(#0a.)04)0:)>)`D^$J$Tc$Xc$@Ze$@`e$@fc$@*    7  c$@ c$@uu$_$"#0a@h@G8)frhU~Xz &&~XDs@P@)@,"s@,"@k@@@@:Ty@s@e;@:K@z 2&@zf@ձ@:W@ @,"a@):2@,":@)@:P@#W"@Ա(@ @:M@Ð@z:y@ :`^0:,h:""h :WhH:%h:\gh:u'h*:h<:ȐhN:ǐhP:hh ":y.8kF@VkZ:P`:Md:Kh)t A :  eNv A A A . A ; 5@)):2:Ty":W().s4 2&@)`):2p):2W W f?@  A ~N e %)Nv : Nv Nv %,s@)L:TyZ)b):2n)x)rl@ (  @ B  Ze& 0  vPe0& v~4):2D):2b):2U~z &:~DKHP<&@p@%@<&%t@%r!@t @ :a >"{[h"Ph(yh:z̐Bxh4,0p!h -0h:Tyh:KhTu~h2:Bxhy;"h8Trh6Tqhfhx:` hyxKh9zfhD:Wh8z:h:hh(:Wh:rh:Ph:h:fhz4hzahuL`;h.z hyKh<:'hz%hdZ:MhÐh$:yhy@2]({xh,{xh2d2@j#xh :a VV TTffhh  &&((vv tt %r!% DDHH66x <&%t88PP <<$ $JJ &t  <&  )  .. << 2]   U>pz &N`>pD&K@s@`@k@}s@Ѳ:@:Ty@:K@:Bx@&@Tq@f@z:` @:W@h'@ձW@:@:@@:W@:r@Ա&@$9pw@:P@K@:'@:f@zza@z @yK@:'@:M@:y@,"Z@2X@ :` :`^0:,_h:`h:h:Vqh::dh2 :` 0 :`^00!TvATADATADATA& & & & &f& Ε& Ε -Cפ:$P W[C W<,yKK4s6$9pw~W]~H $$C˥.˥;  P$ ɥ.  C ɥ; ~H$ ѥ; H  B~R~ ~ѕ. ~ѕ; ~H7 wwL :Ty:Ty :Ty$:W,:Ty 0:Wb:Wf:Tyr:Px:M~:Kt@& SY&"D pAB b B~7 7 AB >AB .  $@H(Tq0:Ty<:Ty@:TyL\fl:Ty p:` r:Ty|:PeB < w7*we7 83@# +@  777P:Ty}s":P*:y0k::'Nh'X:^:f:` l:'r:Bx~:fl @ *7  we" T@   DѲ::(,"Z2:::B:yN:'Vkp:v:|:`   0  %# &:':':Bx:r<&zh'dF#   ww we@&B#  B   we 2 h'$:M*:K2kL`R2XbKtk weff& & & & f e @  wefff& & ff& xe kzaDzaHձWXkR\ "@ % ХTХMȥP=   :TyU>%&>L GLw-  B B  r &  r fe0 h):2F):2"):2@h@G8H)h$ U>& >L a(}      * L`;z::d@@:Vq@:u'@:,_@:`@:@:,@:\g@zf@z @z%@z4@u@$H .TMP.TMP Gw   w( l   N lff& & & & ewff& & & 0k (L`;4 FL`;Jz%`:,_nzf|& ff& /"6    l w./ 6 B:,_a(}a(}z4&a(}*a(}8 `L`;du 6   7 (   &&& & ( 7$ 5C-(5 &fua(}((z40a(}4a(}:z4 Fa(}(J::dPa(}$Ta(} ^a(}(lz4 pL`;|a(}t && &  && & && & & & & " ee3&ffHa(} z4 L`;(z44a(}8a(}>z4\:`pz ~a(} &  e%/ff&  ew w   l$ Fa(}:`2z Ba(}Fa(}P:,_^u tL`;$xu ~a(}l . , & aaff e 4  l, dz% a(}a(}.zfa(}, a(}$z4 ,a(}0z H:, nL`;,ru xa(}|z4&f 5/$  *-* 7 *ev  [ l2IFC/ N a(} z :\g.a(}*2a(}*<:u'Ba(}* \L`;2`z%fzflz4d-(& %5-( $  e-(5$  5&  e& pa(}(z4:"a(}(*z4.a(}$2a(} 8:VqBa(}(Jz4Na(}$Ra(} X:Vqdz4j:xz F  l>  %@ e 0 L`;>uz4(z 0:<uL`;z$H$H$@H$H$H00!\$Fu^$duh$n$ruvzu te z{u@yu@u@u@zu@u@$@#@$@a$@;$@@#0a@k@G8|{uhRU>(& >(L L`;z$@$@$@$@$@$@:s@)`@u@@|u@u@vu@vu@@z #@|u@@ )B Gf& & e  -  %5 - 5& & e n$vu |u@$:%*#9 2L`;:|u>)`F#L:sP#R4{;X4{;\u@d_$j$n$vvu@΀|N 5& & e  =$--T f& & e h |u@:%=$$ $(vu@8|u@<:%BT`:D$J^$R$X$\^$hup$xvu@"l   |u@:%z #b:%@#@#@_$@=$@^$@T`:@4{;@#9@L`;G8uhU>ƀ&>ƀL GDw    5A C,~  iu:$*:$@u@i@G8@{u@hU> &> L Gw - B-qׯ -  & Ο&  5   B ׯ 6-2bi;$@$8$$8$&$.xu@;$H;$Ru@`;$hxur8$z8$|$Ȁ| -  / ׯ -  & Ο& 5    B   ebxuxuxuxu 8$(8$*$0xu8;$@;$Ju@X;$`xupxuvxu jxu@xu@xu@u@@xu@;$@;$@@$@$@8$@i@G8}uhU>X'Y>XL G {u u"{u@u@G8 {uh6U>ư'Y>ưLzu@{u@u@@8$@$@e$@8$@8$@$@$@:$@7$@$@7$@;$@@ Gw5wn& e - %a w6   lVke$$&$,{!8:$:7$F$J$NwuV8$Z$du@ ~L`;| 0 @  Aw  @    Aw  w w  &u,7$87$b7$l7$r8$Ȁ @  Aw 6 6   wv 6 m 6 e (8$88$^#df$vf$t wb6  m   ev6 " m6    m6v  u;$@&;$@T{ut{u6   @6 -W B  Q J@2  T8$Za$^d$d8$l @ 26 `ȵ  - -  20B)`ˋ$  2 7$&$*$.$4$8$@$ F 00!dvATADATADATA2        І5 D    50u e$$7$*$0$6$:d$(d w5w %euL`; 82Za$@f$@#@d$@wu@u@k@{!@L`;G8{uhU>ƨi'}>ƨL G$w  & N hu"u@h@G8 |uhU>ƨ(}>ƨL G" 7 %,)0 ))08$)0)_$2)0@)@_$@8$@G8)`hU>(}>L G(f- w .) )0_$)`_$)")2)`@)0@)@_$@G8$uhU>Ƙ( >ƘL L`; Gzu@u@u@@u@|u@)fr@u@#9@a$@?$@@`$@@c$@@^$@@_$@@L`;p 5 -  & %5 %- - bu ^$@?$@#9 a$(u,u4c$@ :L`;B|uH_$@R`$@Zu^)frb#9ju@G8l|u@hU>(q>L G$w  & N h):2"):2@h@G8 )hU>ƨ( >ƨL G.w   @f %h;$#()2)@;$@#@h@G8*|uhU>3vL>L L`;*$zu@{u@):2@)@|u@)fr@}u@:,_@:,@:@@)`@2)@$@_$@%Additional information available: Gw& Ν& & & & D& ewXEmN  E W W  E  ! :kz4$_$2) 2),:,_:{uV|aaKW/ E W W W/aaD (a,a0a4a 6,6 &5,w^ (w@z4\:, wv6 "*e1* aa aa"  .a2a,2a e o a 4W Z}ur{&t N2a af f(a& e f e 5,@aaHNatL {S$8{! LL`;T{!a@`& %:a>aBaFa 6>e( 00e :a>aBaFa 6>ew5"  {Sz4.:,Nz4j:,l  wj (w~5"?  @t@a`@ 6a`& v (" .e0 ,,)frN|uR)frb)frv|uz)fr~z42a6a:a>a 66e $5$/5, -0  .6 $.0 2a6a&:,*)frR;$h|ul)frpz4d:a>a 66e 5"[6 (e1.a2a2a e B  !  r  .:,F}uX)fr \L`;d|uh)fr|)fr.0 2  W  "2a6a:a>a 66e   ( "w& 6 ( ) ):20z4L:,`)frF\~ &  B - eeD)fr u)frz4:")fr*u.)fr2)4)0:)`Zz4@;$@)@)0@k@{!@{&@{S@L`;$G8uh U>p3w>pL Gw * d V ,f fa  a a& Ν& & & & Hi|u@0@#0aJ2)P2)Z#0a^z4j2)p2)|:,_Z|D& e& B ea e e ,{uz4:,|u@>$B#0aF_$r2)@2)@$@00!l 3h> L Gh)5*/  E -e a a >e  %";$>z4V:,*:,@;$@z4@G8d}uhr U>y:}>L L`;  *  C* u " ?[EOB]a 2 ) :.!? $ B PASTEzvu@vu@@|u@@:%@:`@,2@}u@|u@u@wu@{u@:y:@$@@$@$@z$@@$@$@$@<$@$@$@@7$@@8$@`$@@_$@=$@7$@#1@_$@@z#@9$@@9$@?$@@:$@@9$@?$@e$@^$@#1@c$@@:$@@#@#1@a$@z<$@^$@f$@f$@c$@@d$@_$@$@$@#@4{;@6$@@`$@$@e$@@ze$@e$@@>$@e$@d$@;$@;$@$@_$@#@f$@g$@g$@`$@a$@z?$@:$@?$@@f$@$@b$@$@`$@2I@$@$@$@$@@)@_$@z8$@b$@@9$@b$@@g$@f$@@f$@$@@$@$@$@@$@$@$@)0@JMAIN Gf7 6 6 6 6  7 7 7 7 = 77 7 7 7 |$@$@.$2$@6{S:8$>7$@D`$@H:$@L9$RT`:T$@\#`d$f?$@j=$p?$ve$z_$@~^$v|7 7 7 7 7 P7 cc7 7 a$ <$^$f$f$c$@$d$($.$4#86$@>`$D$Je$@Pe$Ve$@\$b<$fd$le$r>$f7 7 7 7 7 7 7 7 7 7 7 7 7 7 $_$ f$g$g$`$a$"?$(c$@.:$2?$@8f$<$Bb$F$L`$P2IT$X$^$b$@tP7 7 7 7 7 7 7 0 e 7  6 a6 _$b$@ $9$b$@g$:$@f$@"f$&`$@,:$8:y:<:`@_$F_$J)0L)P:R8$Vwun#1aa 5 U5  =e wNPa   U J# $$vu@0:'8T`::$R{u`_$ rL`;v$@z{Sr<     " **a  L`; ${S L`;${S &L`;*$@.{S 6L`;:$>{S FL`;J$N{S VL`;"Z$^{Sn;$ *& %V e(w0**a 놎*, %**a Ն*2Z,2 L`;&;${S&|u@>;$B,2 PL`;,T;$X{Sj;$n,2 |L`;2& %**a : %**a > %**a d;${S;$,2 ,L`;:0;$4{SF;$J,2 XL`;>\;$`{Sr;$v,2B %& & D J6a e V e,#5| L`;B ;${S#4{;$@$vu (L`;D0|u:7$<9$ @L`;JH7$R}ub|u@p7$r9$@x_$~7$@" W  =Ue,@ e  uT`:$$$,$j:@$@:'@$@@T`:@`$@@:$@d$@$@{S@L`;NG8Z~uhU~:`~L L`;z$@$@$@=$@@7$@6$@e$@#@_$@@9$@7$@$@$@;$@@g$@^Z Gw6 & 6 6    l nT    N C 500!tvATADATADATA^ Z Li_$@ *L`;.u8uD$H=$@P:%V=$@`$duxuԀ|e j5  %  %7 Kaa  nu `$@#u $$=$@(u@2$6=$@::F=$@J=$@Lg$R$V$fvu@p=$@|$%7 e)7  & ` 7 e7 w (e~#0a=$@7$9$$7$(u,;$@0$@$D#0aH;$@J=$@N=$@Ru`=$@d7$hul_$@v=$@z$dt& e ׭! 5 %e!ej L`; {!$"=$@*_$@2$8$<=$@@:F=$@H7$L$N7$R$T6$Z7$L`;z`$@@u@@u@u@vu@@:@:%@u@u@u@#0a@i@{!@L`; G8 b ~u@hU>E>L L`;zu@u@@u@u@u@u@zu@u@@u@)`@a$@c$@@$@6$@`$@GOLD Gw  a h   &a {  5 8  9 : ;> @ w2h 6$)`u>uHa$NzuT`$Ԁ|b& e wB a w WW -n5 j 5 a h JD L`;u$)`.u8u>;$Td$\c$@bu@f)`puȀ G C- f N& a %C- -  Ο W  %;%WV6$6$zu&u.u@2)`ƘE%>ƘL Gw) a  r 5tv 0 5 W 5 N& % G%Jiu@&vu@.$07$@a$Fg$LzuR`$Xuh`$vuڀ|WN  a % .W W ,W ܃5I& N& & eN  a % %2u 6$"7$<`$Hu@Pu@Zu@puzu@vu@@zu@u@@u@u@@u@$@6$@7$@`$@=$@g$@a$@i@D% 5%%w %& 6$7$vu@$ 7$,=$G88~uhhU>ƈE>ƈLzu@vu@@u@zu@u@@u@@u@yu@vu@u@@u@u@@u@@u@u@ Gw  5 p  Q& & a&  e wh   ^ju`$ u@$$&7$2$46$8$:7$>a$Ju@Vu@pu|u@΀|e "& &  a&  e% ewW A1W ,W N&   >$7$a$u@*u@$B>$@FuLu@Vu@ba$@a$@`$@$@6$@7$@>$@>$@@=$@j@G8uhU>ƠE'>ƠL L`; RESET ADV zu@u@@u@@u@u@@)`@u@u@@u@u@u@u@u@{u@@a$@ BACK Gwa % w00!|$N>$@RuX$Z6$^$`7$ja$put)`t %.7 5& Ο f e f  e f e< u@6$6$,6$0u $@>$@@:$@@$@6$@7$@7$@#9@g$@g$@?$@?$@@f$@@k@L`; e6$7$G8uhU>EU:>L G"  e  6$6$u"u@6$@G8uhU~̈E,d~̈L L`; GOLDW. BL.EL.L.C.)UNDC.UNDW.UNDL.EX.BR.ER.CUTSR.; @PASTE.$5HCUTSR=DELETE PASTE. APPENDSR.?'Search for: '.# z"".ADV.$BACK.-V.+V.+C.-C.SEL.D+NL.DEW. D+C. (^M-C).D+EL.DBL. DBW. PAGETOP. (16L). D-C. TAB./TD.TI.TC.^M.^L.EXT ?'Command: '.REF.+(CUTSR=DELETE PASTEKS"").RESET.ASC.>CHGCSR.HELP.SHR. RSHL.3XFILLSR.DEFK.TADJSR.(-16L).(+16L).(27ASC).,-./0~128345\6F7z89:;<=>?@A6 !>"#8$4%0&@'(X)H*F+f001&2 345 ` f,~589FHfIKN,F6f@8nv ,-./80~1234z56F789:;<@A6 !>"#@$4%0&'(f) *F+&,H-.8/\0045X ` @xf,~589:XFHfIKN, Gw   /  `W"#fa %  `ef`&  5e ee6i #9 L`; "L`;<{u@ PL`;`yu|$ | Byu@{u@@$@#9@i@L`;G8yu@hU>E\g>L G<-   5  26$7$u@$6$,u46$86$:u@@u@$@6$@7$@G88u@h\U>E>L L`;pqrstuvwxyQRABCDnSmlPM Gw  a 9 Wp B`B0 c  ? O [ ~e  #e,  hu ;$T;$ nL`;|  2u@;$@h@L`;G8uhU>ƘKz>ƘL L`;z$@$@|u@@vu@@2@|u@u@u@_$@e$@6$@@7$@9$@7$@9$@@ MAINPASTE Gw f % w&f& e f& e 2f& e 5@i 7$7$$|u :L`;@{! TL`;Z{! nL`;t{!|& & e 0"7 N -7 4 w 7 w 7 B@ _$ $$vu@$7$,_$6|u@<7$>:$@D:$@HuNuR7$V:$@\:$@`9$f9$j;$n$t$v$f 7  2 @$ e%a %- % D 6$@07$42:7$ @L`;H|uL7$N9$@Te$\7$`uJ:$@@;$@$@$@i@{!@L`; G8ZwuhU> K8'> 00!vATADATADATAL GV&  &&& 5  -( % 27$u|u@"7$2yu>|u@B_$@Nz #Ju@yu@|u@@z #@_$@@#@7$@G8RyuhU>K'>L GFf&& % #V w ,7$ 7$|u&7$6|u@<7$@uB|u@@|u@u@6$@@7$@7$@G8ByuhU>KK>L L`;z|u@)fr@u@)@u@u@yu@u@$@@$@7$@d$@$@^$@7$@ line deleted Ga    e E 5 &    0 J$@{Sd$&7$*$.#0a27$:uLuV^$`uz7$t|   a  a& e e ( 5 Lyu u L`; |u $L`;,)0)frB$@H{!b_$@j^$@puR#0a@u@_$@@^$@@{!@{S@L`;G8yu@hyuhU>K>L Grwa  Wpeaf Na a %a e&h{S*$6wuN j{S:$@wu@ @h@{S@G8nuhU> Ka> L L`;No Gwa a& e   aaf   e0 % 2h{S$$@4{! @L`;H)dux):2D|& & e s e)$$*{!:):2bu@):2@)@)@$@$@@h@{!@{S@L`;G8|uhU> KL> L Gf@ ȋȕ f /     -   N %b7$u*d$27$6$:#0a>7$FuRuZ;$@\$j$n7$r#0avu|{u |ezu@{u@u@u@u@d$@7$@$@$@;$@@$@7$@#0a@G8{uhbU>ƘKY>ƘL L`;$ Gw a   <      ` a af Tk))0;$@({S.;$@4$<8wu FL`;L#0a ZL`;`#0a|ur| W &e0  W  W   %W ӕ.% 7em77e,R)V)0X)^c$b_$fc$j_$ru@_$@)@)0@$@;$@@c$@wu@#0a@k@{S@L`; G8{uhU>ƨL >ƨL G&&&&& e7$u"u@7$@G8"uhU>vL>Lz$@$@$@$@@u@vu@@|u@@vu@@u@zu@u@u@{u@d$@7$@ Gw 6 & 6 6  > ` vaa 5   Di7$2|u@B$F$@Vvu@dd$l7$p$t#0ax7$| e 6  Iaa 5e6 & & 5H"a eK-Duu$"$@2vu@Dvu@L$P$@Xvu@n{uv=$# e & &  Ha e5LJa >$:$(u4zu8u<$@$@Hvu@\{uj:'"t  e e{u|u@$b$@8$@=$@:'@7$@$@$@:$@#0a@i@G8~uh00!vLw>Lz)fr@:@~u@@zu@u@u@u@$@$@8$@^$@@$@7$@=$@@6$@ Gw ;`f %w5 -  -& ea  Νjiu9$"7$,u07$26$<^$@B8$D:J_$@P)frTa$^$l$v{S|$Ԁ|a  a e< % -  l  N`& N 5T${S${&,$0$<4wu>a$Ja$ VL`;Zub$h$v~u@X   %55 !  e ^=$@ $:$$=$@u4$67$:$<6$B$FzuJ_$@PuL`; GLz_$@@a$@9$@$@$@$@:$@wu@u@u@d$@7$@$@7$@#0a@4L    e&d$7$$#0a7$$u:i@{&@{S@L`;G8|uhuhLLU>MH>L L`;zu@|u@)fr@|u@@)@u@u@u@xu@yu@u@@u@u@u@u@zu@@vu@@^$@@$@$@@7$@;$@@7$@^$@d$@$@^$@@$@@=$@$@  line moved copied time GwJ 2a  f  &  5e < La \j7$#0a 7$&d$0$4#0a87$@uL|u@Rvu@h;$@t{Sx7$~7$ڀ|a %a w @af    eG a ba t\7${&u7$.#0a2u8d$@7$D$H#0aL7$Tuhup$@z{S  N 6-2 / &  b d f50 N  V ew5 Dvu@u;$@ $&^$0uP7$Zxudyul|u@~uԀt5  \a $a 5 eZa ^ \ ^a Vyu7$u"u@(7$,7$0u6^$@@$@N$X{Sl|u@t$@~{Sna e &a 5 &a`a %5" -  V P $@{Su&$@0{S:vu@Lwu\u@`;$@b$jxuvyu~|u@΀le&g  & ( * 5 ja   .a& e H u(yu.^$@4u >L`;F|u NL`; XL`; `)r$x{!b .a e .aja& e  e,eJ0 L`;) L`;"|u*)frD{!V=$J#0a@wu@j@{!@{&@{S@L`;G8FuhU>?M X>L GBfW   W f  |u@|u@@G8>uh\U>M:>L GX  aa ee8:q:8$2$6$Fvu@NP8$L`;z$@$@$@$@$@vu@@:@7$@8$@:q@u@vu@@)`@|u@@u@zu@u@{u@u@^$@@$@)@)0@$@#@$@$@d$@;$@@7$@ GTTw > @`ȋȕ    ewn<6 6 Jk7$ |u@(7$8$DuLvu@T;$@V$\;$@ nL`;z)0|)L  00!vATADATADATA և5   a& e a h)`)`u^$@"u*$.7$2#0a6u:vu@B$F$Rvu@h{up=$v$z$fa& e a w f ea 7eeD vu@ {u&#*:,8$07$8$>#0aBuV{uZ8$2=$@#0a@k@G8*u@hTL`;U>ƨM}>ƨL G  a$$a$"$@a$@G8uhU>M)">Lz|u@@:%@u@@u@u@@u@,2@2@)fr@#@$@a$@;$@@^$@ Gw5w Paa % Pf B` Ҕ Ca 2k^$@ u6,2D;$@N#0aR$\a$| @  a w a a ePa a % V  w 52 ;$@$;$@(u,;$@B2Z,2h|u@n^$Ȁv5!fa % ɕQ& N  - 7#T 5 & Νf aP F #u@0u6`$@Lg$Vu\^$b)frf$l$|:%t N e  $f WYWN WAWQ  Pa,u`$@&|u@2P^$@^^$n|u@" a % e 2J^$@@$@`$@@g$@^$@#0a@k@G8uhU>pMv>pL L`;z|u@)fr@|u@@)@u@u@u@u@u@u@$@@7$@$@@$@$@ line resequenced Gf5 a a e @`ȋȕ   N eq P^$@$@$&{S.$8{S@7$Xd$`7$d$h#0anu|uڀ| e    e P a  -     V;$@$@wu$|u@,$07$4#0a8uBuJ$@T{SZub;$@d$l aee     eej$7$ #0au$@"$@*u2$67$:#0a>uB$@ FL`;N|u RL`;Z)^)frr$@$@;$@@7$@d$@^$@@$@$@@#0a@wu@{S@L`;G8`u@h@ U> M}> L L`;zu@@|u@)`@|u@@u@@u@,2@2@@^$@@<$@?$@_$@;$@d$@z;$@^$@`$@a$@f$@f$@e$@e$@e$@@e$@e$@@c$@@g$@g$@$@z#9@#@#@$@$@$@b$@f$@#:@#@#ѯ@#̯@7$@$@@$@ => Gw@  # l~7 ~w xB   lN k7 hd^X`k7$ L`;&a$,a$4<$8<$ NL`;NRuX^$`^$ff$lf$rf$xf$|~zv5W,w0@   ld *7 7 7 X^$ ^$^$^$@ @L`;dDuJ#P#9X#^#9d#j#9r#x# 7 7 WS7 P-az }7 t--5  t# #ѯ#ѯ#̯#̯$e$,$2$8$B$H$N$T#9\#9f^$@ lL`;t|ux)`~e$t%y--5  %7 ^W,wVRB w, w --X `$#9#9"^$@ (L`;0|u4)`:e$@`$P$X$be$@je$@ze$@΀zw4@   '& !w ~00!_$D_$Lf$Rf$ xL`;v|ud     f` eeJf&f` %F$@$$$@ $&$,$07$ ZL`;b{S|{S}v E  6B  W W d   6! ^@ `B af L|u@f;$~2\af w` 9&f %w *w $ff %7 BdD,2(7$4#0a:e$D$H$Pb$Tb$bu@l#:r#:* f& Ν e e$|u@$@$@uL`;r (`Tz  ,4<4< ,4:HNV &,j$@$@@$@$@$@$@@u@#0a@k@{S@L`;G8u@hU>XNXa>XL L`; linesNoneUpper Lower general  exact$&wps:-*case insensitivediacriticical insensitive T begin \ end bunbounded lUnknown$ tVT52VT100Ԁ~Hardcopy, scroll, noscroll, eightbit, noeightbit, edit, noeditV3.10-00 COPYRIGHT DIGITAL EQUIPMENT CORPO]RATION 1980 & 1984 COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1980 & 1984nonumbersS5TnoverifynotruncatenokeypadnowrapChangeLinenoquiet notab tab size ; tab level norepeatnofnfe nosummary summaryWnodelimiter delimiter nowps wps Help file name: autorepeatnoautorepeatInput File: eOutput File: z)fr@:@u@@|u@u@):2@)@)@u@{u@@yu@@{u@:W@$@T`:@z#1@#@#1@#@8$@$@6$@@<$@?$@;$@^$@;$@_$@`$@a$@zc$@@f$@d$@f$@e$@@e$@e$@@g$@7$@g$@$@$@#9@#@$@z$@$@_$@_$@@#1@#@#@#ѯ@#̯@#:@f$@$@b$@7$@_$@$**Readonly** Gw @   l0 w(  = e%& $  e& "* Ti 7$ L`;0"u*6$@27$B):2R)Z):2 dL`;j|ux):2 |L`;|  e   lj   %w*  lp  &l) )fr<$ &L`;j*u 0L`; :L`; @) JL`;T^$ `L`;pdu jL`; tL`; ~L`;& *: %5T\ b dd  lz ll L`;* L`;:)&f$ ,L`;T 6L`;\>)Bf$ HL`;bP) VL`;d`#9 lL`;zpu vL`;ltt x~ %5 5  5 t L`;t L`;x L`;~ )(# .L`; 8L`;@)F#ѯ LL`; VL`;^)d#̯ jL`; tL`;|)e 5 > ew"A @ &f{5 5>& X)fr L`;)#ѯ "L`; (L`; 0)4)frF;$V$\yu@l7$tul3&a % #@ 7 e C  %m7    C |& w  J7${u@*_$>_$B{uH_$L#R)frX):2nuxe$@|): YV J 00!vATADATADATA%Lb T %VS \ %^y f v):2 e$#a$ L`;J&) ,L`;L6$ p N >pLz|u@@u@u@u@u@u@u@7$@$@a$@f$@@$@$@f$@;$@@ Gwe 7 6  6 v`v V-R -D@m6 >5:552f Pk;$@;$@a$*;$@:a$Da$Nf$@Z^$r$vf$@z^$~u|e %f % c    m%5& N 5"-r Ju&^$,a$0u4$8f$DuNa$Rf$@bura$~|u@> W! p 5 %e,a$$a$ u$7$.^$@4u:^$@^$@^$@@^$@k@G82uhTU>Ƙ Nx>ƘL L`;z|u@)fr@u@|u@@u@u@u@u@u@vu@@$@@_$@@7$@$@;$@@ substitution Gw   er  7   15-5*5'- Pj7$d$ 7$$$(#0a,7$4uR^$\uf^$x;$@z$ڀ|5 5& 5    %   d  a   aVuvu@ u.7$2$6#0aD=$JuV|u@Z_$@d$@n{Sr^$ ~L`;2 e  e e& |u)fr$7$"#0a&ujd$@$@$@7$@^$@^$@=$@#0a@j@{S@L`;G8&uhZU>H N>HL Gff  7 - 5&  % d J 7$u^$ u$;$@&$,^$<7$DuH^$Nu^|u@bu@u@u@u@|u@@7$@;$@@$@7$@^$@G8bu@hU>Ƙ!N>ƘLz{u@u@u@u@u@u@u@g$@d$@$@7$@$@$@a$@$@ Gw00!89Nd>8Lzu@vu@@u@u@u@u@^$@@d$@7$@$@7$@$@^$@@=$@d$@ Gw   w0 5 5 @ 5    bh 7$d$$#0a"7$*u2^$@8uDuPvu@^uf=$ld$ruv^$@D|  e  F8$ 7$$7$#0au(7$6u:u2#0a@u@h@G8uhuh U>ưNe;>ưL L`;z$@$@$@$@$@$@$@$@u@@u@u@vu@@u@vu@@):2@z|u@)fr@|u@@u@u@{u@:W@#@#1@#@@4{;@a$@8$@^$@@z#@#1@d$@$@T`:@7$@:q@$@@$@$@)@_$@)0@f$@$@  line Gw06 $6 6 ,6 (   F eUC6  D    D=8k"d$*7$.$2#0a:uH7$j#1n#尀|>  6 5 5 k 6 ea a  e / Wp DT`:$|u@#1#(^$@D$@R{S\$`wun|u@΀aa m% e a a  ewd Wq vaa m,u($@6{S@$DwuR|u@|uԀt% e D6  62.2a,a 5w $.$J$P$lvu@΀"a 6 7  w^-5wR 5aS  a TCeV$@{Su(;$@*$2wu& >$BwuN:qT:q\:qd:qvu|:q % wmW 6 046 ((,e,,a6a 5  ( * , 2:q*:q4;$@:;$@F$Xvu@f~;$@΀d6`ew5<a& 5@a  ew5$ae& e ,$(vu@>{uH|u@j7$t{!-  U@5 <a&  65-  & - 5n7$|u@^$@ ^$@&u*$8vu@J#L4{;R4{;Vu@Za$`uf$n$r|u@x$~f$d\  (a % @a eN6a e e04:W):2 L`;"|u&)fr<{uR{uL`;MAIN G5 6  a 7eew`ɋɕ &&   eF # L`;"|u4^$BhF7$J7$h7$p$v#0azuz;$@@7$@^$@@$@@=$@$@#0a@wu@ @|u@^$@#@u@k@h@82{!@{S@L`; G8:zu@huhU>ưN_>ưL L`;zu@@u@wu@yu@yu@yu@u@zu@@{u00!vATADATADATA@)fr@|u@@u@~u@u@yu@@zu@u@u@u@@u@u@@u@@u@u@u@@u@u@u@?$@@#@"P@ Gf 7 EE@ @<` w77 7 E  l zX 7$u7$ $@$$@ 2L`;F|u@P$@V^$@\^$@`^$d7$ xL`;|u| } } } y    D j g c ` ]Հ ^$ )fruyuu"u@&u,u0u8d$@7$D$H#0aL7$TuZu`zu@fyu@nut~u|^$@΀W T &&  A >   7 e& &  hu u@u@7$$u*$0u@6u>d$F7$J$N#0aR7$Zub?$@puzyu`t     &  55@57 ^^$@ u@u@u{u"yu(7$0u8wu>^$F^$@N^$T#Z^$L`;8,`6tfZz0 z$@^$@7$@^$@d$@7$@$@^$@@$@@u@#0a@L`;NG8u@huhU>XN_>XL G  u@u"u@@u@G8=MYhdU>pNq>pLz):2@{u@{u@|u@)fr@u@<$@a$@;$@@$@^$@@$@@;$@#@_$@ Gw -& R5  5 e  "e 1   l \k u;$@$|u$a$*{u0;$@6^$@<$@R;$@b<$ nL`;ruz;$P| mf `7   ' N % # :;$_$ {u&#,)fr8):2>):2J)frL`; *u@k@L`;G8uhfU>pkQ>pL Gw & aa %  eV A w  w\j 6$7$,,2>{SL|u@R7$X7$\u@`7$duh9$n9$v#Y|9$z#Y@u@u@@,2@2@|u@@=$@7$@=$@@$@9$@6$@7$@j@{S@^| a a e!-!eJ6$7${S*287$:6$B=$F$H6$L$N7$T$G8uhuhU>ƘqQW>ƘL L`;z$@$@$@$@@$@@$@$@$@$@$@$@vu@@zu@u@~u@zu@{u@u@|u@@u@d$@7$@#1@#@$@$@$@$@@^$@#1@z#@#@?$@@?$@#1@#@_$@#1@#@:'@T`:@`$@@6$@$@7$@ .JOU; Gw-CDwv7  f =5R Cw:5  \hd$d$&^$*~u:T`:<$D_$N|u@Vd$ bL`;l#r#1x#~$@|aa 5!na e (= aa e5 = n a J$vu@,{u6T`:8$>#1D#J$N$^vu@nT`:p$ڀ%y=g & Ν& Ν 5& Ν& Ν e && Ν 5 ~{u?$@T`:$@# $&$*$0$4u@$F$J$@P$@Tu`#1f$@l$@puԀt -5$ !=5we& & & &  e\zu=$ |u@$$&6$*$,7$2$8?$>T`:@$F#1L#T:'tuԀ(P l-5R00!?$@J|u@R`$@X#bzun=$4l -  Cee.u ?$@uzuu$d$L`; >&*=$@h@L`; G8uhU>ƨQ`>ƨL G u ~u"~u@u@G8 xuhU>Q62>L G& - %7 ,`$ ;$@$$a$u"`$Bu@`$@;$@@$@$@a$@G8"u@hU>Qfa>L G" -  u@ ;$@ $u~u:u@@~u@u@;$@@$@G8xu@h~U>Ql">L G^  7 77` ee 7 e7 vu ;$@$a$a$a$"a$,$0#0a8a$:8$@>$@8$@F8$@J7$P8$T$V8$Z`$bu@`$@7$@$@8$@8$@@a$@$@;$@@#0a@G8Z~uhU>ƨQD >ƨL G*-   &8$$xu@8$@8$8$2xu@@$@8$@8$@@G8&xuhUzQD:@s@z #@,0p!@k@#@#@#1@#1@-0@:%@T`:@Z@# @#@#1@#@#1@ Q0zG,hQ<t Qw ¥ ¥ ¥/0¥  ¥ (¥ %¥/"¥ P e wf Lk -0s-0 RQ<Z-0^,0p!f:%rz #v-0|,0p!|% ~7 7 7 7 7 "ԇ7¥=H¥,¥ m7 7 w . 7U¥=&¥n ,0p!T`:## #$#.#12#H#1J#1N#1R#T#X#j#1n#vT`: N7 7 7 7 E UUwh U  n'7¥,¥ w: z #1 #1#1####1 #1$#1(#*#.#4T`:8#@T`:HT`:P#XT`:f#1j#尀t L7¥  Uw %w H %w¥ ¥  4¥/  f¥/,¥< #1##"T`: *Q<2:<# BQ<HJ: )¥ &¥ #¥=  ¥,¥( ¥) ¥[ ¥] ¥< ¥>  7 % D &¥ `Q<7h:l  ¥ ¥/  p¥-¥N `¥O T¥J¥C D¥O(@¥R 2¥EK¥O[  |Q< %[  EUb  EUUEh r E J: Q<[&T`:0T`: 8Q<bLT`:RT`:\T`:bT`: jQ<h~T`:dU m L UEs & UUEE¥ ¥ ¥/¥ < T`: Q<m(T`:2T`: :Q<sNT`:TT`:^T`:dT`::¥=¥: ¥,  ¤  B  Q<x EDT>Invalid option switchSyntax error on command lineInvalid file nameNo input file namedJOURNALOMMANDREATEECOVEROU>ƨQ`9>ƨL G- 8$8$@xu@8$*xu@@8$@8$@@G8xuhU>ƨQ@`>ƨL G u@ ~u"~u@u@@G8 xuhU>ƨQd>ƨL G   u@ u~u*u@@~u@u@G8xu@hrU>XRX>XL:,":H4,"aH8,"H:,"ZHU,"Hj,"sH,"HU00!vATADATADATA>ƨRv>ƨL G    ?$@u@|u@*u@@|u@@?$@@G8#K"hU>ƀR{>ƀL Gf  @ #K"ƘYd>ƘL G<-  - < D8$:u|u@8$:"u*u.:W2)fr6:""Zu@:@)@|u@@:""@u@)fr@:W@8$@G88{uhU>p=d|>pL G<=  aa ee  T`: $$ $0vu@:vu@@T`:@$@$@$@G88uhU>ff>L GBf W  p  2c$;$@;$;$"u@&6$*;$@2b$Bu@@6$@;$@@b$@;$@c$@G8>uhU>fc">L G<-! E7 786$7$;$@6$6$&;$,;$@2;$@8;$@26$@7$@;$@;$@@G88u@hU>ft">Lzu@@>$@6$@7$@;$@@9$@b$@$@b$@9$@b$@c$@b$@@;$@$@@ Gtw- -   7 W 04W 91  |h9$9$b$b$;$@";$@*u@06$29$69$$Vc$\9$`9$d6$f7$lu@r9$x;$Ԁh?- 7> 7  ҁ   `& e 7 t9$ ;$@u@6$9$b$"b$*c$09$46$87$P7$^#0ab7$j6$p6$t9$xb$|b$, W ! 7 e,u@u@u@6$9$ b$$b$B$@ @ ,@#0a@h@{S@G8 uhZU>fy>L L`;aCHANGEBCOPYcDEFINEaDELETEBEXITAFIND;FORAHELPsINCLUDEaINSERT1KEYaKEYPADNOKEYPADAMOVEQPRINTDQUITqREPLACERESEQUENCE2SETBSHOW~|SUBSTITUTEATYPERWRITEaVERIFY#*TOLTHRU-,ANEXT;AND+=.jBUFFER9ENDYBEGINILAST9ALL:IRESTkBEFOREYWHOLE/QQUERYQBRIEFSEQUENCEDUPLICATEcNOTYPEBSAVEBSTAYrNUMBERSNONUMBERSBCASEREXACTbSEARCHqGENERALrBOUNDEDUNBOUNDEDTERMINALQUPPERQLOWERANONEDrVT52UVT100DHCPYaCURSORAGOLDsCONTROL"ASNOVERIFYTRUNCATENOTRUNCATErVERSIONAWRAPAWORDcNOWRAPbSCREENQLINESAMODEQMACRObENTITYC~PAGESENTENCEPARAGRAPHRCLEARORIGINALQQUIETsNOQUIETaSELECT2TABSNOTABCFILLaADJUSTcDELETEcREPEATNOREPEAT3FNFUNOFNF3WPSrSUMhMARYNOSUMMARYaPROMPTDLINEfKEYPADNOKEYPADHCCHANGEfINSERTwINSERTNUQUERYCTEXT3ENDBPAGEBWORDDELIMITERNODELIMITERPARAGRAPH2WPSTNOWPSAUTOREPEATNOAUTOREPEATwCOMMANDRFILESDIACRITICALINSENSITIVE"CI"DIFUNCTIONfSCROLLNOSCROLLEIGHTBITNOEIGHTBITD_EDITfNOEDITl+)(?FV@<W61vd}:JAcS^ -+5. $wsh|UPG`[|v83Ml` -"Z!d`Mlfq0E= Gw  l~ 8- 40-  j`5ɵ CE CtE &&N`& Bi c$ L`;~u 8L`;j f> L Gw @`  ҃ -& N$fe%& e W# % p Ji c$b$9$;$06$@89$J{!fupb$x6$|u@|A  uru@u@@u@6$@6$@@b$@9$@b$@;$@c$@i@{!@G8uhU>ƨfZ>ƨL G@f f p e u$@#0a$@*u@$@@#0a@G8<uhU>Hf >HLz)fr@):2@)@u@u@@u@u@u@$@6$@7$@=$@@_$@@$@b$@ Gf7  7 & ׯ; ׯ!=    zb$c$6$9$u@u b$$u.u89$:6$>6$F6$L6$\b$bb$jb$n_$@t$~):2Z| % ^  ! \$ =$@))fr9$$&):24):28)frƀf >ƀL Gf  @uu"u@u@G8+dQhU>f >L L`;#RO@NM6QH KZY ]\UT1S5W4VX -q,/k3O*O29'('`|.`(`'1`&*`j/$ "y#%$` _[a( '| orlt3m1;-9+?,.)2# 2#! nJL^I`he4'($%&./* /if576@A?" . 1" 0`  , b  "  31"- +,)2F#*+d0 )` ,t`&*)0! +` -` 9` 8` ;` :` 4` 3`  ,4'($%&.#/*#c 6L 5g 7>`&;`:>78&N=`E=<GsJ:8P  D6`;0`%87")9) % $ 'J & J?32{ "!z~uA}:vxw #" (%+% <"+`hl1;90c*A4CbHu rNLQ#U27;%JS'  Gw eğuEŸE    l  % ۇ^ &h Sfk9$ L`;9$9$$9$,9$69$:9$ HL`;LuT9$Xud9$ lL`;hz9$| 7h    5.   & Ο E 7heCe l L`;h 9$uu 9$(9$0u>9$B9$N9$Ru\9$ jL`;hl9$ pL`;r9$|9$,B f %    uuL`;4@^lJu@u@u@9$@u@k@L`;G8 uhU>f@>L GLf -te& f e@ &c$ c$b$c$$$2{&2b$@$@c$@{&@G8HuhU>(fZ!>(Lzu@u@u@@u@u@$@@6$@7$@$@$@;$@@b$@$@@9$@>$@zb$@b$@$@b$@9$@b$@c$@$@c$@b$@@$@;$@g$@u@wu@ Gw  ;w l  7 f 7% ~W W _[ 7% i-Jj L`;$b$@*u.>$2b$8c$HuLb$db$@ruv$@΀|xew0k&e V%lZ g 8% ^7= bwrJc$$$@:b$>uX$@\9$bb$h$nut$x$@΀ MI % ,00!!vATADATADATAp1 - wuwJ$@ b$9$*$@@$@Lc$Vb$\b$b9$pb$vb$z$@΀t vw  wu %  ׯ.1'60\u&$,$6$@:$B$F$@JwuT$X$^ b9$n;$@r;$Ԁ6 6 WpeNa a  a e  w& 7% 07D$, 6$< ,Du@LuZu^$h$@p$z$@΀l%!@1 w-5j g5 7 & % Mp-b$@ $@ $$ $@&$@.$0$@>b$Jb$@PuXb$@^ubb$@luxb$ԀA `1  7    7 d!1 ҄ 7  1q7 >c$b$9$.7$F7$Nb$`7$t6$x6$|u@d r oo5 7 w  5$-   W W W /W "Pub$b$@$u(b$@0b$49$:9$<6$J6$L7$R6$V6$W 'CC wp w2 -!-;B r5nwH\;$@b$6$2b$69$<9$>6$Bu@F;$@N;$@Vb$\6$jc$rb$zb$\ & % 1 vt<pP| fe  & e e]>b$u b$$D$Jb$N$X>$^b$b$zb$~$Tpe W   wsw pe-4W0W -W *W W $W 6$$&b$2b$B9$Fb$Tb$\;$Ԁwj @pe- W W W W u @p- W W 29$b$$b$Jb$R9$Zb$bb$|b$ԀLpe W cwpeW W T P z fe fe R$b$ $4$:$Bb$F9$Pb$Xb$d$n{Sv$1e e\ ׯ- -O    wpW :   -Z{Sb$$@&9$0u4c$>b$D$N$T$\g$hb$nb$|ulDb)h%!., t *7  eRb$b$b$ b$(b$0b$8b$@b$Hb$Pb$V>$\b$L`;|6&pvDtn\~J&FpdXFxjZR>NV^<  p^.DVvf>(b.: @ ,@j@{S@L`;xG8uhU>p`X>L Gw W @  l A5 @l& f-a-\ Y5$5 7 -\kd$$@ &L`;*u2d$@uL;$@N$V;$@X$ld$ruxd$~;$@΀|H5 5 7   % 2 (-)W D e B&f e\$d$ud$";$@($,wu6$@@;$@B$VuZ;$@d;$@v^$zu      d$L`;zu@u@u@$@@$@d$@d$@d$@f$@@$@;$@@^$@wu@u@k@.T"",,TL`;*G8uh U>ƈps>ƈLz|u@@u@^$@@}u@|u@u@u@u@u@u@u@@u@@>$@@$@:$@@z$@9$@@7$@$@d$@d$@d$@$@$@$@@$@:$@;$@@u@00!$@ 7 w5   %wh   - 7 es f   N`h|u@ d$$@d$ 7$$$(#0a8Iq@>8L Gw6 & 6 6 5 aa 5i > "dW  f& &e SW2i#$u($,$uB=$HuT=$X#0af<$j#0an=$tux=$>  -0u eeewe&u<$u<$u =$z$@$@vu@@<$@<$@@=$@<$@=$@#@u@#0a@i@{S@G82u@h U>pb4s>pDs@k@T; z@uL`;@ 4s08DsRh`|rRh  4sYYwe@ABeE D` bl lrwe@A f Bkfk| eE&s   s-  CslB  e@% duL`;pvszT; zD ?,e f@ e&uL`;$4uL`;8uL`;U>ƀzs9>ƀD:.@9y@:a @: @ $a  78h}} hyxh|}hc}xh,hzc}-h`ht h4xh%8why}Xh9dhwh %`9h#-h!hxh xh0y` h]}-hxJwc}hpxh-h.hp-hHvph 0Kh2` h $a   p  p p p6:a 9y$: (<: @T: Xl: p|    p7::   : $8: <J:.P: Th: l,A@@RTU00!vATADATADATAU>zs:>D}} @78@P@y@z #@:.@9y@yx@`@,"@k@|}@z:a @c}x@,@̐y:@c}-@y;"@@t @4x@XS[N@%8w@yxK@y}X@#:@#@z#@#̯@#ѯ@yp@w@9d@yc}@%`9@X@:@#-@!@$9@x@#@zx@#@#@#9@#@y` @lE@: @#K"@]}-@px@wc}@-@.@p-@zhp!@uL`;@vp@zL @2` @0K@ #e^0:`h:sh:`^0:y:h:^ah:^hj #e^we 7 7 7 7 7 7 & 5wF= fpk#9#ѯ##̯ #$#:*#.t 8z #<NX.`-h: n0Kp#t78|? w@ e 55   %TuL`;78&78(#.6<#-D9d`|}fy}Xn#9v#9~#9x .׭׭##:#9#$#9*#.%`90#ѯ8#<}} >#̯B]}-J: L$9RXS[NX#^p-d2` fypj2` t#`l7 we   px %8w y;",yxK!yx": *#.#4k>y;"@wDyxKFxJyLvpPxVXS[N^yp:& & & & & & & & & Ε (y`  yp y` px0::`^we we #   !  *& we  hkXk P*hp!0lE@̐y:H,"L#K"Rz #^,"b#K"h#K"lz #pkzP~`| LU~zsw~~Dz #@k@)@ ~rH ~sH:s@:s@:s@2I@2I@#@:@z)0@zL @:@ $a &XS[Nhyphyc}h: h0|L #e^0:hB:h9yh:8,hB:ph:%h:-}h:;}h:Kqh:hL h $a * p"9"0|L$ #e^& && & &&& & Ε     $& & &  &&& & Ε6 $a ,:s6$a >$a T$a $ n$a |:| & & & & &&& & Ε & & & & & & Ε >L $a .:<$a  L$a  R$a `:s l$a r$a x$a f& & & & f& & Ε & & & &&& & Ε -T))0)0)()0 .$a <: J0|L Z$a h:st$a z$a t7  we &Ý##B & & & & & & Ε  `ʝ  \2I $a  2I2Ik $a ($a # J$a X:s b$a l$a |zL $s swe #kU>ưv|>ưL L`; .JOU; Gf5 6 6 =$ a& 5 la e=7 \#u $L`;,T`:.$4#1:#@$D$Pvu@f{uj:%tT`:v$|#1z{u@:%@vu@@$@T`:@#1@#@g$@#@$@$@$@u@L`;G8||& & 5 la aa  na e7 7 eP# $$vu@.{u2:%8$<$Lvu@`{ud:%n#rg$ uhU>Jwo>L L`;FaG` G:-  00!Jw >L GPwe-fe %N e  Jh$#9$ >$$$(u2$6:$:uFuLu@bu@u@u@@>$@$@$@:$@#9@$@h@G8LuhU>pJw%>pL Gw)6   w 451 D& 6mm m5  e- ` 8k$8$,{u:#>f$N$^f$x{ur|%5 - D& 6mm  e%  @  >%8 $8$8$@&{u4#8f$Df$Vf$Z#R{u@f$@#@$@$@8$@8$@@k@G8u@hU>Jw>L Gw -  7  -5  7%     7 bjuc$@c$$_$,<$2#8c$@#LuP_$^c$dc$@jc$@xu|c$Ȁ|w D A  4-   ( -[    A Vc$ c$@c$@ u$c$@*#94c$@8{HuL#9Xu\c$@p)~)B w B @ C @  1-f  & -[ @ N D V uc$@c$c$ c$@2u6c$<#9H{Xu\#9hulc$x)>tB  C w w f %7,)uc$$c$@*c$4u:_$zu@u@)@<$@c$@@c$@#9@#@_$@#@u@j@{@G8uh U>Jw>L GN- & e  - - %P:$7$u7$ $$wu.$2$6$<$@$H$:u@$@7$@:$@wu@G8JuhU>ƨJw)!>ƨL L`; K G.   %#9 L`; L`;(|u*|u@#9@L`;G8*uhU>Jw;">L L`;J Gw 7 f& -- 7 % -  lh >$e$a$a$&u*#9 2L`;<#9 DL`;L|uVe$^e$@d#9r#xu |L`;*| e f& % B |uuuju@u@|u@>$@e$@@a$@#9@e$@#@h@L`; G8uhU>HJw &>HL Gw     -[  %- Y Ne e - N ; Jiuu_$&u*#96uB#9NuXud#9t)&| H w &u )uc$@c$ _$Ru@)@c$@@c$@#9@_$@u@i@G8uhU>`Jw'>`L Gw  ---w wA a 5| zae   l Vj7$:$7$;$@ $&8$(7$@27$@H$R{Sf7$nwu |L`;|e@     AK  A @ D! D!1 D A up( D  A  @  - -  A e  @euL`; :z8$@$@;$@@7$@@7$@7$@$@:$@wu@u@j@{S@L`;G8du@h~U00!vATADATADATA>Jwy:>L L`;=>\<[?6l)0'\L`;$F|uNuRu XL`;8`|uf#ju@p$ve$@zuzu@u@|u@:;}@u@@u@#@#ѯ@e$@@`$@#9@d$@@$@#@u@,| 5 7 e(u `$ L`; L`; |u$d$@L`;:G8uhU>Jw:>L Gw -He a (        ^h :$7$7$$ wu&8$*$4u@>;$B7$`uh7$x$~$*| %     e $$$ $ju@u@@8$@$@$@7$@:$@7$@;$@wu@h@G8uhU>ƀJw}:>ƀL L`; G % L`;|u_$*|u@_$@L`;G8u@h U>JwQ>L GDf7  -& Οf @`w % w%>$ 8$>$@8$@8$8$${u,>$68$:>$@B{u@>$@>$@@$@8$@8$@@G8@uh&U>JwS>L GXf-   - -     D a$ua$ a$&u.;$@0$6u:a$DuHa$Bu@u@a$@;$@@$@u@G8TuhU>ƨJwX>ƨL G0f7 w & N m7%,$ >$8$>${u">$&>$2{u@>$@$@8$@G8,uhU>HJw,X>HL Gxw CB- w 0 -7 -7 -7 -7  w bi8$8$ 8$&8$07$@67$@::$@:$D6$J6$N7$T7$f8$p8$ta$ba$@6$@7$@@:$@7$@8$@8$@8$@u@i@G8tuhU>xJwX>xLz|u@@,2@{u@u@a$@8$@;$@@$@7$@7$@@8$@8$@7$@$@f$@ Gw6  6 &5 w- A  5 C  L  kna$r8$|aa % V wZwB` ww   @pw CJ swM>,2e$"|u@68$B8$H8$L8$\8$f8$|8$Ȁf 1 5Qm 6 e" $m   66 +*$0#4f$Df$t %m    m 6 66 %    6  w w4- &{u&{uf7$l7$x;$@z$ڀw ew7 7 6  -n*v" '-7  ef 5\7$@i8$"7$(:$48$<8$Da$R7$X7$`$d$h{Sne$xu(l  v" 8$ 8$b#@7$@$@$@e$@u@:$@k@i@{S@G8uhU>ƨJwY>ƨL L`; G  7 %d$@ L`;|ud$@*|u@d$@@L`;G8u@h|U>ƨJwY>ƨL G&  % uu@G8uhU> JwOq> L L`;[ G00!)F):2N)V):2Zc$@^c$b$h<$j):2@)@|u@u@$@<$@#@#9@c$@c$@@L`;G8luhU>JwTq>L G.e - %7$wu"7$@wu@G8*uhU>XJwUq>XL L`; G 7 % L`;|u_$*|u@_$@L`;G8uhU>HJw[q>HL L`;> Gh--)5 %   &  e^#9#9`$ L`;&|u,u0u@4_$:uBuLu PL`;X|u\)``:-}r|u@)`@:-}@u@u@@u@u@u@#9@`$@_$@L`;G8duhU>ƨJw^q>ƨL L`; G(-   % #9d$@ L`;|u"d$@2|u@d$@@#9@L`;G8$uh,U>ƐJwir>ƐLz):2@{u@u@u@u@@u@u@u@|u@)`@u@7$@@>$@:$@@f$@ Gw  w &  5 W 1 %w. m  B @   Jk_$u7$@">$(u,u@2|uFu`#ff$|;$@΀| 6 me7 5& 6 % E 0 - -& e!  > ;$@;$@"_$*_$.{uX_$^_$jf$l_$r_$ `  ! !~, )  -  ! \ u_$8_$>f$@_$D>$H_$Lf$PuV:$@X7$`;$@junuv):2t  %v6 j -b 6 [- & -05   %5Ju0_$D:$@F7$N;$@Xu^_$`f$l>$p_$tf$xu - ?  -  & `  ! !~& 6 % ^ _$))0_$)`"_$&)*).#4c$:c$B):2J_$l_$p{ula 6 Z- ) -#-- 5   %& +5-J$_$*_$,f$2:$@47$:;$@DuP>$T_$Xf$\uf):2& % -  5- & % @h>$_$ f$uu #&_$0):26>$:#@uDub>$f_$jf$tuzu.d B  11 eb#@;$@@_$@7$@)@)0@c$@_$@u@k@G8uh#U>0Jwą>0L L`;  4zu@u@|u@u@@)`@u@@u@u@@u@u@u@u@u@@u@@u@z{u@6$@9$@$@e$@7$@@e$@a$@$@7$@7$@8$@;$@@$@:$@z8$@:$@$@>$@>$@$@>$@>$@@a$@:$@$@:$@@$@@7$@e$@@ze$@@e$@#9@8$@#@d$@8$@$@a$@<$@$@@;$@d$@@a$@wu@IM G|w$ - 7 e 55  aa  -kd$@:$@7$u@ a$$8$&>$*$,>$47$<$@{SDu@J$R;$X{uju@n>$te$z:$x -  7 7 6  5  a 7    00!vATADATADATAb7$ e$@d$u >$$u(<$8e$F8$J$Tu@X7$^:$d7$r;$|$& e -  6 -& e  6 5 P${!:$7$*$.$2wu$H{SL$P$Z d>$h7$t$~{S6 $a.a 52 . . (a M  f> >$7$$" LuP:$T$^u@r:$v$Ȁh& Nf6f-5N EN N @ @& f @& @ & B:$F$^:$b$~u@e e 5 l5e-a-] f N NV u*:$@,7$2#9:>$>>$H7$L7$P7$^7$h7$l7$p7$~7$`E&6f(C f N C N f & e 5 8587$7$"7$07$B7$F7$J7$X7$ju@&  #5! &  e &  e  5> 8$8$u@2:$88$Hu@P6$^8$lu@t:$X n    l .          ( 7$ L`;$uH7$T7$|7$Ԁ    5 %5     6  5 5c5  7$*$@2:$`:$P_ \   v      ! -  7&  e&d$:$J:$P:$^:$tu@   55N   r  5 5w5 w  66 6 6$,{2e$@ld$H7  5d55 a 5 C5-5 & a 5 :$ >$,uJu`u  &   e %5    5v5Q - 4>uu u@*u@uHuRup>$t>$ve$@@ - 7    e& Ο 6   %  D7$@ >$<$u"u*u0;$@:;$@>uTu`u  5w55   5w:66 5 7 7 >8e$@$P<$X6$h8$n8$r8$x8$|8$|87 7 7 7 7    e 5 e& Ο  (a 78$:$ 7$6$7$@a$ u(u,7$.:$67$>$B{SP;$@Z;$@^ub8$d7$h$n>$xu@΀ %55w 6    -754 "   e& Ο 6 6` -J7$ 7$7$(7$6e$@NuVu\;$@f;$@juz;$@|$ڀ, %      @!,5)   e& Ο 6>8$7$@7$@47$$hule$@n>$r>$xu  7 ;  6  & - 57  7   xu #u:$:$6$$:$>uB#9 JL`; PL`;X|u^#da$he$@j>$nur>$xu   ew555D7 -& $   Juu:$6$6$&:$,$@X>$\>$^e$@ruzuz       - 7 7 7 u6$7$>$">$8u@uD>$F<$LuP>$R<$X$@^:$be$f;$j7$l7$pd$t:$@v9$>z   ee2L>$>$u>$@>$&u*)`.>$08$4$68$L`;60MIM Gw m r     7\-- } 5#Jk:$e$@e$JuN:$T7$@V6$\>$f:$v#|>$ڀ0  N -& f  &   w r-  N  4&& L7$@6$$u,u 0L`;8|u>uF<$P>$Xu\6$z:$& e(& & - 7  w&  e y w5/ -r u@u#9 &L`; ,L`;4|u8a$<>$@e$@B>$FuJ>$P8$^u@l:$r#xe$@~>$ڀ()5&  &   &   7 r-$&  r #̯e$@u>$ u $L`;.>$2e$@6u:e$@Bu FL`;N|uTuZ<$d>$xu@|>$f &  7  w% &  7 7e %fa$ u L`;|ua$ <$$e$@&>$*u.>$88$Fu@L6$R7$@Z6$L`;  MIM Gw  f&  & e m r _-[5 &  \ju.u@2>$8u$`<$be$@j#p>$v>$|u&  #7  w &  &   e&  7r>$ u L`;|u a$&e$@(>$,u0>$4a$L`; F|uNe$@RuV>$\u `L`;$h|uv<$z(& & -&( 7  w&  % &  % - r u#9 L`;& L`;(&|u*a$.>$2e$@4>$8u<>$@:$Pu@Z8$hu@n6$te$@z<$*&& & e eu@6$6$<$|6R r @u@u@#̯@u@k@j@{@{!@{S@L`;*G8uhuhU>ƀMwd>ƀL 00!vATADATADATAG u u"u@u@G8 MwdhU>ƀMwd>ƀL G u u"u@u@G8 Mwdh(U>Jw,>L L`;[?3l[?3h G@--P 7 7 %4#9 L`; L`;$|u()`,c$0c$@8#J)`@|u@#@#9@c$@c$@@L`;G8<u@hU~Jw~L Gw  5k i B`ʵ,  l Ev LEʵf   A2k 4L`;8uVuZ8$`ud8$jut|C`v   6   C` v     6  ˕v  5A L`;Bu@8$@8$@u@k@L`;G8u@hHU> w%> L Gw6 6 >5hv aa 5 5a {& & >h(=$8$<$@Lvu@Z:'j{ur$v$@~vu@΀|5 a epe5* & & 5 a e N7  eP{u(=$.#14#:$>$Fvu@\{uf=$j#p#t#1x2 7 7 6v aa  $a $$f %V eeJ ##1$"$2vu@B#1F,2R#\#1`#0al|u@x=$z2@,2@|u@@vu@@{u@#1@#@=$@:'@$@@$@$@$@#0a@h@t eG8uhLU>ƀys>ƀL Gzu@zG,@z #@#@#1@#1@#@#@#1@#@#1@#@T`:@{|@G8267 7 7 7 7 7  & w@# ###T`:T`:zG,"u(z #4{| :h*G*lU> i~o> L L`;[?8h[?8l Gf l -- 5 %7 - 5 %\ L`; #9`$"#: (L`;0|u6`$<#9D`$L#: RL`;Z|ub`$L`;  ,:|u@#9@#:@`$@L`;G8buhU>ưk~:2>ưLzwu@u@@)`@|u@:8,@u@u@#@`$@2I@2I@:$@@g$@$@g$@@ Gtf5+- -  % \e  1 D  #:$@g$@wu :$@"g$@(:$@.$2g$6u@@g$Bg$@F$Hg$@L$N:$@T:$@X:$@dg$j2Ip2Ip1#& e5ȋ `&  %f f W"W"W" ^2I 2I2I2I#0a(`$.$4$F|uJ)`R:8,Zu``$@xu|)` B$@$@`$@g$@`$@@#0a@G8uhU>k~M>L G-0u -0u  T$-  5 5/ 7 7 %# Ch <$u<$@u,g$4u8g$>uBg$J`$@PuV`$@\$`g$duhg$l`$@B|a a  a e  e&<$#0a<$@"#0a0u:uRu@$@g$@<$@<$@@`$@@u@#0a@G8uh~U>l~%!>L L`;K Gn-     l %    l  % `g$#9 L`; $L`; .L`;6|u m~> L G`f 5  %W ^ e@ f  Jg$`$a$a$"g$&u:):2>g$J):2N)`Rg$Xg$J):2@)`@u@`$@a$@g$@g$@G8\uhU>t~u:>L Gw)!P W  1& +W W W a --D >(W  j6uTuvg$~zuP|" Rf a  %"$uvu@&=$2ujzu@vu@@u@u@u@u@$@g$@g$@=$@j@G8uhU>{~ >L G&-T  g$ug$$"g$*u@$@g$@G8"uhU>|~>L G65  7 #2I2I:"2I2:@#@2I@2I@G82uhU>ƨ E>ƨL Glw a % $ 5  B  B ef e  h{u@Vu*u@{u@@h@G8huhU> ΃y}> L G,w   @  h;$";$@h@G8(hpU> >L L`;  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{||}~AAAAAACEEEEIIIINOOOOOOUUUUYAAAAAACEEEEIIIINOOOOO׀OUUUUY  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRStTUVWXYZ{|}~π  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkllmnopqrstuvwxyz{|}~AAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuy Gw   l w   j pe _& e PR  4j L`;u.u BL`; DL`;b{!~u| B  @԰ @Ԁ 5 /   " p     4;$ L`; L`;Bu VL`; XL`;ru p   L`; L`;L`;6V:;$@u@j@{!@L`; G8uhU>26>L Gb)a a e 7 0"&e e %,}u(7$*9$@07$B$@L{SPuB}u@u@$@@7$@9$@@{S@G8^|uhU>C>L Gw  % GE 5= 5 :e  fa e  Vku*vu@6u>;$@F7$L;$@Pf$@`$df$@h^$lux7$|f$@8|p`  B 5  u*=$rvu@@u@u@u@u@7$@=$@$@f$@@;$@@^$@k@G8}uhU>Z6>L Gw)& N$fe%& e v  Xe%aa % R$%N` &h 6$@0{!\,2z#0a~6$@΀|1 1  p~w 1 N` 1 1 1 N` N` 1 1"1#00!$vATADATADATAe> ,6$@($@2{SF$@P{SX$@b{S %J,2@6$@@$@@#0a@h@{!@{S@G8 }uhU> K> L G>fW @f we  $#0a"f$@*$@f$@@#0a@G8:uhU>K>L GFwW @ 5 N w%%  hu0$4#0a8f$:u@$@f$@#0a@h@G8BuhU> f> L Gw p ? 5  e7 zh7$$ $*u.$4;$:$<;$B$@J$@P$T$X$@\vud$@hul7$p$v;$"|7`7$;$@;$@$@z$@vu@u@u@$@@7$@$@$@;$@$@;$@@$@@h@G8uhfU>p`>pL Gzw0``   1 w7` 5  555eJh 7$${S(7$0u47$8;$D;$@H;$@LuXvu@f=$Zu@u@vu@@7$@;$@=$@;$@@h@{S@G8vuhU>ƨK>ƨL Gv    70 e 0 ehu@ ;$u;$$$$@(u@,;$2$87$<;$L$@T$@X7$`{Sd7$l$Zu@u@@7$@$@;$@$@$@@$@@{S@G8ruhU>S>L G2wBm @m  hh@G8.wuhU>HL`>HL Gw aa % 2 fe  f a a  5 eVh,2(;$@.;$@:#0a>7$B6$D7$HuRuh2l7$pu|yu|  %b,2@2@yu@u@u@7$@6$@;$@@#0a@h@G8xuhU>"!>L Gw@P   f  ppH  hh ;$u ;$$$*$,$2$@:7$FuJ;$T$@^7$j;$ruzu~;$*|m ,7$;$@;$;$@$@ 7$$$Zu@u@7$@;$@$@$@$@@;$@@h@G8uhU>,!>Lzu@u@u@u@7$@;$@;$@@$@@$@:$@$@$@e$@e$@@d$@ Gw/r5  - @`B` " "  1 eaPk ;$7$e$d$"e$@(d$0e$6u:7$^;$@l$@|;$~|B f& meW"    l  - - |#0a7$ ;$@$;$&;$@6uƨ(>ƨL G:5   Du;$$$@"u@&$($,6$.7$2u6zubu@zu@u@u@@7$@6$@$@;$@$@$@@G86yuhU>p)X>pL Gf& e w  a   a& e D00!, $@"{!2$8$B$H$jwux$ڀ 2a  aa a a fea e%eW a B{S${S $0 @wuP$Z{Sv$| ,zu@u@u@$@$@$@$@$@@$@ @wu@ @ ,@{!@{S@Ht   %a ee8$ $wu$"$&{S,$0$:uG8zuhU>ƨr:>ƨL G06, >`  TrTu~"Tu~"Tu~@Tr@G8,uhxU>pb">pL GZ & 7     d$u;$$$(|u@,)fr4z #:$>;$BuF;$H$@L$N$R$r$@u@|u@@)fr@vu@u@z #@$@@$@$@$@;$@G8VuhU>XX>XL Gw aa 5%M 1 1 waa 5e31 1 w 5,i,28TrN,2bTrnTrv*[EL|a a 5  3 3  e %,2(Tr4Tr2,2@Tr@*[E@i@G8̐y:hU>ƈZ>ƈLz|u@@u@u@u@u@$@@7$@;$@$@$@;$@@$@@$@:$@8$@ Gw  e % zw   l - 7   5 xju7$$@ wu2u @L`;DuJ:$L8$R:$X$^$b:$f$l$r$xe$~d$| -& %``   0a``   7w`eBl "2e$@ d$e$ u&7$^;$b;$@f;$@΀ f ? `  V Om&m `?t u;$7$7$$&;$6uB|u@J7$L;$@P;$R;$@V;$^7$b;$@h;$@l#0ap;$x;$@nte `   /  me  t;$@#0a7$$@$$$*$.;$27$BuH7$L7$P$V7$X;$@\;$^;$@L`; 2"b$@$@e$@@d$@e$@u@wu@#0a@j@L`;G8uhU>ƨ^>ƨL G&f  ~e  u@u"u@@u@G8"uhU>ƨ^>ƨL G6w  f  eN %hu u@.:::@u@u@@Tr@h@G82uhU>ƨW`>ƨL G,f a  euu"u@u@G8(uh&U>D^>L G\w   %@ l % %B %  4h;$@wu ,L`;0u>uVuL`; Bu@u@;$@@wu@h@L`;G8Xu@hU>2f>L G:w@  & & %,h 7$$ $&$0u4uBu@u@$@$@7$@h@G86uh8U>>L GN- 5  e 7 00!4vATADATADATAeX$$@$$$@"vu,$0$4$8$@j>L Gw0 "3& ? b C``C C" " 7mPi 7$;$ u$;$*7$.7$2$:7$>;$t;$@x;$z;$@ | Ju@7$@;$@$@$@;$@@i@G8uhU>k>L G:-& / m>7$ $u;$ 7$(u.7$0;$@4;$6;$@Bu@u@7$@;$@$@;$@@G86uhU>pn>pL Gw0 3" bHe7```   3"   &  Vi 7$;$;$@*;$@.;$@V^$\$^;$@dulur7$v7$z$|m 7$;$@ ;$;$@bu@u@7$@^$@;$@$@;$@@$@$@i@G8uhU>q>Lz$@$@$@|u@@vu@@u@u@e$@@7$@$@_$@$@@$@;$@@$@ Gf6 6  6"wt aa wP 7 a  - <@:q$7$2$6$Fvu@\$@f{Sp$x$<|$Ԁ| % ' aa ae e e& e = ;Z ,$$( 2$67$> ,J7$T$Z ,`$d7$lwuze$- # w - -  e eGv he$|u@*u.e$2$6$:$@$D$L$PuX7$`;$@f{Sx|u@|$ta a e N 7 %e5" aa e N 7 0 0V$vu@$|u@(_$4_$:7$D$H$Xvu@h|u@n_$r$t;$@x7$" eZ:q@$@$@$@e$@ ,@ @wu@{S@G8uhU>ƨ!>ƨL GDw, f @ hTr,u2Tu~6Tu~2u@Tu~@Tr@h@G8@u@hU>p!>pL Gw  e B@m!=/:/6Bmem@1 &8k;$@";$@*#0a0;$F7$L7$T7$l;$@΀|m&e ee e: a   - -l;$@#0a;$@(;$@0#0a:$@H;$@T{SX:$\e$be$fyuj$n$r$x$|$zyu@u@u@;$@@$@@$@7$@;$@:$@e$@$@#0a@k@{S@G84@  w a e e.$uue$ :$.;$@4{S uhU>Ƙ=">ƘL Gw0a 4  a& e e w 6a :a  2j{S($@,{S@$@F{!j{S|{S|5w4 a& e  a     - -  "a0$@${!0;$@ƨÐ(>ƨL G*f77 w ,7$6$7$uu 7$$u2u@u@7$@6$@G8&uhU>pÐe>pL Gw)`  Kf n BK a Pk ;$$$ 7$2$8$@Bu\$b$f$j$@nvuԀ|a eL p o` aa 0e -D,2;$$#0a(u,;$>7$H#0a^2b;$r$@z7$z$@,2@2@vu@u@u@u@$@@$@$@7$@;$@$@$@@#0a@: N  e % eu;$$@$uk@G8.uhLU>ƨÐ>ƨL G\      eV $@${S;$@ $${S(u4;$@:$>{SBuL$@P$T{SRu@u@$@;$@@$@$@$@@{S@G8XuhU>ƨĐ@`>ƨL G6f p0 &` e7$$@({S,u2u@7$@$@@{S@G82u@hU>ǐq>L G.f1 w, N`f %̐Bx:Ȑ&:ǐ*:ǐ@:Ȑ@̐Bx@G8*uhU>*>L Gtw-/ w & N `%  ׯ   - w`bh $$8$${u0$68$:xu>8$FxuP|uV8$Z8$\$ful8$b{u@xu@xu@|u@u@$@8$@8$@@$@h@G8pu@hU>Ƙ*7F>ƘL GVf  l  e %   . L`;u":^a4u@uH:^L`;  ,B:^a@:^@u@u@u@L`;G8RuhLU>Rv>L L`; Error: Gw   E r  l           C" @@`eFj &L`;*u0Rw6Rw<RwBR wHR wNR wTR wZR w\|55   %   D @``   ( L`;)$)0uP):2L`;z)@)@):2@Rw@Rw@Rw@R w@R w@R w@R w@R w@u@j@L`;G8 $*0 uhU>XRw>XL L`;~Backup past top of buffer 1Consistency check failed, please check your file0!Error opening terminal for input@/Forz help on any other keypad key, press the keyPInput file could not be opened`Invalid option for that commandp'Keys cannot be defined in Nokeypad mode=No more than 65535 lines can be processed in a single commandOutput file could not be clrosedPrint file could not be closedSelect range is already active+Unexpected characters after end of commandWrite file could not be createdIE.PRI - Privilege violation-IE.WAT - Attribute control list format error)IE.RER - Filhie processor device read error%IE.2DV - Rename - 2 different devicesIE.BVR - Bad version numberIE.BHD - Bad file heat@derIE.TMO - Timeout on requestIE.ILU - Invalid LUN G 00!DvATADATADATA L`;L`; G8RwhU>XRw>XL L`; ':' required)Cannot set terminal type from change mode"!Could not align tabs with cursor2!Error opening terminal f.{or outputBHelp file could not be closedRInput file does not existb!Invalid parameter for SET or SHOWr'Line exceeded 2i55 characters, truncatedNo output file written!Output file could not be createdPrint file could not be created+qSequence increment must be less than 65536Unrecognized commandIE.DAO - Data overrunIE.WAC - Accessed for write%~IE.CKS - File header checksum failure+IE.RAT - Illegal record attributes bits set+IE.RCN - Illegal record number - toog large%IE.ISQ - Illegal sequential operationIE.EOT - End of tape detected'IE.NNC - Not ANSI 'D' format byte count G  L`;L`;G8RwhU>XRw>XL L`;Aborted by CTRL/C/Change mode can be entered only from a terminal$CTRL/C ignored4Error reading from input fileD~{Help file could not be openedU3Input file does not have standard text file formatdInvalid stringtMACRO or KEY requiredNo select range activeParenthesis mismatchQuoted string required'Sequence number must be less than 65536qUnrecognized command optionIE.EOV - End of volume detected'IE.WLK - Write attempted to locked unit'IE.LCK - Locked fr~om read/write accessIE.HFU - File header fullIE.BTP - Bad record type'IE.RAC - Illegal record access bits set'gIE.FHE - Fatal harware error on device#IE.NFI - File ID was not specified)IE.EXP - File expiration date not reachedYIE.BTF - Bad tape formatIE.IUI - Invalid UICIE.IDU - Invalid device or unitn G  L`;L`;8G8Rwh~U>XR w>XL L`;Advance past bottom of bufferCommand buffer exhausted&'Destination for MOVE or COPY not found6Error reading fromI{ terminalF)Help File Index could not be initializedVInsufficient memoryfInvalid subcommandv=Max input line of 2814749767 exceeded, file input terminated No such lineParsing stack overflow'Range for RESEQUENCE must be contiguous)sString delimiter must be non-alphanumericWork file failed to closeIE.IFU - Index file fullIE.NSF - No such file1IE.NBK - File exceeds space allocated, no blocks3IE.ILL - Illegal operation on file descriptor block-IE.DUP - ENTER - dqkuplicate entry in directory-IE.STK - Not enough stack space (FCS or FCP)IE.DSQ - Disk quota exceeded G  L`;L`;G8R whU>XR w>XL L`; 'AS' required9Command buffer exhausted during XLATE command processing(Editor aborted8Error writing to output fil|eH!Include file could not be closedX/Internal software error - please submit an SPRhInvalid value in SET commandxKEMax line number exceeded; lines no longer ascending; resequence recommended-Now enter the definition terminated by ENTERr+Please answer Y(es), N(o), Q(uit), or A(ll)MRange specified by /SEQUENCE would cause duplicate or non-sequential numbersString was not foundWork file failed to open!IE.NOD - Caller's nodes exhaustedIE.DFU - Device full3IE.NBFi - OPEN - no buffer space available for fileIE.RBG - Illegal record sizeIE.BDV - Bad device nameIE.BBE - Bad bla:ock on device#IE.NDR - No dynamic space available G  L`;L`;G8R whU>XR w>XL L`; +Attempt to CUT or APPEND to current buffer!Command file could not be closed*1Entity must be WORD, SENTENCE, PARAGRAP|H or PAGE:File attributes errorJ!Include file could not be openedZInvalid buffer namej00!L"SXR w>XL L`;~ Attempt to PASTE current buffer!Command file could not be opened,Error in command option< File name:LInclude fzile does not exist\Invalid character codel!Journal file could not be closed| No definitionNumeric value requiredPress return to continue Search string cannot be null%To exit from HELP, press the spacebarWorkingIE.DNR - Devqice not readyIE.VER - Parity error on device#IE.SNC - File ID, file number check'IE.SQC - File ID, sequence number choeck%IE.RNM - Can't rename old file systemIE.BDI - Bad directory syntaxIE.ALC - Allocation failureI G  L`;L`;XG8R whtU>XR w>XL L`;Attempt to re-enter EDTCommand file does not exist.Error in range specification>File specification requiredNInp~|ut file could not be closed^Invalid entityn!Journal file could not be opened~No help available for that key/ORI~GINAL line numbers no longer an EDT feature!Press the key you wish to defineSelect complete lines only5To returnp to the keypad diagram, press the return keyWrite file could not be closedIE.IFC - Invalid function code!IE.RSU - Sharable resource in use+IE.WER - File processor device write error/IE.FEX - Rename - new file name already in usekgIE.BDR - Bad directory fileIE.OFL - Device off line+IE.BCC - Block check, CRC, or framing errort G  L`;L`;G8R whb~zsz~D"{[@:@f$@:@k@a$@a}@9L@DsR@@Q@8$@u@za@|rR@{S@u@,{x@L @$@)`@ ^^$h:$hP_$@h82)h2)hz_$h6$hB$@hX$ha(}G0Jz #huhuhu@h}uh2h~xuh,2h\zL h  ^ LB:[1,2].HLPoEDTHELPEDTHELP66EDTSYSBB LB:[1,2].EDTP PEDTINIX X.EDT a(} G 3%w a=˕ ` Е Е e e  ,"{[:kHaP@Qb,{xnDsR| e35 & 5& 7 f5)7 N,{x|rR*a(}2f$6L Na(}TL h$na(}xa(}~a(}V5  & %  & %w7 V 8$:8$$a$&u*u.)`4$:a$BuF)`L8$Pf$˕ ` Е Е e e  ,"{[:kHaP@Qb,{xnDsR| e35 & 5& 7 f5)7 N,{x|rR*<0b *@6B@00"TvATADATADATA"")!""_M(6""?T$"":d ""f5$""4q'""zs&""xF""xL""$ b Rгz"")!RгD:dw@s@xw@p@x H,"H_X H ,t'@x`;H ""f@Kq"@/KHzQH;@#""@:"@# z@Z`;H@~$,H H3{@N~@$9f@;F4 @mY H `;HYq"@z&aHeĊ@T;w@uL H@%"@`;H H@xO@$^HmdHX@xP@N/K@r@H_M HzCT@Z H3`;H$9@""`@X@."@""@ƅ/K@az H @@gY H[q H Hz{3 Ha'@,"%HZ/KH$9:@y H:_@@t@2 H8@f"@ a'0hKh4"(Kh.zݪKh<2h2ahxhx8h;}DhyuLhja&hnJ!h 2NhT&}hbyh:2h*= xxh,ݪ/h8zO %hJ!hahVG vh8Y"hl:2uLhhih@ zh :h#Kh&a'+h""h0:}hlsh4@8hDB#(}h4h(Rvhdh6k hy p (D  # z bbh h   44TTf""_M  @* >  $*06<BHNTZ:&   T&N~eĊCTa'@t ;;F4  3{28Xpk T T pp Z Z00"\S""f@. ȕ ЕȕЕȕ Vb5@ 7 V w N & n BaB~5 5>,t'D""H""`^nP55 5@dwȕ5vȕ @77 |@x w l& N/Kƅ/K4dNHB("& ΕT& - -w& & & & e4&,xw8sL$9R%"X$9f^f"b""`nH - -w w& )5Z& 8s$9Yq"s$9:":"&""`0%"4""`& +-w 6s6eK!sf )"*s,T;w2Kq"6""`F6Jt@&0077     7 t7 r 28X`b Rϳz"":dRϳD#@<&Kq@:2@x @@a'0@E,"@_X @GP}@&:@x`;@'@zQ@a@;}D@#""@Z`;@~$,@ @<&9@yuL@a&@Je@J"&@mY @ `;@JVN@z&a@&}@ :@uL @?T@&"@= xx@`;@$^@?S@md@Y|@AS@ @a@zr@@,:"@_M @3`;@Z @Y"@:2uL@&@a'+@az @N`""@=@@=@:}@z"@z#(}@gY @[q @ @{3 @<&D@,"%@hp!@Q"@y@y @k @G@2 @ B:dwh,,t'h""fhE,[h?T'h ""`h""h PTYLOBARESHHLSLLISSSW a'0 _M a'+ a'+[q  a'+&x (a'+.3`;0a'+26x`;8a'+:>uL @a'+Fy Ha'+Naz \LAPDENVZEUPNECUHIP|a'+   a'+`;a'+Z`;a'+"r@$a'0*md,a'02_X 4a'0: `;p pPHHSY:L&Lx_M   [q  x 3`;x`;uL y 2 gY mY  az  Z "_M y  $_M y Z`; n_M y uL  _M y uL Z`; _M Z   _M Z Z`;  _M Z uL  _M Z uL Z`; zt_M uL  _M uL Z`; _M mY   _M mY Z`;  _M y mY  _M y mY Z`; tuL gY  y gY  y uL gY   y mY gY   _M Z mY  _M Z mY Z`; ~uL gY  Z gY  Z uL gY   Z mY gY   mY gY  _M Z`; 3`;x`;  `; paz `; az `;Z`; az Z`;  ~$,  ~$,md ~$,md  ~$,r@ gh  SOPRSYMEPECOERALLd~$,r@  $^ `; $^{3   $^_X  "(.4 : @FL   %R -- %VA ,,0 b `wFw f00"dvATADATADATA w QUȕ 5}5uB?SE,"$#(}(y2B=L\&a^a'0fn@=5m9e1] UTHPC7 F""$# www|wtwl@,H>J"&BJVNH"N'Thp!ZN`""b&:j&r :z&"$E wFB @*5 5EU5 5EU5 5v&aa'0@=$z":_M B_M J_M La'+PgY Ra'+VuL ^uL fuL ha'+lmY na'+ry zy EUE<5 w   Bє~ B є~X Bє,y a'+ Z a'+a'+a&0Y"~PwP.  QR~ʕ & T . , aQ"z"2Y"R`dGP}zvzw <Ew0w N-  ww5ZETL5Et@= Q"Y"x  a'+&z".a'+4N8a'+B,:"JY|T= xxZa'0`&a ~$,$^ ha'0p= xxR >E45U$5U- 5% `;{3 _X  ~$,$^  ~$, _M a'+~$,$x &a'+,$^2B  az  Da'+LY"X 255 &5ww 7 ͋W" |&" 3`;a'+:2uL :2uL$x`;&a'+,yuL8yuL>BASJ#""L#(}P,"%V#X#(}\:}`#(}dyhl -W"׭"   >WPWS- P|]~(z"2`JenGz&}Pp7j7 b̋ , " N  7D 74727*- &R &f @~k VEE  & & &  f& & & Ε *;}Da  k $?T4aF:2(b Pγz""?TPγD,"@ E,"h&&:hKq"hl:"h$JehYq"hP :h%qPshJK""h&"hlz%"hY|h,:"h."hXh&hN`""h""hlz"h:Q"hHGhN`_Mh&8hf"h: '!Failed to communicate with ERRLOG ,"$/$ERRLOG not installedPrivilege violation,","PPRequest for ERRLOG failed ,"lGlReceive from ERRLOG failed%Cannot open the specified output file,"!,"%Output file specification error ,"1+Wildcarding not allowed in output file name ,")#More than one output file specified ,"&'&!Unable to open LB:[1,6]ERRORS.LOG ,"JJ Error reading LB:[1,6]ERRORS.LOG*The file LB:[1,6]ERRORS.ACC does not exist*The file LB:[1,6]ERRORS.LOG does not exist,"',"S,","cIllegal switch combination"Unrecognized packet type specifiedAmbiguous packet type specified,"C,"&&Command line error Syntax error"Maximum number of devices exceededFilename must be specified6Switch not supported und ,","',"K,"g,"Ker current ERRLOG feature mask)Device invalid or interlocked: :r#,"b Qz""xQD @Td@#@:2@^M@`@a'0@"(K@2@x@a@:t @z)p@a&@J"&@&a@uX@nH@?T@2@T^@ݪ/@,@:@G v@}@:@R""@@#(}@&@u@%16<%I%M./%M.%16>%T. %I(Offline)ff=p[ pz55 50  Ýda&:t  p$[(a&0p4z8a&<B"(KHLT"(KZf"(Klpt""vG v ~ .  p >50  Ýb^M ^M &&a&.2 @pDHa&R"(KX\`""bG vh n2| R~p p 7 7 7 7  Ջԋ F a& a&(,a&0p4xD:P+V)Za&bp  5& & &  f& & & Ε p  h ^J"&` :?T &a"a'0D:2PJ"&T)pX)p\}bahl2phP  5ѐ -hĊ7 8u uXuX)pB-D)TyH' qJ)Nhp!TK""X""`fZ  Z    5 L8\g& _M"&)p$)p(}._M"&)p 2<%qPs@$9!B_M"&)Ps HV&aXa'0^J"&b`p : w| / xp777ԋ  ZB>:  < Z p _M"&`""`288X@,JPTXZ\;}Db8hXn?Tr87 7 1E7  7"e  E ` b e PYZ DfR,dwh   w 5  8,&"&' q) h&&"&*VN,)p02)Ty6' q8)J"&B`F#""H#(}LyP&aRa'0t:2&p wt J"& )p)p}b Rγz""RγD H#<&@"&@VNH ^MH`@,&@L8H%@BxH2@'IR@z'@&HX{_M@JVNH h&@2NH^y@= xx@T^@\g&@}@N/KHƅ/KH@@zt @@&HF8HVN_MH hp!@4@&HR J"&hN`hDfh khaXhF,h:Bah,h ohoxh8XhYZhp   f  &  m55 5 @8>4FJ2PyT{_M`= xxh= xxnT^p0DRDBDD DL$MU(DY*DU.MS:DM<d.t /<&  %h # ` "$# M "$# D  V ,&"&'IRh&""&,2'IR8hp!>"&HN'Thp!Zp= v v pp=" "|x|0  40    w0 J p "&&}.0:"&>T}\\g&`"&d`r\g&b Pγz""zsPγD"&@[8@L8@;F4 @)W@_M"&@@@t@&@ ,&h\g&hR*#h;F vh("h 2ph  vP a! a!n@t;F4 P(&:&@L8F_M"&)W[8 L"&)W[8 X^j&pL8rPPH*_M"&)W[8  "&)W[8 Db Oγz""4qOγD<&@VN@%@%x@<&p@t<@t @K_MH VN_M@ "&h`-h"_Mh_M"&hh t <&"" VN_M$$ ## %x>> %`` t<bb||nn& <&ppp" VN  %x %;  LB0:[1,6]ERRORS.LOG;0ERRORS.ACC b Sѳz""_MSѳDK4H @"&@ZK@:2@#@l6p@p@w@^M@`@""@z@R@[8@*K !@)@ew@%@)Ty@VNH2@> H}@;@#""@'@z?T*}@# z@%x@)8HG g@3{@z}@)p@N~@;F3 @;F4 @C @Kj@4@)@z)PHh&@_M|@uX@'@2N@&@)yH)t @eĊ@Df@nH@N`@쩀'@ k@z<&k@?T@mr@G_M@,@aX@[@r#@ɪHKzH'@)p@?T@X@)W@z)Z@e@}@ @&K@髜w@CT@KWH)@00"|S2h= xxhݪ0hz"h~h8`'h0h hGuh:h 6f;hXv gh64hG vh<{QGhihD}hhz""hyh*#Kh 'Ih0k~Mhph%p&h'xxh.""h,}?Thzzh h(ZXh$!"h4h3h2h}"ht(}h"Kh y (P `Z`  ""_M @LB0:[1,6]LOG.ERR:$G<@D O BACKUP.ERR** WARNING: Device %2A%O: reached %4A limit (%M.) ** HardSoftError and QIO counts reset for %2A%O:%2A%O is not in the system.%2A%O is not an error logging device or is offli$ne.No Device_ID SubpacketFailed to assign lunLog file error - logging continuing on backup fileBackup file error - logging discontinuedError Log packet too longError closing log fileInsufficient coreERRLOG -- %I%I6hn# zrwtN~vewxr#zeĊ|CT~mrP Hx EL髲;  G g a'ss@tC C 24 z}";F3 $;F4 &3{4 :H@xFXh ?  ??@ B~? ?  t wU U&X`#""dyhl v쩀'"HD>>e 2w    ?  f  Nw# zHrv#""`7   . w\ 5   E 55RE$ `#"",@hR F5@ < w5 7t% C C 57 T&*0 e4e@eJ8XNZKP'*}V?T*}Z`;`Mb'*}r't'*}X &Ce7e7e " " ы  L&K?T*}ox&""0"">*K !BMD'*}f'lKjn'*}~&Kl Ce   w -- 7%!E7N @~ox ?T*}K' aX$ox(?T,aX0aX4`;88X:6x-@8XBYrH""JYZNDfR""XYZbN`h"&p< 0 W!(W! WqFe$&Ec  a 0 |ox)p )p))}8X"Yr(6x-.6x-4ox >ox$P""Z"&^ox`)pf)pl)  -  ( 7( ( &  eGH)} "&`,(6@JNR(V?TZ(f j$  z--p (@ U   (Q ?-( 4(BN,T^hl  x2&5L - w ( p4?T:@Tq?TD kH kN kT kXaX\_M|` kd?ThaXlaXp`;t(x| ( 5w  %55A   `7@?T (d&T :*RZnH^nHbufupuX @E  Z n  & TI ?  | 4:000"vATADATADATA4,0 (髜wP?Z#f tl6pVN@    D  E <&/  R%$:p >D ,2N6F\#""dlp)pt)px}~ 7 p %h p   F   U |`#"")p")p&}28)p<>)TyB%xD)H%J)TX'Z)^h&j^Mnx&|~   z 8V    | PPPPH ~') hp!V(&:&>)W[ F)W[8 R)W[ V|b&j)W[8 zU$  <T HU P^7b^M쩀' 4T<#B FP&T^ dht j)n<&kp)t v)Zz  . xRE    c Z)p )Ty%x)%)' )$hp!08#"">Rx#""~:$~~p  0w`5f  B 2 f &ՋpJ:2 G,`<@GDNG_MRG\`d?Tr ՋՋp $7SJ7 ~f~.2N8J<Xfdb Sϳz""fSϳD @K4@^M@"&@X@ZKH`@a@,&@L8@}s@%@z+d@"(K@Bx@VN@2@}@-@'@W@# z@#""@%x@$9~Z@)8@S&@z<}@Vd@hM@=M@KjH)P@h&@'@GZX@2N@ @ @N`@Y@ k@z<&k@?T@= xx@a@ݪ0@"@,@ɪ@0@Kz@`'@@6f;@4@髜w@z\g&@}@G v@N/K@KW@_MVN@6x-HYrH _M"&@ƅ/K@p@=@@=@%p&@K@zt~p@' q@'Ht @z@ @$9!@o@VN_M@ox@hp!@$!"@4@(ZX@}"@zMHf9`H  ehy?Thl""hRhX*K !h0t!?ThE`Wh ?Th(""'h(?Th?T*}h'|Qhz_M|h1?Th]wh2&h q?Th쩀'h /5?ThL ?ThP?Thv'hy:?ThehS?Th&KhK'h"R""h?ThTq?Th`;hz'*}hSwhwhuL?Thp  No Task subpacketLogging not activeUnknown command packet subtypeNo Data subpacketUnable to open fileFile I/O errorPri|vilege violationTask subpacket corruptedLogging already activeBad Backup filenameError Logging initializedError Logging  stopped}bb VNdd4 4ccT ' qRR VdPP ɪ7* File Created ** Error Logging Started *wMemory Parity Error* Error Logging Stopped *oi Recoverable I/O Error On Device "Unrecoverable I/O Error On Device Hard Timeout Error On Device il#lSoft Timeout Error On Device c;Mount Request On Device Dismount Request On Device #Device Error Count Reset For "Unknown Interrupt Error, Vector = (Unsolicited Interrupt Error From Device Block Replacement On Device #The EMB Packet` Was Not Recognized: vv&Unrecoverable Error Limit Reached For $Recoverable Error Limit Reached For (Ll2P2R(TVLXlZ\^2`bdfhPA?? %3Z%VS%Y %VA %VA%VA%O: %VA%VA%P%VA%2Bs00 %VA%2A%O:q<|<F\  0 | 5 w7777 7 E ~00"SGZXL`'RyV}"Zb+dhDl}"p|<0 % wx̥ ̥ԋ̥$̥   \UN %}"."(K6"(KJ"(KPV2d"(Kh2Np"(Kv~)P 2 wԋ̥̥5 5 twԋvX "(K"(K"(K"(K*}".@F= xxLGZXR= xxX`d=MjKznzrK4v4zKW~W(7̋  f%5 5 25 w̥w j=M#""<}"(= xx.GZX4= xx:N/Kƅ/K H= xxNVZf"(Kn"(Ktx_M"&|K& d|  & N`N/KBxoxp=ox\(0  0    c F p"&ox(},"&0oF}Nox Ro p=ox0  q0   7 " # 0d p "&ox&}.ox0o:"&>oT}X"&\`fL8j,&p_M"&t'zh&b"$# "$# E   /7 Z_M"&VN_M-'hp! _M"&$VN_M*-0'6hp!BLL8P\g&Zp=oxL-   | p oxoxoxoxoxox ox$ox ,ox0ox4ox8a<@ kD?TH_M"&|@p P  w  7 &4U @"# V w~a}_M"&`$"(K*.}"26hM< @`DhMJ^MN4R)8TX^@bVNh' qnhp!tVx}"~  7L 6"$#> # *׭*| =MKzzK44$KW*W8 ' qDhp!JVN}"RVhM\ `Vdfɪl p_MVNv=M|%xr > "# U # @ V w w@ % S& _MVN'"h&(^M,=M0)82X: >'Dhp!J@N`RVV}"Z^hMfjVdn@  ׭ @ j n@ @ U 2 ԋ $@ n} }$9!$@(`,j0}">@BKH@L`T Xa\)8^Xlat@x|a  U |w4 5 ԋ  r  t}s }"a )8 X(2%p&D,L$!"X"\a`%p&d%p&h%p&r?Tvaz}"   w  "$#>d# * z  G vݪ0"hM(`, 0_MVN6=M<%xB%P T'Zhp!`$9~Zb *h(ZXn rt x<&k #   5E &0 00"#vATADATADATAȕ U%\  'hp!6f;(ZX$)8&X,)8.X2 6%p&@L=PX@=\z~   U%U%5ff B`&B~%~5E 20)82X:%p&f)8hXn)8pXv ݪ0"hM(`, 0_MVN6=M<%xB%P T'Zhp!`$9~Zb *h(ZXn rt x<&k #   5E &0 <0b *@%~R\X:5sVKsUhUi#<U(i&>UPi'TUxi* Ui,'"y:F-KSs;TsTs f f, fy: fw5,x`'1~W6x$CZJjPy:LDb 0z'"0Ds@zT@:^@z}@lh.@ȩs@Jt @:D@r#@@$9΅@뫽@2eM@Aq@qZ@@ (^ & ؙؙؙؙ@./U7 7 &^6@Fz}HȩsJAqLN뫽PzTRr#TeMV:DX:^ZqZ\^Jt `lh.d.|7-A5 5C5l5BewP Ve Xw@  Bl 6 ,085@  t E A 5*  :dy;^tBA1,1,p2" n7h B~e4 4 UE i8"LU @ 1 e :@ 60%z1up :0F$9΅HsVplPpp5 7 7 B u fy %Due~e ep-ׇP P D > pE;p&  &ftl  7wl7wl .f>de@E?cs0%1$00$9΅2svb Xz fXD&Hg@@l6p@%0g'@9p@^K@:2@zT@`@$CT@Tw @"zd@d&e@p @aZ@?T@VN@uS@uS@uS@s@TwVN@zg'@uS@r#@uS@a@)W@w6 X@X@ y@nH@> @@ee@髲@{f@#@zw@Tw|@@ @)Ps@=&@ y@u@̫+g@Bx@RQ@"5@Twy@iBx@GR@zTw@hp!@ @op&@"^@x@x@@"N@cHg@n6VN@ -@uS@  hnzݩD~hHmpqh^KhKh|Mhehj2h^uLh"ݪKhRZho:hdEhݩh%0 hd@8hbz#plhpy0 hvPh뫂hy}hx gh;F hzmph~hv gh{~P @ 0뫲2n6VN:2 ""VN"> @$0(p 44@[1,4]%NPMD -- File open error %D. on file %X%N%NPMD -- Task image I/O error %2R%N%NPMD -- I/O error %D. on fil @e %X%N%NPMD -- Bad address %P%N%N SNAP TERMINATED - REQUESTING TASK ABORTED%N%F%25SPOST-MORTEM DUMP%3N%F%25SSNAPSHOT D/,UMP ID: %D%3NTASK: %2R%37STIME: %Y %2Z%NX0XcHgiBx D~ w=&GRG geeeKy;r#6sBx C "x$x&;F4 ( *Hg,zT.{f\X Y4 w z24( ʫ, ʫy̫+gz}髲 X&0X4Mv8k y >mdB4D)TyH'J)Nhp!XX ;RR= h5 5 5k y  RQk y8 D;"nH&nH6Tw28k y >uSBuSFTwVNHk y NuSVTw  :뫲2c6 Dk y>  H%0g'^$CTpEvoRJ!75  6  p w&zDRQ nHnHRQ)Ps$md)W 26RQCg'DCg'HDLp`^Kj^Kp^Kt^Kx1 l6pVN  b z fy:DB[X@ @@f@v@Hmpq@^K@^K@fa@s<}@e@eg'@z2@uL@D@ y@S<}@o:@,L@E@Cg'@a>X@p@뫲2@?T@9z@W@zvP@*@k@ y> @f@d&e@3X@뫂@aZ@y}@x g@VN@;F @s@mp@zs(@g'@[@a@~@ y@sP@{~P<@v g@nH@D f@#@a@y~@[W@z'I@#@k~M@G@@'xx@'J@f@[(}@ y@r<@u@ y,L@x:@lp@rl@@@y@ y@op&@@y@l@(}@*df@ -@ Mvh  ) J ~7 55 5~k ,Lfk y fk y f k y $D(,20?T2s<}8D f:s(Beg'HlZwtSE 00#vATADATADATAe5 D  k y y} D$#?T &s<},.s4?T6s<}:p@S<}J~NuPuTud 5 P@7 7 ww5fm ~  Dx gs<}ys$, 4P:y~>aBCg'FlH^KLlN^KR*T'J\{~P<`^K`xDe  7   ,3qv^Kp^K^K"g',g'04k y :k~M>(}BFL~PuTvPV;F Zv g^lpnA A  / .$Ћ~W ѕXW ѕ  |>VN  k y  W[ k y W[X nH[(}"nH&[(}*T^j>w w7 D5 =   JC5Cmfe  && ~9zW[W  9zW[W W[W p(a8;F @Pd&eR'xxXop&`;F dpxx:&R~< e>R~ V7 w  > 05AE Wtz 뫲2뫲2<$3X.a4a>X6aZ:a>X>op&@a>X Dg'F#L^KP뫂T뫲2`o:f#ld&en'xxtop&t6`R~7 w < e>   wm`R~ 5|뫲2a>Xop&a>X 뫲2<,uL0^K4뫂83XDo:JEN3XRVd뫲2hfala>XnaZrl>7 f&f"B~8sP a>X aZ -뫲2@y(v,"b  H VNH}HTwVNH yH> @H,w> HTw|H ,w8H yH y,LH ,wHt @zTwyH y'MHTwH yH  vht^Khf9phffhDhS<}hmdhCg'ha>Xh뫲2hzfLyhWh3Xhkhtfhp haZhrg'hahphj#hfhRQhT@yhhn -hly ff?SY t N   fb zfDOK@2@D~@ʫy@@G g@O N@z}@Tz}@Fs@Z@;F4 @z4@f@@Q@+3@9z@J @eĊ@a@̫d@>M@s@[(}@6}@:$@@z+ @*;@<+8@x@x@RR;@:4F@ѫx@:(}@  `rh2h2h~vhgfKhzdf`'hyh`hK ghu~hvPhdfyhy}h2hzYh~h:hdf{hv ghfzhb'Ih8`h;F vh ghe(xh'`Jh~ gh4gh8@Gh(}hp(D <!'<   L S $( ,:$6D:$N\:4F:|=|;F4 z}ѫxG gO NO N OK"J $+ &Fs(4*eĊ,2.D~0s2>M4+366}8Z6ʫyTz} ̫d RR;fxx* <<~Wf|TT     &=& -- Warning -- Pool is critically low Total free pool = d d. bytes Largest fragment =  . bytes (7-- Low pool - Please exit active tasks - -- Warning -- Free pool 00#Sn~*; 5 f  wewEC7)  -E"U  -E"   <+8j?$7 wb-Z `3LXk  L7 F[O _"ar<? 5-Tw-5~w d  & 5D"<DdP\&bf|bL0eB*C5EDDᄊ5 w><:78ClĊA   T  p5@LFD *923&5-5)5 "55$*Z55@@  2*wpbw$ p 7`? w    U50@Hp^fz5  eȕ 5ȕPe  5`  w ~& w-BNN  ΊBmE [(}[(}<:(}RЕ PP Е: 3 ^* * LES H  7 7     :(}$36DSr~9zw  wp ^BEeBR ? h T`? ? ^w ? J9z$pHL`TJ  5  wHn pw  N;  pw  $ ew0,n4p<FR^pfnwc es  Tvn~eBw~  Е,<D[(}L[(}PTj~rvaB Ћw  (w Hp< e /(ߋp—rvŀ    v`@Q :(}$  W  ߋprŀ ߋprŀf`{Mvߋtɋ7w>z>: t& +V555? 45 r AW,CO5pt p t tptVzt~pj 7dw5es   7  ? *\ b <0zUh<0DݩD~@ y@D@RZ@%0 @y0 @}@뫲2@k@p @3X@aZ@j?T@~@X@@ y@RQ@Mf@@y@}@@ ruSh* fP} L f?T  %NPC: %P%10S%VR%2NREGS:%5SR0 - %P%3SR1 - %P%3SR2 - %P%3SR3 - %P%2N%10SR4 - %P%3SR5 - %P%3SSP - %P%3SPS - %P%2NTASK STATUS|: PRIORITY: DEFAULT - %D. RUNNING - %D.%3SI/O COUNT: %D.%3STI DEVICE - %VA%S%2NLOAD DEVICE - %VA%5SLBN: %O,%P%N%NPROCESWSOR: %A%N%NEVENT FLAG MASK FOR <%D-%D> %P%N%NCURRENT UIC: [%B,%B] DSW: %D.%2Nbb-EXERDNMSGCIPRUNBLKCKRASTDST-CHKREXSEFSIOAFFHLTABOSTPASTPSPNASPNWFRAWFRACP-PMDREMPRVMCRPSLVCLIRSTNSDCALROVNETMPCCMDGFLMUTLDDPROPRVDDSPSNC  fP}   f?T f?T{YWrp}}4  fP}   f?T f?T#;v}%P R"""`  fP},  f?T, f?T,,5aarL]%:  fP}  :   f?T: f?T::d^,y``"da00#vATADATADATA  fP}N  f?TN f?TNNR`` @@#P<@'xx@ y@RQ@Mf@d&e@ uSh %2NLOGICAL UNITS%N%N%3SUNIT%3SDEVICE%4SFILE STATUS%2N%5S%D%4S%D%5S%VA FILE OPEN FILE BEING ACCESSED AND BEING DEACCES.|SED FILE %X OPEN  :br&VN> @"  <Ee>-w(7" = f&@e Cn,6X MfMf뫲2<aZ6p :>7H=L?TZݩD~t6xvPz;F ~v g0 RC N`E%E`A&@ C:E2 !  C C`eR>&VN RQCRQ"?T&RQFݩD~Vk y ft N`J N`5 j N`U N`Е Е e ew& DRQ?T"J&?T2j6?T>UB?TVRZnr}v~(//t/&,5(? A$ C 5l<% Ee?U  $#P<2;F Jd&eL'xxd;F b jU(iDBݩ@a>X@뫲2@3X@aZ@Mf@@y@  uShn k%2NTASK STACK%2N%5SADDRESS CONTENTS ASCII RAD50%2N%6S%P %P %2E%3S%R%N%6S%P BAD STACK ADDRESS%Nhh     e #  7 wj4 J MfMf뫲2"3X(a>X,뫲20@y`aZhݩtj|4*e  v7pL Mf L&Mfb t0zUPit0DDTwX@뫲2@*@k@3X@aZ@TwVN@z y@Tw|@@'xx@'J@ y@Twy@Mf@ y'M@Tw@ -@ 'h uSh %3N%20STASK IMAGE%N%F%3N%4SPARTITION: %2R%4S%A-SPACE VIRTUAL LIMITS: %P - %P%2NID%P %P %P %P %P !%R %R %R %R!%N%|7S%2B %2B00#SX,aZ0aZDd&#F'xxtx - n17l`XTwZETwP  : > X3X*d&#,'xxtaZz~ --7x7 d7 bR\5@ Du Dr 6 RS0DRaZfRpS~  KTew J $C 3 n5  2 ET 5TMfݩ26PTwR yk XjTnMfrTw|t yk z^ 2 F{5 B  @  e7 (6{Tw yk "Mf&*HRMfb XbUxiXDDD@ݩ@뫲2@[\}@[@Mf@ uShN %2NOVERLAY SEGMENTS LOADED AND RESIDENT LIBRARIES MAPPED%2NSTARTING RELATIVE BLOCK: %P BASE: %P LENGTH: %P%NSTARTING R|ELATIVE BLOCK: %P BASE: %P LENGTH: %P NAME: %2R%NSTARTING RELATIVE BLOCK: %P BASE: %P LENGTH: %P D-SPACE SEGMEMNT%NRESIDENT LIBRARY %2R: BASE: %P LENGTH: %P NAME: %2R%NBB@,We we D -< 5@ &e 7` w>뫲2["ݩ,[\}0ݩ6:MfD뫲2<PDvݩ 7 5@ .  ( d@,e D 5@ 5uw45@ .  EmRe w&ݩݩ2[\}6ݩ>ݩzݩ:ERe R<- 3e Re Jr5@ e @e @e re r 8ݩ<(ݩ2ݩ8rNݩZݩdݩpݩxf< 5e EmjRe Re R m>e 5e.< Mfݩ0ݩ:ݩ@DMfXݩ*b XJUiXDBv@뫲2@Mf@ DuSh %2NEXTENDED ARITHMETIC ELEMENT%2N%5SSHIFT COUNT - %P AC - %P MQ - %P%N%2NFLOATING POINT UNIT%2N%5SSTATUS - %P%2N%5SR|0 - %P %P %P %P%Ni7 e%"5 1 ~" "0L  f &eD 0뫲2BFMfNvV"ZMffLjMfnvtfxMf:d E(R E~x 2x6Mfb ~zF~Ds@5Ir@p@:2@zT@e@#Iy@`@<&%t@z}@C @ձ@j*S@r#@X@0Ir@T; z@' q@r<@$9!@`;@hp!@ Xy("   le w@ 77w5 J:26l:z}>r<BzTTe\#Iyb5Irjz}nr#r*StC |- r:r \ T#  P         T.s T; zX"T&' q,hp!Z$9!~T 3T @U@U 5w3T T  >`T`>@H0IrR*STC jTnձtTx`;tX5xs3U 3 3 s3#e f& Z P# D XV`j#h    & )e00#vATADATADATABEU0  %Ebb <&%tffX Xdd|| hhT Tvvxx ww5 ' q LB0:[1,1]KMCLP.BINT>4:03,"n)*&.  Microcode & $T2@N)\&p 0Loader -- KMC-11 Successfully LoadedMicrocode Loader -- File LB:[1,1]KMCLP.BIN not foundMicrocode Loader -- Error reading LB:[1,1]KMCLP.BINMicrocode Loader -- KMC-11 RAM compare error Location:------ Source=------ KMC RAM=-----/(-Microcode Loader -- Failed to set affinityb Xzx`'XDD &@e@@@2@(@:^@z}@lh.@;F4 @4@f@z+3@}@@r#@̫d@DF@}@5 @4 @D:@뫽@@@Aq@@  7 n  j` R& &&  :   $WC COF & 7 5<FBAKC ll N u! NFA   >Nlc #  FDF J!UtE w5B&, 3` 2EC+ 5b4C U ww R E$e  ՕՕU Bn  ՕՕ? dd \\ e@ B,چ E$e`e```   4 3EPE "Nh] œ  T U &82$E$e e   6b 0zw0Dew@;@nhH@L:d@rh !@ @bhL@ jKhݪKhYMh4h2ihe h|h#Khh j2  ww`ww@ewL:d   ;$2: DbhLVrh !^nhHdnhHb t0z:t0DHg@J:@ir@*S@mh@sh@i M@sh@rh !@x@bhL@ "YMh |h#Kh E? 5 @  l!52UtJ:x Hgi Mir sh&0bhL8*SNshTmhXbhL\rh !`rh !tbhLxi Mir zsh|pb dz~WdDzT@D~@G g@z}@C @F@ ~$@;F4 @r@Je@ L@r#@z髜w@i@$9@髲@>M@}e@Aq@[(}@@{Ay@ت4M@CT@@Z@}@ze@cHg@a'@:@s@:_@Hg@:@:4F@ #MhHS XhL2h&"(Kh42hFzGh62xxhP#@`hRB(}hJ}@h2mGh8 h00h~P} \~?T ( ~P} ~?T~?T#Odd address or o00#S> ~?T~?TLink down ~P}@@ ~?T~?T Link up ~P}BB ~?T~?T!Checkpoint file now inactive ~P}DD ~?T~?T(Unrecoverable hardware device error ~P}FF@ ~?T@~?T@&@Memory parity error in partition ~P}HHb ~?Tb~?Tb$bMicro code loader not installed ~P}JJ ~?T~?T1Accounting sec. pool allocation failure for ~P}LL ~?T~?T2Allocation failure on task account block for ~P}NN ~?T~?T3Task "XXXXXX" does not contain a debugging aid ~P}PP  ~?T ~?T + Replacement control task not installed} ~P}RR3 ~?T3~?T343Write back caching data lost. Unit write locked ~P}TTc ~?Tc~?Tc,cRemount verification task not installed ~P}VV ~?T~?TI/O stalled ~P}XX ~?T~?TI/O resumed ~P}ZZ ~?T~?TReplace Command Failure Task "XXXXXX" terminated on processor "X"And with pending I/O requestsPostmortem Dump not possiblePostmortem Dump will j8be generatedTask load device dismountedCheckpoint space allocation failureR0R1R2R3R4R5SPPCPS  2 =~ D~ Aqz}zTer#cHga'Je}e;F4  F"}$C &>M(*,髲.G g0ت4MN$"HgCTr Z$L ^    f|: ~$ ^:4FV 5@V*3@*5  5@ TMC5 E8EV Hf`@e 00#vATADATADATA:ZT%$Lt@ e f@ 0% 0#  s nE 4TTL Zp@HFi k7f P > |&pA A  eBmeABE ,, Li .~?TDpL[(}T[(} ~~P},X 2W 50E Wwb7 p<AD&5,? BE:T  " ~P} ~?T .~?TEF<r25EmJB `\  >5 tEF   d54W-0 P -5)f # D  fmA_ ~ W5@7 @pDPz, f,|    VE E@@ .wdB    & E@% (~?T4Vpx$9zsH# F  w f%M%J%G%<7 7  5  7X7T7 ~?T#DF7B: 4 Е 5 V$ Е-Е-Е D2 W!W!W!8%%%Е"[(}[(} H~P}2@  Е" @ -- w^~  , &t^ X  T* [(}[(}* ^~?Thtp[(}x[(} w Е ȕ*Е Е ȕ*Е   Е a w7` W Е0 ":[(}B[(} J~?Taf`j p8 Е:!  & +'5^ )  ` f&(: <N f~?Tx44   PPЕ= &  $& bE Е:ȕ L   ~?T*:_Tid:_tLb0 5 eppD-5   5{Ay$p*pB髜wJ b t0z$t0D@s@:2@zT@\x@ʫy@9@z}@v:@o@C @?T@z4> <:  x< <::2 Va(}6tN p5j!  r  ~6&Q~ en F& l00#SF\f J\xN\_MPT}1 )E-KDffC~\C &m m AK,\ a(}"&u*a(},2a(}X\`j nr |3b<}>s,   & & & ff%6Y 6$  F 4 X3b<}  Ba(}6Js Na(}Y Ta(}6Xa(} \a(}$`a(} da(} P<B B::~   7F>> a(} a(}< ,a(}2[(}8[(} Ba(}Fa(}F Ja(}>b XzZXDl6p@2@z}@:br@;F4 @4@r!m@?T@r#@ w@:$@@2{Ay@:y@  h0p( 6 2 2D:y 2:br$2(DDDStart verification on unit %2A%O:End verification on unit %2A%O:Verification failed on unit %2A%O: @ nr8emIwXwX@w:{Ay l6p2;F4 4$z}2z}6r#p 8 8ŀ;D $NK@7678?<DCCd~ :2DCCd~ <(Re( pD w$BPDdDxRp faz ~g 4@w ŀ w| w28fD & & &  f&"g*Hr!mR^2b8lDp?T D& & & Ε D:$b tpzy:tpDk[;@cs@:2@#Iy@z@k @x@v@4 @t[MHа@FCT@zk:@{[;@{\;@а2g@y@@tHK@f@@.y`'@4@4W^@y@yK@zf@dFy@y@#K@@x @ 3H@*;@u@tyH6F4 @6F3 @t:Hr0@r9@Z2@ g'h2xxhYMhfHh|hHHyh dh}h( XDT -- Initialization complete and successfulXDT -- Sorry, couldn't allocate pool space -- Node address = XXXXXX -- XDT Address = XXXXXX00_!)w ,w &w w w w  _w EeE& 6F3 6F3 ^6F3 l6F3 vy~6F3 50vxrlh_XDT -- XDT being unloaded6F3 .y`'ffeep&e"veee_e,67 N  w 76eNP "PKh #Kn ({\;26F4 46F3 :6F3 >zBTk ^4W^ew&Tewewee wewewe(eRe%e ZO k[;{[;42&k:0v4Br0Lr9VcsbyK> ~Z ^^75eeeeߕX X5R}x 4 4 dFy*;x dFy&y~ ,yK 8yyy fLfPFCTV 3HL78 *.5 e6- efe e9 ; ~!0 ~ а а2gu#Iy4e* Ve<veeeߕ  e e& & &  f&& J*yX 6yyyd :f`@r@r@4@zr@̫xQ@(IHg@h@9!N@UT@r@̫pE@xd@68@@p&@p@mxx@kZ@zvm@4:@ay@UT@+3@7@s@ir@.s@h@,{2@;s@UT@Jt @r!m@z%{Q@8s@6s@uX@4@=s@UT@ߩ^(@2{@nH@G@cL@Q5@G@}@z6F@f@ʫT@}@@G@6F@mh@̫@q@ <}@ʫL @vwR@oh@p@z@0{G@T[@rR~@sh@*@CxQ@}@}#@|@ʫt @s(@̫S@@CE@zɪ+g@H@l8Y@nOH@ʫ@U(@U(@@8r@0Iq@Xr@nhH@@Wr@|K@zV}@WE@ۉ@sP@f@Dy@74F@Vr@ @RF^@XE@{ne@{xe@تYe@@zw@sE3 @@H@dO@sh@H @4 @@@b@0Ir@ϫy@Oq@S@zv?T@7F@D:@rh !@q(M@ت@hh@ت@q'M@ت@ت@7F@تe@ت@تމ@znH@i@,t@ϫ@뫽@5? @rhQ@ʫW@vC[@eM@lZ@쩔@髲@d@y@vg@zl8Y@ @{f@i8^@#{@a@t@ϫ@ee@ @تf@w@74@eM@Hw@z@[M@r(M@@ͫd@r'M@hM@K(@v@u@g,@Kq@@u@iy@zlO8Y@h:@h:@=&@=&@K5@@h:@Hy@Ms@h:@iy@u@u@@zR~@:d@u@̫+g@='@5@='@c7@QN@Bx@qzZ@q~Z@ah @먗@K@z@ 3@se@@@shҒ@xG@ݩW@L@+ @̫s@e@iBx@N^K@u@zphq@Ky@d@ty@@w@T|@ d@@@u@op&@Q@e@:d@6F4 @6F3 @zx@t:@i8@bhL@#I(s@pq@7M@phr@ت5M@@Q@cHg@CT@Z@@z6@6@cOL@zH}@6@C^K@6@th@6@3I@@@qZ@t@z&{8r@@/I@f@3{@ @먃2@df@@ت@ʫf@qZ@ت4M@f@ktL@z7f@""@kBM@nOH@X@+{p@lp@q@rr@+@a @@7&@iO@v@zxQ@+{8|@eKy@6߀@eg'@vG@+{P}@{je@}@C@c@f@l8Y@m@#I_@zva@rhr@̫d@Dr@ew@xG@/Ip&@}@a@ʫ@Z@@f@v@@zshU<@ @@s@@@)I8^@em'@p @l@s q@lh8Y@0@@hh@zih8^@r<@t:@tG@ z Dt'hcshbk[;hfBxhS""00#S<$=CQ.;-+*,BGKLOPRSXID: F X d  Zvp~  ~0B T d68:<>@BDF: HF JX Ld NPRT VXZ\Z^v`pb~df h aVv j @H$0/$1/$2/$3/ $4/$5/$6/$S/ $6/@ 172352/172354/ 172372/172374/ *v   j @HMOVCMPBITBICBISADDSUBCLRCOMINCDECNEGADCSBCTSTRORROLASRASLlagellI - BKRAMMARKDPFMMFPIDPTMMTPIlagellI - BTXz>  ?  A B D E G1 H1 l0SSXTMULDIVASHXORASHCBPLBR BMIBNEBHIBEQBGEBVCBLTBVSBGTBLEBLOSB(CC,HIS)B(CS,LO)NOPCLCCLVzD D 0v 1v B{ C{ H I CLZCLNz        z    " " . . CCCSECSEVSEZz6 6 B B   N N SENzV V ^ ^ f f r r zz z       SCCCLC!CLVCLC!CLZCLV!CLZCLC!CLV!CLZCLC!CLNCLV!CLNCLC!CLV!CLNCLZ!CLNCLC!CLZ!CLNCLV!CLZ!CLNSEC!SEVSEC!SEZSEV!SEZ   eSEC!SEV!SEZSEC!SENSEV!SENSEC!SEV!SENSEZ!SENSEC!SEZ!SENSEV!SEZ!SENNOP(260)RTIBPTIOTRTTHALTWAITRESETSPLC\W X Z [ f g hSMTSTSETWRTLCKJMPJSRCALLRTSRETURNEMTTRAPSWABSOBILLEGALFADDFSUBFMULFDIVzH0 I0 K5 L5 N: O: Q? R? Ez        Qz$ $ - - 5 5 > > ]zG G O O X X ^ ^ izo o z z     uz          z        z        z       00#vATADATADATA z        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)uy}@ ~>|z|p@T TT@  dddd~ >"&|*.T2T6T:>BFJNRVZ^bfdjdndrdvz~r$@ @(v  "&*.RvX;F3 Z;F4 \4 ^̫pE`BxbrdW^feh+ jr'Mlr(Mnq'Mpq(MZ  C w ( Dew  De w  xCT 2g J4JLJÅ""%xdt'h7 "$4:&5:BJRd%*eDl F w,  5r 4  @@$i%,  ` %44B&,>JR,vzBd0 # EtT  =  T    D N E= e0, T0T8T~T@ .& H  H?Z >7 vXDT>7q  7h7 f  7Vw   Ry"vBt> `n"\3-w"7   !7T 77w77%5 f .:T   z 7m~xrql X 7^7 \w *F@ .a70 PT . 7  7 eB` % D_ & > wPw ~EzMP pvz B3!SON)w POD@w <BED7#w $IOpFw IL\Hlo w "6Nb|L EMBJRU5-07PPXW  w>4HLR|6F4  %  "&"  "%,7ĝ(jC JK F t!$ &,,6F4 N6F4 j6F4 |D TE w7W 0> 0 e0B7$ ;5j5 R:@7 B%BC  ,&0"0:ty,6F4 $h (` >BdHNt[MPdX2xxdHynH ? ? ? 7 7 e<7 "d77 00׭w",l0,w|Uf :-<-6 / $-(-"N 7 w  LN hw  %55  e_Z7 x$2t[M4d<2xxHHyRHh$tzpvlh"IpDh% V7`"-  n1 %@f  ft m77  c e  v0 7E ` wA A ы00#SNDzK K5"   7 d5  n6F3  sE3 >6F4 p6F4 5%%&D ??%% 7%%D6F3 sE3 R6F4 L\F\V`i @(x   ,TTB    5z 5NU $ CA"$T,THzPNV6F^6FtxCI$%zwE E wDE @E% %% , <wN 4, w@E Hw2 $,Dn~tE? & zwAC@ Ew<5CEE % D, 4w ,, 0wCAEeCEt05~p  , wCE?%%wzCE?%  @E wf  bCC wN  D @ rw4:Thn E?%  "E% f, jwE% % Fw E~ (,.-@E wE4BXhF UE .@ e- +@ w| l w` \ wPE Xw@FBHN^r~ <@E hw* & ~w &w @ :   ` ` @ @@ B fv(4` @@C CE 55@ V@/` e 5  +-( )@E%&Re0%SPPC`# .en ebe" mee X& &Ee0  2#/f7 7 X7 N7 De 7#7-%  Xzt X RZ"A90$  .@KpD` $ z zXz z >` z>`z CxQ zCxQz b zbz  is zisz iTt z  iTtz se z  sez h zhz r zrz  s zsz$ $W zWz( ()X z)Xz, ,T[ zT[z0 08r z8rz4 4Wr zWrz8 8Vr zVrz< <Xr z  Xrz@ @ݩW z""ݩWzD Dߩ^( z$$ߩ^(zH H.` z&&.`zL L6 z((6zP P6 z**6zT T6 z,,600#vATADATADATAzX X6 z..6z\ \6 z006z` `6߀ z226߀zd d6Ԁ z446Ԁzh hą z66ązl l߅ z88߅zp pZ z::Zzt tn` z<<n`zx x& z>>&z| |ϫy z@@ϫyz h: zBBh:z h: zDDh:z h: zFFh:z h: zHHh:z hP zJJhPz "" zLL""z % zNN%z xd zPPxdz 7M zRR7Mz H zTTH z H zVVHz K( zXXK(z K5 zZZK5z Ms z\\Msz P\ z^^P\z  z``z  zbbz CT zddCTz + zff+ z  zhh z 2g zjj2gz  zllz RF^ znnRF^z @w zpp@wz 2 zrr2z 4 ztt4z & zvv&z t zxxtz ̫ zzz̫z ̫pE z||̫pEz ̫s z~~̫sz ͫd zͫdz z} zz}z xd zxdz f zfz   q zqz ,t z,tz u zuz u zuz oM zoMz    3 z 3z$ $w zwz( (| z|z, ,쩔 z쩔z0 0T| zT|z4 4T zTz8 8 zz< <:^ z:^z@ @W^ zW^zD De zezH Hw zwzL LWw zWwzP PKy zKyzT Tۉ zۉzX XcL zcLz\ \e zez` `e zezd de zezh hee zeezl leWw zeWwzp pew zewzt teKy zeKyzx xL zLz| |H/ zH/z H& zH&z H zHz Hw zHwz r zrz r z00# S>CEz| |WE z@@WEz XE zBBXEz C^K zDDC^Kz J;d zFFJ;dz N^K zHHN^Kz er zJJer z l8Y zLLl8Yz * zNN*z RG zPPRGz تe zRRتez تމ zTTتމz  zVVz  zXXz  zZZz ' z\\'z ' z^^'z v z``vz ?tN zbb?tNz Z zddZz eZ zffeZz qZ 00#vATADATADATAzhhqZz تYe zjjتYez ت zllتz ت znnتz |K zpp|Kz [M zrr[Mz eM ztteMz hM zvvhMz QN zxxQNz ̫xQ zzz̫xQz ̫S z||̫Sz ϫ z~~ϫz ϫ zϫz lZ zlZz C zCz Jt zJt z   eM zeMz e zez ʫW zʫWz ʫt zʫt z ʫ zʫz   xQ zxQz$ $D: zD:z( (Dr zDrz, ,Ds zDsz0 0Ky zKyz4 4ktL zktLz8 8kBM zkBMz< <kZ zkZz@ @ke zkezD DqzZ zqzZzH Hq~Z zq~ZzL LqZ zqZzP Pu zuzT Tu zuzX XzT zzTz\ \zT zzTz` `zT zzTzd d{je z{jezh h{ne z{nezl l{xe z{xezp p{f z{fzt tQ zQzx xʫI zʫIz| |ʫ zʫz ʫ zʫz ʫ׃ zʫ׃z  zz  zz 먗 z먗z  zz + z+z  zz K zKz 9!N z9!Nz Dy zDyz ay zayz cL zcL z e ze z q zqz rR~ zrR~z Kq zKqz R~ zR~z .s z.sz 6s z6sz 8s z8sz ;s z;sz =s z=sz  zz +3 z+3z Oq zOqz  zz ɪ+g zɪ+gz  zz iy ziyz iy ziyz }# z}#z S zSz S zSz 00#S>7z| |t' z@@t'z  zBBz h zDDhz >` zFF>`z CxQ zHHCxQz b zJJbz is zLLisz iTt zNNiTtz h zPPhz r zRRrz s zTTsz W zVVWz )X zXX)Xz T[ zZZT[z 8r z\\8rz Wr z^^Wrz Vr z``Vrz Xr zbbXrz ݩW zddݩWz ߩ^( zffߩ^(z .` zhh.`z 6 zjj6z 6 zll6z 6 znn6z 6 zpp6z 6 zrr6z 6߀ ztt6߀z 6Ԁ zvv6Ԁz ą zxxąz ߅ zzz߅z Z z||Zz n` z~~n`z & z&z ϫy zϫyz h: zh:z h: zh:z   h: zh:z h: zh:z hP zhPz se zsez #{ z#{z   %{Q z%{Qz$ $&{8r z&{8rz( (+{8| z+{8|z, ,){ z){z0 0+{p z+{pz4 4+{P} z+{P}z8 8,{2 z,{2z< <0{G z0{Gz@ @2{ z2{00#$vATADATADATAzD D2{^ z2{^zH H3{ z3{zL L3{ z3{zP P3{( z3{(zT T5{r z5{rzX Xa zaz\ \cHg zcHgz` `c zczd dir zirzh hiBx ziBxzl lo zozp pr zrzt trr zrrzx xsL zsL z| | zz f zfz  zz ^ z^z  8^ z 8^z  d z dz   z z   z z  q z qz  <} z <}z   z z   z z cOL zcOLz dO zdOz iO ziOz kOp zkOpz lO8Y zlO8Yz nOH znOHz nOH znOHz sO zsOz d@y zd@yz l8Y zl8Yz mxx zmxxz nH znHz p zpz v zvz v  zv z v zvz vG zvGz vC[ zvC[z vv~ zvv~z vm zvmz vy: zvy:z va zvaz vg zvgz v zvz   u zuz u z  uz uX z  uXz #I_ z#I_z #I(s z#I(sz   #Iy z#Iyz$ $&I8r z&I8rz( ((IHg z(IHgz, ,)I8^ z)I8^z0 0/Ip& z/Ip&z4 4/I z/Iz8 80Iq z0Iqz< <0Ir z  0Irz@ @3I z""3IzD D5Ir z$$5IrzH H6I z&&6IzL Lah z((ah zP PbhL z**bhLzT Tch, z,,ch, zX Xchw z..chwz\ \dhzd z00dhzdz` `hh z22hhzd dhh z44hhzh hih8^ z66ih8^zl llh8Y z88lh8Yzp pmh z::mhzt tnhH z<<nhHzx xoh z>>ohz| |phq z@@00#,S 0hzPl0  Ngvv CRASH -- I/O [SA] DEVICE ERROR; CRASH -- I/O (P.STS) DEVICE ERROR;v vp b LzR\XLD:(}@Hq@$9ZZ@;F3 @;F4 @4 @T; z@ѫBx@w@ <@ @ | @( <@2R*ѫBxw 4  ;F3 ;F4 Hqv      ]  $$&S &**,C ,002 2668 8<<> >BB0    $CPRSX @& NS2& & & & & & & Ε bp& & & & & 0 <@22 H<@bbhT; zj<@pp|& & Ε & NS 6 &Wt E l <@$*T; z,<@2JPT<@V<@ Z<@ ^6`<@ d&f<@ l<@p<@E " & & & & H& & Ε @%/V%&% l ^:(}<@:(} (<@ .<@H@NT; zP<@V$9ZZX<@^Vf<@n<@tltx& & )& & & & & & Ε a& & & & 4x2 D<@ J<@djT; zl<@rbR& & Ε %(& NS@& & & & bR& & Ε > <@R <@*0T; z2<@8(P@ b<@R h<@lr R & & sD9$u.hr T; z<@2> D<@H<@D P<@\b<@d<@$ h<@tz<@|<@.. 7e`7 & & & & & & Ε 0> N̋DZ >P<@. <@<@<@  (<@ .<@H0NT; zP<@V>fNrZd ̋@ 1@t & & & & &f& Ε 7ew!FD PJ <@"<@2<@^dh<@p<@Fv<@D|<@P H7 P , . & & s& & & & 0P&  Nޥ .X<@H <@P<@.<@2> P<@0TP X<@nNvT; z|<@.~<@x\ H   Ps|0 H4UHJeH-HNLH &  ~<@H<@P |& *<@06<@HF<@HH<@JN<@HR<@HT<@NZ<@L\<@H`<@h<@ p<@t & & & &  &  ޥEU s81.  H<@ <@ <@6>T; zD L<@h8n<@t<@L(&f  s  s  ex3 % :f&͋ & & & & 2<@Jhp<@v&f&   s ,sf&& & & F <@$6<<@ B<@00#D$EvATADATADATARZ<@hl<@rx<@<D& f&f&  h7w$h*.<@4<@ <@6>T; zD L<@h8n<@t<@L(&f  s  s  ex3 % :f&͋ & & & & 2<@Jhp<@v&f&   s ,sf&& & & F <@$6<<@ B<@<0b )@g$KHjK#HjK&HjK(HjK,HjKMHjKBaHjKfaHjKsHjK|HjKHjK6HjKHj/3|  | # | % | 2 | 8 | xQ | f | r | x: g` (s}w#K#0k#pl#D'xx'I'I2:p:;F vQPS XSGSmpHm09Tq8^vPv gvPZx VyXy}yy${~qF~@rXu>Lɑdɑis2Waz&;F""Qd;Jii #i(#vm J}HjkHjrHj@HjתZHjݪKR]HjWHjHj3(2Hj>HHj> SHjaWHj+ + /4@4@4% 4[M 4 :2 < <!^?,&A,xQA,e=TD?D^K?D?u?u^K?u?v%Bhv`;Bv6ChvChvChw&=Twe@wy@t: #Eb#FO@P@ =G8ZHHjޅIZ߅JMO2OމPVK kP4br-4s-H2PH2PC^QR@`@ѱ}S8Աt T:Ա&TԱ2TԱ8ZԱbYZԱ։ZԱZرTرTܱ{Uܱ%Vܱ6UݱW2t W&ЉW܉X<%[%[p#\?^^^#^g'?B[`s`?މ?^$^^2^,^d^^r^ @ s@ @ $  g'@^K^2X2saK @[!^CbP}bdo@t dV2eN2eN8eNZreB q@K" ,8^ ' Љ c ~ x:   t(}H 82 j_6Hq V !;  `r8 ::h;J<H:8x#z:{<w*?w*?w*@.8A.A00$LSw[>w[pxxK\x_^x !^xP`xЉ`WaxbPbs(FoLD)8 RD)8 ZH2h%r p $!l1lI    55 50 &  ( >o"r*v6*kr8'I<$9+ @ Do~$9K h5-2-2<4""5(  ( &?M?M@ Zyp4[Mv "   (wyԱ&ѱ}oP g'b b,8^Dh@$9Y@/@ 0.4[Mh 4%h4h  2,   67  B~! h /"h0$9Y *b @R' Љ@Dɑd@;F v@  :2ht:h fm;F v ɑd;F v;F vb 0zc ~0D#BԱ&F&4b @z@D @P@ g'@y@&@2@'@D@@ ۭ0>+h  ۭBE       @P g'yy& ,D 2':2@&b z !D&@:@މ@2@2@௲2@D@@D@@,xQ@ ۭ0`h ۭd 7 7 W   -   ɝ @``  W  \ މD: &2,௲2.D4,xQ@NXD^2b&b OZ;OD @o@ܱ6@ܱ{@ ۭ00zh ۭ45@  ," 7 w  "ܱ{* .o2ܱ6b z Dy@&@X@2@s@k@2@@2@௲2@'@H2@Z$@@D@@wy@,xQ@ر@ ۭ0#h ۭ yfP       e@   ` &&  R $$y(',22X8k<2@௲2DرHL,xQ| `H $&f    ɝ ff f -     77 ^*D04,xQBDD௲2J2PkT2^XdH2lsxwy|wy&,b jD @ܱ%@v%@Ա2@Ա&@,xQ@ ۭ0Z%h ۭ^ )  "  &  1l1lq 0 "" 8  Ա& v%,xQ,Ա22v%6 Vܱ%b zD#@p@@K @@@@#@`;@މ@$9@u@zwe@+@@z@@ @@D@wy@@@ Da &ۭ0` #hZh  Da *^^^ZZ~ ۭ^+ ۭ^ z ۭ^zz+ ۭZ ۭZ# "$p&( ۭd $7  ʕ7 7 7 7 7 {5 j #wywyweK "& *`;0:$9yB?MF2NDRK ZԱ^yt,xQ| 7 . w@ 3,  ( 5m Q , ~d DD?M N*.K 2d&T4'xx:u<NTuZb9dj@rDG be Ae @Aw@DG u~DbDe}(D0\X>OB2b N@B:h;N@D ۭ0@d;hm h ۭD&   `@ ` B   & A @    b B<H:D Da $ۭ0Vu~h Da (JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC ۭZ&= *WpeSSS % ~% r e0e0S  $Da 8b z8D @@}@s<}@O@$9 @$9we@y@#0k@o@#pl@uX@znH@y}@+@/@2@~@?M@>L@Tq8^@ N@nH@u~@,&@Hm09@Ա&@zD@'I@r<@u@x:@u@u@3@`@@*df@@ 0h,a . ,a Ol| xPHDDЊ@eT TR 5y7 ( _ \5| nHuXuu2$9  6,&:>L@oJ$9we NOR`TZ,a ^( d,a hy}ns<}v*dft( M7  Z D PЕ   B 5 7r'I ,a /,a $~(nH,nHJ?MN NXnH\nHbufj*dfl'Ix3~,a  ( @e @   Հ Հ 5   e ~ ,a  Tq8^x:"r<(Hm09.#pl4,a 8#0k>,a DԱ&JD N X2^ydojԱ&pDvD |u~Bl5@  @   w<y oD "}(D . 8Ա&M@@w@ @z&@֯=@@#@wy@v`;@Љ@+@܉@x@ت4M@x@ ,a f h0zKh`SGhFazhS XhD2h@ShH#0kh6}wh4yhZXuh#plh8vPhP@00$dEvATADATADATArhyhh*zy}hX`h(:p:hB/h ɑdhmphJ~h\>Lh^VyXhVTq8^hNv ghR2Whh.Hm09hLvPZhTz#Kh 'Ih>;F vh 'Ih<x h gh&'xxh:h,shx:h$(sh23h"hbɑihQPhdzDa B#h(h2h&h0&h6#h* #h,h<_~h.O h:Oh$'h4#h8h>R2Xh@0ݪKh/h@`;hih $ h<֯hM*P\,e.er 0ew2r#4r!m.4v?T.s6s C  xx7&ت4MتeتމzT{ne[M 2"4$‹&ȫO(ʫy*̫d,z} ^[g' ;Da ,~ =  ݱ֯=+++ЉЉ}& T"Աt $t &(}*%(X## # ௪2 &%#!܉2s~`b  7deU D7 B~@ % 7|,a ` ,a b,a ,a ,a ",a .,a d4,a :,a >v`;B,eFwePK TX q\wyh,a &z  7 Da  w&K TQ a$$9  b vZxvD @P@$9~Z@D@ ۭ0Kh ۭ"  - D P$9~Z b X:~XD ۭ06i h ۭ:&f!  E D  E E C B Ί Ab XB~@jXDo@ ۭ0ni(h ۭrw AUUUU    T T T T ee(e(e(e(T $)T T TU U U U  oZb rLDK @^K@we@D@D@@ ۭ0|khh ۭ  e@ -& N N` ' ABAeBcA H     `u $ &BA  <DDK D,^K<^Knwerzweb r :Ds@k@:@2@H2@@,xQ@ ۭ0*&h ۭ. fff   wF:  ,xQk2$H2,s,b rDԱ8@u@2@@D@D@ ۭ0R2h2h ۭV7 7  7  r `B f t `Et @w8D DD2D6Ա8PuTb z8rD @$9 @$9~Z@o@2@?M@,&@'@Ա&@D@C^@%@*2X@ ۭ0Th ۭ@e$TTR7 -1  Հ &* #Հ N,&?M$%(Ա&22X:C^>D B$9~ZHD L R'jo |w2$9  Fb N*ND bb zD @ @xw@@eg'@K @{#@@TJg@}w@xZ@Gd@z@y@TQ@u@~@ܱ6@\G^@TS@@#@{lQ@dz@D@x @@Zܱ{@@@@@G^@3I@@ 0ah ~D(  w4& & & ΕE5 %G5 ~K  00$lSxZF#J{#Txw^dz`dj@x|TJgz .A fm5 m C55& & & && & & & Ε@ LTJg,K 08y<{lQBx N\G^TG^Gd V3Iw!7 w!7 w!7 w!7 7 , B& %  l5 `DD"&u,u6 :ܱ6Lܱ{\ܱ{d@tlx}w|@r~ eg' 0b z8D @$9K@K @$92 @)Bx@t<@v%@we@)8@.{V&@C@)%@z @)@v6@%@Ա&@D@D@)%@:'@%@ b zsD @ؚ@@z@O @@^K@ ۭ0:h"h ۭ>E@e `B w 5 w<^K ^K$(ؚ, 8O WBzWyWxW@ @[<}D[#HL$9XR[ZX5^[Zb$9d !,8 U  .B ~  3 3U C~ wVU(, (b.2K :BbYPrNZ n.{V& x|.{V&@ #$9  Fb *""?TD Lb O@z#SO@D @\X@o@^K@@v%@%@2@?M@s@4@Ա&@BD@r@wy@4@ ۭ0h ۭeȘp`H     -  ŀ z44^K.46\X<s@ FoT%Xr\D^?Md%jv%n2rԱ&xD ~8|Հ & llv  w, D  wywy*v%62Zb z#_D\X@!@#@@#@y:@^K@@_~@4@$@wy@:4@[!@ ۭ0:%hh ۭ  fP 7w5ˋ  e  Ԁdb@ #7 7  xy: ###"^K&^K*wy084H^KL4V4Z\X^$r$v$~#~|  7 7(  Ԃ `@ 7 w (`w z###![!6^K<^KD!J[!N$R$V^K\^K`$d$h[!r_~z^KH N N cw e&VP7 7 w8^K^K^K(!2$6$<Fb z #XD @!@$9 @#@y@@%@௲2@H2@@D@,xQ@*[!@ ۭ0xy:h ۭ|555 %7w ew B ``w w 7"o %&#*#.,xQ6[!BF$9  PTZ!^H2d%l%rDt௲00$|ShhDrh !F;F vRS XVOZc6\`d6blPpvPr;F vXrr7  @?@ bv g l6p g'we we$ g'.p2rh !4;F v8PDHwyLwyPweT:p:tb z'YD @r@@y:@Wx@Wy@WBz@[Z@?M@z@[<}@ N@B[W@[@#@+d@ ۭ0=h ۭ 4%+%'%z#%55 , ,(,*@  5  ,%hy: ?M N"[*[Z0WxWyWBz 2[<}H[WP[WX[Wn+dtzrb|(%$%z %5@,,Us s(s* w<?M N[[ZJ[WP[WV[W\#`zFb @*w*@D b00$EvATADATADATA zw*Dg'H Nu^Khމhuhuh hhOD^KhDhRDhPhh^Kho(hp(V hb @zw*@D HZ@ qH  h,a H hh sh:Oh g'h Ph zK hhh8yh!hohXh&weh%h*?Mhگ?Th`h4h2௲2h$ Nh'h(:h h"wyh4h,bYh6ۭ0 ,a 66 ۭ ۭۭ  Uw ,a Z,a .b r.8D @P@$9 @$9nY@o@?M@\h@ ۭ0T,&h ۭXf @e E77 $ "   8?M\h?M"P,o4 D$9  V$9nY b @B.@DD@ ۭ0,xQh ۭ  eDDb bv:D4%@D^K@D@,xQ@ ۭ0hv%h %h ۭl && P~PP pe     B pp C `p Q$~$4%D D^K(,xQHD b by:}DV @:2@h@@@ ۭ00v`;h ۭ4Be,W  %% h V $:2,b z:p:D @4[M@az@$9Y@*@o@Xu@`@QP@ɑd@@D@z'I@r@s@@3@@ɑi@ Da ,a 0v6hvhvh Da  )4?IT_it ,a  Da   & 5cA 0, 7 7 0   nmɐ ppp*  1*AJ Da *'I$ 04QP8XuD,a L$9Y Vaz ZDa ^`b,a dXu~\Hwm m  mb CWpmf 7~`o`Xu,a "ɑd&Xu 4Da  Sh >HhR]hWhrh h@h3(2hۭ0h ۭ" @ޅ ߅K TSTQT' ~@b zSZDk@$9 @> S@תZ@>H@+@W@\h@ ۭ0~ޅh ۭ B~C5/   %  %     $  Hk תZ +2> S@>HVkbWfWlWt\h| $9  b zSZD@@#S@ k@\X@k@xw@@K @}@{#@y@zK@aW@> S@:br@xZ@>H@K&@we@iw@R]@K(@$9@`@r@x@zK@W@D@dz@D@z@wy@@4@$9Z@@@KBa@@ ,a 08߅h ,a  :br `Dn7 7  $ % ] % %  $׭K  we,a ,a D ,a  k&D.x4D8z>DDDHDNDVD ^D fDTjEew 5-- 5`$9Z `wy,a ,a  ,a $K&&k,,a 4,a 6<,a >FwyH$9 LKBaNkj & P J%I~ ʋ B E5UE5"U{>HD > S$D2wy4$9 8DDBDFDJaWPD,\D$bD.f}~-%%$,5,/.//e6:(( *5*D-D$K(k r&@.D.B,a F,a JD:NDRZDbD hKjkpR]vxZ8& & & Ε6az #S{#xw b  zSZ D @ر@k@o@މ@?M@s@ N@K|@H2@%@v@Jv@D@r@@ر@ ۭ0Jh ۭ mB 77 7 e   1"epd$pb&p $ la l P?M N"ر&%* 0v4o:oD HH2N%X xo|  5U44"<7 7   B e 4$ 4& &  Vrv K|k o@oF JoRرXD`DfD Va e~ t"f  @e@  ~`0t.  7 "sHމRb NBSZND ,a @0h ,a G}    _Fb *S:dD b JSD@މ@ ۭ0$2h00$EvATADATADATA ۭ(&Ӥ `B   މb @JS@D2@S@ 0 މh $ E  S2b RU:Ds@$9΅@`@ ۭ0& kh ۭ*f -1  s$9΅s`"`b jH[D$9 @D@$9ky@,xQ@ر@ ۭ06H2hH2h ۭ: f@f f %  .,xQر D$$9ky (,xQ2$9  b B5aPsDs@ ۭ0""h ۭ'1sb zfxD @@K @@$9f@@$9@dz@D@'xx@,xQ@d&T@2@ Da ۭ0C^h Da  ۭ5B5T& 5 W  5 , t ( (* b+%)QK  dz Da $9 2>d&T@'xxHZ nDa z |  f v΋B  %  C WEB EBEP 1DD ,xQ 2Da  HDa L$9f  UC ENb @2Zg,@D ۭ0b zpD @\X@:br:uK 2K ::brR`j`t$9΅vs|W ! ! % D:br$9Zq $9 b b>wD @K @@ܱ{@%@ ۭ08%h ۭ< 5@, / -7 &%"ܱ{,K .48 b J>wD?M@ N@ ۭ0"%h ۭ&e -- ?M Nb zxxKD$CT@K @$9@d@^K@@މ@@we@r@g'@s@r@$9#@$@B[@wy@@4@@@2@ ۭ0#h ۭ7 7 w    e "-  - E  m"m"j^K dd$$(4,4HK JPމ\s`މdg'v~|   !07 7  W    0 @  !!!!!BfBRHJ$CT 4"$&$($9#6@VB[\rz~$9mBCU 0   4  µ µ!µµµ  :$މ,B[:F4X$\$^$9#tdȀt7" 0 .. 0 @U   Udwewe"2&s<@Nމ^B[f$j$p4twyz~0Wt  Ee@ ~ 2g'b zx_D ,a "!h #h,hdh^Khhhhrhh *$h[!hh2h b zx !D(@K @@$9 @^K@@@މ@/@~@s@cy@rcz@i8^@;F v@$@B[@(s@@:y@pq@2@ 0h ! @xtp D( g& PP        VK  ;F v"((*cy02czB/L~Rpq^:yv^Kz^K|  `0t .t`.fe@A  e "/7"  r e%t% 00$EvATADATADATABC@ i8^(s$$F2NTbr2vsz$(@A 0  PU   މ"B[&$9  b jxPD@މ@we@g'@s@@ ۭ0FB[h ۭJ @ % I fE -"  ( we(މ,g'<s(b bxЉDԱ@K @g'@@@ ۭ0jsh ۭnE-  CE 2    % " $m&B ,g' K K &g'@PԱb zWD @$9K@y@*@o@#@$9f@X@we@t:@௲2@H2@b$@@D@'I@K@C^@$9!@,xQ@ 02sh   5  BCE 5Pw e@E&  E C Q$ ~ Z  oo$9f "$9K &K.C^>oD*F'ILPPt:V,xQ~weV| PCaC  w77 7 M H2$9! *48D:௲2@XHyL$P$T#b @Jx@D @$9K@ ۭ0Ch ۭ $9K b XzXD @|!J\hX$9`D hD l zv% wyb @J&BmJEmDBCEmCcB  %BeɊD0s 2W,D2DDazN2W\sd   5a aB     ( % H?B,a HHLXuP`f&f&8m TEmDCm’   CeB U%  Z,a ,a *'I&8*`.Xu0,a 4ɑd8XuDT H,a Ns\2W| -#S EmDm 4 eE >&BmJEmDBCEmCcB  %BeɊD0s 2W,D2DDazN2W\sd   5a aB     ( % H?00%SM@lK@@[(}@u@<.@lp@@zr@@@d&@G^@Q@@@_M@T*K@@@x@x@@y@3I@zih8^@@2@z}@3{@+{P}@nr@-@|p@@iU@ @l6p@/K@i@zuh@\G^@<@eg'@}@<@w6 X@@}@<@  #g`hlSMhjrmphnehz2hP#lhZ`;hhTvPhp6yhN2hV2hz.yh|~hxfWhRv ghrnKhf'Ih^;F vhdzDMh~rr0Mhm^h_M2hhx ht ghR'Jh`'xxh\̫shB2hbyhv/hN}whXꨤ`h }`;h2̫e yh Gh(  P   H# zQ|No pool spaceVolume not mounted DDNN::Shadow recording is active on DDNN::No volume listIllegal keyword combinationCheckpoint file still active DDNN::Volume not mounted by TI:Wrong volume labelFSystem dismounted from DDNN: *** Final dismount initiated ***I/O Error DDNN::DDNNN: is attached by task XXXXXXToo many devices attached, no further attach messagesDismount is not necessary for cassettesWarning - Tasks installed from DDNNN:> - Tasks disabledWarning - Volume will not spin down DDNNN: Warning - All units of multiunit drive will spin down DDNNN: PSystem disk being dismounteduQ}|z"$&(*,.02u4Q68}:ȅ<#"">@΅@#""B@D#""FH#""J|L#""N.   3 F ~#""#"" #""#""#""#""3#""F # z"$#""&(# z*,# z60L|# z # z # z# z# zL":^$:D&>M(e*eĊ,v?T.8s0C 2x4x(b,f;F4 Ⰰ - ת3T|p24+{P}3{z}FJ }"nrD &    %a%z R   w7 >-   w  .D , B F̫e J0# Pp*H@ w  X,0  +A(eȥ "B00%EvATADATADATA,  wx : u,,0T'2BTT*KV\t  $w` tr hDEG A- B-@, LwH'\ %.hX ^ut\"%l nLwA E A-7wn"   C ЕBlnnHnH(TJg*Vndj[(}p[(}v|} Е ( H%j, :w x t ;wuw6 `2 0w$%J7B : . 4 (j,,TJg.4tT\# zrrx#"": :@ wD V   R55  . .xw8> RV b6v $ w $ 5 w$$ TQ ̫e P D$  :T D"n .D"z :І ." .D/ ~    D    $T &D *n ,.0D 4z 6: : <. @ B.FD N DEV  ̫e LL.  D .  D LOCK  ̫e V V" "   TERM    ̫e ^ ^: v : v USER  ̫e dd" (D " ( DSIL  ̫e nFn@D=Ă :D=U"N"H"S"V: DDf @ D  D " $"& ,". 4"6 :: <@DDD   :~z7 x5x R N J$LH  AA,w(  < ly"F$JX_M^ bfz$   :A5w-,R 7 ̥"*-уBe,ʝ P  u$\f&,6}>B,H}V/Kd/Kj*v,z:2  %t 7  5 t p! zw( ^RA5@,hTSt" 28d&Ndch, hch, ni MiidfiUi pshvdhzd|uh U54 7 N 7w  %7C  w00%ST# zh}vrB cs`P & R׭J b pzSrpD(@تVN@(@nr@Ds@(f@e@ת@vDf@}@(@+{P}@z(@H$ @-@ת3@(@2@ʫy@(@<@ܙ<@8}@P<@P_M@먃2@ܙ!q@z|p@G g@:^@z}@[`'@3{@S@7&@C @Pz@er @;F4 @4@ܙz@l.@z8s@KU<@eĊ@G@(@G@(f@ת8}@(@@UZ@ܙ_M@7y@@PBa@z(@ @Ⰰ@̫p@ꨤ`@J@ūD,@v@̫rq@[`@cVN@(@vt!@v*}@[M@zDz@ת'@ɪ@#H%ת@@{U S@@='@P!q@se@ܙBa@DK @A}s@x@zx@@@ت5M@?M@@(@?"N@(}@(@ @#\}RSMh*'@yhJ~@~hDrmph0zz}@h@2h SHXh,#lhvPh6hyh>y}h<2h:p:h"/h .yhL~hBshFshHzv gh8Tq8^h2nKh&#Kh'Ih;F vh$rr0MhPDMhN_M2h('xxh'Jhx h:hWhUq0ah4Jxh (}hSph.STԀsRn}۪.hsRo}sRp}( #\}6%~먃2:^='G geer eĊ8sC  x"x$&7&(;F4 *Ⰰ,-.ת30ت5M2تVN4|p$2j[MS2 4 +{P}ʫy3{ z}l.GGJ }"nrSTԀ MOUNTF sRn} STԀX& 4 7 #\}4DzDs ((,(}.(2(4(8(f:(>(@(D(F(J(fL(P(R(Vv*}NT,7 2dvDf ?"N?M̫p̫rqH$  H$ &H$ ,H$ 2KU<6ܙ<8P<<ܙ!q>P!qBܙzDPzHܙ_MJP_Mh  e7 7  5 {ܙBaPBa @<cVNɪɪ(v*},vt!0ūD,<7y>{U S HA}sN[`P(V(\DK bת4B5  wcsUת'[`' (תvת8} 8}"v&UZ 0se8ꨤ`|:b zS:dD(@(@p:@6d@RS@b@Kw@<&@t!@[`Y@[`~@[`@z@bX@vDf@=f@(@{^~@(@`@`@H$ @[`f@(@(@^@bKq@z(@P<@bY@P_M@{^X@-@bk@aW@[`'@?p:@# @Pz@[`x@[`@Uv^@z[`(@;@̫e ;<}h  ` ̫e L!;(88)8} [` ( [`(  ( *80| 288 @ B8PH(\)\jp ; ``(    \  \& (j0 2p < > F Hf&, L) L:L, ! l` , " >" h00%EvATADATADATA" zQ  & L L  "L( 2l: B J P>X ^h`h! `/! h f   ACCESSED ̫e  0  b (   ACP ̫e   "   "  BLOCKSIZE ̫e  6   G bk( BS ̫e ,,6  G bk(  BYPASS ̫e ::!,  bx ( ! !CACHE ̫e DD!R0 ! b ( R''CARRIAGECONTROL ̫e P P' ' 77CC ̫e X X7 7 ::CHA ̫e ` `: : > >DEFAULT ̫e hh>60 > [` ( 6F FDENSITY ̫e t tFv F vNNEXTENSION ̫e ||N0 N b# ( X XFOREIGN ̫e !X, X [`' ( ` `FPRO ̫e `6 ` ff [`(( eeFILEPROTECTION ̫e e6 e ff [`(( t tHDR3 ̫e !t0 t bX  ( y yLABEL ̫e !y0 y bY  ( LRU ̫e 0  b (  LOCK ̫e 60  [` ( 6 NOCACHE ̫e !0  b  (  NOHDR3 ̫e !,  bX (  NOLABEL ̫e !,  bY ( NOSHAREABLE ̫e !,  [`Y (  NOWAIT ̫e !0  [`  (  NOWRITE ̫e  !,  [` ( OVR ̫e !,  [`Ba (  OVRACC ̫e  !,  b] (  OVRFSID ̫e **!,  b^ (  OVREXP ̫e 44!,  b# (  OWNERUIC ̫e > >&  &PACKSERIALNUMBER ̫e F F  PARMENTER ̫e NN0  [`f ( PRO ̫e ZZ6  @r [`( PROCESSOR ̫e h h"  "PROTECTION ̫e pp6  @r [`( PUB ̫e ~~!,  [`z ( RECORDSIZE ̫e 6   bKq(   RS ̫e  6    bKq( # #SILENTr ̫e !#, # S4x ϪT` **SHAREABLE ̫e !*, * [`x ( 4 4SHOW` ̫e !4, 4 [` ( 9 9SYSTEM` ̫e !9, 9 [`z ( @@TRANSLATION ̫e @f0 @ b ( fLLUIC ̫e  L& L &P PUNLOCKT ̫e !P, P 00%SnJ@P_M BNnJPP!q R^; ) )FORTRAN ̫e )2 ) <&(  ; 1 1LIST6 ̫e !12 1 <&  ; 6 6NONED ̫e  !6 6;; ̫e  =:[ < <ATCH ̫e <, < [`c  ( AADCF ̫e A, A [`~ ( EEFOR ̫e ""E@, E [`' ( II ̫e .., ]=:6f/K f/K J JVIRTUAL ̫e F FJ JR RNOUNLOAD ̫e LL!R& R f/K [ [SOFTWARET ̫e VV![& [ f/K d dUNLOAD ̫e ``!d& d f/K k kHARDWARE ̫e jj!k@& k f/K tt ̫e v v=: u u6250: ̫e ||u, u {^# ( z z1600 ̫e !z, z {^~ ( 800 ̫e !,  {^00%EvATADATADATAN (  HIGH ̫e !,  {^o3 ( LOW ̫e !,  {^oM (  NORMAL ̫e !,  {^Y (  COMPACT ̫e !@,  {^X (  ̫e d=:  ! [,,,](, )z     &J . 6 > FL$ X$ `  SYSTEM ̫e $ $F  F OWNER ̫e , ,~  ~ GROUP ̫e 4 4   WORLD ̫e <<@   ̫e FFF=:RJWJEJCJDJ =:Ru J J" $J, .J6 8J<W E@C@D =:Ru   " $, .R<WECD =:Ru   " $, .@W E@C@D =:[{   " $, .>Q64&,&]=:(!)j/ZX &Q/ZX &  $  , 2  OVERRIDED ̫e f f  ̫e l l=:(!,z )$  zACCESSIBILITY ̫e ,  b] ( EXPIRATION ̫e !,  b# ( IDENTIFICATION, ̫e !,  [`Ba (  SETID ̫e !@,  b^ (  ̫e r=: " " "  =:&=:=: =:{  " (* 02@QBf# D&PQ R^Q`@ b nQpaW     FULL ̫e ""!>!(#  aW >B a ̫e 44,4 )B 4  INDEX ̫e B B  ?p: USER ̫e J J  p: ̫e RR=:  Q   FULL ̫e ^ ^!>  >& ̫e ff=:  NONE ̫e jj,  `Y (    EBCDIC ̫e tt! ,   ` ( UT1 ̫e ~~!,  ` ( UT2 ̫e !,  ` ( UT3 ̫e !,  ` (  ̫e *=: ` V Kw Kw Kw "llf 5 @ 5 @$ @  @ A w<,(w\  _Mnz}U } A%} } 7-Q$w ah(jvDfnvt!~vDfd A @%  w w % @ 00%S(F(JyUQ۪. PP<d -T ҕ[    -0 ҕ]  ҕ]"P!q P< P!q6d6db O`zS<O`DAVNHbHkHRH:Hy,HDsHXG> H(VNH[`YHyTH[`~Hz3@[`HbXH {^~H[`fHc> H`H`H^HbKqHyH:@8}H{^XH@bYH@zbkH~H[`'H yH[`xH,5RH[`H@[`(H@:dH{^NH{^YH {^#H^vHS'HbxHz[`Hb6H`YHkH{^o3H[`zH(> Hx@b|HGVNHɪHA> Hb]Hk[HbHzkH^yHYHYHyJgHb^HXH@b#H,fH{^oMH[`HcVNHbHSSH[`BaHz[`c HɪHoMH[` HHYH #HNH[`H ̫sHo3H`Hb#Hb"HahHz[`H`H (hHp:h{(hVRSh0(fhKwh(vYh6תkh,vh]t!hhȫ:h(zԪL;hvDfh`H hd=fh>(hJ(hPH$ h\(hX(hL(hNϩfhP<hlީ/KhP_Mho-h,zU|&h ~U?Th(Uqh|UPZh,Ue4h:{U|Xh4U"h.UZh$Ur^hUn^h0U}h*zUv^hUdfhUXhUShUxhUTh2yUQhU`hU`h@UZhT|UhRUZh |UhPU$`hyUSh6zUh U00%EvATADATADATA'h&|U̅hUph{U Sh{UhF{UvhJU^h{U hH{UhD{UK h8{U߱hN{UhL{UhB #   sRԀcommand input error9 sR&  INPUTERROR  sRԀsRo} sR&sRԀcommand syntax error sR&SYNTAXE sRԀsRo} sR&sRԀ''ambiguous keyword sR&(('AMBIGUE sRԀ'sRo}( sR&(sRԀ88no such device available sR&::" 8NOSUCHDEVU sRԀ8sRo}: sR&:sRԀPPdevice driver not loaded sR&PP*PNODRIVER sRԀPsRo}P sR&PsRԀhhunit offline sR&dd2 hOFFLINEo sRԀhsRo}  d sR&dsRԀt/tunit allocated to or in use by another user sR&xx:+tINUSE sRԀtsRo}  x sR&xsRԀdevice not mountable sR&BNOTMOUNT sRԀsRo} sR&sRԀI/O error on device sR&JIOERRi  sRԀsRo} sR&sRԀ'operation invalid to spooled device sR&R#  INVSPODEV sRԀsRo} sR&sRԀ(mount not supported for device class sR&Z$ INVDEV sRԀsRo} sR&sRԀ - incompatible devices for multi-volume sett sR&b)  INCOMDEV sRԀ sRo} sR&sRԀ656unit specified more than once in multi-volume set sR&j16 DUPDEV sRԀ6sRo} sR&sRԀg*gmagtape is not sharable, device in use sR&r&gNONSHARE sRԀgsRo} sR&sRԀ2insufficient privilege for attempted operation sR&z.NOPRIV sRԀsRo} sR&sRԀ1failed to allocate sufficient dynamic storageN sR&$$-NOPOOL sRԀsRo}$ sR&$sRԀ/failed to start ancillary control processor sR&66+NOACP sRԀsRo}  6 sR&6sRԀincorrect volume label sR&HH INCVOLLABEL sRԀsRo}""H sR&HsRԀ)")failed to set volume valid bit sR&`` )SETVALFAIL  sRԀ)sRo}$$` sR&`sRԀG(Gtape not ANSI or correct tape format sR&vv$GNOTANSIL sRԀGsRo}&&v sR&vsRԀkkF11MSG not installed sR&kNOF11MSG sRԀksRo}(( sR&sRԀ&device status changed during mount sR&"STSCHANG sRԀsRo}** sR&sRԀdevice not ready sR&NOTREADY sRԀsRo},, sR&sRԀunrecovered device error sR& HARDERRORt sRԀsRo}.. sR&sRԀ#requested density not available sR& NODENSITY sRԀsRo}00 sR&sRԀ#multi-volume disk not supported sR&NOMULVOL sRԀsRo}22 sR&sRԀ2parameter conflict with already mounted volume sR&.CONFLICT sRԀsRo}44 sR&sRԀ55volume already mounted sR&5INUSE sRԀ5sRo}66 sR&sRԀK(Kmount is not necessary for cassettes sR&,,$ KCASSETTESO sRԀKsRo}88, sR&,sRԀo2ono home block found or structure not supported sR&BB.oNOHOME sRԀosRo}::B sR&BsRԀincorrect volume identifier sR&TT INCVOLID sRԀsRo}<<T sR&TsRԀ!incorrect file set identifierm sR&hh !INCSETID sRԀsRo}>>h sR00%S>  ]AINTLOGERR sRԀ]sRo}TT> sR&> #IE.BAD - bad parameters $9  # #"IE.IFC - illegal function code $939  # #55IE.DNR - device not readye 5$9B  #5 #N#NIE.VER - parity error on device   N$9Z  #N #m(mIE.ONP - hardware option not present $m$9`  #m # IE.SPC - illegal user buffer $9Cy  # # IE.DNA - device not attached $91  # #$IE.DAA - device already attached  $9)  # #"IE.DUN - device not attachable   $9V  # #IE.EOF - end of file $$$9!  # #IE.EOV - end of volume (($9!  # #1+1IE.WLK - write attempted to locked unitl ,,'1$9  #1 #XXIE.DAO - data overrunA 00X$97  #X #m!mIE.SRE - send/receive failure- 44m$9y  #m #IE.ABO - request terminatedD 88$9  # # IE.PRI - privilege violation <<$9f  # #%IE.RSU - sharable resource in use @@!$9s  # #$IE.OVR - illegal overlay request DD $9Ba  # #IE.BYT - odd byte countd HH$9|  # #+IE.BLK - logical block number too larger LL'$9k  # #@&@IE.MOD - invalid UDC module number PP"@$9S  #@ #bbIE.CON - UDC connect error TTb$9&  #b #|(|IE.NOD - insufficient dynamic memory XX$|$9Y  #| #IE.DFU - device full \\$9  # #IE.IFU - index file full ``$9E9  # #IE.NSF - no such filec dd$9~Z  # #IE.LCK - lock conflict hh$9K  # #IE.HFU - file header full ll$93  # #IE.WAC - accessed for write pp$9  # #+'+IE.CKS - file header checksum error tt#+$9  #+ #N0NIE.WAT - attribute control list format error xx,N$9  #N #z&zIE.RER - file processor read error ||"z$9Zq00%EvATADATADATA  #z #'IE.WER - file processor write error #$9  # #)IE.ALN - file already accessed on LUN %$9.  # #'IE.SNC - file ID, file number check #$9x  # #+IE.SQC - file ID, sequence number check '$9ky  # #.$.IE.NLN - no file accessed on LUN  .$9nY  #. #N)NIE.CLO - file was not properly closedq %N$9  #N #s/sIE.NBF - no buffer space available for file +s$9W  #s # IE.RBG - illegal record size $9p  # #)IE.NBK - file exceeds space allocatedx %$9W  # #7IE.ILL - illegal operation on file descriptor block 3$9,:  # #IE.BTP - bad record type $9  # #*+*IE.RAC - illegal record access bits set# '*$9p  #* #Q/QIE.RAT - illegal record attributes bits set# +Q$9p  #Q #|"|IE.RCN - illegal record number |$9q  #| #'IE.ICE - internal consistancy error# #$98  # ##IE.2DV - two different devices $9  # #)IE.FEX - new file name already in use %$9`&  # #IE.BDR - bad directory file' $92  # #IE.RNM - can't rename file $9r  # #6!6IE.BDI - bad directory syntax 6$9)  #6 #SSIE.FOP - file already open S$9'  #S #mmIE.BNM - bad file name m$9  #m #IE.BDV - bad device name $96  # # IE.BBE - bad block on device $9  # #)IE.DUP - duplicate entry in directoryM %$9X  # ##IE.STK - not enough stack spaced $9y  # #+IE.FHE - fatal hardware error on device '$9&  # #"&"IE.NFI - file ID was not specified ""$9yX  #" #D)DIE.ISQ - illegal sequential operation %D$9I;  #D #iiIE.EOT - end of tape i$9!  #i #}}IE.BVR - bad version number }$9  #} #IE.BHD - bad file header $9  # #IE.OFL - device offlinew $9^  # #/IE.BCC - block check, CRC, or framing errort +$9  # #IE.ONL - device online $9_  # #IE.NNN - no such node   $9Y  # #!IE.NFW - path lost to partnerR $9X  # #::IE.BLB - bad logical bufferD :$9b  #: #U'UIE.NDR - no dynamic space availablef #U$92X  #U #x(xIE.URJ - connection rejected by user $x$9  #x #+IE.NRJ - connection rejected by network   '$9ZZ  # #-IE.EXP - file expiration date not reached $$)$9#  # #IE.BTF - bad tape format (($9  # # + IE.NNC - not ANSI "D" format byte count9 ,,' $9Y  #  #+ + IE.NDA - no data available 00+ $9!X  #+  #E <E IE.NLK - task not linked to specified ICS/ICR interrupts 448E $9kY  #E  #} )} IE.NST - specified task not installed# 8800%S @@[`Y@vDf@rmp@GP}@(@:t @v@T'@[`z@z7y@GVN@UZ@@:@nH@۪.@*@v*}@'I@[(}@[`@T*K@@@:_@ seh Volume InformationClass: ForeignClass: Files-11Class: ANSI labeled tapeClass: Unlabeled tapeDe|vice: Fileset ID: SETID Volume ID: VOL ID Volume label:LABEL Pack serial: BCD CODE Owner: [200,200] 4Protection: [RWCD,RWCD,RWCD,RWCD] 4Default: [RWED,RWED,RWED,/tRWED] Processor: F11ACP,& & & & & & & & Ε  5577 7 7 7 Z7y$G> (GVN,:t 87y<UZ۪. BN[`zP(Z[`Y\(zv~H(> ] UZ ДДДД$y  E Ae J(>]08v*}<JyRvDfXv\`T*KbvvzBP & & @ A N @ A N @ A N e0   .JD( ~!A*w VA, 7Ae(<DvHT'JX!hVv@RPRPRPRPRPRP De e  ED eAw  hvl@rnHvAw  `& & & & & & & & Ε 5(77 w P `[(}[(}(7y.G> 2GVN6:B7yFUZ۪. L*N'IT`GP}hl8|Z P Е  wP Е  w72 Е,  2Z $rmp*8>FTZbr:_Е]Е  wd&e   Е Е Е Е Е Е Е Е Е Е Е Е Е Е Е Е :_V05$&@`   & & &  f&& & Ε >[`(27y8G>  @(@z^@(@bY@DY@TJg@~@髺@U"@"g@+g@v@UZ@[`(@Un^@T'@zU}@[`x@Y@$9B@;@UX@t<@(@@@bx@[`@Ux@̫@TQ@z/ZX@~@U`@{^o3@[`z@@6T:@f/K@UZ@7y@b]@vS@@U$`@@zTS@$9@۪.@^y@U@U'@b^@$9^@@|@{^oM@Z@ܪ@v*}@[`Ba@zdz@i@@f}@'xx@G@@#@N@ff@U^@@@$9Z@?M@@b#@:d&T@?"N@b"@@ ת8}h  |7 7 5]     $7 % $7 %v5% 7 [`("f}$f/K(תknL` .:@N?"NT?M^U_۪. db"f(lntx?"NHxw% % ?M?"N?M"?"N$(?"N*.04(:{^oM{^o3 <(B{^oM{^o3 D("P# @7 7z(v {^o3(N vNv"~ $v*~,v0(6v<N>vD~FvLv<55 |Un^۪.  vS[`x[`z ([`Y(Ux۪. $*$9B,7y0|UPZ۪. 6$9^87y@ & 5"5F1Q$AACPQ$AP  U|&۪. UZ۪.  Dt"g$^&(,=f0^y2(8v*}Fv*}Tܪ`v*}lܪp̫x6T: w&76% eP .0UH57 ,~Z $4G:GBvFGHLRXt<Z;^;d;h;nbYp(v(85@5 55 &p5Հbx(bY((|.b^0((JNNNPvV#Z#\vb~dvj~x[`Baz(&5p5p5&wA &wee b5b b] (bX(*[`(,(8ff `UZ۪. f7ylpYtvx|f/Kb(E5U50 55e ׇv*}dz[`(dz"d&T$'xx*TJg,04[`z6(D[`xF(L髺NVvDfF.% 5% /%)% %%~$97y7yU_۪. 7yU'۪. &7y*Uq۪. 27y:7y>UX۪. 8%% z7y~U?T۪. 7yUi"۪. 7y U`۪. &$9B(7y,|UPZ۪. 2$9Z47y6w-7 Z ~U"۪. U^۪.  v&U$`۪. *U۪. .U}۪. 2U^۪. .w 4$ eee e%7  @ 1 1 ,DtZbnTSptx@$ 00% S @^@{#@8}@{U|X@ީ/K@DY@TJg@z髺@U"@"g@+g@v@UZ@:br@,5R@T'@U}@[`x@Y@$9B@xZ@(@z@vy@S'@[`@̫@TQ@UT@:t@[`z@@E@6T:@f/K@UZ@7y@zvS@@U$`@@TS@۪.@yUS@U@yJg@$9^@@v@,f@Z@cVN@zi@@dz@'xx@:w@@@$98@f&&@:x@U^@@@$9Z@d&T@@ ת'h  @  \  5]      ~ [`(f&&f/K"תknL` (4yT6vy:UT۪. @BvHN$98P7yV$9^ X7y>p 52wtt$9B7y |UPZ۪. $9^7yU|&۪. UZ۪. Dt&vS,^.(8S':vS^ 5 2   5{U|X۪.  yJgy,  vy[`x(yUS۪.  $ *v.TS06T'8>D6T:JYNn5w > S M  F1e|[`z( ,fީ/KUq۪.  $ *v.TS06<6T:BYJZPvTXf/K^KwdKwNnP E5U0 50 5~ vTSTQ T' $dz&*[`,(2dz48@'xxDTJgFJX5& & & & Εx[`z( TJg[`x(髺".xZ2cVN6#S:{#DxwPU$`۪. TU۪. l  557 %   7 7@|U}۪. Dt[`z(,fީ/KUq۪. $(2U_۪. 8 LRS\RSbf|t ! .d  LD :)@+* E5"g ̫6T:vTS"+g$@(..תk2i@8+g d7yj*nYrvvdzxNU50 55t[`( dzd&T'xxTJg $[`z&(,TJg.4[`x6(<髺>H$9BJ7yN6 wm& & & & & & & & Ε~|UPZ۪.  $9Z 7yU"۪. U^۪.  UZ۪. &DY*8},v@7yFc> JcVN {z5s5 -5& & & & & & & & Ε XW& J)D P:w7y7y 7y(7y<7yBc> FcVNJ:tV7yfc> rc> U5U@& & & & & && & Ε =& & & & & Ε \{^~([`(,7y2c> 6cVN::xF,5RHީ/K`Ef7ylc> pcVNt:br>x t7y UZ۪. $987y$9^ 7y $9B"7y&|UPZ۪. ,$9^.7y2U|&۪.  b OzSODp:@KfaHU_@Kw@y,@תk@@yT@Uq@|UPZ@[`@Ue4@zDt@eg'@K#H(@(@=f@c> @^@KsHP<@{U|X@KHϩf@ީ/K@DY@zTJg@髺@aW@U"@+g@"g@v@?p:@[`x@U}@[`(@Y@$9B@KMH(@z@vy00% EvATADATADATA@S'@[`@K&H̫@TQ@/ZX@K<}@UT@[`z@@6T:@(@f#@zb|@f/K@UZ@7y@@K(H vS@@TS@U$`@$9@۪.@yUS@^y@yJg@zK6H@U@K|H,f@KHcVN@b@v*}@[`Ba@i@@zd@f@'xx@@@r@zff@9@KH{Uv@U^@K,H@@$9Z@{U @{U@:y@@@d&T@[`@{U@:KBaH{U@@ תh$<@"     $t$   5]      Y7 % O  7| [`(ff/K"תk (4yT6vy:UT۪. @DNU_۪. T dp:jaWr?p:~@7ytplh5U P5UB5U45U&5Uvתk@f#/ZX @r&ff,[`(.(:[`<(H[`BaJ(V[`X(db|f(rvSxS'zvSB5 5 5 J{U|X۪.  yJgy,  vy[`x(yUS۪. [`z (&,f(ީ/K,Uq۪. 0vS6Dt>JL70` 5"5F1Q$AACPQ$F1  >d8jvS v@+g"g"^$(*=f.^y0(6v*}Dv*}Rϩf^v*}jϩfn̫v6T:525 e  hR# |r  \nv vSTS[`Ba (* @TQBNTSPV+gX@bתkfi@l+gpeg'TD Lm)&5 % %  xc> 7y"$9$7y,7y0Ue4۪. 87y<U_۪. B$9BD7yH|UPZ۪. N$9ZP7y&  rU"۪. U^۪.  UZ۪. U$`۪. U۪. "U}۪. \ 6 .7  5ŀU_۪. vSU^۪. Dt6Y"vS(v,4f/K8<@<@&J J J    :ycVNc> 7yJHJ  v <@(zdP< <@ "7y*<@ .<@ 67y<{U۪. @{U ۪. D{U۪. w,{U۪. {Uv۪.  DY b tHzStHDB@Td@s@y,@U|&@[`Y@yT@ @Uq@v@vDf@(@z(@8}@ީ/K@TJg@~@髺@sΒ@Uv^@Ur^@T'@[`x@Udf@UX@w*@US@zuX@(@@vy@S'@nH@ɪe@U`@[`z@@T^@s(@f/K@UZ@~@zb]@UZ@vS@@@TS@۪.@nH@ly@\f@yJg@b^@d@y@v@,f@znK@cVN@|U̅@v*}@SS@[`Ba@Df@'xx@@oM@@u@S@$98@H;@z@#@N@u@u@W@o3@`@{UK @@b#@d&T@@@ DK h TMTMMMSMFDYw!@AU% f&%yN  N~ ~ # o3oM v*}"cVN$W(vDf4W(D[`BaF(Lb]b#b^ N(V|U۪̅. $%CT tUq۪. Ur^۪. Udf۪. v*}{UK ۪. US۪. U`۪. 8U|&۪. UZ۪. UX۪. 2b zS zDD@Td@s@T@:@U|&@R@(VN@ @(@:@H$ @(@SHX@zީ/K@$9Y@髺@+g@<&9@<@v@$9Cf@:br@,5R@[`@$9f@#l@$9B@$9s@zKU<@Gd@vP@y@@y}@K<}@$9.@:p:@/@[`z@$95@T^@"t @s(@z(> @<@(@E@\G^@GVN@UZ@~@7y@@vS@$9΅@sP@s@*y@z@Tq8^@v g@J@T; z@۪.@ꨤ`@{lQ@#@Y@Y@$9^@d@y@v@i8^@zcVN@'I@v*}@;F v@Up!@zd@[(}@'xx@lK@<.@x @@@ w@:$@z|T3S@$98@@H;@@G^@*;@U^@W@W@:y@U@8@$9:@`@ah@zx@3I@(}@d&T@?"N@:4F@$9z@Sp@@ 6 hDth4תhDYhYhRsZh>ɪeht̫h6T:hhZhi@h&9h<@  Please mount volume on : and UNStop (MCR) or STARt (DCL) : and RESume (MCR) or CONTinue (DCL) when ready or to#| reject request  &f     5 &f @  j /*;F v.v g2vP4;F v8~t7> </DTq8^jsr$9Y x$9  ~$9f      f T    B #f h$9^ :p:0Tq8^D;F vHvPJ;F vNxT"t d;F vl~p;F vtv gxvPz;F v~SHX$  -$ ~ &5"5   5 75 n;F v$9:s y}:y}@lKBsPHDJs(R(}00%$ EvATADATADATA^Jd$9ffsjDls(r+gv#xs<}    ( S ( ZA9 0 $Ds $9΅ s+gT; zs*+g.#l2T; z4s\ݪKz. @`55 77   d&T"'xx([`z*(0Up!:ԪL;>|T3S@UŞFUŞJvLU"P髺RU@8XԪL;^ԪL;bUp!flԪL;rSMtԪL;xԪL; w! U%AM  2   w! U%A5 A Bm5m~SM v*}cVNW wvDf W(@v*}DcVNFWLvDfRWZTh$9^ j7ynvyz{lQv B!55 M& & & && & & Ε ]5|x \G^G^Gd 3I&,5R(ީ/K:7y@c> DWH:yT$9 V7y^,5R`ީ/Kf7yp[`r(xE|GVNv5sP   P ННȝХ0 Н5DP &?p <&9EE"?"N&?"N,06Jv*}Nv*}Rv*}^v*}b*yd'IjDvEn&   kP& & & & && & Ε q5-Nn [(}[(}k&E4E:7y@(> D(VNH:$T$9sV7y\7y`U^۪. f*yh'I~vSw$w X=S& </& & & & & Ε ,& & & & J vȫ:",5R$ީ/K4c> NET7yZc> ^cVNb:brt7ytf& & & & & Ε JD); .  c> cVN:4F$c> 07y6c> B|UPZ۪. FU|&۪. Vꨤ`\$98^7yd$9^ f7yj$9Bl7yr$9zJ &  ) &w :7y $9^ 7y"c> .c> FUZ۪. <@r Wte5ep 5&9w 75w5wxwn5RKU<*;'I <@&H$ ,H$ 2H$ 8H$ @(\zd|ah~(U &7w`5 wL 7U E5? 0000zd:B'@yH:JK<}V*;X'Ir;F v0 0  p` 0l0L0e0l0Lls3l3 & `3l3 s3l3m30e0l0L` t p`p`p`0  p`0 0 0 0 UE4 4 7 vK<}|R~K<}. %%>$9΅ s$9CfsYK<} Y"K<}(:*K<}Pb tztDDs@$9s;@~@~@z}@@/@s@$9΅@T; z@Uq0a@ bJh f50(f    A U @e D$9s;s~@~$9΅ s$/8z}@DsRT; zTs`Uq0ahb Oz?TaODs@:2@sΒ@7y@۪.@S4xH[(}@  VNhϪT`h˫shyh  "WSEIF???P 6N&f%wp%7 wT 575 7 w5@ >ѕ ѕ0s2sΒ6۪.b7yl--5xѕ%5l ÝÊѕ-5PE5< ѕ-e Ê5% 5@۪."۪.Bvѕ,ѕ ÊΥ` Ê& & &  f& & & Ν  & & &  f& & & Ν (L:2  l f5bEXT3&@f?&%| &  ɥT ɥVɥ:2^[(}f[(}H00%, S HK&H d&T@;<}@ WhXhisrhkhKh*ishh>ݪKh.2h zShShsΒhhvPh$ "h;F h"~h(7yh v gh&ih2 h8h#Kh Lhz'xxhfhrhh,iVqhsRԀsR&VsRo}(U0h~Uh$UshUthUw*h~UxZh }U'h zUi^h"Uv^hUhhyUQhUhUYhUph{U Sh~U8h&|Uh U^hU_h{UpqhSTԀsRn}"۪.hsRp}p (>  `  ``)?         t  L:' (,:2 6D:q!J X\:b fhtt:rz JR  2 : (,/&{t 048z  & >C  ;F4  24z} ;"sRԀcommand input error sR&  INPUTERROR sRԀsRo} sR&sRԀcommand syntax error sR&SYN sRԀsRo} sR&sRԀ''ambiguous keyword sR&""'AMBIG sRԀ'sRo}" sR&"sRԀ88no such device available sR&22" 8NOSUCHDEV sRԀ8sRo}2 sR&2sRԀP,Pdevice not Files-11 directory 00%4 EvATADATADATAstructured sR&FF*( PNOTFILES11 sRԀPsRo}F sR&FsRԀxxdirectory already exists sR&ZZ2xDUPL sRԀxsRo}  Z sR&ZsRԀfailed to enter directory sR&hh:ENTERR sRԀsRo}  h sR&hsRԀfailed to create directory sR&xxBCREERR sRԀsRo}x sR&xsRԀwrite attributes failure sR&LATTERR sRԀsRo} sR&sRԀvolume not mounted sR&RPRIV sRԀsRo} sR&sRԀprivilege violation sR&\IE.PRI sRԀsRo} sR&sRԀ(no privilege for attempted operation sR&b$NOPRIV sRԀsRo} sR&sRԀ$ $I/O errorR sR&j $IOERRORR sRԀ$sRo} sR&sRԀ--incorrect volume label sR&r -INCVOLLABEL sRԀ-sRo} sR&sRԀC CI/O errorV sR&z CIOERR sRԀCsRo} sR&sRԀL#Lvolume is single directory only sR&LONEDIR sRԀLsRo} sR&sRԀk#kfeature not currently supportedR sR& kFEANOTSUP sRԀksRo}   sR&sRԀ!Directory not found on device sR&""NODIR  sRԀsRo}""" sR&"sRԀFailed to delete directory sR&22FAILDELV sRԀsRo}$$2 sR&2sRԀ(Directory not deleted -- files exist sR&DD$ILLFILE sRԀsRo}&&D sR&D>>66 STԀUFDu sRn} STԀJJ3 7 `b 5D5 <508055\ `& ,0s8b>;<}B# V  j~ pE%@5"75 5@,t   0 4 :Hl6pXd&T`ud\fflf2@e    ȋw$ 5ZE%`w%T&N 썜2 :RX  p   ׭--j[])-b<>% ,f UC 8R  UP. p sT; z$(GP}6GP}@L   U U U w 65= ww F w 8w 0,wC; "9x(9x.9xdl)8 rz,Pvŝhw \WWw Dw \5 $9f  \"$9X&  ,$9f0 4 T<dTE@TDT :=RWEzr Tr Tr T(r *2r 4<D :=RW E@Dzr r r  (r *2r 4r : <[]>,<L[. .!] . r  " "QX*W2: B JQLSTQVS\L d. j.,B4.> ]. .!> . 4.Z >2 4 > . . 4&Z dj ̫e j\SY7 ]]AɝB % W Qw L " XSSSS(S.SDisHiVqTisb vzxD,vDs@:G@AVN@$9p@:s@:s@UZ@7y@A> @۪.@[(}@$939@:$9!@$9L @ ūD,h۩Kx6dh ۩K)VV X&?&%| &  ɥT ɥVɥH ѕ>ZwX%;>˥h ۩KX[(}$[(}H[(} R۩KZV۩KX ^۩K b۩Kj$9L lspUZ۪. vs |۩K| ˥ ˥/ /˥ ˥  % V }є -y %  V7 V_$T2۩KV:$9p R۩KXs \۩Kb$9L fUZ۪. l۩KVr۩KVv$9!XZ& &f& & Ε 20& & & $XZ& & Ε $& & & & &f& & Εp۩KX ۩KZ7yA> AVN":s.$93907y@۩KX D۩KZJ7yPA> TAVNX:Gd7yx7y~A> t `-  1 VBBC& ˥"N ˥ ˥  ѕ ɥa00%D EvATADATADATAPAVN :sUZ۪. 7y"7y6$9!87y>7yD۩KV J۩K,ɥz ђ w  ۩K۩K"۩K2b OzOD:_@:@ 2VNh db\}h d dbt!h0h  d ?????? --->MODULE : XXXXXX &fe %F,,777 ̋  --->& TI& & &  ` d  d,04 8 >:_HNV\f2|& & Ε (  :$nSb zy D`s@:2@H/@GP}@:@# @;F4 @?T@:@yh* Gh*\hh @rhrSfahNrh<Dhh8`hZh %P(h@h0?Mh?"NhiVqhR̫e \ ;<}h)(   ,H/HHw;F4 f((DDF FRRV V    44D DCPRSX$FOR_)SY0CPRSX$ODSDEALLOCATE/GENERIC/ALLCREATE/DIRECTORY /OWNER_UIC=[/PROTECTION=(SYSTEM:OWNER:GROUP:WORLD:ANALYZE/MEDIA/LOG/EXERCISE=(PATTERN=/RETRYINITIALIZE/LABEL=VOLUME_ACCESS:"/ACCESSED=/DENSITY=/EXTENSION=/FILE_PROTECTION=(/MAXIMUM_FILES=/LABEL=OWNER_IDENTIFIER:"/STRUCTURE=1/WINDOWS=/INDEX=BEGINNINGMIDDLEENDBLOCK:MOUNTEXPIRATIONIDOWNER_IDENTIFIER/OVER=(ACCESSIBILITY/NOHDR3/NOLABEL/NOSHARE/NOWRITE/PROCESSOR=/SYSTEM/BLOCKSIZE=/RECORDSIZE=/FOREIGNANAL}YZE/DISK_STRUCTURE/LISTDISMOUNT/NOUNLOADPRINT /NODELETE/COPIES=/MULTI_VOLUMEUnable to translate executive vectorsAUnable to get command lineSyntax error or unsupported commandDAUnable to access device to mount foreignDirective error = %QE\%wPw8X 65 #  `BR& TID\s&.s6:sBsF R̫e V# \z6& & &  f&& & & Ε "E & & &  f& & & Ε  $&:2>BFJ?TZl:2` ̫e  ALL ̫e V z&  V zDEA ̫e  &  UFD ̫e  &    BAD ̫e && &  HOM ̫e 22B &  B INI ̫e >>B &  B MOU ̫e JJf&   fVFY ̫e VV:~ &  : ~   DMO ̫e bb j &  j  $$PRI ̫e nn$v & $ v  (( ̫e z>z8:/ =/ 00%L S=::t=: [,, Q > : t  ,2~ 46< >@H P &,](!, ):6  d   "W WSYSTEM ̫e  W W ^ ^OWNER ̫e  ^ ^ d dGROUP ̫e  d2 d 2j jWORLD ̫e  j` j `pp ̫e F:=RWED :=RW u, , ", $,, .<, ><E@D :=R6W6Eu, , , (, *62, 46<P6D6 :=RdW dE@dDu, 6, 6,  d(, *d2, 4drd 8:@ <[]>,<[. !]  . ]. , d 8 @$, 4 <Q >FQ HN V \ dj2!>  . >8:/ 1    "8*   qqLI ̫e $$q ! q 4   t tRETRY ̫e 00t ! t 4   zzPAT ̫e <<zx! z 4 x ~~UPD ̫e HH~ ! ~ 4   OVR ̫e TT !  4   ALO ̫e `` !  4   MAN ̫e ll@ !  4    ̫e xLx= :8:@`/ S    Q (Q * 28 <@D  ACCESS ̫e !  4  BAD ̫e !  6   DENSITY ̫e !  4  EXT ̫e !  4   FPRO ̫e ئ^)  4 ^  INDX ̫e  (!  4 ( INF ̫e  @!  4  LRU ̫e !  4  MXF ̫e ""!  4   NAME ̫e ..!  4  OVR ̫e ::00%T EvATADATADATA!  4 N  OWNER ̫e FF!  4 N POS ̫e RR!  4 R PRO ̫e ^^ ^)  4 ^ UIC ̫e ll@ !  4   VI ̫e xx!  4  WIN ̫e !  4   ̫e =""= 800 ̫e $  $  1600 ̫e $  $  6250 ̫e $  $  DOUBLE ̫e $  $  ̫e R.==:":t"=::t   Q .Q  *0 2: 4t6 <BL N: Pt=2=( Q 2 BEG ̫e **    MID ̫e 44    END ̫e >>    BLK ̫e H H    ̫e PXP: Xh()( 6 X L "h, .4 6< DL FPH ^) ; DE(F,  )  :   L  &L ( 2D :EBQ DF F L N T Z, ! * ` , X " "> 0" 0! /g   * " $ ,X 2 :> @ B0 H J0 P X   ACCESSED ̫e TT !  4   ACP ̫e ``&!  4 & BLOCKSIZE ̫e ll* )  *4  BS ̫e zz* )  *4      BYPASS ̫e  !   ' 'CACHE ̫e  !' '--CARRIAGECONTROL ̫e  !- -==CC ̫e  != =@@CHA ̫e  !@ @D DDEFAULT ̫e  !D DL LDENSITY ̫e L@4! L 4 4 TTEXTENSION ̫e T! T 4 Y ^ ^FOREIGN ̫e !^  ^ 4  f fFPRO ̫e  !f fkkFILEPROTECTION ̫e  !k kz zHDR3 ̫e !z z 4 L  LABEL ̫e !  4  LRU ̫e  !  4    LOCK ̫e  d  d NOCACHE ̫e  !  NOHDR3 ̫e !  6  NOLABEL ̫e !  6  NOSHAREABLE ̫e !  6   NOWAIT ̫e & &!  NOWRITE ̫e ,,!  6 00%\ S 7 t "5 ѝѕ"5  ~5  @ 5  ":Vf:t B5r   @. 5TO  Z  v~ѕ"5@ O V ,5 B B@  :4OBbOvB6 5 0L $~5 5 \ H t5  @ & & &  :L4J\br: && Ε  165 ѕ LJ >Hѕ B~0.Д~Е:&& Ε& Ε05`lt.` ~ |[& LB Ӌ & & J&& Ε  f! * ѕ "*<DJJf!jr*~ ѕ:AD AD p J (p `ѕ VB@  6 2vZj~ R5 B5ѕ/ .5 5ѕ/ 5 5  ~5 &6JZj\ $ P5@ 5p  @\ 5R B @@ 54  00%l &p :LO`t*/- 5 [ N VBCД~ fA Е:&& Ε& Ε) $& LB$- N(V0B:_LT Ӌ CCf& Ε (AD [ f& . &,Nfv4zȋ# 5ѕ/> 5; 5p E @ AD V  ~ RWED ,><;LE\:bj *ѕ,r ѕ,y ѕ, ѕ)  <1Q ~@ Е,E ѕ] "jr"y.D^:p:zw&feȥ ȥ ȥ/Е L~JB~ /:& & & J&&& Ε  "% 5 4JXJ:ѕAѕ0%ȥ$ ȥ0ȥ7ѕA &f& & & J&&& Ε    CRJDrJ   6@~ @ ѕ:GP} ,:ѕ,y ѕ, ѕ)  <1Q ~@ Е,E ѕ] "jr"y.D^:p:zw&feȥ ȥ ȥ/Е L~JB~ /:& & & J&&& Ε  "% 5 4JXJ:ѕAѕ0%ȥ$ ȥ0ȥ7ѕA &f& & & J&&& Ε    CRJDrJ   6<0b ,: ,8^? p:? a q 8T DT f f Cy] !\ *}\d\:d_dad}kvLqH64ZX]^]U<]w(lw(lw(l:x(ly""Xk@V]hV]V]V][MM]M]L!`T]&$yr'`T]kV]@V]hV]V]V]nv!:_MSYabY]K=]!Z!k#$S$"$;$sw%&$:)i)t)q)|-wH-xH/|3U<3<}3쏉4Ҟ5]\5_\<T<aT<&aTk\as ""]skv]rN*}#vDk<kk$ks%2k&TU'vK]!htr!Bx""""#X""K'""K'""\M'(""oYX""\qX""w""7x"" #} #n'N%Ps]%Z%Ps]&#*l&']&y&+&H+x'g'x'8*lx'p:,x'#vx'#vx'H#vl(kE,zK,/,3, ,,%,&,!,t:,:,xK,Q,R`,p,Bx.\p#0$S$0f%0Ps-0e^00sw2030U<{3g 3&3Z8]8xZ8v*lJ:LO:!\O:*}\W:[:b<]r:L6r:L6r:Q8r:04r:O4s:Xuru:Xu]u:u]v:Pv:Wy:/"]y:0"]y:}:&y:=:@*:@:(}:::k:k:8O;@q<:T<\}<<z,8^>D5bV&@"bQ@"bQ@"bQ@"bQ@"bQ@5bZ@"bQ@"bR@"bR@a@"bCT@R"bOT@vK@&b8@&br:@&b@""7x@r:Q@ L,8^h %  -w  7@ B EQ ~ 0 e B af5bZ&br:5bV&&b85bV&(&b8*&br:.&br:6"bCT:"bQ>"bRB&bF"bOTJ"bQ^"bQl"bQl| ~ 0  7  P7w7 7 - 1P|"bQ"bQ"bQ"bR("bCT,"bQ0"bQ2&br:6"bQ<&br:@"bQD&br:F5bV&J5bV& N5bZV5bV&\"bQ`"bQf"bOTl-  e e 7 7   7n"bOT5bZ"bQ"bQ"bQ$"bR&"bQ*"bQ."bQ:"bQ@"bQDaHr:QN&br:VvKZ""7x^"bRh"bOTb ObdaOD; @$sw@5b(@; @$;@a[@ dah    F;  a[$;$sw 5b(; ; a[$;$sw b Ozd}OD5b%@<%@)Bx@-b%@)@9z"&@<%@46@4R4@y@)p@}Xf@2?z"&@ Rd\:h<d}hd_h& V ppw7 7  7 7  f?z"& 4R4}Xf))Bx )p$)p(y,-b%05b%4?z"&84R4B<%F<%J9z"&N46b Vrx(VD <`  4vha h ahr:Oh r:0h6h 46h4R4hb tzytD3qX @5bV&@&b8@a'@w@s:Xu@&$y@sq@sPs@w*@4R4@&@ dyh h 7   ,  eB B ` la' sPssq&"5bV&&w*05bV&43qX 85bV&""#hrYsh rcsh" | . w    %%%-v  ywe[q$ #}2"">""F""L""\MPT""X8^#bwRh[:b<n#""ryxyxxCEDE ! 7 jҋ |   7 ťť  |v:P)Ty a"&)Ty ""K$""K:BE,zKFگfJa"&)Ty Nv:P)Ty T""fkp:lv:Ppk$sw r)Ty ťĝ Dĥ ĕ ĕ ĥ  @`֥ Va"&a[ )Ty)Ps)Ps*3b<}>v:PHk$sw @)TyF)WJ&{W Za"&^5b(ddah3b<}la[n)Tyra'b Vz[MVD5bV&@L@"bQ@"bQ@"bQ@00& EvATADATADATA5bZ@"bR@M@a@"b:T@&b8@""w@2yL@r:Q@ FLX -- File not found FLX -/- File already exists FLX -- Bad response : _n&he   B  T-B h Zgkp: Zg_4kp:87xk>:brB< F<\}J~ FZgXZg"^Zg,bZg. fZg Zd 3  $ НННb Zg Zg:t $:2*:2:t 8:2 :Zg>:s @ZgD:NfSRfSVfSb NZ<aNDa@ Zg <h: Z<ah<&ah Zg  :^5<"fE fE CE]eH Ef e Е ~ ZgJab O2kOD *kh .  rt r< ehb 0zs0D,@jz@""\q@nL`@4@5bZ@#0$S@k@a"&@k`@dzy@az}@za'@7x7@{3g @Y%:@&$y@sq@sPs@^@aXz@""7x@ Cy@MX!@w*@_X@""@r=@@=00& p 4DsPsNMX!Pa[TMX!Va[^^b""7x( b 6Vzr6VD5b%@5b%@,@5b%@5bV&@""\q@"bQ@"bQ@"bQ@"bQ@"bQ@"bQ@z4@5bZ@7xk@@#0$S@Z&@fk@k@k@}@a@a"&@5b(@a@Ȅ`@z""@k`@)p@dzy@"b:T@"bCT@:br@-b%@)@az}@-b%@a'@7x7@a@Wx@zY%:@Wy@[<}@}@y:}@ Cy@_X@[W@""@=@@=@[@r:Q@-b*@T[_@r6@4R4@a[@V@)p@?z"&@T[a@:@sr@@ Zg: rh Zg :@00 7 w. Www 7 @ȕ DePB~l#0$S#0$S=44&_X,k85bZ@sr@DVH""\qL CyP""VZg`dzyf@=na[z| ĵ7   ˇ Ȇ7  7e77 7 az}_X_X5bZ sr@$a"&(a[,,85bZBy:}Fa"&Ja'Na[RfkX6\"b:T`"bQh"bQn"bCTr"bQv"bQ$ ~-7Be77e7 7 e .7m 5tr:Q "bQ4R45bZ 5b%&5b%.-b%45b%:-b%@-b%D-b*L5b%R5b%X-b%^5b%b5b%p5b%t5b%|a'n1"1,51,111 (  ~ I% e  e Wx[<} [W[WWy[<}$[*[W.[W2[85bV&FZgJaR5bZX5b%`5b%d5b%j5b%pT[av-b%(7m   w Hp 7? ڇ ~%V b-b% -b%ZgY%:""$Ȅ`(4J5b(P5b%XT[_`-b%fat5bZz5bV&f  @ m@  wa e r rWpH p e$eTB ~pr5bV& 5bV& k"bQa$5b%*5b%J?z"&N)RaT)pZ)p^}dal"bQz)~az  w4 7   7 w BJ ߇  B~D 7!~)p )p}Z&"""""&""*5bV& .5bV& 4a8"bQ@5bV&Fk`J7xkP:brTa^7x7dah5bV& ^X 7 BJ @ mD    mLAwf5bV& 5bV& k`7xk:a(7x7.k2"b:T<"bQB"bQHaL"bQPr:QT"bQZ"bQLb Vгz*}VгDkHx'HHR8}HyWHFOD@tHLH HܪH ovHx'Hx'H*P8}H hJh`*}h lC BM M M M M V PPDL(LPQPMiMXYYSSUZfFODjFODpb >zkk>D,8^@a N@ak@r:L@$b@$b@$bt@<@<@$bB<F<J,8^NakZa N"b tـzkstـD""\q@@aKq@Z@%Ps@J:LJiTZk>D:@r:L@<@sW@7xkB:ByL7x7P~x`TTkp:X7Zf\^`jb`w V ~  (&      ~t sf`Tk`a*7x7.:20a8k`<7B7xkJ5bV&Tb7xkr7xkx7x7~:!d   ~ w  5<  7 z::!:By k`7a/""""7xk&:!,7x74zx`T8zx`T"bQB"bQRaV5bV&Z5b%^5b%janyZb =Vҳzx'=VҳDf@<<}@ywe@x'p:@yv@,@ x'p:$yv(yv,yweB,HEyNfb :Vz&:VD3qX @&y@l(k@az}@{3g @Wx@ZX @w@y@sq@Wy@[<}@[W@2[@4R4@ &Hh8&h ~ 5#/7m5557mem75t,t,5t, 3qX  4R4 &yw@y"l(k(az}.Wx0[<}6Wy8[<}@&yH4R4Lw@yRWxT[<}Z[Wb[WjWyl[<}r[ z    sq 4R4{3g ZX b Vгzx'p:VгDS@fS@x'g'@se @x'8@k<@ 8T@X@5]@,v@@r:0@"[(}@ x'p:h    ?Ux'- E#|&f00& p x'g'Br:0Lr:0P,vXfS\,v`[(}dfShSrfSv 8T|=wFWp&m%5 lwH% EE ~wPtr:0 r:0r:0r:0"se .r:04r:0@r:0P5]Vk<\se bse hse nse ~se  ~ ]Ur:0se b Vz'p!VD:@sI`@sO`@5bV&@[M@5bZ@sA@,8^@:BjzD:HSXzJW:N8xZXjz\jz`SXzdkndzyt@=zjz~aXzt 4 @ @ D B57 :5@9P45%  %j%@P55B58jzaxz e^xZ6 B NjzVk^kfk    w5  E  55@ 5w w ׁ7\ @V""v"""@V&"",hV0"">8B""`SXzl~sspJLv~sk~ayl5$555U@ 5  U@U@BeB~5hSXz_sC&:br,:4:8:BaXzJr:0Ls^RaXzZ:k^:kba[tJ:LvaH:|aXz27 7 @0h0f 7 8kaH: LaJ:LL(=,az}0rv~b Vϳz,VϳD:@[X@? a@ @:2@ f@x'H@ f@7xk@? p:@Z@x'g'@za"&@$sw@:t @k`@kp:@*}@W:@az}@a'@7x7@t@$"@L@[@ DT@z 5@ q@ @ 8T@)W@aXz@v:W@v:P@#@:w@f@@@_@ov@*x'@ ,h9wWh2 h%SY2 CD ŔE @a2%~? p: v:P? a q $"$sw "$"$sw ( q, qH Lv:PPv:WT? p:Za"&^a'b qd[d&w& & & & & & & & & Ε& 5 f&00& EvATADATADATAf&7 %CT  ` [X q [)W  [X)W < 5@:wNx'g'Z 5h 5rZ|_5  5  5@ w 55@  6E5B, B"j? p: W:Zaz}  ? a(aXz.? a6aXzB:L:R*}^x'dx'lov rx'g'\e DZ DUE |-x p%1, B A77%$%DT@@`x'H"f(f4x'kp:B? p:Hk`P7xkT:t X7x7bT#MF#MU%CT e& & &  f& & & Ε  ( f, f2 8T6 DTV:24b tـzr:LtـD7@< @@<8@7xk@<\}@ 0p B`~%A%%D$ 5 bk` 7xk7x7$r:0,?z"&4)8)p<)p@}Lr:0V-b*`&bn"b:Txd\:|8xZ5B 00& p :wB7x7Ry:/"V""7x^vb""7xfd_jk`ne^xZraxzzk`~4R4h^-      - - 5h5bZ#q~-q~?z"&-b%"-b%&-g*k`.~x`T65bZ@#b\}D5bZNaXzTkV#b\}bvKf""7xtb 6Vzy:6VD4v@<(@<%@<%@<%@7xk@Ȅ`@kp:@.@fTK@7x7@9z"&@zWx@Y%:@:t@<*@Wy@WBz@[Z@""w@[<}@v:W@""7x@@T[@[W@y:/"@Z<%@[@<%@<%@46@<%D<%H9z"&L<%P46T.~  6 7 7   5"!, ,5,5~a:b QzpLlQD<(@@k@; @a"&@$sw@; @)p@lLe @k<@}@ "Zg: pLlh Zg Directory : :h   BՔ ՔU~0p   ; <(; a"& )p (Zg0k$sw 4k$sw B)pH)pL)pP}V)p\k<`lLe (d0p  0p 8a"&)p )p})p)p )p$}b VztLu:VD<(@@; @a"&@tZ@t&@5b(@)p@lLe @3&@xLr@pLl@b?T@""w@}@3Z@mLu@%D. C :~-%  77 t@7ѕ ~- |5b(<(-   Bp @)TyBnLWD)'H)W[8 Na"&)W R)Ty`    7~)'}s')<&e)a)p$)p(h'.<&Kq0)6:t <Ѳ:@<&9B) NZgR:VѲ:\k,, 7 7 7 7 7 7 >kdzy@=45b(<%<%"l(k&ZX *irf2 b ;VzxLq;VD<&`@<(@-q~@K@f@%Z@<&Kq@`@[8@4@:@4@z<%@7xk@Ѳ:@f&@s@fk@k@l(k@<<}@s<@#q~@kvL@a"&@tZ@t&@z5b(@Ȅ`@)p@kp:@:8@.@fTK@)P@az}@7x7@9z"&@3&@ZX @:(}@?T@z[Z@)W@)p@:@v:W@}@ Cy@r:0@T[@-g@w*@_X@[W@su:@3Z@zv:P@s:DѲ:Jaz}P)Pd)px)W[8 |e!e 5f 2 eA  e 55j[8[8 [Z[8 "`(<&Kq<&` 4sT[4RD<%H<%L<%PȄ`Xdz<(~<%vU- Q    -   9( kp:469z"&B<%F-gJv:WNZgL<\}T<\}Z-b B-b J5bZR#b\}Z5bZ`5bV&h$bl$bt $bb 6Vza6VD7@"bQ@"bQ@5bZ@7xk@Z&@k`@)p@)@7x7@^@}@2""7x@?z"&@:@ jah n- B 7p 5bZk`77xk: "bQ("bQ,7x76^:""7x>?z"&B"bQD)J)N"bQR)pX)p\}hZ&l""7xb ORaKqOD$b@$b@$bt@sa@ .aKqh 2f&f w7 B&00& EvATADATADATA $b$btsa$b $bt$$bfb Vzay:VD,@@daQ@5bZ@z@a"&@5b(@Ȅ`@""w@ay@aXz@y:}@R@Y@n@a[@@V@V@^d@ ay:h xCC @7W  5 55 5 Yayaya"&a[,$5bZ4aXz<aXzB@VF""wPaXzVy:}Z\5b(`nbayjaXzpȄ`ta[6t EDw7:z5b(5b( ^d$""w(daQ,""w0V4""wb QzfQD:@5bZ@sk@ss@E`X@E`Y@s}@q`@q`@kk@ks@wa@"  5         V 5bZssBq`HE`XNwaTE`Y\q`b VzfXzVD!`T@SXz@jz@L@5bZ@@J:L@az}@[:b<@O:*}@TS@'`T@r""w@aH:@aXz@v:W@""@[@zf&>D:@sf@:@fk@:8@y:@""w@v:W@ Cy@v:P@:b NzfsND4@}s@@Wz@Ȅ`@Ww@Ww@Wx@Wy@WBz@[<}@r/qk>D,8^@ak@$b@$b@$bt@aXz@sk@<@ 2/qkh 6w&5   00& EvATADATADATA>< $bt$baXz,8^ak$<($bt,$b2skb 0z3qX 0DZX@nL`@\ @Yzf@k`@7x7@{3g @w@y@)qp@^@""7x@w*@:y:0"@f@4R4@ip@ v3qX h t  f e    f- ~w* \ )qpip")qp&f(nL`,7x724R4 4w@y:^>k`DYzfHZXR""7xV4R4by:0"f""7xjw* p4R4{3g b 7Vzsr@7VD\ @5bZ@7xk@Z&@}@n^@k`@kp:@n^@)@7x7@^@Z:@aXz@""7x@r:0@jsp:>D}@)p@""w@u:u@v:P@)Ps@$9!@ (sp:h ,  4v:P })p)p$9!)Ps&u:u*""wbb OzsI`ODL@[8@)@)@}s@)Ty@I`""@h'@<&e@)[}@""w@)W@jv:W@r:0@yL@v:P@)'@' q@Ѳ:D)pF$btJ)pL$bP$b8     :az} La' a"&)Ty)'nay az}&da*a[,)Tyb OjsaODa"&@)p@t<@""w@}@)@a0"@ 8sah <`   @a"& t< ))p")p&},)p0)p6a0":""w|b OzsfOD:dw@4@@)Ty@s@Y2:@WBz@[Z@""w@[<}@)'@sZ@*Zw@# @ Dsfh H 5w  b )Ty)'# WBz[<} [Z"sZ&s,42:dw6""w:Y2:>""wBZwF""wb OrssOD:K,@""\q@aKq@:@$b@$bt@<@:8BȄ`FLZz^<(d<(&dRRR  ~r(v:WfD:T)pZ)p^)pb}h)plse r<&a5v0p  & Directory [Partition:W a"&)p )p}   0p * a"&)p)p)p}xb 0zsA0D7@< @nL`@@ # VЕ.d  % b %e ee e P""w ,H. (@f e:  b 0zsk0D7@5bV&@nL`@@k`@7x@vK@&b8@$b00& EvATADATADATA@$b@$bt@sPs@z""7x@-b @sC@""@f@:k@a/"@:k@ X:: shs Nhskh X: : &    0   D%w7A7 w    :kk`-b 7"sPs&a/"*""0nL`4-b 8X:B:kH:kN:kR-b Z$btb$bf$bvsPs~vKd| -c we  8 07 d""7x &b85bV& &b8sC"sC&&b82f4nL`87x<$bHsCRX:\sC`X:b Ozs}OD7@s@s^@7DsCJa/"N""wRu:XuV""wb zwk^D5b%@5b%@5b%@5bV&@"bQ@"bQ@_@,8^@a@5b(@"b:T@-b%@b-b%@&br:@""w@r:Q@-b*@T[_@6@T[a@&'@ HyDh eT 7 @m"!7"=eKW     B~h6 "b:T"bQ$"bQ(r:Q,-b*.-b%8-b%@5b(RT[_\,8^`&br:b-b%f_jT[_n-b%~-b%| @m ?  B~ ?   @m  C$$ "'eW h,8^ -b%-b%5b(&br: _$5b%(T[a,5b%8a>5b%F5b%LT[aT5b%Z5bV&^5b%j5b%T    B~  V T[a,8^&br:5b%a"T[a&5b%65b%:5b%@5b%DT[aH5b%N&'R""wb 8Vzwt^8VD5b%@5b%@5b%@5bV&@k@"bQ@"bQ@"bQ@5bZ@"bQ@"bQ@U<@z5b(@"b:T@"bCT@.@-b%@a'@~@#b\}@""w@aXz@""7x@4(@-g@[W@r:Q@Z6@4R4@""wF4(J""7xN5b%R-b%T5b%Z5b%^?z"&b4R4f5b%p$C~e"- , ,  ~z.5bV&5bV&F5b(L&'P""wT4R4Z5bV&l5b(dNe - 5 W  5 rw w\a'[W -b%5b%?z"&5bZ*aXz0kJ#b\}N5b%R-gV~^U<b""7xb tzwatDWW@y@5bV&@W@5bZ@5b(@Ȅ`@s@se @az}@a'@k<@rsPs@""w@ay@s`@v:W@%y}@yG@n@y}@y}@V@ wah ^55 ŝĝw7$Q$$P~77777~a' v:Wnayaz}Ȅ`$Ȅ`*5b(.5b(@WWW D5bV&H5bV&L5bV&P5bV&T5bV&Xk<Z5bV&JZ5xx7 x ~5bZ az}xse 5bV&sPs "$s&y}(*,%y}.y}0y}24yG6y8:<>@FV w""ws`b Pbw`PD""\q@%qf@tf@irf@hV@V@ @w`h00& p VB""\qb Pbw}PD""\q@ts@%qM@irf@hV@V@ @w}h D5 5E E    ww,irf %qM2ts6hV:""\q>VB""\qb Vϳz7xVϳDs@n`@nL`@n^@k"@k`@n^@p @ywe@4w@$95@""@* f7hB7xh7x7h> jpppp&-1 w 7 ʋ bn^ nL`nL`nL`s$95.k"2""6k`@yweHn^Jp 4w Np Tn`b 6VZ~x`T6VD7xk@7x7@$9!@:Fy@ 2~x`Thzx`Th* 6f W7xk:Fy7x7$9!b :VzyG:VD3qX @5bV&@L@!Bx@X @&y@k`@st!@vK@{3g @w@s:Xu@b&$y@)qp@""7x@MX!@w*@!ht@4R4@ip@ xyhyGh |7 7   ww @@# 7`   =Cw|L!BxMX!MX!k`3qX  4R4 $&$y*&y.MX!2!ht>!BxL&yPs:XuV4R4^{3g d!Bxn!BxxvKx f W %Ew C $ Aw    &  d""7xst!s:Xus:Xu4R4"&y*5bV&0!ht8s:XuF5bV&N5bV&dwl{3g p4R4~4R4EW"El  5El    PPW  e   ds:Xu(s:Xu44R484R4wBw*FfsLYzdPf&V^B""7xb 6Vz_6VD5b%@5b%@@5bZ@7xk@Z&@k`@)p@-b%@)@-b%@7x7@J^@}@""7x@?z"&@:@ n_h:ah r %7 &  D & ~ 5b%5b%5bZ?z"&")&)p,)p0}8Z&<""7x@D-b%H-b%Lk`P7xkV:b7x7l^p""7xb 6Vz~6VD<&@5bZ@7xk@k`@az}@7x7@:@5]@""7x@<&(@y:/"@[(}@*5_@:@ h~h - +  C-      - 85bZ&k`*7xk0::5bZN7x7\y:/"`""7x|5bZ|e 5@  3 3 3 33 f&fE reF 5&[(} <&(az}.<&(r5]~5_t A#A&&e# # #   e e  33 33 w&:F[(}T[(}\[(} b ;Vzؙ;VD,QHaH!H %0PsH`p@<&Kq@Hn`H:H-xHH fH(nL`H z-wHH#$SH20Hn#0$SHf,BxH 3H,R`HSH# z@<&9@)iHn^H)tH$swH,Hz,&H,%H:br@n^H00swHbyH,!Ha@,t:H,:H<&e@)qH)|H,xKH4wHz$"H DTH%$;H qH H4ҞH,pHr:0@30U PVVBB <&e <&e  6 6DDpp:tt <, , x'@8((SY2 2x']FFSYP P NddTIIDDEDILIZERUINUVSP FC@FAJFBJIMJCOBL^BSNVEZ "*,R2:$$nn ~Be  zv a"&$swaz},"5bZ&.*V.""w2$4>68$:$<>n@nDr:0Rk`V7xk\:t7x7z7xk|W,%  U eB C~eB    %  (7xk$LE(""wnt~7xk ·E C ~Ae @ ~ ~@< e 0 e VT7x7 7xktR C   fWpeAaP w z C CS8 k<0kDk`H7xkL7x7^r:0pk`t7xkz:8 5 ?eDAD eD B eCeD $D & 7x77xk<t7x7zL}~""wl CB   4 * 5  5k` 7xk:t7x77xk :$5bV&.&br:27x7:k`>7xkB:tF7x7L7xkP:yTe^xZZ7x7be^xZh7xkl:wp7x72 H >7xk:! 7x77xk:t7x7$U}(""w,v0""wDb 0zZ}0D,@nL`@5bZ@'ak@a"&@$sw@k`@ZL@az}@7x7@a@JL@Z""w@#@f@@V@v@x'@LE@ Z}h NAeU C75<   E e   eueRv a"&$swaz},"5bZ&#*0x'4a:ZLLx'hJL2|a :'akk`fnL`7x7$LE(""w,V0""w'ak@a"&@$sw@k`@ZL@az}@7x7@a@JL@Z""w@#@f@@V@v@x'@LE@ Z}h NAeU C75<   E e   eueRv a"&$swaz},"5bZ&#*0x'4a:ZLLx'hJL2|a :'akk`fnL`7x7$00'!EvATADATADATA<0b /)@/<> FVNF'G 'y :sF:F:F:&F:4F:MF:^F:(qF:rF:rF:sF:sF:}F:CF:hF:DF:F;LF?TFEy'F%%F%@)FE""2GFN}2QKFe59s7F sBGFsG sG s`H v8FvfFvBxFvL2vFa2zs V}F}'6} rF ũWFf2쩈s2CT27F7yFXF`YFʪyF˪nrF̪~Fͪv תH2۪. ۪j/ ۪0 ۪0 ۪0 ۪0 ۪0 ۪0 ۪0 ۪0 ۪0 ۪0 ۪0 ۪0 ۪0 ۪0 ۪0 ۪0 ۪0 ۪0 ۪0 ۪0 ۪1 ۪1 ۪1 ۪ 1 ۪ 1 ۪ 1 ۪ 1 ۪ 1 ۪1 ۪1 ۪1 ۪.1 ۪/1 ۪01 ۪11 ۪21 ۪31 ۪51 ۪61 ۪71 ۪81 ۪V1 ۪W1 ۪X1 ۪Y1 ۪Z1 ۪[1 ۪\1 ۪^1 ۪_1 ۪`1 ۪~1 ۪1 ۪1 ۪1 ۪1 ۪1 ۪1 ۪1 ۪1 ۪1 ۪1 ۪1 ۪1 ۪1 ۪1 ݪ N2઴F^KFઋwFFA}s R: RS2RZ ""2 F""2 P6PX~2,.,.0&F&**,.,.H0F2kt2nt2zt2t200bF"X F2ū~2ƫMFȫKFȫZF˫%&˫4&&˫&&˫n'&̫s F̫  ̫q ̫ ̫ ̫" ̫o3 ̫oM ̫vQ ̫Z ̫Ba ̫ ̫ ̫ ̫ ϫ FϫFϫ"Fϫ&FϫvQFϫBaFϫFϫFϫF"q DF}2}  2 @8l~2\""2`""2dE j+N2l2sFxF''<F'H9': '?T 'f '[r'\rP'r'r&'r'6' s*'"s,.'%s0'`t0' z2'8Fb t*'tD b tpz'<tpD:^H:HX:H> H:H0@@:(qH @X@@;LHz:}H`vBxH@:rH0:rH8@:sHxe5@:sHP:4HEy'H@VNH@:MH@z:&HhH@:sH:CH(:hH :DHp  JϫhbhHϫ&hƫMh ઴hJhZHϫh DhHzxhQKhH^KhHʪyhJ̪~hXFϫ hvfhHhHũWhHϫhV}hsBGhHhv8hvhzXhH7hHshH`YhHhJȫKhHϫBah7yhϫvQh˪nrhϫhrhJϫ"hGhH%%h 2̫s hȫZhH?ThEઋwhJ%@)h )XFXFF00' !p $9  P 55 uЋ f%$9& ۪0$9f  ۪0 $9^ ۪1۪1۪1 G$:2&n^*nL`.nL`2nL`:nL`F$9΅HsDPf TG:s n^%%nL`nL` $9! "7y(7y.7y8۪0>۪1. b tpz'?TtpD#w@#@ũW@;L@sBG@}@vL@:@תH@%%@̫s @R:@zy@ Tͪvh}h*۪.h۪j/h۪0h۪0h۪0h۪0h۪0h۪0h۪0h۪0h ۪0h)z۪0h5۪0hA۪0hh۪0h۪0h۪0h۪0h۪0h۪0h۪0h۪/1h ۪81hN۪61h`۪01h۪21hz۪W1h۪1h<۪ 1h۪\1h3۪`1hf۪ 1h۪[1h۪71hz۪Y1h۪.1h۪ 1h۪Z1h۪_1hs۪51hP۪0hz۪1h۪11h۪31h;۪1h۪1h&۪ 1hR۪1h9۪1h۪X1h۪V1h۪ 1h۪1h۪1h۪~1h۪1hj۪1h۪1h۪1h^۪1h ۪1h2۪1hx۪1h۪1h۪1h۪1h۪1h۪^1hO  FMT -- Syntax errorDevice does not support formattingDevice not in systemFailed to attach device Start formattingDevi|ce 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 atlignment 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 elrror -- volume has been alteredVerify Operation of FMT failedInvalid OperationParity error on deviceBad Block on deviceInvalid switch combinationCommand I/O errorCommand too long Continue? [Y OR N]: Response out of rangeMarked bad in Manudfacturer's Bad Sector File Error reading dataBlock = Header compare error Error writing header Error reading header Error writing da00'!EvATADATADATAta 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: UnablTe 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&  Е   Ev0#w2̫s 8#:̫s @%%DHתHNתHX%%\R:`:;L bũWfvLl;LnũWrsBGx̫s ~̫s Lwwy } b tz'ftDϫ@RS@s@ϫ&@ƫM@x@ϫ @:2@ϫ@V}@v8@}@zv@ϫBa@7y@0# @ϫvQ@˪nr@ϫ@ϫ"@%%@̫s @۪j/@J@P@۪0@۪0@z۪71@$9!@۪1@ ̫oMh.̫Zhzsh<hT̫qh̫h̫h̫Bah̫hn̫vQh̫hz̫h|̫"h"XhD}h̫h̫o3hA}sh̫ hv"qhL̫e 'yh$'Gha z3ɋɥ ɥ ɥ ѕ 7 w 7   T~˪nr s%%̫s %%:̫s >۪0BRSH$9! J7yP̫s T} Z^%% b̫e fv8j0# pv88v ww@ϫvQ xϫ ϫ ϫ&ϫBa,v2۪06۪j/̫e "҂҂:/.   VE  ̫e dd VERIFY  ̫e ""dd  NOVE    ̫e &&jj NOVERIFYy  ̫e **jjMAN  ̫e ..^^ MANUAL    ̫e 22^^##OVR   # #̫e 66pp' 'DENS ' '̫e ::vv, ,DENSITY , ,̫e >>vv44WLT 4 4̫e BB88ERL 8 8̫e FF-V@ V<<BAD < <̫e RR@@VE @ @̫e VVjjC CVERIFY C C̫e Z"Zj=>j     J JDOUBLE J J̫e x x Q QHIGH Q Q̫e ~ ~ V VSINGLE   V V̫e . .]]LOW ""] ]̫e @.‚<:‚D:‚L:†TYnv=̆|=̆j . < D L T  &n( ,v. 4|6 <>7 E7%DYA%DL=%DU9%DM%DR.%DU*%DY%DU|:2v8:2v8vJv&ϫ,ϫ2ϫ:v8Bv8Jv8PϫvQXv8`v8hv8nϫBavv8~v8j&%DY7wY ϫv8ϫJV}$J&V},J.V}4J6V}:ϫ&@۪1F۪71J۪j/PxVϫ \J^ƫMdPF%DM%DR%DLw% FPƫM v8v8v8"ϫ(ϫ4J:P@JBϫ"\b 00'!p `""DϫvQJ`YNRTઋwZ `dϫvQlsl     e  @   -@ s %%N}%%sG &ϫvQ.s4ztsB%%Fs`HJR XdE^d`""j fl 7 ,A R  -7  5~ϫ ϫઋw^K^K %%&s*>BDઋwJNN}R:;L V%%Zs7F^j w  e ,   e7 ~  dEst`Y"7(N},%%2s6:br;L :s7F>FsLktR`YX7^bN}f%%4A  R       - 7 %"7 7 7  2 d j*E""04`Y8:ઋw@ Fj+NNϫR~X̪~^QKbDfj%%xN}~s   䆇T ]U@@E@P -7 & D aael%% s`H (QK.D:LPRઋwX^̪~b̪~hū~~%%0,EPCDU -7 "$ઋw*b tz'rtDD@QK@$9 @̪~@@~@s7F@j+N@:br@sG@X@s@r`Y@7y@ϫ@ū~@%%@;@N}@ @۪j/@ઋw@۪1@ Xh \w  7  -  W ϫ ۪1۪j/~ઋw s$N}(:br; ,%%0s7F8s<ઋw@sGF$9  H7yN̪~R̪~Vū~BXɝьѝѝIѝ ew  F̪~ QKDQK"D&,`Y0X8 >j+Nb tXz'rtXDdE@E""@`""@઴@@ϫ@:@D@QK@^K@̪~@@z~@s7F@j+N@;L@@sG@f@X@s`H@7@s@""@`Y@@@zϫBa@ϫvQ@ϫ@ū~@˫4&H%%@˫&H N}@ @˫n'H۪j/@ઋw@۪^1@۪_1@R:@:nt@zt@ H 0h.Fh>˫%h, /1 @/ |t00'$!EvATADATADATAld\T7  @dϫhϫltfL    " 7  m 7 n  -7  Fb~&ϫvQ,"6s>%%BsP%%\`bઋwhlN}p%%ts`H~ϫvQA 5 w  ewm  -  vϫvQs "dE&ϫvQ0s4nt<`Y@XF7L`""\`bઋwjϫvQn vs|D7  m 7  <  t p @ `[ jss%% &%%>sBLsPsVZN}^%%@ bsGlϫvQrϫvQxs~"6472m*, 7!$ ewm  @  # 5-5-5- &fLϫvQs"zt.`Y2X87>""DHN}L%%P%%@ XϫvQ<  #mm ew -w   >rm-` E""$`Y(X0ϫvQ68ઋw@H NVj+NjlઋwtszQK~EU EP->* U -U m7  7 7 7 ZD̪~̪~ū~.>2*6ū~J\ϫ`~dlQKpDtx%%|4 w m  MUu    ݆Ctp*,ts̪~̪~ū~.N}48s`H<BHLNઋwT \ϫBadsjXp`Yt*x, ew wf, @P B 0H -<-6  $  dN P:;L s7F`YX۪^1 ۪j/&,6BH̪~P̪~V۪_1ZR:$(  6^K ^K઴ઋwઋw^K ^K~b tpz'rtpDϫ@#w@RS@#@઴@ϫ@D@x@QK@^K@ʪy@ϫ @zvf@@s7F@ũW@# z@ϫ@:t @;L@sBG@vBx@v8@}@v@vL@Ey'@z@ȫK@ϫBa@7y@VN@:@ϫvQ@תH@l~@ϫ@r@ϫ"@%%@̫s @CT@z۪j/@ȫZ@۪0@۪0@۪0@۪0@ઋw@۪/1@۪01@۪21@۪`1@۪.1@۪0@۪11@۪1@:۪1@R:@A}s@۪1@ (}h( f777777777 fw|ϫvQ ϫBaϫϫϫϫ"x"ϫ (ϫ,# z.̫s 2̫s 6A}sR:B۪1FRSPϫBaVxf(d d  kYg 7 7 7 %DU %DU~%% ۪1%%dתH%%dR:۪1"RS*%%0۪`14ϫvQ:۪0>xDR:HLDPQKVv8\CT`rX ;7  E  |v8 CTϫ #w̫s x"۪.1&R:*:;L ,ũW0vL6;L8ũWઋw@^KD^KHNsVs\%%hn%%n  | x @ hc "><7:m24 7!, ewmps ϫvQss$(N},%%@ 0sG:ϫvQ@ϫvQFsLRϫvQZslztx`Y|X  @  #5-  5-5-&f mm ew -R7 ""N}%%%%@ &ϫvQ<ʪyVE""hn`YrXzϫvQfw /}-U U EP0 0 m$7`ઋw j+N02ઋw:s@QKHNDTʪy^̪~b̪~fū~h w  %U5 5   Rϫ~ %%s$̪~0QK<@DLN}RVs`HZ`b tR'%stDתH@%%@۪0@R:@ FHh( +The RP07 is not supported at this time("(d  d .۪0 %%dתHתH%%dR:b tXz'`ttXD00'4!EvATADATADATA#w@nL`@^K@ͪv@s7F@ϫ@sBG@n^@:br@sG@X@s@r`Y@@VN@%%@;@̫s @:w@۪V1@:x@:@ hh& ^7  , ' -7 w7 7 ~sBGnL`  ϫsBGnL` :xsBGn^ sG":w&s7F,0%%4VNBϫL%%R^KV^KZ`YvZ $   wE    U$ vX^K`Y`Y ۪V1$#w&̫s ,ͪv0%%:sH:; Ls7FR%%V:br; Zs7F`%% b tz' ztDϫ@#w@ƫM@઴@@ϫ@D@x@QK@^K@GP}@ʪy@z̪~@@@fhhlhahvLhX""h 쩈shh@תHh}hl~h"ū~hphJN}h.CTh h\""hkthbnthjzthrthz | &7v   % %%%DM۪ 1 ۪ 1۪1۪Y1۪1$۪Z1*۪ 1.#""0̫s :rFR:J۪0NQKV۪0ZDb۪ 1drj۪ 1lrr۪1trxx  r ~%DR5 "     W ѝɝ~v8 ۪0?T۪ 1"X(<2v8:"B۪~1H N۪ 1RR:Vϫ\̪~`̪~j̪~pQKt    Е.w @` m@ 7w%DL%DYtDϫ"۪31R:#w ̫s ,?T6:@?TDR:HQKLTDZઋwbhXl`Ytv8|v8h" Dw w 2w w  w w R j ȥ#  ‹>bϫvQ ۪0઴QK۪0&,D2ϫ8۪0@ઋwFR۪1b%%lDDJDLRDVQKZQK\઴j%%drv8vv8n6 w?PPPP  ew %v :_ϫs̪~%%6ઋw:%%>:; B^KDXH^KJ`YNs7FT`YXXb̪~h^KjX( ew .^K`Y ̪~ʪys7F`YXb XR'X00' @x@^K@$9 @$9 @ũW@V}@sBG@$9&@z:br@$9f@$9B@X@7@s@`Y@$9@7y@VN@$9@۪.@T; z@%%@;@z$9^@۪0@۪0@۪0@۪0@۪0@$939@:x@R:@۪1@۪1@۪1@۪1@۪1@۪1@2۪1@۪1@$9Z@ e5h n& & & & f&& & Ε 44ww~b bϫ&V}V}*7y0> 4VN8:xDT; zF7yL$9fN7yT۪0X۪.\$9^7yd۪1h۪.l$939`jwwwww: 7 7y ۪1۪.$97y۪1۪."$9 $7y*۪1.۪.2$9B47y:۪0>۪.B۪0F۪.JϫRxX۪0\R:_ 7 7  8 &  e B w7QHt^K ^Ks`YX%%7":br; $ũW(`Y6^Kb۪1f۪.l`YpsBGxT; zz7yVBwwwww$97y ۪1۪.$9397y۪1 ۪.$$9 &7y,۪10۪.4$9B67y<۪0@۪.D$9&F7yL۪0P۪.T$9 Nwww w  b7y ۪1۪.$9Z7y۪1۪."$9f$7y*۪0.۪.2$9^47y:۪1>۪.F`Y^K ^Ks`YX%%7":br; $ũW(`Y6^Kb۪1f۪.l`YpsBGxT; zz7yVBwwwww$97y ۪1۪.$9397y۪1 ۪.<0b ..U @Nj Ne$e$/e$,e$jLe$Tqe$ze$e$e$ }e$ e$ -!e$ g'e$  Le$ ;Me$ (Ne$ Ye$ T[e$!e$#.#e$# Le$#tSe$#Se$#T[e$#lze$#*#*#p*#*#*#*#`*#*#*#*#*#*#*#(*#P*#x*#*#*#*#*#@*#*#*#@*#h*#*#*#p*#*#*#p*#8*#`*#*#*#*#*#*#*#P*#x*#*#*#*#@*#*#*#@*#*#0*#X*#*# *#p*#*#*#*#`*#*)"&);&),:&;6@ye$;6e$<6fe$<6Bxe$<6Xze$<6e$=6m'e$=6(e$>6`e$>6fe$>6qge$>6ye$?6 e$A6xde$A6fe$A6@ye$D6pe$F6VNe$F6 Se$G6qe$G6|e$G6ye$H6(e$J61e$J6se$L61He$L6{BzzD{g'R{b XZ"LXD#@R@?T@{@©2@  kh $ E@7 7w&©2R©2#Ԃ{"?Tb z%KD[X@t@#T[@6f@#lz@#tS@[@)W@4!@# L@k@ Z"$!h ?!h@!h ^   ?7 7peeRRRRRRRRRRp# L # L# Lk4!4!$k(4!*#T[.4!26f6t8#lz<)WB#tSF[XJ[b 0zdw0DszPK@#@t@E@}s@{@@6f@)Ty@ѫZ@y@}`;@z?T@W@#lz@TG@Qd@ɪf@ X@$!@)W@6l;@)L@{@)'@tM@sz(@B@ϫ}@|' @Y@#@ h~ 2 2_NNmofmo tODT.OBJLB[1,1]SYSLIB.OLBw w   $U  hm of00(L!@!D}`;HLѫZRTGV\hEjϫ}nɪftxhUt7 n  w 0 77 d   5Qd ϫ}y#Ȃ{$?T($!,6f0t4Y:)WtMB#C{F?TPVZѫZ`f6ff 7采e5,w    ,NL`)W)Ty)'"szPK$t*,.|' 0)L4}s> XL#M{PtMT?TZ)Wb XzXMXDE@)@'@?T@W@TG@#P@)Z@{@tM@@hp!@2ϫ}@k@k@ Pk/h T5#w 0  E  77Е pEϫ}WTGk)Z' )$hp!*#P͂+{.tM2?T6E8ϫ}@kDHb XzXMXDݪK@Ly@z@?T@W@#ze@ϫBa@{@{@Q@ @#@ bs/h     Z w 5   df c 0e %\W #zeϫBaLyz,ݪK: > D J{@QN{# R?Tb Xz"wXD#`H8#H#H9#w@#8H7-V}@:2@#H:#H;#H`@#H>z{H#H=6f@#0HP#PH@#XHQ#xHA#HR#HC#HD#""@#HB# HV<&9@#@Hz#pHX#H W@#H#HTG@#(H#PH#xH)@#H#H?T@ɪf@#Hz#H#H#@H#pH0#H@S@#H1#HF{H#@HH{H#HG#H\#H]@z#`H`E:@#H#Hc#pH #Hd#H#H#H #H#H#H"#Hy@#@H Z#`H#hH!#pH2#H#H#H ?ThԀ $"  Ԁ7FTB -- *DIAG*-Illegal Get Command Line error code $" ԀԀ33Command syntax error%N%VA $"3 Ԁ3ԀM MRequired input file missing $"M ԀMԀiiIllegal switch%N%VA $"i ԀiԀ}!}No dynamic storage available $"} Ԁ}Ԁ)Illegal error severity code %P %P %P $"   ԀԀCommand I/O error $"   ԀԀ$Indirect file open failure%N%VA $" ԀԀ&Indirect comand syntax error%N%VA $" ԀԀ&Indirect file depth exceeded%N%VA $" ԀԀ55I/O error on input file %X $"5 Ԁ5ԀPPOpen failure on file %X $"P ԀPԀhhFile %X has illegal format" $"h ԀhԀ.Module %2R multiply defines P-section %2R $"   ԀԀ4Module %2R multiply defines XFR addr in seg %2R $""" ԀԀ1Module %2R illegally defines XFR addr %2R %P $"$$ ԀԀ ! P-section %2R has overflowed $"&&  Ԁ Ԁ'1'Module %2R ambiguously defines symbol %2R%2N $"((' Ԁ'ԀT+TModule %2R multiply defines symbol %2R $"**T ԀTԀ{9{Segment %2R has address overflow: Allocation deleted $"..{ Ԁ{Ԁ"Allocation failure on file %X $"00 ԀԀ I/O error on output file %X $"22 ԀԀ)00(T!EvATADATADATALoad addr out of range in module %2R $"44 ԀԀ#Truncation error in module %2Rs $"66 ԀԀ.!.%D undefined symbols file %Xi $"88. Ԁ.ԀK$KInvalid keyword identifier%N%VA $"::K ԀKԀkkOption syntax error%N%VA $"<<k ԀkԀToo many parameters%N%VA $">> ԀԀ)Illegal multiple parameter sets%N%VA $"@@ ԀԀ!Insufficient parameters%N%VA $"BB ԀԀ#Task has illegal memory limits $"DD ԀԀ%Illegal logical unit number%N%VA $"`` ԀԀ)Illegal number of logical units%N%VA $"bb ԀԀD3DIllegal number of active fields specified%N%VAp $"ddD ԀDԀssIllegal filename%N%VA $"nns ԀsԀIllegal device/volume%N%VA $"pp ԀԀLookup failure on file %X $"rr ԀԀIllegal directory%N%VA $"tt ԀԀ7Incompatable reference to library P-section %2R%2Nl $"vv ԀԀ9Resident library memory allocation conflict%2N%VA%2N $"zz ԀԀ=1=Lookup failure resident library file - %X%2Ne $"||= Ԁ=Ԁj6jIllegal partition/common block specified%2N%VA%2N $"j ԀjԀ+No memory available for library %2R%2N $" ԀԀ9PIC libraries may not reference other libraries%N%VAr $" ԀԀ!Illegal APR reservation%N%VA $" ԀԀ&I/O error library image file%n%VA $" ԀԀ7(7Required partition not specified%2N $"7 Ԁ7Ԁ[![Illegal PAR reservation%N%VAi $"[ Ԁ[Ԁx8xComplex relocation error-divide by zero: Module %2R $"x ԀxԀ>Resident library has incorrect address alignment%2N%VA%2N $" ԀԀ/Partition %2R has illegal memory limits%2N $" ԀԀ6Invalid partition/common block specified%2N%VA%2N $" ԀԀC,CTask requires too many window blocks%2N $"C ԀCԀk1kLibrary references overlaid library%2N%VA%2N $"k ԀkԀ@Resident library mapped array allocation too large%2N%VA%2N $" ԀԀ6Invalid reference to mapped array by module%2R%2N $" ԀԀ&Symbol %2R not found for patch %N $" ԀԀ(;(Library not built as a supervisor mode library%N%VA%2Nk $"( Ԁ(Ԁ_4_Supervisor-mode library reference error%N%VA%2N $"_ Ԁ_ԀFTB -- *FATAL*- w  E DW!d! E ` !P A & & &  f&& HW "$"(>E:B<&9D) LԀ VԀZ-V}f?Tl-V}f& & Ε )!%    wb:2.#""0y6#""8y>#w@yD6fH`LɪfP`TTGX`\E:`@Sdb Xz. qXD6f@}@)p@?T@{@)Ps@tM@$9!@#p@ 0h 4 w@@6f }$9!)PstM#pƂ{"?T&)p*)pb Xz. SXD#@Eg'@#@@#@?T@?S@!@{@{@E:@#@#@*ϫ}@ hh 00(\!@!6f@N6#@:OVN@:Ok@A6xd@:Ov@D6p@-V}@:2@t@zsz(@M@p@6y@)W@:O? @j@@:OU@:OU@{@z{@[W@ҫw@@:Or@:Or@NM@Ks@:O@:O.3@tM@@y@:Og'@A6@y@z:OK@:O@:O@G6y@ѫy@{H:OjL@>6`@:O4@:O<@#@,}@ϫ}@,!@2\} h\K\} DfK\} & 2\} ,!=6m' y>6y  p>6` yG6y  N6# * *O6 X$ $ <6Bx* * A6f0 0 A6xd6 6 A6@y< < >6fB B0 0;6H H0 0<6N NXF6VNT T" "?6 Z Z %  %` `- -\K\} M:O NM:O:d    :Og'  :OK  :OU (:Ov$ $ :O<* *( (:O.30 0& &:OU6 68 8:O< <ҫw:OwfK\} . .:O4 6 6:Ok   :O X:OVN k:Or : ::Or..66>Z>5w  ww777 m 77~Eϫ}WTGM)W[W  M$)W[W &M*(6:,2@(F-V}J#ӂK{N?T=  e7z7`tH` %   E  em,@7e 7`elXD6p;6@y (T,<ѫyH{#  L?TPERϫ}VTGZ2X^fݪK5 $5em   % mm  %|sz(szh  tszSt (*,!.,!8p>,}DHMLMPpTX,}`̫d(hBxlR5@7 CD5Ee.B e.EECe% &%(bѫy ѫysz@ts" ( ,\K\}B.Pq~ ~P : g  : :W ^SY :( :p :   :`': g$$&& :( :WbbJ Jff :lzxQ g d xQW xQSY xQ( xQp xQ   xQ`'xQ g$$&& xQ( xQWbbJ Jff xQlz g  W SY ( p    `' g$$&& ( WbbJ Jff lz:lzDAdLB d : gd : gdxQlz SP[y_ϫ}lz,DAdEAdFP@dMMdCPd2  gd  gd  gd  gd ( gd:lz xQlz lz(( b zS`DJ-!@.@ (N@-V}@{@E@p@6f@ g'@ }@z@ x@z5s@Tq@)p@?T@W@~@(@TG@#x@GK@̫@#S@?T@ɪf@Bx@z{g'@[Z@)W@@DhZ@{@Q@{@[W@[@tM@ @ @ϫ}@Y@,!@Z,}@k@ ;M@  h(تwhXvLh*تthتQhت2h L,,*** Root segment: %2R%3NR/W mem limits: %P %P %P (%U.)%NDisk blk limits: %P %P %P (%U.)%NOdt xfr address: %P%NPrg xfr address: %P%N%FFile %X memory allocation map%Nthis allocation was done on %Y%Nat %2Z by FTB version %6A%4NStack limits$: %P %P %P (%U.)%N%4N************%2NUndefined references:%2N %2R%NIdentification : %2R%N%2NProgram section allocation synopsis:%2N<%2R>: %P %P %P (%U.)%N>>>>>>>>>> Undefined reference: %2R File: %X Module: %2R%2N 7hGKpDhZ| ( := (eew w , E m m \TG "65s:BWFJYNYR,Z.^bEj.nBxv̫z5  g l 00(l!@!pHPX~ ;M \ ;Mbf{@Qx{@Q| }vJ b mm *  eRRRRR p | (NTq g'( ($<)W@[WD[WH[WL[P[ZVZ-V}^?Tbɪff-V}h)pl)pp  w 7 E%wFwBb -XTP7  RRJ|tM#x͂ { ?TW7" x&{* x0z2{g'8{@Q>{@QX7dh{@Ql{@Qp6fxJ-!|#SwX#Sb Xjf XXD}s@)Ty@W@ X@)W@)'@ &R'hA}sh *w  w ew,W XW)W )Ty$)'(}sb dXzi gdXDx@{@t@M@C`A`n`E`h` ͫe A :d@Q/^ Enter Options: FTB>hw 7 7 7 7 7 ?5  W }X̫AD~ AD~"AD~&TG.(2M6M<:d@QB:d@QH,2LszSNtV:d@Q\:d@Qb,2|w HB X` e5v p7  ȥ; ¥=7e)t#t-e !r쩒f (,2Xf? 2!4ϫ} ::d@QZe)A  ppp pP{@QD~ʫ } k${@Q({@Q, }26y: } k ,,T`k((((:d, ,  k C`AC`A7@ ; :$5?15?-B B B @5 $= 55  wwp TGtXz쩒fDszSFXzPAsT:d@Q^szS`XzfszXhXznt:d@QzNM~NM"ww2@( ,2ͪK@:Og'DXzHszfsz JXzPRZ\`:/dՀ 7 قm  2  & & *5t.5t> N N65rϫBa  ( ",2*,>qh?TDrJsN#Pͪf6fD)J)t P)^#tSb#tSf:l}ztM~#pƂ{Ȁ    I @mw > Bm   eB & f& v?TftMB#pƂC{F?T LfB*44!1w f H2JVLrNtPRzT$V>XB \fszz@#lzFzR:& B 2,2,1&} g'ffsz0z@#lzFzzH{g'HFEE l w}zTq{g' zvzx {g'zx{g'z{g' fʫ\'55 5  > w" wN~z{g' zx{g'{g'#zeϫBa$zz&{g',sz0z.#lz{{g' B۪K Jfsz0z@#lzJk<b65{g'f{@QBʫH }LkP{@QT{@QX }^6y nVN\}trD   ?7 e e5e5e,e7 | XXk X$X0X<XDTGHtLD6p;6@y Pszhsz( Zszhd{hBxls/p/e D  " P  aU%e =  }l=l ef/ kk/ e} 4Dz`JzTqL{g'R(X{\ }b{j lkpktͪpTx%&pp    7m7 7 !m % ~©2g'( .$(&*,0(285 X<4xxD Jg'NÉlLe; TZDp^bpr% `lmaa  H ! PP A X,}Tq g' }(*k.AD~DYHYXy^{@Qbʫhzj{g' b z}iMDJ-!@.@{@@E@/@ݪK@ g'@ }@zTq@z@Qd@ϫ}FV { \ `ydʫjzl {g' `  555w5@.l|z{g'z{g' تQ&J-!*sz`r,#lz2zx4 {g' :zx< {g' FEHϫ}XTqZ g'm7 `w kgw K_mPAQ  `RRRRRRRRRRRRRRRR w `2 ($.*..5 X44xx:g'^RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR w| B mJ wN@ &NR.`5 Xf4xxlg'~j| ww<5 @7  Dm  w w|>RXjv| @Z @@lm9 RbEϫ}6FH>JRLXNjPvR|TV X@Z\^`bdZft x(V8 @@- :) . (    & @@e   AA@`50xj5 &fe I rw AA@`7@lm7m Pj|J-! #S$#͂%{(?TZTq\ g'b f(t(xBx|jN00(!EvATADATADATAm w)0@    wd^*$ d. J J D(Db@T"8d(j.8:<>@BDFHJLdN^PRTV*XZ$~8       J    w    @ eA @ &#@{?TilJ-!p#F: @@@`"  %wT d @m  0  \8<ʫD H(LTqN g'XTG\tM`#ǂa{d?Tlypʫzz|{g'|@mA@lQQQQ  p`5@ |{ zTq {g'({ } 0 6J-!:#JTqL g'R/T g'Z b(fJ-!jsz`rl#lzr# LvFnTGr)sEx)sE|e   7 H w >w :, w 0w ,$m ewf&N)2H)2H)E)G )nE$e;lJ-!p#St#͂u{x?T BUE m @  7@ew 7 $7+wɵ#ɵ"  &wtpe  ɕ m %enTG)sE)sE")2H*)2H0)E46)G:<)nE@e;TdTGj)sEp)sEtz)2H 0 < )63 wɋ wpe  l)2H )E)G)nEձHTGL)sER)sEV\)2Hd)2Hj)Enp)Gtv)nEze;w` )w^                                  TG tM$#x͂%{(?T0 )ފs&Zb ziD<&`@{@<&Kq@`@[8@E@)@تw@ }@zTq@'@z@zc-!@|X@۪K@c!@y@تt@?T@W@)P@ʫ@(@TG@Qd@̫:@#@zɪf@Bx@{g'@#ze@ϫBa@[Z@)W@)p@j@[y_@{@{@Q@s 9fWϫ}Qdɪf '")&hp!,tM0#Ƃ1{4?T8Qd<EDت2HBxJRQdX[y_^ɪfb)Pv)pz|ee!e 5f 2 eA  5  w |)W[8 [8[8 $[Z[8 4`:<&Kq<&` Fs ;MFTqH g'XD~\ʫb/d g'j }n x }| |3 N333E@ (33 53@` D`D@D&z   }  }"jL$ g'* (N0 -!4# L8 HBBl D`7 1,1,72{@Q{@Q&{@Q({@Q.{@Q0{@Q6JzVb zyZDszPK@J-!@[X@t@`@#T[@)@6f@}@) @H= @?T@z#lz@)t @#tS@#S@[@)W@4!@)@{@' q@tM@#p@#@:@hp!@"sz`r@ ̫:h |&672ee225  4!#T[ J-!$6f(#lz*t.)W4#tS8[X<[P6fV) ZszPK\td) h' qj)nhp!ttM00(!)!vATADATADATAx#Ƃy{vx 25.f&%675     |?TH= sz`rt#S$#T[*J-!.szPK0#lz8#tS<#tS@6fF)L)t P:V}\tM`#pƂa{d?T  6f`nb dXz*}MdXD YH>6fH"N6#H.:OVNHzH:OkHH6(HzH{H>6qgH (NH :O^H6yH(#H{wH :O? H:OUH :OUH[y_H!H -!H zvH{@QHzfwHzwH@:OrHz:OfH:OrH:OHkeHz,H@KsH@ HzxH6`H*# LH  LH:O4HzzH:O<H NHzzt:H-V}hMh:phNEg'h*}hlzhzJzh.Rh" Lh,2hj xh@#hp۪KhzD~h(kh$H= hrhXh~h&(hf? h2ͪ >SYF FSYN NSYV VTI^ ^CL swLL ((b z;}ED`@E@@# z@H= @Qd@X@!@E:@aQ@btQ@`T`@Rϫ}@cQ@y@y@ Zzxh}`;hJ5shhB( \05.03   55 5  tX# zy"`T`&aQ*btQ.Qd0ϫ}6E8ϫ}>H= BcQF!Hϫ}NE:R`VyZyVb X:H!XD ||ͪpThD`@E@@# z@H= @Qd@X@!@E:@aQ@btQ@`T`@Rϫ}@cQ@y@y@ Zzxh}`;hJ5shhB( \05.03   55 5  tX# zy"<0b -s@; d#Sv' 'h~ ?Tsv?Tsj?T s UjUjUajUiYjUpbjUbj $ 00)!*!#S\`?Tl[(}t[(}-Е  E `AI Ý --C C& & &  && & & Ε C& & & $$(?T,F'\n:$(P && & & Ε  :$p) tt pp  ) ~~ w  p Vb NX:w*QNXD'H@'h~H b PγJw*vRPγD#SH ?T*} @?Tsh?Ty  ?Ty"%R%O: ** DISMOUNT COMPLETE ** ?T*}D  ?TyRb Pγrw*wRPγDUHUpbHUbHUiYHUHUaH ?T*} @?Tsh?Ty V ?Ty!MOUNT %2R %2R ON DRIVE %R%O: ?T*} ?Ty?TyPLACE DRIVE %R%O: ON-LINE ?T*} ?Ty?Ty7(7WRONG VOLUME MOUNTED ON DRIVE %R%O: ?T*}7 ?Ty7?Ty[6[EXPIRATION DATE NOT REACHED ON VOLUME %2R ON %R%O: ?T*}[ ?Ty[?Tyr%N MOUNT ANOTHER VOLUME ON DRIVE %R%O: OR PLACE ON-LINE TO USEREQUESTED ACTION FOR DRIVE %R%O: NOT COMPLETED ?T*} ?Ty?Ty>REQUESTED ACTION FOR TASK %2R ON DRIVE %R%O: NOT COMPLETED ?T*}   ?Ty?Ty5%5%N PLEASE COMPLETE OR ABORT TASK ?T*} 8 b Pγ:w*xRPγD ?T*} @?T sh ?T*}DON DRIVE %R%O: OR PLACE ON-LINE TO USEREQUESTED ACTION FOR DRIVE %R%O: NOT COMPLETED ?T*} ?Ty?Ty>REQUESTED ACTION FOR TAS<0b / L00*!!vATADATADATAt:C t:N t:X t:Y t:Z t:[ Bt:s Vt:kt:t:|t:r!t:"t:""t: #t:&xt:#&Ht:`&!bt:&!t:'fVt:'mt:'ft:'l>t:'#0t:(\t:v*mt:+mt:-'t:,.'dt:.nt:O9*t:P9`0t:Q9a&t:R9-t:X:t::.t::Zt::Ft::0zt::_ft:_Mot:QIft:R4t:R5\t:KXn$t:VXnTt:ZJt:`J0t::d5t:dMt:hfz,t:wfOt:f{t:f7t:rt:w8t:y9t: z:t:z=8t:'z=t:(zt:)zt:*z@t:+zARt:,zABt:zBt:zTt:z^t:zQ0t:zSt:}Xt:}D@t:Zt:KEt:Đ[Xt: _:pb 0zt:C 0Dw~y@nL`@e |@z@t: q@t:Y @t:Z @t:X @t:[ @g'4@l~Pd@g'!@zg'@fH@;w2g@fw@g'@g'@$9!@ X:o%h uL%h g'h huLhoQhRh hoMho32hZg(0 phpC vh C WhC h X:o  Zg(hŕŕ7w77777 B7  ׭w~X:oz g'$g'!(g'4,g'0g'4X:o:z>t:Y BfHFt:Z J;w2gPl~PdnL` TfwZt:[ `w~yb$9!"d Շw w -,e |t:X t: qX:o X:oX:ob <0zt:N <0Dt:z@Q#@z@kԀ@zP(@"@h@g'@@@g'@f@j© @NR@@z X@ Zg(0&+s hN .hN &h N ,hN 3hN 6h Zg(5 wlf&f AB 5 u 5 5az & f© *:© Vg'|f v   5 EuE  5  $$B Bg't:z f*"zt:Z >D g'@%@uL%@z@g'@@uL@;w2g@:@S@@oQ@@BoM@o32@:_@ Zg`Zg(0@t:Z h Zg`? [Y/N [S [OYNSMH Zg(ӕ*ӕ Х   f @& ׭ OD@Е ЕRЕ: Е-H;w2g g'*z 0Zg`4S@ :_D:vb tzt:[ tDw~y@e |@g'@g'!@g'@:s@;w2g@zQ@t @oQ@g'@@R$9!@:4F@ X:`,T}h%q%h"C hZg(0 t:[ h X:`& +:s w~y** Zg(h7 * 7 _b\ AzX:`* X:`:sX:`;w2gX:` zQX:`"oQ$X:`(X:`,.X:`2g'Vt ZX:`bg'd)& +""'5"77 )7 *a  *f X:`g' &X:`"2X:`"8g'<:4F>X:`BX:` FX:`Xw~y^X:`*bg'nw~yvX:`*.a׭ 57 *w.g'w~y$9!g' g'!$X:`**e |b d0zt:d0D:[q@yy@E,K@t: q@y`@N 3@۩ S@fw@g'@K@;w2g@y2g@rdK@nLL@nLL@g'f@l,@NR@+Ry@+R@"`@ Zg`Zg(0p:h Zg`  Zg( [  28 8 3 7 5  E]fw [qg'f+RE,K;w2g0۩ SB۩ SHg'fN+RyRKVyyXy2g\"``dKfnLLlNRpl,vg'znLL|g'F|ы  7 2Uw WHnLLnLL ;w2g Zg`y` N 3$E,K2*g'.t: q2g'f8+Ry b 0zt:0D)Ps@$939@ Zg(00\g?Th"T`?Th?Th W`?ThA`?Th,?ThR`?Th Zg(4E2$939)Ps$939)Ps$939 )Ps($939*)Psl b dXzt:r!dXD:r!y@`@ g'@~g'@E,K@t!` @t: q@a(}@)P@00*!!vATADATADATA@ @g'@zc}p@t @f,P@k@2g@ T`ET` (T`(T`Zg`Zg(00q!`h`h T`ESUBSTITUTION9 T`  T`g'T` T`E  SUB T`  T`g'T` T`E DATA T`  T`g'T` T`E GLOBAL T` @ T`g'T` T`ELOWERCASE T`  T`g'T`` T`E''ESCAPE-SEQ T`   T`   g'T` T`E2 2DELETE T`   T`  g'T` T`E9 9ESCAPE T`  T`g'T` T`E@ @QUIET T`  T`g'T` T`EF FTRACE T`  T`g'T`  T`ELLMCR T` @ T` g'T`   T`EPPCLI T` @ T` g'T`   T`ETTCONTROL-Z T`  T`g'T`  T`E^ ^TIMEOUT T`  T` g'T`   T`Ef fDISPLAY T`  T` g'T`` T`En nATTACH T`  T` g'T` T`Eu uDETACH T`   T`   g'T` T`E| |OVERFLOW T` "" T`"" g'T` T`E DECIMAL T` $$ T`$$ g'T` T`E TRUNCATE T` && T`&& g'T` T`E Zg(&     &CB A!  .|j7 T a7|w D Qpk T`E"c}p *T` .T` 4T`B2gJ2gPt!` Tt!` Zf,P`r!yf2glr!ypt!` t)P|t!` |   P @   @   @ EPEE0U    E & ~g'.6g'f jt rE,K<U  ¥,  w %w, kk"t: q.2g2`6t!` :a(}$b <0zt:"<0DzP}@lԀ@yZ@t: q@kԀ@zP(@.H@c}p@l,@k@NR@](Uq@2ox@ Zg`Zg(0"wh Zg`GLOBALLOCALSYMBOL Zg( 8 6 0G`w %%e @    w!A wfhk Zg`c}p$zP}(zP(@oxFkԀJl,PNRTl,Z.H`yZfoxlkԀt](Uqxt: q|w w!zP(zP(lԀzP(rb dXzt:""dXD:`@ g'@nL`@E,K@""Z@*KK@#""@l~Pd@@e Ps@;w2g@wL@zvL`@""w@y[@:@fw@fw@fw@[(}@""@Jw2g@#<}@#K@Cyz@"`@2g@: Zg`bZgaHZgb$Zg(0,t:""h Zg`Numeric under- or overflowSyntax errorFile not foundNo pool spaceFile read errorString expression larger than 132|. bytesMaximum indirect file depth exceededInvalid keywordRedefining a read-only symbolString substitution errorSubroutine nesting too deep.RETURN without .GOSUBIllegal file numberFile already openFile not openBad range or defautlt specificationIllegal nestingNull control stringSpawn failure. DSW = Line too longToo many concurrent .XQT'sLabel not at beginning of lineInitialization error. Code: Command file open errorSymbol table overflow Undefined symboll 00*!!Internalq error, Please submit SPRFile attributes not availableLogical name translation error.EXIT without .ENDr Zga Zg`ZgbN Zga Zg`Zgb Zga* Zg`*Zgbe Zga: Zg`:Zgbr ZgaI Zg`IZgb Zga  Z Zg`ZZgba Zga   Zg`Zgbl Zga Zg`Zgb> Zga Zg`Zgbl ZgaD Zg`DZgb  a Zga\ Zg`\Zgb   Zgao Zg`oZgb   Zga Zg`Zgb   Zga Zg`Zgb  Zga Zg`Zgb Zga Zg`Zgb Zga   Zg`Zgb Zga"" Zg`Zgb Zga$$ Zg`Zgb Zga&&* Zg`*Zgb Zga((? Zg`?Zgb Zga**R Zg`RZgb Zga,,a Zg`aZgb Zga.. Zg`Zgb Zga00 Zg`Zgb Zga22 Zg`Zgb Zga44 Zg`Zgb Zga66 Zg`Zgb Zga88 Zg`Zgb Zga::  Zg` Zgb Zga<<+ Zg`+Zgb Zga>> Zg`Zgb Zga@@ Zg`Zgb  ZgaBB Zg`Zgb!! ZgaDD! Zg`!Zgb"" ZgaFFA Zg`AZgb## Zg`VV*>pbV: Zg( Zg(* Zg(> Zg(p Zg(b Zg(VZg(%wB%>B  E}V B e ZP Е. Е:Е<h ""Z Zga""w;w2g (Zgb ,Zg`V8 g'>fwD#""Fy[J#""L#<}Tfw^:h*KKvCyzr|A A   Е>2 + V B   p [(}[(}Cyz("".""w0""6"`<#"">y[B#""D#<}LJw2gVfwZ#K`fwfE,KjvL`F   7 w bl~PdnL` fw wLl~PdnL` 2g` fw$""w&"","`0e Ps8;w2gb dzt: #dD:@9wW@`@[q@fa@`@&{P@"& @kg'@@E,K@t: q@z*KK@Wy@۩ S@[f @e @Wy@S@@t:@U@""@#<}@xd@#K@ox@+z@by@CT@z@"`@&~@2g@ Zg` Zg(0e ؚh""h Zg` .ONERR Zg(th $  U@w |#K "`xd2g Zg` `$S@("`,*KK@""FE,KLkg'PoxR9wWVt: qZE,Kd۩ Sh[ql"& p[f pp =@  e  &  7ww|&{P@CTfa+z `$&{P,0+z4z8zN&~TUVWy\Wy`&~d#Khe l#<}>WŀWWWWy""4t:<b 0rt:`&0Dy`@N 3@@d@;w2g@[(}@ Zg`Zg(0H&yh Zg`  Zg(L Е/ЕLЕBЕ:   w: ;w2gd0[(}6[(}<;w2g BZg`Fy`JN 3b 0zt:&0D: g'@p@<&Kq@ {Q@<&9@ ~G@nLL00*!!vATADATADATA@U @<&D@ X:`E,KhJϫ*}hy X:`NTRDEMC@CL@LO LBBER@DE v0nLLnLL g' g'(nLL2BHvNN:JJUU U jj SSWW  ~G||OOhhff  {Qtt PP  <&9<&Kq<&D  hb zt:'D:@T`?T@$9W@<&@@@[q@ N"&@`@&{P@~g'@ NVN@)@z&y@}s@?T@E,K@)Ty@)@t: q@'@%x@$9~Z@W`?T@۩ S@fw@'@)t @z9x@h'@u@<&k@&""@ X@A`?T@;w2g@)W@)p@)L@<&(@'t @)@)'@z=@@=@)Ps@' q@=@Jw2g@f,P@t @R`?T@|' @f@ Zg`TX:oZg(0*}}hE`WhHE`WhPE`PZhB Zg`"LBTA  X:o X:o$ $<8 8SYSYxB Zg(x Zg( Zg( Zg(A`?TW`?TT`?TR`?TZg(e,D e@7   ww pt;w2g&{P ;w2g&t (),<&.)t 4)p8)Ty> N"&Zf,Pb N"&f)ph NVNlX:o pfwv;w2g| v r7 5ȕf   @ Uȕ MIE @eV=X:o ~g' *Zg`6u:= RZg`X@=n[qrft&{P|)Weĝ e? D7"    e,  <w@;w2g Zg`)Ty)'X:o ,Jw2g 0Zg`D4)Ps6&""|' @)LD}sJ'L)P't R)t Vt X)wl J \  @    e  g<&k<&(<& )t %x' q )&;w2g@;w2g\b|' d)Lh}sp)Wt X|)9YM@>9@59W@49%@69@z<9]@c}p@t@D9@>9:@>9@k@19@ X:o ?9hh@9sh69/Kh39h39_h jT`EZT`Zg`"Tq*}hZg(0 eh /xhN9h2h 8h *}h !h X:o T`EIFT T`D9T`EIFF T`69T`E IFNDF T`>9T`E IFDFZ T`49%T`EORM T``T`EAND T`  tT`E IFNINS T`  >9:T`E! !IFINS T`99xZT`E' 'IFNACT T`>9T`E. .IFACT T`19T`E4 4IFLOA T`<9]T`E: :IFNLOA T`>9YMT`EAAIFENABLED T`59WT`EKKIFDISABLEDZ T`498;T`EVVIFM T`09T`EYYN Zg`&EQ=GE>=LE<=NE<>LT<GT> Zg(77|  &6E %IF  l |l. <X:o kg'X:oX:o LT`EPc}p `T`dkP|ww         76X:o X:o X:o:yt: qHX:oLX:ob dXzt:R9dXD g'@"@yZ@y`@pT@?9h@ /x@.H@c}p@. @ *}@Tq*}@2k@39_@ Zg(009h Zg( w www  m k  eE& W  w  5t.HyZ?9h"?9h&pT*?9h.k:Tq*}>c}pV39_Z?9h^y`j"n39_t g'z *} /x ~?9h| A-!; 8 653f AEECr f e CՄE  TDy`.H"yZ039_6?9h:y`R *}V. Z39_`?9hdy`  b b.q BbN© R68VQ#X© \© `© jcr ^j?-   ЕVЕMȕS@ f A T.E.E Qm$ѫ&Qm *S<&@)t D)pLzP}R[VzP}Z:" fzP}jzP}T 7`77 77`777e7e$7e[*K  4 4 4t!zP}dK Ux $zP}(yy,y2g2yt!6zP}:zP}>Jw2gB {QFWw2gJ {QP2g>7e77 w`: w`X {QjL2g {QzP}vU  ݪK$zP}(U 0ݪK4zP}8zP}:d2gb <0zt:R<0DQ#@kԀ@.E@h@@© @NR@z X@ Zg(0#C h Zg(-@+% & &Y&?7bw B```- " F hQ#>.ENhVz X^z XbNRfkԀn© rh"|00````© Q#hlb 0:t:R0D Zg(0#C h Zg(4b Xzt::dXD: {Q@E,K@z@t: q@N 3@cr @fH@@© @. @k@yK@J X:oX:`Zg`2Zg(0V:dwhB:dwh>t::dh Zg`6 COMMAN COMMAN " " P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 Zg(| !C  ʕ !   7 7 7  wR w wo7 ~ Zg` zfHE,KE,KzBfHHzNN ,ZN .bzyf. lzhfpN 3vt: q,| ¥;¥!  zfHkb Xzt:yXD:9wW@"@kg'@E,K@t: q@# z@۩ S@y[@g'f@#<}@xd@k@B+Ry@+R@ox@ Zg(0|ydh #}h Zg( J D E   w 00*!! ?f7 7 7 7 0B (ȥa  և 6BE< C@dyZX:o vL0M"X:o&X:o*X:o.X:o 4X:oDX:o RZg`Vc}p \X:o `Zg`?wwA P E  Е.65;fX:oJw2gwPs&Jw2g.X:o4[(}:X:oDX:oP:(}TX:o \X:ohJw2g pZg`6 |Zg`;t % #`    6  ӕ  6  7!DX:oX:o"Jw2g&k.kXJw2gbX:orvL0MxvL0M~wPsT7 ѕ    ѕ 7 w w w8vL0MX:o 4X:o@wPsD2gHH P`Zg`'%DMOSRLZCXV.)@FPV\r|~xTRUEFALSEwr Zg( Zg( Zg(@ Zg( Zg(F Zg(P Zg(V Zg(\ Zg(r Zg( Zg(| Zg(~ Zg(xZg(@h@  ՇU7  d UUe 0 Et X:o $X:o (@77B u&f Af #5 &BCyzFkzLk\MPkzVCyz\Cy\Mb-xhzP}lzP(vz XzNR--e& 777 .  * '~ 7 7< $ $ wZ $kz(Cyz,-x0kJNRCyzVkzbCyzp-xz~t> V & ,& f   v     ȥ/ȥ$ȥ. Хa Cyz(9x:9xRFfm      &z X zP(#C 0>© Bb d0jt:*zd0D {Q@yZ@"@.@k@Ww2g@ Zg(0. h Zg(& d"¥##& R A3 H F5C& [ N:5Х*Х]/  &Ww2g k$ {QD.JyZb"d|](5u A Ee e!T+A "2Ww2g6 {QRWw2gb 0bt:+z0D&{P@"& @[f @)P@k@ Zg(0:f,Ph Zg(>& # 0%e 5$ "& k"[f (&{P:)Pnb jt:,zDg'v@g'L^@g'0@@g'@g'Z@ Zg(0Şh Zg(777& 0ȥ.¥000*!!vATADATADATA¥7" ¥9 ¥A¥Z¥a¥z5  ¥.¥$ 7> g'vg'0g'Z$g'ZZg'bg'0rg'vvg'Z~g'L^|  g'L^b dpzt:zdpDz@z@zR @z<@:@z@zr @zt @y`@z@N &@N 3@zzu~@zz@zT[@z'@zL@z,@z.@g'@z9@zB@z @;w2g@:@zdw@zw@z<@[(}@zBx@z@zAy@zBy@zz@z""@zy@:_@z@zz@ X:`Zg`@zZg(0t:zhdXRh$XRh|XNhzZh>zgh*z h$Dvhz_MhFzcMhfzyhz zh XRhXRhv  X:`  Zg`,Ff~zByzAyzL zdw zzzzR z<zu~zz z"" Zg(Fzt  z"z$z&zT[ (Zg(f*zr ($Tz'z.z, zy z Zg($zzzzz9zBxzwzBZg(D|   B ʵuEʋ  $w w. Zg`;w2g"N &Lg'pg'vN 3~:F| w w ww    8:<:_X:`X:` "X:`&y`.[(}~b <0zt:}<0Dzhf@g'L^@yZ@t: q@N &@z@Ş@]( @ @.@zy@. @:k@z X@yK@ Zg(0}}h Zg( x ¥" qB @  T RAEwH 75?< Jk](  z X4zy8. BzhfFN &N.TyZbzng'L^zg'L^|C D ( ¥!$ !C &CBE` 7 D  C   C7 wDzyk . (zhf@yKL byKhzhfpyKxŞ|t: q b 0zt:K0D=@e ؚ@E~@#<}@y@ Zg(0e |he he PshE`h Zg(w ww e ؚ =#<}yE~b zt::DBzP}@s@w~y@Jwy:@~g'@ {Q@# z@c&_M@C @h@T;w@RBx@z_M@ѫBx@\f@$9pw@@y@#<}@d&^@zlf@g'f@y@@z@ylz@ RZg`W&p&h[&hX:`vZg(0`쩶Kh<hHh9h Zg`-)d&^C d&^ C =  Jwy:X:`:SYTISYSCRINI$Jwy: {QJwy: {Q.Jwy:222h r ` hr"w~y&`hhSYS$LOGIN:SY: Zg(P =U=7 ?~zlf Zg`Zg`~g'ylz Zg`"Zg`(ylz,Zg`.y2Zg` 4y8# z:#<}>Jwy:HJwy:JzNJwy:zLU%%E 7 7(& hZg` zP}~g'c&_M $9pw"s*T;w,s4~g' 8Zg`@Jwy:HPѫBx`RBxjX:`( nX:`&tJwy:vX:` v75 5U,SY0 54> |Jwy:X:` g'f\fJwy:g'f X:`  ,~g' 4X:`, BX:`JJwy:PJwy:X~g' ^X:`4 fX:`> nX:`04& (&<Jwy: Jwy:X:`( X:`&"Jwy:$_M(Jwy:*_M|b zt:QD:f{@ g'@[q@=@e |@~g'@t: q@t:s @Wy@#08@Wy@9x@b\w@vL@fw@fw@Jw2g@W@H @&~@ Zg(0}:h Zg(Bw@@w!; / 5@! B?7C`ר-&& & &  >H WyWy00*!! ::SY&6-q  6- 6-'6-':*:JJ z {QzZg(V "BD 7 J7OL J% %| X:` X:` X:` X:`"&X:`B(kwW,X:`D.lwy28X:`J \s $98 s X:`,2X:`J8z<znvz(~ƀ7OL % %[] .4& (-  > & - zX:`O X:`L$9pwsz&z*2& 0X:`. 8X:`4FsH$9:NX:`>^s`$9:nX:`tX:` xX:`lJ 4  :<  KRT; zsk&$9:(s.X:`2X:` >X:`:BX:`<LYPk`@b zt:dD@s@ g'@,~@~g'@0@t: q@W@/=@ylz@D@8@ @zY@`:`m@$9΅@S@@fw@fw@[(}@Jw2g@y@y@k@Ww2g@xx@t:Q@ BZg`Zg(0=dwhh^( hhj񏰁h0 Zg`  | g .PAUSE Pausing. To continue type "" >ContinuingDelayingValue not in range>  p3p|MCR UNS MCR RES START CONTINUE "  |Zg(!    && & & %Q%r% p " @ >PWw2g Zg`!S@ylz&Jw2g \Zg`p`S@dtWx[(} |Zg`>|  H w ȥ#Ћ D T  S M HS VS@ Ww2gfw Zg`"y (Zg`H,fw0t: q6kL/= xZg`S|fw& f&%& )\ 5@     r $9΅s ,Zg`\0fw6y@ g'F JD@8N,~RY\0`0fxxl~g'r`:`mx`:`m|kt  w t:Q~b zt:wfDzP}@s@4 @N &@Wy@C @Wy@s^@s`@`:`m@$9΅@$9@ZJw2g@y@#<}@W@*@:" @&~@ Zg(0=h Zg(    w C5%&  & & & & && & & & |d Jw2g&~`:`m:" &4 .W6*8C @WyHWyN`:`mZs`s^ ^WybWyV|  %%& ) w w>$9΅s$9 s2&~<yB#<}FzP}LN &Rslb <0zt:z<0DQ#@w~y@Jwy:@~g'@ {Q@;@|~Ş@zP(@[@zZ@[f @Ux@zzg@h@g'@ @[*K@© @t @U @z z@z X@zy@XR@ Zg`,X:`*jZg(0zhzt hzh^z,hxz.hrz9hzwh zBxhzAyh6zByh2zhL Zg`0DF=DL=XQ=GS=ST=CN=UI=4[f [*K[00*"!vATADATADATAUx {Q&U ,;X:`"  w~y Jwy:&& Zg( (0 &+7 (7 &A &wl( EmJ EJwwLr X:`(X:`&X:`(X:`&"© *X:`&0X:`(z XBhHNR2b pzt:zpD},@#w@g'v@#@@g'L^@@""Z@#""@# z@5s@g'0@zg'4@C @z@uVY@g'!@g'""@@ѫ@&""@&0"@;w2g@@RBx@""w@_M@zѫ,x@'t @ѫ@}@}M@ѫx@g'@""@g'Z@g'f@g'@z@#<}@}@_M@Rx@yK@z@ Zg(0^Cy\Mhk\Mh*Zg`Qmh Zg(b%( CeE--`0 E CeE T B Zg` Zg`$0 :Zg`L;w2gX;w2gZg`B&2<FPZdnx~   "$&&2(<*F,P.Z0d2n4x68:<>@B>",6@PX`jt~~  ", 6"@$P&X(`*j,t.~02468:<>@| HxQdsƁ{8  HX4S;" pp062ZZ L^ u~a!6g'4g'4"g',g'v6g'0@g'ZJg'L^Tg'afa vLOqw<OqBx:Ayz}z8.&""b&0"bRBxzX4zy8g'!g'fѫx>zJѫ,xT&""^&0"hRBx|zfK#<}#d$&&0 zX""`w"Y<}@%w""Zb""wb""b#" 8 yK#<}0# z8#@#""H#wf""Zp""wz""da't b|~Şb8{~d*k~M*k~,*[M ,&r &zC;4zTg'""'t $uVY} .}M 8P}, B} D"D<$><@u~@ddz6zjL_M_M\X\XY 'xx (T[zd"a &Cy$z>zѫ&0_M:_MDNѫxXC \x. Zx. ѫ5sb zt:}DzP}@@~g'@GP}@sP<@f@t: q@N 3@;w2g@sp!@zs0@[(}@:Jw2g@k@:_@ Zg(0R h Zg(SY: w :56 å å  %`& & &&& & Ε I F%Bȥ_@k ~g'FfJsp!NsP<Rzs0jfrfxzs0 6 ¥:2HW!$$E ffff|Z w.",GP};w2gH.48DJw2gdJw2gSY ff& & & & & & & Ε & Е:Е,& Е,  4U$(sP<,zs04FJw2gj:_xJw2gx&&00* "!yJ#<} NX:ohynX:op#<}h|  $| "   "e  & 6#<} zP}N &&T:.:" 2[NRbyb 0zt:(0D@ {Q@z@yZ@Zg` DZg`2 &%  %\ 2&   & %\ 2. {Q {Q .Zg` 6Zg`2 tZg` |Zg`2t&   @  %\2\\\\&f   &fw fE%6"N 6 .Zg` 4Zg`2N.TyZbzf.lfI&`    w $N 3Zg`_Missing Required ParameterIllegal sub-functionVariable not found or of the wrong typeXb Xbt::XD:E,K@۩ S@Jw2g@@ Zg`Zg(0~h Zg` @INDINI Zg( 2ɥ@%& # S є1"# $ɥ. ѕ є t(E,K۩ S4:Jw2g LZg`nJw2g|rb XBt: XD X:`Zg(0 h Zg(b zt:P9D@-@:@ e@yZ@@9s@.H@69/K@2@ 8@Jw2g@39@z@k@ !@ X:`Zg(099xZh`h>9YMhh>9h(49%h$69h:<9]hdthD9h6">9:h>9h19h X:` 0 Zg(&  ) S&  J&   A&   f֋w & 7N -:-$0.H6yZB.HHyZ` !pkzX:`~X:``|  : fwww7V X:`X:` X:`(Jw2g< eB 8F2J39L@9sR39V69/K\69/K0 b zt:Q9D g'@~g'@g'@c}p@ 8@k@ T`ET`,T` ,T`,Zg`"Zg(0.498;h59Wh T`EMCR T`00*"!vATADATADATA T` @ T` g'T`ECLI T` T` @ T` g'T`E TRACE T` T`  T`g'T`E DELETEF T` T`  T`g'T`E LOCAL T` T`  T`g'T`ECONTROL-Z T`   T`   T`  g'T`E% %GLOBAL T`   T`  @ T`  g'T`E,,SUBSTITUTION T` T`  T`g'T`E99LOWERCASE T` T`  T`g'T`ECCESCAPE-SEQ T` T`  T` g'T`EN NESCAPE T` T`  T`g'T`EU UQUIET T` T`  T`g'T`E[ [TIMEOUT T` T`  T` g'T`Ec cPOTASK T` T`  T`~g'T`EjjFMS T` T`  T`~g'T`EnnFULL-DUPLEX T` T`  T`~g'T`Ez zDISPLAY T`   T`  T`   g'T`E ATTACH T`"" T` "" T`"" g'T`E DETACH T`$$ T` $$ T`$$ g'T`E DECIMAL T`&& T` && T`&& g'T`E TRUNCATE T`(( T` (( T`(( g'T`E OVERFLOW T`** T` ** T`** g'T`E Zg(2&    B y< w4 k T`Ec}p T` $T` &T`. 8fb XJt:'XD X:`yh hYqh b 0zt:'0D}@}?@@Jwy:@w~y@:.@}@&f@&s@~g'@}?@}/@z}@}B@}@}@&@}2@t: q@aRx(@|~Ş@&<@y@& N@&""@&0"@&x@z&N`@ @&,@c}p@) @&Fy@&Ny@)W@)r@)H@}m"@}n"@}t"@t @}s"@z&.@Jw2g@&,@k@)p!@&4d@&@&p@&@)H@&@v@&\g@ X:`&"Zg(0rhZg` X:`"  w~y Jwy:Zg(p5   Dj wW\& &5 U5~g'k Zg`c}p Zg`j &Zg`W( )W ,Jw2g2aRx( 8Zg`@t FX:` JX:` PX:`T:.bX:` j~g'xl p&ʝ    \wX:` X:`"|~Ş&X:`* .4|~Ş:v@|~ŞH|~ŞP|~ŞX|~Ş ^Zg`jyl&""pyr&0"vt: qZg`"8x}B}}n"  )H  }}m" )H Zg(8 Zg(}B}}n" )H } }m"8~ )H Zg(8}?  )H  } )H } )   )p! }/ )r Zg(68t Zg(8} )    )p!  }/ )r Zg(}?}}n" )H }}m"P88~ )H Zg(8}  )    )p! Zg(}B}}n" )H Zg(8} )  j88x )p! }/ )r Zg( Zg(8 Zg(}B}n"00*"!/=h B&"  .~%   ¥8¥9"[ȥ*  W .w)Х](  F! f7 7@, @b\X:`g'!k&X:`."8X:` HX:`RX:`XJw2g`Jw2gfX:`rJw2gvJw2g| ww C  3 ¥ ¥   w 75BCB@ &  & VJw2g zP}N 3t: qW kJoNg'!TX:`Z~g'jNKvX:` |X:`h&&f&& Ε & &&f&& Ε  57@a0 {Q (X:`0 {QPX:`VX:`^g'!hb Vӳz:VӳDj<&@<&Kq@p@`@Hگ@'@9 ghkh0Dz*}hE,zKh\yh:dh:lzh^ gh*`hy Zg`dZg(0Zg(( ?Ty$IPP Version M01.05 (ANSI)IPP -- : Zg|# :?TSY 00*$"!vATADATADATAX:`گ Zg(~\\~~ kk<&9<&Kq<&D '2 IPP>2 P , ,SYt <&RRgTT SY ?Ty  Illegal switchNo lists or wild cards allowedNo input file specifiedOpen failure on input fileOpen failure on output fileI/O error on input fileI/O error on output fileClose failure on output fileClose failure on input fileInput file directory not f'oundOutput file directory not found Zg`ANDqASK>ASKN;ASKS=BEGINMCHAINNCLOSE@DATA4DECFDELAYVDISABLE5ENABLE6ENDJERASE?EXITKFORMXGOSUB3GOTO0IFzIFA|CTuIFDFoIFDISABLEDyIFENABLEDxIFFmIFINSsIFLOAvIFNACTtIFNDFnIFNINSrIFNLOAwIFTlINC9ONERRPOPENIOPENAGOPENRHORpPARSEAPAUSEOREADQRETURNSTRLENFSUCCESJSYDISK\SYMTYPESYSDEV]SYSID@SYSTEM?SYSUICcSYTYPmSYUNITDTICLPPXTICWIDYTIME`TIMOUT:TISPEDWTITYPEVTRUEOUICaVERSNnWARNINKA Zg(xi 0 7 w&7   5zX:` X:`, X:`0"X:`(X:`.=4X:`:ZX@X:`HX:`ZX:` ^X:`bs:(x j?Ty pX:`lt. L ߇5#  nczX:` ?Ty.X:`X:` ?TyL&X:` ,X:`0a8X:`>|' @X:` DX:`H' q NX:` Zhp! f?TycVl0# H}w7|X:` X:` X:`X:`X:`X:`X:`|' X:`l "X:`0&' ,X:`8hp! D?Ty}JX:`RX:`b.7* *we  &! H?~X:`X:` X:` X:`X:`* X:`} $9! *?Ty0X:` X:`H$9~Z X?Ty^X:`h$9~Z x?Ty~X:`|f|,. f~7,..,` A5@E (/̋ե>7W jX:`X:` Zg`X:`, X:`.*X:`.X:` 2Zg`4X:`,:X:`.>X:`.BX:`,jX:`j72,7 7 #7777 .w .m.7 .w ..-. 7zX:` Zg`2X:`X:`Zg` $Zg`,Zg`2X:`:X:`.>X:`.BX:`.JX:`.NX:`.RX:`.VX:`.^O &f- Z "7Qwҝ@ wW#A!@ 5  D &ffE 6Zg`O Zg`-$X:`.X:`:X:`V\<00*,"! : :     &.# ӥ    åaEJ Zg`  kg'8Jw2g  *ff& e w!w!UU:y`Lz XRzP}Nb @zt:)z@D g'@zhf@ݪK@z@yZ@/=00*<"!e JNa ^ ^ 8&  l@    \ G& 6>w;w" N N@N 3 "X:`>6ݪK\ihX:`A N NPN ,#{uww A ^5  7  ]w &   J H y`X:`X:`X:`$X:`4 g'>zyFzhfLX:`RzVk^Wd jk vZg`09# 8w> zyt!h.9wWh"Jwy:hf`hBw~yhf g'hhr!yhg'vht hjyyhT:h(~g'h"& h8""|Nhz NVNhShUkg'hhsPBa(}ht:!h:yht:GdhT|<hD hPt:Qh@Zg(( Zg`BEGINEND Zg( - 5e 70 0   7 ww00*D"+J"vATADATADATAw` wP5 lt:p: z Xh z X$lԀ*vL0kg'4E,K@۩ SJ""Pt:Vt:#&Zt::d^E,KbvL`fE,KzE,K| 7E w.|"G xפ:[@Spxd xdxdE,Kk&&~,xd8X:`H?H@HHHHH@HHv:쩺H kH*H* H*H+(2H+KH,!H,"H,H-|qH- H.fH1pXH3(#H3H#H4sH5H6,6MH6 66H6H6e469H69H6.:H6\:j6yH6y86ąR8Xq-8rH=8H>WH?p:H@&H@(HRHɪ}H̪PdͪyΪHת઀%Hm'HH$=H/WH/nYHC,FHUHmPszzpzzzzz8z`zzzzzzzz(zPzxzHzHzHzHzHzHzHzHzHzHzHzHzHzzHzHzHzHzHzHzHzHzHzHzHzHzHz7Hz8Hz9Hz;HzHz?Hz@zHzHzHzHzHzzzz@zz|H|g'|KH|CTH}`;HH HxQHRTH̫$ -̫s ̫sHS `;H>a-Bh)HZ0HEH*},% )?Ty:,y: y: 8y:D,y:e4y:oQjy:8Xy::d-y:rHy:ąRb DXzy:,DXD+K@RT@ k@g'@* @Bh)@@(@,@6@*@ɪ}@6@zZ0@d;@z@z@ @1pX@$k@vm@5@xQ@:t!@@ T6,h        7  me  t Z0,  , (d;2+K6d;:RTDxQJxQN5Vd;`d1pXl@(r$kv$k| k|L wEeK 5 eK f&f 2 ɜ  D 66vmz0:t!2g'\`rxQxRT~6` wfĝd  fĝd ĝ Seb@(Bh)z*f*d"ɪ}( .* f2* d6ɪ}<$k@$kDɪ}T$k b zy: D:(}@< @#@@@@@@@* @6@@z@@@ݪK@,@#""@6@@@:t @:br@*@69@ͪy@Z0@z:s@6y@< @̪Pd@*@ @:@@C,F@< vQ@̫s @T;;"@vm@<@r@2$9!@)?T@< Ba@ r 6 h DMi DM/ DL(( DLP( DRD/"" DRav 22 (DR00+T"J"vATADATADATA7  DR/ DR`7   F   TSK>$6:br<6y@N:t f:spC,FLBN(S)=  dd ҝ7  -e--7V:t *,*d2* d6Z0HL,R,Zb,p,x,r%DU7 7 5wLHJ5C, 5:7 W! ,C,FC,F < Ba"*(2686Z0FZ0LZ0Z x< Baz*    5wP єєє$ W P37(  (¥: z< * 66 < vQ"*, 2)?T>̪PdBͪyFP̪PdT$9! V6y\6ybfn   ! W"C fD`N % 7!  ȋҔ  &@  . PVZ`dxr|% 4  Е Е  1  A 2  Е:     % wRr T;;" 6yͪyZ0&Z0*6 P:(}X<l:(}rvͪy|7 E  f 6wd f &wd  w ʋ Uf ~  < *Z0*f Z0(*d0* f8* d> B:HT#""V̫s Z69j< l*pvrp $ W!f    0  a ff a Q % %ea e`q  ¥##̫s Ћ ¥.Ћȋȥ ȥ ȥ:ȥ,Ћȥ ȥ ww Pew  h - w`w p cW xptlԝ`ԊZ%4 4 e7J  cW t %PZ04^Z0 wR    A B %  w .    2 Z0Z0P6T6X~̀` ww ew 5 w< ZV w )wwz6 vm$6(64< Ba6*@6D6P6V6^6b6frvzC,F R%  RRRR%  % wAE @@` C e@ 7(C,F6 H6ZݪKhݪKX w  f   b Xzy: XDRT@* @@(@,@6@*@6@Z0@z@d;@ @$k@2vm@vm@xQ@ 06yh  w    Hew      7 ~  d Z06 *xQ,60xQ266RTZ0JRvmX*f` f* fn$kvRT    %7  w  "$   E &fb, ,  RT*RT026 6xQ866BvmJzjd;v&f      ҂  `d 2 wbr1rA  VZ06 xQ RT&6,@(>d;B6FxQLxQbvmlZ0rZ0B   % eL  ݇vm,vm b ͨzy:D,00+\"!̫s h~zfYh|g'hrh h|h@hzphThK)?ThrzhZzh`vWhzhfzhlz8hr*% hzz`hxzh~*}h )VV ns$:2 nsr r MCR>-- z z # ze4MFMUMMMS@DY@Command I/O errorSyntax errorDevice not in systemDriver not loadedIllegal UICIllegal  keyword valuePrivilege violationFailed to attach device - DDNNNot file structured deviceCommand too longUndefined density selectionUnit does not support density switchUnit does not support high/low density selectionUnit does not support 800 BPIUnit does not support 1600 BPIUnit does not support 6250 BPIDevice not ready - DDNNHome block I/O errorIndex file I~/O errorStorage bitmap file I/O errorUnit is not at low densityUnit is not at high densityI/O error on device - DDNNDevice offline - DDNNWrong volume label *** Attention ***This volume is operating with a replacement home blockPlease tavke the action outlined in the documentationThis program must be invoked as an MCR functionz%INfjzpxs7 %HO|sw/w  !נ נА w-: ܇w s`dlsnVIF& & &  f&& n& Ε 1.R`  & n¥"N  • V"n0:sdn   n ׭`3VSPMJGD,F<K<f9w63Fn"# z($9!6<BHNTZ`,dFjKpfvw|f0-*&'EX]r    DwR &E"X(].r4:@FJPTZ `p#""v}`; НН Е:PzwP@ V @r6z 2 ѕ ѕ-ѕ-ѕ ;ȋ :} ee`;:_.zJrPzX̫sp̫s^"ȋ" 7 7 ȥ/ȋwV- wB095N:2TVd@"%DY55w5w55wV5wPC5  55A E w "6y&6y86yD6yV w w w wwf- B5@ & & & & & & & & Ε w0^6yl:wv6y b 0zy:e40Dz@8r@@&@+K@#@@ k@4s@+(2@6@?p:@- @zau~@6@Z0@< @:@*@.f@C,F@>W@̫s @3H#@vm@r@5@Hz@*@=8@ 6e4hR = au~ K "%(+.147:=@CJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECDECFILE11A 6"%( + .147:=@CRxR7 7 N 5  . % 6 6N6 vm< *"&r*#,̫s 0Z0>Z0BH6N6T5Z4sf+Kn@&5  eR  "$,-&e<e 00+d"J"vATADATADATA AU`#̫s  Hz 3H#">W,=828r8+(2>.fD?p:J- PC,FVC,F\dau~|BUU e   e< T e$Е e ʋ eՕ[f   fޝJՕ0au~V>Wt=8,f  Pޝ4Օ]eFP  R F  w ՝՝ r e0N=8$FHZ0J6 N kP6T kV6Zvm`zfj::e0U d e _vߋt ***THIS VOLUME DOES NOT CONTAIN A HARDWARE BOOTABLE SYSTEM  *** nb ̀zy:oQ̀D,"@8r@:!@au~@Z0@/W@d;@nH@:t@6y@z@z@r/nY@>W@먛@:w@:y@,!@:@z@@=8@z8@ 6\:hz VOL1D%B000DECFILE11AHDR100010000000100 00000 00000 000000DECFILE11AEOF14444444444324410 P=j6y|au~|^ w%MS  5w5wU Vw  $  v-z^z,"nH&,!.6y4z8:6y@zF,!J,!VzZZ0bj>Wr먛tZ0 xv~au~d   %) BEN        12ÝV Z0 Z0% /nY&28rWHZ0L^zbZ0fItz~z̀ B 4 .ˋД   & ) &f,.:t6:y>:wF:!N:TZ0r6yJl d e0 e0e0 &fPЕ d;d;0b ̀zy:8X̀Dz@@&@RT@Ϊ@ k@* @@(@o:@6@*@au~@6@zZ0@z@z@z@z@z@z@z@ @1pX@5@xQ@ 6h\ zrjbZR00+l"!Jz^@&S ee@   w  w  w w  x  B.z -%%%! %  % mVw ** @@&Z@&no:v6z62w @ @ d  Z0 6 6b l0zy::dl0DBTd@z@HW@< @v:@,"@@@d @e8@H4@@&@zH@8r@+K@s@l6p@Ϊ@ k@ny@g'@H@z@HU@:@4s@,@zer@,@:@p:@H@+(2@:2@TJg@$9k@Hkf@6@ @:t @?p:@e@z઀%@df@- @*@Hf@r@T'@H@Hf@ep:@}@z@`;@ͪy@w*@zH(@f@@6@쩺@PM@H @@d;@/W@@Ju~@6y@f@R@zzP@ @z@X@|K@z@z@a@T^@z@}@{mBx@z@z@z@zz@z@z@:@/K@d@~@0# @HM@/nY@ת@.f@*@z8@z7@zz9@z?@z@@m @>W@z@TS@1pX@@@i@'@\f@$k@z@@z3(#@먛@< vQ@Hiw@6M@@<@3H#@P@J@'xx@H@vm@'`J@@zu@$=@|g'@5@HBa@B@H6@xQ@HoQ@ @Hfa@̫s@|@8@ds@zHz@:t!@@@,!@Hv:@Ht:@z@z@z@H@:_@z@z@z@=8@zKq@d&T@% @< Ba@@H#@z@  8Xqh>ah̫e y:yh̫$ hHy:Gh: v   ** Volume information for ** Label = (was: /Bad = [OvrAutoNoautoMan /Cha = [AtchDc:t  6y |f /Dens = 80016006250HighLow /Ext = /Fpro = [ /Indx = BegMidEndBlk: /Inf = /Lru = /Mxf = /Pro = [ /Uic = [ /Win = RWED,RWED,RWED,RWED] Theoretical maximum files = Maximum possible files = Volume initialized as single directory device /Accesst = (space) /Owner = The Homeblock revision count is , Last revised on Volume created on Volume initialized with P/OS defaults /Clf = ot  ӕӕ 7 7 7 w  w~>W 6M=88&r*f2 6p:>s@4sF먛J3(#N̫sR`;V,Zת`z f j̫e n0# Jl7 5#EEw  ЕЕ~z̫s Hkf3H#3(#HHW 3H#"HkfHfH4HBa (z,=80e86er:df@d Dep:Hds`  5 5-DT -DD-EM  5  5~4sd ::Ht:HoQ 3(#ת"Hkf$3H#*2:B:H:LHN3(#Tת^HoQv2500+|"!W.% 2D>>WRHWT3(#ZHBa\3H#bMn$=fЕ) 5w(5l 5Нw  w 8T 5`r % ͪyHkf3H# HoQ"3(#(% ,l8H:3H#@먛FwT% Xͪy`תf% jTv< x*~` xd j5Е,] R5Е,j :Е] m  5v  Fd< Ba*(]4< vQ6*@jR% VͪyZ% ^mn+(2tv^5  Е,z Е] %DY=} %DY5 %MF  5F+(2z(% ,ͪy28% <}JR,!Z`jt n 5wB H  Е.    h6y "% &ͪy*HoQ,3(#6% :H- N:X% \ͪy`% dp.fz% ~ͪyV K 5 5 5    Е. \ת % "g'(4g':D:t!Fg'LVb6h<r% vͪyz% ~  Е.  `  Е.  . Е. 5d1pX:% "ͪy&% *64s<4sF:P% TͪyX% \h5n:x% |ͪyN   5~    Е, tHoQ3(# /nY% "8r,% 0ͪy4% 8Hfa:3(#@~L/nYR/WV/nYbn=8t:|=8 Е] 5wx j Е.  B Е.Е   p:% ͪyHoQ3(#$% (4?p:::D% HͪyL% P\+Kb:p% tͪyx% |תF#  Е.Е Е  5'=. Е Е  Е Е % ЕP#,":4% 8ͪy3H#D% H=^% bͪyh% t Е  D! z  ^ ~  < \Е ЕaЕtЕ V% ͪyת%  ,2:6<H R% VͪyZ% ^jJu~l> PPЕ:PPЕ:PP P    &@  e.Ju~ % $ͪy2^'da̫e 8҂҂: 6,"T"r6/f : : : : : :6 , $:T ("*r .:6 6: ACCESS  ̫e 4 4 :BAD  ̫e : : :  CHA    ̫e @@CLF  ̫e DD DENS  ̫e HHEXT    ̫e LL FPRO:    ̫e PP$$! !INDX ! !̫e T T* :*&&INF & &̫e Z ZN :N**MXF * *̫e ``VV..OVR 00+"J"vATADATADATA. .̫e d d :2 2OWNER 2 2̫e jj^^88PRO 8 8̫e nn<<UIC < <̫e rr@@WIN @ @̫e vvDDLRU D D̫e zzHHVI   H H̫e ~~K KNAME ""K K̫e  :PPSDI $$P P̫e  :TTST3 &&T T̫e   : XXPOS ((X X̫e Ăp="T"r=[2 : :p :T "r\ \NOAUTO **\ \̫e | :|c cAUTO ,,c c̫e  :hhMAN ..h h̫e  :llOVR 00l l̫e tĂ,],=[& :t :,p pATCH 22p p̫e L :LuuDCF 44u u̫e "DĂ,],=†,=: :D :, :, :y y1600 66y y̫e , :,~~800 88~ ~̫e  , :, 6250 :: ̫e  , :, HIGH << ̫e   , :,LOW >> ̫e ,Ă=†,==6 :, : :, :BEG @@ ̫e , ,, :,MID BB ̫e 2 2, :,END DD ̫e 8 8 , : ,BLK FF ̫e >P>FĂ:†,=†<,=†P,=[j"T"jr,,=†z~F : :, :<, :P", (:*.j 2:T 6" ::jJ[‚t,‚|],=†X,L,=,"T"r,,,z : :t :|, :X, :L", (:*, .:T 2"4r 8::, >:@, D:F,,," :, : ,:X7 ww v̫s:2e:2eJ `;&̫s*̫s.PM6z@ :BHzLl6pP쩺T,"JTwww w5U5~T^Td  zPTST' zTS$z(@.z2~6u:\f<BHfD3H#Hd&TZ5 wwB,ww5ww 5U |'xx \f z@TJgz"(z ,4z8w*:@zD Hv:LKqNTHoQV3(#w 5U&f C 5UCB eA e A EBrת z?f8r6y$,!04'`J:B<BHzD3H#HLP6T6bd;xl B w - - & J &-~m d;઀%઀%$R*R.,26<઀%@઀%Hd;PRVRb6f600+"!,B, F5Lz̀25  w% % wR UUUww z̫s HoQ 3(#}z}$},}2z6:>W@}H< BaJ*P< R*X< vQZ*^H pzp Uw%wwTwF7 7 U 7 Ui U nyH3(#,!J$z(J*- .H#6.fHfa@3(#DJJzX8r^Hf`3(# ww7 7 7 7 7 EE E@EU| p(H3H#먛z/nYzӀ,Mplw jMf`]^Z7 X7 VU 7 w "7   Н 7 p&H(3(#0|g'4|6 :/K>|KN T:2Z|g'`|g'f|g'l|{mBx r:2v|Kz he w7 5" 7 "w5" 7 "w65"5~|g'|K|g'|g'"/K(".|04|K6}:"D"J|LP|KR}V"`"fHf\  w%U!5w5U%3(# |z|K| 먛$H&3H#,HfH .3(#4z8Hfa:3(#@/nYFHfaH3(#N|KT/nYX/Wd b 7 " az  #$@wUwU  j||K /nYb ":20:2T/nYZz^H`3(#f/nYlzpHfar3(#xתw5 %c % 5 $ %d5% %c cVת z5@&Hz3H#(@&2@&8Hkf:3H#FidHzf3H#n@&\c@1pXb l0zy:rl0DB< H6e4@HWH6 @HHH4H:2@HH@6@HUH2@HHzHkfH z}@8Xq@:br@HfHHH@HfH;F4 @C @4@$9B@H(HeZ@H H6ą@z6y@6.:H<zP@< H{mBxH6\:@mPs@HMHת@:@6,@T; z@$9^@< vQH̫s @zHiwH#H HH @r@H6HHBaHHoQHHfaH:t!HHv:H@Ht:H ت4M@x@HHz:@y@z@< BaHH#H$9@ 2,"h@&h:8rh+KhRThΪhhhzh7hhihhJh2hh7hhlhZhhhhzhhhg'h* h hRhhhN;h9hhnhJO:hhz7hNhh#hBh)hJzS Xh@(h,h00+"J"vATADATADATA2h}`;h6hhb|CThXh+(2hh9o:hh6hhszhN?p:heh.- h઀%h*hUh-|qh`;h0au~h 69hɪ}hp69h26hvPhzZ0h PMh*쩺h /Wh\hnJu~h6yh2Rh>m'h@ hpzh>zhzh(zhzhxzzhJzhZzh`zh8zh.zhzhzhrzhzhzhzhzhTzhzhDzzh~|KhV~hzh*hz=hz?hz8h/nYhl.fhz7hz9h h<zv gh1pXh>WhC,FhfWh8먛hZ3(#h$kh6Mhvmh3H#h;F vhEhD'xxhvmhz'`Jh$=hx5hxQh̫sh6|hFhzh zh$,!hzhzhhzh=8hB?h khzhlzhzhzhfzh(    XXVolume mounted Files-11I/O error sizing device - DDNNAllocation for SYS :2:|file exceeds volume limitBitmap too large - increase clusterfactorHomeblock allocate write errorDevice write locked - DDNNWARNING - Boot Block write errorIndex file bitmap I/O errorBad block header I/O errorMFD file header I/O errorNull filte header I/O errorCheckpoint file header I/O errorMFD write errorMagtape label must be specifiedMagtape device error - DDNNMagtape write error - DDNNSearching for bad block descriptor fileInvalid block number - 00000000000Duplicate block nulmber - 00000000000Storage Bitmap file header I/O errorWARNING - Block 0 is badDisk is alignment cartridgeFailed to read bad block fileVolume name too longUnrecognized disk typeBad block file fullIllegal argument valueVolume mounted foreignd with ACPPublic device - DDNNDevice not allocated to this terminal - DDNNValue of (/INF + 5) exceeds /MXFManufacturer's bad sector file corruptFailed to read manufacturer's bad sector fileFailed to read software bad sector filePreallocation \insufficient to fill 1st Index file headerPreallocated too many headers for single header Index filePreallocation insufficient to fill 1st and 2nd Index file headersWARNING -- This volume is not backwards compatible MXF too large for existing TbitmapMXF less than or equal to the existing valueFailed to find Home blockFailed to place alternate Home blockIllegal operation for magtapeIllegal MXF value for single directory volumeMutually exclusive switches specifiedSwitch is not legalYL for this device typeSwitch is not legal in this modeDevice is not mounted foreignd   2: 288y:cV Vll" ): C ;F4 ت4M24z}xw@t 5     &o@ 72~X@8Xq(6\:.ת46ą:6 >6,B6yF6e4J6N̫s RXy\&z20Jd{ivspmh7eRbl_\YVS NIFC@ZJdi $*076Ra@6y@zx@z@:@z<@z=@.f@z;@HM@>W@z3(#@6M@vm@̫s @3H#@H@vm@$=@r@5@HBa@H6@xQ@=8@H#@"z>@ 06ąhF = au~ l "%(+.147:=@CJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC7   Eew z"%( + .147:=@CB6F kH6LZ0N6 RvmX$9kZ6yb6h6rw% % % -@ ~ :@ n  Be5R wL6 z=Z0*+KR6T kX6Z kj>WnHBap3H#~5 ~ RT UA w5-ww-wUwvzx HW3(#$=&6M*>W6H483H#DݪKP,THUV3(#\5bz;h5nz<r5xH4z3H#nj5Uw5 Uw 55"U"Uw"55 H 3(#=8H43H#"=8&Hf(3(#.8r4H463H#>8rBHD3(#T+(2X+(2^H4`3H#h+(2lH(n$Uw$5,Uw,5-Uw-5 ..U3(# .fH43H#.fH6 3(#&?p:,H4.3H#6?p::H#<3(#B- HH4J3H#R- VHMX3(#^4slH4>w.De<~5fe/e  AUUU  65w6De/~ L3H# 4sJu~"H4$3H#*2au~H^H`3(#hr ~>a5w5@e& Е  ʋ 5fef   ޝ f  ޝ@ :H43H#HW3(#46MBHD3(#V=8j=8x6@    $ w  A@@mA eA |Z06  k6 k"6&vm,*.6 2vm8Z0<*P#R̫s VZ0X6 \vmv* w7 wAB `e B w7 ww w &  D7a e  7 6 6 6vmz*4xQ8RTRT@SFSLz>PTrX\r`drjSrݪK e@  7w  $     ՝՝ r eS ݪKZ06 "6&6*vm0* 26 6vmRT@SFSLz>PTrX\r`drjSrݪK e@  7w  $     ՝՝ r eS ݪKZ0<0b (6J@7`900,"J"vATADATADATAf3/33323AXM3Dh3Sp!3`33'xx3'I3'I3'J3'8J3'`J3R) g3\)z 0\) 0\)  0\)K 0) 0)[M 0) 0)P 0), 0)nE 0)sE 0)E 0)_G 0)G 0)2H 0)4 0)Z 0)' 0)Ty 0) 0)% 0)' 0)^ 0)Ps 0) 0) 0)% 0)L 0)W 0)W 0) 0)Z 0)8 0)p 0) 0) 0)w 0)p 0)Kq 0) 0) 0)t 0) 0) 0)Bx 0) 0)! 0)d 0)Vg 0)[} 0)X 0)p 0) 0) 0234 g3:oKl:pKl:Pl;F v3_M g3Q g3Z3Z23Zlz3[Y 0[Y 0[8 0[ 0[8 0[W 0[ 0[Z 0[# 0[<} 0[X 0:d23e@~3df`'3dfy3f@Q3f3f23#g`34g3Hm:3 q g3Tq8^3vP3v g3xPs3x g3yr3!{Y 0!{Y 0&{t 0&{P 0&{W 0&{W 0&{W 0&{Z 0&{ 0.{V& 0+}W3z~@Q3{~P<3~ g3~3~@~3[ 3@Q323$ g3Xv3Z3$3Z~3EVEp33 0lL3.3.3.3M3۩ S쩷233^K3p6Ew6w36w 06x6xl6Sy,8r3VK^K3P3ت,3ت.3ܪ"ݪ3jL3Ap3As3R:3Rl23:d33@Q3ϫ3xx3㫀 3R33je;Ⱛ3D33\3:p :`' 0:(V:8,:r36Ew6x6xl6Sy,b 0z:p 0D"AXM@|'@Z@6w@Sp!@Xv@Tq8^@)L@T; z@;F v@ @Dh@Z a۠>VKhEVhEhܪ"hphG0pje;hh a9  INS -- Task image I/O error GM&%D  U?N3e&@ S & "& H|' )L (AXM0Xv6;F v:;F v\Tq8^l;F v|Sp!|?w%d QJ%<<D  U?P3el;F v;F va;F vDh"T; z$a.a 4|'6 )L ><F<TAXM\Xvb;F vf;F v|&@ S & "& ?% 7ww wv Tq8^;F v,Sp!0;F v4;F v>ZB;F vFDhLT; zVa Za^aba fana va z6w4b z6EwD.@p@.@e@~@8r@l6p@~@~@^K@|'@2@lL@6w@zc6@2@쩷2@*S@@/@㫀 @)L@'I@@ @@ <@:06Ewh <@; INS -- Task name already in use INS -- No pool space U L7& ((0 e  T pEU5 A A A A EpP*.00,""8rD*SF'IZpblLfjl6pn쩷2x^K||'~ )L   X@A 1-1- 0tn 7 6w ^^KlLplLX"2N~@~R㫀 VZ2`jnn/r<@|<@$t   # w <@ <@#"6w&b T0z:`'T0D)HN:(}@[XH)^H.@)H>\)KH)nEH)sEH)EH(ԃ@&{PH`z[8H&{H^K@|'@*jL@)H#)H4)H^K@)_GH))TyH$:@:p@)H&{ZHz)H0)GHlL@[#H6w@) H,)BxH) H-VK@)2HH4^K@)[MH )pHⰫ@۩ S@zM@)w H.)H)PH8)KqH[YH)H\[YHz@) H2)t H)ZHP)H)[}H)8Hz)!H@.{V&Hs(@[H~@[ZH)ZH)WHH[<}H)WHBX@)pH")LH<) H:)%Hz)H[WH)dH:)4H=Df@!{YH )'H&!{YH'I@)PsH*)%H [H &{t H)'H(@z)pH\@),H/@)VgH<[8H)XH^\)zH\) H\)H&{WH&{WH&{WH@ *a۠ hP0h6wh a6 6JJSYNNLBrrt t 0 0 P0P0   RESFSLr:`1C-1 INS -- Command I/O error INS -- Syntax error INS -- File not `  \Ⱛ r":$&(*,`.10C2-468:<1>Bfound INS -- Illegal device/volume INS -- File not contiguous INS -- Device not mounted INS -- Device not in system INS -- Command too long INS -- Device offline INS -- File protection violation INS -- File not properly closed INS -- No po:ol space INS -- Task image I/O error INS -- CPRSX$SYS exceeded page file quota INS -- CPRSX$SYS exceeded working set limit INS -- CPRSX$SYS exceeded virtual address space INS -- CPRSX$SYS exceeded byte count limit INS -- CPRSX$SYS section tab;2le full INS -- Remote install error - VMS error code: q!q INS -- File not task imageo `7 57 7 7 SYJ7 E AW P W nWkW$W$3AW `W]f۩ Sa*jL'Ia a$a(a.aJ2.6X:۩ S@aDVK|W/ HU W$W:w7 55W  P Շwwx 5U7NJ&E ba$a*a0a8aVa^afajanaNpaJvaЕ[ Е,  Е]5 a- w  vHE W R a:*:4aL۩ SX۩ Sh~lDfns(rVK va۰z^KtQW NW xW ` @ӥ*W U S 5@P7H7J7B7p a$VK2~6Df8s(<|'>aیHaۺLPT`zb jaPpMvM|lLlD7Fwwww (5 E Uw# 1~lL lLa۶^K^Ka۸ ^K$^K2a@aDaNaRa Za `a fa1XHf Ci" " : w& & & & & & & Ε 5x aH af aۺ a  aC "ai,:(}6:(} :a:@6w La۾ Paےb:plԃna~a57E f :e5   Pɋ AW WW WN aaa00,"J"vATADATADATA a4a8a@aH\N\VaP/ P w Vb X::(XDp@ yjb tX::8,tXD <@R۩ Sh <@)V b pz6xpD.@s@je;@.@ch, @:P@*W@^K@R) g@+}W@Q g@P@z$ g@2@@6w@6w@VK@^K@*f@EV@2@yr@쩷2@xPs@E@d&e@z2@+s@dfy@R@x g@`@㫀 @2@Z~@nhH@$9΅@)W@:d2@:oK@:pK@zi@*@ q g@'I@'I@4 g@_M g@'xx@'J@'8J@~ g@jL@lh8Y@ @@bd&^@As@$@p@:_@4g@.@ <@06xh <@XX  INS -- Illegal UIC INS -- Too many LUNs INS -- Illegal device INS -- No pool space INS -- Tatsk may not be run INS -- Task activeQ|x|~W4|R)|z_Mx|f| q|Z|Q|$|R.Q g4x g:~ g@4 gFR) gL_M gRxPsX4g^ q gdZ~j$ gp$eq   4   < e> Xw^w`5T T=  6W#OV>VK ^Kp &\㫀 `+sb'8Jj2|$ww   F v50T@& NA `    B <@<@ <@s,4쩷2\ib2l2r2 e  T T T% T T e ep e,qe5 f2 )W 2$)W(2,)W226㫀 >2FpJ^KNje;R㫀 xd&ez'xxt qQ$5 5qQ$  5m 68UU@5@E@e&  v -V*W'Jd&^'xx**,'I2+}W8+}W<RBRV.bnyrz:d2-Ae",AP $B 2 150 PAsnhH AsnhHlh8Y jL&P*2.nhH6nhH>ch, R2l , ,1,ew.Uw.5? w.5 5fA A L6w <@&Q g44g:*f<'IBdfyH$P.X.h`n2L|5B7 7 777!7 7 7 7 |:oK :pK :P.<@ <@  <@$<@(<@!,<@0<@6<@ <<@ @FH<@n0!5!55 U  U??%-/W! |<@ <@!.<@! .&EV(<@,E.<@ 2<@<.H.T`Z`^$9΅`shVKjeq  ("<R&ePP A Е:U p w\VK ^K <@( "<@< (<@R>:_L.P6w V<@p \<@ b<@h6wj)b pz6xpD.@.@f2@l6p@Z@#g`@^K@|'@*jL@:d@2@Z2@zd&#@@P@ت,@f@Q@6w@VK@ϫ@^K@@Q@f@+@M@d6@2@zf6f@yr@f6g@쩷2@uX@9x@nH@*@*S@2@*'@d&e@ت.@+s@@zR@/@ݪ@h6@2@㫀 @~@w6 X@i6f@{~P<@)L@i@Ap@'I@'I@z" L@@'xx@'J@'8J@'`J@[(}@@jL@Zlz@@Q@ @@d&@z~@Q@zAs@p@u@u@R:@"^@:_@g6 @d&T@n6VN@je;@:d2@e@~@p@.@Z*R@xx@ <@0z6xhRh.:pKh:oKh:Ph <@,00,""ApL<@T<@b<@h<@vAs|As3&7 & 55E@B&57m5@  5 5w8 5 `㫀  <@22&...@.F<@LP^f.n.xd&ez'xxbBm w" (5 5 U 7 s<5@ 5w U5 E5U552d&e'xx2F.R.Z.h.|ݪ w U7 7 A5w w A A A A 55U 05W W Bw ^ 650RRF.Rd&#T'xxrv<@Z?3w lAm &AeEA A A A B 5  B 55 5 w 5$ <@R.Z.t<@@5 5735/ 5(5$5#  ( le B U@5 w>.d&'xx$.2.:.@d&B'xxrd&t'00,"J"vATADATADATAxxR` wD U 5  5 wd U5Us:55 w 5U05Y5 5 52ݪF+H'8JP.\.h+sj'8Jz. T w"56555 (5$55 5&m5 55a5\5h.*R'I$Z2&ϫ,ݪ8Zlz:ϫBf2DϫL.T.dZfϫtZlzvϫ~fJW55 O5K Hf * 5? 55@55 5w eU050 5 @ϫ..*<@>.F.\*'^'Jz+s|'8Jet`(N`&%ws2E@s`(s`<555 5 5w U 3*<@@.H.b.rR:x<@B25EW  5 ׬22 5 mKmKU5@5 VR:d&T'xx.,ݪL*SN'IT@QZ@Q`@Qdz~@Qjz~@Qv.~.U0%%|5@U0555U%|w.5 weT  . ...6.Xݪp2tx<@: AmwwT7 Uœ2` b eE w~w ww5 & T(j<@<@<@2<@8<@<<@J<@L<@P<@b*d'Ij<@n㫀 v2li5 8&m_(2# N  M  &A G(U03:5 8*e?E?    <@"<@2   ws`<703l0<m  lTwwU F m7  w(ww^7 $ Al <@<@ {~P<,{~P<0<<@@<@J<@T<@V"^" L Z<@n㫀 r<@z  A,f2" p "%! p!3 p3$ Aq N 7 * D J#g`ت.&ت,0'`J:ت,Hت.Z<@ ^<@f<@pت.z2* 2,""2!!$233  C  J5 5@5E@258'`J8<@D<@J㫀 ^d&`'xxn2z<@   r0 5 U 015 0U 0w # e8ت.㫀 (ت.2㫀 D㫀 P<@j<@p<@" El e 2 e $e w &"7 7 "eE7l&N N m&J <<@"@<@F<@J<@P<@\<@b<@h<@x<@ N N &N N ew w`U 0 wFDe  e)  U%55e) U%,"<@.㫀 8<@H:dN:dT:d -|& b7  U@ 8744 e 54 $ P$mb<@e@~<@ &㫀 BpJ<@P<@`*Sb'In㫀 v^Kz^K~<@ p f N$    67  "  efeEew-w b |'  )L <@(p0<@:<@D<@H<@R<@X\<@v<@ 7  w we N  A    D f N<@"^K&p*je;.<@ 4 8#g`Bت.Pت.X2z㫀 ~<@   1 "P ww qq 5  .p-p- L<@㫀 &<@ *<@"BjLLPRPVjLb<@h.l2  6wt5 mfm Ru-A- 5E5A F<@ 2,*S.'I4f@Q:㫀 >z~@QFf@Qnt<@f>55w5   5 & <7 55w>5wEw .*jL'I0<@B<@P<@|<@wwR T w-w-5w 00,""<@ D<@ J<@ P<@D V<@w \<@ b<@ h<@ n<@R  SU wЋ A A %Dx E A A A A A A  f <@ <@ <@ <@S. 6w.[(}6[(} ><@% D<@D J<@x P<@x2~2A TB A5T @A N  bU5E A A A A E  6<@2$d&e&'xx22F2J<@d2J E w 5e T @E? L 7 6w     p-8<@&*<@LP/T<@^<@t:d2p-5 ewjE 20 W r  r %|%5.<B w wC e"$~7 (.<@<@ (<@"6<@ b THz6SyTHD@xx@.@.@.@8r@~@~@:d@ݪK@df`'@(@6w@zVK@EV@+@M@*f@Z@9x@*S@E@d&e@ܟ@R@@/@㫀 @zݪ@f@(#@m @Ap@\f@ܪ"@+b^@'I@'I@'xx@(6q@'8J@ e:@@Q@B@(@R:@ <@06Syh <@8tx},Vzt~t x } ,  " $& (* ,V. 0z2 4t6,4nz  n      " $& (*\PRITASKUICCKPRUNPARPMDINCSLVESTROPARRONPROAFFIOPSYNCXHRSECCLICMDTIMEWBFMAPDFBF      "URTPRVABCDEFHJKLMNPRST INS -- Syntax error INS -- Invalid keyword INS -- Illegal priority INS -- Illegal UIC INS -- No room available in STD fCor new task INS -- Low pool, try later INS -- File not found @  @U55U / Uww w  A Z <@R:MR: (...2+4'8J:+b^<'8JD.f. v<@ | w% U}w W w$!Uw U U@yUNܟ. $<@ *<@6Z@R:FApL:dX.b.n.z.s U@j L t wPw^[ wW 򂗠, w W ]www64.xx9x"9xBZFXZ\t0U*U$@UU @UUU U  D..*.6.B.N.Z.f.l.r.x.YN*ЋKPK@w4 REMU w S TPUw" e E @.b.lZl5W wwUwUХ[m,g¥]¥,$¥R6¥W7¥E8¥D9¥*RU JMNd&e'xx.(.,8r.<@:<@p<@x<@~<@Fw M]wD7    7 7 7 7  )Ez<@<@ <@<@<@<@<@"<00,"J"vATADATADATA@&<@*<@.<@2<@6<@:<@><@T*EEE`7 7   (6q <@ ( <@(# <@( <@$`(~@~,㫀 0/6㫀 <㫀 B㫀 F~@~z%= Vj w57 Х[ "¥CХP ɋB B P¥,z <@ <@% <@= <@V <@j "<@ (<@.6w2*S4'I:<@F<@X<@ ^<@ j<@x@Q¥]w>¥UХBU U¥"¥ wDB¥ ¥B¥" ȥ""Ћ "$...DVKVܪ"fEVrҝЋw ¥S&& ¥M&< C 7wwvw5 55 dܪ" EVEZ@ݪKHfLm PRTRd*ff'Ilݪp\frx e:zdf`' w b T0z:rT0DDje;@w@#@@f2H:2@T@H/@OK@e@ZHT@zrr@2@Z2H@(@P\@# z@#""@T.@:^@z}@5s@O N@o@6Ew@z먓@Z@F@6w@fH6x@lh.@Tz}@;F4 @C @4@l.@6x@ir@ȩs@z@6Sy@:D@@f@@{xe@ʫf@H@a@@˪s@ѫ@[M@Hw@z""@Aq@[(}@u@@ZlzH@iBx@z}@d&^@p@x@x@x@x@zy@x@ a۠6.h.hph|xxhr.he@~h08rh~@~hVAXMh #g`h8^KhzZhbR) gh"+}WhL:dh~Q gh,Ph$ gh^2h$df`'h2lLhSp!hf@Qh6ϫh*^Khh(zⰫhhMh@QhZ2h yrhJ[ hXxPshFvPhBdfyh4hhx ghHRh`hXvh`z/hݪhZ~hffh2h\㫀 hx~hTv ghD{~P'Ih'Ihz;F vh(4 gh&'xxh'Jh_M gh*'8Jh'`Jh ~ ghRhzHm:h<jLhDhn@QhhvDhhzAsh$hd\hlR:hpz~@QhN3h4gh:hjG0ت,h6wh쩷2h2hvت.hG( a2먓 :^ w:DH/HHwP\eC xx x"x$x&ȩs(*T,;F4 .T.0˪s0.$Aqlh.OK O NTTz}{xe[M24""( ʫf"a$ir&iBx(Z*z},l..oZHrrF f uz}5sѫxx  :2((,, G|77 x7 (   7,*TAPAq vw 5   ~ aax a$a( 4a,6a*:aTBPFJVaZ6w^6Syb6xhan6xt6Ewx# z~x{x?7IЋ  Ћ w)5 E T5mX |a # aa*a.[(}2a@a DaXa`adajaTnd&^pavaXXUx7  (Vz 5  A@,1\0|nraXax&*a0(4aV8a<azDaJa d\ha0lapa|vn~anw! eq ! `& (?(e 5( (B(oD5x#"" ypp aje; a$p<La(Pa(ja(ra(vaBxa(|aDAA( a(  (Vz 5  A@,1\0|00-"" S'VNSw*""P,t:@,Z#,u~V,tn-kA.6.P674yPe4k`c63*c63*d6(*d6*f6 9*f6Q*i6b*i6*i6&X*i6.X*i6/X*l6s*p6G*r6"*r6"*s6 *v6*v6<*v6K*v6W*v6fa*v6f*w6R;*y:6y::q$:*:Z YMPVNt!*VNZ*QIS*Q}*Q5*Q/"*R* SL T S* S*tS*SR*Sq*S4}*S*S,* SsrVNSsg'*s'*s(*uy*uL* v~*vOqPvuPwC^*w*w`wAwASy *ysyd*yweJl~Pd*; !*L0L0L 0L!0Lw*0LhM0LN`0Lp0L\q0Lt0Ly0L0LC0L80yl~6|0|8}0|90 0000M000'0q0`r0@t0P0L0p0 0pN08^0^0@`08Y0p0W0P0H0r0P00P<0P}0 0:00Z0Q00ꨤ`6 6&xVK "}**%&&*%&*%&*%(*9 9d 9yT::0c6;pX&x;_T%:;b@0!CADTAZTD^TD(`TGS*GZ*H \4H` c6HqhHrTJpTJTJf TJ!TJL"TJr"TJXTJpTK !vJKgK(}TKHTL@TLcr*MPN_TNqvJOTOqTe "emtnew4ffIbqtnq#tnsDL* q*r*s*> 6 *L"8 &8 `;*©2*ϩ*ݩ)P~AAMCjMF,K*,4N*68c66~*7*767=*9*+*D,O(.O.OB`*ϪU}*Ϫ\}*۪:Y۪?TY۪ڀYBx*(z*Agr\4A}smAsmA=*L8 *R;wmRAlxtn-X* **lf*XIbyP*̫$ Ib̫%#̫#̫hM#̫@`J̫p#̫\q#̫r#̫A̫C#̫#kA4}h*r# T\f""n#Lx{L 2b |Xz:#|XD@Sq@P@\X@@L8 @@©2@@SR@ 2# tehXqhVKh,qh  #ww we Jp + %@ 27*5 =  L L8 $P2P6< nx ~ |75 y{@  % %U ;@0 pU %w(\XHSqfPjPvSR|e  T& &Y@ w` (eEA A A A w we?E? @ @H©2 26>TL8 Z`f©2jlb |ǀz:L |ǀD ~p@L\q@n_@^@L!@?T:@+@:2@`;@?T8@ #}@)sE@z?T|@nL`@L@ #'@Q@@`@}@ #(@?T?T@#P}@ ~r@t8@n]@# z@Bx@zLt@YM@)2H@e;@Lp@<@p,@:!@?T@|@s'@s(@|9@n^@0M@zP@P@:br@:vr@l~Pd@LhM@@\X@;@#L@.K@:s@P}@@ձ@zyd@'@ S@ S@:t@p@:s@L@wC^@<Pd@LC@.q@GZ@0@:@zU-}@R;w@!@:q@P@U}@L8@sg'@;@ r@Ly@(z@f""@%&@@zLw*@W@  @Ϫ\}@[qu@tS@w@ ~@74y@:By@H@s(FydLs'Ns(VydZ Sbf""hYMn^|n  { ew w ew w !s 7  &  #} sg'@`f""P$\X.@`2[qu:}>}B}HLPdf""hvul+p+t(z\ X) Υ   )w|:br ~ ~p ~r l~Pdn^ ; ?T$?T:*?T8.?T?T4!8::<Pdn^ ><PdFf""T+Z:sb>T 7      5~l~Pdn^ T l~Pdn] l~Pdf""l~Pdn]  vu$R;w*vu0#P}6#L>lxDvuLϪ\}RvuXP}\@`nw8%DT3 y w7  wLyL|8 |9"(.H48P>\XBt8D.qH.KVf""Z:q^+b?T|f?T:j# zNeeE%,%CT 7 5 U|7t`; 0Mp;:t H&p(wn_ ,w4f"":wC^ @LtBLF|H SU-} L'pP w E$% et 0#% U % | SU}  Sf""@`LtL8 L&:,:br2<>PDPN:!T:!^:tbL8dLj:By^5Uw w5Ce5. 50lp |:brL\q L;:ByYM"nL`*Lw*,L4p8L:L@:br H<LLpNLTpNV0MZ0Mb00  5 5U5Uw3~ r W 0MW0M   p,$ r*  0L2L8:LD:J:brNL\qPLV;^PJtp  5 0l0, 0 3 ~0)sE p<%&)sELpL"pN$0M(0M*P20M8p,<0M@PD0MF)2H|%   @wEee%% %  0# U~ #} pe;ձ"@`(^0L82L80M>pB:H:N<R:vrZ:`:fPnL8pLv:brR2w*5  * 5 E0~:vr :s pLhML:sp"&02<6:28pLDL!FLJpB H,PpVL\LN`Lw* bLN`dLjPn`72.p  2sb |Xz: 00-"J"vATADATADATA|XD:(}@,Z@nL`@@?T?T@|@,@?Tf@?T@ 4@p@L@zk@<@@Lw*@fW@?Ta@@ @ n@} w@?T:@ h #  :h l is not selected invalid block number duplicate block number syntax error block number out of range  #  E ;577 1*Е Е 1  2  ~fW| ?T: p &*?Tf.?T?T4Lw*6L<@FkLPV} w bv:(}| Е:   7 7 ¥:    W"C ȋ`<:(}} w"?TnL` &?Ta2 6>,Z JN,Z d ~?w7ww D M ' 9eL      t`L p ? " 0 4 6M< n B'H\` j n~ nt  `W 3 s6  `W s)Ceee V C  C,FV,bpt |  p. bb Tǀz: TǀDr!L @+@ #}@,@,K@D,@4}@(.@s'@em@.@yd@z S@{L @ywe@Y`;@!@sg'@L @X@sDL@f""@y:@Agr@L Xz@L @y@2L"@ # `;hysh #h  7 7   ) 6  7~(. AgrL"y: Sf"""sg'&.*L Xz.s'2+6r!L :L DydJ #}PsDLV{L Zem^r!L b!d  )ew w 7   &  wv!L Y`;*,K.,K2,K8ydt8@.qD.KPLw*RLXP\%&^)sEb)2Hh)2HXh0 % @6 0 0 5 U~0M 0Mpe; w*""$0M(0M,:br.p2L4L::pF&\}J&tT|9V\^ b f p ep 5%%  $  DCEԤ 5 ew ~8^8^::LL&0*.|906%&LL NLTQdL fLl@tpqtlf| qj` b   % % % ͘  | q ݩ)?TfQ}?Tڀ|9$Q/"(?Tڀ6?TaBaT F?TڀJ?TN^NaTXR?TڀV?TN^Z?Ta^aTb|9dl e   % Ԥ$    0,aT?Tڀ?TQ5?Tڀ?TK^?TL^"0&*Q.|906%&>|9@VaTZ?Tڀ^?TbaTf?T?Tj`r. wZw%% w,%e AeB p  &e%%%edq0M0M; "?Tn&0M*0M.W6W<PPXPfp0Mz`  L  pp %  A  B $  0M$0M,b |Ǩz:|ǨDL\q@r@Lp@LhM@L@LC@k@P@W@As@H@-k@zL@ R# rh(̫h,Zhx̫Ch ̫h̫ph̫\qh̫%h̫rh̫hMh NO  #YES  # VMM @MFj@MUj@MS@MT,    #X>R fzw pE UE~>Rf &z(, 0:>DLFLJPLRLNT UE UE UE U|LpL LpLL\qL$L\q&L,LC.L28LC:L@LhMBLFLLhM   L,e%" 1 x%:1 1 Q$ `PL   As* 2:r@H\r   :pp   " , 1,ppp"p, % 0  a ff:WW2W:WBPFPRP\PV a Q ea e`q  ¥.Ћ ȥ:ȥ,Ћ ȥ;0kH-kb |ǀz:&|ǀD @|8}@nL`@ky@.P@?T?T@r@|@?Tkf@|9@P<@,@z@?T@oQy@?Tڀ@,@R@k@.@?TW^@Z@yl~@As@H@?Ta@@R-k@ # *h;pXh  is already configured specified device type is inconsistent device type not specified - defaulting to 'DISK' Disks: Tap|es: Terminals:  DISK  # TAPE  #  TERMINAL  # DB377: #fw & w w7  7w *wȥ= Ћ ~    k,0.6.P:>B HT| VZnb ؇7 чC 3+ &%  7 ~-k  AsP< ,&P< 00-#J"vATADATADATA2 <>HHJHXZHdhX   67- K z   Z,.H8  ( ȥ=  w НН | HoQyr& *>28B-kFkLk Z ^bnЕ:  w7  p , x    ~?TW^R?Tڀ  ?Tڀ?T?T"(|9*0|8}2 >pB?T?T NxR?T?T ^b?T?T j@ w   T?T?T ,?Ta$yl~(?Tkf,?TnL` 04?Tڀ P UUm۶VVm[mے$II""""UU !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkP|lmnopqrstuvwxyz{|}~mrmrx#~:br::s:2 :":$:vr&:t(:By*:!.m0r2m4r68:@BD$9BFJ$9ZL#BS_w did not respond is not ready unrecoverable error at block i`$9B $9^ S$97_$9w$9f"$9 $($9&*.$9!04$9C6<Ds write locked is offline data overrun at block I/O request aborted privilege violation bad block, fatal hardware error end of tape detected write check error at block 00- #" b |ǀz:|ǀD@̫@|8}@?T?T@S4}@r@?T@?Tf@p@?Tڀ@k@?TN^@Z̫@H@fW@@?T:@ # Bp HL?TfP?T?TX \`̫fj̫vl9 d 4  ,e C@B@ %% E %  ~   9?Tڀ d (4,?Tڀ2H@rX?T \E`?Tڀdrh?TN^lS4}p?T?TRb |Xz:|XDsr> @)nE@`@&{P@ @@?T?T@sP<@q@̫@`@P@P@z?Tf@@p@L@?Tڀ@0@sg'@@Lw*@> @LN`@fW@@srVN@lx@B@ (#  ewh<8"h , - unit now deselected is not selected   #d 7  % 7 7%w7b 52 5E ~fW sg'lx$,2> 6:p@̫@`DLw*FLLPP)nETLN`VL\LN`^LZ`    0    `&{P Pq 0&*.28<@D0HN?TfRV?TڀZ  00 5    | ?T?Tpp  srVN$sr> (Lw**L0 48<BsP<FN?Tf RV?T?Tb Tz:TDe@,@K !@>%:@D,@۪ڀ@em@i;@@68@&@۪?T@z v~@9d@@~@ys@۪:@̫$ @[q@VK@R@,t:@Nq@:@A}s@ z# ?T:hxh`.Php?T?Th|y:hd,h\hFht?Tڀh.hlꨤ`hT{dh> hXyl~h7hfWhh#( #v 7  `m w w `wwwwwwwwwww v~ ,t::A}s :2ys6em:D,>,B[qFD,N>%:RK !VNqZ9d^&bVKfej68nRr~rwwwwww, ۪:۪?T۪ڀi;̫$ jb Tǀ::!TǀD t!h Bb Tǀz:#TǀD#w@s@#P<@ky@?T?T@#P}@L #@,@#L@9x@@?Tڀ@zR@k@sg'@$9@#H@$9pw@# S@f""@[(}@ @$9:@-k@ :*# &h=˖hL"h unable to executenot installedcurrently activecompleted. Status=WARNINGSEVERE ERRORSUCCESSERROREXECUTE command is no%|t supportedInvali00-#J"vATADATADATAd task name DYaLLDYa L L Q|$Task " " is #7  a wZ w%Q%  %||  ЋMm EA ,B@n  k9x*9x.8@FNVZ-kh#P<x,|  @ QeI%ɕ ̥#̕   " % @1J ky$# SHLsg'^ h#L x|#Hn11e1e1f  g%% % Fw~#H L ##P} #P<&# S4#L8#w:#P}> BgF$9pwHs NR$9:Ts Z ^$9`s fpb )% e 1 %. A   ?T?T f"" #L*#P} 0 81%:h ^ syntax error failed to open temporary file is already selected LUN assignment failure COMPAREDATA d #d  ERRORLIMIT | #|INTERLEAVE  #" "RANDOMW p #p))TEMPORARYFILE 2 #277 SY #h7 w w77- w77| ..P &|(.&2?T::>Bp H-NR'VNZbHdfd 7 B wJ0 CKU  wjpU e~ Z   B?Tf?T?T&(p,p. 2>&{PB,LPPLw*RLV&{P`PN :ږ< U U|)W)' [ [X[W [W&[*ϩ,P0r2`r66~8pNt<@)D<&kF)t L)BxP)ZT<&%tNbe   ^wU) )sE)p)GP})G L %")nE&%' (),hp!2lE8 @HLLN`` p p   5E 0 L~v,q0sg'$ ,0P6q:>LN`@LFLN`HLLPP`T&{PX\PfE % 00 e    PLw* Lpp $(srVN04P8̫Bϩ JNR?TfV?T?Tb6j 采e ᇇe ه>̫% ̫p`r ̫(,pN0̫Zb TXz:D,TXD`;@"&@# z@<&9@)@?S@f g00-#"̫hRhTwh-kh $ is not configuredSyntax error DB377: is not configured #  Ћ &   ¥. Kȋȥ ȥ ȥ;  P% @A&GP} ,28 BLHTZdrhLz ԋb TXR:3TXD?T?T@M@M@ # @0!h #"  ȋ% ЋMM?T?T~b |XB:3|XD # Mh  IOX Command Summary: ABORT ;abort exerciser run ABORT task ;abort executing task ABORT /ALL ;abort all executing tas|ks BADBLOCKS ddu: val ;identify a unit's bad block(s) BADBLOCKS ddu: ;print a unit's bad block list BUFFERSIZE val ;set default NFS buffer size COMPAREDATA YES/NO ;compare the read/write buffers CONFIGURE unit(s) ;add unit(s) to test configutration CONFIGURE ;list all configured units CONTROL_C YES/NO ;set ^C AST mode DENSITY ddu: val ;set density for a magtape unit DENSITY ddu: ;list density for a magtape unit DESELECT ddu: ;de-select a unit ERRORLIMIT val ;set maximum unit lerror limit EXECUTE task string ;execute ancillary task EXIT ;exit to operating system FILES11 ddu: commands ;select Files-11 unit with "commands" ;overriding existing defaults INTERLEAVE val ;set interleave value LOGFILE YES/NO ;outpudt messages to a log file LOOPBACK YES/NO ;loop transmit/receive terminal data PARAMETERLIST ;display exerciser parameters PATTERN val ;set read/write data pattern PATTERN ;list available data patterns PRINTSUMMARY ;print summary report i[\mmediately PROCEED ;proceed from ^C state RANDOM YES/NO ;random disk access modeE #   zb |XB:4|XD # Mh  RANGE ddu: low:hi ;set LBN test range for NFS unit RANGE ddu: ;list a unit's LBN test range RECORDS val ;set magtape re|cord count REGION_IO YES/NO ;use memory region for data buffers REPORTERRORS YES/NO ;report errors to TI: RESTART ;restart exerciser RETRIES YES/NO ;set retry mode for NFS units RUNTIME val ;set exerciser run time SELECT ddu: commands ;setlect NFS unit with "commands" ;overriding existing defaults SPY ddu: ;spy on a unit's current activity SPY ;spy on all unit's current activity START ;start the exerciser and all tasks SUMMARYTIME val ;set summary report interval TEMPlORARYFILE val ;set default Files-11 file size VERIFY ddu: commands ;verify (read check) a NFS unit with ;"commands" overriding existing defaults VOLUMECHECK YES/NO ;check NFS units for file structure WAIT YES/NO ;use WTSE$S directive in idlde loop WRITECHECK YES/NO ;set write check mode for NFS units All commands may be abreviated to as many characters asneeded to be unique. "val" is a decimal number. "YES/NO"may be abbreviated. "ddu:" is the device name and unit number."commanW\ds" are certain commands w00-$#J"vATADATADATAhich are used to overrideexisting default parameters. N #    b |z::|DVNZ@?T:@GS@#w@ZH!@s@ @+@`;@9@Kq`@Z@z|8}@ #}@7=@nL`@Zz@@|@ #(@ky@@ @Xq`@ #'@Sy @ݪK@zy:@Z @su~@r@ @|@s(@|9@:@-X@P<@ty@,@z) @Z@zl~Pd@\X@ZP@""Q@ ewL ҕ ҕ-ҕ-ҕ  s%w 7  & & A%Xl~PdnL` *f:gFf gJ(zZ$9pw\s bjL8  n |$9pw~sh7  & &Y  U;w  | L8 L8 X$L8 *sQ, ty 0 :\XDL XzH{L LSy P v~TL8 Zev\L8 `\qhtb9f DD7%:d GSXq`lfpe-XxKLcr }"Y`;& (3,:vr@6~b W   7 wf ~""Qr su~ #(w*Bxϩz) s(Kq`"VNZ,VNt!6Ϫ\}<ϪU}B%& FLs PVt!Z©2&E@b7eE@ @ @ @ 7 e 77 *  ԁ`Ћ @  Bw,   Z&t!,@BxD H J  N*bP<fݪKn,t,h^eEwW w7 7 7 7  7 7 7 7 7 %&&%&&"%(&%&*sDL.sDL0sDL4 8 : @sg'D+HL XzL{L PL XzT?Ty:X #}\yd` #'d!v Ew w* %%  , e,111%DT  $z, LLy:?T:#w `; $*6,: >kyBP<D,HHNRZX|8}doQyfrb Tǀz:_MTǀD?T:@+@<&@,u~@`@&{P@)@@?T?T@)@'@%x@z$9~Z@?T@:@,@'@)t @h'@?Tڀ@[@[Z@R@)W@)p@,l@sg'@z)@[W@)Ps@[@t @:@)p@} w@2X@ @# D,h(.h.hZ  Failed to open log fileFailed to close log fileFailed to open existing log fileFailed to trun00-,#"?TڀB,u~ FL::L  R 1wN ?T?T sg'+2X R&'%x (),h' 21b |Xz:VN|XDVNZ@|8}@'@VNt!@ϪU}@Ϫ\}@H@@ # sr> h'> hP'VNhsrVNh* #K3   U  e  KE %DT  %U p4VNZ"VNt!0VNZZ|8}\dHjϪ\}vϪU}0|  %DT  0 3 ,'|8}H '&',Ϫ\} b |Xz:;T|XDr@GS@?T:@+@#@9@`;@B`@@ #(@?T?T@# z@z:a @|@s(@-X@n^@̫@?Tf@@ϩ@p@lf@kw@?Tڀ@L@,@z<Pd@7@GZ@R@Y`;@k@!@P@ꨤ`@L8 @sg'@Lcr@f""@r@; @z̫r@Lw*@W@w@3@:@r@tS@6~@fW@@lx@?T:@:Z@ z# ;_hL@h4AZh.JphJ!hJr"hKHh"JL"hADhN_hJh:Jf h`bJphHrhbK(}h2=Psh(=|hLJXh9yhD^hOhD(`hOqh No activity to startSyntax errorCommand valid only Command ModeIOX Version Command valid only in Interactive Mode synta|x error illegal range is not selectedUnits are selected - command ignoredREGION_IO command is not supported . -> .   #|  7    "    ~sg' #(wGZ #( GZ(s(.r46~:ϩ@Dw L" R X ^fL8 lsg't,⃀x   *'$! F     bp:L8 B`$9*70GS6+@sg'H:P:Vlf\Lcrb3hY`;n-X  wJ   $ K%   ; ww O l̫k"sg'*:.,6p>lxDsg'L:P V^# zbsg'h#l`;tsg' zOZp w  7  B  M7z tS?T:ꨤ`Lcr:a <Pdn^ "<Pd*f"".!2+8R?TN^h`?TK^hh?TW^hlB?T[^hT?Tnh?TL^h0۪:h6?Tah?Ty:h,?T:hD $ does not support the command # 0%%u M 5   D , 8 S   ? ? % XQ50M0M6S4}LD&\}HpN&\}Tp^&\}h&\}n&\}v+N     @7 &@?~+ } w )p?TnL` )p w*"" ?T($9s*wC^0$9΅2wC^8f"">} w@?TkfD?TnL` \> @ w *w  w7 fA 777 \?Tkf:$:(}4:_:vOq@?TkfJ?TkfN?TnL` R} wT?TnL` X[qOqb |ǀz::d|ǀDL\q@GS@+@9@|8}@#P<@nL`@@B`@L@ #(@@z?T?T@#P}@@@ݩ)@?T@Lp@`r@s(@|9@-X@?Tkf@LhM@#L@z@zp:@?T@@ϩ@`@p@lf@8@?Tڀ@L@,@7@LC@p@Y`;@zp@P@Hq@L8 @Oq@\q@Lcr@}@#H@@%&&@y@# S@t!@; @z[(}@Lw*@W@ @[K@3@Bx@r@s@©2@@yl~@(d@H@6~@z?Ta@A=@@@M@} w@XM@pN@?Ty:@L@  # tH hAgrh  . -> .:.VFYSELF11COM RET WRI RAN ERR=INT=LOOPBACK = YESNO Buffer space usage= Maximum effective BUFFER|SIZE= Device Mode Buffersize Filesize/Records/Range Parameters------ ---- ---------- ---------------------- ---------- Task Status Command line---- ------ ------------SV ERRORERROR WARNING SUCCESS ACTIVE QUEUED t2tOXF==|OXF = =%&&rM6~p:A=(d p" #($s&s((z*ϩ,}0GS0`Lcr8 + XMB`[K-XpL8 OqlfHq9 \q"3$&Y`;(*7,  #h  7  w    dѕ  5++ݩ),(p. 48?T?T <@?T?TDH} wXyl~\} w^?Tkf bfLw*Rd5 % .")%5 ~L LL ?Tڀ ?Tkf$} w&?Tkf*.?T4?Tkf8} w":?Tkf>|9@FPJLw*LLX%DT %  %%  .255||8} H?TkfW"W&; *.?Tڀ2P6P:; @?TF?TkfJ} w2L?TkfPLRLT 5 55$ 5#LL ?Tڀ|9L\qL $(?Tڀ,L.L4LC6L <$@?TڀD|9FLLhMNLVV8 5) 00-<#"?T?T BR   7e a% j  t ?T?T ?Tkf#H[(}#H[(} ?Tkf&?TnL` *.?Tڀ 2a8#L >jB#LH#P} NtZ8 e ?  B ~  D ~?Tڀ  ?Tڀ# S#P<?Tkf"?TnL` &?Tkf,?Ta 2B6?T?T :~ >J?Tڀ NDR?TڀV?T   G K% D       t" !m Q$N t  ?Tڀ?TnL` &G .K4?Tڀ 8D?TaL%(PTL8 ^%&d\ tx%(  w      w G @ >eE"?    /"`{d%&\ *.%(8?T:<#w@`;Dsg' JNw`Bxh,pp~%&&b&  0  Rw Z .  0w w \wfwVwLwBw8-VL8 %(,%(0%&4<%(@,F%&NP%&&pv|   e?E? A Ar+  735 =0\   \ 8Z:`: xZ  75 u5 U ;2  2 6   L P ^\Xb j\ |2 2 u5 w w  eSS7 %e7 SS4*\X6%&:%(>A=HD F J N R T X xDe e%%%   !% 5  %DT %DTz      $0; 4:L|8}NVH`\T dh|8}jrH^ e e  % %   w   z ?Tڀ@tq@t  &*?Tڀ2:; >B?T?TJ qP q VZ?TڀR      | q q ss; $?T?T (,?Tڀ048<B}H}N}R`    z;  ?T?T,4N,4N,4N$,K(,K,,K 04?Tڀ8; <@?T?TDJ #}:U U7 S E # 7 7  U?T?T ~G?Tn^ ?TnL` S?T?T ~G ?Tn^ &?TnL` *06sB7 7 7 7 7 7 7 7 7 7 7 7 7 7 wvs} }},4N,4N,4N q$ q(,04,K8,K<,K@y b |Xz:f|XD;_@?T:@L@@+@AZ@Jp@J!@K !@>%:@D,@Jr"@KH@zJL"@AD@H @N_@H` @%:l lHELP @0!qqIDENTIFICATION ADINTERLEAVE AZ LOGFILE D^ LOOPBA00-L#">K(}SUMMARYTIME @@KH((TEMPORARYFILE BBL@66UDB DDMP: :VERIFY FFNqAAVOLUMECHECK HHN_M MWAIT JJORRWRITECHECK LLOq]] 9No such command - type H for helpCommand not unique #  %  ȥ= ЋCɋы  ыɋ C " @e  z4  wk : d"z-kF|7  07  j %w% wR: wC^} w} w+"?T:&!,:2D,8:>(.B+b TXz:mTXD?T:@ @ew@sP<@,@[qOq@vOq@sDL@ @ # kyh2emhZq#hf,hqhvlxh2 #f6 f vv7    B Q 7  C B> 8vOq @9@|8}@B`@@L@zQ@e4k@@.P@?T?T@~v@q@r@̫C@Bx@Lp@|@ @`r@|9@z-X@$9f@̫@P@:br@t @,@?Tf@'> @$9B@LhM@@@p@kw@zL@7@LC@0@̫p@k@.@̫\q@sg'@̫%@%&&@Z@̫@f""@H@z:w@̫r@,q@3@r@'VN@@As@H@6~@ >RANDOMy    #E ERANGE ( #(K KRECORDS  #S SRETRIES  #[[VOLUMECHECK 6 #6ggWRITECHECK  #rr 8SY  ":br( #d7 7   w77%u  U ..P"*4:> B%FpLPVLXL\|^L`w U~H r`r6~pN%&& $|9&,3@D-XJLpX U U U U  zL9L\qL7LCL GS&L(L,B`2LhM4L8 > BHAsN-kRkNE 77w:wKU 7  |8} LCLp L'VNH"Z$* . 6:@BpFJF  jo  wVpb%DY \ %   "1wf %CT:%DT6 x'>  |9 t ~v"&,q004|96>HHkw LVr `1h|8}jrHzHp&3 05,( n  å#å  (   LL|$, *.e4k 4 <@$9f F#J$9B PXd(hlx.  5U JE Q  N5  _ ~ sg'  LhML L"L*.LhML 0L4w <Q N5 `_hlt tjv0 w0 w % s33  ~P 0q00 *0p4srVN8sr> <@H:wN:y RZp`rlf""r?Tfx& E@  G# A" "wneE%DT|?T?T ?T: E"|$ ,0̫r8BF|9HNBxV%&& \lrHl T %DTK \   w> vz "|8}$,H 2K > BHL̫%T X>\|^f̫p^S%DT%CT bg5 R[5 S |9HH&̫\q, 0g4L6L<|>F̫CL P[TLVL\|dJ  @ %DT%CT  ' *@"~ ̫ $|8}&.H6H >B̫HL̫ R@X\|^N*w 45   & mwV * pN 5|9 (̫hM.`r 8<HL̫"b |ǀz:Bx|ǀDs@|8}@:.@c63@c63@:br@LhM@v6K@p@L@P@f""@b@H@<&B@@@ J# Xwhe4khLkwh : B6 pBF6 :. B6$B(F86FF@ #e720 <5:4>< %DT $ s 3 3 lP p2 0f""<"<&B$:.>:|8}<DHJV:brfprs|  @   2 Ee00-\#"Ly@LDr!L HLw*JLPpR V \df""rT;w>p!   0E Fs @`@` ?Tf $(?Tڀ,?T&0@`4Ly6L:{L b |Xz: z|XDn_@^@s@#w@+@:2@n`@nL`@Q@L a@L %@?T?T@zuL@?TX@n]@:t @|9@n^@0M@?Tf@P}@S,@S@p@?Tڀ@L@,@z<Pd@0@R@:@?Tw*@L8@?TN^@sg'@Lcr@%&@)Ps@uy@?T@?Ta@b Tǀr:u~TǀDnL`@?Tkf@@Q@?T@a@} w@ # .,u~h =#2 Е  77T  ?Tkf a @Q$?TnL` (} w*?TnL` .?Tkfb TXz:TXDnL`@?Tkf@?T@[qOq@vOq@ x# \Th; h; h  |@zZrN vH Tʚ;@B'd   #7 7 @A C7    llC bA  e0 0 ĕ, e x H vOq "&Vd zxP|ĕ0 7 ?    AmC Cm u  Mw>.[qOq?Tkf?Tkf ?TnL` >b |ǀz:|ǀD@L\qH^H L!H|8}H#Pz:HLtHqH8LpH@|H`rH<|9HmwHPz:HLtHqH8LpH@|H`rH<|9HmwHPBRr>D ThZhjh rjffffffpf f!cxfyfϙ*&`qf(V)hG:uff&Xg2Xaa7us)Ra|h aFca[6ddbL ab fbbf[a^ebf[a`~fakpYan?bf9DU fab{~ ababbae@!kg.&f݉ȁҁhhhhf+pDF8f8}\B!>Ƅ ad!$!(p^^^}}t:eDF8}BFe$Caˆn !φAiあaՆn&XgنohXah!c!hfffAtvrf`ꁁuh!h!h ))Gva#`.pF|e&EpF~}%ph_g#_a(f_a`/`/f6f6f6flfphAe6f6f6f6f6f6f6f6f6ffpYLNAe!OadpFe6f6fpGc}e&D6fr6f6f6f6f6f6f6f6f6f6fVfaff &}af6f6f6f6f6f6f6f6f6fbbff)a~fRaYabffab6ddb*d@faab fbbZa@fbffpDF8f8}Ԋ\^0fbDF8}يЉF}щam&`j0Vh===@=P= }B.qnab&!'fvVhZa-Y1cy! ac%'Ylj!>ad! $!#$9A%%,%F\ea!3!!6!<ljF=5T)haPaPPfNf~f q[@aYab af>ep=yF:f:u!f acd!l$!o$!r!=%`|) f0%)""3pA qFp}FpeqF:u!4}%)f!>d qf$!$!T\!Dp%)F:f:u &[f[f e)a`œa`̓)qf q=&epFa)e)yF:f:u=%'`)!>@adphF\!Gd!>f^^{apfd!dgf! \|f ?aDc 'avVhaccccff<$LpDF8f8}\^@aab!4$bFx}Fx}Zf^^^^EAD\D\F0ab@aabT@&ad^a_.qadb^aga?aaaq^^Fq}}}}}e|DF8}.F}/ApABYffdacqA=qF eDan&vVlhHFeEd&!d!c!`pf!d!!`țpfbAb+&*eff`Frjffffffpf f!cxfyf *&`<ڛ&*eff`F6(V5hGP&Xg:Xaa?{{)Rap aNkac6ddbT ab fbbf[afmbf[ah~fasxYavGbfADU fab~ ababbak@!qm.&f4 ց͙nnnnf\aφ4-DF8f8}Â\B!1̈́$!*^^^}}:eDF8}ȂBFe$6"`Ӄ7gaن t !݆Aoat&Xav `"`nYoyAo!n0fAxuh 55Gva `0F|e&8pF~}%, ph_g f_a6f6f6ffphAe6f6f6f6f6f6f6f6f6ffpY?AAe!BadpF$!&!P!KfL!R $!cU!fe6f6fpGi}e&-&76fx6f6f6f6f6f6f6f6f6f6fVfaff &af6f6f6f6f6f6f6f6f6fb$ bff)a~fRaYabffab6ddb*@fab fbbZaǏ@fbffDF 8f8}؊\^0fbDF8}݊ԉF}Չas&`p0Vh===@=P= }X0nab&a!W^^^\@fAb fa'C$=fD!M$b=f/euf F(4xe-}0F8e8D$\FfeAaab6cFY4Xa cYR̉FS(h5haee&fcf~ffkamtu f>ep=yF:f:u!y acd!$!$!!= %`5 5""&yF:f:u=%`5 f0%5A Fp}FpeFpf% F:u!'}%5f!1d f$ !Ȕ$!˔\!ΔDp%5F:f:u &[f[f e+``5 f =&epFa5e5yF:f:u=%'`5@d F\!Gd&`fYaLfac& fa*F vYyUe  pepF^g00.t#h#vATADATADATAd!1\f1!1f^^{aApfd!BdgKI<Lf!M\|fM?aep=yF:f:u!j acd!p$!s$!v!=%`5 5""2yF:f:u=%`5 f0%5A Fp}FpeFpf1 F:uP!3}%5f!=d f$!$!\!Dp%5F:f:u &[f[f e+`֓`ܓ5 f =&epFa5e5yF:f:u=%'`5@dF\!GdF$!d!=f^^{apfd!dg f!\|f?a UcH-@'6V haccccff;l:kf ^^^^@@D\D\F0ab@aabO?&ad^aZw0adb^aga>aaq^^F}}}}}etpAAjffda]F ef a&vV~hHFeDd&!d!c!@`pf!d!!`pfbAb5H b tXz1KYtXDs@:2@?T@$9@[(}@ ,Ka 4qhfhg'hh:XzD6vH3XzNEdR#XzX}\#hӂ?{Fϫ}JK8NsRV#Xz^ Xzd#̂e{l Xzt ȋ  @s @  e 7 w: wz  555wZw U5 7 v:O09x@@ * .#ڂ/{> DbK*}FbKW J#XzP3XzVXz^#̂_{f:XzjXzp|N 5@  L e \ e    5 %   ̥TXz:O0@&9x6#ڂ7{< RZ}`!Xzbϫ}vbK*}xbKW  ( # yȥ$$ $ w7  (ww rv~ #ӂ {?T:9xD#XقE{Hv~NT 9Xv~\s`j(p!p#Ƃq{ttMx?T|WDF U     Ue  @9x 9x*0#ǂ1{"b ~zbK~D @!@Ef@R@K8@`@:*@pS@@!Xz@y@@z.X@#X@FO@=Ov@?T@W@#X@#@DO@bK*}@֪}@=O@8@#@Ъ@l2@z#@EO}@ @#@;@}@LO@DL@s@}@=O@@Ъy@bKW@(p!@?@z 8r@{@@@jS@tM@kK9@ g@@W@:@(|X@#@֪k@#@ϫ}@2Bx@EOv@k@ Edh \w  w 7 7   |W Ef gK8y#͂{"?T*s.s6bKW 8W ֪}F֪L~H֪LEO}PFOT:*kK9 Vϫ}Zl2^#ǂ_{@ @  U f e  ?T#Ƃ {?,;b XBbKXD@9x@ H9 qh L 4   % T T  % T9x29xb ~zbK~DUH6HXzH);H3H(tHbp@XzH),:H:*H(XzHHHz!XzH#HЪHXzH RXzH5kQH#XzHsXzH5yH@!kHKXzH)"HyHHUXHzLKHZ:dH6kQ@6y@#H6^@ XzH L(H[yXzHUH!H ~H#XH3XzHRU ~ ~ : g  : :W SY :( :p :   :`': g$$&& :( :WbbJ Jff :lz{L g J {LW  NSY {L( {Lp {L   {L`'{L g$$&& {L( {LWbbJ Jff {LlzbK g  bKW SY bK( bKp bK   bK`'bK g$$&& bK( bKWbbJ Jff bKlz g ( W 00/#h#vATADATADATASY ( p    `' g$$&& ( WbbJ Jff lz# g  #W SY #( #p #   #`'# g$$&& #( #WbbJ Jff #lzDD%J|Ǫ^kQ6^ 6kQ6yjj~"~DD $& : gD # gD$bKlzXCRzCOzIN@z@RPzASZzSS@zLIzFUzLEzDE zVDF z z bK z bK z bK@ z "bKA (z 0z 8z @z Hz Pz RbKV(Tz$DG zEXzVEP{MHz*R z bK$ z bK z bKV { $z &bK*{Llz$LIzFUzLEzSP{* z z z {:lz,IN@d@RPdASZdSS@dEPeB : gd bK@ : gd bKA : gd : gd (: gebKJ "z    Z&    $ *Z& 0 4  8 < @ F"BF(.4: $*06<Bz ( . 4 : Z& Z& Z& "Z& &Z& *Z&$ .Z&* 2Z&0 6Z&6 :Z&< >Z&B@HNTZ`flrx~z Z&H Z&N Z&T Z&Z Z&` Z&f Z&l Z&r $Z&x (Z&~ ,Z& 0Z& 4Z& 8Z& <Z&Bz Z& Z& Z& Z& Z& Z& Z& "Z& &Z& *Z& .Z& 2Z& 6Z& :Z& >Z&@ &,28>DJPz Z& Z& Z& Z& Z& Z& Z&  Z&& $Z&, (Z&2 ,Z&8 0Z&> 4Z&D 8Z&J <Z&P:V\bh* Z&V Z&\ Z&b Z&hbKlzxx {Llz  :lz(( lzb RϳzbKRϳD-}@'ą@mW@!X@EO@@?T@W@#@-؁@2@l2@eM@Z=O@@{@jS@kK9@֪k@ϫ}@#@k@ eKh6 9%NModules deleted:%N%NEntry points deleted:%N%2R%N66w   @!A ;Ue&&   % /B( % @vW mW'ą2-} &-؁0֪k4!X:#ǂ;{@kK9Bϫ}PEO@XjS\eMbl2f/tz-؁HA U0 0  /B(e)BwURk !XkK9ϫ} jS$=O@(l2,/6#͂7{>?TBkK9Dϫ}fb zbKD @R@#X@.X@תz@FO@?T@W@#@DO@=O@@}@bЪy@{@jS@tM@#p@:@#@bK g@k@ eMh w  0 0   4 S    #  mc m  pWk#X"jS&=O@*.X2R8#pƂ9{>ЪyH LFO\bK g bbK g jDOnתztתz0| 0 w8: Ъy} #!{Ȃ&#ǂ'{*tM.?T"b dzbK"dD#XH'#`H+#H#0H&#8H*#H,#H{H#@H#H W@#XHz#H}@#Ha@#H#H#(H#0H(#PH#XH)#H#H #H#H#Hz#H#@H#H{H#hH-{H#H.#H/#H #pH #H#H#H#H #Hz#H#H"#H#8H#@H #`H#hH!#H#H##H00/#}#>Fatal compress error%N ?T N66> ?TԀ>?TԀU,UEPT or MNT space exceeded in compress%N ?T N88U ?TԀU?TԀ}'}Error in library tables, file %X%Nn ?T N::} ?TԀ}?TԀ$Invalid format, input file %X%N ?T N<< ?TԀ?TԀ$Open failure on LBR work file%N ?T N>> ?TԀ?TԀ/Mark for delete failure on LBR work file%N ?T N@@ ?TԀ?TԀ  Too many input files%N ?T NBB  ?TԀ ?TԀ"$"Missing output file specifier%N ?T NDD" ?TԀ"?TԀB7BInvalid operation for object and macro libraries%Ny ?T NFFB ?TԀB?TԀu%uInvalid RAD50 character in %6A%Nt ?T NHHu ?TԀu?TԀCannot modify header%Nf ?T NJJ ?TԀ?TԀ@Multiple module extractions not permitted for UNI modules%N ?T NLL ?TԀ?TԀ"Invalid module format in %X%N ?T NNN ?TԀ?TԀ@RMS module cannot be extracted to record oriented devices%N ?T NPP ?TԀ?TԀCCInvalid filetype %3A%N ?T NRRC ?TԀC?TԀ[[Illegal filename%N%VA%N ?T NTT[ ?TԀ[?TԀs!sIllegal device/volume%N%VA%Ne ?T NVVs ?TԀs?TԀIllegal directory%N%VA%Nx ?T NXX ?TԀ?TԀWork file I/O error%N ?T NZZ ?TԀ?TԀ7Virtual storage requirement exceeds 65536. words%NM ?T N\\ ?TԀ?TԀ%Privilege violation on file %X%N ?T N^^ ?TԀw wW }ab ؀zbK"؀D#@#""@Ϫ N@y@?T@{@p@F@E:@[(}@ |}hԀ ! Ԁ%00/#h#vATADATADATA --*DIAG*- --*FATAL*-T  E D  f  !7 7P PPPP A pE:"F &Ԁ.[(} 2Ԁ8[(} >ԀB#F{L#"" PԀTyZy^prϪ Nv?T|pb hzbK"hDs@`@q^HjL@}@@S@s@jTG@{@p@@E:@Znr@E_@(|X@ q]h|hq_hhah4Ԁ  8  )nr E_Ԁ# LBR -- *FATAL* -- Run aborted 44 J! t   7   w2 r'10dp{}$(|X*`.s2jL>`BjLFjTGJ`NE:R@SVZls|00_ 7V7J(s }}}&*}Db zbK#D @#`@#0@# g@R@K8@`@#W@mW@GP}@Ѳ:@@z@!X@|@e;@}@?T@@W@#X@#@#0@2@#P@Z:d@@zm%@ @y@֪L~@Ъ1@LO@t N@Ъ8@s@}@(p!@ ~@{@ 8r@{@ztM@E_@:@N`r@`;@(|X@֪k@#@Bx@#@Ъ` @bK g@#@ &}h"  XX^kQؙSY:""w 0      w ' 77 ȥ: wzwW K8#ӂ{Ȃ&#P͂'{*?T228LO>LODF#W LK8ThGP}px#`y{|K85b @N"   @wA B(A! Z?T*E_<|@mWH֪L~NmW^֪kb!Xh#ǂi{v֪L~Z:d x eff wu57w ~N`rR #X!{$bK gtM .LO>Ъ1D#0قE{H?TLЪ1RЪ1XЪ1^bЪ1hЪ1nЪ1tszxm p lm h%b Z7 X B0 0 ( R 8rЪ1 Ъ1 BJЪ1P ~RЪ` bhBxtyzЪ8|#W   w w %   wz  1j t N:m%Ѳ:"##{&# gtM *?T2 >sB 8r^LOhlЪ1~#0Ԃ{ , w 5` pp w 7  v?T Bx $*LO8e;>`;R}X#Y{\# gtM `?Tdj`n(|Xr}x(07 .LO(|X(p! #Ƃ!{$# gtM &b zbK&DGG@ N@W@Z:d@y@N`r@M@As@ !Xh#Xh.Xh  w  L$ /3#e '` E  A 0# 0-  A DW  Ny"As,Z:d 4 NFGGLN`rTMp|w E7 &RRw  e ` 0!p!< W N"y2W6yNZ:d T N\N`rb RbKa'DDO@@FO@W@s@ .h 2w  DDA D  7w*W sFO$FO*DO@.DO@b zbKp:D#X@-}@6@K8@t@`@Ѳ:@6f@:p@!Xz@6k@y@z@5kQ@EO@@9 q@sXz@5y@}:@FO00/#}# L#XԂM{ȂR#XS{Z6f^sdLOp w  5    B@ B cB C f=V }#{ Ъy&yXz(t: g .y6LOH ~NFOR 8rr~?TBsN6fZ6^6kf9 ql#ӂm{p v?Tv w  BC6 w w-w" |t N6f :p%Ѳ:#X{": gtM &?T* ~,Ъ` 2Ъ1 4Ъ18sJ:TЪy`}j\g%jw 0   7 7 ~w^ wR7 d ɥɥ NEl E Z\g% !"" \g%eMl20 \g%"-؁&6f,LO2 D`Jl2R5^ 5 wwe _7   wND!F ֪kEO@\g(!Xz*: gt 0k4=O@8\gT5kQp b, P (  E %% "% %,%; (w  % % %,%6, ((NK.9xT#ǂU{X \(`?Td9x;wDw>( ( N 5   5 wר; w  wwD(֪kEO@\gFzXzHt: g N: gV: gr: gZC`U |W.  w 4JPUZ^cE Z W:W=E U  D&fBʋRe V   aaJ P"U$Z&^(c   C W; W W  ר ע   7 ( ˋ*D5yTZBxfylt}:x6k<RTHLJ   w 7 <6f9 q#ǂ{ "?T&}:*֪k.EO@2\g~b zbKy:Ds@-V}@K8@H@:O0@ѫZ@}`;@?T@s@6;@{@{@bDz@Qw@@©2@ϫ}@#@bK g@#@@ v6`;hp  <0 7w w  w N  bK gsDzQwHDz :O0&,}`;0K84ѫZp?-V}88 p -V}p A -V}B8Bg7  @  F p s©26; #ӂ!{Ȃ(#@ӂ){,?T0ϫ}4K8b 0zbK|K0DK8@00/#h#vATADATADATA`@@#Xz@?T@fLy@#P@v@[yXz@s@{@jTG@:Ty@{L g@@LXz@ \CD3LLORWVЪ_`\x`Ъ1pv No 5wo    Q %o   o w 5@oKXzϫ} o&k2#X>QPoX.X^fopx&> 89f"e\e!e 5f 2* eA [yXzϫ} Ty^`ps?TLRR#XS{VbK gtM Z?TtZe e˥#   w     |ЪkЪ_` Ъ*9 q0#ӂ1{4:?THsL:R#ǂS{XЪyZ)p^RU<`)pd}j#k{p`b BbKT[Dתz@W@ ( h ,w `D BE  AaW תzתzb zbKaDq_@?T@#@?T@}@{@tM@ \-}h-؁h aN2gh  `75 7   p 00/#0#FODFOT#U{ȂZ#X[{^tMn?Trs|(p!8|*7j7f  &$9f#{Ȃ#Ƃ{4:b jbKrDW@Ъ@ @LO@s@RU<@:@ HRh Lw BC%       2Ws$:*Ъ0RU<6 >LOH:Hb zbK\}DGG@-V}@EO@8@=Ov@ N@?T@W@#X@Z:d@=O@8@EO}@ @z;M@#@֪L~@s@L~@{@tM@d@=O}@M@As@:@#@֪k@EOv@*k@  !hpSh w Ý w ÝU we ?f7    7pW kL~=Ov=O}=O@8 W$֪k(֪L~,EOv0EO}4EO@88sL Nj Npst-V}z "x+r" >e ` R  <    A w  fAs"Z:d ( N6d:GG>;M`Mf#΂g{Ȃl#ǂm{Ȃr#Xs{vtMz?T *:b zbKD-V}@@:O0@?T@W@#@Z:d@EO}@s@}@{@tM@ZkK9@=O}@N`r@:@#@֪k@ϫ}@k@ l2h 5jEw   pD= f &  Ep0 4 eTkK9ϫ}kK9ϫ}Ws"=O}&k.EO}2֪kLN`rhsv}| f` B B0   0  w  jZ:d -V}"-V}*s8}PT:O0`}h#i{Ȃn#ǂo{rtMv?T~:* l2h<0b )m.M000#h#vATADATADATAH"w #wH.`D8:` DK0:K~KsK$K :&Kp:(KP/PK86Fwp7zP}F|7|#?|&CHb zHD̫| @ѫT@@ͪ$@v}@v}@vYM@vz@y@6f@d&#@W@z̫@ $@#@YM@?T@kOp@e@<@z@v|@)W@c@>@"@|@z@#h@|@#@{@@v%@#@v? @vt!@6}@[(}@v@'xx@#X@j,|@3W@#@,@#@\}@t!@bBx@%@ѫbT@ fzh 7  W W W    %     % w"w Ne ѫT"|8̫>D"vz|-(  Х$@ %" 5 $%000##|F3WL̫P̫| TyfWl6}pv}tv}4v& w %% w4#{6f)W #ǂ{v? ?Tb 0z"w0D#w@#@Ԫu:@s;@:2@`@#H=#H>{H#H<6f@#PH@z#(H?#0HP#XHQ#xHA#HR#HT#HD#HU#HS#HB#HE# HV#HHW#pHX#HYz#0H(?T@#H#H# H.#HF{H#hHI#pHZ#@HH#HJ{H#HG#H[#HKz#H\#HL#HM#0HN#XHO#pH #H#H#H"#Hy@#`H#hH!#pH2#H3r#H##H vRh^?Th}hzU}hU~hYM<DZhRH h""*}""?T) ""?TCommand I/O error ""*} ""?T""?T*File %X not a valid driver task image ""*} ""?T""?T88Privileged command ""*}8 ""?T8""?TKKI/O error on input file %X ""*}K ""?TK""?Tf#fFile %X has illegal STB format# ""*}f ""?Tf""?TSyntax error# ""*}   ""?T""?T Device %2A%O: not in system ""*}"" ""?T""?T'Partition/region %2R not in system ""*}66 ""?T""?TDevice not mountedr ""*}BB ""?T""?TFile %X not contiguousc ""*}DD ""?T""?TOpen failure on file %X ""*}FF ""?T""?T$Task image I/O error in file %X ""*}PP ""?T""?T33Partition %2R too small ""*}\\3 ""?T3""?TK"KIllegal driver task APR usage ""*}ddK ""?TK""?Ti%iPartition/region %2R is a commonm ""*}ffi ""?Ti""?TDriver already resident ""*}xx ""?T""?T$Driver being loaded or unloaded ""*}zz ""?T""?TInsufficient pool space ""*}|| ""?T""?T*Loadable driver support not in system ""*}~~ ""?T""?TDriver not loaded ""*} ""?T""?TDriver cannot be unloaded ""*} ""?T""?T,;,Device %2A%O: is attached, busy, online and/or mounted" ""*}, ""?T,""?Tc5cInvalid driver data base at offset %P in file %Xb ""*}c ""?Tc""?T/Driver built with wrong executive STB filep ""*} ""?T""?T3Warning - KRB %3A interrupt vector %O too high ""*} ""?T""?T,Insufficient ICB pool space for CPU %1A ""*} ""?T""?T1Warning - KRB %3A interrupt vector %O in usee ""*} ""?T""?TC'CSymbol %2R is undefined in file %X" ""*}C ""?TC""?Tf,fSymbol %2R is doubly defined by file %X ""*}f ""?Tf""?T,Illegal value for symbol %2R in file %X ""*} ""?T""?T*Driver dispatch table is inconsistent ""*} ""?T""?T5CTB %2A is not supported by driver -- not loaded ""*} ""?T""?T ' Cannot load/unload a pseudo device ""*}  ""?T ""?T000Too many symbols of the form %2R in file %X ""*}0 ""?T0""?T\\CTB %2A does not existe ""*}000#h#vATADATADATA\ ""?T\""?Ts"sDCB table for CTB %2A is full ""*}s ""?Ts""?T1KRB table of CTB %2A will not accept KRB %2Ri ""*} ""?T""?T&KRB %2R not in loadable data base ""*} ""?T""?T CTB name %2A is a duplicate ""*} ""?T""?T-Warning - loadable driver larger than 4Km ""*} ""?T""?T%)%Partition/region %2R is not a common2 ""*}% ""?T%""?TJJKRB %4A is not offlinea ""*}J ""?TJ""?Ta+aIllegal use of partition or region %2RB ""*}a ""?Ta""?T(Partition/region %2R already loaded ""*} ""?T""?T*Partition/region %2R cannot be loaded ""*} ""?T""?T,Partition/region %2R cannot be unloaded ""*} ""?T""?T3Partition %2R not in system, defaulting to GEN ""*} ""?T  :2 &&f DE%\  Д >7 fLť  wB h ""*}"Ԫu:&YM<0?T:YM<@YM<J#Ls;V6fZ`^#w`s;ds;hyxԪu:~ P)wf b <0z#w<0D"Bx@sh<}@4 @4 @g @p@C@vP@@"zd@*@~@r"Z@w6 X@v g@'I@;F v@@" L@rTq@"5@"M@ fhfh   wV%e 5 ATz$('I.v g4vP:;F v@D4 HLrTqN4 TX*Z'I`4 dhrTqj4 ptx~|pvTUETTTTAf e e w0  Օ~sh<} g  sh<}v gvP;F vw6 X"5""Bx&"M*"Z0"56"Bx<"MB"ZN" LX" LbCՕ %e  f |77577eE55555  dC,|044 8<*D4 HLbw6 Xf"5j"Bxn"Mr"Zz"zd~Xb Xz.`XD6f@)p@?T@ @)W@{@)Ps@$9!@#p@ Veh,|h,hF V   w77 & UH6f "$9!$)Ps,6f)W 0#pƂ1{4?T8)p>)pb tj8tDk) Hk Hk`HkHkRH 8kkhkh 8 _ b XzK0XDs@6f@Xu@:br@?T@#0@$9΅@)W@{@ \hVKh"^Khhh  :br D %1)w>$9΅sXu Xu:#0ق;{>6f)W B?Tb HzK~HD&̫| @@@Hg@@@L@s@̫n@s;@@f@e@z+{8|@iB@#@GP}@+{p@#@vR@HCT@6f@+{P}@#(@2@b@@-0@zW@P\@# z@3{@nOH@3{(@:^@z}@@@W^@v:@YM@@F@?T@zlh.@;F4 @kOp@C @f@4@,@DZ@C@9x@}@c @<@B@nH@zW@eĊ@y@#@p@0{G@g'@:D@ct@)W@X@c@/ @. @Q@z~@\f@뫽@#p@ѫ@d@y@{@[W@RH @v? @@&@&@Aq@L@z3W@#0@@u@@@@g@000## -F#`ǂG{J?T NԀVSU<`,n,WzGP}e?߇ Wtw  ͇  Ƈť= w  ~  VSU< Ԁ k*,8,WDGP}Jk PԀX3Wb,n3WvAr |Ԁt   ť=  w www w,, \,,W",W,9x0Ar69x:ArHWLV2d#e{hWl?Tp:d2  b zK :D)@L@`@)@}s@@6f@:p@@@W@^K@zz8@?T@eK8@$9f@; X@2@9x@h'@@ X@fz@[Z@)W@)W@r@j{@[W@v? @)Ps@' q@#h@#@#@ѫRT@ѫbT@ &h2 &  "&:p 6f)W ",p,$XX:77 ew, Ke .ȝ Ke  ~ v? 9x 2[W $,(9x,ѫbT2ѫRT6r<.@LDLJ9xPѫRTT; XZz8^h6fl6f)W ~  . .  1 HD)>&;$"7wP4~W2}s"' q$)(h'.fz26f6`<6f) @6f)W D[ZH XNp^Kt^Kn15  ! 5  x#hӂ{$9f )Ps2eK86@DWJNTZ6f^6f)W d#ӂe{Ȃj#ӂk{ |w6f)W ?T b >߀zKp:>߀D0@iO@5Ir@@6I@y@$CT@f@#@:(x@3@N@zb@}Z X@K@0u@Xu@nOH@sO@YM@#I_@?T@N6@kOp@N@DZ@%@zC@Mxx@uX@y@nH@ X@X@p@3L@2@k`@nOH@nH@v? Fd@yL XTbZnN6psOvdO 0 fwNCeH D   pΊ |@-   B-7 D XubnOHnOH$kOp(:6IRXXdOd6InnOH" "    5  e` 7  VXu"##{&*?T0XuTXu\y`dkjrTqp:(xv~#{Ȁ5)%$ mj 5 L?D<8 ><:& w@ty*; 'I#{y iO&iO,;F v2;F v:;F vB;F vV0IqdynXurrTqtXu|Z~DZ  eAw %5  m  L#$,0b62>uBfDNc^bbjbBxryt-e f fh ,  6   |YM \};F vrTq;F vvg $c(d@yD\}HCJpNKTrTqV;F v`;F vjbh* , m , e ~6*cxFnHHv? P%V;F vZrTq\;F vd%j@e %R-me  u$   Ie ~;F v NsONsO cOL$3L&2`m,8nOH>3BrTqD!uH\}LyZTrTqV;F v^nOHrkOpzXu c %w  5%% 5 $ ނffeDU}\}rTqXu yZ2#3{6Xu:ZuXDuH5IrJ\`x h5Ir~$CTZ\f 7@m   ISbDS, H` !H  $CT"8`,k`0tJR;F v CEb zKPD@L@5Ir@@y@v<@Z@iB@{@@#@/I@#0@z6f@ݪK@#X@b@#@@#@#@#@nOH@VK@sO@^K@?T@N6@zkOp@<@z@rU@(IHg@Mxx@I@c @K3@uX@y@y@Ky}@nH@p@z2@/@T^@nOH@ct@)W@I{Q@c@Iy@dO@x @{lQ@X@@d@y@p@z{@#@v? @x @@@@@/Ip&@G^@I@u@u@;@@#I(s@b|x@y@@bBx@3I@@G@ѫRT@ KhYM<Ϋh w%7 Z 7AwD7777`wND w ez< bBxcyZ /&#'{(y.b:zFcJc NzXydVKj#k{nv<rVK? w  Ð`w Ee     ew ziB rU^K"^K&^K*^K.VK06000#h#vATADATADATA>VKBVKHbBxLbVj^Kn^KrVK|^Kp7 I `   v&  $eΊ^KLy$#0%{&y,nOH26:kOp@;@D{@HnOHX#Y{Zyd#e{fy|ѫRT|  e %  & ffM"wwhѫRTN6sOdO,#X-{.y8z5IrD`H2RnHXuX\uXbuf5IrNDmÊ 5l e e 2B%% R V PwD& V uyyG 3I(/Ip&.(IHg8/Ip&5Ir @Ztcxpe7,)0 e"5e p & 7 Aaw ewdA&f E z@!IehnH nHv? d@yunH u(u,ud@y 4u8uX tqNC% `Ke RK5 e% 6Ke  wHv p II{Q .G0IyI 6II Z#[{^VKdbh6f)W vVKz?TR5w!w!6&Na%,݂&  &eP!Ί  w%  b&*L2nOH8kOpb JK8D@@:_@ 2h 6Е[  Е,  Е]7":_&:_.2b tRFwptDnOH@kOp@L N@ LXh Xh LAE7 A  Deaw7  7! L NnOH kOpFb z|D@̫| @L@iO@Td@Hg@@s@̫n@s;@@ @ze@3{@vR@+{p@#P@+{P}@N@2@#x@b@-0@P\@# z@#@3{@znOH@z}@sO@#H@F@?T@N6@#@lh.@kOp@;F4 @C @4@N@̫pE@zC@}@c @<@uX@Gd@eĊ@mh@y@nH@X@p@3L@ X@:D@zT^@nOH@k`@@X@ct@2`m@c@@sh@TS@DF@dO@Q@{lQ@zrh !@&@\f@i@vg@|@ѫ@d@y@{@RH @v? @rTq@Aq@#0@3W@z@u@@S@g@+ @@@#|@{#@G^@*;@u@u@!u@z#@x@#@x@L N@*}@#`@\}@̫<@3I@bBx@cOL@#@@@z yvhpe@~hbyhB2hPK h:KhZz8hteK8hXyhr2h@2h>Khz̫<D< JԀLRH E5@` ,1ť  ť/ww w ť: 5ť/   PQu\fQ-0  s>#Bv? Jv?  jԀr3W|0~ Aw,& w x b,  | 3W#`ǂ{Ȃ#{Ȃ #Ȃ!{.nH0v? 6#07{Ȃ<#ǂ={Bv? H?TTZjnHlv? rcxc7 R 7 F R J& C4@   '7HmxB5<76mb0 ,?!& [m2d@yp$ X,N6.sO4dOV{lQzX$FE! M Մ   rB  >,7m5m @@ EE@P5J dOv? N{lQ`hT^ lTd rStzTS|Q7mߊ@] @ lU7.& Nw w\ wp  b  u$u(i,uX4y>yH#I{Pc`#Pa{Ȃn#xo{Ȃx#Hy{Ȁ  f7    2 2  v-wA@,A1f&ycd@y y2rh !4rTq8c @d@yDpXCdmhnshtshzsh|sh `   *w  e   Fwjcy$**}.b48L>DHnOHNkOp^ctfbBxnvRrNtsOzN|sO@e-    44@-5 & 5E@ ` PDcOL 3L2`mrTq!u,N.sO4 X>iODiOP*;  T C - 4w-,\k`*N6,sO2dONuX\}brTqnS C&N` b Mb b"Sp55w0e ! 7 *>G^@3IFGdH3INnOHXkOpd zb z|#De@~@ch, @@ @6f@2@W@?T@y@f@2@p@zp&@C@}@mh@y@@#@2@nhH@)W@sh@:d2@rh !@&@|@z{@ @t@[W@#@=@v? @@=@rTq@3W@a @T[xx@#`@ d#hYM<Ԁ Ԁ EXPVEC  ` z[= lTR  NMť=J& @F J ť/ 0 1ȕ ,XP0W ԀXd=n@=xv? ~v? | ť/   ec~ ť/  w 777  )pW Ԁ 3W63WDWT&X6f)W \[W^Wb[WdWhylpWzYM<~CZ # @>wA@,A1 w~rh !rTq>YM< mh$YM<*sh0sh6sh8shh2"h8v%h0v\}hvt!h6}hvh*;@h<ѫbThzbѫThh{@h $h4rYMh<hzh g'h|hbh6|hh4h6U}h\}ht!h %h y& z z*} \} zz z*} U} zz z*}  YM zz z*} | zz z*} < zz  z*} t!  z z  z*}$ $z  z z z*}* * zz z*}0 0% zz z*}6 6g' zz z*}< <;@ zz z*}B B;  zz z*}H H; zz z*}N N; zz z*}T T;@ zz z*}Z Z;% zz  z*}` `;2  z z"" z*}f f;>" z"z$$ z*}l l;D$ z$z&& z*}r r;K& z&z(( z*}x x;@Q( z(z** z*}~ ~;W* z*z,, z*} ;d, z,z.. z*} ;p. z.z00 z*} ;v0 z0z22 z*} ;}2 z2y 000 $1$X+@t!!@y&lfv<f#f0%Kq 001$h#vATADATADATA b <0zKq <0Dy@H ~p@,VNHp@#Hwx@-J@5xH,h8Bxh.yh*Iy`hvL8"hrމhb](,h2f0hzL hq_hhyh~t he8hZq`hy}hwV}hxlg'h,Ghfn^h&vPhAyh(whz:hn/d hpxg'hk^h ^h'LThl̫ h4~h }h ( hqp hqHh"q hy/d\} h\}t!hsh/d\}h&Lyh(F (x;F4  2 4z}  @@06X)Xw : g -J"" Z&>>BB /d\}       KOl|.:t 6:N:`ThOl|B ejk   ,*>4B8dlL` ^ ) * ŀ eLlfv Z&&}Z&*Z&>.:4F:L@t!bZ&hf@nx~ 5@x?t& & & & & & & & &  Հ& & & & & & & & &  sΥ$B:4Fn:74;Υ827/~ |tr:pl7 d )DJ@HD ) 0}wx*0:@R:s ~p ^@jvsB ) )z >  |  w: :B.:4F4TZ&>^ "`j@t!xR}|:747  ) 7L JF00 E,: 8 )0BPqbqp jqp r'0x'0nB9 zf](V 5!~'0'0 Mpqp Mp$qp &Bx*Bx,](,0'0nT` 2xg'8qp >8BEyL'0NW@RW@n 7D5.,700 E'0 :Mp 2;F vBv gF>Mp bxg'h@<ZU8<ZvP ;F vv g>Mp $}I"086sb 0z@y0DKq@s@nU@nFy@X@'Z@vL/d@#@Q/d@](K@q]@nSy@zq^@q^@,@Bx@y@vL8"@Iy`@z; @](,@f0@n?@q_@n^@y@t @e8@q`@$9s@y}@$9B@n](@n@@zV}@nFy@: g@nSy@nM@T;w@/d @xg'@:@'0@'LT@[Z@@/d@̫ @)W@zyL@z5x 5x  5x! 5x" 5x# 5x$ 5x% 5x& 5x' 5x( Rz5x) 5x* 5x+ 5x, 5x- 5x. 5x/ 5x0 5x1 5x2 fz5x3 5x4 5x5 5x6 5x7 5x8 5x9 5x: 5x; 5x< zz5x= 5x> 5x? 5x@ 5xA 5xB 5x 5x 5x 5x z5x 5x 5x 5x 5x 5x 5x 5x 5x 5x z5x 5x 5x 5x 5x 5x 5x 5x 5x 5x z5x 5x 5x 5x 5x 5x 5x 5x 5x 5x z5x 5x 5x 5x 5x 5x 5x 5x 5x 5x z5x 5x 5x 5x 5x 5x 5x 5x 5x 5x z5x 5x 5x 5x 5x 5x 5x 5x 5x 5x z5x 5x 5x 5x 5x 5x 5x 5x 5x 5x z5x 5x 5x 5x 5x 5x 5x 5x 5x 5x .z5x 5x 5x 5x 5x 5x 5x 5x 5x 5x Bz5x 5x 5x 5x 5x 5x 5x 5x 5x 5x V001$$h#vATADATADATAz5x 5x 5x 5x 5x 5x 5x 5x 5x 5x jz5x 5x 5x 5x 5x 5x 5x 5x 5x 5x ~z5x 5x 5x 5x 5x 5x 5x 5x 5x 5x z5x 5x 5x 5x 5x 5x 5x 5x 5x 5x z5x 5x 5x 5x 5x 5x 5x 5x 5x 5x z5x 5x 5x 5x 5x 5x 5x 5x 5x 5x z5x 5x 5x 5x 5x 5x 5x 5x 5x 5x z5x 5x 5x 5x 5x 5x 5x 5x 5x 5x PPdPxdPPPPP [0"z~5x 5x 5x 5x 5x $*d0x6d<BHNTZ`flr [2"z [0"z [0"z [2"z [2"z [0"ztcc[1!}c?21 J15m1;66r3g14;22;30;38;46;54;62;70;78;86;94;102;110;118;126;134;uTVTw7 7 7 7 777  v@g'xg't :X":X&:*:.y}2/d 6@/d:'0nU nSy@f](FnSyHf](P'ZTnFyZnFy`nFyjf](nnSyvxfe& NԷwA%     BҋB](,e & '0n& &'Z('Z.'LT<>,@>,FN](,RV}`:bq^fEyhq^lMpnq_rIy`tq`*7w7 )4'Z'Z vL8"q^q^q]k Ey b >ƀz&f>ƀD[X@Kq@s@`@[8@)@nz@s@fvL@vL8"@; @/d8"@zy@nK@$9f@e8@y}@h&@lg'@: g@G@T;w@Ay@ X@'0@[@[Z@z)W@l2X@,z@&y@Rw@(9@q@""`@qH@{@[W@r@&Ly@)Ps@[@R' q@@ny@@g'@[8@&g'@#@ n&fh ^WTQ-7 7  7 7 d|@g' &g'y}l2X'0ny  Kq&s(T;w.(92lg'8'0>lg'B'0D(9J(9N""`R""`\' qFZ w001,$$/d8"BsF7 w1  5|RwG &g''0AyvL8"fvL&y": g&: g)W *'0,[0'02[X6[X:'0@'0 P ҕ[Ҕҕ]  l2X'0ny  qHnK yqHnz &'0*y0; 4y6:y>BF,zJ'0L[W:*      '0 [W '0  [W'0['0[Z X"'0 $[8('0 *[8.'00[84'0 6&Ly` 1 1 '0 &Ly [W[8.b XjlfvXDs@xp @?dv@y}@$9΅@(9@&g'@ Jlfvh NGOl|Ol|7 ׭1 J xp &g'y} xp $?dv&xp *(9,xp 08s:$9΅H b z&}D\}t!@:X@:@s@fvL@vL8"@/d8"@y}@: g@G@Ay@:@z'0@'LT@/d\}@w^@w^@t!g'@Mp@Ey@MX*@:@M*@&g'@:4F@ `whh&}h ŀ7<9& & & & & & & & & Ε )) 277 7 r'0'0vL8"&g'y}"::Ey>MpB:4FLMX*VM*dy}hvL8"jfvLnw^tw^z:X~:r| 7׭%׭  - & ׭׭ ~:X ::t!g': g'0&'0(Ay,'04Ay:Ay>/d8"@AyF/d8"HAyNAyP/d8"Z'0d'0z7 $ w#A B `E`W! ABC w 7 7   7 |Ay/d8" /d8"/d8"s/d8"$/d8"6\}t!<\}t!/d\} H:LGP/d8"TAyXsf:j/d8"lAyp/d8"v'LTLb z@t!D#v?@s@:G@#@`@](K@n(@vL!@xp @vL8"@Iy`@dl@@z: g@nT`@xg'@'S@'0@'LT@dlV@$9΅@D: gH`L&g'P8V & & & & & & & & & Ε 3 @g' BxV}*Mp.:Lb XzfXD#@k2@<&@)?@$9p@f@y@މ@f0@)p@t!@y}@z)t @Ay@:@ @#@^@^@)!@:@'LT@<&f@yL@<&(@f@Rw@z""`@)@ 8r@{@t!g'@)Ps@g'&@$9!@މ@)p@#@ f@$h0fahf$h$  &  w; 7&     t^ ^y}$f0*f.^6f:^HyLNyTyLX:j""`pt!g'vAy|#{ ~""`f|ŋ  EwwV w f |Ay""`y}#{  ""`&""`*:8 8r<މ@0014$h#vATADATADATAމD)?L)pP)pT Z)p^)pd<&ŕ  ɕ  E!ŕ  7,e&f 7ŋ'ť1ť+׭V)t <&()t $t!&),<&f.)t @)!BRwV)!^:h)!jRw~'LTZ ɥ  ť0  ť$E`͕ w 0w wj g'&Dk2Ht!g'L$9!N)PsTt!g'X$9pZ)Ps`)pf)ph)pp#{ r""`v)Psz""`b Xzf0XDp ]@s@`@/?W@xp @f@y}@lg'@eK@'0@( @$9΅@z)W@(9@""`@[W@r@K@@g'@&v~@&g'@ MhhjR}h fhbMyh|  GOl|Ol| A : 7 we  % f% %MfVT% Nr xp &g' ""`&(9*(9,(92y}6&v~8'0<'0@p ]B'0F( L)W[W Plg'VeK`|%xQ  7׭1 77\rK`"&g'&.s0$9΅> FfHxp Lxp P@g'V@g'Z/?W\xp b Xzp'XXDy:@X@@,@Ay@'S@'LT@@/d@g'&@Ry:@&g'@g'@B rvL@$hvLh$h vL$hvL$h7M@~h/dh  |  t  7    7 ~(,Ay0Ay4XvL$B0H](,NGR?TfvL$n)W[ r)W[ v)W[X |:_t4: Д jeem me! =^ w 7%|)W[8 j )W[W &)W[8 *m2?T6vL$D N^R V?T\w`?Td7M@~j](,p7M@~ :@ eӥ. % RS mm ! RS RvL$7M@~: g)W[8 >](,HL7M@~PvL$TvL@$XvLh$dvL@$hvLh$\  m 2 ʝ  m   F  vL@$(9$(9*?T. 2vLh$:BHlg'RX?Tb 0z>X0DnyX@vL@$@vLh$@'Z@vL/d@vL$@Q/d@](K@vL$@@ny&@](,@zy@7M@~@?T@/d @'0@)W@qH@[W@[(}@n}@@b'0@ Ry:h^ 4401234567890123456789%4S V %4S%Y%4S%3Z%VA%3R - LIMIT:%D PP.%VA%3R - NO PAGE LIMIT%4S01234567890123456789FORM #%D - %D LINES PER PAGEFORM #%D - NORMAL HARDWARE FORMSFORM FEED IMPLIED AFTER %D LINESNO IMPLIED FORM FEED001<$$)W[W D)W[W JQ/dRX?T\vL$h rbv z?TZ$ 7% f" R eA eA Ax?T 7M@~](,7M@~vL$7M@~&'0n} ,b'00'0n} @)W[W H[(}N)W[W T[(}z    % RST mBm>m:% RST b)W[W [(}b'0 *](,6:7M@~>vL$BvL@$FvLh$JvL$XvL@$\vLh$`vL$ m 2 ʝ  mʝ  m- D  $~  vL@$'Z](K$/d *04?T8 >vLh$FvL/dNTX?T\vL$dqHnyX lDp tqHnyX x?T~$r : (  ?T:qHny& ?Tjb zg'p!DvL@$@vLh$@vL$@](K@vL$@@ݪK@7M@~@n^@x?T@f@@"g'@ \,h .c|1!_1Cx! !B.cB]C!w1g1cB.X}1A>!c1cc1FET1*B>.:#Bm|]FRѹ^A.Fs1z1N!!GB     `    7 C &f& AZAJ090:Djbt?.8;2:,]&[ ,$'!-.t(4@LXdp| &# f eaDE E e0  ҀDА  %w D Е  ݪK ݪKZw   @f   L%Fw ĝ%! 0"(f2n^RV](Kv~f |   X* @ (  t n^vL$"7M@~&f0n^6vL@$:7M@~>fHn^NvLh$R7M@~Vf`n^fg'lvL$p7M@~tf~n^R  x?THb 0z:s0D @s@\}t!@vL/d@:2@a@Q/d@](K@@q^@q^@)?@zq^@:X@q;^@:@q^@s@fvL@y@vL8"@Iy`@މ@/d8"@q`@G@n^@zAy@/d @:@#@@'LT@/d\}@@/d@$9΅@yL@i@""`@{@k@Ey@@g'@zMX*@މ@M*@ @k2hffh vL!hx?Th'Shfhfh:  h:  h  p   N&  77 57 | Iy` Ey : :XMX* : :M*"q;^,n^>yLDyJyLNvL8"RvL8"T](KZvL8"^:bq`l / ,w&   ŗť1 ! Vq;^Ayq^q^:2 q^$q`(q^,k@aXs\$9΅x:~ ĝ7D  7B7 8&  7 h vL8"'LT'LT /d &](K*vL8".vL8"4BFvL8"LPq;^Xn^jyLpyvyLz:d mB`7 DW W  $ W  JW  n7    7JGGGJ'LTVvL8"\/d bvL8"dvL/dpvL8"vvL8"x](K~vL8"  ׭  r 001D$2I$vATADATADATA7&f  @` Ew wf "> 'LT'LT(/d 6vL8"BvL8"NiZ/d `vL/dn](Kv/d \ ŭ  2wB   e   f Be  -T vL8"/d "vL8"4/d\}BsD JsN T/d8",  މމ )?8b z "sDW@@G> H #@R@q;^@fvL@vL8"@y@)@: g@x?T@Ay@z?T@@GVNH[Z@)W@""`@[W@&Ly@[@@)X@@  "`h?T\}!?TԀk ?TԀ/%6A-- Open error #%D. on file- %2A%O:%VA ?T\} ?TԀ?TԀ+0+%6A-- Print error #%D. on file- %2A%O:%VA ?T\}+ ?TԀ+?TԀW.W%6A-- I/O error #%D. on file- %2A%O:%VA ?T\}W ?TԀW?TԀ?%6A-- Job limit of %D. pages exceeded on file- %2A%O:%VA ?T\} ?TԀ?TԀ@%6A-- Attempt to space %D. pages beyond EOF on- %2A%O:%VA ?T\} ?TԀ?TԀ@%6A-- Printer hardware failure code=%D on file- %2A%O:%VA ?T\}   ?TԀ?TԀ4;4%6A-- DNFW, Job aborted during LAT connect; Status=%D: ?T\}  4%X%P:%P file ID-T ?TԀ4X 7 &A ׭  |Ay AyfvLvL8"""` $W@(""`,""`.#4: g) 8)X<)W[W F?T\}LPyTDTA  ׭C  z ?T\} ?T""`#: g $)W[W *?T\}.&Ly2&Ly 8?T\}<)W[W @)W[W > B` ׭  f)W[W )W[  )W[Z ?T"q;^&""`(#.x?T48R|Ay AyfvLvL8"""` $W@(""`,""`.#4: g) 8)X<)W[W F?T\}LPyTDTA  ׭C  z ?T\} ?T""`#: g $)W[W *?T\}.&Ly2&Ly 8?T\}<)W[W @)W[W ><0b " K H!~ 2 &:$<J< zr!`t!0Mt!f#xso'` $,0M&-q*,.Y+.Y^5 g,fs:jL,:v: :/y:3y:`'3y:68:`'8<;S<4{Lx}>@ NX?kQy:BJkQrCkQrNkQrOkQxsRQLW)SxX`SxZT`Z;T[|2X`2T`""a+dEbfcfxddfXzhR gijIqtXq}u r2wZ vZtFwjL|w~wzw0|wU:`wUAyyZNz`.8"*P}002L$$ NB FhJZ©Bx^6;b'f[qjK nK rvK > U5e7 7 wNC   ;d N&:9:\}( N,w20kQi4jL N8z<t!W Sӳz~SӳD;dv@zKd @wW@ @""X@`@S@@r@|N@z@.q@Df@z""@K@y@KC @9w[@rq@ R@@ N@yZ@-q@-q@C @Nq@DZ@zCT@xK@wz@,@X@,z@#@  @""(@,W@}K,X@\Kt!@~K/K@K@ jwHhhH hZg 009hB}h49%h6D9%hh69hbD9h\9ht!hz wB pn!+,.8KK NWq&XHX[z Zg p Zg Zg  Zg Zg Zg Zg "Zg  &Zg *Zg .Zg 2Zg q 6Zg :Zg >Zg >hi" Zg Zg Zg Zg  %,  5w7 w ) p fW"* ! ! C  7 j,DfwW K"KC (zKd , 0X4yZzL|NbCThCTn|Ntzx|  5 7UU ]  IU  C ||NKKC \Kt! }K,X&K(~K/K.""X0""6.q:> RDrH9w[NzX  ^""(`""h;dvn#      W!$ f  5@  C BW!&W!!B  D# #,z wz*DZ:,WB NLyPNqXS@x,WxlC  0.U    @B   D5 002T$I$vATADATADATA  ՋC wb -qwW""("""-q&Df.rq2-q8DfJKLC RxKT`^xK``vrqBW Sӳz2SӳD;dv@je;@w@X N@w@@we@we@e@z@3f@ N@zW@t!@C @@wj@@\}@vOq@@`X}@[M@Df@\}@a'.@ zZg 0b^hye^h drh6^y:h"d_hphf3fwhXhVdrhX:vL:U7   ( e$    ~;dv X:vOqw"X N &X:.Df2X N6`X}HqBwDX:;dZW^WbwdX:;dn[M  j D @a  w 5 0ҝ@ċ( ĝĵ pX:;d[M"X:(\}6>X:B\}HJC T[M\wjb\}lp Nt`X}xa'.^ҕĵ@ ^ċҝĵ ҝҝΊހ 7    , ҝҝѝ ѝw waҔҔҔҔdwj,0:eLPT\`X:f[Mj[MlX:;dtzHq$ Zg P%  -5  zX:;dX:\}\}\}"je;&\},X:24C :X:<\}@\}B\}Jje;N\}@&e&m  e5 JX:\} X:X:X:\}*X:.X:6X:\W Sӳz&SӳDX@C @(,[@z@k@.q@"&\}@"&@9w[@t<@[Z@)W@j)p@r@xx@)@[W@[@V@&{W@ Zg 0vwh(h& Zg N  ] 7 5!e 7 e|.q r9w[zC C $X&C ,"&\} 0xx2k8"&\}<)W[W @"&D"&\} J)W[W 0JR 0   L&{W )W[Z )W[ t<) )p(V,(,[&W Sӳz:SӳD;dv@/dZ@je;@C @@z@Jz@@J\}@Jt @@C @jr8X@J'@vLZ@&@@@a'.@ Zg 0v""hNqhh Zg f53 0-&Э  7~Jt  C ;dv&"C &J\}*r8X8J\} JPT#p^ n""(p""v|we| BW!< @B!  4 U & # &    (U& e  W >,&$ v.,W2`:""(<""Tj""l""tTv    wU:ye^NW Sӳzr!SӳDz@.q@""@9w[@ #g'@C @@r@""(@ Zg 0Jhq!`h002\$$KC F3 JX: XX: `edK[MfKC pwzet5  ҕ     ?  5  7 ~K KC K-KC ,g'2d_8zKd TvBzFzJ""rLr8XP""ZwbW Sӳzt!fSӳD;dv@M@^@S@@@ N@W@z@G@:$"@ dr@y@zt!K@vLf@G@f8@^y:@KC @Kz@S|@#w@w|@~@eG@@\gM@C @zwj@w@@-@\}@P@x@vL@a<;@[q@K2@:\}@dr@y@w N@zN`r@`X}@K-@M@f,@Df@]@v@^Df@ Zg 0(9wZh.ahyshjt!hhBt!ih&ChDHq:Ԁ|MX: I~whkHh Zg A    7  wѕ a EU 5 ~:\} ^y:\}f,f8,Df02X:6w N:`X}@wjDX:\t!Kbt!Kft!Kn^rWtC za<;|| 7  7  5@EU  7$ U |\}dr\}Dfw N`X} $:$"*;dv2S@8wj:X:BS@HS@L]RN`r^X:pS@tzZw   57 59 7 7  drP y^Df^\} dr$&C ,^Df0t!K4^Df8^< NBKzDKC JԀ|9NyRS|VMrJ7  3    e- 5ӤzDfX: #wN`rGeG$w N(`X}.z2x6X:@MHRM^vLbK-dKC lX:pvLfX     w 7~X: X:X:X:X:"X:&~2X:8X:@X:DX:LX:PX:RX:VX:t  -P ,& 5 F5Q ҕ  ɥa ҕ mzX:X: X: X:X:X: "Hq&*S@4w :Ԁ|F>K2@KC HS|RS|^wjjw|rX:t| %e  e e t j ~ҕ  002d$I$vATADATADATAҕ  |X:X: X:X:X:*X:.X:4X:8X:@X:J#wLX:TX:dhwpwjҕ ҕ( 74 ҕ,) e     4  w`w| HqS@"S|8X:>X:DX:HX:PvLT\gMXvLbS@pN`rtzhvHq  Ԁ| Ԁ|Ԁ| RORW Hq  Ԁ| Ԁ|Ԁ|DI Hq  @ Ԁ| Ԁ|Ԁ|  GBLLCL Hq   Ԁ| Ԁ|Ԁ| RELABS Hq  Ԁ| Ԁ|Ԁ| OVRCON Hq " Ԁ|"Ԁ|""SAV Hq$$ =% R G @X  Ԁ|&+& -- Internal errorSymbol table******X Zg jj @&  `e# 3mf Ce&&&& w  #- C4 X:,2N`r6eGPVN`rZeGew  wmw& w   J  & T!J   w 7dX:X:"-&X:0X:4X::N`r^X:fj;dvtX:xN`r|Gb@e'  D m7TTTTf TTTT  e N  ew rX: X:;dv"X:(X:,X:0z>X:NX: TX: XMdX:jX:nMvX:N%   awwN&ww @ T ;dvX: N`rG$X: .Ԁ|&2[q6X: :N`r>GBeGJX: $ W Sӳz#xsSӳD""0@wW@@X N@z N@w@""H@S@@@"" @""б@z@z`@T@""@y@z`@`@Tq|N@̫E@Xy@,v@Tv@~@W@ N@y@zt!@C @Nq@r8X@@DZ@wz@,@,&@X@vOq@P@,@t'0@,z@z#g'@""(@""@a'.@ Zg 0Tq#h TqhTq h$h. h8-#h #php}@Qh""h@*-h#h4X: HqV Zg    `      7 7 U Հ 4 !P w,a'.@a'.FS@JTq|NNXR""(T""X`a'.ha'.pa'.vvOq|& R  .E5  U ՀU&fffff  ( ʋ̋ p4w Hq*Tq|N6""б8""J bX:   R$ ^ Hq+ -f*/T&^!: Zg  Zg  Zg f Zg  Zg T Zg ^Zg   P 7 db(55  ( ̵E єJ BR&  N @  Tq|N2Tq|NtT  N   E7 5  w K- #5E 5U5P~&vOq*w:Tq|NDTq|NH#g'LwWP,zVz^ypNqz""|""5@cUE@] T   5UPU 5 3 C z""H""W z$P.z`2`6z`>z N@r8XH,JC V""HX""\y`,bC jNqptDZW!.UW!.W!$ U   W!. U eş˵@  P "" """""0$"">wzJ NP""HR""V,\XynXyrXy|wW    Hq Hq"+-"'.%8<P^B Zg Zg  Zg  Zg  Zg . Zg 8 Zg PZg N#  Q  U 8 W!> w8 H*wz,&:, DHq8HHq8"8\C|DOBFRxXB Zg \ Zg | Zg  Zg  Zg  Zg  Zg xZg \\& L c7  *eeee l  002l$$Dt'0LwzT,vbTvl̫Er`va'.. 5%~6 wH  XyXy&X N*t!W Sӳzo'` SӳDt'c@""0@wW@`@S@@@"" @@Df@ye^@""@(@zC @@,@vOq@P@Z@  @""(@,W@ Zg 0o'` ht'0h0X:Hq  Zg z  UL  ! W A%+%- 5 |  Hq""("" X:"ye^.t'c2t'c6vOq:Df >X: BX: JX:RX:dX:h,lZn`v  \ 0bab b b m %.w ށ%E   7`@@T@T@Th 1"3  eXX: X:"X:0X:<,W@FJNRX:bX:tX:     5     eU b(J  NX:X:X:DX:HX:NX:ZX:`X:f""0h""n5  Ur   Um7 7 7 w" 0  B $  4 $ l^(C t'c X: "X:0"" 2""6X::S@>t'cBJDfRwW`X:4a      b b b w2PHq,( Zg , Zg (JW Sӳz,0MSӳD;dv@vL@""@KR@zKd @wW@ U@`@`@:T@:p@,g'@z:N`@vLt!@ @@k@:!@Df@rv@""@"&\}@;dy@6<9@C @)!@xK@zx|N@\}@vOq@|TkQ@r@vL@|TQ@t!g'@:\}@:T T@ y@:T@:T6q@s:@y@&}@zN`r@t!kQ@kQ|N@""ȯ@}K,X@~K/K@xK@""h@ Zg 0f,vLhyhXX:;d/dZhMh*/d#hwt!h vLZhs&Zh Zg j  7`7  7    C  7P[w(~vOq vLX:;dX:;dX:;dX:;d";dv(X:;d,vL0zKd 4vLt!6}K,X:x|NFN:!P:\}Xt!g'^s:@ydkQ|Nf7     w - @ U b ~:T6q:N`:\} :!":\},,g'4k:s:@yF6<9L&}P;dyV;dvX;dy^X:;dl""ȯn""rt!g'zX:;dx7 U 7D =*D` W! W! W!   R E@ 55~X:;dX:;d  :p:\}:p:\}"""" X:;d$"&\}()!.X:;d2\}Xx|N^X:;dj`pxKvxKV JUH57H  wl em VŋW! h-w!C ""h"" vLH"rv&r(C .vLH2vL4Df8wW>X:;dHt!g'PN`r\:T Th|TQr:Tt|TkQz:T~ U& @e & w7U wT!U ŋŵ`  e  5Z   y:T6q(:T T,KR.~K/K4t!kQ>vLD""F""fN`rvxKx`~xKN 7 C "&\}:\}`\W Sӳz-qSӳDwW@`@Df@""@x@%@-Df@,@vOq@xd@w@  @Z""(@,W@-k@ X:.hZg 0rqh-qh-qh Zg  D  7 <>C!W!^ !  C D  C!D! UUy   vOqX:Df.xd%x  0`6,:X:@,WL,RX:fX:r""(t""x-Df~-k6|P: 7 x H 7 7&w-Df-Df*Df.wW2-DfW Sӳ:.YSӳD Zg 0vFh Zg z &?fW 002t$I$vATADATADATA@W >5W E5 W ! W 8W >W EW W W W Ō  $|,e W Sӳb5 gSӳD g @z@`@ gh@6xy@ Zg 0"5 gh Zg &RR RR W   g  z`6xy gh|W Sӳzs:jLSӳD;dv@<&Kq@`@`@#VN@}s@z@@y@""@"&\}@<&%t@z%x@R~@<&9@t<@h'@u@t!@jL N@,@vLv@ 8r@[q@=@s:Bx@' q@z=@s:@y@s:y@s:y@""(@,W@<&D@kQ|N@|' @ X:,R~Ԁ|DZg 0rjLph~&,h$s:HNh R t< <&%t""y #VN$$` X:`##' q%x f fkQzzSY Ԁ|H! -- .INCLUDE directive file error! -- .LIBRARY directive file error Zg  kQl W!       w UeBUUUUUr Rls:@ys:y s:ys:Bx &Ԁ|*[q.R~ 2R6`>"&\}Fy JRZs:@y` 8r~kQ|N| "Sl 0"eB  *ȕf  8` ;dvRl Ԁ|"$<&Kq<&D<&9 ,zBjL NFt! LX:P=`ud= ~R~eB$&< #  wBU W!<&   @B!  wZ|' }s ' q&h'2vLv6X:>""(@""PZ,j,Wn`vvLvzX:"W Sӳzv: :SӳD(}@^&@je;@<&`@[X@@[8@:N`@)@}s@'ą@ N&@z#0$SHf)@)Ty@k@Myxx@'@)@y@"&\}@-Sxx@yW@"&@KC @'@f@z)@)@h'@u@<&z@[@)W@)p@,~@)L@\}@&@xx@vL@[q@z[W@<&ly@:\}@=@)'@=@[@' q@@K-@hV@V@V@V@ϫ}@z|' @\}@  | HqȫT`hZg 0v(,[h>E`Xh&hh"&h(lzh6S`hbS`h^  |SY0:MACTMP HqMyxxZg @f  w4ffw w@0 wkQ5"S Pku=$hV8fH"&\}L)W[8 Pkl-SxxxyW[ |qfi g%NL`W N &5]5Ue 5#7nVV )4)p>MyxxFHqHϫ}L<&`T:\}XMyxxZϫ}bxxj<&lyl)r<&zt)z:\}V77 &# |)W[ ,~ )W[X  ,~  |:\} )W[W , |4)BFH)L'N)Rh'xJ 0 0    fe f0 e |V :N` :\})Ty)'V(}.' q0)4h':)W[8 D)WH)'L|' N)LR}sZ"&l"&r"&R  LA 8-~y^&"&\}'ą)h':N` :\}$ N&*:\}0"&\}46):'<)@h'F:N`H:\}L&n  * w kQ f=1 5      w"&\} 'ą )h':N`:\} vL\} 8K-:KC F\} Nje;RT\} Z\} ^kb=hVl[qW SӳRy:SӳDs@ HqR Zg 0<68h Hq?A  R RZg @eE& & Y b(Hq Hq$s (Hq2RFW 002|$$q!Bq!Fq!Jq!Nq! Rq!$X(X  $R    $$Zg v 7  7(w)eqqaaa ABCwvOq ;dyk Hq"&\}""&&"&\}*vL,)p2)p8)p )'Bs:@yHkQ|NR)Wd' qf)jh&hrW!7 0w *0 5w e|s:@ys:ys:@y::N`:\}V"S`&E`X,)!4<&ly6)<<&z>)F-SxxPS`TjL NZ;dy^;dvdz )Wt!PW Sӳzy:SӳD[Ǟ@Bx@/d@@@?T@W@^@A-@A-@#w@N @z@h'@R@jD@x@-@^@?hBx@#h@jTG@{@lE@/d@©2@[/d@2k@[Gy@ Zg 06;h Zg |w w      7 7 7  W, 7 7  # |W jD &/d*A-.A-2R6©2@[/d?hBx JkNA-R?hBxVkZA-^A-fjTGjBxvh'`x   0  7  7 lE{#h ?T&/d(#w,[Gy0/d8[Gy :x>^B[ǞF/dHL/dT[Ǟ V-Z^ w/dN W Sӳz:`'SӳD^&@<&@`@E`X@ N&@k@Myxx@"&\}@)Bx@)[M@"&@q!@zaY@ɪR@E@"&@hV@)t @V@V@iL@@}!xx@P@mYxx@)W@?S@z)p@(@uLxx@&@#@xx@)@@:\}@=@)'@k@&}@t @@V@ja"@ϫ}@y@y@s@xx@ HqZ^Wh NWhZg 0n6^h Hq  NSY$ $^88SY<Z<LIpNLSPCRENDS0 uLxx pmYxxMyxxϫ}xx"(}!xx,0xx40:iL>iLBiLFiL JiLNiLRiLViLF $(,048  iL iL$ iL(iL,iL0iL4iL8"aY&aY*aY.aY 2aY6aY:aY>aYBaY H$(,048  ~aY$aY( aY,aY0aY4aY8"&* .28q! B$ Zg bd `" w7 0f0h  w4hkɪR?S(hV2V<VFEJyNyRsT"&XP\kl=r@Vva"z&}v|f ^ 7 ؁ z7  7 Hq^""&&"&\}*t ,)2)Bx8)[M>)p BHqD)'HE`XN:\}T^&^"&\}d"&h"&l"&\}pt r002$I$vATADATADATA)`1< 7   |<&)t  )Bx#)[M)p Hq)'&:\} *Hq<.E`X4:\}:"&\}@"&F N&J:\}T(Z:\} (J@e 1 &"&\})W`:\} W Sӳz<;SSӳDI~w@^@S@@@z@drDf@9wZ@wj@\}@w N@`X}@f,@jDf@kH@v@ Zg 0 <;hja<;h<;ahR1fRh<;Sh<;m;h Zg ^ 7 &  Yz \}R R&f,(z,f,.z8:kH>DfBw NF`X}LDfPwjRI~wVzXR\zZ      7535@ n  5  5  F \Rzz&9wZ,wj.I~w6S@>S@LzPzT^S@lS@z2 2  F # jҕ  ̊ҋ5@DRR4^DRNR RR`v zRFRы& R &m  e e0 R drDf$\}2drDf6drDf<^BdrDfVW Sӳz{Lx}SӳDKR@K R@M@K@ @""@KC @9w[@K`@KK@ #g'@|Kr@js&Z@,z@  @""(@K@kQ|N@~K/K@ Zg 0/d@hdL;h{L}h Zg   )   B  P0@0 D` PU  55z    ,z|Kr"9w[2 #g'8K>KDKC HKRK`\KC b""(d""jK`pkQ|NvKRxKC ~K R |   U&KC  Ms&Zs&ZKK~K/KW Sӳz NXSӳD;dv@/dZ@je;@,@M@Ty@3@`@S@@@vLf@KC @z/d#@S|@\}@vOq@&@K2@y@[M@\}@,[@ Zg 0wehweh\gvLhzwbh(w|hHwhR\gMhwh,\gEh\gEhX:vLehehX: NYqh NhRԀ|  Zg @@ fA5(ʕ R fA5# eʕ Jb&X:vLX:vL[MX:vLS@X:vL"X:vL&(X:vL8K2:KC ^K2`KC |ҋ A @ 9eU ĝ7 ]+ (f ^@X:HX:LX:NX:RvOqXX:\X:fMlvLfnMt,[x;dv ~Ԁ|  ҕ-    BR ?   NS| /dZ3/d#/d# 3&,.y 6RfTyh`~\}&t   $ \}je;\}"je;R Ԁ| Page  W SӳzkQy:SӳDw@T@f@T@vLf@ɪR@~@GK@X@6`;@F@[(}@2~@ HqZg 0`kQy:h HqiP Zg PZg d   7p& & ikQ  w %f6`; 6`;GKGK"vLf &Hq X: 00pp w<IrW(,xKKMQ3fOqtwy: M q! M  M  M  M  "M  &M  *M  .M 2M 63fw :M M 7 M/KKw&` %2[MQQR Rwyz[-K \}   wkQ gOqzw"" R`` # zx x MAC> ""?T -- I/O error on output file -- I/O error on input file -- Command syntax error -- Invalid filename -- Invalid switch |-- Open failure on output file -- Open failure on input file -- Command I/O error -- Command file open failure! -- Indirect command syntax error -- Indirect file depth exceeded# -- Invalid format in macro library# -- I/O error on macro library btfile -- Insufficient dynamic memory -- I/O error on work file -- 64K storage limit exceededW SӳzkQrSӳD @fQ@  N@""X@@we@z@kQ.@""@t!@Sx@|TkQ@rw@kQԀ@w @ Q@@s:kQ@N`r@M@ RFZhDZg 0kQrh Zg U w  @ wwC d!L  P  7 D |""X""wekQԀN`r s:kQ$  N(.R@8kQ.> Q HRLzVzl  Npt!xw|RDh|DC  R@B %@A  @@wB m@~fQRD  |TkQSxkQԀM$ *R@.RB2w 6w>R@JR@TR@XRB\N`rdR@W SӳzkQrSӳDfhQ@ @  N@,k@""X@""H@S@@@z@.q@kQ@kQ.@z`@kQ@""@f`T@~U/K@t!vL@kQ@y@A`T@Nq@r8X@wj@kQW@|TkQ@w@z,z@  @`X}@""(@kQ N@M@@Df@~K/K@KQ@a'.@ Zg 0:QKhkQphkQrh Zg V u  57 7  7ww ~.q  zkQWzkQW`"~U/K$S@*a'..28kQ<,k@kQDkQHL~U/KNS@RyhR ҝ7   ^ĝ T mU 7 -zkQ Nr8X fhQ kQ.kQ Df$  N(`X}.z @S@J,WN-qRDfTXrq\.^wjbkQ.f:$"~l C 7 f7w&X7 Y  S  %\x 4 %%=, 'ŝ |""(""   kQ"kQ *R2Df6 Q8 >  DkQ.J NZR  NV`X}d,zp  NtwqzS@  @ V : %,   U     7  j  kQ.,W( 4,W>%x @`FkQ.NwzZkQ.` d,vDfz  N~`X}bÝ    f  5U 7 f x 8 hwj $w4kQ8MBKQDKC J\Kt!L}K,XRKQT~K/KZ,W^#b#g'nzwz~M  W ϊ we/uf ԕ$ 7 7( f % ee0T7  DM &wj*:$"2<@wjH~jDfn t  Nx`X}|Z   U  -֯     @-q Df rq.wj:$""kQ&,g'*,vL.,g'6KQ8~K/KDzTvLVDfZw^,zd  Nhwqp& 8  " W!'    f' 7  $ 7hS@ &wz,v.t!vL4&8,@DfD&X&fkQjkQnMrkQtkQxkQ~kQjN` ^ 7   w   -- VkQT[N`rkQT["d,Nr6UqkQ>GBeGJwz PHqZz`zHq֯֯zdzxd ձ gW SӳzQLSӳD;dv@""H@&x@Df@FwjL@rv@""@y:x@x @S|@t!@C @zx|N@r@vLv@vL@t!g'@@Q N@ RQDfhsSZhx"&`x"&hZg 0 Qh>QLh Zg f  U &   7 7   H |Q N x ;dv""H""$y:x*FwjL4&x:x|N>t!g'DQ NHLQ NPt!Tx|NXrvZvLH^vLbvLv2b  H57HHS|DfDfvLvvLS| vLH"rv&r(C .vLHdW Sӳz)SxSӳD`@:N`@}s@z@:$"@"&\}@h'@@jL N@jLZ@x"&@vL@jt!g'@:\}@' q@t @`X}@Df@ x"&`Hq0Zg 0&xhLy:xh x"& vL""D$$ Hq HqHq skQxLB*[1,1] *Zg  T .* N BRRRRR 7    A w  7 r :\} jLZjL N  jLZ*z2x"&BD:$"H:N`Lt!g'TjLZX:\} `x"&d`n:\} zDf~jL NZ| eB B  # H`X}"&\}z 4Hq 8Hq<}sB' qHh'N:N`P:\}Tt W SӳbSxSӳD,k@:Tk@:Tt!@M@kQ|N@ Zg 0&Sxh Zg *  %RR &,k :Tk:Tt!:Tk"M&kQ|NW SӳzT`SӳD(}@kQh@K H!@kQi@5 g@kQy:@&h@w0@6^@t!h@t!i@wu~@z R̫Dh̫EhZg 0 kQrh[qh&}hHq\}hX:^&h N&h;dyhh Zg ( Zg $ &  .R RkQy: Hq (}Hq>6^wu~K H! 5 g kQh&ht!hkQit!iw0W Sӳz;TSӳD;dv@/dZ@,@wW@""@w@[8@we@we@`@ N@002$I$vATADATADATA|N@zTq @""б@,g'@z@)@)@.q@G@Df@,vL@""@"&\}@t!K@y@z`@zKC @'@,v@S|@~@eG@t!vL@h'@\gM@Nq@C @#p@wz@)W@,@z,&@wU:@<u~@vLZ@P@w@,@6xy@t!g'@:\}@K[@,z@y@/d@@z@C`""@N`r@""@""(@,W@M@f,@kQ|N@]@2,@,[@a'.@ Zg 0bUqhfZht!h$w~h,|~Kh""`h-`hDhw2hyh@Ԁ| Zg   B 58EU@   wN 7$ & ^@  h .qya'.a'.$a'.(6xy,Nq4]:N`r@/dD]Rz`dGh/dtMxeG~N`r`| U ]w  w U|z` eG""б""|N kQ|N&C`""*#p2Tq 6t!g':wU:>weBzFt!KJP NԀ|PDfTwX,z^""(X7 ҕ  J W U ҋ ҕ   V"" f,zf,wz,:,&D2,HS|L<u~PS|T,[Ԁ| .MAIN.q Zg ,`, RZ Q5OL    |y ;dv,&yQ"K[$KC * N0:\}6"&\}:<)@'B)Fh' JԀ|NS|RwzV,v\wWl  8- ,   efff    e0J LDf vLZ/dZ&\gM*:\}0"&\}6)W[8 @`^~Ԁ|Table of contents Zg xUU  CU  C!w  U"E  """"""""we#pwe(""(*""0,8t!vL<,g'@,vLD,g'R,WX.qbdC jlC r.q<d 5P˵ ŀ Հ U ,wy,C ,6xy2""б4""W Sӳz2XSӳD? fT@S@@@z@.q@""@rq@ N@-q@,@ d@:T@ZC`""@@  @""(@kQ|N@ Zg 0rXphW+hZdh& Zg v \     4 * ff  7 w  w  Uj -q,rq&:T0  4z< dB NFNS@RV? fTZkQ|NbC`""f.qp""(r""W SӳzT`""SӳD#@#w@`@:N`@#0$S@"&\}@)@(@'@R~@ɪR@@V@zvLv@#h@jTG@vL@kS@:\}@k@&}@y@ Zg 0(}h?ThEh*,h"a?Tha"h0Hq Zg  wZrBНННP B ( Bҋ B t&} '#(#h)$k0@V6r,D""F""NDfRX:rwU:vye^~wW,| 7 w 0 .  .qS@X:? fT,W SӳzfSӳDfXz@MyxxH@-SxxH}!xxHmYxxH5dxxHuLxxHxxHvL@(lz@xxH RZg 0DfhHq*X:q!haYh<iLhhxh Zg HBB4@CD002$$5U8 PU0- W!(5( 5UU7 5UE ŀ D,W0wz4-#HIJC Zwf""бh""pwU:tye^z4PU0 U W!)wU&wU:ye^,W*,W.""0""W SӳzfXzSӳDvL@w@wW@w@Df@""@iYy@q!`@9w[@lzr@ #g'@{L}@ZvOq@fxd@vL@`@ lzwlzhhlz hZg 0:fXzh lzwCR DS w EN `  LI q!` NLw {L}iYyZg >    L ]@ DvOq wvLlzr9w["vL$Df(wW, #g'0fxd6""RW Sӳz gSӳD09@/d@@!@*@v@@jLp@ ;@Xq}@k@Uq@QK@k @zC`O@C`O@C`O@C`O@C`O@C`O@C`O@C`O@fZ@C`O@C`O@C`O@C`O@C`O@C`O@zC`O@iYy@t'@t'@8Z@pp@q!`@kQp@t!@ R`;@ ;@Xp@,H@"W@zW+@,HH49%@D9%@{L}@$w~@69@s:HN@f@[qX@|~K@d^@""`@-`@zp<@D9@`@; 9@C`""@D@uL`;@Zd@QL@+dE@Yr@9@t!@= @; P<@Zy@|@@  gw g h g&hH ghh g(hh g;Th8 g;h  gwS@AY P@`  s@@ z@s:  z C`OC`OC`O!C`O)C`O1C`O9C`OAC`OIC`OQC`OYC`OaC`OiC`OqC`OyC`O|D zQD n\! 0 @@ @P   eot C`O C`OC`O09%C`O-002$I$vATADATADATAC`O5C`O=C`OEC`OMC`OUC`O]C`OeC`OmC`OuC`O}C`OJ r@ r @ OX %@ y~T@p~@rw wssz C`OC`OC`O!C`O)C`O1C`O9C`OAC`OIC`OQC`OYC`OaC`OiC`OqC`OyC`O}t@ @t;:Y;wwwwLyz j@zC`O C`OC`OC`O%C`O-C`O5C`O=C`OEC`OMC`OUC`O]C`OeC`OmC`OuC`O|xS @  s:  @ @r @r OX % @w J zC`O C`OC`OC`O$C`O,C`O4C`O49%F49%N49%V49%^49%f49%nD9vD9%~49%Pq%vQzdzxd鰼Ry  , %! |1q34UqFXq}N[qXVv@^$w~f|~Kn*uC`O}C`OH%z)&z'Kz( z%@%@%%~@~%@Kz C`OC`OC`O!C`O)C`O1C`O9C`OAC`OIC`OQC`OYC`OaC`OiC`OqC`OyC`O}@K &@K8@K09@KK@KK@K@K@K@Kf@KK S@S%@T@T%@zC`O C`OC`OC`O%C`O-C`O5C`O=C`OEC`OMC`OUC`O]C`OeC`OmC`OuC`O|=OXOX%w w%w@8wK yyy@yh@y@y &@y&@y`'@y@zC`O C`OC`OC`O$C`O,C`O4C`O|@ he~|$|(d|W*|Xj|d:|hez|D0M/|D9Mo|DM?|DM|D`Y+|DiYk|DZzC`O C`OC`OC`O$C`O,C`O4C`Oh Zg B  <w\vOq "&\} )p\}$9p)Ps$:p&:\},$9!.)Ps4:!6:\}<:V@[qPW SӳzXq}SӳDfhQ@ U@ @fQ@  N@:T L@,k@we@ @|Ts@kQ@kQ@z""@f`T@rq@ R@t!vL@kQ@-q@A`T@Sx@@UqkQ@w@|T!@t!g'@ Q@z y@#@:T@Nr@@|T ;@:T @N`r@""(@M@kQ|N@ Zg 0D ;hXq}hPw ht!kQh Zg r !  C 7w f U & 7w & f -q fhQrq-q Q fQ&rq*,k.kQ2kQ8 @t!vLDf`TH|T ;N""(P""V#\we`,kdkQhkQn      V  $ 7    vt!vL  N f`T|TsA`TkQ M$Sx.t!g'BwF:TP R` Rd:T lNrpUqkQxkQ~Nr^f      e 4H :T L UqkQkQ|N $:T 8N`rF yP|T!V Z U W Sӳzr2SӳD N@  N@z N@S@@@Oq@""б@z@ gr@""@[pH^@z#w@eG@@rh@C @x@@r @-@^@vOq@ N@@P@h@zjS@/d@d@ @Nr@N`r@rBx@Oqr@a'.@ Zg 0r`h:$"hyh9w[hFz Nhyht!hwqh6xyhh`X}hvLyhPX:;dM/KhM hNkhX:g'hz`hBrDfhN hr8Xh8XhDfhrąhHq Zg 7    @ :w 7" (7&77 ee & tz  zX:;dN`rX:;dX:;d0X:;d8zDX:;dJa'.NVeGZX:;d^z~eG`| ^ #5 5 7 -B /dN`r#wX:x ^"X:& gr(X:0z6z<Oq>C DX: HHqNRzX^x E`m  aE`'--  B &  zX:- ^X:z NX:vOq*X:.N`r4X: FzLzVX: beGhX:nX:t/d:L^  7 `w$77XX: X: S@OqrX: X:(X:.S@26X:Hqxd@yuuuuXu0u Zg     w% - UaA ` D`U lW! `A2 ~vOq X:N`rvOqX: eG$z(P.S@4X: 6<""б>""DzHzd NpX:v ~N`r - &  ,4, %N  w7   # `B w7 s% : N`rN`r,  N>X:BX:fX:jX:tz  7  @e    C [$@D"&W!  7 e ^ #bX:X: X:( 0N`r4X:P NVX:\N`r`X:deGpdz~hu u  002$I$vATADATADATA f&0 0 0   7 fABC |h "jS*h2 6 :h>BX:HNrNeGRX:\X:bvOqhX:lr prhtrBxxzW SӳzFwjLSӳD;dv@S@@@z@)@@.q@`@jLV@,vL@:$"@jL@V@z)Bx@)p@~U/K@t<@<&e@y@wkQ@wq@r8X@kQr@x|N@QDf@x"&@sSZ@)@z 8r@[q@)Ps@t @`X}@kQ N@$9!@:@@Df@Q N@ Zg 0vFwjLhx h&  Zg  |xtww mB 7 & 0 T @|x"& t< ))Bx<&e) )p>sSZDsSZPQDfVx"&Zt<\)b)Bxf)l:rQDftDfxQ N|`X}v|   8 r 7%7%炷    & 0 # %   |S@sSZx"&)p  z&z.S@2Df4QDf8:$".qD`J~U/KLS@RX;dv^b~U/KdS@hylQ Npwq^  &:$"x|N kQ Nr8Xx|NW SӳzwSӳDM/K@w@^@ @@we@z@M@ye^@:$"@""@9w[@zW@wQ@Nq@ #g'@C @@vr@@x@,z@w N@8X@  @`X}@""(@z[M@Df@@ vw0v hvhh0Zg 0Tv@hwy:hhdfhuL`;h@= hNX:;dB  vw4 &,@@8K@BaTq rtvY Zg |  BН7 t7 7  Sb D   UD |X:;d X:;d X:;dBw [M$X:;d *X:;d4X:;d8wQzO W Sӳzw0SӳD#@3@`@:@@@Myxx@# z@"&\}@©Bx@ɪR@S|@z~@\gM@,@[Z@@)W@)p@,~@,0!@&@?hBx@vL@""@jG@[W@zsS|DvLH\gEL&R"&\}V)pZ)W dHqf5 ʝ   %7 7e 5 ~Myxxϫ}"&\} )W[Z ,~,~$`("&\},`4s# zDyJyTMyxxVϫ}\"&\}b:Lw   ,&}vL\gMvLhW SӳzwU:SӳDw@w@S@@z@;T@:U<@vOq@""@t!g'@ w@N`r@[M@:|S@ Zg 0wh4wU:hԀ|  Zg   ,˵ ˵@KQ˵ JыE ˵ 7˵@1Q#ыʋ *ы   eDvOq w Ԁ|t!g'2w:vOq>w BԀ| PԀ| ^wd| f& $77 7 m  ыJ ԋ  ՀH;T wN`r$z(z.S@2:U<:[MJ|SZ""Ԁ| W SӳzwUSӳD;dv@""@z@:$"@""@;T@W@@vOq@@w N@`X}@2Df@ Zg 0wQhh6 Zg  RR "  r,UR w&&7  #-%! e`vOq Wz;dv*"",""48:$"&JwP[MV""(X""W Sӳzz`SӳDzO @@z@Df@""@vOq@zt!@""(@ Zg 0wWhhzT2hZ3h~2hV3%h.qhH.qhN vhTh@,vhTvhDZhwzh,h,&hwhzw&h,zh^,zhf  hd,Wh~hr<Th~hHq`hc|@yHTyH0H jxH%H*}H!HxKH@xdHdHZHX:vL h Dfh#g'h Zg b f e0R& @    &   `@ rp r<r<ZV Zg Z Zg VZg ^p^f0f ! ! V!@  D@ lP 4@ ` (W  pDfzO z "Hq (Hq 0Hq 8Hq @HqP HHqTz ZHq`Dfbzt!lzHq !"#$%&'  |@ @%+2@8>DK@QW]d@jpv}@@@@΀@(Px@h0X0t Hp8`(Px Zg & e @  C0     & N`U  U` ew" Hq"vOq*Df,zO ~F    U @  5 U- F> ,U  7 E ~""("" $Hq*X:vL6X:vL<""(>""BDfDX:vL PHqZ""(\""fX:vLjX:vLnDfpX:vLzzO |DfZ  @ ŋ   $  FDf HqDf "Hq0Df6Df <HqNDfPzO Hq   @@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@ @@@@@@W Sӳz8"SӳD#@#@Cs:@e;@VN@?T@©Bx@W@@ձ@@#h@z{@#@3eHCQ@©2@@ Zg 0tGGhj/dh(hGh/dhGheGhzjSh/dh*dh<N`rhMh*hh6khR/dh h"h ^h A-hA-hz#whhRhjDh$xh-h^hjGh(jjHh,MshQ?hcMH?hkH?hu~H?h2H2?hT[H?hBxH?hyHHqjTGh Zg f  eE  w  &e w FE  A B` 7pA \N©2#Ԃ{?T0W4R R$DRJRN dRx rt7   & &&DRR*:NRZRfRR#Zg  p4e6( xH * ( Hp4e6( J R 0R6ձ@R*FR(L ^R vR|e;v^2 䇷 . ,7 w e)w 7   w f T" |RR.R,"R(002$3$ zR,L `   ©2 R0022>>RRVNHq0  R0W Sӳz*PSӳDS@@@ye^@ N@#p@@wU:@  @ Zg 04|@h Zg 8   ` 7 7 @  #pwU:ye^" N (S@,0wU:4ye^W Sӳz}SӳD:2@"&\}@)p@vOq@\}@[q@ @aV@\}@ Zg 0Lje;hkSh0R Zg P  p ww )ZvOq \}\}"&\})p")p& .aV2[q6R :R >RR  :2jW Sӳ:.YSӳD Zg 0Fh Zg (b Sz< zSD3@<BxH@ުs@S|@a@@w2@ Ԁ|Hq&r<,:Au~h<u~hZg 08q!h,0!hwu~hz Ԁ|Weekday dd-mmm-yy hh:mmVnn.nna MondayTuesdayWednesdayThursdayFridaySaturdaySundayJanFebMarAprMayJunJulAugSepOctNovD|ecUnknown Hq*JS!(0:C:Yw/MB Ԁ|J Ԁ|S Ԁ|! Ԁ|( Ԁ|0 Ԁ|: Ԁ|Cr< Wednesday dd-mmm-yy hh:m19m Zg  ~wffff ZMm e< e< eA ҕ:A ҕ:A ҕ.A 5(r< Ԁ|~S| r< (r<|@f=@&HD E& c `5%E m A ҕ    ҕ  4ҕR r< r< HHq THqXS| `r<falr< vr<D: * 5  W ҕ0wD r< Ԁ|"S|&ުs *Ԁ|.S|2w2B3ffff ZMm e< e< eA ҕ:A ҕ:A ҕ.A 5(r< Ԁ|~S| r< (r<|@f=@&HD E& c `5%E m A ҕ    ҕ <0b ).xbK0a &H,0a, z40aF 0a:W 0aX 0a"FY 0a/l 0a<k z[0a50a6$]QJtPQPp:BJ0aEJ0aN\$^Q,PRQD0aS0aJ40aU@Gg~""?Tg""0ay'0a{a'0aZ'p,Z-L0.p.Y.xxDE`LLyVN0aZxQuLQfQ{Q,`Q0aF[R SZSPdNE`0a:d0azf0abp0a>Iq0a*Lq0aYq,Ds0as0alw0aRy0a.ry0a:y0a1y0az0aLz0a z0a^jz0aLz0a1zr;}0a4Pu~0a9{~`"G:dHFjIB003$I$vATADATADATA b 倻z0a倻D@D@<+@$9s;@s@@@sh<}@$CT@s<}@@ f@zk0z@D@Dx@2@y@`q@˪Q@,.@9@g@p@@ga@.q@˪p@zܟ@3@S@~w@ݪ@s@s(@̪Pd@~@@ت# @xx@nH@\f@$9@zyy@i8^@Df@'xx@Z@ͪdr@'`J@u@w@T Iq@@T[xx@쩗x@ͪ^s@_M@b*L @$9:@t:@@ Nwhn9XXhHꨘ^h2EhdX hdwhV ~W f| $9:$9s;$9  PMDFUBARTERM22@ S* /7 **f7 7 @ ȥ GХ/ w: e@ ̪Pd̪Pd",̪Pd0*8̪Pd<*D̪PdH*nͪ^sxܟыɋ<V\N%  ¥=4  ¥=  )5&w Bͪ^s$CT$CT&˪QLP_M\ͪ^sb9dlͪ^sxت# *  w5  %kcw 7,UwhAAq w w 5 V쩗x"ͪ^s(˪Q0ͪ^s@uJͪ^sTuZ^dݪrDxts(|ت# w-ww-w5+w 5w ww-TwwT-T- w ~nHت# nHت# ݪ"\f$,ͪ^s6̪Pd@nHB̪PdFnHH̪PdL̪PdT̪PddhnHnnHvͪ^sd"535E   U5 UE55@~ݪ\f`q s$T Iq(yy0,.48<+:'`J>.q@s<}Fs<}L<+N'`JR.qTs<}Xi8^\t:~5<w<  w,5 w7d5 5@5~ͪ^sw sͪ^s&s<}.ͪ^s6D8s(@ͪ^sHP*L R'xxXT Iq\yyb fh`qjsvzݪp5 W-| +] 5A 5,)@AeE5|\f Z Dfs(nH(ͪ^s.2s<}>xxBDsTs<}X~\k0zdi8^jpngag hfe 5 56Jw  1  W  wW,׭Elsh<}s<}S.qs<},62~w:̪Pd>˪pBsN`bͪ^sfh$9s;n̪Pdxͪ^s~̪Pd\w @J%rE555 + Uc|ͪdrJ˪Qys<}"DD $s(*3 ,s2ݪ6\f8>s<}Fͪ^sLyNs<}RpVT[xx<ͪ^s2D b ҀzҀD"@ 3r@l6p@p@:2@`@H/@e@'ą@2@:p@# z@z#""@:^@z}@<&%t@;F4 @C @4@Z@h&@w*@z@f@H@sh@:@zrh !@\f@4@Hw@>M@u@@d&@k@k@y@CT@shU<@2X@ 8z9; vhAXMh2xxhSp!h 쩷2hvPhhXvh/h~hv gh'xxh ghDhh y ( ")T;F4 :^ >M H/HHweC CT24z}fn nX}v v~  ~ 'ą 003$$ &B      xBI7 `nZoj5AA *.shU<F4 :UD&?"A1|v.& & ?wnw7 ć 46b z&Dz fH< Ha Hd _MH,<\XH@p@ Hl 4HP 8H><H%@ PHz XHR 4 Ht<{H<rH <H<fH qH` qHb, |NH 8Hj KHz<gH<gH ^Hn hLH4z YH :HmVNH H@ |NHN fHL p!H ԑHS sHKH Hf<wH<4xH%r!@<xHz gHT #Hp H.< H%#@ H\ <H& YH H8<#H H2 \zH zV}hz}hy ""$$` `>>%r!%%# ``l q[0,0]RSX11.SYS  lqb z,0aDX@ʪ0@ g'@ @rmp@˪Q@ @j@}@uX@9x@nH@z˪p@ܟ@Ԫn@ݪ@ fa@, @ ""@ت# @\f@i@*@sK@'I@ W@'xx@rͪdr@F @[M@k@ @ͪ^s@_M@u@u@@d&T@ Khz z zUASN DDNN:=LOGICAL NAME/TERM=DDNN: MCR -- Now allocatedTERMTYPEdd zz5>^@ 7r " 5  >= /.8Ce )ld&T'xx ""&.k4 W8k> WB g'FݪH faLk^, ` g'j Wn_Mz "")%u =7 臗/:   ww5 CD < 5| "" k F " g'&k8kDkL ""R[MV ""Xͪ^s^ͪdrb, d g'j nDr}v<zj~*rE@D7 m7d 5CC Е=N ¥/:-ԕ/Xr'I  nHu"u&i*uX2d6rmp g'DH L}Zknݪp fazX=C ԕ 7ePeF 0 ww ыɋ¥/OX  {jH fa}"sK&*ʪ06ʪ0>˪QJԪnN˪pTܟnX~jjn71<85+.  )#7Q\u003$I$vATADATADATA71N7QH5  u uhn "" ""$ݪ(\f*2 ""8ت# <_MH ""R fah l9xp x9x|     g'b tz, ztD@Td@(@ g'H@ H @f@2@9@TJg@ HznM@w*@ت.@@nH@T^@ݪ@ faH, H ""H TS@@ly@\f@l8Y@z WH F H@S@H;@@\_M@ Hu@u@Q@555 5 T ' 7 5n$TJg&496<ly>DKqFLw*NTQb pSrxTSzt9 5B 5 5 : AABlB, ,G Au| H;` 9$\_M&42@HLuPVl8Y\nH^nHlupT^Td r~2Z5"DA5DCe S  K G 8DnMBت.J2Hb z40aDDs@sh<}@gD)@تS@k@y@9@6w@wh@Z@9x@mh@@zga@˪p@m@ݪ@2@w@ت# @$9pw@ͪdr@T[xx@쩗x@ͪ^s@_M@@ Z}h$ $>U)&PRIRPRITERM=p$ @7 ¥ w % % U  M /7  v  h ^ԇ l8ݪت# ت# *ت# 29x<9xZ hr = w ¥/ * 8¥ w -  w 5m7,i 5b _@Zت# *Bت# Jت# Pت# T쩗xZت# hت# D5w,p  p 1r@&5 e  N20ت# 6ت# <2fgD)ga hsh<}nmhrwhvm|k@y wzwvr h-w ww&B )hwhT[xx ت# &4s6$9pw<˪p@ͪ^sDͪ^sHͪ^sLͪ^sPͪ^sTͪ^sX\ͪ^s`ͪdrxت# T   5 w%V     wN_M9ت# ت# (V0w6ت# @تSHتSL6wR˪p`b  @,:z@uX@z@nH@˪p@/@ݪ@nOH@-Z@̪Pd@uOX@g`@4L,@S@@Eg'@:@g'@zت# @\f@i@g'@sK@Q@_M2@lO8Y@ͪdr@<@L@@ͪ^s@tOŞ@u@zu@4L,@:_@@@ XhF `x̫e W yh d F (0hb6   F (F ` `""  d   AS1STz ̫e ̫e F^=2 dj=a lja xj {F F ` F (^2 F (dj "F ((F *F ` ,F (l.j 4F (:F F (x@j0Bj  !: ! : / 003$$5wB\~ݪ\f 4L}<F `"F ` *698B4L,D<NEg'R4L_MT<^Eg'bEg'l Ng'nF `x\\@) p-ppp-  p ^f1  R  L G 5P_M2 lO8YnOH uOX(tOŞ.tOŞ6uO@aOwJlO8YLlO8YPlO.T|ݪ;D%VT1  @D 04pppp0 pn\fnH,_M22lO8Y8tOŞ@_M2FlO.J/VlO8YXlO8Y\lO8YbnOHhuOXntOŞraOwvuOnT Aw Aww0  w|uOͪ^sͪ^s"ͪ^s&ͪ^s*ͪ^s.ͪ^s2ͪ^s6ͪ^s:ͪ^s>""P}Bͪ^sFͪdrJݪNRX b̪Pdf:t jVN   87  @ ( jЕ bЕ Е( ,Е,Е @Е) 7h> ت# ʪ0a] b6"ͪ^s&2ͪ^s8-Z>ʪ0XS@^g`t:2v̪Pdz̪Pd ~̪Pdt:   ww T F :AI q a] -Z:̪Pda]ͪ^s"ͪdr&˪p0 Ng'2F `<g'>F `Hg'JF `PRF `h,:lzjF `r,:z 7   &@ 7 /  t- 7 0 7lF ` F `F ` "F `,-Z0_M2JuOPnOHTnOHXuOX^aOw`htOŞng`vl^|lb&   lEДД Е:B ^uO-ZlO8Y $nH(nH,0u4u8i  t F (4L,< bGBL ̫e vvb>  t F (4L,< b SYSTEM ̫e b>  t F (4L,< b LOGIN ̫e b>  t F (4L_M< bGRP ̫e >  t F (4L.<  FINAL ̫e b>  t F (4L< b TERM ̫e a F  t F (4L}<  F ($$ ̫e P=a 4b = 4bba T 8 t! | F (4X " F (b F (4"b(Q*s ,F (.b 4F (T :F (8 @F (tF H, JF (H(h!` t! h!` t! h!` F (h F ` F ( F (t ^ F ( "F (h(y *F ( 0F (t6 8^ :F ( @F (hFyl F ( dp ̫e pF (@B   ff2&u5 5w5wb5wRfت# ݪ"ݪ$*Eg'2ʪ0:sK BF `2 H̫e T# ^,:z`g'j,:lzlg'v,:.xg'|5wFwf5wF5 5 w(  T 55 8 f 7% %v,:}g' Ng'g'$4L&<,g' .g':,(D^Pg' Rg'\,(`, nF `vF `%d Lw& & &&f& Ε& Ε w%*-VTwx& Ε& ΕT,^, ͪdr0, 4F ` ^D^ X,b^fyn,Lr4L}t<z 3r|2xx|Ce :  ww5w5sww5 5U 5| ""*9,6\_M8@ͪ^sDͪdrHL)8"R4L,T<Z)8`Eg'd4L_Mf<l)^ty[xEg'Ph 5U55w@ wJ5 5|4L.< )sEg'4L< y[$4L}4L,4L_M4L.4L &<,ݪ0\f24L}@<F~JuLF `PRu\ 3r\p5 5%%%%w|2xx 4L.<F `c6T2$4L}&<,~0F `2u:$9n;X!P"T쨰"X_Mj"5 6 5  AI q 5W-7  t Ng'g'4L< g'"g'(4L*<:g'.Z >F `BAXMHF `N9; v hF ` rF `)v4L,x9; vBDhFF ` b tXzY 0atXD&@ԪQ:@l^@ʪ0@9; v@a]@""P}@:2@ @l@)8@VN@zgs@:t @> @*}K@uX@@nH@˪p@?T@Bx@@.y@ݪ@-Z@̪Pd@)8"@zg`@y@y[@:@s@Tq8^@ت# @)^@i@@ͪdr@,L@<@d}r@x:@Z@ͪ^s@u@u@4L,@)s@@ hb6 jAww0  w 7 7   |ͪ^sͪ^s""P}ͪ^sͪdr"ݪ&*0 :s@sDFsJ̪PdN:t RVNV> Zت# `ʪ0f47  5  Z!- F : .  "  ww7 xa] b6ͪ^s4L,<&)8".)^:)8"F)^R)s^)8h:j̪Pdna]rͪ^svͪdrz˪p~-ZEFA  C  @ $eW >  b `&f?wF b6 ԪQ:F .y$9; v2d}r:9; vB9; vRd9; vx9; v~^W-OJB ?fEEee E @+f&& e ?*)^*s,8\ͪ^s|9; ve C   &f&f 5  ɥ* ы D$"ɥ*ɥ69; v9; vTq8^*x:6-ZN,LTyX,LbvV% CaDSыɥ%SѤ   (ѥ*~ wZVReL-FF g`gs ll^ Y,%N(System Logical Table)%N%N(Group %O Logical Table)%N%N(Session Login Logical Table for %2A%O:)%N%N(Session Local Lo Y,lgical Table for %2A%O:)%N%5S"%VA"%N%VS=%3S"%VA"%SFinalType=%O R&f  O~6 Hb6L-Zd:2f̪Pdja]vʪ0z*}K~y[ҝ003%I$vATADATADATAh w ҝ w`Е[  w`n Bx@Bx@"?T&̪Pd*:Bx@BLBx@V?TZ̪Pdhy[pt?Tx̪Pd~*}Kd%Е,B w` %Е]`7   &  &D *}K*}K"*}K(,0?T4̪PdH̪PdR-Z Zb6  B~  &f- lE@& `@8>)sFsJPTnHZ^ubufijuX(\  w . ʪ0?T̪Pd:2̪Pd a]b z[0aDs@@$CT@uX@*S@nH@˪p@~@T; z@X@@'I@ͪdr@Bu@ͪ^s@u@u@@ t"Eh xW,TT+ Dr C`5 -O f- wPwr~ unHu$u*uX0X@6*S8'I@$CTLsNT; zVͪ^s\f`l˪prͪ^svͪdrb 0z0a0DԪQ:@ @ʪ0@9; v@ch, @sh<}@:2@ @s<}@#g`@:t @2@zp&@9x@˪p@sh@ݪ@2@̪Pd@nhH@:@ت# @nH@rhQ@ @t@ͪdr@R[(}@ah @ͪ^s@ d@k@:_@ :hnb6 qnTASALLStatus: OUTCKPCKR-CHKFXDCAFLIONSFCOMLFRPERNWBDELCHEPICRONDRVLDD\ nnn7 @ -  %  U M/ N <¥/  ^@  &k "9x,9x< Nvͪ^sw:Jw    އ A A Е Е nͪ^sͪ^sͪ^s&ݪ* 2̪Pd6̪PdBت# Hʪ0R:t T̪PdX̪Pd`ت# fb6jʪ0p[(}v[(}fA Е AЕ  Е  (A A  ;V6R3M (C7>Е A A AЕ ( :_:_",hʪ0r[(}x[(}Е Е( Е)     z   ww c ` w-Pw-J:_B:D̪PdH̪PdNͪ^sTͪdrX˪p \b6b2tnhH|nhH^LSSSBSS <7 A = pBBAS# :?pnhH nhHrhQsh<}sh,ah < @nHDnHH dN Z^9; vb#g`ftjtl9; v~9; vA   E  @@E&E% ff?  L2 tts<}$ch, >p&\9; v`nHdnHh9; vr9; v|ԪQ:~V &  Е    7ɋP&B 2<̪Pd @̪PdD:2F̪PdJ̪PdRت# Zͪ^sb XzF 0aXD&4L}Hs@e@4LHX@ Ng'H*_M@˪Q@HVNH4L[MH4L_MHz,:lzH> H,:zH4LH@̪Pd@4L,H$9΅@,:}Hg'Hت# @,:.Hg'H'J@תR@4L.Hzͪdr@ͪ^s@4L,H @ F `l^h h""P}hlhX!h4"h)8h(gsh)yh.zg'h^h*}Kh&,hZBx@h"th-Zh)8"h,yh2y[h$g`hEg'hsh)^h0h j,Lh2[(}:_D̪Pd H̪PdL:2N̪PdR̪Pdfت# nͪ^s^ z  57   "h  A6 &*' 5  !$z: >b6hP2h#g`< &    DN &D 5"   56ԪQ: b6[ "ݩ[} ,b68ت.L2xݪV5 < B E SSSw50SSB&A SS S ԪQ:lAm(SSS SSS0E 2U S AS A5SSS5@.5*B n9; vz9; vNV& SSSSSSSSSBm    &B k  & b6V c6@yg6 .9; vF[ tk>o z 5 w )&(oz_M90ͪ^s8ͪ^sb zp:Dת@ʪ0@̃@Uqb@s<}@*W@~@~@8@Q g@z}@@D@Dx@z1R@-b@[ @9x@@nH@y}@m@/@ݪ@s(@ g@~@s@DUq@bت# @ܪ"@'xx@}S@3b<}@ͪ^s@DQ@@kw@ j@h 7 & &   % ,| s  -,5(- Qnت# }Sݪ nH&9x,ت# 6ت# Jy}Rs<}XQ g^D`s(hQ gnت# vͪ^s~ͪ^sh|w  A E& 003$%I$vATADATADATA5?  5ͪ^s~@~/"1R&ت# *ت# 0z}@4Dx6s(<ݪ@תF*WH'xxN3b<}P gT3b<}Z3b<}`*Wb'xxt`   wX&7`m m -7 U-|̃  g8s&Uqb,ͪ^s8ت# <~@תF[ JmP[ TkwXQ g^ʪ0`-bfתnDUqps(P׭UQ g ܪ"DQs(pb tjQtDʪ0@@تBy@ݪ@ܪ"@sK@3@ ~Jh eNWt7 & 7@% <2 2 2 eUҔB~ҕ RsKʪ0ʪ0& 3&ʪ00ʪ06تBy<<FݪLsKZܪ"hsKz|b 0z0a0D.e@ʪ0@9; v@:2@Ԫu:@~@~@AXM@GP}@D@2xx@Sp!@:t @zy@yr@#pl@9x@U[}@C" R"X$V&(*7 7 5B@ @¥/=7 7  @%0%- 7 w w |w7Zͪ^s'Ik(,ت# 0ت# HkT9xXت# ^9xbت# ltͪ^sz˪p~fRwf5  @ ~ͪ^sͪdrݪͪ^s"ͪ^s&ͪ^s*ͪ^s.ͪ^s2ͪ^s6ͪ^s:ͪ^s>ͪ^sB@Fͪ^sJͪ^sNͪ^sRͪ^sVͪ^sZͪ^s^ͪ^sbͪ^sy B& ~ >ҕҕ ҕ p˥/ ˥  fփҔ^ҕ> -¥/6  %2fkr6<x\p %<`\X%    ~w8w  B"*@Jت# NV'hL\T`YOrzت# ~yr  | ~/}&5  U5o5%|] ^Ý|`` X& &Bت# yr"Q g6Ԫu::~@~>ݩ[}HDJs(ZnHp/fzНTН.H5P) ;&f54 0&,ت#  ت# *D3dت# jت#   " wtw|w|wwlwt %   *^X ȥ A A0U[}jG:h@.ePXvت# ~zD ͇w< 1& ,-& 5 Ç&f7  0 f  ww~w( 'hL"(Q g<3\U[}djGS & Dm 5 &f~Dm5 2 J0  6YOت# &T`63DT`nU[}tjPZzت# r  56 5EUww ¥: ¥" Х   "  &Q g#pl ~@~Bݩ[}JnHNnHTs<}pʪ0v[(}|[(} A A Е C   Ջ C5 5 5 7 b wR D [(}[(}$:,<JX`ʪ0d̪Pdr:t̪PdN && B ɋ % ыɋ%¥= ¥/¥  w0 0 p  VԪu:ZQ g`ݪ  w w !¥< ȥ ̥  ¥>%̥ S   w9x9xPGP}F > 56 @E5  @m  & c e )% F   -VT 5 j  m  E,bd&T'xxkت# _M(.26uX:uX@uDnHLfN`ufl8Yl2VT5  *w )8>A7w w, 7 550 05+1 5rnH f˪p>ͪ^sBͪdrHJݪPZݪ^\f`flSntTSv|ZBf@ lE7f  569H*'I uui uX.nH4:rmpBTJgD$b z0aD9; v@G@:p@U#@,d։@uX@@Q@Gd@ت.@2@˪p@zX@z:@ت# @{lQ@T; z@hh@*@<@d@y@l8Y@AXq@" L@'I@[(}@ͪdr@'xx@zͪ^s@_M@u@{_`@{``@$@ݩ[}@y@@3I@d&T@$@:4F@y@g@ 3r@z{K@{T`@}@G^@y@*S@ʪ0@:@ݪ@̪Pd@'J@2xx@d&@k@2@zga@nH@s<}@:t @5Ir@|T`@x @GP}@?T@sh<}@:_@:2@̃@l@2@zp@sP@nH@s@*W@p@t@ @T;w@"^@G]f@rh !@a@ԪQ:@u@*w6 X@ $eXhxQ   MountedMarked for dismountURMCPACPBCPCCPDUBEUBFUBHUBJUBKUBLUBMUBNUBPUBRUBSUBTURM_Offline- PrivatePublic- Logged in AXq|ForeignLoadedUnloaded Shadow_set=(SpooledNowriteLabel= Type=unknown Cached Overlapped_Seeks Seek_Optimization=C-ScanNearestElevatorOddEven Free_blocks=. Trans_count= Errors=.(soft)/.(hard) File: %18<%X,%17>_ID: %15<%Q,%Qjt%14>: Marked for delete, Task: %2R Device: %2A%Q:%N FCBs: %M. (pool), %M. (ACP), %M. (directory)Z3ZLOGMASS_STORAGEMSDERRORSFULLMOUNTEDFILESH$Z^kv{o"Z^ kv{od p& & & *.&&:4F,&>:pD&JV\*.. Not logged in CLI = MCR BUF = HFILL = SPEED=( LINES = OWNER = none TERM = Loaded Unloaded CHAR_LENGTH = PARITY = NOPARITYPRIVCRTFDXHOLDSLAVEVFILLRPAREMOTEEBCHHTLOWERESCECHOTYPEAHEADCTRLCAVOANSIDECINSERT&LINE_EDITREGISSOFTBLKMODSERIALHSYNCFORMWRAPBROABAUDPASTHRUTTSYNCPRINTER_PORTunknownASR33KSR33ASR35LA30SLA30PLA36VT05BVT50VT52VT55VT61LA180SVT100LA120scriptLA12LA100LA34LA38VT101VT102VT105VT125VT131VT132LA50PCz3xxVT2xxLN03DTC01LA210LQP03LQP02LQP01LA75LA2xx E?"~<>@BDFHJLNPRTVXZ\^`bdfhjl nprEt?vx"(-39KPgfA )$( ! ' 457 XSRTUVY" ZB?dnmrcB O TZ(-3 9 KP\r^c`BdfhjlnpOrvxz|~T +06; IY]k& 05075110134.515020030060012001800F +06;I Y"]$k&&(3200024003600480072009600EXTAEXTB19200h`behlrvz~0  ww  )7 x`be h lrvz~ "$&(*.ݪJ̪PdN:t Zت# `ʪ0j̪Pd87 @ P/ J/ȋ7Х:  /).w  0:%TI V Dت#  kت# ,ت# :>_MLͪ^sV,d։hت# nݪv,d։wP  /  w V@  )w& w003<%$ͪ^sBت# Nͪ^sT,d։hupuXtuX0 r -lw 5w  55 w55@5@5 w  Еʪ0p|} 5%HTe. % ДB~ Е 5b5w5D5 @Е 7Е[ , 3r 2xxnH(uX@}L~ت# ( !  Е,  Е]e Е  Е[7| Е, Е]& p w wi"zXzXDzXRzXbp|i   Е _Е 55.)mA#VL<A&m&N #5e \}_.*S0'IDx LG^Gd P3IV5IrXy^5Irjyr#v{K{lQ  V!!!3W0mA55VL<5<5@  Е pVW x (G^Gd *3I0*S2'I8G^Gd <3IB5IrDyL*SN'IT5IrVylx  >5  Е 5 T5P@  Е } A@=5 63, ,d& 'xxd@yp,ݪT} , )Е  Д  .55@eЕ  v Д  5@ 5Е  J Lx  w 5@5 w2    Е, Е)  - v) vD̪Pd (ʪ00ʪ0:FU#JU#N}X}` nت.zت. 6 6 @Е  Km50mɵ*-Е  ~m5 jЕ:E Е. m>,y0{T`8y@<|T`Bʪ0LVyZ{```t: 5m5 5 -Е    5|  m f 5`EW @Ty{_`x "G$3I*G]f,3I2ʪ0<D̪Pd ^̪Pd fʪ0 5JtW `2p@52h( $!U 0.62> ( n Е.  :^<d(p:|    v v)CP'7 Е f7 Е*  @ VЕ* I U4ت.ت.,ʪ087V:Z@n:rIz̪Pd  5L$E_W @`  BA5 &f U  @  n whwDmw00s<}>pBgag Dsh<}NxQ|u| ) w7) wPɋf A *wS\ : ̪Pd̪Pd"ͪ^s(˪p,̪Pd0:22̪Pd8̪Pd<̪PdTͪ^s^ͪ^sbͪdrp^ /  B&& B %   E( B-5B0 ت# LP2V,d։Zت# ^ԪQ:d2tnHt5 A5@ 55 S EE 5@)   v v6 6 4nHd@yu8l8Y>2PXfت.rت.    5)lmA [] %   ~ѕ ~vN[(}[(}(*W*'J0l6̃<9; vD$L$R$\$l5`mn N>  ! m Е, ^ Е]eЕ  2v-r(n#6* 'I &*ݩ[}:ت# FzXTzXjfN Е  Е Е Е  Е НЕ.Е *P~ 5L5 8Е 7Е[  6Na@Q4:H*Z}^d&T`'xx|ت# d!  Е,  Е]Ze Е  Е[7B Е, Е] . Е W >( zXzXBzXPzXX,d։b.vW= 7 >7 <    G   K   Е.U (=(4[(}>[(}DGdKt:|U\~ ݵe0P&5 .5@ *:  } X 003D%I$vATADATADATAq J_ $ Е:A Е) HZ_bn:6 dh   Е.  %  AV 5r |  4h,:4J:_RVZd&T\'xxbrp|z}T f  f  \ j|(  .a   W-  *2<Xn:z J w4 jЕ W ЕNЕOA  w` 7w)w~6 "8T̪Pd Z̪Pd^:2`̪Pdd̪PdL7 \R\NX- ><6e%RT &  & & +(ʪ0 s"T; z.6,d։:nH`-׭B  8 !(&  w8sT;w T; z68JN}RVGP}xQ 7 7 7 & 5NNldeB ,5@ X  9; v2t06l8sP>rh !Dw6 XH " L"^ NhhRrh !n*UU  &d 5 @ UU U      B" FLʪ0 RQV\?Tp?Tz̪Pd 2   e  xb :@GD ˪`Eh˪Eh _a#b  گxs>گxs>>VNm}%w@ گsllJ  گxsJگxsJJfRKq}_sp گspp^  گxs^گxs^^{Lv~+"Y>@ گsttr گxsrگxsrr:) ?#` گsxx| گxs|گxs||_A! گs003L%$@ گs   گxsگxs 8ez گs$$  گxsگxs8^i'HX`f] o8Yk~ گs((  گxs گxs  %S? }WLH! گs,,  گxsگxs;}D8 YIqyY-Z گs00.  گxs.گxs..Ey. 9=^yp`p:z} گs44D  گxsDگxsDDTx~rK"w:?}Ѕ` گs88X  گxsXگxsXX,:Y Ky&XSd99: گs<<l گxslگxsl"l;}DH`YYeT]y&X@ گs@@ گxsگxs}R Y(&$y@ گsDD گxsگxs84[Me  گsHH  گxsگxsOq:jWSWM̖ گsLL  گxsگxsOq:jWSW`' گsPP گxsگxsxo@ گsTT  گxsگxs;}D`;f&"q:K گsXX گxsگxs"w_`Usw~W~`H S99 گs\\ گxsگxs"SM!Zo}RA"}C vp_` گs``, گxs,گxs,,[qap:= گsdd6 گxs6گxs6 6vK گshh>  گxs>گxs>>w_) _,9^w~W گsllT گxsTگxsTT;}DpYU̖ گsppb  گxsbگxsbb,:Y Kw^[qaz} گsttv گxsvگxsvv4Iq #y گsxx  گxsگxsQEQp%{L4Iq003T%I$vATADATADATAfw} گs||  گxsگxsAvy)}%rWv گs گxsگxs;}D`ChL گs  گxsگxs8"Y+ }K"]v گs گxsگxs v[@ گs گxsگxs;}DpYU\C^ گs  گxsگxsYSE˖iH%S گs  گxsگxsm[q%rW/U, W گs گxsگxs{y8 گs  گxsگxsL:v8_y@Q گs8  گxs8گxs88%T8w~W˖iHYM گsL گxsLگxsL L%T8w~W˖iHYv_Ay گsh گxshگxshh%Sv[@ گsr  گxsrگxsrrYvmHqUq`%rW گs  گxsگxs:)_tv1 RKqjMe^ گs  گxsگxs };htE`p:%: گs گxsگxs Y[S`"k4}rST"q:K گs  گxsگxs,:Y Kw% Nf}w~We^ گs  گxsگxsYf}w~Wd99'6F9 گs گxsگxsE*_sp گs  گxsگxs.`}R ZZ r گs$ گxs$گxs$$}R Y, W گs4  گxs4گxs44:y@D `"`%: گsN  گxsNگxsNN(_Yq8"_M8KM fs گsh گxshگxsh$hVNv` !:eUw;}DoQIv%!} گs گxsگxs$qQWP$ i;_]v`|Q #yX_ گs گxsگxs$qQWP$ i;_Yt%)NXX, گs گxsگxs"QXE~pysw~W`,L;v گs  گxsگxsMy?} گs گxsگxs*%K/4[Me y&-ZQj]pw: گs& گxs&گxs& &Ya 2W!htp:qQWP$ i;_ گsB  گxsBگxsBB;}Dpa _p:fv%]w: گsZ  گxsZگxsZZ:C~`"u:%rW9d گst گxstگxstt:) ^1R گs  گxsگxs:);htEy.8w~W گs  گxsگxs:)%:1REy.8w~W گs  گxsگxs:)%:9dEy.8w~W گs    گxsگxs:)%:us_Ey.8w~W گs  گxsگxs:) ^1R!;K}X گs گxsگxs&Q|4Iq:4}Kw_gY4oM گs  گxs گxs  ;}D`p:R` گs$  گxs$ گxs$ $ Oq:? }WW!ht گs  2  گxs2 گxs2 2 :dy;r[sw~W" گs$$L  گxsL گxsL $L `;8;Y}8rt(":Ps;5 @b 0z""0a0DԪu:@:2@z}@˪`E@˪E@˪Q@nH@˪p@ݪ@̪Pd@[(}@:$@Jnr@ͪ^s@ͪ|@s@@:4F@ Xqhn n n4=4CLICPUDZ11GENIOLUNLUNSMCR...POOLSECTIUIC32KnnW,VT w7 p 7 Е ?[PW Q Е Е-Е-Е & `ݪ nHz} ͪ^s$ͪ^s.nr8sͪ^sFͪ^sT+sV'8Jbت# jت# xb~2,-vH5 wwwwww-'X5 %|%w@&55 އU˪Q>˪QtU U &@ w5@&55@&  E@w0w2w"www@&5*q55 155 w w,w,5 55 `-wn U:ݪd&T 'xx2"" gP*R'xx`YhLfT`p0z}l ,IC,IP,IS5~7vn6vE   TLb8 2:2@l6pP2V^̪Pdb:kYx̪Pd~b ,7l"rf@ f@N,F hC-  2E2&E  $pqJ2zd%5 0A&5&5  @,A1  @  ,4,e7-5,Be@~FPXv4g|*f~'xx E D56e 5 ,@  $@5& @W,VT  V:3TT,*df.'xx6mp>GFHmpqNG v\e%Wt 5'De@ ffB, E@@  5 @$ ?">d&e'xx(mp`qhGn+sp'8JzS X~̙Xa?"w"@f& 5w^@&Uf1 1 f&,A @  p ș-~@~pqtqT&@ ,p w5 d ",e  w6w>w6w:w5@w5&$h6(0ݪXvHG vLG vP;5UqRL6ŞVA6\Ah8bAh8fG vlK6U<r yvSp!~ͪ^s\0w Ew~˪p ͪ^sͪ^sͪ^sͪ^sͪ^s ͪ^s$ͪ^s(ͪ^s,ͪ^s0ͪ^s4ͪ^s8ͪ^s<ͪ^s@ͪ^sDͪ^sHͪ^sLͪ^sPͪ^sTͪ^sXw5w`  ?55@,bw   / -tͪ^s ͪ^sͪdr" (G v,G v0*2'xx:@YhLDT`L0z}Tͪ^sb#g`dG vjG vpG vtz|G vs 003d%I$vATADATADATAj?? , 5rEe?Wt @ePͪ^s~@~/ͪ^s G v$(G v.4#g`8G vHTG vn~@~z 0@e 0@e, 05@e@ 05@m 0E0Uv>,d&e.'xxBd&^D'xxL[ XG vh2n2xG v|2 -U'& ', $ EE@!@-  , R G v#g`G v G v&G v.G v:G vBG vF#g`HG vN&\|, ! - f %  B& 1&p(pp(e 5p8G v G v(G v2e@~6/>e@~x*Rz'xx 2"  7,7,@"A L&@ e e J  50N2ت# &ت# 4FTmZK gbmlJ pG vt#g`vG v~0P 7,""A 501,""1,$$U0 , "G v2LG vb tHza'0atHD$9;@@ԪQ:@ʪ0@s@:2@ @,%@GP}@c6@:t @$9f@z$9s@쩷2@˪p@̪Pd@ݪ@*,@$9΅@:@ت# @\f@'I@ͪdr@ͪ^s@k@:_@" Xhb6 CREELIMDEL 5G@ f W A7 w/: 7T v 7 57"p*,'I$k*GP}4̪Pd8̪PdHTLc6P쩷2\̪Pdb̪Pdhݪl\fnt̪Pd|̪Pd|w>׭׭׭ ׭>+X '&w7 z̪Pds$9ss$9΅ s"$9f(s*$9;4ͪ^s<ͪ^sDͪ^sLͪ^sTͪ^s\ͪ^sdͪ^slͪ^sr̪Pdvͪdrzͪ^s@ w   χ  A Е wA Е A b ͪ^sݪ "̪Pd&̪Pd2ت# 8ʪ0B:t D̪PdH̪PdPت# Vb6Zʪ0d:_t:_tЕ A Е  | 7w$  Bw  v:_:_ &̪Pd *̪Pd.:20̪Pd4̪Pd<ت# J:L̪PdP̪PdVͪ^s^̪Pdb˪p fb6l,%rԪQ:lSSSSS EɋP   &B 2̪Pd6@L̪Pdb tRk ztD@w@[M@ 6U[}hݩ[}h :   f & [Mw"[M6wb Xj'pXDuX@nH@i@u@u@:_@@ 4}h 8& lE Е:4 nHnHuui"uX0:_b XzXDuO@nr@aOw@}@GP}@-@@*_M@z}@uX@eĊ@nH@znOH@uOX@J@l8Y@lO8Y@u@@tOŞ@u@u@x@@ xhbhLh_Mh  4z1& D b5Υ: Υ ΥΥ/Υ  X ^  l  z$*_M&xPh|T5$   Q3+TA  톃<" 2-pTz} *_MxuJ$}@TDz}HuLJRnr\-bnOHjuOXptOŞvuxuO~lO8YBT"rr l v 3 W s:PaOw TeĊnH l8Y,uX2uX:uX>uFuXjGP}tb B,ZDGP}@ z}u u$u(i,uXX:_b z.xxDT#@ʫy@z}@9x@nH@ʫf@쩏S@u@@@ h쩗xh  A7 5   H D ;& # # @7  NFz}u:ʫyBʫfRZ^nHd쩏Srx|9xX| s | n  5  7 % %6,9xʫy$ʫy,ʫf:T#>T#Hb X2E`XD >ܟh B& ɋ=     pb rLyD&z}@,@p@~@뫽@@r@ jhLh: n -wwAUU h-7 AEE  d ~z}~뫽z}"~&p6@hDz}F~L~Pz}Tpd,jrb zVN0aDʪ0@ 3r@;5J@9; v@:2@A6@AXM@@2xx@Sp!@:t @:br@z}@9x@T2@ت.@˪p@Xv@ݪ@L6Ş@̪Pd@:@:@Tq8^@ت# @T; z@ y@Rͪdr@Dh@ͪ^s@Ah8@:hL@:_@K6<}@ XXh  @ #   S S w 570  0j w55 wx2ت# 9x"9x:ت# @^jbت.~ݪ wb       5!fU""NP .$F .8̪Pd:t $ʪ0.ت# 6:brB̪Pdl.xT2~. ! EU" U$ @F f)& D<Ce>C 5 P A Е:ت.ت.(ت.2T28̪PdJ:2L̪Pdhʪ0|:_x: ȕ   Е. 7 >  C! T C!ч J   ww ev Z }: ̪Pd $̪Pd4N:P̪PdXͪ^s^ͪdrb˪pfͪ^slͪ^stͪ^s|ͪ^s|w5w  ) ew %  U?|ͪ^sͪ^sͪdr 3r2xx$ت# (ت# <̪PdHت# Lت# T\`ت# f:hLA@ jAXMrXvx9; vl3e&@ S & & ?w% wz9; v ;5JL6ŞA6Ah8&Tq8^69; v<:hLB yFSp!J9; vN9; vVK6<}Xت# \9; v`DhfT; zhت# v̪Pd) wNb t02xQuLt0D &vhb trSPdtDB9Hv@vP@yB HhL.ePʪ0V[ dתhG vlG vtG v,7511ED`7 5@U5`dݪG vvP G v$v g*c60d64G v@T`Fت# RVʪ0\تBybrE~`4  5Ew w5 g5 ߥ ߥ UwJ5! ,0M y0M*ʪ08ت# Xܪ"nE?5@55w5 555E95f5j55bU r 5 EJݪhE|E,ww@E7  7 n   7   Ҕ~ UXԪu:ʪ0 sK$0M(ت# ,n80MQ gJET˪Q`EhE~E$%xc%w`d R $  7%5 /55 'R A R  5 2w(R $d8EBEJEP^z( F5@=^R > 6  7%U #<5 &5m^2xx^"&ت# 0'hL6ت# DELت# Rت# fG(pEvԪu:zت# ~˪QU wQ| K|5 5w w w55 55  @˪Q ERت# 0ELʪ0nEtJxʪ0~تByE5U@5  U5w-U-(  ZEE"ݪ*E0ت# 6ت# PQ g`dQ gj˪Qlت# pyr|yr @5& ?5/ W5'R5? %|?77\G vG v$G v,G vHG vLG vRت# Xت# \G v`ت# bت# fت# jyrzت# 7 ,5 5 5@E@U 5w  D w" \ت#  ت# @jPZت# $jG(G v,ʪ00G vTG v\Ehͪ^snͪ^s|ʪ0n m @m 7 5w jG ת~[ m [ $kw(ʪ0.ת4E@ͪ^sFͪ^sJͪ^sNͪ^sRͪ^sVͪ^sZͪ^s^ͪ^sbͪ^sfͪ^sjͪ^sv7U wDEm5@55o   5 5B5Zͪ^s ͪ^sEͪdrݪ&T`.2xxD̪PdH:2XԪu:bEpxݪ|j \e `e ~5 ӕӕ[e 2 )%& +5`7 ,@˪`ED̪PdLhv:4Fx̪Pd|̪Pdn) 7  ? m %      l̪Pd :2 ̪Pd̪Pd"˪E&̪Pd,0M04G v8Hm09qh2v gh'hLhLG vhZت# hxxhwPdhh6qh0ܪ"hHm09hze hr q ghKX h\yyhjPZhxsKh#Khmhk~Mh_M2hbGh4rr0MhhhDMh`4 ghXz'xxh'JhFT`h*ͪdrh_M ghd'8JhH'`JhJ~ ghwhyhDhh&ͪ^shT[xxhn̙Xah$hJͪ|h pqh 3h6-Kh4ghvjhzkwh~qh($  d 0먗 :^ w:DD8DrDyF~H/HHwH\} L"e$e &eM(ee*ew,e.eĊ.<irp r# s C xxxȩsKyJCT T";F4 $Oq&s(}*-,T..f˪sت4Mت  lh.L:dTTz}kBMkZkeq~ZzT zT"zT${ne&{f(}#*,S.nrQ2 4 B}""(ƫʫL ʫfʫyʫʫ׃ ̫pE"̫d$ &髲(Z*뫽,M"`FGz} l. of5 5sDz 3oM z}    $$ 7 RRRRv/.50,B%e   U%  : "0+s:t(FLw6 XX" Ljr<rr<x&vB  6w$ 7 7 we7DQ: Fwu*˪p.tr@XqTb <0zzr<0DKZ@gr@Hg@ϫf@w@O`K@nr@&@J@@M@zT@zT@H/@#@e@zT@Jz@xZ@rr@HCT@ew@}@u~@+{p@x@Dh!Hz-@2@ʫy@@@JG@kBM@H\}@KQ@S@@‹@ke@3{@@5s@z3{(@:^@z}@@O N@|p@^@o@@F@J:d@ǫX@Fs@@@zTT@lh.@;F4 @.@C @@4@̫pE@,@=@l.@@yf@.s@6s@zO_@f@B@J @LT@~@J@}@G@eĊ@J@w@Z(Hf@:D@zD8@@w6 X@f@@L:d@ @Dy@{xe@a@j@H@ʫf@DF@@zZ@~@D:@J@ѫ,x@ѫBx@ewM@뫽@˪s@ѫ@eM@@t@[M@u@zw@ѫx@ߩ0 @Hw@JwM@Aq@J@R9@q~Z@qZ@@Bx@L@u@+ @z@ϫxd@ϫp@Jw@s@JKw@Ky@R,:@r@x@x@x@x@L N@l@z*}@x@"N@Y@cHg@CT@@t!@@ .eh ThתhԪQ:hx NLh zʪ0h̃hUqbhVZxhh9; vhe@~hyhԪu:hVrhhf3hyphthAXMhz#g`h>'@yh 003%$2xxhSp!h1Rh6wh_MP}h4xZhphZ8hz`hhz8hbh heK8hyhr@Qh~{h2h#plh2hyrhnڪ,`hZ쩷2hRzMxxh[ hYhLh*v~;F4 lh.+{p3{3{( a"cHg$l.&o(o*rr,.f0^24u~6:^8w:w<:D.=D8D: DF DyH/HHCTHwH\}H\}J JJ J"J$JG&JwM(J:d*Jw,JKw.JzJL N L eewMeMeweĊlryfs.s 6s"Bx$C &x(x*x,x.x ߩ0  KyJCT+ *}*}}-. ~"˪s$#&Hg(*,t!..~Aq KQ KZL:dO NO_TTTkBMkeq~ZqZ u"zT$zT&{xe(|p*[M,S.Xnr24 ‹ B}&Y,ʫfʫy̫pE ϫp"ѫ,x$ѫBx&ѫBx(ѫBx*ѫx,. ff z} 뫽MFGxZxZfuLT gr"5s$x&@(*ϫxd,ϫf +~ee (e ejefezUd R6R9R,:Fs O`K ѫ&~(V?x6ZF@AHl0R7J77 xߥRVxZ*w6 X."N8RBJP T^ǫXjjlrZ|w& ?e 5JJ ?\ f?e5|v EDtvtv @  X  _B:2,o5AA o5  tt$tb 6Vz[R S6VDs@K8@<&Kq@:2@d6&@`@)@}s@Ѳ:@8@20Hn)Ty@zs@<&9@z}@:t @e"@,9H)p@ 2&@)P@)@h'@g'@ @ (@)W@zX@o@:@U@ 8r@'@=@)'@@=@)Ps@' q@#0Hju@$9!@,'H@b)p@:@ϫ*}@,tH ϪhϪhϪhϪh$ϪhhfN`hx w aj  rWB w^aw>  >!_ AdBbAepCnS (2o )Ty:)PD<&9F)RsV003%I$vATADATADATA:t \Ѳ:| @pnp  C  aD "ABuhfDa `WaWz ɥ;N:2 Ѳ:)p)p  &)Ps*<&9,)2:8Ѳ:J)pN)p0a+å>@j1a a @  ( a 0hfw& a z`V @ $9!.<&Kq0)>:VUtŀa jw jj lj w ɥ@aujkfuh &C0oToפ   6Ƈ @aw Vw L p  ȕ  :oPK8\=nϫ*}t@=l Dl lja Ce# # @   ww  :0)WN' qP)Th'`:f$9!h)Psvo|)PjDl@ Te e 5l@ eSY@  e1 eV 8r)W<`BK8RsV (\X`z}duh8j (n 2&rd6&|)Wd  @5wwAn5j)f  4  @     RՀa@>)'}s' q)h'e"g'$'(`@s^b \%/."',,ABCDEFHJKLMNPRST@5@TASKREGKNLDRVKNLIKNLDAFFCPUTASKDTASKIrr J0LMNS< @ 0 *, P)7 7 w . nw, *w$wbw wlw0¥/&*DH 7 7 a F] he k ޅwB օuO Ѕw@G ȅwS HX \aܟ]ܟ&e*ܟ2k6ܟBBFܟNORܟ^GbܟnSrܟxX|ܟ~K / ww5wwwCPנAנDA쁃 m >w 4w$K ܟ"ͪdr,'I`X@htJ@V7,wv5 w^/w wJw7  8 (5h  7"w5"ͪdr'I<ͪdr^bhfy}v07 &5p5\7&pp5b&6Х:` \ ,57 ( ;D0,'xxNR2ZnH`udffrp6 8= x:, ,3,75 5w4 L,2"Zͪ^s^ͪ^sbͪ^sfͪ^sjͪ^snͪ^srͪ^svͪ^szͪ^s~ͪ^sn ww.  jw5o55h 5a Е & XЕ/ Jͪ^sʪ0̪Pd"ت# (:t *̪Pd8F'xxT/bx~zXЕ  @$ I P 9 1`K7 7 >7 tew w@ +X ̪Pd ʪ0:2̪Pd&:s(̪Pd,ʪ0.̪Pd 4̪Pd>ت# Nت# Rʪ0f  w`7 @  q7w  |>h<~GP}(ͪ^s,ͪ^s0ͪ^s4ͪ^s8ͪ^s<ͪ^sDͪ^sHͪ^sLͪ^sPqTͪ^sXͪdrhjlnprt>vhxz|~<^Ew wew ) w  7 nV7  ew w` w ^.ʪ0^ ȥw E Е  ݎ Е w % ws¥ w W wwTPwȥ6&:_6:_BGP}ZGP}003%$'IL'xx:2   *wwl Bn $     e 2n69; vB9; vF  vwl , BU bZe B@9; v2 9; v4<@wp:L2Zj9; vx:z̪Pd   +-w Z07) % w4H̪Pd\:s^̪Pdd$9!fت# lT;;"nت# x9x> w  ̋ ¥ ¥ EvjE?   `\X 9x 6 7 ZХ[+ N ¥CХP! <.ɋB. B P¥,¥] ¥UХB] "!5 *.6.j]nܟx'IL6  6--  MN2sT; z$s&$9s;.ͪ^s6ͪ^s>ͪ^sFͪ^sb z:d0aDʪ0@ԪQ:@@:2@s<}@d&#@2@:t @ت.@*S@˪p@zX@zݪ@̪Pd@:@:d2@ت# @nH@#@'I@'xx@ͪdr@[(}@'`J@<+@ͪ^s@:_@2/@ 8AXqhPb(,d։h TASK DEVICEDRIVERRO COMRW COMMAIN CPU SEC POOLUB MEM URM=[CPx][]<>  0  V̪Pdbت# hʪ0rݪ|w w @ wLA A  A Е I1 I q  5 V ͪ^s:t ̪Pd,ͪ^s 0b(<ʪ0B[(}H[(}R:_Zت# vd&#x'xx~/ˀ Е I& 5Q  @ȕ0Ay0@pz Е A5LNДA A В;`zXd&#'xx:0<@>p@zBDFHJN\#bLhNp[(}v[(}~t 6 Е Е(PPЕ:Е)' Е fA A # pAЕ d * Z1 P74 *0B[(}H[(}P#f*p1xʪ0|̪Pd * w  w7 w)Е Pɋ6  w E- 5`:2̪Pd:̪Pdͪ^s$˪p*ͪ^s0ͪ^s4ͪdr8̪PdX6\:d2 bb(fԪQ:~d&#lW-  W- SS  SS SE- t55W- W-  Bw6w.5 H5@('xx@d&#B'xx^s<}bnHfnH 5 2+5@B @   nB5& S SZ5*\nH`ت.fnHjت.znH~nHdR!SSKBB55851  557:5 @$ ,n@qm *(*S*'IF<+H'`JZ:`*Sb'I\5W- W-  @E Ew0d&#'xxF2P2b tzjz0atDyp@:2@2xx@˪p@'I@ͪdr@@ͪ^s@:_@ ϫXqh   :2j?j&8J @ @.SETCLRDIS &8 J 1 0 @ 55  {j 7w} 7wX$rH003%I$vATADATADATA'I2xx0j8<ͪ^s@ͪdrLPyp\b:_fnx$~yp"% ԇ6P ˇH@ ‡0LFw  /  & 86yp"H&yp4ypNT˪pX\r~N     ɋ- Ar Frb zf0aDw@ؖ@R@9XX@˪Q@G(@9x@ꨘ^@E@X&@ت# @ͪdr@:X @ͪ^s@k@w@ Rh. /REG/RONUqv'[qkr@7  #  Vȥ/  S S C$ w|@^ꨘ^9XXؖ R wEX&wX 6ت# :ت# P9xZ9xnr˪Q|{ dwT @e 0 w /  ȥ xf  .ت# 6ت# >ت# BNت# RbkxG(| w&ɋ ͪ^s ͪdrb Yzp0aYDD@@:br@Z@9x@T2@nH@ت.@̪Pd@ت# @ͪdr@ͪ^s@"_M@ ^dh )A@ .w5   U M w w Uw w eC  ^Y,VT0ت# (9x29xRZp_M|nH|Ss O55 H5$ $ @F 7    5 !5@ ت# &@ت.JT2Pت# T̪PdX:brdت# rت# j"  ! M" uw ww   @ ت.$ت..2ͪ^s6ͪ^s:ͪ^s>ͪ^sBDͪ^sHͪdrb zIq0aDB;5O@ 3r@;5J@9; v@AXM@A6@Sp!@2xx@+@ت.@˪p@Xv@z̪Pd@L6Ş@sP@Tq8^@ت# @T; z@l@ y@ͪdr@'8J@Dh@ͪ^s@Ah8@:hL@:@*K6<}@ &je;hh   p!<H e>D5 ew  l55  z v5f̪Pd  ت# 0 3r22xx8̪Pd@̪PdD̪PdT+V'8J\ت# jsPnzrت.|sPv|  ww5 )  %z~l ت#  ت# ت# : ̪Pd$:&̪Pd.˪p4ͪ^s<ͪ^s@ͪdrD 3rF2xxL̪Pd`ت# nzx%Kfz  U?3e&@ S & & ̪Pd: ̪Pdz:hLA@  AXM(Xv.9; v29; v:;5J:hLA@ BAXMJXvP9; vT9; v\;5O^L6ŞbA6fAh8VS & & ?w %  wVTq8^9; v:hL y$Sp!(9; v,9; v4K6<}6ت# :9; v>DhDT; zFت# Jb zLq0aD 3r@ @f@2xx@nH@˪p@@TS@ت# @TLq@ͪdr@@ZS@H;@@ͪ^s@_M@`@@@ &h  *2A5 @   wt,VT`S =i  d_,VTMKJ  P8 3r2xx"ت# &_M2nHL_MXnHbTLqdt|%TI850@%TI.0 5 !5 A@  t|ت#  ت# nHH;` "(nH04:S<BTSDJ TfV`p>w 7wZ ˪pͪ^sͪ^s003%$ @$9f@#pl@@y}@/@~@$9΅@r<@> @$9:@"kw@ jh  ,|  e. 7 S PPД E  Vs./$9΅s(s8~D> N> bfjy}p$9:rsz#plZrAeb )'5> 7 52B$9΅sr< kw$s*> 4FsR$9fTs b ݪJd&TL'xxhnܟxʪ0:' Be C*me+ ѝe6w-w-wwZ' sKͪ^s$ʪ0,sK0+8ܪ"Bʪ0NsKT6\˪p`sb$9΅lsn$9~ 7 r5w h5  w @ 5A1&HmA& Br7J /6ݪ:*W<'JF8PHṼbt9; vx9; v|8~#2ć 7 E/T  w w0.9+ %$ >:020  9; v2R˪QVԪnjت# xت# W e UW ; ¥:  UW ;www   B wu  wJت# 2Ld&TN'xxTت# j lͪ^spت# v~r w$  fV] w U  ÜʋL ͪdr$ܟ $ܟ*ت# 0ت# >ت# Fت# BDR~{b.{|fCe    m mg%  fu`u 5`003%I$vATADATADATA #   rwD m04xZ".{,~{X~v\4xZtت# xD|y} i5b75^5 AAUC 5m 5+)tت#  *W"'J,9; v09; v4#89; vBݪHܪ"Vت# \`*Wb'Jj̃n grsx*Sz'Iz5  5 m m w 7  w~ت#  *W 'J $ت# *d&^,'xx2~6[ :mp@ت# D[ HkwNͪ^sT˪pfhͪ^slyvͪdrr 5@5  & f  m& v 6`NA B  *ت#  y}2H~{VݪKbݪKzu 5 BA u5P H5  55D>HBت# F*WH'JT\dd&Tf'xxlݪp\frj*b {@zs@}x@ԃZ@w$@w$@C{@wb$@wf$@w$@w$@:2@w$@A{@w$@w$@z}@w(%@w)%@f@\x@w%@w%@w%@ ~ @v@v@GP}@wDy@-@y@zD{0@v@@{N@B{N@z@}b@~@v@$9 @uVY@?{p@E{@}@$9f@Z@}p@l@z}@?{p@}q@?{@OXe @}H @}V}@:s@}c}@uX@?{@@pT@}@} @wQ@zwQ@}!@nH@T;w@˪p@M@E{@,|2@2@}I"@ݪ@s(@}2@:@̪Pd@zG{@~@J}S@w@}s@ q@y[@ @@:@}0@תH@x @0Ir@w@zbS@}3@ت# @T; z@i@̫b @}:d@\f@$9^@e}@l8Y@:4M@}@t @}M@zl @Df@p@'I@'xx@l@l @u@K f9@v@v@}f@ ~I"@v@C!@zv@?{@:@@> @@l@!3@$9!@k@}@w0"@*;@u@u@z}w@̫[@\@@{N@?{N@:_@\_@@x@d&T@}x@:;@:4F@@ 6  6hL D ^ |hL    D ^  ?{@"%{"$%{!&%{"(%{!*G{,E{.B{N0A{2@{N4@{Nw219200EXTBEXTABA9600720048003600240020001800120060030020015013411075500H?{N?{D{0 A{0 @{0?{p?{?{pE{C{>{OHNSNS\afkpuzODDEVENZAHJKLHNS N S\afkpuz "$&(*,.<>EuVYGvIvKvMv-CZ`B 2345: {tvvv v vvƂlƂl vƂvƂvǂvƂl bS"v˂$v˂&v˂(v˂*lG< HJ[{Z:s ~  VN>  :;-:4FVN2}4}I"9}f;}q=}w^t^@5L5H  l M5Aq w 55 5w  5OXe ̫[!3̫[ ݩ}.f06:@ت# DkJݪN\fPVd&TX'xx^w$bت# jZpت# %VT T M7wws w  Е=ДД Е: \ Е. wz9 nH(x,x0},2x:@w0"Dت# HpLԀPתH`:_lp:xje;|e}dJ5wx  M w55 5EUwww5˪p!3 ̫[ݩ}"k(w0",ݪ0\f28003%$H  EmE ЕНk ݪ\fت# H(w$,w$02ت# 6kFHPRت# Vk\ت# `dx l0Irxx|}st`Еȝ w  Е=  M  w Е: zت# } ت# wQpԀ"תH*ت# 0}4}s6-:}<-BwQT-^w$bfתHr w5& Mw M     M7wHw5~- je;e}˪p!3̫[ y[ "x&ݩ}.ت# :kB)}N}MPxbxfxlw0"pOXe Z>w  Е=  A AEe0P w̫[ w0"pԀתHت# $}(}2*y[ 2M8:>yB,|2 Lje;Pe}T˪pXy[ j5 rMw 5 @`E7w7 @  7 rl7 f5|x!3 ̫[y[ $OXe &̫[4x:wQBت# FHت# NC!Xy[ `y[  Z Mw5www5  M # & ȥ0ȥ9 %݇wj ҆%dOXe ̫[˪p!3̫[$w0"(w$,w$0OXe 2̫[8ݩ}FkP}bhZrت# zktvӂ7 ]  Е=ДД Е: M  t    wxJ}S ت# ̫b ت# ت# pԀ"תH2:_:}0<-BwQP-^:_dתHhje;le}p˪ph5  X7 V5 J7  Mw5w My[ ت#  !3 ̫[C!}0 ت# *OXe ,̫[6ت# :<ت# H˪pLOXe N̫[Tw0"bwQfت# XJ Mw5w MD5%HTw~x}0 x˪p!3̫["w0".2 3r42xx <->wQ BxF}V}J}I"N}R}XwQ ^  N ~ҕHRRw  ww )l}V}x wQ*6:x>}0DHLwQPwQV:Xt \t jwn˪prwQz> wfe%RT &  & & +&  0)P:nH,> B> Z> d:;j0p> ~$9! K K F %?  (/7$[6?3 C   ;"3c 0!    B:;:;-:GP}FlXllGP}p}qrx~x  ;  5  7 N 1# ; L 5tU %% #*GP}} x8NR 6 37  |ت#  }H ت# wQ w0"$w$(w$,w$02ت# 68ت# @*;B'IH!3J̫[Pݩ}\ت# `k -  Z'wЕ5 wDЕ Еw&w`Mwww5/  )}ت# wQ x$}p(OXe *̫[0ت# @ت# F}c}Lت# RwQ`w0"dw$hjت# r!3t̫[zݩ}hT lM75e  v ww7 5wQ}:dxxOXe ̫[$x(}!*x0x6wQ:kBNPxXw0"\ت# `OXe b̫[n w   A 5G5C  M5Aq w 0| ت# -}!- -&*תH.-4OXe 6̫[̫[Dݩ}RfTZ^dت# hk" 5 5w   7 8 .  7wwJw  Е=ДД jݪ\f d&T'xxw$ت# NxRxV}Xx`w0"dت# hplԀpתHz Е:Е75 w5C 5 %,E Dz:_T|zje;"e}&˪p*9,4w$:ݪ>\f@Jw$Vw%\urت# tK f9  xت# x - -[Xf5EU& & +|K f9 q K f9sT; zwf$s$9 ~   %׭׭׭   ׭lU|> sT;w"w(%(:;*T; z0:;2wDy8w$>:;@$9^Lw)%R:;T$9fZw$`w%h}xjxpxxfE  TI7 C D & x\x \xݩ}k$w0"4K f9 q 8K f9   T> ^sf}jT;wpw(%v:;xT; z~w%׭ 7w  B 5%VTf D %%% m%LPp:;$9^w)%wQ-"p&2*u.uX>9@HnHXw%^w(%dw)%puv}xx-\ 7&f mE7     4  `nHl8YnHت# (u,u0i4uX<ت# Jت# d}hت# nت# tje;v ЕNЕO Е= @ ҋʋ  ʋ ы %F- --ʪ0 ت# .Ԁ2תHjpTnJ}Sr̫b T  !,f@@=5 5 F m 5&Z:4M.ԃZ0~>DOXe F̫[NOXe P̫[Z}^je;fupOXe r̫[x-jf x   x 5f :  Е.X}H  -- $תH0-6OXe 8̫[>-F}c}H-T-Z:f- b d0zy0ad0D;"Hʪ0@s@:2@@`^HAyH MyKH@H ˪Q@VNH:t @z> HZ@P~HOXe HnH@ݪ@̪Pd@J}SHyp&Hy[H$9΅@:@ت# @:4MHy`^Hz̫X@תR@ͪdr@> Hͪ^s@!3Hk@_M@OXg'H {0MHp&HxH@ ""*}hxzje;hݩ}h4)}hw$hw$hw>$h:w^$h6w$003%$̫[hJjxh2:;hFw$hw$hwhw$hw$h"w$hwf$h.w%hEfh~wh lPARITYPARSPEEDUICPUCBUFPOOLWCHKPUBSYSUICLIBUICUTLUICMAXPKTMAXEXTLOGONCLIDCLMCRCOLOGOVLPVTLOGONCKPSLAl|VEPRIVLOWERCRTESCSEQHOLDREMOTELINESWRAPVFILLHFILLFORMFEEDTYPEAHEADECHOFDXEBCRPAHHTTERMTOPMAINNETUICOPTBROABAUDPASTHRUTTSYNCSERIALSECPOLRNDCRNDHRNDLSWPCSWPRPLCTLCEXCRASH_DEVICECRASHDEVPASSWORDCTRLCAVOANSIDECtEDITREGISSOFTBLKMODINQUIREHSYNCHOSTDEFNAMEDDPROPRINTER_PORTCACHECHAR_LENGTHASR33KSR33ASR35LA30SLA30PLA36VT05BVT50VT52VT55VT61LA180SLA120VT100LA12LA100LA34LA38VT101VT102VT105VT125VT131VT132LA50PC3XXVT2XXLN03lDTC01LA210LQP03LQP02LQP01LA75LA2XXQ() $! '475B?fdAXSRTUVY"Zgj  Ed !"#$ !"#$%&'()+-./789;=>?AHIQefghiklmnop~CT  pF F2:t ,F0DFH2JJhhhRy7 77 x ~ ˪Q˪Q˪QתR"תR&0̫X4ͪ^s8ͪ^s<ͪ^s@ͪ^sDͪ^sHͪ^sLͪ^sPͪ^sTͪ^sXͪ^s\ͪ^s`ͪ^sdͪ^sX ͪ^sͪ^s ͪ^sͪ^sͪ^sͪ^sͪ^s ͪ^s$ͪ^s(ͪ^s,ͪ^s0ͪ^s4ͪ^s8ͪ^s<ͪ^s@ͪ^sDͪ^sHͪ^sLͪ^sPͪ^sTͪ^s   V7xwɋP    7~ͪ^sͪ^s ͪ^sͪ^sͪ^sͪ^sͪ^s ͪ^s$ͪ^s(ͪ^s6ͪ^s:x<ͪ^s@ͪdrN̪PdRʪ0V:2p̪Pd t̪Pdx̪Pd)7 @   0   wP -1 K W  *: k.ݪHPsR$9΅dZx W @C B ,TIB,VTEʋ:"_M(ت# 0_M8B@FnHNݪVnH^ b dzy0adD"@)}@je;@ݩ}@ 3r@ʪ0@s@$9s;@fuL@w$@<+@w$@z9; v@(@w$@w^$@y@wg$@w$@w$@w$@w$@w$@@Ef@w$@w%@zAXM@w)%@f@w%@\f@wO%@G@تS@d&#@e @d&#@2@T[L@@eH@z9@TJg@Sp!@2xx@`@nOH@TC@Ԁ@> @kOp@$9f@Z@}@w*@d&gY@zOXe @uX@9x@@ت.@d&e@zP<@y@@d&e@nH@2@˪p@Xv@X@z+@ݪ@nOH@:@̪Pd@G]f@$9΅@w@w@y[@@@תH@TS@dO@z:d2@ت# @i@rh !@wPd@\f@e}@l8Y@'I@8`@p@#P<@U @'I@쩒G@zlO8Y@'xx@[(}@'8J@'`J@@lh8Y@S@C!@@@!3@k@j@Dh@zͪ^s@*@w0"@w4"@OXg'@<+8@u@u@k@̫[@$9:@:_@@y@@3I@2d&T@wP(@*df@@   hJ6R>t Bb 4ABCDEFHJKLMNPRSTDBDFDKDMDPDRDSDLDDDUEMG,| ,|@J 6 R>003%I$vATADATADATAt  Bb 4P> @SHOW SET VOLUME/DATA_CHECK=NOWRITE ICBP=0200: 855Y5w@ C we? E   2 1W 5*W 'fOXe ̫[!3̫[ݪ"\f$*w$0Z6k̫[DVݪ\\f^d 3rf2xxnXtw*v|Sd, $5www  -VT25'5| ,nHOXe ̫[$TC&,TC.4˪p8w$Х|!3̫[ݩ} 3r2xx X&f(.2:ݪ>\f@FOXe H̫[N RVy@bfyv0:9 :%7 D EBmՀBmE  w&"BmUUwwwwwj )} ( fuL$تS(.y@8y@F2T˪pV&X"Z`ypw)%tw%xw$|w0"~:w  5d5`ABm5@Q BmʵHЕNЕOBmʵ= Е=C |wg$w$ C!2pu 3r2xx&X,f.48ʪ0>yHت# OXg' Py@fy@pԀtתH / ABm5 Bm5U * C w& EЕ: Е. mD- f}ت# OXg' y$y4*8תH<(BHfuLLت.d:lje;putzl8Y`0w55@w55w M5w5Aq e}˪p !3̫[d&T'xxwg$ d&T"'xx(ݪ,\f.4w$8ݩ}@ 3rB2xxJXPw%TfV\X 5 www  -VT25| STS ت# OXg' &TJg(.TJg04˪p8wO%U Dw$HC!LpPԀTתH\U b:_fje;j003%3%w%Bت# OXg' X 3rZ2xx`+5w5y <5r %kE v 3   K s TQl˪p* 'Iw%OXe ̫[y[ "!3$̫[*ݩ}0w%8k@L9xT9x`k|t 655A5D %/E ,5 '5!%TIb^%\fݪ\f!3 ̫[&ݩ},w%4k:y[ @ݪD\fFP9RZت# `ت# fت# l^ %% wMwwwwwww 5I%COE $9΅s $9s;s$9fsw4""w0"&w^$*w$.w$2w6w:˪p>C!BpF2JuN9PXnH C!; mE7 7 77#-   Е=   y[ uuiuX,nH6>ʪ0Dy[ Ry[ XԀ\תHd}hy[ r[(}|[(}pZ m, w5+@  ww55 @ 5UEje;u l8Ye}˪p !3"̫[*쩒G4w$8w0"3ID 3rF2xxPݩ}XX`OXe b̫[hG]fj3Ih ww 5-e5%5 ЕNЕO55G]f3I ˪pw%C!pynOH" 3r$2xx*dO.u4X5< G]f3I ԀתHnOHnOH nOH&,je;4lO8Y:˪p>OXe @̫[F!3H̫[N*dfP'IV ZwPd\ت# `wP(p  pd7r7  Е=  Е.Е: Е.Е:  Е% www|ت#  ت# ت# ت# C!p"Ԁ&תH.ت# 4:@ت# F:Rت# X:`je;de}h˪plw0" 5+@ /   - - - wwwwww @ ҋʋzw% 3r 2xx$.ݪ2j8s:$9:@sB$9΅HsJ$9fRͪ^sV˪pZw4"^w^$bw$fw0"jw$tEfp  @ C  5  Wt 7  ?0eCJت# )}k$w0"*ݪ0\f28w$@D ZAXMf9; v d < *pe& f ? D:   U?K:d9; v&Sp!*9; v.DhP \AXMdXvj9; vn9; v4h e 1& & Ї9; v*Sp!.DhZb >zz0a>D@*@je;@)}@9; v@e@~@ch, @f@w>$@w$@w^$@w$@zw$@w$@w$@sh<}@w$@w$@gD)@rhr@2@d&#@wh@Ԁ@g @2@Mxx@zOXe @9x@*S@mh@zP<@@g%@˪p@sh@@/@ike@ݪ@nhH@w@z̪d@w@w@q@Z X@תH@sh@idf@:d2@ت# @rh !@\f@e}@i@wp:@zp@#P<@'I@'xx@'J@ͪdr@[(}@'`J@<+@C!@lh8Y@:d@ah @k@!3@zshҒ@g~Z@ͪ^s@w0"@*;@OXg'@k@̫[@d&@:_@shU<@x@  wh  !\ ABCDEFHJKLMNPRST/AFF=\ ::d<<SEC POOLCOMDEVSYSDIAGUBMEM{@C "u u n  iwb:b5wU% VUT Q:NB*ت# BkHOXg'ت#  Zݪ^\f`fw$l)}vk KUI G:B7I 5/ . +U! M fQ X 5Vp)}k003%I$vATADATADATAت# &I*ت# 4*S6'I<Lت# Rت# x ZM^ت# hQlت# v<+x'`J~V~4 B / w%z%9 : 0 w" wA#EA,MA,Dت# ت# x ت# x  k&w0"*ت# 0ت# 8ت# FOXg'ت#  Lت# V:d\w$`:d2lmhrxmhu @  wwwww w7 * % 5W W  l5vsh sh she@~"sh*˪p.w$2w$6w$:w$>OXg'ت#  Dw>$H:d2^d&#`'xxzd&#|'xx*W wwd׭  mcW ` p‡ l e? ,wD4, lt 9V w$ت# x ت# x "zP<(ت# ت# nB ,,3D!E ww7 ~rhr2 ch, ch, nhHnhH"nhH$nhH,ch, 0ch, 62@shHshNshPshTe@~Zbw$f˪pjͪ^s   &  ww 5w <wD 5< Е~ͪ^sͪ^s ͪ^s*f2q8ͪ^s>ͪdrB˪pFC!JOXe L̫[Rw0"Vت# `w>$fpjidflshr<xԀ|תH(=- j d pЕ: d-Е:V5M5--I w@5vmhmhrh !*shU<2mh*@'JJZ XN\*^'Jfz|w~wƀwA A Е:5 &    7 472w *!&      S  Pw˪p nhH[(}nhH[(}"d&#$'xx,:_@:_FJe@~N/    S 5  w7  1"1,--1"1,n*S'I"ت# *w^$.ت# 2:d26lh8Y:lh8Y@nhHHnhHTnhH\nhHbshhnhHpnhHxت# ~sh  7,7, D   nh Ћj2ch, "ch, (nhH*ت# 0nhH2ت# >ت# x Dت# `nd9; vhhlwp:tت# v9; v'mU@ D~ [~m ?0ЋC~Հŀʋl ت# ت# ت# x 09; v8ت# <ت# B9; vXت# x ^9; vdت# x lت# x 3  K s 7 pХ[+ d ¥CХP! RɋB B P¥,¥] ¥UХB 9x9xHT  #b zz0aD&@)}@je;@ݩ}@ 3r@ʪ0003%%ԀBתHJy[ P#*}X#*}^:fje;je}n˪prwg$vw$~5|5w@ ȥ:*55ȥI ХC]ХBZl P N D tp %  PֆR*f'I !3̫[ݪ\f w$.<+80'`JTl^)}nptDh!@D 4pȥ8p  N)TB 8T (   D <p? 2 e8^ pp(#P<,gfKlDh!xpze8^xwww 5# Е= D h  Е.Е: % ww5@5~dfy˪p w$w%C!pOXe ̫[$Ԁ(תH6e8^pB5FתHJje;Ne}R˪pZdprx  psȥ w w %โ5w/   [Xp*w$4w0":ZTz ZzbpfjתHnje;re}v |XwbППPPP N  0"%1%  ||   f b"XZ"p&N*תH.je;2e}6"<XD0L$9΅Ns\$9:^sxp|  wd5  5 w"f!b|HXMD 0"%1% lתHje; e}˪pdOXe ̫["p&5*תH.je;2e}6˪pD^0f$9΅hsv$9:xs |YM  wd-Z   w'" w00 TpתH"je;&e}*˪p.d6#תHDԀHתHP"TXXZfylyp:_tje; wȥQN]ȥUNU ȥLQUQIAEQȕQN:01f)%WEe}˪pjvy ȥU%WHȥQwZ ȕNM0:%1%  d@nOHnOH kOpNZb$9΅dsr$9:tszp~dz wE5Ew5w7  ~ & ׭%[]5tתH je;e}˪p~DQs( 3r"2xx(D*s(.˪p2OXe 4̫[:w0"BNVlsnT; z wjBҥB & (f&& Ε  5& & & & & 2f& Ε& Ε (!3̫["*Hjr ׭ 2f f -52ͥ[.ͥ<+Rͥե: ҕ:ҕ=ҕSҕYҕ:ʕ@ Bx 8 s T; z쩶d$ݩ}* 3r,2xx@Hr   7  _w&  L.  8'w4 Dw7 "[].ȥ[ ȥ<<>ȕ[ k,w0"Vk\w$j w ȭ~w wȕ] ᷊&&& w $ Dw0" w0"$w$0k>TT; zVs\T;z^sdw|  ѕ0~ ~Jd-  LHwww& w6$J,d4# zN˪pXw\`v$9΅xs~wƀb 1 MA Е[E Е,AE Е]m    TC!p ݪ$8.@:_P:_ZdhתHlpתHtݪx}|je; wn wtE5$Е[E AE Е]&  XA5%t5Rʪ0ݪw$ݪ8$ 3r&2xx,>:L:Xt\fv|Z  Օ, 7 Xwwե_ 5w5 h 3r2xx  $:J˪pNT; zPsVT;zXs^wn!3p̫[vw0"z 3r|2xx  750Е[E E ȕ]& <8R OXe  ̫[&.ݪ28B:P:\rT; ztszT;z|sRw&  &  %[]&  (s& ww5\w&T; z(s6@ݪD8LbT; zdsjT;zlsrwv˪pzݪ~\fw5w &  & %[]5w 5w@v w$OXe ̫[w0"y[ *@T; zBsT!3V̫[`lݪp\frxw$~ت# J LJ[],[<> < \5f   f 7  u W , Mw6k( 3r*2xx26>V`ZvZ~w$vW   5ww% w{w 5i¥:f M5~y[ k$ݪ(\f*0w$4w0"8Z(>Z8Dw%HL˪pPkV 3rX2xxdت# h쩏rݪj8Aq 5wu D@ Sw5w5 5q5|\f ݪݪ"9$*w$.ت# DwH\fJPw$Td&TV'xx\\f^dh 3r Pf q5 & ww5 w % h2xx"82 3r42xx>T˪pXw0"\ 3r^2xxdy[ nC!rpvy[ zZ(& w  003%%ȥ<ȥ['[]  •, DC ȥ,Ћ & PЭu:_:_  0W WpAa %%& SYН:Н74 Е:Х Zv:: ȥ:ȥ   w  @ w ԕ 7 w dWt B *w$@kFw0"JNVAyZj˪pnrd~ 7 t  j?0eC-Fpe& f ? T~T Tե]* AXM9; v2L9; vTSp!X9; v\Dh"b zz0aDʪ0@s@-Hyje;@ 3r@w^$@@)XHzw%@#0k@2xx@$9Cf@z# @-8;HwԀ@0$`H{}@OXe @@r@nH@ت.@y}@2%`H|?T@2@˪p@ݪ@zs(@/@zY@w@w@~@$9΅@w@1:Hte}@l8Y@cVN@'I@p@nJ@zu@C!@!3@Dh@ͪ^s@w0"@*;@_M@u@u@̫[@DQ@:@Klp@9; v@zתH@ͪdr@9x@Q g@Sp!@:y@AXM@ l thwfh̫e  ;H}h<;<}h<@j  ,L X|rHost=:: RSX-11M V4.1LHHRWED)/DEFAULTSHOW PROTECTIONSET PROTECTION=(SYSTEM:OWNER:GROUP:WORLD:5L5J  ʥ 0ROXe T̫[Z!3\̫[bC!fpjtzY Е ( Е ЕV$Е ЕBЕL   www .$(:$R `jje;ne}r˪pvw0" TTw  B¥ %¥A ¥Z ¥0{¥9 %s¥:pե:m %h   %_~unHwƀ :%Y&  ee B 9 T& 4RҕRRRMT ˥:8 $(y}.Q g4 8y}F/R~`uhuJҔ ҕ Ef@ʕ PHBw6DQs(˪p(#0k0Klp4w%,28 >D D`NN ̫e d [* & ,* < ,* R ,* h ~  & "(j 02< 8> FHR NT \^h<`]RjWjEjCjDq    j  j( *j2 4jt8j RW E@C@Du j  $ &. 08 RWECDu   $ &. 08 RW E@C@Du   $ &. 0 4   7 EE EE5t5zAW  E@7 mwD5u Sm >2OXe 4̫[:!3<̫[TݪZ@rbD n̫e r# z@r  w wm59L  8ѕ, ,ѕ, ѕ,  w \< ww@r$ 3r&2xx0L4>NZfn 1Q ~wwmw5 L w003&I$vATADATADATA\ w ,  $7 X"˪p&w0"*ݪ.@r6ݪ:˪p> 3r@2xxFLJ\˪pd,nC!rpz$vmw 7 ӕR7 ӕW7 ~ӕE7 t˕D  $ w>ݪ @rPZ^$b?Tfje;je}n˪p̫e <<< ` r([rr,b)]@  r t "r(r.t 4b REGION ̫e tt0@l)  0 l  CREATE ̫e 0x)  0 x DIRECTORY ̫e 0)  0   OVERLAY ̫e 0)  0    VIRTUAL ̫e  0)  0  ( (LOGICAL ̫e (0) ( 0  00READ_AHEAD ̫e 00) 0 0  ;;DEFER_WRITES ̫e !;0 % ; 0 HHNODIRECTORY ̫e !H0% H 0  TTNOOVERLAY ̫e !T 0% T 0 ^^NOVIRTUAL ̫e !^ 0$% ^ 0 hhNOLOGICAL ̫e !h 0% h 0  rrNOREAD_AHEADR ̫e **!r 0% r 0  NODEFER_WRITESR ̫e 88! 0 %  0  WRITE_BEHIND ̫e FF!0 %  0 NOWRITE_BEHIND ̫e TT!0 %  0  DEBUG ̫e bb!    ̫e lBl=:`=: `: `: j: P     ( *6nJ 8 :j FIRST ̫e    TOPDOWN ̫e !b   b ̫e V=: z=: z=: z=: z=: zxnJ  znJ  "z.nJ 0 2z>nJ @ BzNnJ P Rz7 f 5 ,@ 5Aq 5@5 w X_M~X67 \-VP;U B6~}U0 } A% }  9; v 6-$;4L<@0} 75 % C3 @ S K  @$ @ OXe ̫[@9xL9x @ @A w<Lw\>5jh6 5+wAե  E@,7 8&0ͪ^s4̫[DhH~Lu`ͪ^sdͪdr2dD5u< w ! 5 5w)w>D "̫e <&# ,w0"Dͪ^s\ͪ^s`ͪdrlcVNzͪ^s~ͪdr5 "  w  5@w5 sC j- v@ A @5 O5NOXe ̫[˪p C!$2(p,u@ʪ0NjXت.tOXe v̫[~OXe K7ЕNЕO Е=C @6Е(&w#Е,e Е  w  Е=f Е. ЕN2̫[ԀתH$} 4<@8dתHr:: ЕoH ɋЕ) mD- w.תH je;$u.l8Y4e}8˪p<@8 DeferVirtReadDi003 &%d TAXM`9; vzL2> pe& f ? 9; v Sp!$9; v(Dhxb 0zRy0a0Dwg$@}b@˪Q@Ԁ@P~@OXe @ܟ@īn@yp&@y[@@ت# @b̫b @y`^@!3@w0"@OXg'@k@̫[@ {0M@ lȫXqh̫Xh wzwzz wyyyzzzyy y yyyyyy|yw www w www w w w w ww w w w w wzzzyw w w w w yzzzzzzzzzzwt w w w w w w w ww zzz zw zwwwwwwwwwwwwwwwwwwwwwwwwwwlwwwwwwwwww@   7  /wN O&Dت# RԀVP~`̫[fkrw0"v U 5C ы ɋwUBՔ wWqeR 7 ~ OXg'ت#  OXe ̫[}bت# $ܟ4wg$:!3<̫[DԀP̫b Ry[ Z^b {0Mlpy`^r˪QZw$˪Qyp& ˪Q˪Qīnb Ry0aDxw@˪p@{#@#R@ ˫RhT T TTJT@O  ҕ B & & Rf& Εw.#R2{#>xwH˪plb Xzz0aXD@ת@ʪ0@Ԫu:@˪0a@# z@˪Q@#""@[ @9x@Ԫn@ݪ@zs(@~@\f@ܪ"@sK@'xx@ͪdr@u@تs@ͪ^s@d&^@DQ@y@ ǫXh  pl ,F l F F a'VN6p (2<FPZdnx|:ds w4}l ;}u~44[E`E`IqLq4y2 $.8BNXblv,jzspy+C)pfp7 7 ׭E  e775m7ת sKܪ"~"DQ$s((# z,ͪ^s2#""6y:Ԫu:>ʪ0J~NuPݪTuVԪu:Zd&^\'xxb[  W W ]R ʕ w-O $ w 003&I$vATADATADATA AZ󃗠09wZ,ת  sK*ܪ"6> Fʪ0N9xN  l  ` 5w4PP  w 7wJ eh ݪ$\f&2˪QDتsL˪0aT˪QXԪn\ͪ^s`ͪ^sdͪ^shͪ^slͪ^sptͪ^sxͪdr  | b z;}0aDʪ0@ԪQ:@ 3r@:2@#g`@@2@d&#@2xx@:t @:br@}@z9x@T2@ت.@˪p@ݪ@2@̪Pd@:@:@ت# @'xx@ͪdr@[(}@ͪ^s@k@B_M@k@:_@ݩ[}@ x᫘wh4b(, "4FIXEDCHECKPOINTEDDEV=IID 4&&447 7 @ >¥/  8 w , %  U U ¥/ ߇* 5  72 >k"ͪ^s*ͪ^s.ͪdr4,>9xH9xRkd*j|2w7h D      )T ͪ^sͪdrݪ"ͪ^s(̪Pd,:t 8̪Pd>ʪ0Hت# P:br\̪Pdbn̪Pd, (@,   w7 wA A Е @F A A] w w  l:2̪Pdͪ^s b(,&ͪ^s,˪p0ͪ^s4ͪdr8ʪ0>[(}D[(}LXT2jت# ntت# xت# ) % %Е Е Е Е Е Е Е   Е A A Е AW cЕ W Е "̪PdL[(}T[(}^[(}d[(}$ Е.Е A•0555p 5 558 ȕ0Е 5Д C Е-A 0:d&#'xxL:_Z 3r\2xxbp}t~BAA B EU0A T~Е 55@Pɋe @7") w,A A A 00:N̪Pd T̪PdX̪Pdl̪Pdt̪PdBEU0 w$7 ) *  57   ",@ͪ^s"ͪ^s(ͪ^s.:0̪Pd4̪PdN*T^ͪ^s ~b(,  C r5 NR !-B$ 5Aq   &2#g`8#g`28468:<&>.XZ\^`bdfirst quarterwaxing gibbousfullwaning gibbousat last quarterwaning crescent1Monday2Tuesday3Wednesday4Thursday5Frida5,y6Saturday0Sunday T ^nSYS$DAY_0r&::w:. T"^&nnn:\:\"  ̫e $/ FFʄL  H F  F 003&%<>F     ȇ ̚x} F  p      " ( * 0 2  8xPv.-̚T0-̞T2̚T0/̚T2/.ȝ.̚Ty . T 0 T 2 T "0 (T ,20 8 <.B F. LT60-̚T2-.ȝ.̚T2-Q 0 T 2  .$ (. .T 22  JANUARY  ̫e 0j  0 j& &FEBRUARY   & &̫e 0j  0 j/ /MARCH   / /̫e 0j  0 j5 5APRIL 5 5̫e 0j  0 j;;MAY ; ;̫e 0j  0 j? ?JUNE ? ?̫e &&0j  0 jD DJULY D D̫e 000j  0 jI IAUGUST I I̫e ::0j  0 jPPSEPTEMBER P P̫e DD 0j  0 jZ ZOCTOBER Z Z̫e NN 0j  0 jb bNOVEMBER b b̫e XX 0j  0 jk kDECEMBER k k̫e bXb 0-r.ȝ.̚T2.̚T0..ȝ.̚  0r  .  $. *T .2 4T 80< D H.N R.DT&:̚b(: ̚b*$M44Dy T & b (   b $* ($ . 2448r : >4@:44C4 4L 4|  4 x  4  4 $~ & *4, 0 4466,4X44V4{  4   4  4" & *4,0 2<^4I4CMCDXCXLIXIV2 4  4 D7 r7 7 7    ^ w54w`5h5.  ̫e F0# \ݪ`\fbh 5P5w5Zw55K5L5w5 7 5 ~2 3r2xx 3q 2xx2 3r42xx: 3q<2xxz& =5nwLwD w+ww>wGwww=p T; zs.$9i;0s8ͪ^s<ͪdrBͪ^sFͪdrLͪ^sPͪdrVͪ^sZͪdr`ͪ^sdͪdrjͪ^snͪdrr˪pvw  e  w v wF=wv5  Е  5 >$,˪p08<HXʪ0hl@Qtxa Е Е(& D Е) >w^ AP J XЕ,Е < n.el <Е Е Е  (Е: $˪p0N< I 2& ( &V &  Е. wiWt 7 ? * ʪ0I"V>˪pBNXAXMd003$&I$vATADATADATA9; vx& * ?&7p eP & =ww  <9; vSp! 9; v6HDhVb˪pj̪Pdn:2~ʪ0  ) w "␜ eelE sd  Da e r r @ʪ0̪Pd*pWp `C`e r    h lpm`5V%C pe  r rE f&@D+% ( 4pdnE& c# 5% `mp s@ Apw0@^P }3e %$,p>pF@N^nPtJ~}h %} %dW/ed l%e@7 : n e -edz-vedl  EE   ee8Ȭ F b tzQ0atD&d&#@zP<@˪p@:d2@ت# @'xx@ͪdr@T[xx@ͪ^s@ ̪dh W!V5M,u,A5@, 15/U%B  Bl'Bl#Cl B,& D-  d&#'xx:d2"ت# ~| B @ C ClE DAE ElC! B w7wBzP<"T[xx&ͪ^s*ͪ^s.ͪ^s2ͪ^slͪ^sr˪pvxͪ^s|ͪdrb XB{~`"XDG g@z}@ .髜wh 2W,VT  0 1G g*z}b tz:dtDch, @ @#g`@2@2@p@p&@ت.@mh@sh@2@sh@Jidf@ @t@a @ 6fhfh,:dh & W  K& 5D  6 1 ,'f Clsh2t t$t4idf6sh>2BtFtJtPpZp&da p#g`vp|ت.| Pf C Lf E ` f ED , & EEA!2p&ت."a (ت.6t<ت.P2`mhBA-   C E "mh   .2:ch, b XjjXD:2@˪`E@˪E@̪Pd@ت# @[(}@:4F@ jh2 227 Е ?N Е Е-Е-Е Ћ @ +'& + <̪Pd [(}6̪Pd::2Fت# T˪`EX̪Pd`| B'5R7 )7  B:4F̪Pd̪Pd̪Pd":2$̪Pd*̪Pd:̪Pd>˪Ejb >z0a>D@@@9x@˪p@/@ݪ@ت# @\f@ͪdr@w@ͪ^s@"T[xx@ eX h + 7 @ # ȥ K s¥B A5?5=5p 52 .Nͪ^sت# $9x,9x8>DXݪj\flx/v|0 0 AeBA Hu@ &  w7wXݪ:wBT[xxFͪ^sJͪ^sNRͪ^sVͪ^sZͪ^s^ͪ^sdͪ^sj˪pnpͪ^stͪdr@\f@ͪdr@w@ͪ^s@"T[xx@ eX h +004,&% @+"@l@+"z@+"r@̫vL@+"6@+"B@y@:@X@x@:4F@:+"'@+"'@+"'@ (` [h(`( (` 9 , )5 5 5  & t # 7 & R # 86; s'y (y0y6x l:*0l> 4l8:t DT; zZyt > ~7 5   ! B5( E \y <y$<(̫vL4q:꨼^PyXy^꨼^h꨼^0044&I$vATADATADATArvLxy~ 5&   ) & & & & & & & & Ν &! <y2DX:DJl> NlR:`꨼^j꨼^t꨼^~vLl &f& W%5rOE8%3#e7^7Z%p6%E#e7, ̫vL"X68Vb7(6  d6  h`b^5D :(}" *d6>F:(}J ^l> dljxy~dNJ׭h5w f 7  | 6 T& 8T; z,y>l> Dl> JlPlVlb|j  )A& & & & & & Ν +'~z&  2.4:l> >lBwxNT; zVbj\ )h[a r|  V|fewwz(6|DR|xl> ~lrH~few\wXJB`H6 x8HT; z}Dl> JlP`XT; zd}vw-|x(T xwxx|`|   `} }I"}KX }V} } }I"}KX}V}}}:4F2:8J:pPT [1!~ [1;1!~ STATUS XXXXXX     v-0*@.P%`"%pH 4}V}*:B:LZv`flr"xH~`/ Undefined errorzv1v An invalid message format has been reported The selected operation has been rejected An out of sequence message has been reported A data link error has been reporte d")" An internal error has been reported}HH RMS errorJT?T A communications service internal abort has been reported3 This operation is not supported by the server.    y+"    +"B   +"z   +"6   +"'  "+"'  $(+"'  *d#l{4' - File not foundo+"r   4e -  - Directory not found - Volume not found4+4 - No files matching this wildcard specb Qϳz(X:QϳD AhS HDX:h` H YqhlhShewhh6%h\dBxhf,KhZhVz}hʫyhYqh Rh1Xh6&h6fh^ OhhdyhhT-KhK1Xh h7h,2ghlz-%h`꨼^hYqh-fhb/=MhZ/LhM-&hɪhhXyhyhDyhpOhfKhyhz<hE:hGhdWKh?LhL7-hl> hMsh?=Mh f&hlh%(hNyh|hPhZ*ShXh?Th6KhJ AhS877h7 7 7 h7 z`  `  ` h`  ` ` ` ` "`  &` (` h ,` .`  2` 4` 4( 7 ( :`  `  `  ` ( ` ` ( ` J JTTl!lXT Host File Transfer Program,hh ffx    ( ( ( ( b Qҳz$<QҳD:.@sH!sH@@,R@lOp!HP,?T@cOaH-H-H-Hz-H u~a@ $6&@6KFeMH6&J6KRyZ6K\.Sd6Kh6&~hB~ . + (5ÝR~    ɥ  f &7  tQ ƫ?TR y&6&*?=M.6K86K:?L>ƫD?TJRWPƫV?TbRWjRsrDyvƫ{b Ϛгz(<ϚгDƫ?T@ew@?T@ @@7@y@G@7-@Ry@ (< XR<hjƫ<h (<f&f 'fEѕ-Uѕєєєє`є BB WW SwfJ y$(7-.7-4y87-@GL7P7`ƫ?T|Ry|&fE NB` ыJCK& T B % ы  B --B 6y&ewfewhGnewpGx7|7-d T7 UU@ұw7yb?Tb ϚѳR(ϚѳDƫ?T@ @G@ ( Bƫh (Ff&f fѕѕѕєєєєBB  &G8ƫ?Tb 0z(0Dƫ?T@?T@ @Dy@۪_.@Ry@ƫ@ ( ƫhRsh\ƫ{h  (f&f fѕ% 7BB BB ɥ wf %* 4DyFƫRƫ?TdpRyx۪_.\| %%w@e*?T.6<D"b 0z(0DdA@dH@ƫ?T@?T@ @6&@-K@/=M@/L@-&@@y@z۪R.@WK@?L@Ry@?=M@@S@X@6K@ ( RWhƫh>ƫh (f&fÝĝD A50 -fѕѕ ѐ ÝĝD A5%Ýѐ B@* <6&B6KPThXnSrWK|B ɥ wf&f % %%w. ƫ?T Ry.۪R.0b?Tfnt| e@`  D @ S ef&f5 ÝĝD A5B ?fѕ* 6&"6KXy^bx tɕ 5 ɕ5ɕ ѐ ÝĝD A5%Ýѐ BB L6&6Ky&y0-&6-KFJ^XdShWK|ƫ?Tb Qϳz(QϳDS@Yq@1X@1X@Yq@y@ ( x h kqhxphqhl*n hnphqS(hdqM)h\ ( & c 5J  eV  & c2YqYqS 1X(1XdYqlYqtSh|  "555 e e eb Qγz(Qγ004L&% @l@qS(@ B( ƫ?Th~vLh^.h-h:̫vLhƫht (ff #~wezv ׭   e  f  ffB qS(~$@`DkqP?TVZɪdfjnrɪd~꨼^|ffwD w46 W   E  ffw w8 (> BYe;H NZn `ɪdn W   E  ffwpj W   Rp  Ye;& ,p8np>ɪdLXyh lYe;r xy~Ht xɪdll> <l (l*l> ,.0dBx24dy8l:l> <>@B4>l  L l "$&*L b Qгz$@QгDrO0@n_@rO3@rO2@dOL@s@}@q@sO}@@h"@lOhQ@zlOp@tO}@fOW@* &@@lO.@n^@fOHq@sO@hO1@(@lO8T@xO`T@xOcT@xObT@zlO$T@nOF@wO%@nOG@nOG@nOG@nOG@nOG@tO`Z@w@8@2@rOy@rOy@8@zcOa@b@@cO a@rO:@aOK@m@%{}@UH@f@tOK:@tOQ:@tO:@F`@dO~K@zrO!@rO!@fO}@rO}@ q@b?T@p@fOL@ $`DRh$(06\g?Th` shm?Th zĀ_hKq%h .h~ 74qh mhh hzh/gh ,?Th&Ӏ Xh p_hy%h u~ah wh.  $` .ttppppppzz $(t $(t $(p $(p $(p $(p $(p $(p $(z "$( $$( &$( ($( *$( ,$(#0z   & z $( $(z $( $( $( $( $( $( $( $( $( $( $( $( $(& 7O  @  nOGcO a nOGcO a nOGcO a nOGcO a nOGcO a "nOGcO a (nOGcO a /nOGcO a 3nOGcO a  PnOGcO a nOGcO a nOGcO a nOGcO a nOGcO a $(f&fwjIOՕ ew  7`w  @^rOytO:$xO`T,sO}@lO8TDhO1RxOcTVxOcT\xOcT`xOcTdxObThxObTnxObTtxObT|՝՝ՕB zUUB `cf&ff_ ~ b4 4 t0lO. lO8T@sO}HsO}NtO:T~ nt Օ @ we@7UU՝՝ՕJxO`T sO}&sO} *$`:sO}JnOGPsO}^lO8TblO8TdtO`ZjlO.t UU ` w&f&f . NUe 87ʥ @tO:b?T` &aOK,aOKDxO`TH. RnOGXnOG^dO~KvtO:E(ե   v 4@ @  Z s> &wO%* .lO$T0lOhQcO aDcO aHdO~KPrOyVrO}bsO}lsOvsO M7 <E Mf B  @4 f l * &lOp8n_ m8n^ * &"8&,* & 6$`:T* &hdOLn2Le |Ew&f&f . wwD  sf:rO0>. DfO}^rO0b 4  ”¥¥H~4 :@ ҔB~4 m 4 %)    Hb@ x$`|Dҥ EEPe t wwf TwbwH ZwF 84sO}>rOyDsO}JrOyNh"PrO}^rOydsO}nsO},wB Lw0 w0 :w *ww w   $ww 0:lO..lO.4lO.:lO.LrO0P T hlO8TtrOyzrOy<wfBEzC  wT¥ T7@ @ wP $`z(nOF,cO a2cO a6dO~KBtO}RrOyXrOy^rOybqflrOy|lO.U  ww  fAfA&ݝ`RnOG nOGdO~KrO}&sO},nOG6sO}:rO!@rO!LrO0P V tlOhQ|hO14 C`. e֠w@ @  Ί f&&NrOylOhQtO`Z&rOy*lOhQ.h"0tO}:rOy>qBHrOyLwO%nsO}   1    f . - 1%XrO0 .w2p4%{}8FrOyJh"LtO}Ph"RrO}VtOQ:X}hfOWl. , 1 ˥ew    l w   & $ %p NrO3rO3 rO3$rO36rO2:rO2@rO2FrO2V jwn%{}r %  f&ʊ>   & . >f w F`"%{}&RfOWhrOynxO`TtrO0x. $   r7@ @ f 1 %p @rOyrOy rOy$q(.rOy 2$`6pwt%{}x e % &f&f @ F s < *,f :rOyBrOyFrOy N$`FpsO}    & . n  &fc7LsO}sO}rO!"rO!4rOyA:;A9@8(@)+*A./A-@,$%A'@&"@#! A`aAc@bf@gedAl@monAjkAi@hx@y{zA~A}@|tuAw@vr @sqpAP@QSRAVWAU@T\]A_@^Z@[YXAHIAK@JN@OMLAD@EGFABCAA@@b Qѳz$NQѳDs@nOM@U@rO0@rO3@m?T@dOL@s@sO}@h"@gf@lOhQ@zlOp@Kq%@df@by@tO}@by:@fOW@.@@@s@s@lO.@n^@sO@zlO8T@xO`T@xOcT@xObT@@lO$T@408@nOF@wO%@z@lOp!@nOG@nOG@nOG@nOG@z/g@tO`Z@40yHw@@rOy@rOy@@cOa@Ӏ X@cO a@-@m@rO:@-@z-@-@y@-@-@-@y@aOK@y@-@-@%{}@U@.@:@z.@nO}s@@f@@tOK:@tOQ:@tO:@w@F`@dO~K@rO!@rO!@, @ q@zrO}@p@@fOHq@n_@q@nOG@rO2@U@74q@hO1@U@@fOL@bOE@r}@y%@ $v$h0 @`hhbyh2 yhyhph2hyh $zK?2 > HNR ^b l5:94':94'5'9'95:9G7:95:94':94'90 2>HN"R&^,b0l$h  f0 ` ttttt  Z   A 1 <F`,  z$.RfOWVm?TbfOLl| Aɋ A%p % )  $44tt t tt2/gw"%{}&z4F`@HT    8A 1Aɋ A %p   9T fOWm?TfOLrOy&fOL*q.z28fOL`wd%{}hzp~rOyt2 %tt t ttA e  A 1 2, z.dxO`Thm?TlӀ X Aɋ A%p % )  92 %P/gw"%{}&z4@HVrOybfph, lzp.ltt t tte A  A 1  Aɋ A%p %,lOpP$rlOp\- fwBe 1 1 1 7 7 7 7 f .% %\$gf"fOHq,dfFfOWJxO`TNrO0RwO% `$dz004d&I$vATADATADATAjlyryzy E%E%   f% %TT|.lOp n_mn^zs "s(,s 0sV-ZlOpd:jyp-t-z-T %& & & & &f& & Νp  ʥE%5 \----y-"-8mlOp@n_DmFn^Jzj:   ʥE   eV f% %TT JmlOpsV:\yb-f-l-r-v-|-D%& & & & &f& & Ν   ʥE,& & & & t& & Ν  F- y--*m.lOp>Ds h$trmvlOpr %5    77  | y U$lOp&n_*m,n^0z@Dby:LtO}PrO}V}U ZcOa^cO ah.ltOK:n408. 4 4 tte 7  Vz rOysO}..yLrO0Pm?TTӀ XX74q^brOyhfOWlw~y%D L D < 2 p ȕ   &&   BxO`TwO%rO0 2 *w.%{}2zFfVdwvs&  p eՔ~  V L B՝՝՝e 1`Ք~VKq%."408&z.tOK:@rO0JxO`TTwO%^tO:brO:frOyrcO avcOa4 & c ef  Aby,b Ď z(rĎ DDb@Db@s@Iq@@-@@6%@{@GP}@ʫy@6f@z6&@J$@-K@JE$@@Jm$@ݩ݁@ݩ@ݩ-@7@-%@@-f@-&@y@z]\@\@\@fK@)x@6x@E`@@G@G]\@&@G\@y@G\@U@z@U݁@i{@U-@"@eP@i{@($@f&@i{@eO@e-P@(E$@(m$@|@z6K@Db@ 6phQhj.Shv:h:hPah%h WTNr {x{`{@b YT(r (]shrݩh0(h6;hDyhpUheMh*R`he](hN  WT (m$ Db G\$$ i{  Jm$DD e-PLL \,, ݩ-44 U-<< - (E$ Db G\"" i{  JE$BB ePJJ \** ݩ22 U::  ($ Db G]\  i{ J$@@ eOHH ]\(( ݩ݁00 U݁88P"  &&J JP%PPj{ jr r  P!@ J J%Pj j  004l&%DJVsd ~j`f&5 5.P5 %cf eff e eL7 y(y . 2P:y @ DNs\{pE0fff e @fBCe7(,& . y  "4j n`Xcff e eJ @s" @JFb QѳzrQѳDy@w@+"Y@:d@ prr {({0 YT@ dAhdHhX` P P  &&P PP$PP `@f&f e q(q,ff eP@E@f&f e =Pr. 2:d <PHy v zPn|P& ff e@U@ %5@"wHyP+"YXyzb Qѳz(%QѳD6p@ƫ?T@6%@?T@ @6f@-%@-f@%@ɪ@Ry@|@* (% ,R%hƫ%h (%f&f ffѕ !"#$%    3 e s ќ 6%"6p| ќ ќ ќ ќќ10ќќ BB WW w86fbƫ?T~Rywf&f %q ыnrr r!r"r#rrrr$r%r r r r SSSSSKr1r0r -%h%trrrerr f l  ,"e >eRR  @U -f,|8ɪX-%@w  f  "?Tb ϚγR(yϚγD?T@y@G@ (y lRyh (ypf&fW "B` ы @@B  D ! SB %@ @Uw8Gn?T4b Qγzs'QγDwx@@`@s@}V}@](@X@ ;,0s'h;, F` ᫆xhתhe(h ;,`x"004t&I$vATADATADATAB%%%%|&&(TI&TI&COz`  ;, ;,";,B.;,&4;,&6` <;,(>` D` J;,&L` R` X;,&Z` \%eU#  55 &  z`  ` ` s&` *@`4` <` D`  P;,Z` b](h` jXp`  v;, ` ;,*  ?&> ;, ;, ;, ;,wx $}V}(&` Jb Ďz&`ĎD:(}@)!@ZrQ@='@&\g@&@ZR@6&@-K@:t @év@(xs@z& N@)S@(Z@(f@-&@(T[@y@y@&,@) @@)W@)r@)H@)@zZ@( z@)p!@Dp@)H@&@X@6K@ & &` ](h]sh;4  &MENU INFILEOUTFILVERSON . PROTO ->XTFILXXTEND SYS$PFTFORM Working .... Exiting per user| request. Error -> Press ENTER key to continue. Please provide a file specificatUion. Error in file specification. Illegal wildcard specification. hh &`~f&f j72 .  '7 &" 7  z J~X &2)H"&$)W(2&<&F&P&T&Z&f&l& r&Jt) z)p!z ^ f&f  *5@ f  0  l& N)W &^<& B&fD) J)p!N& NP)WT d&l:(} v&x) ~)p!d  `0/ W Q K%I%~& N)W "&$)H()H ,&/.) 4)p!8&\g:)W>D&,F)WJP&R)WV\(Z^)rZV0, 2 %%0,|(T[)r &)H)H &,) )p!"&\g$)W(<(f>)r D&F)HJ)H N&,P) V)p!h ĥ  E7 &0/ |&\g)W "&$) *)p!.& N0)W4DyH& L&&N)HR)H V&/X) ^)p!b&\gd)WbW Q K%J%&0, 2 %%~ &, )W&)W"(Z$)r*(T[,)r 2&&4)H8)H <&,>) D)p!H&\gJ)WNpn%+&0,   !U7 |(f)r& &&)H)H "&,$) *)p!.&\g0)W4 @&B) H)p!L& NN)WRhydJ o% W   X%W%5|& &J &)H)p!&,)W$(f&)r,&4)p!F&H)WLR(ZT)rZ(T[\)r`:  @J 1   %%y & ) )p!& N)W $&J (&*)H0)p!4&,6)W:D&F)WJV(fX)r^(Zl     5. &j ~)r &) )p!& N)W ,&.) 4)p!8& N:)W>NyT;4 \&j`6&d;4h6Kf j]58U" ̇&j 58jU~ &-& ;4-K&j&$y .&"0) 6)p!:& N<)W@ J&jN6&R;4X6K^&j`-^ T^& & & & & & & b& Ε b JX^hp^&f&f004|&%ʄs ;4 ;4B ;4  &;2x(* 0;420 6;4<B >;4@> ;4lEf0fL  e5U@xCDxhxj7 x^/K/K ;20 ;2L6évL;2xZ;2x\;2hb;2xd;2jh;2x̫e B<B.H/R6HHHHHHȅH ;4.H R ;46H H  "H& (H, .H2 4H8z :HID  ̫e z z x ;2x DELETE  ̫e x ;2x  LINK    ̫e \:҆҆žxPRROEMhxx ;4 ;4 ;4 $;4 (;2x.26:>BHyJ N;4h R;2xT Z;2x ""О<x* ;4< ;2x ENCODE  ̫e :1x  ;2x TRUNCATE  ̫e  x ;2x;4xr trv7%&m&ȥaȥz  &h7 ȭeU@7v7|J;2r;2r;2v/K /K(;2&. 2;26;2&L;2& R` hV` \Jj;2r;2v4t &frwA `wr*;2t;2r;2w,;2r̫e   ;4 LINK    ̫e 00$ $SHOW   $ $̫e  jj) )HELP ) )̫e $$pp. .DEBUG . .̫e (V(v/ 4P8R<O@†F J҆P҆V``†fʄʆ6ʆ zzv 48<@ ;4 F$J (;4*P .;40V 4;46`:` >;4@f H;46 N;4Tz44ON 4 4̫e z z ;477OFF 7 7̫e   ;4; ;FORM ; ;̫e ת;4^U7 ttuwpr h7pe7   e~/K ;2t:2;2t:2;2u":2$;2w*J,;2p2J4004&%;2fL:(}P;2d T;2\V;2P\;2R `;2D`jPRDwN.  +  PRD 7 | ;2j;2P ;2R ;2DZR ";2.*:(}.ZrQ 2;2+::(} >;2@;2PF;2R J;2DRWXW\by: ;2 MFT VERSION XX.XX Zhhhhjj&& ` P  && P%PPR r r &7P MFT>TI:CMI.CMDRP hh|b OϳZ(OϳD:d@ (xshrr {({0 YT \&fNs(,f e  P N":d0^^X Xtt $P.b Oγz4pOγDs@rO0@lOp@@z@,kfH rOy@p_@y@m@NH@ q@B}@ $`*4r0rh,Rhjh $` 4r44&ff4WtEE EU0PEU@P Е 4ffe *$` \$`|m  4 & c ;@ @7 & & & & f&  I E Be8(rOy.}2z8rOy<$`LTlOpdjs>4ʥ2 & & & f& & Ν  E e ˇ4 e & q4m8lOpHNst &f&fe!wm m X44 & & &rO0@p_& & f&   s@ EEW!0%70WuwW!@%_@]P 4- lOpX$`n$` l  b Oѳ"&8:rOѳ  &8:  r r,&8:XTFHLPM 8Fil,(e transfer for an RSX/VMS host to/from a,P Professional Version SEND,xa file to a Professional9Normal@,Protocol RECEIVEa file from, a Professional9EncodedAProtoco,l DELETEa file on a Professio,nal DELETE a file on the host,@ EXIT . File specification:,h ![ J]Change file specificati,on: [J]5Move the pointer to you,r selection using the TAB key.1Selec,t the transfer operation with the ENTER ,key.8Move the pointer to the protoco,0l type using the TAB key.,Select th,Xe protocol type with the ENTER key.,-Type in the file specification and pres,s TAB.EType in a new file specificat,ion if desired and press ENTER to start.,4For HELP, press the PF2 key on the , far right keypad.VERSON( ,HXXXXXXVMENU  XX next to one choice, press ENT,ER to continue.VVPROTO 5 XX, next to one choice, pre,ss ENTER to continue.VnINFILE " ,((XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,8XXX.Sample: DB0:[321,123]MYFILE.MEM. P,`ress ENTER.n|OUTFIL" ((XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.tb Qҳz$ QҳDs@@@{@:@\g@J$@W@@Q@a@)x@T; z@z@<@G]\@&@@U݁@i{@($@Db@ $`,b WT:{{0{ j YT $.rWVNh$(-0^byhLby:hhW`hh0fhJb?Thb@h $`, XTDLX DDCMP TRACE OUTPUT -- Unformatted data -- Completion status: Secondary code = Unknown error code =  tx|| Transmit Receive Open Close Initialize Control transmit ,<KSuccessInput argument vali* JNRVZ,^<bKedation errorOperation errorLine initialization errorTransmit failureReceive failureSoftware errorZ-Z`Wrong number of arguments---> <---  `E CONTROL MESSAGE -- DATA MESSAGEMOP MESSAGE -- ERROR  ACKNAKREPSTARTSTACKUNKNOWN XTDLX STATUS AT ; STARTED AT RQ=, TQ=, WQ=; TIP=, RIP=, RST= BUFU=, NRS BE=, NLSE=, ALF= Data errors outbound = Data errors inbound = Local reply timeouts = Remote reply timeouts = Local buffer errors = Remote buffer errors = Data messages received = Data messages sent = Data bytes received = Data,: bytes sent = Error flag word =  WT ($ Db G]\  i{ J$00 U݁88P!  &&h  $004&%$.TPTW`s f$.h$. v$`,n ~$`,2| j Y RF De H %e 3cyR $`, $`,Y ($`,FB$.JT; zX\Whs n$.p$. x$`,y~   :l  %e Е 7    ЕF $`,~ $`, 8$.@T; zNR$.Z$.p$. |$.t 7 v  Rc y~ A  A\$.$. &$.($..2W>s D$.F$. R$`,y ^$`,~ l$`, j   Tf=  &  %e wpcR $`, $`, $.$$. ($.TTT; zbfWvs |$.~$.l  r Fe X 0e  >a D &a , a* $`, ($`, >$`, V$`, n$`, # a + a 1 a  7 a = * $`,# "$`,+ :$`,1 X$`,7 p$`,=da D xa ~K `a f Q Da J j (a . v * $`,D $$`,K @$`,Q \$`,j x$`, a  Z a > a " a  e " $`, 4$`, P$`, l$`,\ e  pe 5 Ze O Da J %e& > $`, $`, 2$`,5 H$`,O`$.hT; zz$.~aЕ  7&P7&fЕ A 7&fЕ A Е. T@Q$.$.&$.4$.B:H$.Z$.f<z$. ~$.T7f &f EC  j f& ff e Pf4$.f  $.$. D^ |Pf e @fPfff e @fP ef<& .P 2$.8$.fH\g hPr{ ~L e  b Ϛѳz SϚѳD b@s@:G@W@%&@%@ b@#z z@:t @pw@W@@a@`@zbH@Wi@a8@a"@Wm@W@+"!@ bz@W@W5@aW@o@:@aW@E`@za@,@@ bp @&@pqq@a@b@ b%@ bz@axZ@WW@ bp @:d@+"s@2 Zg(0 @Sh<?ShASh Zg(w 5 u u (ww  & & - @& & & & & & & && & &oDaT%Va"^bx:t |ABAe& & & & f& & & & P AA@ppf& e֋ A& & &0:GR bzX bp f,p bzb& & & & & & & Nf E` l#f& WaWz WWW W  ɥ"N ~ :( bp , bztmu-w<ɥ;d1wbנ*å2@   8wn ff eŀ6+"sB+"!tTI&  V @@Ew  ɥ@4<bH@W@BaWRolu bSYuff e%@55004&5&vATADATADATA 5 uwp`W`aW axZ.:d8#z z: b@bHDWmWiWWW5 FaWLWWW NaW- `wuwff eD`@e@00000U5ffD,VbHZa^aba8fa8ja8n%&pa@`taxZ~d eE%7@f& e%$%D000f& e%~E`%&a@`#z z b$a2&<#z z> bD%Fa"P b%T b%X b%\pqq^ bl,vpwx b|#z z % w  &D@@5ff e5 Eff b +"! b o$a6 b%: b%> b%BbHFaJaNa8Ra8Va8hrax%&za@`Z e% ff e%@f& e%A5)f  2/D :d#z z b(E`2#z z4 b@aN&X#z zZ bts8      RՀ@% w  &D@@5ff e5 Eff b +"! b o$a6 b%: b%> b%BbHFaJaNa8Ra8Va8hrax%&za@`Z e% ff e%@f& e%A5)f  2/D :d#z z b(E`2<0b *i@3##h#'xx'I'I'J2xxK""k0"v}z8z{|""Zx̑""(""""?T©2©Bx;<}}_sm}2%/\2wM32xME2r) 3\3 z^ 5*}e\X zgk,xX Hb z}D#HGG@$9K@)E@#@:2@V}@)@}@:p@:@)Ps@)%@:@d@N`r@M@$9!@`;@hp!@ @$9:@y@:_@005&%k0"h?Th©Bxhb̑""h2(""h8'Ih'Ihv}h3'xxh'JhZ©2h^K""hD2xxhzh(z8h |""hJp̫e Z;<}h(T   Q|  2 Account Utility options are: Add Add an account to file Delete Delete an account file entry Examin 2e Examine existing account List List account file Modify Modify account file Sort Sort account file CTRL/Z Terminate utility session Creating Account file -- LB:[0,0]RSX11.SYS Enter option: Enter account (group,member): Enter account (group,member or last name): Enter account (group,member, last name or ALL): Password [S R:0-39]: Default system device ( DDU ): First name [S R:0-12]: Last name [S R:0-14]: Enter maximum number of accounts: List xon Terminal (default) or File (ACCOUNT.DMP) [T/F]: Delete UFD and files? [Y/N]: Print passwords (default no)? [Y/N]:  All accounts (default no)? [Y/N]: Enter group number (N): Session ident [S R:0-3]: Account number [D R:0-9999]: p Enter user CLI [S R:1-6 D:"DCL"]: Enter user CLI [S R:1-6 D:"MCR"]: Slave terminal? [Y/N]: Warning ** Device does not exist on current system. OK? [Y/N]: Default directory string ([group,member] or [name]) : Key to continhue, CTRL/Z for ACNT Options Menu: Disable login/logout messages? [Y/N]: No account records matched Default file protection ([SY,OW,GR,WO]): Password lifetime [D R:0-255 0=Disable]: Inactivity logout timer [D R:0-32767 0=Disable]: `Warning message initial time remaining [D R:1-255 D:10]: Warning message time interval [D R:1-255 D:5]: Expire password? [Y/N]: Disable account from login? [Y/N]: Remote dialup login disabled? [Y/N]: Network login disabled? [Y/N]: X Password minimum length [D R:0-39 0=Disable]: Account expiration date (MM/DD/YY or DD-MMM-YY) =None [S]: ***  Account File Maintenance Utility ***%F%Y %3Z Multiuser Account File List Page %D%N%Y %3Z P Multiuser Account File List Page %D This entry? [Y/N]: Type or <=> to leave entry unchanged Account file modification is complete Account file is now sorted by UIC Account entry and directory have been created AcHcount entry has been deleted Account entry and directory have been deleted WARNING -- Directory not created New Directory has been created ** Only the old UNENCRYPTED type passwords can be printed. ACNT -- Cannot be run from a non-pri@ vileged terminal ** Use SET PASSWORD to change your password ** Do you really want a blank password? [Y/N]: Do  you really want a blank username? [Y/N]: Owner = [%3E,%3E] Login_defaults = %4E:%11EL_name = %14E F_name = %12E Password 8 = %6EL_name = %14E F_name = %12E Password = %11EDef_CLI = %2R Session ID = %R Account # = %4<%D%4>Total_logins = %5<%M%5> Last_login = %I, Login_failures = %M%Y %3Z%4ECharacteristics = %2ASlave %2ADef_dir_string %2ASilent Pwd_min = %IL0 ogin_Flags = %I%I%I%I%IPassword_lifetime = %M days, Date_last_changed = %YNOPwd_lifetimeDisabled NORemote NONetwork  Pwd_Expired NODef_ProtectionDef_Protection = [%I]Inactivity timer = DisabledInactivity timer = %M min., Warning time/i( nterval = %M./%M. min.Account expiration date = %Y NONone (ENCRYPTED) ACNT -- Syntax or command input error ACNT  -- Cannot find account ACNT -- Account file error ACNT -- Invalid option ACNT -- Account already exists ACNT -- Account file full ACNT -- Invalid default device name ACNT -- Current entry not modified ACNT -- Workfile error ACNT -- Workfil e- mark delete ACNT -- Workfile- open file ACNT -- Workfile-005&&vATADATADATA unspecified ACNT -- Workfile- page lock ACNT -- Workfile- page unlock ACNT -- IO error ACNT -- Workfile- page mark ACNT -- Workfile- dyn. mem. exhausted ACNT -- Workfile- IO err or ADDR past EOF ACNT -- Workfile- virtual storage exceeded ACNT -- Account file already exists ACNT -- Block numbGer 000000,000000 is locked. Try again. ACNT -- Listing file errormTTaQUFD PIP *.*;*/DEL/NM:[0,0].DIR;*/DEL/NMUFD CPRSX$VMSCPRSX$DEFCPRSX$LOGALL-6JAN-FEB-MAR-APR-MAY-JUN-JUL-AUG-SEP-OCT-NOV-DEC-BBHH ADELMSdXX   L   . *4:2:s$.(6:s<*@V}BK4*4ddn pn pzzd})W d< ACCOUNT.DMPSY:?4 p*) 4**.T&T( P~(p TI vv psp  5:   0^\0 W~e• X• 4 p(>sL}P)WZ`~l:x:w>& 4 ŭ U  C @z %  /@4"$9~Z&)Ps} 2H}L:pTzXѲ:v:~}z7700ep 0 7   > 4 E| Up   H l fz )8)8)%)%")8$)%()8*)%0)%4)%8)%@Ѳ:Zs!sfzH J  w (    w wFF@ B~F~ 2 &2FV# zZyhFtFx~|  \ %7 F  P       B  bw g5jc jl 5FXZ5PW R 58J [ K  S L%\A I B >- 5  ʋ2 d,GG@jSFML\TjSZMx|t  ^ %% , w wwH J d wwwwwpwfwn5l_ # z&#. L f K Je w pN 0 *Z& faL)D)BxH)ZVV}h}lV}n)sEt)sEz)E~*l   77 Ew&ww S  E J w bw  6)Ge; `;})8$)8.&F NS w5 b  w| wL( 5 6&5@.w t U `EZVM ]dw \7 w R ww N wF5 E w  w]~ "5|BF|ʋ R %4%,  8 n v  wJ   4# z&#.4fj:2t:szK\  *w wZw< l7        E@E@w7 j%Eb  8Er5w   UJ7 p    p q 0ևȥF <t$<^qT2=7 w^ &u ~  wUe@-|6 rL62*~0)6)t <)p@B)TyH)Lhp!zLVh P~ @A2  7   ^e-  L ( Vh&0A6:2B?THL 6  005&% xE 21%&f f X 9xD p A +   '  w,E LI n ( j  wwwwjS >E~ n t b  Lt D < B 0g  U 2 fw bwɋP*$(0t8DNgV< ]&  ]F ~  w 5%\ (@FN~~\w7 s  p  ^ Eb ^A Z T  d K $"*NcMM,BMJM`N`rdGG4  %\f (w H DA %\  77w("\0MNjSXjS^\jjSpMwwww b _V W T Q N+ KP Ht E(Bw U@X4;.Dw   )Ps} * 0 6 < B+ HP Nt T(Zw pX|,+ ( % " : Е, 7( dR 7 5E>    $*:06@:_N:_RX7^(~ x 5 nы \ 7w~ w4 tw&t N ~`<~)p @~)p D~H Td:t j:p|:2$ 7 lhdN^@ v ׭A34 -w8Eh5@ ׭A, fw  d~4GP}dGP}|~    BEЋU lUfW [ <]> :: *26!&!% & ) ~w7ыw|$9KVb:s|!jww%ȥ=#` t  ȥaȥ{ ,N @%6 U@DH$9!`T;;"t"|Z B  5@'T " M t  7&" z  | Z4NR$#ʥ>ʕ] -% , ] ȕ] 6w  7 f x Bn$  ` ҕ `  3 : ## &    Rҕ R `"`03J jRzRZx% 0 M d   `<L%% ̫e ^ (&[,,,](J,J )r (& 8  ~ ( 0 8& @JFZ RZ ZJ SYSTEM ̫e Z Zz  z OWNER ̫e b b    GROUP ̫e j j     WORLD ̫e r r"  " ̫e zFz=:R~W~E~C~D~ =:RuB 005&&vATADATADATA~B ~"B $~,B .~6B 8~<W E@C@D =:RuB B B "B $,B .<WECD =:RuB B B "B $,B .2,&W &E@&C@&D& uB &B &B &"B $&,B .& (&(&7 &% 5  4  B`ʕ  ¥  wP  "% ̫e  # 04P9zlP&B`ʕ %  LwArw7 R @"  B` ‹ 5UwwA X B FMU@blv*   5@& T PPtPn@ @M\ " $&Ћ 7 Հ7 5+A$M |0lh -1-  4ԷԷ<PsR$9΅`sb$9:|+ Է}ԷpԷj j Е AȥZ0ȥ7!!$$''-.09AZ__f&ȋ + j++ j  ȋ ȥN ȥY F@B~ Ft RЕ:]5  ]04FBHFNt^t,Е[F Е] eee.5<Е[BeB~Е]Е Е Е e@ : eFBp , eL:5PR E<U45.l > Eef  VR4R6R>J2j VR$"s!s>l B> Tf X `Vtj |Vl-, a  A(RA'RA&RA)RA*RA+RRn rV\ 5<eR\ 5<eR\ 5<eR" a  @ HVL\ ^\ p\ -I?a R SD)RS V` IIII 5< 5 < 5@< 5< f| / * a ( 0V4` L X d p z| ~/ d. VfRf7g AgRAhRAiR,H ~ BL  h ^V j RjRlRm VKN\R`:2fK |N`r0Rf&md  eN  XE 5 2et E  "et   2GGV}<KLK bKnK L1     www5w^ w^ wP7 7 7 U\&K"MF^J68X6;z\~14  r 4w X8LN_% :$5>e4w .e(w "57- 7-:sKw@  w:w\> U,/ 9e5 \\rNcM<35e e~̋D&f : 7`  l E Uw  ~3 2=f>ffN N NhN N NhN NhN NhN NhN N eP%\ fA U8w*  U 2$>R\\MvM44w E އ & &f C~ C~  8jTG`*K .V}DLZbpx84D~c ~  s0}`~ `$jTG(`,#w0yP b <0z2r<0DXs@@w@l6p@uX@:2@\x@`@OK@H/@wx@y@zK@ew@}@2@;@# z@*_M@#""@2t!@:^@T.@z}@^@:t @o@z@@먓@2""@;F4 @@4@@f@|r@eĊ@f@s,PhLyhH&h6v gh`2(0;hBah}hkhwh0",L"hv^h:wh2(( n44.. ,#00 2`> HEL -- Command input errori"&()"" 22(8&H  :  , 2Hh:2:&wx0<}xB# z&0&;F4 a o f^uX먓:^ww H/"H$Hw&ew(eĊ*;,x.0RvT.  OK u|r[M24̫ѫxѫjѫ f"z}$y&f2(d0p5U78 w :7&5 2`0 2`2`pu2`\x &\x(,2` 02`8@s F2`:J2` N2`R:t \wxb\_Md`U<ХL U:;<)ȥL&ȥP5pE  2` 2`<2` 2`:"2`&2`;(2`,2`<.2`B2` H2`NR2`pVDfXs(^2`^pEE wbU w5  005&&vATADATADATA|2`pu 2`\x2` d(2`,K42t! 82`<#"">2`D2`J2`P2`V2`l  Zwx d pE5w|pUw2`2`2` 2`$:22`82`p(?(  ~(fm4p8 2`(2`^$"2`(&$42`@@*_MB2`L2`>X2`(\2`(l2`(r2`4|&|b(d,R F2`2`b 2`(2`dl6pVN@ 2`Rpb tpz2%tpDz#@:2@`@)@)@}@ݪK@)Ty@:p@}@{'74@$9~Z@zKH@)p@&N`@a@8@VN@)W@X@:@}@%%@p^ @' q@k@)Ps@zg@$9!@:d@)p@hp!@y@ 2`LhW@hԀg'h_Ms:hg_M~:hh_M:hs<hRz;K8h WhRh74h S(g'hWhMhK Wh|hJgVhu~h-gh"z&Lh,xhv.hz?Th*vWh4x!hPv,LhErhz_Mhމh}hN.h&yhHg h_Mzh!hth: hhR N"hh#}h;K4 hgxh2(0&h\gl~h2h 2` (:pVN })W  #" "HHNN"000000 (  (g{'74((s JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC@LOGIN.CMD [000,000]ASN XXNN:=SY:/LOGINBATCH.TXTLB0:SYS$LO GIN4[1,2]LOGIN.TXT HEL -- Message file error -NNNNN 2(^w  p0 2 E E ~:d X}p^ )Ty' q)")&%%()p.)p2hp!8&N`<2`D2`N}R%%T)pZ)pfZ` %    & W -4*  } )p%%2`"2`&:2(p^ ,2`4}:)Ps<$9!B)PsF$9~ZL2`4 N2` T2`* X2` `2`\Е.  7 H0 - (%1" Z%᭖z: 2`#ya} `$&N`*2`H02` 62`:k@2` F2`1 J2`" R2`%V2`᭒8E S  S S0 0`e c c c6Rɋ 02` 2` 2`8 2`EFݪK l2`6>ы ɋ% &55e 0868"b tz2wMtDW@@$9K@b,0@<@;@k@:G@\@:2@[8@&@V}@zwx@z@)@+}W@v@'ą@}@ݪK@D@R@2@74@#""@W@~v@zS(g'@df`'@%x@Sp!@<&%t@K@2xx@@n@\X@&N`@-@*f@Z@:r@zgV@2@u~@,x@a@[ @d&gY@z&L@-g@U[}@}]}@uX@v.@@nH@z:s@?T@@r@rm\@^@_M@G_M@Xv@s,P<@:s@4x!@f@r@~@)W@zK@މ@:"@#@&y@}@%%@i@*@g @j@G@!8@G@_Mz@zl8Y@p^ @'I@;F v@'I@Df@yhL@k@@!ht@: @_M g@'8J@'xx@ N"@z@u~a@;K4 @$9!@w@Dh@*@k@k@hp!@u@gx@y@:_@ݩ[}@z:4F@l,p!@d&T@%L@H&@ @)@)@005&%}B~FuNnHV}Z!ht^Ԁg'bd&gYd'xxj}p+       6  l7 /7/R5r'8J S(g':Gp^ ?T?T 2`"?T &&4%%8k D2`H}L%%dgxpgV|-tTJ7 .mA'B5! 52m4 2/ |gxgx}~[ &0bz}*Df,s(2gx6*8'I>BvF+}WRݩ[}Xv^v2dzjgxn} ' ( F53@,LB6  lE6n 2`} %%%%,%%.gV2 3r42xx:@>2BnHJl8YVubnHhulupituX@7  7 f--" -)   |2`[8)W} $2`,s.T; z42`62` :2`BsDT; zJ~vL2`"V2` `2`r2` !5<B5@<W,RTW,HT5 <5      P!ht'I ~$u2nH:nHZ!ht^:"d:"h!htpnvnz!ht8m L5<e ѥ,0 w0 wPѥ]7-l @r4x!$26_M:FNGP}RRV^GP}b.f_M:j_Mzv_Mzzz&L~. 55 7<7476  727> R && ez *f 'I e_Mdf`'!ht"M(.28>2`@D2`FLR,x^l05UE55 E 5 5U@ U|<\<r$r(\X*<24x!6:> 3r@2xxF^R*T'IZ4x!b-ntyhLz  U u  pwKwh4 t   mɝ\2 .&RF2 J2`KN#""PyTa X2`h\:sju~avk|: (f7 ht  X mÝmנ ננ ߃" נʕ 7 j: 2` 2`h:s:r:br $u~a0k4: 62`:: @: D: |2`\[&  & 2w/W ,,/& wW ; ] //&  XkZ .8Ԁg'>ZBRLkXkhlRp:_tx.|:_~ !ӕ     / 5E  W@2`"W@&kN 3rP2xxV%LX005&&vATADATADATA}) \}`'ąb)f<&%th)lhp!r}v%x'ą x)|<&%t  &5& & +njh)& )D)hp!&N` u~a@T; zB: J2`nN:4FP2`j T2`hAZ"09$'!-. _ `z  A A A Eȕ0PЇ7 zv. ~2`7 4  N 7fe 1 ---)-%7f ~ `2`k: V}"2`(!ht4W@H!htNV^f!htnv.zgxt ] 77.e$7 et ׭%  "z!htމމމ މ$!ht&މ.!ht>$9!@: F: L2`PK \: ^$9Kf2`p2`"~) 5e.&'7ע ע/ ע`עz 7 5X 2`2` "2`(-.6gV<2`F2`l2`rgVv2`|-  2 2 2 Ҕ~ר:ʕ:Ҕ~5    %=x ;e&08- H2`L2`Vhu~t!htx'Iv  .eH "7n787: eNf~BI f8E:ee& 4;K8;K4 !ht L& N", N"0}|v,Lp ȭ Нȭ Нȭ НННН 0 n , 5u~u~u~u~u~&u~,u~2u~8u~ <&y@!ht L2`P:2V: \k`:sfKn*^ 5wZ 498m 5Z525> 5Y5<@Y5b'I _M g#s<}j \gl~$4x!0.6R<~@uD̃LwPjX!hth'I jd ՀY5lf5 j5 l5 h%" ¥/ @ &fv v5.u0B5Y5 28&gx,gV0kb,0@s,P<Bl,p!VV Q| #} K Wpp, ||  #} ,(  ^ p" _Ms:W^"p$&!Login user Login failure &INVALID USER SY0:ASN F:F=SYS$LOGIN/LOGIN/FINAL[001,002]@LB:[1,2]SYSLOGIN.CMDM%Y %2Z V BL [XXX,XXX] ] System  ^  Logged on Terminal XXXX as XXX123456 Good Morning Good Afternoon Good Evening ff;Zx0N005&&vATADATADATA %,JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberN "$&(*,.02468: <>@%B,WOctoberNovemberDecemberSundayMondayTuesdayWednesdayThursdayFridaySaturday]66        H:74:s$: (V}*K:>BNRVbfvz! SYS$MONTH_01SYS$DAY_0 SYS$LOGFAIL_ddnnnM^@ 2(t .SY005e.77 7 5 t  ~ K WK W-!ht&K W*K W.}2`6&N`<-D4x!H4x!Pp^  T2`Xz h2`lZxpZxpE Е,E P S 9 !   2`z8 z8 2`z8":_2:_ 62`>zY L2` T2`X}\gx d2`l~ t2`!x}|j p*   Е Е  6W EW V  pf  ~ 2`* [(}j :_ "2`&}*u~ .2`6 82`E B2`VF} J2`NvWRv.\4x!b}jS(g'n:GzX  7   f& - w5G5&0~p^ ?T } WS(g'& <$K W.GP}2K W F2r-J#LyPaX%%h-n*_Mp'J v2`0  Е:P~FP~,7zd5 &SY &- -l%% %%:_z&L_Mz &2`F 22`,62`z :2`dL 3rN2xxf%% v%%x%% ~%%xJJ -      .  ; (%% 2`J#} # z &2r ,2r0#2y6a:p^ >:DkH:2RGV'I`4x!l} r2`(t2`V 5 5EWE5E~z&L2` _Mz 2`2`_M~:2` 3r"2xx,*.'I4dBa6:B\fDJMPx   FE&f5UW  `5<Ve@@ѥ]5OW `\x }4x!~.-6-:b,0>l,p!H_M: P2` V2`^!htx 3rz2xx LUf&  Ee* E 0e.7:<7 >GH0:h - 2r 2r.-4- :2rH- N2`0V!ht^2`:d2`<h2`>n2`H r2`000w$f&& %wB~fD~  t 8 2rDz&LH_Mzl}p})W t2`z}s^q5 %U 6+%^   %^ g X 3r 2xx_M~:2`r&p^  *2`^,2`22`64x!<}B2`F4x!L} T2`^V2` \2`gj|ы 7~1 XT $%z2` 2`|2`.2`"R$2` (2`~ 02r4#6y:a>XF/L2X\f_Ms:dD^gД _  ȕ |Е ННННЕ:Е | 2`^2` 2`gKlp#y "2r_&a .2`2u~6?T @2`|HK WLK WPK WTK W`_MzP~Е e ɥ P~ Е?Е?Е ePɥ ?Е ȕPЕNȕPЋЕ ȕS5ЕN(z&L!ht:!htX\xM ȕSЋЕ ȕT ȕBȕV & ʕ  Е & && & & @N  g D}*0:<,x@[(}`< l2`p_Ms: x2` |2`g & ѕ> ȥ  ~~   5005&%\x@DH8L*_MN'JT/+\jn r~  E6w P P d V5&f 5~ 3r2xxy 2`6 y $2` (2` .2`2v.8GPvWTv.\*^'IhH&nW@rgVvz,: ~&~ PPH @ 5&w !%P Д~Е Е[ Е, Е]Е T ,:&,:  ,:$\gl~, 0rm\8 3r:2xx@WD,L" J2`PG~  fv#000P  %5 YWt7 ?0 0F} G_M2y8# z:yFkN ^2`bAXMh2`n;F vx &  B5%HTE3? 05^`J|;F vSp!~"\_M$*0nH6XJ;F vNPyTDhX2``}hM n2rp2`^v2`` z2`J -y1-pE5  .    V7   B rs$9΅ #}"# z*M0M6-g :2r B2rF} P2`V4x!\;K8 d2rl N"p;K4 x2rp A"   w    Е Е(PPA Е:Е) jL L 2rAL  G$?T*G.}24x! :2r>} H2rP N"h:_ x2r p UE^`J-1UEw ȕ Ae f z 2rp }\x\f 2r"2`^(2`` ,2`J4s6$9΅D~T#wXyp@Q x2`fh ~ Le0wzm   -A  ~ ԕ @W 1 e0wb2`~2` 2`z 2`$2` .2`6c&G;@sBT;wLaT2`~r2`~2` fm   6 ~Е .Е,Е Ael  ԕ,ԕ  A l @5@ 2`f 2`2` 2`*2`~H:l:tl x~`  % feE 777^@w @D%  E& cZ\r&2` 42`::_ >2`B2`F2`J2` N2`X2``W, # `5% mf s@  2`f b Xz3XDfWH <&@;@`@̫<H}@'HfYHѫKH'@s@#""@z H H$pHM@a@@6 :@0# @X@,z@}@%%@̫$ @d"H%n'@zd;Hd;Ht @d"Hy@ Lhiqh2t'4h'hZ `^h\̫=h>ѫh;PhT dhb:@yhXfWhMh^shshhsXh&  ;{;SY:HELP[1,2]HEL -- Cannot initialize file storage region correctly HEL -- Unknown HELP qualifier HEL -- Syntax errorB BQ3LB SYt <&%&& 'TTHLP005'&vATADATADATA} bb `   777"p& a  -  `X }s $.%%>}BPT,zX%%\%n'j6 :n̫$ r0# xM|r` 4!/ ` Gw~ wr`%%%n'%n'"%%*%%.}2`6}HGL#""NyR}\~bf#""hylap;b z3 zD@@t'4@:2@`@'@@ `^@)@)@'@)Ty@}@z @ @:t @)p@$9@P@9x@<&e@@y@)W@)p@:@}@:@M@j 8r@=@)'@@=@)Ps@S6&H' q@)p@:@hp!@  Mh  ??? -- 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 -NNNNN ??? -- HELP synonym not found ??? -- Ambiguous HELP synonym ??? -- Excessively nested or recursive synonyms ??? -Ft- Help file is unavailable for  0:22 4'LBCH  ( ( .MAIN. ? 7 7 76<75BB| lw$x 07 bԋ  @w67 27 *6B$@y(', `^2 `^>t'4H:t N\ X =7 7 *E p <9|6q  cwh[X7 t'4&t'4Q28 V f4 T `  wC `H . 0w*2 8$t'4(ZH`hr~t'4T r  !     p  цwBr nPr)p)p},)p2:)pJPRPV)pZ)p^}pPtrv)p|)pP &5 P p߇ ^܇74ق&7 %i @wȥ ȥ ȥ* .})p )pVi^Pb)pf)pL "ȥ$ȥ/ ̥/  ( W 7 7     ¥ ¥ ¥/pr R   28 U~P )p)Ty )'$' q&)*' q,)0<&e2)6r8)p>)pBhp!JX`@f2l8pPt 8rD2 H 1ȥ9C ʥ ʥ ҥ@w> p   w 2P:^j=p:ȕ e 7 518B4-*RX 7 f7 d5!: @= P$)W(LBTZRxP|$9~)Ps< J:F  w0  w   T%'   n wJ(9x09x>BR)Psdtn Е. w& \w<6W!B ppppwdwb  \ :&P* 8r>)WB)WF)WJ)WXBb)Wf)Wj)Wn)W4  CBw C 7ʥ ʥ ҥ=#&   v -=  :4>v=  7w07aA7WU7RK7> "  4 (  $6`:flpPvt,   , 8A Е.) ыѝѝɝwы4 t&J` t'4$)Ps(A.:8)FMJMNM^:2dF b Xz 5*}005 '%_$:[,΀]&o : : :> $(,6:>B L:&NI :r7   7  ` 8/    J "$ &$ v shsXP*fW[8 @LiqP$Z; ^iq`shd; diqhshd; pѫHn  a shd" ѫK shd" ̫=shfW ̫<shfY  }*,shfW 0shfY 6sh8sl    &f ~shsXssX&*',)0hp! :>#""@yD}NPPVsZ\d"`}bd"hs~  / pe5 &fY  & wd; } d;:2*}0s46fW:fYJk TYX#""Zy^}j p&t#""vyza ;nb 0zg0DX},@ 3r@s@:.@$9K@#@:2@[8@`@V}@wx@'ą@z)@)@u~@D@:@}@;@# z@%x@z}@<&%t@@:br@;F4 @:r@zf@uX@@eĊ@:s@nH@?T@:@:s@s(@)W@K@T; z@*@l8Y@z @:w@u@u~a@@$9!@hp!@u@u@DQ@x@x@y@@CT@z:4F@ H ;dvhKh hݪKh~vh2xxh~2h|~hG vhih#Khx'Ih'IhH:hzh( Old password: New password: Verification: SET -- Old password validation error - password unchanged SET -- New passwo|rd verification error - password unchanged SET -- Illegal password syntax SET -- Account file open failure SET -- Cannot file physical LB: SET -- Account file record(s) locked SET -- Timeout on response SET -- New password must be different ftrom current Your password has expired. You must change your password in order to login, or enter to abort the login process. Login process terminated SET -- Password must be between %D and 39 characters - retryLBtl? r4 4$ r< PH :sr4":2,4::s@r005'&vATADATADATADV}FK\wxfr}," h4v4*::w:.  h4v488l lvvx l5(@m?DFHU ߵ@Y`u~ eĊ CTfz}xx;F4  ;*x4l:@*HPu @YU@E5@  d \$f• •  0 :DDQ s(*08HT:`:drn    -E 8-U *j U  "0\`w 5`w|w,5l0\`,LB6  FlE6 fH"u( 3r0\8nH@l8YLuPTXnH^ubujuXfwHU- -7 7  -w)  wFDs("s$T; z0 8s:T; zD[8)W} ` RSw5@ Tw0l N\P=ghiE<  wV*2lDflp:2^ 5@Uw'ҕ ( ,w% Dl fpt L}`DQs(# z"yNDVl^ppt:s:r:br    RÝm|xנ ננ " נLנ5@w  F u~aVwP7 4 5xtpl P1e5@J 2"---7DV}bV}f z752ev)p7 fet ׭Z%Lw ) (5@*$9!<K J$9KbN 5@ 5@t%AZ09$'!- . ` ( z &f)&9& & +N"J@p)& :u~aZT; zh:4FnpF )w^  ы4 tw>/+j(% F,}0%x'ą 2)6<&%t8) ws(# yb pz_pDX:(}@ 3r@@#@<&Kq@p@2@;@# z@#""@9@<&9@zz}@@C @;F4 @4@uX@nH@eĊ@T^@a@w-@?S@$9΅@:@o@z}W@\f@*@l8Y@[M@w@ѫx@ @@:$@$98@@*@\_M@u@zu@<&D@y@x@:_@x@CT@}x@d&T@:4F@ݩ[}@@@S@s@ zy<@ h Kh | |P}W}x0 In memory of Marguerite Carroll 1914-1997MMALL:LOG: From }} to  <  l;F4 weĊC  x"x$CT&[M(2*4,ѫx.z}0;2 8 @ aa7]7 7 7 7 0 b ` w fhAOTW:#W W ы| <@ <@a005'%<@ FsH$9΅b<@p<@8v<@ |<@ ( Z -1)~ n:te& & & & & & & & & & -17 7 H <@ s$9΅ :<@Z:4Ffsh$9΅v<@ z<@ ~<@ ,    Е: %   wj 5 c    x <@ :_ <@ "<@ 0<@4<@ ><@ J<@R<@X<@  ^<@c h<@  n<@ x<@ |<@   w`  &f] ` P~ P~Е:Е:75 !" m n: r<@ <@ <@ <@ (<@],<@ B<@ R<@V*X<@ ^"b<@ j<@ v<@:zݩ[}$ W P~Е Е(  НН  Е:Е)w  \w YfvEf<@ <@&<@ *<@ 2<@6<@<<@ B:_J<@^od<@l<@r<@f& % 5  & & & & && & & Ε -15  b$98ss <@ *<@.*0<@ 8<@Vw-bsd$9΅r*t<@ z<@L 55 ť  w ̋% @<@  <@<@ 3r<@ &<@ 2<@<@  Command input errorPrivileged commandCommand syntax errorIllegal device specifiedUser not receiving messages&#""#""/#""F#""a## Unable to BROADCAST to slaved terminalToo many terminalsALUN$ failed, DSW = QIO$ failed, DSW = Message failed t,#A#""X#""n#C o reach Can't find I/O outstanding after IO.KILLsBRO --  #""#@dd&f&Ĕ=  ĵ ĵ 6 @& & &  &f& & & Ε -1ĵ*2<@ <@= *: <<@6 ^:$jsl$9΅= hf P~6 @& & &  &f& & & Ε -1)ĵ J <@= <@h <@f <@ <@6 <:$HsJ$9΅ h<@l@Sf\B WaWz ~* Е 0 Е:2 Е   & 8<@*-Qhf 2xxh[ h2h /+hzYh0fh~h4zih>xxhyyh.;F vh'Jh'xxhDhh _Mh-h<hJLh:h 'IhKOhv gh(z'Ihrmph Sp!h2h XPihrxxh$zh2Tq8^h"2h8 hv gh,vPh*x:h+}Wh2hh6y(J ASN =/LOGINDMO /USERASN = ABO AT. BYE -- Syntax Error BYE -- User not logged in BYE -- Exiting BYE -- Error or t|imeout from spawn --  Connect time: +N hrs mins secs CPU time used: hrs mins secs Task total: i0i XX-XXX-XXXX DDNN: logged off XXXXXX c Have a Good Morning Have a Good Afternoon Have a Good Evening Have a nice dayLogout user :$$;Zx0NLL\PP j :2jnnA jnjnx hhpj6j (457:X'f  ' q*   @LB:[1,2]SYSLOGOUT.CMD   $$Q88 TT)  Q|   0;F4 a o ^D~먓wH/HHwew eĊ";$C &x(x*x,.CTb' BeU?` ~?!|p [M H24ʫL ѫxѫjz}y F"gr$.:BLZ^[(}zT7 7 7 0 75  5h,HT ldU8T$`Х/ (ȥN.Tu8 3rLnH\D^s(dTjsȥ- ȥH 2ȥS    ȥX  ) w5p X U 5 E L7 @)H#wLyP 3rXpzLr  5w> ( l 7 7 && & & 25x h ,VT  6  T  @d&T@2L\XbnH j LU  P   (E   &   CDC,3 . "28L duXjuXpuj5 ww> CmE5nXVmHO hI: ` <A ZCn@ *nH> .u4l8Y:*BVTbݩ[}jU[}x B&>m "m" 2  5 C{u l  >ݩ[}0bz}(:ݩ[}BU[}Lݩ[}TU[}XpU[}vzs|b      AW,VT mPRB5L5^ (f d:=W >zsɪMɪM :nHN0bz}RDfTs(Z 3rn| W W  >j F|eɕ I  P~ i7 ( 5   5: &j2|B}FZif 3rrGz ~*Z  5 5E U 0 0 5~mZ?&N j 005,'%*_MV?0  &  3rt6j<~ R  5 E?x)& & & & & & & & & Ε 5f  h?,` tE,t(F$DDQ &s(T:74^* Xzt jw P T!BN-XJ .A 5@5<  '  .5w-& b j# zy  t.u@#?T Bs<}H3Js\T IqlDfDx ns(tuJ A f   55E % ! w2& -Fpq #{#{~.DfDx 0s(6 3r>t(FHt(FLtpu~ 1)Xw 84P, P P~Е Е[  6s$9΅* 8l6pVN@ TGXbB Е,  Е]Е w @fՋ wTNN-#1 & &-1<:_:_"}&G_M@#wFNsP$9΅vsx$9΅ & + -& &    T~ j6 ,ыѝѝѝ# zT^j: 7ы wR-41& & +R-1.R"s$$9΅XT; z`:4FfRnsp$9΅ )w& -1) Е  Е  1 . < :2.s0$9΅JNaZ@Qdhlr}sx X2 ȥ ȥ   N F |   T '  -0 (0D Rt:u~Vnvt~u%| A b .E  -^%| %| 56@e(< L nHpq#{~(t. >HuPnHXnH^#`s<}la|<*@e<D   e< e< e em( Wpm Dr~    " AB&   A < 7T@r<wF p9 0 `? &" |w&& & & 0BP~50>m 5 >(#w,y4JV#08 f*n0rn   ݩ[}b Oγ2\X zOγD :h >& NM& & & & & & & & Ε L$b zxXD@sh<}@}9@2g@HCT@ʫy@# z@g@#""@9@G g@z}@zir@C @F@J@ ~$@;F4 @$9s@mxx@4@}@g@+3@ѫ@6s@uX@zLT@eĊ@nH@mh@g%@?T@sh@:s@w-@:@@$9΅@1@ʫf@}W@zsh@H @@}@@TS@T; z@\f@l8Y@ѫx@>M@Aq@S@@:$@z\_M@@@7{y@s@T*K@7{y@u@x@x@y@:@@CT@H;@z@:4F@2@@dhzd@+{p@f@^@8@x@@s@#Iy@#w@@rga@u@yrh6x;04 :h Cth x;( x< Shut down program Enter minutes to wait before shutdown: Enter minutes between messages: XX-XXX-XX XX:XW|X Please finish up, XX minutes before shutdown -- Reason for shutdown: y0054'&vATADATADATA 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 no4w 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. SHUTUP - VCPRES.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 $ELIN{INS $VCPRESINS $VCPVCP DISCONNECT /ALL/BLKS=0. /DEV/LOCK=V %Y %2Z  Q|- 0E  -0;F4 +{p >M G gH HCTH;eĊs6sC xx x"$CT&+3(1*2g,.Aql*$      24  ^Jʫfʫyѫxѫz}F}LT$,6: ~$ <N:sXf:sG ,|Ol|||)!| | pZ(@Xp       ~}WZ ( @Xp "$(: ~$ .@: ~$ FX: ~$ ^bZ       N: ~$  : ~$ "4: ~$ :L: ~$ R @ x;F>755W,TT@, w<PPPPPP  0 xx<f x<&\f(.2nH:uX@u Fx<N#"" Vx<Zx<< jx< rx<|& &ЕIЕNЕSZ7 7  ( %  Dw55 6 0N &x< 8x# z@x< Fx# z@x< Fxx<Nx<Tx<Zx<)w w 7 :5U <7 7 5@6 %5" & t x<x<x< x<$x<(:2\f4:\f<x<@\fBJx<Nx<Tx< Zx<` &ЕSЕEЕT T77 7   l %5" & N x< *x<2x<68x<<x<>Bx<Fx< Nx<&ЕQЕUЕE- 5# * &  &ЕSЕTЕO  >2 x< x<-(x<.x<* Zx< lx<X v  & &ЕEЕL005<'%x<BTLXx<@~g ,@ E  " & &ЕVЕCЕP<sh<} dhzdmhx<,mxx2mxx ^x< px<& &ЕDЕMЕO  (v F& )Cm Eww. x< 2x<>vFTSHlutl8Y5 ;4EP~ C(E Е ;& &ЕSЕHЕA D x<x<4 x< .x< 6xx<B:$ Zx<\x< fx<h$9sT   ) w=W D&A f) W!7  l w  & TIX "x<$x< *x<,T; z 2x<6:4FTx<^ubhx<pl8Yvx< w .ҋ&E @ -1'^$x<(x<,#w.x<4x<8\_M:@8 Fx<Nx<dsf$9΅ xx<L 5\ : ȕ & ) (E9AA555  Bhx<\ x< x< ?TJ Nx<(Xsh^g%`sh<}fghsh<}nirpshvdhzd|x +#+')y:+ؚ+ׯb'%ׯ(%ׯ(%ׯ}Dxׯ%ׯbQׯ&ޯ9w'B?T(T௴d)$4).=@DL=) +}Bb*<b,t .p,<.p,&.p,&.p,'B.&.pAXC -tDqBE-tE -tFt -tFY-tF8w-tFhy-tF-tFP-tL-tL-tM-tO-tPr-tRt -tR -tRBx-tR-tS,S!,V:w,tKbweGLwyGLX,ᰀ,ᰨ,}1V!Q!Q2Q:2?T324f45N,8D,8,.8A.8.8.GLU :U wU KGLH2;Zd?T:Q(Q7QH:%:=@:tw<w<,x=@z>f2?ѱ}?ѱ2ALԱ2ABԱ3BԱPKBԱoKBԱpKBԱqKBԱybձa!ձK8TVkxBhL.NJGLGL8NJ2Qy:MrME}OO2OO*KOPKQcKQoKQpKQqKQDxi`GL´<kQ oQ:d]oQrZoQwb tQ[M xQxQP|Q|Q|QP }QjQDQ@GQwQxQ(}Q&xQPbQ`rQ}Q!Qw*UQ NQa"> Rc$Rb'%R(%R&R8w'B R?T(T Rd)$ R4).>R=)>R +Rp,R-t!S& .!Sf.p3S}1VWS:2WS?T32WS:d3WSv4WS4fWS4WS5N[S+8\S?T:^SM:S2;ZStw<Sw<S,x=@Sz>Sq?S2?T}?T2ALT2ABT*KBT{C!TT[DD'TЉDx'TFZ006L'%TMLTL.TMTNJT2OT*KQ U]U W(} |sVzJXb tXzkQtXD$9I;@:@$9 @$9f@ѱ}@p@;F @tw@rh !@,x@}@ kQ +h kQ & $@?}#@@eT TR ?Q A8@     @<$p rh !";F F$9 J,xTѱ}b: l$9fR|& 4hj Uh6eh t 4 &4 ( }$9I;Ftwb pB|QPpDo@ |QP <h< |QP?m<<JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECQ<<w EeW ɕ0ы~(eɋ e % % %   11 `   oRV  B 5 %  Ce  ` %# #$)& &   BeA @ S t% <4.0fU U U M U B A eU M eU U M  D0% %D0%  a a D0% %D0 a : a&    bA @ l@ l s s  b t0bW(}t0DK@o@i @i(@@ W(} *yhB W(}Ei*JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC%BBw f eCXCXCXCX    w,e eB e:  @ @ C: o@Fi(bi `UC B d `eq XW dUf   <a @  W f r i i ,KNd:eeUUU \ 'e %< f< f @   e e0e(,2i(Di Ni Xi x 0Ub :Q D Q 6i h Q :&f!  E D  E E C B Ί Ab t0JtQ[Mt0D$9Y@/@ tQ[M "4[Mh tQ[M&  6   B~ /$9Yb NRxQND$9 @8@=@ xQ 8h xQ @ E x=8$9 vb NrxQND$9 @#{Q@a@$9f@@s(@Df@ xQ 8h  xQP@5@eTTTR  e ~W K ɬɋ eJP #{Q  aDfs($9f($9 6$9 B$9 \` |b N@z|QN@D*y@\X@$9 @<@$9@˪ @C @\h@ |Q \GhTh@´<hR |QF e. -.  &&. %( $9 \h($9 <\XD$9RzR J BJ e<׬eB J rœ  e @J J DJ\hBJ*y4B:˪ B˪ TC fJj<nJt\Xb Nz|QND\G@E@N@NBNDhN$9 Xdwt$9K   @?@5E6h5-` "##5?TQ $9f$9  $,p0rh !2;F Z$9nYh$939:h#w" w " wA*w$w  FB5h  EHׯ Uf $w&:Fy0:6ׯ(>wyZ$9 t$9 zׯb'xhw " w "7 Uhw  7w` #t( &tF D @#z Uf w:Fy&Uf *w,:Fy4wy>Uf BwD:ByHi`Li`P$9!Xwy\wyt`(t &t`Ft D IFu* *Bw|w "- w  * V$9!$wy4ׯ(JUf NwP:FydUf hwj:Fytf|H2p ׭ w "B`wfAW B    ?5CԱoK i`$9!Uf w:Fy,$9 l\Xt$9 yh Ehw "  #4* Uh4 &4 (4 D4 F  " w "H ׯb'Uf w:Fy.2B%:pUf twv:Fyh ,Uhb OzQDOD@Fhy@w@<&@!@,t @Pr@Ft @t<@@@,<@zUf@h@C @L@,&@FY@ԱoK@E @O@T[@b6L@F8w@:Fy@X@RBx@B c @3U<@y@ QD l\DhDLh QD&f  H  0H0 .t.  P ~PR~  ~ > t<<& 6>,&B,<F,t JXNLt c |=@#7*" w " f&  m(N m&(&-V1  f c ! F8w$Uf (w*:Fy4ԱoK> c 3U< FXb6L JjX~T[x 77 77r U77H70e2P~e<  PhFhyF8w&O,Pr@PrFFt LRBxPFYhC lypE ty$b t0rQ@Gt0D\G@*<@k@y@Vk@we@)R@\CG@ Q@G P\@Gh Q@GTc   4$4##  e  2 \G\G)R\CG0VkB*<FwePk@yb t0bQwt0DTq8^@x:@ Qw 4\Xh\wh\hh\h Qw82&@ C2CD  2Tq8^ 2*Tq8^4x:b t0BQxt0DW@ Qx j˪ h Qx ZA90$ .Gf@(w f    @SqAa ߇   WTb t0RQ(}t0DW@ Q(} F:<h :h:Ph Q(}Jw  w w  @ rf    e0WWWb PzQ&PDi`@6@w@@\X@$9 @2@:!@$9f@Աy@$9@t006\'%weBR:Z:+h:|$9- 4- 7 p 5 #w   W- A W @ e >ձa\CGwy*i`6\C^>TJT:n$939rZt5-w &55 ""fE5<$9.$9Kw:w$i`,i`BweNPsb t0zQ`rt0Du~;H@@tK@\G@:2@JL@=@AXH汰@a@@z(S@@TQ@we@:s@:p:@s@~@ѱ2@@:@4@ @ׯ}@&@zޯ9w@@wy@+@@z@X@8@y@\CG@\@G@ Q`r J[h hBVkhShh2fhv\C^hEh4)Rh Q`rLv7  |ztK=tKtKv+ +"+$&汰(*4,&.ׯ}0ѱ22tK488 Fޯ9wH  7 7 7 w  , , , 3   4#4 * ` we &JL*X04we8>:sF:2N:^bwevwyzwy  # 7  w  &f # $# DEj:p:TQ"we&a,(S 0\@G6a:\CG@H\GPvDz~~yy @ssfb OzQ}OD?_   | `:#@'=" abcdefghi jklmnopqr ~stuvwxyz {ABCDEFGHI }JKLMNOPQR \ STUVWXYZ  0123456789 7-./% <=2&?'"5@Z{[lP}M]\Nk`Kaz^L~no|JO_mytjС7-./% <=2&?'"5@Z{[lP}M]\Nk`Kaz^L~no|JO_myjСb ORRb'OD`@@2T@ Rb' ׯb'h Rb'# w `2Tb OzR(OD:2@$9@:s@h@T; z@r@ԱoK@T[@wy@$9!@ׯb@X@2 R( ~ׯhPׯ(hׯ(h R("`! -EO׭V W- W-  ׭F # 5h fԱoKXX,:24:sԱoKDXLXT,'V$9!ZX^T[$9b NrR8wND@i`@@w@Աy@:t@w~@ R8w Bޯ9wh R8wF# 4#5w 7.w~Աy(i`.w0:t6b Oz R?TOD@@*<@K@T@nH@we@˪ @,@,.@@  R?T ?Th  R?T&f&f#e & S S  EWp(E`SS   :,"T0˪ 6˪ BFnHJnHNKr,.0|   @,A 006l'%R=OD@ @V:w@&@y:@Wx@Wy@WBz@\C^@ @$9@,&@jH2@Ա2@*C^@#@wy@$9!@'@z@ >R= =h'h >R= 7    -*w w 5w w  y:V:wH2*C^$9 wy&Ա2,$9!.wy< @F\C^VZWxWyWBz b j'nzr#v 0 4-*  - w w $,&(&.#b Pz>R PD6@\X@@$9 @Dq@'@$9~Z@we@\C^@H2@Ա2@wy@b$9!@\h@ >R   h ؚh&h>y:h h#h 'h >R @eTTTT @ CE \A7 @5E%0 P~PPP #0&$9 ,'8\hX$9 \j'tx6 5*0 w   z  w -  t*5 G"\C^2Dq>H2BԱ2H$9!JwyPV\C^nH2~$9~Z 2 @Ee * 4* *5*55 &fetX~5  5-25-4 we\XN5-6 55-8 5  5-:-   w&f5&:et~U%HN\C^  e2~b NbRpND Rp S!hV:whXhᰀhVShᰨh Rp b NzRND!H-{2H3UC hQRhLhfLhFYh8E h^OhF8whMhRBxh c h R<~BBX X000000eeVb Nz!S& NDs6!Hv6H v6zHv6,_H%v6_He6<H/s6Hb6^H2v6sH v6sH3c6Hv6NHOzh6Hh6Hf6H5r6{HIr6H r6Hr6{H4s6;H<s6?_ &f4 44 6 & t2  t4 t6 . t8etf~ h(*Xf68 2˪ >˪ J˪ \˪ |&f& & W%W!  &fWpdK&  e :L Xf68 *Xf6,x 4D>Xg6~! BD`Xg6! dD w&f t< t> t@ tBU&pf&4..40.H4II(Xc6< ˪ $˪ .˪ 8˪ t4%HD%R2w6Ep&  e. a CHIrנU4HנDZ ᰀ&ᰀb6^ 2DHᰀb6L LDTDdᰀs6<  jᰀs6<  Hŝ"DE׬C"OSYW UWA I%DEG%DED%CFA%IL>%E1;%1A8E p006t'&vATADATADATA&  %> ᰀs6<c6 Xs6; xᰀs6<l6( |DlH%HD!%R3EpeD&fe@ " #@  M~AEff t!ᰨdCE !W AW ZW 0W 9W aW zE ʋR?P~F2b Nz3S}NDi`@w@@@Uf@h@H2@ԱoK@T[@$9!@b6L@:By@2:Fy@X@ 3S} }h 3S}@#" w " -EO9-F1*&feD  ׭ w "vUf w:Fy&ԱoK*H2.X6XNXb6L R\ԱoKbi`d$9!lUf pwr:Fy.w 4" -V1 0Uf  w :ByX"T[&hb NJWS:ND@@ WS: :h WS: 77#b OrWS?TODK@T@nH@˪ @,@,.@@ WS?T ?Th  WS?T5 "M&f @e &   PR  S S (,*THNl˪ r˪ ~2| EWp(E`S nH nHK&,.Nb O2WS:dOD WS:d Nb N2WSvND WSv b PzWSPD@$RH$RXH$RXH #{QH$RYH$R6 H$RfHS@$R|(H$R|\H :@z$RH $RzH$RH$RH$RH $RkTH$RH$R=aH @@ WS .=ahhR]hhɪxxh WS*#   w :"&S`b NrWSNDi`@$R@Աy@$9B@$9@w~@wy@ WS zh WS~5&  4  *E*4  Et *D4w~8Աy<$9B@i`Xw~\Աy`i`n$Rpwyr$9fb QzWSQDi`@v6@w@v6,_@6s@$RX@S!@V:w@$Rf@z@@T@z$R|(@:t@D@iw@R]@Uf@@v6N@TS@$9@$R@w~@ԱoK@$R@x@zf6,x@wy@@:x@$9!@v68@T*K@X@Kq@S@@ WS h  WS 7 4 4  w ,7w `w& -VO-L113bR]R]*T8w~<w>:tFUf JwL:x^ԱoKdXlXtXv6N |42 ׭5p   Ef0 f &  p$Rwy$9 $9!"i`*i`2i`4wyJXv6 P$RfRwyV$9v6szXv68 ~6s ~P~WD+W$%B( @0  \~&f& E  a PXv68 $Rwy$9.Xv6,_ X^R]rDv~DtWDW$D% W% E&Հ w %%a 5& NXv6,_ *R]:ԱoKDxLS!TS\$RX^wy`$9p6sTT%   5& R~R~%5&5&`0  VS!Xf6,x 6s Xf6,x 4$R|(6wy8$9VdR]zT*K|.lEUw 7 4" @TS Kq ziw w:t"V:whb t0z[S+t0Ds@?T@/m@?T@006|'%nHBnHJKf,.b Nz^SMNDi`@w@Աy@:t@:-t@w~@ ^SM HhFThh ^SM > " 4 ,E 4, w 4  w &3t  70%BŠ‹44w6:t@w~DwF:-tbw~fԱyni`t| ΋ ‹΋΋A &Vf1@ANw~Lb N@zS2N@Di`@w@@Uf@T; z@wy@$9!@:Fy@ S2 ZH2h S2^&fe" ɕ 4 ɋɊw 77VH i`T; zwy6Uf :w<:FyB$9!HwyLwyXwyb N@ZStwN@Dw@@Uf@:Fy@ Stw Ftwh StwJ 5h& " w  w "6(Uf ,w.:Fy8Uf <w>:Fyb NzSwNDw@V:w@@Uf@$9@T; z@H2@Ա2@*C^@wy@$9!@2@*:Fy@ Sw `wh Swd7     " w "^V:w H2*C^$9wyԱ2$$9!&wy,T; z.wy82NUf RwT:Fyb O@zS,xO@D@$9 @Dq@V:w@$9~Z@\C^@H2@Ա2@\h@ S,x %:hh,xh S,x &f@e\8 1*#-%   w    -~3$$9  *2\hVDq^d\C^hH2nԱ26 % &f7 7*N$9~Z ,V:wyb N@zSzN@Dw@@@D@Uf@\C^@$9@*C^@:Fy@ Sz zh  Sz%PO%S=f&ȥR w ȥ0 & ȥ0Х9  %  w  ="(\C^ZDfUf jwl:Fyv*C^z$9 | Nb O@2SqO@D Sq (b N@bS2N@Dw@Աy@@Uf@:Fy@ S2 P2h S2T&  "7w w "F Աy$.Uf 2w4:Fy:ԱyBUf FwH:FyTb t0zT}t0D\X@+\}@E@ԱqKhZxh T*Kx  2   < *""7 7  7 7 Pz$9!i`ׯ"$98$9!:i`PXTV:wXXZUf `ᰨdᰨfUf lᰀpᰀrUf tw ׭ ׭׭"%P 4 @-HD-R1 7 77  rUf w :bri`$9!i`$97 i`"$9!4i`8$9PXXX`V:wjS!pS^7!f&e  7! 7- 7- "4V:w$Xs6! (D0DfhT[h  !TT[BPR4"4 w w w8 T&w(:t,0ԱoK48le<?T@\C^b t0z'TЉt0Di`@s@w@$9 @:br@f@@we@Uf@$9΅@:@f@z2@$9@ @wy@$9!@$9!@:Fy@ׯ@:@ׯ(@ 'TЉ 汰hׯ}h~Љhh  'TЉ## "w @7 UhEh  4 .Eh@A ( *:br:,$92 :>:|& P,# ߕ 1,# wWt$9 &2*f,f0 6 :@ DfJ$9΅Lsh2li`pi`rwyvwy|$9!W4 ׭w "w -e(t &eFt D  * " b$9!$9!ׯ(wy$9!$Uf (w*:Fy@wy\$9!bwef:lwyrׯt"7* wyb N@z'TN@Di`@w@le@Աy@?T@T@:t@:-t@T; z@w~@wy@ "'T hձ BR X,|e  $(`b NzTkNDu~;@[@Vk@y:@@Աy@/?T@T@@h@r@w~@:ԱoK@yS@\CG@ Tk JLh Tk #4#  w   ##@ # 5p RVk \CGw~(Աy./?T2ySu~; 6[DTPdԱoKhh~y:| wԱoK rb N@JTMN@D4[M@ TM lehh\ TMf& L&4 > 14 0p Be e  *4[M|e Ajb O@zTO@DT@f?T@\C^@tw@ԱpK@ԱoK@f6,x@x@X@ T zhh  T~&&  #- 6-a  ~  e4 D4 F  Ձ w:xԱoK:Xf6,x JԱpKPtwnTxf?T|\C^b OzTODw@?T@6s@cK@oK@:!@2@@T@௴d@:-t@Uf@bf?T@2@\C^@ԱoK@x@:By@X@ T y:hrh TEp0  & VOL1PPPЕ C~ЕD%B4444& 1   C~ 3  6s"XX2x2|&&  .  w 4 D4 F w " w   w joKxԱoK(௴d0Uf 4w6:ByF2JcKNwP:!\?T`wb:-tjTx\C^ wf?T \C^b OzTODi`@v6@w@Աy@?T@@T@:t@d?T@Uf@f?T@\C^@Rw~@ԱoK@:x@v68@X@ T 8hh T 4 Հ 5    w w7w 5p -VO-L1  5v Tw~"Աy*i`8?T>d?TDwF:tJ\C^PUf TwV:xdԱoKhXpXzXv6 v|p  wfe    ~R~~0 4"f?T\C^"X&v68$b t0zT2t0D@+\}@E@6s@<f| l+\}x| y|AE e` $  @5 006'&vATADATADATA J L% B~&=  7`EE c  \h48J$9NFt RFPFt  hC na}rE xa}e.&feHS~e0S~% 1    r5DPr$Ft 6RBx:FYJ:RC Xa`fE lat\tp%å  %r 04.0e > Pr,6sH2LcKb PzT*KPDi`@w@V:w@:!@t!@b6^@:<@@c6@Uf@:@[(}@z:P@f6,x@wy@$9!@:Fy@X@:@ᰀ@ᰨ@ T*K `hah!hL!h4jcKhoKh2pKhBPKhHqKh:2hh$(h7h 2h|2Thvׯbh T*KMA UFDDU  5p 5 p P7 ""w ׭z8X:Uf @ᰨBUf HᰀJUf PUf TV:wdwf:li`n$9!xi`zwy|7   HDR1et ~e2 ~  Е.8 aP~  4V:w XXXL[(}d[(}rXf6,x   :  rd C  e< ~rr'f  5 p DECFIL,:P :P*:P0:<B[(}^:<h:tE11AHDR2HP. 0 IePHЕ0Е0Е200HDR3eD&e  <ᰀ&:.::c6>Bt!Xᰀb6^ \ᰨ    ~Ee0%9eP  f( C~ V1V2V3 ,EOF1EOF2EO6PXVᰀ\ᰨhXnXtᰀzᰀRlF3w w w 4"  w TwXᰨ ᰨw:!w:!Uf "w$:Fy< DwF:!P:Pb Nz U]NDi`@s@$9B@UfH $9΅@T; z@$9!@:By@:Fy@  U] whh:h  U] w 1׭U׭--ml i`"*s,i`0$9΅2i`@i`B$9BJi`Ni`P$9!X:Fy`:Byli`ri`|T; z~i` |Vi`b t0zQw*t0D@TJg@z@iw@s(@nH@ly@Df@dz@T*K@Kq@ Qw* b P`zsP`D"HfHHFEHHyHHH HT`HHHkHHHHR H"H}H HZHHHzm9HÅHH XHPHHcdHHH HHWH =HHDfHHZHHZHJH # h  fͥ" ̋&   @  % ff&QE e @ `NA`c<2. w|Հ,ŀ(@ L @   @U@   u G   53 : ~̋    p  6݇u    5 t& 5  5  56   AAaf ΊP   @ P  6 w ̋ xe%8  @ Хȥ   ,8lAA wAf f`E  5 _Х*  BC  5 T   f : azE  + $& .! _0 7 9ARd  F Z5  ע ע  b ORJOD" ̫e rnJhQh d   006'% P$ 0 b `w& & &  & & & Ε fhLC  ;F4  ت4M24z}$( 0?SPb:2|  & & &  & & & Ε < w\ wN& & &  & & & ΕA}s"4:2P}~:28  w>o@ 6 >Tb tzoQ:dtD"<&@6@K@@@)`"@(@bk@C^@# @;@6@zb!@b!@b!@by:@b8@<&(@Q@?lL@bKq@b_q@bkf@?N@ "̫e A}shD  "  ̫e   SET ̫e  0  )`"   ̫e 6``$:/H J" @ 66$Q&6($2HBS ̫e HH6  C^ bk( CC ̫e VV0  b8 (   RS ̫e bb 6    bKq( INITIALIZE ̫e pp0  by: (  REWIND ̫e ||@0  b_q ( @  POS ̫e  6   K bkf( $$EOF ̫e $@0 $ b! ( @((EOT ̫e (@0 ( b! ( @,,EOV ̫e ,@0 , b! ( @00 ̫e :=8@:= Q8@1 1FORTRAN ̫e 1@0 1 <&( ;006'7'vATADATADATA @9 9LIST ̫e 9@0 9 <& ; @> >NONE ̫e >@ > @CC ̫e =:" @" F" F@} A>} 7}%.BeJ az"2 @"F$*F,2@`?Nl?lLbh #$@C %AJ  ~ u .?N2?lL NR^# H b t0zoQwt0D@:(}@zaz@@z,:@WW@,"f@l6p@@W@6@zS@zz@K@@,"4@:@(@,"|@bk@zt @z%@C^@(x@7w@T'@zz@z;@zf@w*@,"S@쩺@@6@,"@b!@b!@b!@,"8@,"%@,"t @z4@zby:@@TS@,",:@b8@,"az@jF@\f@ly@*K@W@'xx@:'@u@S@zbKq@$9!@$9!@?lL@$9!@b_q@r@z8@bkf@~@z|@d&T@,"z@@ v}hb   E   POS=X0000 .:'jF 7w: jF$7wbVb%' 5 5|K,"azrzazr6 6$jF0,"82r6z88r>l6pjF B쩺F(J(xP*KD55,"%r z% rw*S ly &,"8(r,z8.r4TST' 6<,"S>rBzSf55   5 , |r *K(x *K(,"|*r.z|0r>,"@rDzFrLd&TN'xxTZ~^u`RV5E 5w5  5-|u\f ,"frzfrb_qbkf (bkb8bKq 2bKq8>,"t @rDzt FrLbkx - 5555.~C^,"t rzt r"C^*,"t ,r0zt 2r@bkFC^LC^NRbKqX^b8d;lbkrC^505IEw65"E#?p e4  ee w5w#`C^ bKqb8;"bkbKqb8 *by:0by:b?lLtb!b!b! 5E-w5E-wE-w J5G . # TȕR5ȕ0 nb!b!$9!b!"b!&$9!0b!4$9!>,",:@rDz,:FrLrRbkfb_q ` nTvb_qj " P    8pK:(}P$2WWWW 8 @8H,"zJrNzzPrV7w\,"4^rbz4drb8 *by:0by:b?lLtb!b!b! 5E-w5E-wE-w J5G . # TȕR5ȕ0 nb!b!$9!b!"b!&$9!0b!4$9!>,",:@rDz,:FrLrRbkfb_q ` nTvb_qj " P    8pK:(}P$2W<0Q ;U@.8007'%{xF{xR{x\{x"i@{x@{8b{/hQ |9eL {@f @  v@A   @@]e{x{x0{x{x@{8<{gghQ |:eL {\w5’ 007'8'vATADATADATA@  B@A  @@P5e i"{x.{x@{x"i@{x@{8X{hghQ |rL {*f@  {8&{rhdQ |yL { 3{8{|hQ *|(Lk@({89Lh {we~kQ *|vL({8F*hhih jhkh* {*f f &f$& &ff  Q *|wL{|@yH*yVHk@({8phd*,XhR/Wh̫@`h{e{fa"{-Zh/Oqh {ew %{|  k{fa{fa w  7*{fa {fa {fa{fa {fa* 7*{fa {- {fa{-{->77X*{fa{- {-{fa{-*T e"e*{fa{fa {fa{fa({fa$ze7   *{fa{fa{fa{fa {fa *e"/ 5*{fa{fa{fa"{-&{fa  *{-{fa  {fa{fa {fa* 7e7*{fa {fa{fa{fa&{faX*{-{fa {-{fa{fa* 6e- w "{fa {fa{-${fa *27 77  7m* {fa {fa{fa {fa${faX  ({-{fa {fa {fa{| {fal {l{-  {fahQ |TL {w  5B`  w2/      5@         @h(kV|!   &  ~ f   :k@h@{8{Th{~h{Sh{xh  ({-{fa {fa {fa{| {fal {l{-  {fahQ |TL <0b +"@ }QT\`P},'8;+:r0Ps@~:@pBSH$XJv^L`MyP<wQrS:xsY`Znf[~]n](^xXR.t4 ^R4ad40k48n 4%p4%r4%s4p:v4pXv4`rx4Psx4hy 4S{4X~`4H!4%48w4`'|4(|4`Y4Z4`4P<f4sj4(}4P}4~4tb z}Dok@nL`@@q^@qp^@t4@Ϫd@n^@?T@4@o@[(}@R Zg#0P\Rzh\Rh\RAhv9whv zh\RQh.   qP} Zg# Zg#PZg#  w ͋ EVDa  DQ ]wfP    w> Wts (oLZ[(}b[(}~Ϫd|    8pw  EE008'%t4NdlzlFl    E ~CU&f * F l2LRq^hq^x4~qp^4l0p0p ,Type= Csr=%P0n^ nL`nL`nL`nL`ok, Vector=%P , Pri=%P , Urm=%P%N Cache_control=%P, Timer=%I, Alarm=%I%N PDP-11/%D%I  , %I%N4 Clock=%I, $TKPS=%D., $TTPRM=%P, Cache_control=%P+#+%N Base Address =%P(*32kw)II, Interleave=%MXX, Box Size=%M.(*1Kw)ll%N pp  OnOffEIS,UNIBUS_Map,QBUS,D-Space,SWR,Cache,TOY,UNIBUS_Memory,CIS: "&*.024 ,,FPP,mPKW11-LKW11-PKWV11-CUnknownb zQD[X@[RR`@M@Ϫd@[R:@#|@kq@E@[R @[@@S@E8@z)W@?S@?T@[W@)Ps@[RQ@$9!@y@NK@bCT@mRFY@ Zg#0G#ThGtSh   qQ Zg# Zg#Zg#0 b hf @w 9`/  ((zE8?S E$E(NK4$9!:[RQD[R N[RR`X[R:bmRFYf)PsjϪdnMtEz)W[ ~)W[X :| P 8p U5 :)W[W ?T#|y*kq,bCT2E86@S,b pzTpD_@LFw@M@$CT@@@@@R@x@s@@z@v9w@&@#@Ϫd@7R@W@F(@L@vCy@vOy@*S@v z@?T@iw@zjf@?T@@[(}@fRi^@iK@y@ Zg#0Th<vyhvyhiLyh  Zg|#VR\RwhhRhhR*KhkeRhgRXh\RhddR{:hshR,:hmRiYh qT Zg# Zg#Zg# EAe 7ԥ  ͋?* ̋ԥ ̋ԥ  & 5  8 iwR vCyj#xv z|Ϫd|8dp f A 5A `e5  8dp  w E W7  ?5 liw Zg|#d ?Tiw$vOy*@ϪdDiw HZg|#dJ?TXW^&dF(hiKlLFwz555@55 lA އ 5  ׬  VC55 $ e dy _ *S"x8iK<#Hv9wVv zZjfy bviK|R t(8p׬    w< E% e`   55,ϪdMfRi^?T&6$CT8s5 ff  ƇK#s C @%: vH (8pH7R*F(.LFwRV bZg|#v hZg|#pϪdtx?TlBe V 8peEA  A   8peB <C0   n RϪd Zg|#?T2R8[(}<R@[(}NϪdT?T`R fZg|#<jR nZg|#0rϪd|R8p(Be e 8spe((Be 8pe((Befe lR Zg|#008''vATADATADATA?TR,Ϫd 6Zg|#s8?TLRTϪd \Zg|#^?TrRvRxdЕ, 8pe* 8dpBe *Ee  ( 8pewfϪd Zg|#?T(Ϫd .Zg|#d0?T@RRϪd dZg|#f?TrLy vvCyZg|#zZ Zg#Z  Z Zg#Z jjj Zg#j Zg#j Zg#j Zg#& Zg# Zg#&LL Zg#L Zg#L Zg# Zg#ZZ Zg#Z Zg#Z((ZZZZZ. Zg#Z Zg#Z Zg#Z Zg#Z Zg#Z::Z Zg#Z22 Zg# Zg# Zg#vzv  x x ~~   k k   %N UNKNOWN COMMAND TYPE%N  0:%P%N  2:%P%N  4:%P%N  6:%P%N# # 10:%P%N+ + 12:%P%N3 3 14:%P%N; ; 16:%P%NC C 20:%P%NK K 22:%P%NS S 24:%P%N[[ 26:%P%N%I%N%I:%N %I %I TO %I%N %I %I%N %I %I %P %P%N %I MEMORY %I%N %I %I%N %I %I %I%NONLINEOFFLI^NEMAINTENANCESWITCHLINKUNLINKONIFSETUNKNOWNACCESSABLEANYSTOPCONTINUEGOTO %2R222 2((>>>>   b Xz`XD@©df@Cs:@©Bx@W@@@@CQ@@ Zg#0Z"*hN*h   qZ` Zg# Zg#ZZg#^w f     w`K`  wPW ©df"(CQ.Cs:28©BxH©dfLTX©df\-b zP}DG#T@_@k@0@M@@L@,@Y@s@@@zkfCT@:2@k#@Q@#@Ϫd@kR@LY@7R@OXCT@ @kX@L@CT@kq@z4#@9x@E@khM@4L@k@4L@y@}@kf@k&@jf@?T@&@4@zCT@k@k@@wCT@J@P@(@Ar@Ar@y@aRK@y@LEM@@zOXg'@aRL@@mRX@bCT@/K@ E\}hZg#0̫e E hEh  Zg|# ̫e X >H2d+ Zg#X @ Zg#HQd ONq ̫e =,$  Zg#, Q ONLINE ̫e &&=,p$  Zg#, Qp  OFFLINE ̫e 22= ,$  Zg#, Q SWITCH ̫e >>=,&$  Zg#, Q& LINK ̫e JJ=,4$  Zg#, Q4 UNLINK ̫e VV=,\$  Zg#, Q\%%SET ̫e bb=%$ % Zg# Q) )RESET ̫e nn=)&$ ) Zg#& Q/ /DEBUG ̫e zz=/ j$ / Zg# Qj5 5MODE ̫e =5$ 5 Zg# Q: :ESTATUS ̫e =:,P$ : Zg#, QPB BDISPLAY ̫e =B"b$ B Zg# QbJ JBEGIN 008'%dT`   Zg#/K Zg#d Zg#"&T*ALL ̫e 9T" , /K T MEMORYT ̫e : >dTȂ~   Zg#/K Zg#d Zg#"&T *Zg#, 0Zg#4 8 *TdȎȂ "T[ Zg#T Zg#d Zg# Zg#" &Zg#"(T INTERLEAVE ̫e 6 dTȂŒBdTBdTw  Zg#dT Zg# Zg# B $Zg#d&T* ,Zg#.B 2Zg#d4T TO ̫e B@B NdTTdTTdTxxȊx:w N Zg#dT Zg#T Zg#dT  "Zg#$T (Zg#d*T.x2x6P 8x~f OXg'   TRACE ̫e 9" k kfCT CMD ̫e 9" k kfCT  PARSE ̫e 9" kf kfCT  LOOP ̫e 9" khM kfCT  TPARS ̫e 9" k kfCT  FILEZ ̫e 9" k& kfCT  RESCMD ̫e 9" kq kfCT NGO ̫e 9" kX kfCT DDT ̫e H9j=j4r  Ȋ :y k kfCT  Zg#j| Zg# Zg#j &Zg#4(r, 0 4P 6 >f BOXg'D  LOGALL ̫e 9J" 4L OXCT J EXECUTE ̫e &&9J" 4# OXCT JLOGCHANGE ̫e 009J" 4L OXCT J DEBUG ̫e :B:9Jj4>dTttȊtT| 4 kfCT J Zg#j Zg#4 Zg# "7R (Zg#d.T2t6t:P jB>j x R T Zg#n Zg#j"| $Zg#&n *Zg#j2*64 :Zg#j@> DZg#jJ> NZg#j@Jj,nA8B8C8D8E8F8 H8@J8K8L8M8N8P8R8oR J Zg#jns"s*s2s:sBsJsRsZsbsjsrszsX S8@TT TT TTTTTTTT dȶ|sssT N "T&T*N ,T0T4T8T<v >Zg#@TDTHTLT PZg#dV  dȂ) Zg#/K Zg#dP VVCSR ̫e ""9V V Ar ZZVEC ̫e ,,9Z Z Ar ^ ^TIMER ̫e 669^  ^ Ar d dALARM ̫e @@9d  d Ar j jCACHE ̫e JJ9j j Ar ppURM ̫e TT9p p Ar t tNAME ̫e ^^9t t Ar y yDECIMAL ̫e hh9y y Ar  OCTAL ̫e rr9  Ar ISO ̫e ||9  Ar Y4 ̫e 9  Ar Y2 ̫e 9$d(  Ar  Zg#d TKPS ̫e 9  Ar  TTPRM ̫e >9d=d d =d\  Ar  Zg#d Zg#d Zg#" &Zg#d ,Zg#26 :Zg#dON ̫e     Zg# OFF ̫e r  d=dČ  ,&4!<;H!4Ј<ЈH X/ }  Zg#  Zg# Zg#d Zg#d $Zg# & *Zg#,0 6&D4J<NHR4Z<bHf4 hXz^-NO=ˆ|   &.;Ą0;̀ҀҀ @:[ ΄&]„z |$ &, . 4Zg#&6<@D HZg#0LP ^Zg#@`l n rZg#&\:,Œ@҄҄     :„ :Ҍ6҄~ Zg#: Zg#@ Zg# Zg#8  & (.* 04 8Zg#:@ NZg#  VZg#6,,N RĄ:Ȃ:ҀĈT1 Zg#N Zg#R Zg# Zg#H (T  ONLINE ̫e TT9     OFFLINE ̫e ^^9     UNKNOWN ̫e hh9    ANY ̫e rr9     ERROR ̫e ||9j(     Zg#j CONTINUE ̫e 9T    T STOPg ̫e 9T    T GOTO ̫e @9j`Td?*:_S     Zg#jH Zg#` T $Zg#d*.26: qP} Zg# Zg#Zg#j  7P 7P7P7P 008'%7RBOXg'HwCTNCTROXCTV7RZOXg'`CTfwCTf7 7 7 7 %П E~ 0 0 0 0 ȝ~OXg'kfCT OXCTYJP Y&Y.y4}8E DZg|#L?TRG#TXmRX\Ϫd`MfEl?TrQZg|#b XzXDk@@K@5s@Ϫd@hM@khM@E@k @E @kf@e @zREw@Rx@}@bCT@b?T@ Zg#0$bh bhYDhSQhb#h^MhbhMhbhZd}hbfhbh6bhdM:h`{shC\(`hdfhbN`h   q$ Zg# Zg#$Zg#r       8p 5& |5  (8p5  (  $(,Ϫd24b?T<@k BbCTLkNbCTTϪdXE^`b?TfkfhbCTnϪd~n8Cp5 8p @ (   8p @ 8pwwREwRxREw  C b?TkhMbCTϪd b?T*0E 4ϪdNPb?TZϪdb5sfhb?Tre vhMze  wTI0:AT CMDAT PRSAT LOPAT EXIT%N DEBUG -- COMMAND LINE%N -- %VA%N DEBUG -- PARSE COMMON BLOCK%K}}dNee $PARM0:%P%N qq $PARM1:%P%N}} $PARM2:%P%N $PARM3:%P%N POSMSK:%P%N  NEGMSK:%P%N NEGFLG:%P%Np SETMSK:%P%Nw CLRMSK:%P%N NMBADR:%P%N STRADR:%P%2N  :%P%N FLAG:%P%N CLFLAG:%P%N  CLCMDN:%P%NU CLCMFG:%P%N   CLPARM:%P%NL,, +2:%P%N88 +4:%P%NDD +6:%P%NPP +10:%P%N\\ +12:%P%Nhh +14:%P%Ntt +16:%P%N%N DEBUG -- END OF COMMAND LOOP%N%N DEBUG -- FILE NAME SPECIFICATION ERROR%N -- %VA%N%N%I%N%N%Y %5Z7, %I%N%NTPARS- %P: T=%B,F=%B, %5P%N--<%VA>--%N:b pz8;pD_HLFw@0H,H$CT@@Hx@HH@#H7R@zW@F(@LH*S@HjfHo@&H H(HyHyHLeY@H :_@: Zg#0bvCyhvOyh:  Zg|# qb8; Zg# Zg#bZg#w E'5" 5pЕ SY008''vATADATADATA  CP%UB Ww5E 5o(LeYbLeY|:_|@ Е: 5;5551Е &E %ea55  5 ЕLeY^*S`x,55Е 5 5 Е   B 5 ae&Ea& E e *SxB:_Ht V  J   eAPЕ  5)5%Е Е CP0 Zg|#8LeYD:_`7Rf*Shx~Zg|#UBНН 5w  w w ȕ  <A`A A`A P,LZg|#Zg|#Zg|#LeY2Zg|#FW JZg|#PW TZg|#^$CTl %5 w    5@Е_  Е:P 4LeYHLeYT:_l:_~&f 75 !-CP%UB@ ŕ PPP @D Zg|#Zg|# Zg|#&F(*LFw8Zg|#>Zg|#`LeYZg|# ,<[kStcL|[t|DriverUnknownOfflineContextPrv_DiagAccpathF   ,<[kStcL |0[4:t@|,|OnlineMultiportMassbusCurrent Port zb pzXRpD:`@:Z@:@&. fl w |   >  T fl  "$&(2 *J >&`w & & &f&  ¥%   %B&ХVA C 2~ WW\6:` <:_ X: `[(}z[(}  "Е.  AЕ; ~   A EA  E 6L  -[(},:ZHaV@Q. b pzrpD$9s;@$9f@ Zg|# fR`h[RR`hRDTh[R`h=aRZh`R8h [R:h<kRhcz`Ry:hdRZh/`R!;h `Ro;h ]RږhgRdh[R h`R0!hmRF haR3hfRi^hinR"h+nR"hXnR#"haRKhB[RQhskRZhaRLhmRXhaR MhmRFYhZg# D Zg#DEVICE already linked Zg|# Zg#Zg#DEVICE not linked Zg|# Zg#Zg#((Parameter error Zg|#( Zg#(Zg#88Syntax errorf Zg|#  8 Zg#8Zg#EEAttribute format error: Zg|#E Zg#EZg#\8\HRC... Internal tables insufficient for this system Zg|#\ Zg#\Zg#Unable to access busrun Zg|# Zg#Zg#%HRC... internal addressing error Zg|# Zg#Zg#Memory box parameter error Zg|#   Zg#Zg#'Timeout on unit quieting operation Zg|#$$ Zg#Zg#ONLINE CPU failure Zg|#(( Zg#Zg#ONLINE UNIT failure Zg|#,, Zg#Zg#..ONLINE CONTROLLER failure Zg|#00. Zg#.Zg#HHOFFLINE CPU failure Zg|#44H Zg#HZg#\\OFFLINE UNIT failurer Zg|#88\ Zg#\Zg#qqOFFLINE CONTROLLER failurer Zg|#<<q Zg#qZg#0Attempt to quiet unit for 008'%You must be privileged to modify the system comfiguration Zg|#$9f Zg#Zg#5Command intent is inconsistant with device stateR Zg|#/%N%R -- Unimplelmented command%N$9s; Zg#/ -- %VA%N%N%R -- Command Syntax Error%Nj -- %VA%N%N%R -- Unable to assign command LUN%N%N%R -- No reconfiguration driver is available%NMXM --- Output to HRC is suppressed---%N%N%R -- Maximum INDIRECT command file depthM exceeded%N -- %VA%N%N%R -- Bad INDIRECT command file specification%N; -- %VA%N%N%R -- Open error on input command file%Ns -- %VA%N'G' FILE=%2A%B:%X, %I%N%N%R -- Input error on input command file%Nii -- %VA%Nr:r FILE=%2A%B:%X,%I%N %N%R -- Unknown command error%N* -- %VA%N %N%R -- Illegal command%N/ -- %VA%I%VA%N %N%R -- Illegal keyword%N -- %VA%I%VA%N %N%R -- Internal consistancy error%N%VP %N%R -- Command list is empty. Nothing to print%N%N%R -- Commarnd Syntax error%N8 -- %VA%I%VA%N%N%R -- This command is illegal in9 immediate mode%N%N%R -- Command execution error.o7 %N%I%N%N%R -- Unknown device or invalid deviceX specification%N ,p,CODE= %P (=%D)%N%N%R -- Internal core pool is exhausted%N%N%R -- No device name matches select string^ "%I"%N%N%R -- Initalization error%N%I%N%N%N%R -- File open error%N FILE=%2A%B:%X%N+ %I%N%N%R -- CONFIGURE Version %I%NgTask built: %Y %5Z%N%N No HRC version information available%N%NHRC -- %IHRC Version %B.%B%NnxKxTask built: %Y %5Z%N%N%N%R -- Configuration Control Command Task%2NXImplemented commands:%2N ONLINE %N" ONLINE MEMORY %N   ONLINE ALL%N OFFLINE %Nt/#/ OFFLINE MEMORY %NrMM OFFLINE ALL%N[1[ SET =%N  BUILD%N%  CLEAR%Nm2 DISPLAY [
>>>>>%6SMCR COMMAND BLOCKS%6S------------------%6SBUFFER ADDRESS = %P TCB = %P%6S%6A: %VA%6S%VA%6S > > > > > UNKNOWN AST TYPE%6SUNSOLICITED CHARACTER AST%6SFLOATING POINT AST%6SRECEIVE DATA AST%6SRECEIVE BY REFERENCE AST%6SPARITY ERROR AST%6SREQUESTED EXIT AST%6SPOWER FAIL AST%6SCLI COMMAND ARRIVAL AST%6SBUFFERED I/O AST%6SOFFSPRING TASK EXIT AST%6SSEGMENTED BUFFERED I/O COMPLETION AST%6STASK FORCE T-BIT TRAP AST%6SDELAYED I/O COMPLETION AST%6SGROUP GLOBAL RUN DOWN AST%6SEMIT STATUS AST%6SCOMPLETION AST FROM: QIO$, MRKT$, SPWN$, CNCT$, OR CINT$%6SSPECIFIED AST FROM: SFPA$, SRDA$, SRRA$, SPEA$, SREA$, OR SPFA$%6SEXIT EVENT FLAG (O.EFN) = %P%6SPARENT TASK NAME = %2R%6SMCR COMMAND LINE ADDRESS = %P%6SPARENT TASK HAS EXITED%6SOCB DUMP:%4S---------%4SOCB LIST: > > > > > REDIRECTED DEVICES FORM A LOOP FROM UCB AT %P.f&f" 7 e5UCe"Q$"~ "| e# e$WU e$KU  e$|U:: H5, Ce&ee:  Ce&e5-e  $e e e$e `  Ce$ f%F%B&Ce  Ce  efwZC |B xB e3e;e!  *;%a; pƅCeCeCe&e5    e  d Ce ; Ce(Cee< Ce U< E CeP9 j< Ce9 < v5 5* 9 f = XCe9 J`= ɂ C5Dm MC@C @e% e % eąe B e eB leB VeC B3Ce.ćffe w7 5@Ce5rF > >e:^ r3  Oee58a> à j6 z1>  eE555(e  few>> w:weje> 7 ZR= EË )%;%?%C%G%K%O%SwEU%Y%]%a%e%i w@  @$u@n@g A`%AJY9AROArKaAdD|A(V=AH6A :/A ,(A(!B e,B ?B{B 6eee> Emw f5\e@V?!?e I:Ee?? ee?f? lee? Nee? 5 @ f&fe@ @E ^ec̕ %̥  W!PPb%6<%2A%O:%4>NONE f&f&& L!eeCeCe jeC`EL *e ffR  ff  C5 e ` NUL MSG LGO DSB PRV SGL@ NIO RST EXT POL CLI PARSER BLOCKS CLI TASK NAME %2R CPB ADDRESS = %P CLI NAME = %2R C.PSTS: %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A CPB DUMP:e5a ]Mʿ7CKee 5UMeeNeM <)N .tN ee `e`B eeJ  z&>,&  m  f A N  %00`7Q7vATADATADATAMAINSUB TASK SYS RW COM RO COM DEVICE DRIVER SECPOOLCPU d[]<>!+() 9;999~9 PARTITION INFORMATION%23SM E M O R Y M A PPARTITION PCB ADR BASE SIZE TYPE OCCUPIED BY--------- ------- ---- ---- ---- ----------- %2R%5S%P%5S%P00 %P00%4S%4A %7A %A%2R%A %8A %2R%5S%P%5S%P00 %P00%4S%4A %7A %A%2A:%A%6S%8A<--ERROR %23S%P00 %P00%5S %16S%P00 %P00 %16S00%P 00%P %16S00%P 00%PH8eT`8eHy88 8<8 jz%b;b;Ɏ7 ɦɲ(8w 7 Xm  ^   F jw fvve h QFe:%b;b;&(Ɏ"7 ɦ ɲ $%4 E 5`w e  w5dȷeȖ%~%f;f;lȎfb7 ZȦRȲ(8*7  62e&%f;f;&Ȏ 7 ȦDzǷeǖ%  v9- 7!-- n9 A7!  χ 5.t9 mӐAbA&A=${,8$e08  .8 28 P .685@  e  e*e& 5@Ue6848~48e88&8:8Av9  v97<7=7=7=7=7=7=7=7=7!$5* *5U-  77!7 7!757+5'7$7575 75U - 75@~7  "&f>Ce  OUT@ CKP CKR-CHK FXD CAF LIO-NSF COM@ LFR PER NWB DEL AST@ LMA CPC CHE SEC PAR POL CPU PIC@ RON DRV APR NAME PCB ADR TYPE MAIN BASE SIZE P.OWN PRO PRI RMCT HDLN PIOC NAME PCB ADR TYPE MAIN BASE SIZE P.OWN PRO PRI RMCT HDLN PIOC ---- ------- ---- ---- ---- ---- ----- --- --- ---- ---- ----%3S%2R %P %4A %2R %P % %P %P %D. %D. %D. %D. N/A %5S%2A:%5S%P %4A %2R %P %P %P %P %D. %D. %D. %D.MAINSUB P.STAT: %P %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A P.ST2: %P %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A & f&>  ? 5-7 ?P@1P@7!5 %5 e?@5 56AL@rdb*A7!\.A Pee><@BН$НН6Н1 d?2A V  ^?A 8͂ e$  7! e eɄ ffR  ff  C5 e ` COMMON BLOCK DIRECTORY%6SCOMMON TASK IMAGE FILE PCB%8SPCB ADR P.UCB P.LBN P.REL%8S------- ----- ----- -----%8S%P%5S%P%2S%P,%P%2S%P%6SCHECKPOINT ALLOCATION PCB%8SPCB ADR P.SUB P.MAIN P.REL P.SIZE%8S------- ----- ------ ----- ------%8S%P%5S%P %P %P %P%hbC eNONE f&f&& G!eeCeCe VeC`EG e  z&>,&  m  f A N  %8&8 8[1,6]""`SY22 ERROR LOG BUFFERS%6SBUFFER ADDRESS = %P00 ENTRY TYPE CODE = %P%3SENTRY TYPE SUBCODE = %P%6STIME = %Y %3Z%12S<<<<<>>>>>%12S>>>>>UNABLE TO CREATE ERROR.TMP IN THE CURRENT DIRECTORY>>>>>%12S>>>>>Warning: ERROR.TMP cannot be created in [1,6]>>>>>%NCDA -- ERROR.TMP cannot be created in [1,6]%N5P 5J DP> KT:||R:@ D D D D D D eD  h: " @:eD  eEBaD CB eτ  f&feD eD  MEMORY DUMP<%   %4S%8A %4P !%R %R %R %R!!%8E!%6S%P %4P !%R %R %R %R!!%8E!%23S[ABOVE LINE REPEATED %D. TIMES]fwd7 \&fVT7RwPEHE@7 R7 P7 NE,(& D j 2 < 7!w!7w   > > > > INCONSISTENCY IN DYNAMIC STORAGE%6S+ = NEXT WORD IS IN $PKAVL LIST $PKAVL = %P%6S- = NEXT WORD IS IN $PKAVL AND ALSO IN $CRAVL > > > > > $PKAVL LINK ERROR AT %P -- FWD PTR = %P SECONDARY POOL DUMP%25SS E C O N D A R Y P O O L%6SNUMBER OF FREE BYTES = %P00%6SFIRST FREE BYTE = %P00%6SLENGTH = %P00 BYTES%6SSTART ADDRESS = %P00%12SENDING ADDRESS = %P77eF˃ H7 F7 <0 %"7    $7    f= \ 6e5@d _> 4>e(>zeP > e-@:8 Pa ?e B B B B B B D D D D D D `D `e?  *7&f  ^  7 e AP P z  <R Y=& 77 T  J7l \ 7\ .7PNNf&<7 D B@ Jɱ%4S%8A %4P !%R %R %R %R!!%8E!%6S%P %4P !%R %R %R %R!!%8E!%23S[ABOVE LINE REPEATED %D. TIMES]fwd7 \&fVT7RwPEHE@7 R7 P7 NE,(& D j 2 C 7!w!7w  CfC eD CC7 R$   7 7  &ff NJeDB@ Pp p"C FC% ,& DiC : w`C rew  7  @ @f&  `E L\BE  % & `E > > > > TASK '%2R' NOT IN MEMORY%4SWINDOW #%D -- TASK VIRTUAL LIMITS %P-%P%4S----------------------------------------------%NCDA -- Task '%2R' not in memory%N%6SPHYSICAL STARTING ADDRESS = %8A%6S------------------------------------%6S------------ THIS TASK HAS NO D-SPACE ---------------%6S > > > SPECIFIED VIRTUAL ADDRESS RANGE NOT IN WINDOW 7 57 U U 7ve$pn7we w->-6 e&e5wbe7F77e5,778ex9wV5e05878e\e&Ce  Ce v  S8e eCe$w%e& Ce  FE`5w,Cewe Ce CeCe5-- ^U@-- E88 pn^ VmXB % B eB eD &f -9P9  ee weȳ eb8  9U 5 5U0w5@97 %4S%8A %4P !%R %R %R %R!!%8E!%6S%P %4P !%R %R %R %R!!%8E!%23S[ABOVE LINE REPEATED %D. TIMES]fwd7 \&fVT7RwPEHE@7 R7 P7 NE,(& D j 2 .= 7!w!7w  .=f6= eD .=6=7 R$   7 7  &ff NJeDB@ Pp pH= l=% ,& =  w`6= rew  7 %4SWINDOW BLOCKS:%5SPAR VIRT LIMITS ATT DESC WND SIZE OFFSET 1ST PDR NO. LAST PDR%5S--- ----------- -------- -------- ------ ------- --- --------%4S%2R %P %P %P %P %P %P %D %P%5SPAR VIRT LIMITS ATT DESC WND SIZE OFFSET%5S--- ----------- -------- -------- ------%4S%2R %P %P %P %P %Pfe$CvCr%ej?eB%@ |??@B@v@@Ce 2E`5>Ce  eeCeCeCeCeCe Ce eCe Cee  KERNEL INSTRUCTION SPACE DUMP KERNEL DATA SPACE DUMP%6S%P %4P !%R %R %R %R!!%8E!%23S[ABOVE LINE REPEATED %D. TIMES]%12SVIRTUAL ADDRESS: %P PHYSICAL ADDRESS: %8A > > > > > INVALID ADDRESS RANGE WITH STANDARD MAPPING%NCDA -- Invalid address range with standard mapping7l7pn|5lZlj%5 % 8 e8fE5 B  L7 D 7 >  0 ,7&fe AP P &  d 77R  8-7 f&777 R$   3- t/8 !f7R 77RS 7 8el (7 "&f erS8efх00`7Q7vATADATADATAffR  ff  C5 e `%4S%8A %4P !%R %R %R %R!!%8E!%6S%P %4P !%R %R %R %R!!%8E!%23S[ABOVE LINE REPEATED %D. TIMES]fwd7 \&fVT7RwPEHE@7 R7 P7 NE,(& D j 2 8 7!w!7w  8f"8 eD 8"87 R$   7 7  &ff NJeDB@ Pp p48 X8% ,& 2{8 ( w`"8 rew  7 CPR INFORMATIONRSX TO VMS RINGS:VMS TO RSX RINGS:PACKETS IN RSX-CONTROLLED AREA: FLAGS: %P %R %R %R %R %R %R %R %R ADDRESS: %P00, LENGTH: %Q MEMORY AT %P00 IS FREE FOR %Q00 BYTES. PACKET AT %P00 OCCUPIES %Q00 BYTES. LENGTH INDEX TYPE ITEMS TCB UNIT ------ ------ ------ ------ ------ ------ %Q %Q %Q %Q %P CP%M: LENGTH ADDRESS RETURN APR NET STATUS ------ -------- ------ ------ ------ ------ ------ %Q %P00 %P %P %Q %P %P FLAGS: %P %R %R %R %R %R %R %R %R ITEM OFFSET: %Q, LENGTH: %Q, ID CODE: %Q ITEM BUFFER BEGINS AT %Q:> > > > > LOOP FOUND IN LINKED LIST IN POOL AT %P> > > > > CPRBUF REGION WAS NOT FOUND> > > > > CPRBUF REGION IS NOT IN MEMORY> > > > > CORRUPTION DETECTED IN CPRBUF> > > > > ITEM NOT IN PACKETz@U:xL skcZ@grtT:eJ $D!J <!BCf&e Re 4e!&e Re e!eC< < w< eee@m   N nf:  l  rx: h R  Xe?D E?ww~w|mvn: ( ^  w= &eD &J= :eD eD : ̀w  -zwel`: EwRĴw`; p -χ7weCee09;\;; eeeeeeee;;; &J= 0< f& jw7  f&eD 7!>w!: eD f&PP;<\ZmB mD 7!Hw!BEg< H,= 27;8;8<@8; 8B<*9>9>92? BSY@-MNT FOR MDM OFL-RED PUB UMD PDF SIO@ TRN MUN MNT@ F11 COM PSE OSP 32B SWL UMD@ MSD SQD SDI DIR TTY CCL REC DH1@ DJ1 RMT L8S NEC CRT ESC-LOG SLV@ DZ1 HLD AT. PRV L3S VT5 LWC-ALG@ NPR QUE PWF ATT KIL LGH RST ESC RSP PTH RNE TSY@ OBY IBY DPR DEC IBF DSI RES RNF@ TNE USI RCU WRA WRB WAL BRQ SRQ@ ORQ IRQ FLF ELF CR OBF PCU BEL@ CTO CTS ACR TAB CTC RAL NEC TSY@ 8BC FDX MHE ICE TME PTH RES PPT@ RUB WCK SPU VV DEVICE INFORMATION %5A ----- UCB ADR DCB ADR SCB ADR REDIRECT ACP ATT OWNER LOGIN UIC ------- ------- ------- -------- --- --- ----- ---------%4S%P %P %P %6A %2R %2R %6A [%O,%O]%4S%P %P %P %6A %2R %2R %6A%4S%P %P %P %6A %2R %2R%4SU.STS: %4A %4A %4A %4A %4A %4A %4A %4A%4SU.ST2: %4A %4A %4A %4A %4A %4A %4A %4A%4SU.CW1: %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A%4SU.CW2: %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A%4SU.CTL: %4A %4A %4A %4A %4A %4A %4A %4A I/O REQUEST PACKETS: PACKET ADR REQUESTOR PRI EFN LUN FUNCTION CODE STATUS ---------- --------- --- --- --- ------------- ------ %P %2R %D. %D. %D. IO.%R%8S%7A 00`7e7 > > > > REDIRECT ERROR (U.RED=0)INPUT OUTPUT N/A `:8%CC&Ď 7 Ħ IJ7 CeE%TTUeCee  ?^7wlETCeL55<U45p5&CeCeCe5 Ce5wC &u:{: V::PCeCe J = Ce5i>65  Ce Ce 5|;Ce Ce ;Ce5R;  ? 7 e~f57CeD %75@J: A <  e.=Ce E X  7 t5@xCe7 bwV5Vn >5D$5@<  Ë XCeY 5S5@O > > ? 9Ceee ³ e  eC  eC eC   D³  1> Ce5$M>Ce& Cee%MTFee E e|ȅm w%ewfD5  ?  n ? xm m> Vdz>x7C Ce  pe 4ECe  *v |< r<!= &fPCe CeCeCe5 E5?=+Cee&N ~e e6 e>$V  o=Ce n. C( feC%#eC%_e C e  %6<%2A%O:%4>NONE f&fʾ&& E!eeCeCe eC`EEr eh ffR  ff  C5 e ` 4F.q"|(+N0swbrt  ' r q! +s2#p G@$spra  s s. @vrtBy Fy@yPw`-tpx!28& z1q&R H--- .(.0.8@6HWyPWXbY`{fIF  ؙ >z&>,&  m  f A N  %d TASK HEADERS %2R ------ ( OUT OF POOL ) %4SHEADER ADDRESS = %P%6STCB ADDRESS = %P%4SPS=%P%5SPC=%P%4SR0=%P R1=%P R2=%P R3=%P R4=%P R5=%P SP=%P%4SINITIAL PS = %P INITIAL PC = %P INITIAL SP = %P%4SHEADER SIZE = %D. NO. OF WINDOWS = %D. NO. OF LUNS = %D.%4SCURRENT UIC = [%O,%O] DEFAULT UIC = [%O,%O]%4SH.WND = %P H.GARD = %P H.VEXT = %P H.SPRI = %D.%4SDSW = %P H.FCS = %P H.FORT = %P H.OVLY = %P%10S INSTRUCTION SPACE%10S D A T A S P A C E%10S -------------------%4SHEADER:77W%<<&ʎ7 ɦɲe%j:j:Ɏ7 ɦɲɷeɖ%e5 e&e5wR7wR( 77 e&ʦ e e7ʳ 7 B&Ce:%,e % Cee  8 А%Ce$8 Ce CeCeW8 CeCe00`7Q7vATADATADATA$Ce<8 lCe  Ce  8 BCe$Ce:Ce.Ce09 Ce&Ce(Ce*Ce,@9e e|99 54e05 e99U e9Ce %XCedτȳ ew %4SWINDOW BLOCKS:%5SPAR VIRT LIMITS ATT DESC WND SIZE OFFSET 1ST PDR NO. LAST PDR%5S--- ----------- -------- -------- ------ ------- --- --------%4S%2R %P %P %P %P %P %P %D %P%5SPAR VIRT LIMITS ATT DESC WND SIZE OFFSET%5S--- ----------- -------- -------- ------%4S%2R %P %P %P %P %Pfe$CvCr%e<e% =R===>4>Ce 2E`5>Ce  eeCeCeCeCeCe Ce eCe Cee  @7@d@q@}@@%4SLOGICAL UNIT TABLE:%4S# DEV WINDOW W.CTL W.FCB F.FNUM F.FSEQ F.STAT NAC NLCK%4S- --- ------ ----- ----- ------ ------ ------ --- ----%4S%D %5A%P %P %P %P %P %P %D. %D.%4S%D %5A%P %P %P %P %P %P %D. %D.%4S%D %5A%P%4S%D %5A%P%4S%D %5A%P %P %P%4S%D %5A%P %P %P > > > > > ACP OUT OF MEMORY OR NOT IN EXECUTION%N > > > > > REDIRECTED DEVICES FORM A LOOP FROM UCB AT %P.fCe<9%f?e}??Ce> P eE (%  A @ 7 e &fX?z&@Ce  Ce  ef(w$@ wdCeE%ICeµ`B-? :\?ee%.-j'6  T?eeeee³    &eEe5=7 e<e0e&e5"e v5 3 $e2Vm*3 3 e   %6<%2A%O:%4>NONE f&f^&& cC!eeCeCe VeC`EVC e  rz&>,&  m  f A N  % CLOCK QUEUE%6SADDRESS = %P REQUEST TYPE = %D TCB = %P TASK = %2R%6SADDRESS = %P REQUEST TYPE = %D%6STIME REQUEST BECOMES DUE = %5Z%6SC.AST = %P C.SRC = %P C.DST = %P EVENT FLAG = %D.%6SC.RSI = %P%P C.UIC = %P%6SC.UIC = %P%6SC.SUB = %P C.AR5 = %P%12S<<<<<< INVALID REQUEST TYPE >>>>>>%12S<<<<<>>>>>H88888ՃI7D A&9= eP8ťťe X%ee7  &  Eev f&f&e eB eA eA < eA < ePX&8 хf&f%ee eee % e(9A ~ x8 nх5 eP8 Fѱ&   `@ ` B   & A @    Q6^xwQS ]f@x CONTROLLER INFORMATION%4S%2A%4S--%6SCTB ADDRESS = %P L.DCB = %P%6SL.STS: %R %R %R %R %R %R %R %R%6SCONTROLLER TABLE BLOCK:%6SDEVICES INTERFACED BY THIS CONTROLLER:%6SCOMMON INTERRUPT ADDRESS = %P%8SDCB DEVICE NAME%8S--- -----------%6S%P%8S%2A%6SKRB ADDRESS = %P%6SK.STS: %R %R %R %R %R %R %R %R%6SCONTROLLER REQUEST BLOCK:%12S> > > > > LINK ERROR AT %P, FORWARD POINTER = %P%.&7PH7 00`8e78 a8Cee EC5eeчf|8 Ce51Ce *C8 88 7,C) &ez^888Ce eF^8eхfCee =79C3 9 e7 9 89e eC` ee %5  jU9 `бffR  ff  C5 e `<<2dTASKSYSTEMGROUPFinalPrivileged = LOCAL LOGIN ASSIGN TABLE%5SLOGICAL PHYSICAL TYPE%5S------- -------- ----%6S%6<%2A%O:%4>%4S%6A%4SGLOBAL%6S%6<%2A%O:%4>%4S%6A%4S%6A%4STI - %6ASystem Logicals:%5S%5SBlock: %Q%5SBlock: %6<%Q%6>Status: (%VA)User Logicals:%3STerminal: %5AGroup Logicals:%3SGroup: %QTask Logicals:%3STask: %2R > > > > > LIST OF LOGICAL NAME BLOCKS FORMS A LOOP.5 5 <(5TI< = ;C<.l= * h2?   x w7&eD fEEe E eD & w9 N\eD   9v& x"k6 w& Y 77 =sE < EE`  }=ѝxs=$ :Y E7  :Е,Е P  : := ˀ> % %@& ӕ%ӕVӕA!Q }=`s= QeH= >K ; eCee  Ce5 Ce 5Cmf  J=A  ʁm %e eC! ez= p>; A77 e*- & $>eC' B$B` Z e= B@;  = " &;ȋЭ1Н)d%6<%2A%O:%4>NONE f&f&& B!eeCeCe xeC`EB 8e &f& v  z&>,&  m  f A N  %00` 8Q7vATADATADATA%6N [END OF ANALYSIS OUTPUT]%F%2N *** CDA STATISTICS:%6SERRORS DETECTED: %D.%6STOTAL PAGE FAULTS: %D.%6SSIZE OF CORE BUFFER: %D. WORDS (%D. PAGES)%6SELAPSED TIME: %3Z %VA%NCDA -- Errors detected: %D.%N5XiUP& & Y5@]ev77̷ `$8 |87 8PP387f=ABC ˂ ˁ e e< e<Pa8ev85~G5v?V 89f"e\e!e  5f h2* eA V E  50 \& & & & & & & & & Ε &|&  f&&  e#e|& f&&G& & & & && '&& V&,%NCDA -- Command line syntax error%NCDA -- Illegal switch%NCDA -- No output file specified%N %VA%NCDA -- Analysis output must be directedto an explicit device or file%NCDA -- Output dump file name must be explicit%NCDA -- Crash dump must be input from an explicit device or file%VS/\%N%NCDA -- No input file specified%N%VA%N/\%N A42&"B B(56565`6 0 &45  (55@ .5 # 7!889& 778 (8o88 9 &,<7 7 7 v 2 5Qv wEɇ5Eɇ >ɇ 7 ɇ 08ˇ5v(5n$ w5^5V5N     eE 78ɇw75`7\ U  5U@ wwN7-P@ -H w67χχ5@f 1 1  W  Z R w>5n5h65^5V7 7 7  w w w  w  w` d5 5Ph Hd@X:Vɇ 05 56 2 &$ɇ ɇ  ɇ5Xɇ5Mȇ C5?ȇ 854ȇ -5)|ȇ r"5lfȇ \5VPzȇ F BV·5 ww 7 ER7 158(7 #0 , 0 0 7 - - 7 w̥, 7 `-vpmj.7 Z 7 `7 %.7 j& (wX  wLee7 &fw 7 7 @,q `-KacJE[ !m@  ) L R  j7j f@  &  5]U E( :&@E A  ̆  E vE c  @  . &fv@     8  " .$ B  8̥ZḀ90     w (@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA nEAa$EXITLIMITLINESSPSPMEMSIZSTBALLCLICPBATLACTSTDTCBTALHDRDEVDCBSCBUCBPCBPARPOOLPOLSECPOLTISTDSTASADVTSKTASKDMPDUMPKISKDSKMRBLCLQCTLDECNETNETCACHECPRLOWHIGHSYS@AA AAAAA"A&A*A.A2A6A:A>ABAFAJANARAVAZA_AcAjAnArAvAzA~AAAAAAAAAAAAAAAA9=B,Bț E,:/HB&B-lBD:|BBB<:@B@B:B@B†T:@B:†b:@B:†p:@Bț E~:/B&BB:†:&B:ȁ E,:B/Bʆ::=B:B,BʄD D DDDDDD@DDDDDDDDD DD&DDDDDD00`8e7DFDYFDFD=ND:ND ;`D8;`D>;`DF;DD=D:DD<>DD=D:D΂;:DD‚<:†BE$7E_7Ew  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C &  m  f A N  %&f  %NCDA -- Failed to extend page buffer - %D. pages available%N%NCDA -- Failed to assign LUN to input device %VA%N%NCDA -- Failed to open input file %X%N%NCDA -- Failed to open output file %X%N5 UU!& & Y & fY (8 w` 8&= E 7 `˷5@l?77   f8  07 @ U 7ff7 ɥDY 7 5V eB$& ( # $Uw5# "( eB$& [# U5 \1  "(8eB$& ~6# z0,( e p 0 5& eB$& 8# 4  88eH %, &, %6-%NCDA -- Premature end of dump input - %X being zero-filled%N%NCDA -- Transfer complete - %VA may be unloaded%N%NCDA -- Error writing dump file %X Error = %D. DSW = %D.%N5  jd%??B!B  ҁ vc n e # 0p YV SP   $ &eH70p |/, x)|&  <& & & & & & & & & Ε E@U z 7 *pRTeH%8 &+ %*%NCDA -- Symbol file %X has illegal format%N%NCDA -- Symbol %2R not defined in symbol file%N5 7 7 Q$%h7   F %J w7  7 D 888888887&X1-+-(̵ % $ #-@ %$%% 7^  7 %NCDA -- Error reading symbol file %X%N   B *eH,9 77 & U V&, &+00`8Q7vATADATADATAA VOLATILE REGISTERS AFTER CRASH: PS=%P SP(K)=%P SP(U)=%P AFTER CRASH: PS=%P SP(K)=%P SP(S)=%P SP(U)=%P BEFORE CRASH: PC=%P PS=%P R0=%P R1=%P R2=%P R3=%P R4=%P R5=%P MMR0=%P MMR1=%P MMR2=%P MMR3=%P%20SU S E R%29SU N I B U S M A P%5SI S P A C E%11SD S P A C E%16S%VS%D %8A%5SPDR%7SPAR%11SPDR%7SPAR%16S%VS%D %8A%14SS U P E R V I S O R%25S%VS%D %8A%18SK E R N E L%29S%VS%D %8A KERNEL STACK KERNEL STACK:> > > > > KERNEL PAR'S CLOBBERED%4S%P %P %P %P%14S%VS%D %8A%58S%VS%D %8A%4S%P %P %P %P%20SU S E R%5SI S P A C E%11SD S P A C E%5SPDR%7SPAR%11SPDR%7SPAR%14SS U P E R V I S O R%18SK E R N E L PROCESSOR %A %VA (FIRST PROCESSOR TO CRASH)<<<<>>>>%16SCPU ERR = %P%3SMEM SYS ERR = %P%3SCACHE CTL REG = %P5wHlh% |Z %rn0l  ee %` Է@|e eeee5$wJ7 \7%­ :u:eÝ mZɋ%ZT7e: -w6 5:78 %   : x  88 ^  W8 @ 8e$7 8% :7 ~ $%+ 9 9 *9 |9 n9 d9 ZP9 P9eM: ee: x  Z9 n9}9h   *wd -5 lX |  %:3:  h8 ^9  0 ` &9%n%9 0 &f  %  C CE e) @%<%8%%$-n5b-` %ÝD m 54  (%ee"(4jp $|*6x<BHNTPVb(&b:zFL LOWCORE ALPHABETIZED DUMP %2R% %7S%2R% %7S%2R% %7S%2R%@@@@@f H?7  NA . A &A A @  ?& x( d^Ze TVXZ>>>> ?@ %P <49-64> %P $COMEF: <33-48> %P <49-64> %P SYSTEM NAME = %6A $NTUIC = [%O,%O] LOAD DEVICE = %2A%O LBN = %8A FILE SIZE = %D. LOAD DEVICE = %2A%O LBN = %Q,%P FILE SIZE = %D. SYSTEM HAS STANDARD EXECUTIVE ----------------------------- PRE-GENERATED DISTRIBUT00`"8e7 > > > > POOL LINK ERROR AT %P -- FWD PTR = %P SIZE = %P%NCDA -- Pool link error found - continuing%N%10SEXT%8S22-BIT EXTENDED MEMORY SUPPORT%10SMUP%8SMULTI-USER PROTECTION SUPPORT%10SEXV%8S20K EXEC SUPPORTED%10SDRV%8SLOADABLE DRIVER SUPPORT%10SPLA%8SPLAS SUPPORT%10SCAL%8SDYNAMIC CHECKPOINT SPACE ALLOCATION%10SPKT%8SPREALLOCATION OF I/O PACKETS%10SEXP%8SEXTEND TASK DIRECTIVE SUPPORTED%10SLSI%8SPROCESSOR IS LSI-11%10SOFF%8SPARENT/OFFSPRING TASKING SUPPORTED%10SFDT%8SFULL DUPLEX TERMINAL DRIVER%10SX25%8SX.25 COMMUNICATIONS EXEC IS LOADED%10SDYM%8SDYNAMIC MEMORY ALLOCATION SUPPORTED%10SCEX%8SCOMMUNICATIONS EXEC IS LOADED%10SMXT%8SMCR EXIT AFTER EACH COMMAND%10SNLG%8SLOGINS DISABLED%10SDAS%8SKERNEL DATA SPACE SUPPORT%10SLIB%8SSUPERVISOR MODE LIBRARY SUPPORT%10SMP%9SMULTIPROCESSOR SUPPORT%10SEVT%8SEVENT TRACE FEATURE%10SACN%8SACCOUNTING SUPPORTED%10SSDW%8SSHADOW RECORDING SUPPORTED%10SPOL%8SSECONDARY POOL SUPPORTED%10SWND%8SSECONDARY POOL FILE WINDOWS SYSTEM%10SDPR%8SDIRECTIVE PARTITION SYSTEM%10SIRR%8SINSTALL, REQUEST, AND REMOVE TASK SUPPORT%10SGGF%8SGROUP GLOBAL EVENT FLAG SUPPORT%10SRAS%8SRECEIVE/SEND DATA PACKET SUPPORT%10SAHR%8SALTERNATE HEADER REFRESH AREAS SUPPORTED%10SRBN%8SROUND ROBIN SCHEDULING SUPPORTED%10SSWP%8SEXECUTIVE LEVEL DISK SWAPPING SUPPORTED%10SSTP%8SEVENT FLAG MASK IS IN THE TCB%10SCRA%8SSYSTEM SPONTANEOUSLY CRASHED%10SXCR%8SSYSTEM CRASHED FROM XDT%10SEIS%8SSYSTEM REQUIRES THE EXTENDED INSTRUCTION SET%10SSTM%8SSYSTEM HAS SET SYSTEM TIME DIRECTIVE%10SUDS%8SUSER DATA SPACE%10SPRO%8SPROTO TCBS OUT OF POOL%10SXHR%8SEXTERNAL HEADER SUPPORT%10SAST%8SSYSTEM HAS AST SUPPORT%10S11S%8SRSX-11S SYSTEM%10SCLI%8SMULTIPLE CLI SUPPORT%10STCM%8SSYSTEM HAS TTCOM SUPPORT%10SPMN%8SSYSTEM SUPPORTS POOL MONITORING%10SWAT%8SSYSTEM HAS WATCHDOG TIMER SUPPORT%10SRLK%8SSYSTEM SUPPORTS RMS RECORD LOCKING%10SSHF%8SSYSTEM SUPPORTS SHUFFLER%10SSEC%8SSYSTEM SUPPORTS ENHANCED SECURITY%10SCXD%8SCOMM EXEC HAS BEEN DEALLOCATED%10SXT%9SSYSTEM IS AN XT SYSTEM%10SERL%8SSYSTEM SUPPORTS ERROR LOGGING%10SPTY%8SSYSTEM SUPPORTS PARITY MEMORY%10SDVN%8SSYSTEM SUPPORTS DECIMAL VERSIONS%10SLCD%8SSYSTEM SUPPORTS LOADABLE CRASH%10SNIM%8SSYSTEM SUPPORTS DELETED TASK IMAGES%10SCHE%8SSYSTEM SUPPORTS DISK DATA CACHING%10SLOG%8SSYSTEM SUPPORTS EXTENDED LOGICAL NAMES%10SNAM%8SSYSTEM SUPPORTS NAMED DIRECTORIES%10SFMP%8SSYSTEM SUPPORTS FAST MAP DIRECTIVE%10SDCL%8SDCL IS DEFAULT CLI%10SDDS%8SNAMED DIRECTORY MODE BY DEFAULT%10SACD%8SSYSTEM SUPPORTS ANCILLARY CONTROL DRIVERS%10SNCT%8SSYSTEM HAS NCT SUPPORT%10SLSD%8SSYSTEM HAS LUT SCAN DISABLED%10SPRO%8SSYSTEM SUPPORTS PROFESSIONAL 3XX SERIES%10SDFB%8SSYSTEM HAS DEFERRED BINDING%10SRTB%8SRUNTIME BINDING%10SODB%8SOVERRIDABLE DEFAULT TO USE DEFERRED BINDING%10SXDJ%8SXDT IS USING KXJ INTERFACE FOR I/O%10SNSY%8SNO LOCAL SYSTEM DISK%10SNCO%8SNO LOCAL CONSOLE%10SRTK%8SREMOTE TASK SERVICES%10SRDR%8SREMOTE DIRECTORY STORAGE%10SRLG%8SREMOTE LOGICAL SUPPORT%10SLDR%8SREMOTE LOAD/OVERLAYS%10SVTL%8SVIRTUAL TERMINAL LOGONS DISABLED%10SANT%8SAUTOMATIC NETWORK STARTUP BY SAVE%10SNRT%8SNETWORK REMOTE SYSTEM%10SEXE%8STASK FILE NAMES DEFAULT TO .EXE%10SCMO%8SRESIDENT OVERLAYS DEFAULT TO 512. BYTE ALIGNMENT%10SSLS%8SSYSTEM SUPPORTS SHADOW LOAD SHARING%10SUBM%8SSYSTEM SUPPORTS UNIBUS MEMORY%10SICP%8SSYSTEM USES ICB POOL AS PRIMARY BACKUP%10SSWB%8SSYSTEM SUPPORTS SWITCHED BUSSES%10SACK%8SSYSTEM SUPPORTS ALTERNATE CHECKPOINT ALGORITHM%10SABO%8SSYSTEM HAS USED ABORT/FUBAR CO00`*8Q7vATADATADATAMMAND%10S32B%8SSYSTEM HAS 32-BIT LBN SUPPORT%10SUBM%8SSYSTEM HAS UNIBUS MAPPING SUPPORT%10SEIS%8SSYSTEM HAS EXTENDED INSTRUCTION SET%10SQB%9SSYSTEM HAS A QBUS%10SDSP%8SHARDWARE SUPPORTS DATA SPACE%10SKXJ%8SPROCESSOR TYPE IS KXJ%10SRMT%8SREMOTE SERVICES REQUIRED%10SCIS%8SSYSTEM HAS COMMERCIAL INSTRUCTION SET%10STOY%8SPROCESSOR HAS A TOY CLOCK%10SKDJ%8SPROCESSOR IS A KDJ11 CPU%10SUME%8SSYSTEM INCLUDES UNIBUS MEMORY%10SBMV%8SSYSTEM SUPPORTS BLOCK MOVE INSTRUCTION%10SXME%8SSYSTEM SUPPORTS EXPANDED MEMORY%10SFPP%8SSYSTEM HAS ENHANCED FLOATING POINT PROCESSOR SUPPORT GROUP GLOBAL EVENT FLAGS GROUP NUMBER =%O ACCESS COUNT =%P GGEF DUMP:5w\ TENF5vwNT9 ee eEed9eZ%^-F99 2#9 & 7D a pa99 ~ w! ~P(ewh E   : :%W:e hP w  : 2ƴPvewEEee:vP;  ԻB;%f%^;e; ; 7 e; ~8 ed < ZҴH8 ^Ĵe@5< 68 :e^< 8 e< l9 ޽eк< ƺ$9 5M ( eC5M̹ez eC = 7 7 7 7 x  w 5we` v`pwl-|k i=rfZ baw!\^N V   6  $5bB = 7= ~Z= ps= b跐 =eP= η e % ee= e9> <<5 DeDeN ANe Ce%8S%VPf& v  :  S  @ @f&  `E L\S  % & `E 2<0hztjF|`jt@nv8D>r \~4p vL,LXp~jp SYSTEM COMMON DUMP ADDR LABEL VALUE ADDR LABEL VALUE ADDR LABEL VALUE%P %2R %P%10S%P %2R %P%10S%P %2R %P%7S%2R %P%17S%2R %P%17S%2R %P%P %2R %P%10S%P %2R %P%7S%2R %P%17S%2R %P%P %2R %P%7S%2R %PVVVVWW  ".(.:@4:F@FLRLRX^djp j$vpv| $0<BHNTZ `flr~$*06<BHNTZ `&flr,2x~8>DJ\htz "( .4&,28>DJPV\ntz@RX^djpv| SYSTEM COMMON ALPHABETIZED DUMP %2R% %7S%2R% %7S%2R% %7S%2R%~YYYY  r > > > > LOOP FOUND IN LINKED LIST IN POOL AT %P> > > > > CACHE REGION WAS NOT FOUND> > > > > CACHE REGION IS NOT IN MEMORY> > > > > REQUESTED PARTITION IS NOT A CACHE REGION> > > > > LOOP FOUND IN CACHE STATISTICS BLOCKS AT %P00> > > > > LOOP FOUND IN CACHE EXTENT DESCRIPTORS AT %8ANO DEVICES HAVE CACHING ASSOCIATED WITH THIS REGION7e:77 rJ $D!N <!FCf&e Je @Be!*e e -e!eC8 8 9 w28 9 w79 ee5e J7we N ,  :  E   D D D D D D f& ee09Xee "eE`7488C8eA je2:`D jeD  , `D JeD   E`D eD  9b o9 f&f9D eD  D eD  q8&  m  f A N  %00`:8a;8vATADATADATA|a,VV\b  &[q$b dSYTISYSYSYTIOVγZ#%γγ .!i   eAe]0n` : }n ` ( $X 5 W#b ~w)wp<Pj2b  %" e^v' CDA>PN00aB8e7MCCCKD8DFF~GRG gHCTH\}J JJg'JKJbTJwJyJzJÅJLMsP\eĊeirxxxvvyf a'2s N*}BxC ©Fݩ(ީz} NCT,K,K,M6}y\}zds-~˪s#HgAqAvrAyFsKQKZO_O`KOKO NRB9R9R,:RR;RSTTTTz}W|q@w24""^&"" &((uLkMdJ,t̫̫2̫r!̫pEѫO ѫ,xѫBxѫxѫhѫZfz}FxZLT5sӍYlh.+{p+{P}0{G3{3{l.uX+guL""%CTxd$(:DCCjCD:EO E&H HH:dHHH;JJJ(JGJ:dJwJLL NLcccJXcTXczdcyiiz}rrrrr|CTKKs{GKkMwz}[((yz}t!xxxxDr©LEȩsߩ0   y z}T+ ,!1U1'1CT1T[14f78*}T..ӪӪӪת3تتlzت*}۪<} qsQ}~B !CCLFK L:dODLOȒRX^RF^R*}WWEWkrWrx@t!*}S\q̫` ̫g'̫sͫdϫxdϫdϫfϫpѫ4ѫDLѫjSSSSS2g*}Mt[q,tbTgr5hh Nh}v~oM 3HeHVNHpHHa;'yI;U#U]RUfShShyso^?SYz f| CDA -- Exiting due to illegal trap - Snapshot dump being attempted&.& zeG& & & & e %&<)& & &  D& & & Ε f  w  %NCDA -- Error writing analysis file%N > > > > > LIST COUNT EXPIRED%6S%P %VPf&f& 7 f&ff&f7  0 ee m|  &f BE 5E E&  & ` EEm  D `D E& Z p&&f e*  f5<  h f P    D  W xf  p  n @5.-62 &fX-    5 eeV f&f D f&fjP D Ee0 J &fEB   CE  A Em ,%F 00aJ8;8vATADATADATA CRASH DUMP ANALYZER V %Y %2Z PAGE %D%NCDA -- Analysis terminated after %D. pages%N > > > > > ANALYSIS TERMINATED AFTER %D. PAGESf"  P 7 8|e*- o @ %4S%P > > > > > ADDRESS OUT OF RANGE&f5  V    eF f  ^XeT^ , A  %NCDA -- Error reading crash dump%N%NCDA -- Device driver missing%Nmt |f 5 f% ŝpť ťť &  5 fw%NCDA -- Error reading file %X%N& 0 460 x  t*eH '&1 P& >&| P& >& >&0 >& >&T &( &( &( &( x&( p&( h') `P&, X>&X PP& H>&$ @>&L 8>&8 0>&< (>&H 'Z) 'D) '? ('+ ^', ^'- p'j0 p'1 '2+ '+ '+ '"* '>* '. '0 '+ >& '^* '* (r/ P&t x() p$(D* h>&@ `>&D XP&4 P6(* H>& @H() 8Z(N) 0>& (l(>, ~(|? (+5ew , Bv     5B1 w Z#$50  (r- DUt-E D  E E ܁,& "%$*&&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&ff  &[q &[q`>&,&,& ,&P&,&( ,&>&,&( (t&b&(&t&(&(&(&&&(&&&(&&&(&&&(&&&(&'&(&'&(&('&*(h:'&^'&2H7H('L'&4H7p(':'&6(h&p'&:(T&'&B( &'&H(,&'&J( &'&O(&'&X(l &'&_(H&'&a(&(&d( &(&j(&$(&l(4&6(&t(&H(&v(&Z(&w(&l(&x(L &~(&~(&&(&(X&&&Nb&(&&00aR8e7 ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ ACTIVE TASKS SYSTEM TASK DIRECTORY (PRIMARY POOL) SYSTEM TASK DIRECTORY (SECONDARY POOL)(Hd 7 (4tV(V% * *&ڎ~z7 pڦhڲeX%))Fڎ@<7 6ڦ.ڲ"ڷeږ%5e5( e5 j&  )LU(  X e(۳  -EXE@ RDN MSG CIP RUN RSW STP@ CKR BLC AST@ DST -CHK REX SEF SIO AFF HLT@ ABO STP SPN WFR STPASPNAWFRA ACP@-PMD REM PRV MCR SLV CLI RST NSD@ CAL ROV NET MPC CMD SWS GFL FMP@ CTC MUT LDD PRO PRV DSP SNC%2S%2R%2S------%4STCB ADDRESS = %P%5SPAR = %2R%5SPCB ADDRESS = %P%4SLOAD ADDRESS = %P00%5SLOAD DEVICE = %6A LBN = %8A%4SLOAD ADDRESS = %P%5SLOAD DEVICE = %6A LBN = %8A%4SLOAD ADDRESS = %P%5SLOAD DEVICE = %6A TASK INDEX = %P IMAGE INDEX = %P%4SPRI = %D.%5SI/O COUNT = %D.%5SUIC = [%O,%O]%5STI = %6A%4SMAX SIZE = %P%5SEVENT FLAGS = <1-16> %P <17-32> %P%4SCOMMON PCB VECTOR%4ST.STAT:%2S%P%2S%4A %4A %4A %4A %4A %4A %4A %4A %4A%4A %4A %4A %4A %4A %4A %4A%4ST.ST2:%3S%P%2S%4A %4A %4A %4A %4A %4A %4A %4A %4A%4A %4A %4A %4A %4A %4A %4A%4SPRE-AST STATUS:%2S%4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A%4ST.ST3:%3S%P%2S%4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A%4ST.ST4:%3S%P%2S%4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A%4STCB DUMP:%6SRECEIVE QUEUE%6S-------------%6SRECEIVE BLOCK ADDRESS = %P TASK NAME = %2R%6SCOMMAND LINE INPUT BUFFER ADDRESS = %P UCB = %P%6SAST QUEUE%6S---------%6SAST BLOCK ADDRESS = %P A.CBL = %P%6SA.BYT = %P A.AST = %P A.NPR = %P%6SRECEIVE BY REFERENCE QUEUE%6S--------------------------%6SRRQ ADDRESS = %P SENDER TCB = %P%6SEVENT FLAG MASK = %P EVENT FLAG MASK ADDR = %P%6STASK = %2R%6SREGION ID OF RECEIVER = %P OFFSET IN PARTITION = %P%6SLENGTH TO MAP = %P ACCESS RIGHTS = %P%12S<<<<<>>>>>%6SMCR COMMAND BLOCKS%6S------------------%6SBUFFER ADDRESS = %P TCB = %P%6S%6A: %VA%6S%VA%6S > > > > > UNKNOWN AST TYPE%6SUNSOLICITED CHARACTER AST%6SFLOATING POINT AST%6SRECEIVE DATA AST%6SRECEIVE BY REFERENCE AST%6SPARITY ERROR AST%6SREQUESTED EXIT AST%6SPOWER FAIL AST%6SCLI COMMAND ARRIVAL AST%6SBUFFERED I/O AST%6SOFFSPRING TASK EXIT AST%6SSEGMENTED BUFFERED I/O COMPLETION AST%6STASK FORCE T-BIT TRAP AST%6SDELAYED I/O COMPLETION AST%6SGROUP GLOBAL RUN DOWN AST%6SEMIT STATUS AST%6SCOMPLETION AST FROM: QIO$, MRKT$, SPWN$, CNCT$, OR CINT$%6SSPECIFIED AST FROM: SFPA$, SRDA$, SRRA$, SPEA$, SREA$, OR SPFA$%6SEXIT EVENT FLAG (O.EFN) = %P%6SPARENT TASK NAME = %2R%6SMCR COMMAND LINE ADDRESS = %P%6SPARENT TASK HAS EXITED%6SOCB DUMP:%4S---------%4SOCB LIST: > > > > > REDIRECTED DEVICES FORM A LOOP FROM UCB AT %P.f&f" 7 e5UCe"Q$"~ "| e# e$WU e$KU  e$|U,, H5Ј Ce&ee#,  Ce&e5-e Ϸ $e eϳ e$e `~  Ce$ f%F%B&Ce  Ce  efw4 ́`B \B e3e,e! 00ab8e7NONE f&f&& =!eeCeCe beC`E= e ffb  ff  C5 e ` NUL MSG LGO DSB PRV SGL@ NIO RST EXT POL CLI PARSER BLOCKS CLI TASK NAME %2R CPB ADDRESS = %P CLI NAME = %2R C.PSTS: %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A CPB DUMP:~e5a ]?7CKee 5U?ee0?e> <U? ? ee `e`B eeJ  &  m  f A N  %MAINSUB TASK SYS RW COM RO COM DEVICE DRIVER SECPOOLCPU d[]<>!+()5*g**** PARTITION INFORMATION%23SM E M O R Y M A PPARTITION PCB ADR BASE SIZE TYPE OCCUPIED BY--------- ------- ---- ---- ---- ----------- %2R%5S%P%5S%P00 %P00%4S%4A %7A %A%2R%A %8A %2R%5S%P%5S%P00 %P00%4S%4A %7A %A%2A:%A%6S%8A<--ERROR %23S%P00 %P00%5S %16S%P00 %P00 %16S00%P 00%P %16S00%P 00%Pt)e8)e,)) h) j^%,,؎7 ئزT)w () Xm  ^   F jw fvve h QFe%,,& ؎7 צײ $% E 5r`w e  w5dr׷enז%b%,,P׎JF7 >צ6ײT)*()  62e %,,&֎7 ֲַ֦e֖%  *- 7!-- * A7!  އ 5X*n mAbA&A.${X)$e\)  Z) ^) P .b)5@  e  e*e& 5@Ueb)`)~`)ed)R)f)A*  00aj8;8vATADATADATA*(.(B.(B.(B.). ).).). ).7!$5* 5U-  (7!( 7!)5)+5' )$(5 )5 (5U - )5@~(  "&f/Ce  OUT@ CKP CKR-CHK FXD CAF LIO-NSF COM@ LFR PER NWB DEL AST@ LMA CPC CHE SEC PAR POL CPU PIC@ RON DRV APR NAME PCB ADR TYPE MAIN BASE SIZE P.OWN PRO PRI RMCT HDLN PIOC NAME PCB ADR TYPE MAIN BASE SIZE P.OWN PRO PRI RMCT HDLN PIOC ---- ------- ---- ---- ---- ---- ----- --- --- ---- ---- ----%3S%2R %P %4A %2R %P % %P %P %D. %D. %D. %D. N/A %5S%2A:%5S%P %4A %2R %P %P %P %P %D. %D. %D. %D.MAINSUB P.STAT: %P %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A P.ST2: %P %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A & f&0  %1 5-7 0|11P17!5 %5 e0025 56AL2rdbV27!\Z2 Pee><@BН$НН6Н1 H40^2 V  02 ܂ e  7! e eׄ ffb  ff  C5 e ` COMMON BLOCK DIRECTORY%6SCOMMON TASK IMAGE FILE PCB%8SPCB ADR P.UCB P.LBN P.REL%8S------- ----- ----- -----%8S%P%5S%P%2S%P,%P%2S%P%6SCHECKPOINT ALLOCATION PCB%8SPCB ADR P.SUB P.MAIN P.REL P.SIZE%8S------- ----- ------ ----- ------%8S%P%5S%P %P %P %P%LF4z e e4e5q5e5fe`Ce %4 5,5CeeeCeW52o5 r554Ceeee5Ce eՇ :'f8 L'Z7#Lq@f%6SATTACHMENT DESCRIPTORS:%6SADDRESS PARTITION ATT TASK A.PCBL A.TCBL PRI IOC MAP COUNT%6S------- --------- -------- ------ ------ --- --- ---------%6S%P%5S%2R%6S%2R %P %P %D. %D.%6S%D.%6SA.STAT: %R %R %R %R %R %R %R %R&f5weweweCt `7e2H7d` {77e   eeee 5@Ueeeee 8 e&J7 B8ee%6SWAIT QUEUE:&feeCJ7e2H7  je AST@ DST -CHK SEF HLT@ ABO STP SPN WFR%7STASK TCB ADR TI T.PRI STATE BITS (T.ST2)%7S---- ------- -- ----- ------------------%6S%2R %P %6A %D. %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A78&fe <ee7 N8 %6<%2A%O:%4>NONE f&f&& 8!eeCeCe00ar8e7>>>>>%12S>>>>>UNABLE TO CREATE ERROR.TMP IN THE CURRENT DIRECTORY>>>>>%12S>>>>>Warning: ERROR.TMP cannot be created in [1,6]>>>>>%NCDA -- ERROR.TMP cannot be created in [1,6]%N54 5. (P" K+||~+@ D D D D D D eD  +  @+eD  eEBaD CB eބ  f&feD eD  MEMORY DUMP-%   %4S%8A %4P !%R %R %R %R!!%8E!%6S%P %4P !%R %R %R %R!!%8E!%23S[ABOVE LINE REPEATED %D. TIMES]fwd7 \&fVT7RwPEHE@7 R7 P7 NE,(& D j 2 . 7!w!7w  .f. eD ..7 R$   7 7  &ff NJeDB@ Pp p(. L.% ,& No. D w`. rew  7 * + -  POOL DUMP%27SS Y S T E M P O O L%6S* = NEXT WORD ALLOCATED FIRST FREE BLOCK ($CRAVL) = %P%4S%P %2A%P %2A%P %2A%P %2A%P !%R %R %R %R!!%8E!%23S[ABOVE LINE REPEATED %D. TIMES]%6S00az8;8vATADATADATA > > > > > INCONSISTENCY IN DYNAMIC STORAGE%6S+ = NEXT WORD IS IN $PKAVL LIST $PKAVL = %P%6S- = NEXT WORD IS IN $PKAVL AND ALSO IN $CRAVL > > > > > $PKAVL LINK ERROR AT %P -- FWD PTR = %P SECONDARY POOL DUMP%25SS E C O N D A R Y P O O L%6SNUMBER OF FREE BYTES = %P00%6SFIRST FREE BYTE = %P00%6SLENGTH = %P00 BYTES%6SSTART ADDRESS = %P00%12SENDING ADDRESS = %P77.( &.eB.  /O/e*ڃ H7 F7 <f0 %"7    $7    J. @ e5@d _/h /e r/^eP "0 e-$ Pa90e B B B B B B D D D D D D `D `e?  *(&f  ^  ( e AP P z  . R .& (( T  J(l \ (\ .(PNNf& .7 D B@. 4$. R (. RS (.e 7  7~&f&f( 6׎    F(   ( ( C f5--/ .ر%4S%8A %4P !%R %R %R %R!!%8E!%6S%P %4P !%R %R %R %R!!%8E!%23S[ABOVE LINE REPEATED %D. TIMES]fwd7 \&fVT7RwPEHE@7 R7 P7 NE,(& D j 2 44 7!w!7w  44f<4 eD 44<47 R$   7 7  &ff NJeDB@ Pp pN4 r4% ,& (4  w`<4 rew  7  @ @f&  `E L\n6  % & `E > > > > TASK '%2R' NOT IN MEMORY%4SWINDOW #%D -- TASK VIRTUAL LIMITS %P-%P%4S----------------------------------------------%NCDA -- Task '%2R' not in memory%N%6SPHYSICAL STARTING ADDRESS = %8A%6S------------------------------------%6S------------ THIS TASK HAS NO D-SPACE ---------------%6S > > > SPECIFIED VIRTUAL ADDRESS RANGE NOT IN WINDOW 7 57 U U (ZeTRt(we w-"- e&e5wbe7F()e5,+)c)ex*wV5e05G)c)e@e&Ce r Ce Z  )e eCe$w%e& Ce  FE`5w,Cewe Ce CeCe5-- ^U@-- E)* pn^ VmXB % B eB eD &f Y*|* ~ epe we׳ eF) 5*U 5 5U0w5@*7 %4S%8A %4P !%R %R %R %R!!%8E!%6S%P %4P !%R %R %R %R!!%8E!%23S[ABOVE LINE REPEATED %D. TIMES]00a8e7Ce  eeCeCeCeCeCe Ce eCe Cee  KERNEL INSTRUCTION SPACE DUMP KERNEL DATA SPACE DUMP%6S%P %4P !%R %R %R %R!!%8E!%23S[ABOVE LINE REPEATED %D. TIMES]%12SVIRTUAL ADDRESS: %P PHYSICAL ADDRESS: %8A > > > > > INVALID ADDRESS RANGE WITH STANDARD MAPPING%NCDA -- Invalid address range with standard mapping)pn|hvt )TR5t|>PN%5 % ) e)fE5 B  L7 D 7 >  0 ,(&fe AP P &  d ((R 9)-7 f&((7 R$   3- t[) !f( R ((RS (9)eP (7 "&f eV)eJffb  ff  C5 e `%4S%8A %4P !%R %R %R %R!!%8E!%6S%P %4P !%R %R %R %R!!%8E!%23S[ABOVE LINE REPEATED %D. TIMES]fwd7 \&fVT7RwPEHE@7 R7 P7 NE,(& D j 2 F) 7!w!7w  F)fN) eD F)N)7 R$   7 7  &ff NJeDB@ Pp p`) )% ,& )  w`N) rew  7 CPR INFORMATIONRSX TO VMS RINGS:VMS TO RSX RINGS:PACKETS IN RSX-CONTROLLED AREA: FLAGS: %P %R %R %R %R %R %R %R %R ADDRESS: %P00, LENGTH: %Q MEMORY AT %P00 IS FREE FOR %Q00 BYTES. PACKET AT %P00 OCCUPIES %Q00 BYTES. LENGTH INDEX TYPE ITEMS TCB UNIT ------ ------ ------ ------ ------ ------ %Q %Q %Q %Q %P CP%M: LENGTH ADDRESS RETURN APR NET STATUS ------ -------- ------ ------ ------ ------ ------ %Q %P00 %P %P %Q %P %P FLAGS: %P %R %R %R %R %R %R %R %R ITEM OFFSET: %Q, LENGTH: %Q, ID CODE: %Q ITEM BUFFER BEGINS AT %Q:> > > > > LOOP FOUND IN LINKED LIST IN POOL AT %P> > > > > CPRBUF REGION WAS NOT FOUND> > > > > CPRBUF REGION IS NOT IN MEMORY> > > > > CORRUPTION DETECTED IN CPRBUF> > > > > ITEM NOT IN PACKETz@U:xL skcZ@grX+eJ $00a8;8vATADATADATAD!J <!BCf&e Re 4e!&e Re e!eC- . w- eee@m   N n+ f l  V+ L R  w!: eD f&PPg-\ZmB mD 7!Hw!BE- HX. 2 ),:),**-l)#- )n-V*/*0+^0 BSY@-MNT FOR MDM OFL-RED PUB UMD PDF SIO@ TRN MUN MNT@ F11 COM PSE OSP 32B SWL UMD@ MSD SQD SDI DIR TTY CCL REC DH1@ DJ1 RMT L8S NEC CRT ESC-LOG SLV@ DZ1 HLD AT. PRV L3S VT5 LWC-ALG@ NPR QUE PWF ATT KIL LGH RST ESC RSP PTH RNE TSY@ OBY IBY DPR DEC IBF DSI RES RNF@ TNE USI RCU WRA WRB WAL BRQ SRQ@ ORQ IRQ FLF ELF CR OBF PCU BEL@ CTO CTS ACR TAB CTC RAL NEC TSY@ 8BC FDX MHE ICE TME PTH RES PPT@ RUB WCK SPU VV DEVICE INFORMATION %5A ----- UCB ADR DCB ADR SCB ADR REDIRECT ACP ATT OWNER LOGIN UIC ------- ------- ------- -------- --- --- ----- ---------%4S%P %P %P %6A %2R %2R %6A [%O,%O]%4S%P %P %P %6A %2R %2R %6A%4S%P %P %P %6A %2R %2R%4SU.STS: %4A %4A %4A %4A %4A %4A %4A %4A%4SU.ST2: %4A %4A %4A %4A %4A %4A %4A %4A%4SU.CW1: %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A%4SU.CW2: %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A%4SU.CTL: %4A %4A %4A %4A %4A %4A %4A %4A I/O REQUEST PACKETS: PACKET ADR REQUESTOR PRI EFN LUN FUNCTION CODE STATUS ---------- --------- --- --- --- ------------- ------ %P %2R %D. %D. %D. IO.%R%8S%7A %P %2R %D. %D. %4A IO.%R%8S%7A UNIT CONTROL BLOCK: UNIT CONTROL BLOCK EXTENSION: DEVICE CONTROL BLOCK: STATUS CONTROL BLOCK:%4S%P %P %P %6ACURRENTQUEUED %4SU.TSTA: %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A%4SU.TSTA+2: %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A%4SU.TSTA+4: %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A %4A > > > > > REDIRECT ERROR (U.RED=0)INPUT OUTPUT N/A +%44 ӎ7 ҦҲ( CeE%TTUeCee  ?^(wlETCeL55<U45T5&CeCeCe5 Ce5wC &++ :++PCeCe J / Ce5/65  Ce Ce 5,Ce Ce K,Ce5~,  r0 7 ebf5(CeD %(5@v+ A  e/Ce E <  7 t5@xCe7 bwV5Vn9/5($5@ ы XCeY 5S5@O9/ > ? 9Ceee ѳ e  eC  eC eC   (ѳ  ]/ Ce5$y/Ce& Cee%MT*ee E00a8e7V  .Ce n. C( feC%#eC%_e Cα e  %6<%2A%O:%4>NONE f&f&& #7!eeCeCe eC`E7V eL ffb  ff  C5 e ` 4F.q"|(+N0swbrt  ' r q! +s2#p G@$spra  s s. @vrtBy Fy@yPw`-tpx!28& z1q&R H--- .(.0.8@6HWyPWXbY`{fI8  ؙ&  m  f A N  %d TASK HEADERS %2R ------ ( OUT OF POOL ) %4SHEADER ADDRESS = %P%6STCB ADDRESS = %P%4SPS=%P%5SPC=%P%4SR0=%P R1=%P R2=%P R3=%P R4=%P R5=%P SP=%P%4SINITIAL PS = %P INITIAL PC = %P INITIAL SP = %P%4SHEADER SIZE = %D. NO. OF WINDOWS = %D. NO. OF LUNS = %D.%4SCURRENT UIC = [%O,%O] DEFAULT UIC = [%O,%O]%4SH.WND = %P H.GARD = %P H.VEXT = %P H.SPRI = %D.%4SDSW = %P H.FCS = %P H.FORT = %P H.OVLY = %P%10S INSTRUCTION SPACE%10S D A T A S P A C E%10S -------------------%4SHEADER:((W%..&؎7 ئزe%++؎7 ئزطe~ؖ%e5 e&e5wR(wR( (( he&٦ e e)ٳ ) &&Ce:%e % Cee  ?) ߐ%CeP) Ce CeCe) |CeCe$Ce<) PCe  Ce  ) &Ce$Ce:Ce.Ce0/* Ce&Ce(Ce*Ce,l*e e** 5e05 e**U el*Ce %XCeHބ׳ ew %4SWINDOW BLOCKS:%5SPAR VIRT LIMITS ATT DESC WND SIZE OFFSET 1ST PDR NO. LAST PDR%5S--- ----------- -------- -------- ------ ------- --- --------%4S%2R %P %P %P %P %P %P %D %P%5SPAR VIRT LIMITS ATT DESC WND SIZE OFFSET%5S--- ----------- -------- -------- ------%4S%2R %P %P %P %P %Pfe$CvCr%e .e% 2.~...,/`/Ce 2E`5>Ce  eeCeCeCeCeCe Ce eCe Cee 51c11111%4SLOGICAL UNIT TABLE:%4S# DEV WINDOW W.CTL W.FCB F.FNUM F.FSEQ F.STAT NAC NLCK%4S- --- ------ ----- ----- ------ ------ ------ --- ----%4S%D %5A%P %P %P %P %P %P %D. %D.%4S%D %5A%P %P %P %P %P %P %D. %D.%4S%D %5A%P%4S%D %5A%P%4S%D %5A%P %P %P%4S%D %5A%P %P %P > > > > > ACP OUT OF MEMORY OR NOT IN EXECUTION%N > > > > > REDIRECTED DEVICES FORM A LOOP FROM UCB AT %P.fCe<9%0e00Ce> P eE (%  A 1 7 e &f0z&@Ce00a8;8vATADATADATA  Ce  ef w2 ЁwdCeE%ICeµ`B-~? :0ee%.-N'  0eeeeeѳ    &eEe5=7 e<e0e&e5"e Z5 3 $e2:m*3 3 e   %6<%2A%O:%4>NONE f&fB&& 4!eeCeCe NeC`E4 Xe &  m  f A N  % CLOCK QUEUE%6SADDRESS = %P REQUEST TYPE = %D TCB = %P TASK = %2R%6SADDRESS = %P REQUEST TYPE = %D%6STIME REQUEST BECOMES DUE = %5Z%6SC.AST = %P C.SRC = %P C.DST = %P EVENT FLAG = %D.%6SC.RSI = %P%P C.UIC = %P%6SC.UIC = %P%6SC.SUB = %P C.AR5 = %P%12S<<<<<< INVALID REQUEST TYPE >>>>>>%12S<<<<<>>>>>t)))))I(( AR*= eP-)ťťe X%ee(  x &  EeZ f&f&e eB eA eA < eA < eP<R) f&f%ee eee % eT*A b \) R5 e4!* *Q6^xwQS ]f@x CONTROLLER INFORMATION%4S%2A%4S--%6SCTB ADDRESS = %P L.DCB = %P%6SL.STS: %R %R %R %R %R %R %R %R%6SCONTROLLER TABLE BLOCK:%6SDEVICES INTERFACED BY THIS CONTROLLER:%6SCOMMON INTERRUPT ADDRESS = %P%8SDCB DEVICE NAME%8S--- -----------%6S%P%8S%2A%6SKRB ADDRESS = %P%6SK.STS: %R %R %R %R %R %R %R %R%6SCONTROLLER REQUEST BLOCK:%12S> > > > > LINK ERROR AT %P, FORWARD POINTER = %P%& )PH) 4,0(  \eLC  CePn9)@) CeF) Ce( j) )Cee EC5eef) Ce51Ce *C) t) * ),C) &e^n!*) *Ce e*n!*e߅fCee =)9C3 -* e( A* d*e eC` eeh %5  N* D߱ffb  ff  C5 e `--00a8e7%4S%6A%4SGLOBAL%6S%6<%2A%O:%4>%4S%6A%4S%6A%4STI - %6ASystem Logicals:%5S%5SBlock: %Q%5SBlock: %6<%Q%6>Status: (%VA)User Logicals:%3STerminal: %5AGroup Logicals:%3SGroup: %QTask Logicals:%3STask: %2R > > > > > LIST OF LOGICAL NAME BLOCKS FORMS A LOOP.5 5  . 58I.5. ;C--e CeCe CeR.-‹.Pq.Ce -Ce ".  h^0   x w(&eD fEEe E eD & w* N\eD   *v& x"k6 w& Y 77 .sE - EE`  .ѝxs.$8+Y E(  8+Е,Е P 8+8+. ڀ,  / " &>,ȋЭ1Н)d%6<%2A%O:%4>NONE f&f&& 3!eeCeCe peC`E3 e &f& v &  m  f A N  %%6N [END OF ANALYSIS OUTPUT]%F%2N *** CDA STATISTICS:%6SERRORS DETECTED: %D.%6STOTAL PAGE FAULTS: %D.%6SSIZE OF CORE BUFFER: %D. WORDS (%D. PAGES)%6SELAPSED TIME: %3Z %VA%NCDA -- Errors detected: %D.%N5*& )+)00a8;8vATADATADATA* T)))6*  ,<7 7 7 tp v2r 5Q wE؇5E؇ >؇ 7 ؇ 0ڇ5Z(5R$ w5B5:52     eE 7؇w75`(\ U  5U@ wwN7-P@ -H w67rއjއ5@f 1 1  W  > 6 w>5R5L65B5:7 7 7  w w w  w x rw` d5 5PL HH@<::؇ 05 5   ؇ ׇ ׇ5Xׇ5Mׇ C5?ׇ 854ׇ -5)|ׇ r"5lfrׇ \5VP^ׇ F B:݇5 ww ( ER( 158(( #0 , 0 0 ( - - ( w̥, ( `-vpmj.( Z ( `( %.7 N& (w<  w0ee7 &fw 7 7 @,q `-KacJE[ !m@  ) L R  j7j f@  &  5]U E( :&@E A  ̆  E vE c  @  . &f1   ~  8  " .$ B  8̥ZḀ90     w R(@f ťZ+ťAť9%ť0ť$ ť  ť.@&fA EAa$EXITLIMITLINESSPSPMEMSIZSTBALLCLICPBATLACTSTDTCBTALHDRDEVDCBSCBUCBPCBPARPOOLPOLSECPOLTISTDSTASADVTSKTASKDMPDUMPKISKDSKMRBLCLQCTLDECNETNETCACHECPRLOWHIGHSYS(2-23292<2?2F2J2N2R2V2Z2^2b2f2j2n2r2v2z2~22222222222222222222222222 += 3, 3ț66X+ /t3R3-3p+ 333h+l3  l3 :3l3†+l3:†+l3:†+l3ț66+ /3R33 :†+R3,ȁ66, ,3/4ʆ ,f. 4 ,4,3ʄ*6 *6 *6*6*6*6*6*6@*6*6*6*6*6*6*6*6*6 5J5R5555*655 5 566 *6"6*6*6*6*6@5*6-5 DENSZ5r5Ib5r5Tj5r5Yr5r5=z5:z5L,5d,5j,5r,*6*6 =5:5*6h/*6*6=5:5΂,:5*6‚:-:†n-*6:5*6‚-:†-*6:‚-:‚-:6*6†-*6:‚.:†.*6:‚,.:†B.*6:†X.*6,3/4ʄz.[.l6ȃ6...6;.6:\6.6[.l6.66.x6Ά.~6,‚/]/.6;6.66"/6;66̂*/H/6$(6_(6&  m  f A N  %&f  %NCDA -- Failed to extend page buffer - %D. pages available%N%NCDA -- Failed to assign LUN to input device %VA%N%NCDA -- Failed to open input file %X%N%NCDA -- Failed to open output file %X%N5UU!& & Y & fY T) w` @)&= E 7 Dڷ5@P?(")  )00a8e7 > > > > KERNEL PAR'S CLOBBERED%4S%P %P %P %P%14S%VS%D %8A%58S%VS%D %8A%4S%P %P %P %P%20SU S E R%5SI S P A C E%11SD S P A C E%5SPDR%7SPAR%11SPDR%7SPAR%14SS U P E R V I S O R%18SK E R N E L PROCESSOR %A %VA (FIRST PROCESSOR TO CRASH)<<<<>>>>%16SCPU ERR = %P%3SMEM SYS ERR = %P%3SCACHE CTL REG = %P5wH|L%> p h%VR|  ee %`@`eeeee5wJ( @(%|­ ++eÝ m>؋%>8(e+ -w 5)-) %   , \  d) B  ) $ )e7 )%1+7 ~ $%+ + + V* |+ n+ d+ Z|* P+ezy+ p ef+ \  >* *|*L   wH -5 |<   %=+_+  h) ^.*  0 ` &+%R%* 0 &f  %  C CE e) @%<%8%%$-n5F-` %ÝD m 5  (%ee28Dz4(.:FLRX^d`fr"$&86rJV\  LOWCORE ALPHABETIZED DUMP %2R% %7S%2R% %7S%2R% %7S%2R%2 22$21J H07  N02 .62 &<2 B2 1  0& x  d^Ze T00a8;8vATADATADATAVXZ7f7 7@778E8q888 8@9:9a9999 : 6:@U:p:::::; I;@i;;;;$<U<< <<=:=h== =@==>A>d>> > SYSTEM COMMON CRASH OCCURRED AT %3Z %Y CURRENT TASK = %2R TCB ADDRESS = %P CURRENT TASK = NULL TASK CURRENT TASKS%6SPROCESSOR %A: %2R TCB = %P%6SPROCESSOR %A: NULL TASK $SYSID = %4A $EXSIZ = %P $SYSIZ = %M./%MK $SYUIC = [%O,%O] $STKDP = %P $COMEF: <33-48> %P <49-64> %P $COMEF: <33-48> %P <49-64> %P SYSTEM NAME = %6A $NTUIC = [%O,%O] LOAD DEVICE = %2A%O LBN = %8A FILE SIZE = %D. LOAD DEVICE = %2A%O LBN = %Q,%P FILE SIZE = %D. SYSTEM HAS STANDARD EXECUTIVE ----------------------------- PRE-GENERATED DISTRIBUTION KIT SYSTEM FEATURE MASK (FIRST WORD) = %P SYSTEM FEATURE MASK (SECOND WORD) = %P SYSTEM FEATURE MASK (THIRD WORD) = %P SYSTEM FEATURE MASK (FOURTH WORD) = %P SYSTEM FEATURE MASK (FIFTH WORD) = %P SYSTEM FEATURE MASK (SIXTH WORD) = %P SYSTEM HARDWARE FEATURE MASK (FIRST WORD) = %P%8SBIT SET%14SMEANING%8S-------%14S------- POOL STATISTICS POOL SIZE (BYTES) = %M. LARGEST FREE BLOCK (BYTES) = %M. TOTAL FREE BYTES = %M. NUMBER OF FRAGMENTS = %D. MINIMUM BLOCK SIZE (BYTES) = %D. POOL BITMAP (CONSTRUCTED FROM LINKED POOL, BLOCK FREE IF BIT SET): > > > > > POOL LINK ERROR AT %P -- FWD PTR = %P SIZE = %P%NCDA -- Pool link error found - continuing%N%10SEXT%8S22-BIT EXTENDED MEMORY SUPPORT%10SMUP%8SMULTI-USER PROTECTION SUPPORT%10SEXV%8S20K EXEC SUPPORTED%10SDRV%8SLOADABLE DRIVER SUPPORT%10SPLA%8SPLAS SUPPORT%10SCAL%8SDYNAMIC CHECKPOINT SPACE ALLOCATION%10SPKT%8SPREALLOCATION OF I/O PACKETS%10SEXP%8SEXTEND TASK DIRECTIVE SUPPORTED%10SLSI%8SPROCESSOR IS LSI-11%10SOFF%8SPARENT/OFFSPRING TASKING SUPPORTED%10SFDT%8SFULL DUPLEX TERMINAL DRIVER%10SX25%8SX.25 COMMUNICATIONS EXEC IS LOADED%10SDYM%8SDYNAMIC MEMORY ALLOCATION SUPPORTED%10SCEX%8SCOMMUNICATIONS EXEC IS LOADED%10SMXT%8SMCR EXIT AFTER EACH COMMAND%10SNLG%8SLOGINS DISABLED%10SDAS%8SKERNEL DATA SPACE SUPPORT%10SLIB%8SSUPERVISOR MODE LIBRARY SUPPORT%10SMP%9SMULTIPROCESSOR SUPPORT%10SEVT%8SEVENT TRACE FEATURE%10SACN%8SACCOUNTING SUPPORTED%10SSDW%8SSHADOW RECORDING SUPPORTED%10SPOL%8SSECONDARY POOL SUPPORTED%10SWND%8SSECONDARY POOL FILE WINDOWS SYSTEM%10SDPR%8SDIRECTIVE PARTITION SYSTEM%10SIRR%8SINSTALL, REQUEST, AND REMOVE TASK SUPPORT%10SGGF%8SGROUP GLOBAL EVENT FLAG SUPPORT%10SRAS%8SRECEIVE/SEND DATA PACKET SUPPORT%10SAHR%8SALTERNATE HEADER REFRESH AREAS SUPPORTED%10SRBN%8SROUND ROBIN SCHEDULING SUPPORTED%10SSWP%8SEXECUTIVE LEVEL DISK SWAPPING SUPPORTED%10SSTP%8SEVENT FLAG MASK IS IN THE TCB%10SCRA%8SSYSTEM SPONTANEOUSLY CRASHED%10SXCR%8SSYSTEM CRASHED FROM XDT%10SEIS%8SSYSTEM REQUIRES THE EXTENDED INSTRUCTION SET%10SSTM%8SSYSTEM HAS SET SYSTEM TIME DIRECTIVE%10SUDS%8SUSER DATA SPACE%10SPRO%8SPROTO TCBS OUT OF POOL%10SXHR%8SEXTERNAL HEADER SUPPORT%10SAST%8SSYSTEM HAS AST SUPPORT%10S11S%8SRSX-11S SYSTEM%10SCLI%8SMULTIPLE CLI SUPPORT%10STCM%8SSYSTEM HAS TTCOM SUPPORT%10SPMN%8SSYSTEM SUPPORTS POOL MONITORING%10SWAT%8SSYSTEM HAS WATCHDOG TIMER SUPPORT%10SRLK%8SSYSTEM SUPPORTS RMS RECORD LOCKING%10SSHF%8SSYSTEM SUPPORTS SHUFFLER%10SSEC%8SSYSTEM SUPPORTS ENHANCED SECURITY%10SCXD%8SCOMM EXEC00a8e7%B-*** #*  (D a Ta+"+ ~ w! bP ewL E σ  >+ z+%z+~e LP w~΃  + PZewEEee+ZP4,  n,%J%B,, p, ( el- b4) eH9- >t) ^e$a- ) :e- r) de- P4* e- P* 5> ( feC5&?e^ eC7. 7 7 7 7 \  w 5we` v`pwl-`k i=VfZ baw!\^2 :ǎ   6  $5FB I. pc. b. T. FƐ .e4. Ƅ e % ee#/ ee/  .!.5 DeDeA? m?e CepLJ%8S%VPf& Z    D  @ @f&  `E L\E  % & `E <E nHJPV(l0 DZ6J>bj4.Rbt|P@:v2FB f<T`Z|*2>,0*^Xdpjv"Rt "4hbn8>,NB(. L@xz&00a8;8vATADATADATAV$,pzP~HTN lD &\<\hz SYSTEM COMMON DUMP ADDR LABEL VALUE ADDR LABEL VALUE ADDR LABEL VALUE%P %2R %P%10S%P %2R %P%10S%P %2R %P%7S%2R %P%17S%2R %P%17S%2R %P%P %2R %P%10S%P %2R %P%7S%2R %P%17S%2R %P%P %2R %P%7S%2R %PGG'HHEH;H  &&,,2>8>JPDJVPV\b\bhntzz4(. "(.4 @LRX^djp"v|(.4:@FLRX^d j$*0p6v|<BHNTZlx " $&,2*80>D6<BHNTZ`fl~Pbhntz  SYSTEM COMMON ALPHABETIZED DUMP %2R% %7S%2R% %7S%2R% %7S%2R%JJJJ  rhG lE7bTHP-V\:}G $7 B-,0bH -$\HdH - XHfH  e A &f, :0 w&fm-ŠŘe e  j7^@`7Z@`7VPR-RLJDC @ ehG E PHJ0 DrHb JJ J J J J  &rH V e w w w w wW JD# DE!J5S   "  4S%BzPwn1S%P 0l NN)N?NMMMM MULTIPROCESSOR TABLES%30SPROCESSOR%18SA%18SA%10SB%18SA%10SB%10SC%18SA%10SB%10SC%10SD%6S%2R%4S%P%6S%2R%4S%P%5S%P%6S%2R%4S%P%5S%P%5S%P%6S%2R%4S%P%5S%P%5S%P%5S%P M0e޽M Խ AMe½MD%  AM &  m  f A N  % CACHE INFORMATION DUMP OF CACHE REGION: %2R -----------------------------DEVICE: %2A%Q: DESCRIPTOR STARTING LOGICAL LENGTH PHYSICAL ADDRESS BLOCK NUMBER (DISK BLOCKS) ADDRESS %8A %8A %Q %P00> > > > > LOOP FOUND IN LINKED LIST IN POOL AT %P> > > > > CACHE REGION WAS NOT FOUND> > > > > CACHE REGION IS NOT IN MEMORY> > > > > REQUESTED PARTITION IS NOT A CACHE REGION> > > > > LOOP FOUND IN CACHE STATISTICS BLOCKS AT %P00> > > > > LOOP FOUND IN CACHE EXTENT DESCRIPTORS AT %8ANO DEVICES HAVE CACHING ASSOCIATED WITH THIS REGION(pe() VJ $D!N <!FCf&e .e $Be!*e e -e!eC) * /* w) * wc* ee5e J7we N ,  :  E   D D D D D D f& ee0 +<ee "eE`71)A)o)eA je2:`D jeD  , `D JeD   E`D eD   +F * f&f +( eD  D eD  )&  m  f A N  %00a8b85. :5" 65 25  5 "~p &    e7 .5  & "  D  %5 7 "   Z   0% wlf@m 7 @eE& j  >w`  p`wBv   C`D # - ` - ` - ` - ` - ` ` ` ` ` - ` - ` ` ` - ` %f 0 -x ~ $p  N L f`& < e  e  o4 2 e 7 f 5 # eEe f& w    `  e  e ߾ eEm 7 X  b- 1| z  & `& b e  eh b eEmV 7R e  oB @ e 7 f eEe L5 f& w `     ` e  w` w-x| heb eE f \` ` @  ef f e` 7 -R d $J  . , f`&  e  e  o e 7 f 5)eEef w` H0 0 e w> e xe m~`~ex reEmf7b8b-R.D& `&  e  e  e eEm7e 7 f d5~(eEef tw`~xv` 0 e f> rze m`H7 :7 h $ vza?   P LD@@e fe?E?@m" & f 6Y w` X @    W  W W | de R   `wl f v C W!W! mDm  D!  -m W!00b88>>!ZJ"l!x!!!!N!RRR' f RPT>fz"L Z" R"r" !j"  ERLCFLError at line '&1 64: .4; &4; 4; 4= 4H= 4T= 4= 4t> 4? 4A 4D 4F 4BM 4`55ew , Bv     5B1 wr 00b8;8vATADATADATA#3'((5  5 2  UE  4"" ((("4E U 5@*& E& & f&ËDef Ë )̋UW l " 5 ߥ& *  + 23E Ew    Е-   0@A DW e`fÊ    E &  m  f A N  %&f w f 2) 8C * ) *w`*  ep p  |ȥ#= EW9ť^*0 ` Ca C  =  R ȥ 0*ȥ = Eե^ Aȥ e@  = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 p  8 V *`)wb C# f   D @)  6?0D)w  n832cd& & & B  2OΕ   N Υ$Ε  22Υ   v Ε f e b* e*wf@)0,    ) @)% ȥ  = ȥ l 0l  ȥ (ȥ- ȥe&=Ba@a e0b eȥe@ ] V= E8 el0  & 0 l0`p l064p 4 ep )wzȥ%  ,   wL  JwZB # f f  `* rwb)0406 l0 *) l0, *) $ )*)0,40,6 e6p 4 8  81416 * : `   8  d**&ff   DP5R RRR ** ..8em,0l0!D0e6p 4.) 8&f 6  e) .  e6p 4 08*w<=p!Օ^> =00l&8el2 0 *141612epl2l0p,*1 U8UMw w B 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ vwf8e2 0,0, f 톇,, w      .% eB U5UU plp & NeՀ)*00b88( & @# *#& V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@&f& v  !w*ˀ    7 DM  '  (7*ۖ%:ߎ w߷eB$& &e*aɋwv x!wjɋ& @   f* 1 4@5 7 @ہ  <<7 7 7 7 7 ڇwɂ m 7 ހ :w ޷7 ހ ]7޷޷޷޷އwz Ԝ\Ԝ]^ ԕ:;d&^ n)@&f& $H VJ LL B  ԕ.N *  ԕ;P (e7b݇wȀ @   B  * v1 7 |هfv   `p  fЕ Е f& ee.w( ^f e wǀ    A @ (*B`ʋ n@ (ʋ \·fɕ I~7 BH0 0 7 z,(2.p( `$ P ~7 7 7 7 ɀ|RxRtRp7 nef faO e $ 7 #&fO 7w5f 4 e wef   @ = , @7x tޣ w^޷\wX ̇wBCm>54Cm0ނ  f ( ~ > f >~ wDe G @ 0 9 A Z _ a z . : ;ރ [   W] "   W" , =  ˷@f5,$ O Z  4 ׭/   55%%wbfj`!5 SW aW z@ ##W ' ! ˓'W W  !   f˕  f؇wf؀`   f  O  E f&ff& e 醦 w A~eff  $W. .N  5  W= W  ! W0!W9 ! B0  `%aW' @ CА '!W'@ &f eWT00b8;8vATADATADATAWF&  @ ~ w:^ef  W   w @ 0 9  A Z _   wռW   @fa a P& O ze  hea a& & Ɓe $G &7`"w &S 7`w 6e  <e& aa : efO e  & aa  >fO he  VeNeef p &     nf OO  O ޾3 hjK ¾e$f 5, a a & O `e  Ne  e52 .5( h5M &  aa f =&O e *e@e E@b   ef  e e ew~e z/b7 O ~`N r @eE@`C O NNe D e    w e7 w57 O  z r Ѳe-Ѷ@ `7` ߠeEm7&  v Be eE` f j%Lх   7!0*7&`΀  7PH0p0 I* wμ de eE`@   wЁ 5~2 0O Nx ƿO   md   O be X ޿ ֿ b 1 1 D mee ҃ f  E@`ewһ53O ܾN O ʾ  m  O  ҾO e   pf   (–%ɐ 1 C( m&π@`w( 5w-7 P   w!wO AaN Խ Z RvvaB eE` wdO `  @ P 8 eE`enPC (   8O 0 D \O  P N` мP W  PP ܼH  N`  B  N`    f Xe &N`   &  f e b μw ¼w:  w57 S   zXS (  ^N ʻ P  N O N л 7 S   S lH  T Prl z ʻ:T 46 b  RT  B  xT R  nT غp  V `-XRT HR ܺ , $T Tр   U n(   ޺4U H8 ̶ h ef e6"e@N N #ZO-: 19SY:.CNFSY:.SYMSY:.ICFSY:.LSTCFL>Option>/OPLITERAL\BORSX-11 CFL-16 V2.00PageGroup Symbol    Offset Uses Group Symbols" Group Literals Type Length ValueNUMERICSTRINGASCIIRSXTIMVMSTIMPOINTERLOGICAL8P@PHPNPVP^PfP 'FalseTrue+ Group Allocation type Count Size (bytes): Named Literals (these do not take up space in the module) Literal name descriptors  Literal data descriptors  Module Header Module header  Module Symbol Table Group name descriptors  Symbol name descriptors  Module Procedure Area Procedure Descriptors  Statement Block headers  Statement Descriptors " Statement Extension Descriptors Expressions Expression Headers  Operators and Function Calls  Symbol References  Literal Data Data Areas Variable Data  Table Data  Symbol Declaration Descriptors Conditional Descriptors  BIT and FIELD type Symbols  Data Symbols  Symbol Names PP00b98QNQbQxQQQQQQRȋ@ w נ%נ*נ$נ_נ-נ.נ0נ9נAנZ݃Ƞ נ0נ7נ*נ,A oȠm k  tנ"A   &A fנ$נ%נ*נ0נ9נAנZנ_נ-נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (w>נ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0 ` E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D : cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ \ eB  Dҁ CSĊ t WC E Cs Ε f)& 6 l(*  E 'W " =N  W :+W = 1 #W ,W / %W %W *Հ W <W [W >W ] v(* 6 ew 0*8I H *=)98 eB &&  U ؉**e *Nlv ΋*.2 x & #!)&eP(e && >e >E <؆p*  wZw (SB C DBe ?D1 J'&UBe(e$2e 4%[]%<>  1 >w b( D D 8"!#($ĥ ĥ w 0 *0 @Q$    0 40 60))eB   w:#  w(&* =ȥwz `p!2 EW!p0p252e( (<'##UfE @#U   P3)/ #( P)  @#**fff 8  &*wp. tB5(8e$8w2A&(e 4p8q  (#4=A#@)( j *O*)@#0l @# 02ȕ8 :00ĥ݇AĥĊ  ȕ000 p0 @0 &*0 @ & & .e# eB&B pB T * eBe>  # #D #=0/H#@&0 # = e0   T0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2eB  8 R$&w n*(5<w1  U U@  f&" -'&Q'&&**%*$ (%0 *&* *5ND  h<  EU  "  w P*D ]Xf(e<5"ӕ_ S :ӕ: 00b 9;8vATADATADATA& "& Ε4'& &*'&**UqqC ӥ:  Ce 8   >*w X*  ע"wf)Ĕ%.&%;D  5)5@DD ͥ*Ce e%w U\5@ 5U U*U  "5@\U@5 5LU*U  ʥ*%C!.D` t *weC5U5  5 5@e*=U Ee& REe  ӥ" wV ˥"   ˥" Ք     Օ (B*A(  D(cA  (e^%&(8e(H!&(+rDe* fЕ[ Е, Е]"0 e w |www j ($0,0w 46 V ()0406 0 *82e&( j0 0 0 80 B0 0 0 0)#0.)"(. = . B  E (.f&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ w *D  ww 0) * w46l0 Mw   f j >5>Eu rˁ  f &* *w ,BC "&0(*7e "fSYqq1յ<pBՋ.p0p2&* 0=E%0=ww eE D` bl lrw ʿ  B eE"s    s-  CslW=f(& e %&&eH =&e0  U   E > >E(5E=uf Rp  wn(eff NeP   #llD &eJ Ԕ %:ԕ: f"& f&f& & Ε lle  &*@<#8w  /$ ,:T < U@% DD%][%><w^  w 1  %,,:4 Jĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ >z  RDEe    *1  ˕03 "   ˔Ӕ ʥ75%& w >&Ba +- ʥ# . U 0   b   `     &fe    : $ L ( La Ta  @ `W!ZW!AW!9W!0@ 8   * ^  4 6 e6p 4&*&4&6= 64 wz%!64=5 ¿2 6  l0 & Z46 fð64 :)0406 0 *0e6p 4 = =D R `p46 ޾f 64/=  @) 0  8w< 46 8 e*wp w X w N& W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C (e( 1  `((   >: 5 eCew  ) H  fU %  BA `6p 4p`4 %60 400b98 w> Rebɕ ?? ɕ ɕwɕ 1 Nwwɕɕ 1 CS 8  wxɕ  *1 wzɕ w H^ɕ 2wqɕ w  +ɕɕɕɕ ɕ! p dɕ" w8\ 2w :& rw$qS < ܇ R  7 9 TX d T  X V b*  wXX v 4?( V>Rw7 7 ݮ Շ7 ۇ7 ۇ54 z XU  w  !   $wwP-T wwy  w|yw~wL|wdlڇ z $0!"   dY#""\ z·d& Z ew wb&  :W N d $)& pr/)l ڰ ڮ{ &  <4e H57 ڇ ч5l 5`D 5Pf& ` # tD d5L T 6  $Ne Җ%% , &'(5T 0  v f( fe N p jp 3e 4Y& ve ,f0$efPS Z t 0 > GlY2$ $ $fJ  v N؎ N 0 |ظee  Ueև  V   W  ևwXāw 5@B  eeeb&  - ʎ& NrNb і%    Pװ efՁ wE 05j ʖ%t0 wrZׅW!  - -BՀ 7N @5e ҁ @ E N e 5 X!! Z wa\Ԗ%f5R<  8D * L J v5  LN N %w5nՂ   0 @ lY lY >@` lYȕȕȕ@` lYȕ ȕ ȕȕ(ȕ@` lYȕȕȕȕPȕ  LJ-Ԩ5  ,e-| pl*0 7 \7Vԇ-NԨ00b9;8vATADATADATA R/>* -2| 6 Ԉ0 7 7ԇ-Ө /*  X/* -Ӣ5  d7 e   L ? eӇw-Ө vӗ  #p4ف \p  ,  5|\ H */0*  %eӇw*-Ө /)  RRB l  ؀  0 E@  lZ & ΐ +& ΐ +& ΐ + & ΐ +& ΐ +%  5zd F ( )%e ҇w65:t 7! eE@f p@  %Rׇw½W  D W    W WW BtW LfW QX W VJ FA  lZ .ć"ччч ччЇЇf5 2 `ıNe *Ȗ%w-f @ ааw w·f-  Xzv, DedwNmNHwHmBB@ lPZ2ew w` eZ͊ &  N -޾n i U Z Q N (1Ee 7 7 9e 2e N ϰ / pe " NNe s>eb4l κ1a @eb> 1v&&z rflbE -R @IE - $ Xv %, , 0NmDE @ 4 $ v Pew   D!&&f& be ew m/ efN`& e   wZ  @ eQ&fE ȶe W  @Fh eQ&fFhE& e W @7 m W AW Z-7e h 7h 7h 7h 7R7 D7 F7 7 4 w)     ^ ~ 5wR6 7Q7 -1  BY AY 2V[ 2r]  V[ m_ c 5 -x n5 @4g & 2  B`7"0%W0.W9+- -W'  -tׯ'" pUSHUTRUU^U`hUatUbUcUpUqUUUUUUUV V,V6V@VLVVV^VhVrVVVVVVVVVVVWW"W.W  LRXrx $hHN. *444r 6<@(T\d "HRNj&.h F 2<FL2V`jp (0<FLRX^d60jpv60|6060606".28``2zH R X ^ d ~ V2.00 (Ht8L   (4 "**2:4BHVh~DPdp ()*+,4<DJPTUVixz !"$&)*,/25:LMNOPQbdeuxz{~ %,8L&5DX^`j~ %,8L!-/:?OQS]eoz|,,N %,8L %,8L %,8L,8L,8L8L,, -/4:>OQ\dntvz|"-/?OQS]eoz|4RdvS %,8L '7GYa,MZ^c %,8L %,8LP %,8Ls%,$).=CJPShnrx,,\Nn4Rdv!-/4:?OQ]dovz|,>\$).=CJPShnrx$).=CJPShnrx$).=CJPShnrx,[nt,>\P,P;x,S%,wS'7GYa$).=CJPShnrx,,,,$).=CJPShnrxnt, -/:>OQS\eoz|Chr, , %,8L,fsuy{$.=CJPShnrx %,8LC !,/i, %,8Lg, ,i4Rd4Rd!-/:?OQS]eoz|,,P !,/i !,/i  %,8Lx3 fsuy{ !,/i  ,/>\fisuy{$P %,9L&6FX^`m~ %,9L#-2\ $*.=CJPShnrx $*.=CJPShnrx$+.=CKPShnrx,[nt,>\P,P<x,S%,wS(7IYb$+.=CKPShnrx,,,,$+.=CKPShnrxnt,#-2\fisuy{ $P !"$%&)*.1567<?@DEGHIJKLMNPQRTUWXY[\]_`bcdfghjkmnpqstvwyz|}     !"$,./67:;<=?@ABCDEFGHIJKLMNOPQTUYZ]abilnrstvwxyz{}   !"#$%&'()-79:ABEFGHJKLMNOPQRSTUYZ^afghmqrvwyz{|}~      "$%&'()+,-./0123456789;<=>?@ABCDEGHIJKLM似+( 3&)024#,.:%*567;19-!"'$8/DCTUUUUba쮮EEEEFEEEEEFEE\\\\\\\\\]\\pqNORSSSVVVVVVVVVVWVVVVVVVVVWVVVVVVVVWVVVVVWVVVVo}~00b*9;8vATADATADATA GHJKJXY[Zcdcmmnfef ==rrrrrr`_iiiiiiiiijiih@BAILMMttttttvvvvvvlkuuuuuuyz|y{ywwxwwwxxxwxxxxҩ^_ZUײվZs  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~^p_ZG"Z?/?<#]uABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_$_|_namenumeric-literalstring-literal444Zf\fffffffffffffffffffffffffffffffffffffffffffffffffffff;(),.=[]:+-|*/><%#DOTOIFOFBYEQNEGTGELTLEOR_|_END$IFSETPUTGETNOTBITHEXBCDANDXORMODnameCALLTHENCASEFILEFINDLISTFLAGELSEBYTEWORDFILLNULLTRUEBEGINWHILEUNTIL$THEN$ELSEWRITELEAVETABLECRASHNAMEDASCIIVALUEFIELDOCTALRAD50WIDTHMATCHSHIFTFALSECOUNTMODULEPACKETFORMATRETURNEND_IFSELECTSEARCHENABLESIGNALDECODESTRINGBINARYLENGTHLITERAL$END_IFDECLAREPOINTERMESSAGELOGICALDECIMALMACHINECONTEXTEND_CASEEXTERNALEND_FILEEND_LISTREPEATEDRESERVEDLONGWORDQUADWORDRSX_TIMEVMS_TIME PROCEDURE SUBPACKET INCREMENT DECREMENT COROUTINE END_TABLE END_MODULE END_PACKET END_SELECT END_DECODE PARAMETERS END_DECLARE WRITE_GROUP BEGIN_TABLE SIGNAL_STOP WRITE_PACKET RSX_LONGWORD DYNAMIC_TABLEstring-literalnumeric-literaliiiiiiiiiiiiiiijjj jjjjj j$j(j,j0j4j8j?BDFJOOSSX]bddflptwz|             "$&(**,.022468::<>@BDDGGGGGIMRRRSSTVWXXXY[[[]___acccccfffffffiitג =°†yuuȔȔPPɤně.Rdv{ssfцg$3Ȥnwنٛ۲ țʷʷɞ .: Rd=ݨ:  :  Ƹ肙͍̄̄̄̄̄̄̄̊ t4Ds l4Ds d4t \4Ds T,5Tv L85t DD5pz N 8ӎ Unimplemented error message-F- 55 55 CSYNTAXERR, Syntax error. PRSSTKOVR, Parse stack overflow.%PARSEREOF, Premature EOF encountered..NOQUOTE, String literal missing closing quote.$ILLCHAR, Illegal character in input.>RESINVPRT, Print expression list not allowed on RESERVED data.@RESBITILL, A BIT or FIELD data item cannot be declared RESERVED.;BITNOPREC, A BIT or FIELD must have a preceeding data item.CBITNOTVAR, A BIT or FIELD not allowed on variable length data item.DNUMFILLCH, A print fill character string must contain one character.ANULLOPERA, Internal - Null suffix operand on non-suffix operator.*INVFUNCT, Invalid function name specified.@INTFUNMIS, Internal - Function code missing from operator stack.3MODATTRIN, Invalid module attribute name specified.:FLUSHINV, FLUSH attribute not allowed with KEEP attribute. KEEPINV, 4TABLEBIG, TABLE element has too many literal values.4TABLESMAL, TABLE element has too few literal values.2BYTERAD50, A BYTE data item cannot print in RAD50.=INVNUMSIZ, Internal - A numeric variable has an invalid size.RADINVRAD, Invalid radix character specified in radix literal.7PROSTKOVR, Compiler internal production stack overflow.CINTPROUND, Internal - Compiler internal production stack underflow.BINTWRONGP, Internal - Wrong production popped internal production.9BITNUMINV, BIT number outside the the declared data item.@FIELDBITI, FIELD starting bit is outside the declared data item.0FIELDSMAL, FIELD width must be at least one bit.7FIELDBIG, FIELD exceeds size of the declared data item.8WRITEDES, WRITE-class statement has invalid destination.CSYMNOTLIT, Specified LITERAL symbol name not part of LITERAL group.HSYMNOTCOM, A variable is not valid in a compiletime constant expression.HVARLITGRP, A variable name cannot have the same group name as a LITERAL.?OPRNOTCOM, Operator in CTCE cannot be evaluated at compiletime.HFUNNOTCOM, Function call not allowed in compiletime con00b:9;8vATADATADATAstant expression.:FUNWRONGC, Incorrect number of arguments in function call.8j8889&9\999:B:::;F;;; f>>>.?x??@>@|@@@&AnAAA:BnBBBBCJCzCC <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 file are not allowed to span blocks.4MEMINIFAI, Memory allocation initialization failure.CMEMALLFAI, Memory allocation failure - insufficient virtual memory.5@6d6666$7J7r777$8^8888*9^999:@:::;$;B;;;;5L  f  & <%&yf& eRwJ - 7,e@xy xy 8e0#9e ~ z v rn@7je@dw^ wxyNm>  Əe7600w ly@T 6f  f& ePy&  a 00bB98m? ;&( D / D!0!9"!A!Z@!a!z`!$ !.!  a %    ew y&  a @a$&6   -v    +  l e ( !0!90 !A!Z7v l ړ D ֝ 5 @P P P H  f ew  l     0W l Z& @`% . &2f@ l{ 1 L& \* 0 W  f > f f z  f ff J w  П  m  D`f ew\  a& Ɲ bvA`f vf&& f& ew& -` &  `  @!L 5f @%f e m&E& v ewPB{&  a $          m"'  a@`Em$@ m*&fE& ҋe *e &a ޜew-      lD{55  5`  f r wH v  &af   , ,,"  e ! B` D` D  ҋ  D ыR     lL{D V       f zewN)W W W { { f 6  GlX{@A P@A P@A P@A H@  @TTTR@BDQBDQBDQBBQ  6 v       Z W R Obu u u lu u lu l  - <L{ ,@- @ D 4.- @ MDC J  f ԙ%  N&&N e$  Ě5 ~ K J    D e Aed lw     f  & & & @& Е ~ Ne ѕ  ѕ: ѕ:  e e/ѐe:w܉ &  w   M u @ A -#  w|   @M u u u @ A B - #  wDf   E D @ A s     u&@eH p p eH p eH cQ<[y1OJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw$  l2x ԗx >65 awf ta 6  C ڝ  S   8    v``W  f N&f` Ҍ et n L  4  `; D    N`f& e 7B 2  B`  &f e    Bԗ a z %ew*)& & - Hv6v`  ̕  &v6v` "  E`D`  D!"6  # D!     ƜHe w@     @C`B` 6   $ - . 0 ; A Z _ a zۃ [ פ] " פ" @  % 28R r 04`5|,]]Yv b PPb  &[q b 2 \PTITISYSYSYTISYSYOVjll 00cR980 < 0 < 0 < P 0 < 00cZ9O9vATADATADATALkl  Fl , , ,=<T|=TT>T?,@lHLULUOUSUWU< 80 <  #w 85m&&  X6e"-  C P e   e f6   f6    & & @( f  e ee e w x5 funhj uhdB$ 0jwaw< 8 v8w &  *AdBbAep& f   P aAAf@pnp C*8֋ J88*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ ŀajTI& af* n*`V @e,w jjlj ɥ@@aujk,bp 5f fˇ ȕ ‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ HDlljaCeH###33 & B8 *nw ^ 8jDl@ TeBT85l@ @( D neB& x & @# `& V An5jP a@@` > ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ jwǀ     7 DM < 0  & < 0  7*z%: nwhfeB$& e*aɋw. w"ɋ& @   f 1 4@5 07   <<7 7 7 7 7 wł m 7  :w |z7 v ]7fb`\XVw`$ Ԝ\Ԝ]^ ԕ:;& @&f& H NJ DL :  ԕ.N "  ԕ;P "e7wĀ  @   B  * 1 :z7 4f.   `p  $$f$Е Е f& ee$w  e wÀ     A @ "*B`ʋ @ ʋ LJfɕ I~7 H0 \0 ^7 2(00cb98 f >~ w*e&  G @ 0 9 A Z _ a z . : ;ރ [   W] "   W" , =  ķ@f5$ 0 Zj  4 `׭/   55%%wH"`!5 SW aW z@ ##W ' ! >ē'W W  !   ˕  wο`     0  E f&f& e 醦 wn A6ef  ^W. hN  85 L W= 0W  ! W0!W9 ! B0  ̽`%aW' @ CА '!W'@ &f eWTWF&  z w e  VW   Bw @ 0 9  A Z _   wzxtW   @fa a P& 0 ze  ea a& & Ŀe $G 7`w `S 7`w pe  <e& aa : ef~0 e  & aa  >f0 he  eeef   8 ,  f 00   0- ĺw h"$$ e$f 5J, a a & 0 `e  e  e5 .5 h5M &  aa f =&0 e *e@e E@b   ehf  e e ewd>e 2/b7 @0 `N  2 @eE@`C 0 Ne ~ e    w e7 w57 0 .  jed`-\n@ L`b7`^ XeEmL7H&  8v Be eE` f j%ޅ   7!7ۀ  70p0 I w de eE`@  P wD݁ 562 j0 ԸN0 0 ¸  m   ڸ0 e    b 1 1 D mee ҃ f ж E@`ew5p30 Nr B0  r mZ  0 ޷ 0 η>e · H (f   b%ɐ 1 C mۀ@`w 5w-۰7 1 @ Ʒ w!w0 AaN   vvaB eE` wd0 Ҷ` ȶ @ ~1 r eE`e`1C ( J  r0 j D 0 X 1 JN` 1 6 W  11 H  N` 2  N`  x f e &N`   & 2 Ŀf Te b w w:  wڴ57 4 6  J4 (  N    N\ 0 ܴN^  Z7 P4  D <4 H д 5 *$  ,5 n   D5 ND | ̴ Ĵj5 .@ X 5 ( @ -ް5   f ^5 ȳ&݀   >6  ز ȳ &6 00cj9O9vATADATADATA"   ef e6"e@-: 19SY:.CNFSY:.SYMSY:.ICFSY:.LSTCFL>Option>/OPLITERAL#0RSX-11 CFL-16 V2.00PageGroup Symbol    Offset Uses Group Symbols" Group Literals Type Length ValueNUMERICSTRINGASCIIRSXTIMVMSTIMPOINTERLOGICAL*121:1@1H1P1X1 'FalseTrue+ Group Allocation type Count Size (bytes): Named Literals (these do not take up space in the module) Literal name descriptors  Literal data descriptors  Module Header Module header  Module Symbol Table Group name descriptors  Symbol name descriptors  Module Procedure Area Procedure Descriptors  Statement Block headers  Statement Descriptors " Statement Extension Descriptors Expressions Expression Headers  Operators and Function Calls  Symbol References  Literal Data Data Areas Variable Data  Table Data  Symbol Declaration Descriptors Conditional Descriptors  BIT and FIELD type Symbols  Data Symbols  Symbol Names 111202@2T2j222222 3.3 <3 T3 t3 333 3334&484Allocation Information:Additional Statistics: Total Module Size (bytes) % Total Module Allocated Size (bytes)  Total Source Lines $ Number of constant folds performed ) Maximum literal value heap size (bytes) $ Number of heap garbage collections ) Maximum literal value heap used (bytes)  Maximum value stack entries ! Maximum operator stack entries Maximum compile stack entries 2U *Z "LZ Z&  m  f A N  %48, \ TXL8<Hf)aa& & j́ ?N 4 wN W  ׭ 5|(7 %5n!7  F9  jb ,9 N4  j %4~ewD 8  d   l 9  e& Ȏ 8  e χ C   4 b{ lR?NwJ 6 8yn0 uT k e " 9|Bl ɕ z1  0M ɕ- ɕ$ ɕɕɕ @`w@  1 ɕwe f ̎wɕ ɕ@`ȕȕɕɕ ɕ > w> RBeb6nɕ ?? ɕ ɕwɕ 1 Nwwɕɕ 1 C4 8 wxɕ p *1 wzɕ Z>w 8^ɕ "wZqɕ w  +ɕɕɕɕ ɕ! p dɕ" w8 z2wz^ & bwqP4 < , R  7 900cr98Rw7 P7 N8 ͇:7 87 0,5"4 j XU  w  ! t  $wwP-T "wwy  w|yw~wL|wd z $0!"   dY#""\ jƇ&  ew wb&  8 N d )& tpr/j)l Z X{ & JD<6 22e 857 . ɇ5 5D 5f& ` # D T5L D 6 t $Ne ʖ%% , &'(54T  ^v v fX(. f8e ^N    p 0e $:& e ȼ0$ef4 Z t  Gl:$ $ $fz fB ZN.P pN 0G  ,&e$e  Ue  V   W  ww 5@B  eeeb&  -0 Ž& NNb ɖ% `   @D㰝 ef,2 w,E&" >05 –%0 wW!  - - 7Eߒ r|p0D5p5f .~ .N 05B.e ҁ R@ E N e 5 !!  waߖ%f5<  D  L ހ fpH5t  %wJ5@n,   0 @ l: l: >@` l:ȕȕȕ@` l:ȕ ȕ ȕȕ(ȕ@` l:ȕȕȕȕPȕ  -5L  e- v*0 7 7߇- B/* - &߈0 7 z7t߇-l /\*  X/P* ־-@5p  d7 be"   Lx2?. eއw<- zޗ  # p  * v 5\ 8 */*  %e|އwƹ-r /b) R qqB l  L  0 E@  l: & ΐ )& ΐ )& ΐ ) & ΐ )& ΐ )%  r5d 6 ( )%ez݇wҸ5t 7!. eEf `@  %Fw^W  D W    |W WW BW LW Q W V 6A  l: ܇܇܇x܇p܇h܇`܇f5 һ  PNe %wV-Dڪ 2.@ ܰDܰw wڇf-"  Hv, 4ewm۶wm۰@ l;eww`eئ&  rN -fn ʺi U J Q `N 1E8e 7 >7 @9"e 2eF N ʾڰ / ںe ֿ"  Ne seb j1a @~ebt <1v\&P& rfBb8E - zIE -00cz9O9vATADATADATA$ H| %, f, mPE @ 4 *  @ew  0 D!&$&f& e ew> ~N/ efN`& e   w  @ e&fE de W  @I e&fIE& 2e W @7 ~N W AW Z-7e RI 7XI 7^I 7pI 7n7 `7 b7 7 P w>) 8   0 z ~ 5 wR6 77 -1  BN: AP: 2"< 2>>  "< mZ@ ܒD 5 - n5 @H &*. e R@ eG&fE& 0e NO6 c  *7 d7 4@ Pc  1fR @ eH&fE& e Ɔw-5 %f)aa X7 7 n @m7j few5N7 :7 7 -:|  5-(j ^  lI  @ ~N?: 4] B  (,      -  e&E& ve -x*.7 d! ܂O ܁O @ .&~N&~Ne& e w2 B n$ `\ W aW z p. <Z ή " B`7>08%W0.W9+- -W'  -ׯ'> p. ,$ tFLUSHKEEP44COMMANDERRORINPUTOUTPUTREPORTUSER&4.444:4B4J4CLEARDELETEFIRSTLOADMOVENEXTPREVIOUSRESETj4p4x4 ~4 4 4 4 4CND$IF CND$SELECTCNV$BCD CNV$BINARY CNV$DECIMAL CNV$DECIMAL_PCNV$HEX CNV$MACHINE CNV$OCTAL CNV$RAD50 CNV$RSX_TIME CNV$STRING CNV$VMS_TIMECOD$BCD COD$BINARY COD$DECIMALCOD$HEX COD$MACHINE COD$OCTAL COD$RSX_TIME COD$VMS_TIMECOM$AND COM$HARDWARE COM$LONGWORD COM$NEGATECOM$NULL CTL$CLOSECTL$EOFCTL$FILE_STATUS CTL$INPUTCTL$OPEN CTL$STATUSLOK$BYTE LOK$LENGTH LOK$LONGWORDLOK$WORD PKT$IDENT PKT$MODULE RPT$COMMAND RPT$IDENTRPT$LINE_REMAINING RPT$LINE_SKIPRPT$PAGE_CURRENTRPT$PAGE_DEFAULTRPT$PAGE_REMAINING RPT$PAGE_SIZE RPT$STATUSSTR$CHARSTR$FILE STR$LENGTH STR$MATCHSTR$PAD STR$PARSE STR$QUOTE STR$REMAINING STR$SEARCH STR$TRAIL STR$UPCASETIM$RSX_CURRENT TIM$RSX_DATE TIM$RSX_NULL TIM$RSX_VMSTIM$VMS_CURRENT TIM$VMS_DATE TIM$VMS_MINUS TIM$VMS_NULL TIM$VMS_PLUS TIM$VMS_RSX USR$STRING444 4!4"4#5$ 5%5&"5',5(:5)F5*T50\51h52t53|545556575@5A5B5C5D5P5Q5R 6S6T6U*6`46a@6bN6cX6pb6qn6z6666666667 77"7*747>7L7X7b7n7~7777777777  LRXrx $hHN. *444r 6<@(T\d "HRNj&.h F 2<FL2V`jp (0<FLRX^d60jpv60|6060606".28``2zH R X ^ d ~ V2.00 (Ht8L   (4 "**2:4BHVh~DPdp ()*+,4<DJPTUVixz !"$&)*,/25:LMNOPQbdeuxz{~ %,8L&5DX^`j~ %,8L!-/:?OQS]eoz|,,N %,8L %,8L %,8L,8L,8L8L,, -/4:>OQ\dntvz|"-/?OQS]eoz|4RdvS %,8L '7GYa,MZ^c %,8L %,8LP %,8Ls%,$).=CJPShnrx,,\Nn4Rdv!-/4:?OQ]dovz|,>\$).=CJPShnrx$).=CJPShnrx$).=CJPShnrx,[nt,>\P,P;x,S%,wS'7GYa$).=CJPShnrx,,,,$).=CJPShnrxnt, -/:>OQS\eoz|Chr, , %,8L,fsuy{$.=CJPShnrx %,8LC !,/i, %,8Lg, ,i4Rd4Rd!-/:?OQS]eoz|,,P !,/i !,/i  %,8Lx3 fsuy{ !,/i  00c98\fisuy{$P %,9L&6FX^`m~ %,9L#-2\ $*.=CJPShnrx $*.=CJPShnrx$+.=CKPShnrx,[nt,>\P,P<x,S%,wS(7IYb$+.=CKPShnrx,,,,$+.=CKPShnrxnt,#-2\fisuy{ $P !"$%&)*.1567<?@DEGHIJKLMNPQRTUWXY[\]_`bcdfghjkmnpqstvwyz|}     !"$,./67:;<=?@ABCDEFGHIJKLMNOPQTUYZ]abilnrstvwxyz{}   !"#$%&'()-79:ABEFGHJKLMNOPQRSTUYZ^afghmqrvwyz{|}~      "$%&'()+,-./0123456789;<=>?@ABCDEGHIJKLM似+( 3&)024#,.:%*567;19-!"'$8/DCTUUUUba쮮EEEEFEEEEEFEE\\\\\\\\\]\\pqNORSSSVVVVVVVVVVWVVVVVVVVVWVVVVVVVVWVVVVVWVVVVo}~ GHJKJXY[Zcdcmmnfef ==rrrrrr`_iiiiiiiiijiih@BAILMMttttttvvvvvvlkuuuuuuyz|y{ywwxwwwxxxwxxxxҩ^_ZUײվZs  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~^p_ZG"Z?/?<#]uABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_$_|_namenumeric-literalstring-literal444Zf\fffffffffffffffffffffffffffffffffffffffffffffffffffff;(),.=[]:+-|*/><%#DOTOIFOFBYEQNEGTGELTLEOR_|_END$IFSETPUTGETNOTBITHEXBCDANDXORMODnameCALLTHENCASEFILEFINDLISTFLAGELSEBYTEWORDFILLNULLTRUEBEGINWHILEUNTIL$THEN$ELSEWRITELEAVETABLECRASHNAMEDASCIIVALUEFIELDOCTALRAD50WIDTHMATCHSHIFTFALSECOUNTMODULEPACKETFORMATRETURNEND_IFSELECTSEARCHENABLESIGNALDECODESTRINGBINARYLENGTHLITERAL$END_IFDECLAREPOINTERMESSAGELOGICALDECIMALMACHINECONTEXTEND_CASEEXTERNALEND_FILEEND_LISTREPEATEDRESERVEDLONGWORDQUADWORDRSX_TIMEVMS_TIME PROCEDURE SUBPACKET INCREMENT DECREMENT COROUTINE END_TABLE END_MODULE END_PACKET END_SELECT END_DECODE PARAMETERS END_DECLARE WRITE_GROUP BEGIN_TABLE SIGNAL_S00c9O9vATADATADATATOP WRITE_PACKET RSX_LONGWORD DYNAMIC_TABLEstring-literalnumeric-literalJJJJJJJJJJJJJJJJJJJJJJJJJJJJKKK KKKK$K*K0K6KLFLNLVL^LfLnLvL~LLLLLLLLLLLLLLLMMM$M.M8MBMLMVM`MjMtMMMMMMMMMMMMNN"N0N>NLN\NlN,:N[dnty}   #%*+++06>?BDFJOOSSX]bddflptwz|             "$&(**,.022468::<>@BDDGGGGGIMRRRSSTVWXXXY[[[]___acccccfffffffiitג =°†yuuȔȔPPɤně.Rdv{ssfцg$3Ȥnwنٛ۲ țʷʷɞ .: Rd=ݨ:  :  Ƹ肙͍̄̄̄̄̄̄̄̊ T T T T .W U zLZ rUw(    l^U J1     8f ƙN& `e U|U  e&   ̒  l  "f&& ewX Ee0 9e Ҁ e0 9e %     (  &&,Z<` U Z Zw6  l6U F<BCw| ě 42-  @`eBwDa     Be&& ` e0  l:U   F Hf Ęf& e  (. 0.W (V ZwF)@  lT JV  C @6 T1/5 1    l f @D C  QP  < f e  &   %ABCDEFHJKLMNPRSTUV 4f E &! V& T 7  @ 8N 2͎ Unimplemented error message-F-   $SYNTAXERR, Syntax error. PRSSTKOVR, Parse stack overflow.%PARSEREOF, Premature EOF encountered..NOQUOTE, String literal missing closing quote.$ILLCHAR, Illegal character in input.>RESINVPRT, Print expression list not allowed on RESERVED data.@RESBITILL, A BIT or FIELD data item cannot be declared RESERVED.;BITNOPREC, A BIT or FIELD must have a preceeding data item.CBITNOTVAR, A BIT or FIELD not allowed on variable length data item.DNUMFILLCH, A print fill character string must contain one00c98RADINVRAD, Invalid radix character specified in radix literal.7PROSTKOVR, Compiler internal production stack overflow.CINTPROUND, Internal - Compiler internal production stack underflow.BINTWRONGP, Internal - Wrong production popped internal production.9BITNUMINV, BIT number outside the the declared data item.@FIELDBITI, FIELD starting bit is outside the declared data item.0FIELDSMAL, FIELD width must be at least one bit.7FIELDBIG, FIELD exceeds size of the declared data item.8WRITEDES, WRITE-class statement has invalid destination.CSYMNOTLIT, Specified LITERAL symbol name not part of LITERAL group.HSYMNOTCOM, A variable is not valid in a compiletime constant expression.HVARLITGRP, A variable name cannot have the same group name as a LITERAL.?OPRNOTCOM, Operator in CTCE cannot be evaluated at compiletime.HFUNNOTCOM, Function call not allowed in compiletime constant expression.:FUNWRONGC, Incorrect number of arguments in function call. 6x(^LNLL2lD !H!!!!:"|""#:#`####$F$v$ ZCOPRINVLOG, 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.;BITTOOH00c9O9vATADATADATAIG, 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 file are not allowed to span blocks.4MEMINIFAI, Memory allocation initialization failure.CMEMALLFAI, Memory allocation failure - insufficient virtual memory. 0l>z*Z*L RVw@U 7X   lRZt   eNP-7 *Cz5L  f Θ  & ԋ%B<&PZf& eRw -  ֜7,e@U U $e0#9e    @7e@w wFUmz  Ve7rllw l`Z@T "f  f& eP^Z&  a d R@ !\ ďe `&&E f a ef * f ew0 a-d :- *m? ;&( ܉ / D!0!9"!A!Z@!a!z`!$ !.!  a %    ewR pZ&  a ؆a$&6   -v    +  l e ( !0!90 !A!Z7v l ƍ D — 5 @P P P H  f ewP  l p     0W l F& @`% . &2 f@ l[ 1 6& \*  W  f > f f z  f ff J w, ̙   m  .`f ew t a&  LvA`f `f&& f& @ew& -`   `  @!L r 5f @%f e m&E&  vew\&  a |$          m"'  a@`Em$@ m*&fE& he e &a Ȗew-  ؗ җ   l\55  5`  f \ wފ `  &af   , ,,"  e ! B` D` D  ҋ  D ыR     l\D @       f dew䉦)W W W 00c98  5 ~ K J    D e Aed lwL     f ʓ & & & @& Е ~ e ѕ  ѕ: ѕ:  e e/ѐe:wr &  w:   M u @ A -#  w   @M u u u @ A B - #  wچf   E D @ A s     u&@eH p p eH p eH cQ<[y1OJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECwʍ  lX Αx 865 awf ta 6  C ԗ  S   8    v``W  f N&f` x et n F  .  `; D    N`f& e 7B 2  B`  &f e    Bԗ a z %ewЋ)& & - Bv6v`  Ə  v6v`   E`D`  D!"6  # D!     He w   |  @C`B` 6   $ - . 0 ; A Z _ a zۃ [ פ] " פ" @  % 28R r f00c9O9vATADATADATAwV  a@`AB S  & ew  5AEA5 ef f ^  RN H@ewv5’ @  B@A  @@P5e w<) @N   Ԁ )% ! a E`   v    % d  R  @  .     f @w   w  5B`  w2/      5@         @!   &  ~ f   3f f &f &ff P]f% @f%e w`%ew~ l% @f\%e dw`P%ewHB%e 6 re,%        w   B 5 - 5(@7$$$$$$$ $^ ~ $ 5Ab$@ * 7 B$w> B  N < 6  2 @m, 7 "  . $7 $   # f#f$ 7   8## 7 # 7 # N$ w#e w   5  `˵>#c5˵ x@ p @*   \#w" %58# @`1  $ ^ ""  "   l"-f" t&!65& $  5& 5& 5& 5& 5|& ~ &  8  e7 !5x     D  %5@ 7 : j  \  Z  N  % wf@m87 2@eE& j  >w` \p`^w  C`D # -v`p-p`j-h`b-b`\-\`V`T R`L`J`H-F`@->`8`6 4`.-,`&%f-$ f`&  e  e  oe 7 Zf 5J#xeEe~f& wrnRLJ` Re FHeB <eEm07,b-1& `&  e  e eEm7e  oe 7 dfeEe L5Df& w`zzvVPN` e VNw`Pwx-"F| "e" eEf \``@  efe7 -$ f`&  e  e  oe 7 <f 5,)XeEeXf wJF0*(` j*H0 0 e wB> e e me eEm7vb-.& `&  e  e  e ߈eEm|7xe 7 f d5((eEeHf tw:`2` 60 e f> e mH7 7   "a?    e fe?E?@m & f @6Y Vw`| @    W  W W | de   `w f v C W!W! mDm  D!  -m W!p  ,%wH    %w0 eEm7 f b m7 J-p $^ZZ w RwLА `D-@@88w 2r    eEB K  `ww w a 00c9d90 < 0 < 0 < fF>^PV 0 < Lkl @Ҩ &[q &[q`   l t =6T?H@l6ZH6HLPV~lLPVllOPVllSPVllWPVl~l00d99 ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ wL    V 7 DM < 0  < 0  7*%: weB$& fe*aɋwj Tw^ɋ& @   f 1 4@5 l7 4  <<7 7 7 7 7 w꤂ m 7  :w 7  ]7w$ Ԝ\Ԝ]^ ԕ:;X&R 4@&f& FH NJ DL :  ԕ.N "  ԕ;P e7Vwأ  @   B  * 1 v7 pfj   `p  $$f$Е Е f& @ee$"w    e wޢ     A @ *B`ʋ @ ֱʋ Ҧfɕ I~7 6H0 \0 ^7 n &"d( T D 7 7 7 ""7 tplhd7 bef  ab1 2e  7 #&fn1 7w5f& V e w6e& & & f   ^ @ = , D@& 7l h (wRPwL wʠ6Cm25(Cm$  f ( ~ > f >~ wfe&  G @ 0 9 A Z _ a z . : ;ރ [   RW] "   8W" , =  @f5:$ f1 Z  4 ׭/   55%%w^`!5 SW aW z@ ##W ' ! z'W W  !   ˕  w `     z1  E f&f& :e 醦 w Aref  W. N  t5   W= lW  ! XW0!W9 ! B0  `%aW' @ CА '!W'@ &f FeWTWF&   w\Re  W   ~w @ 0 9  A Z _  L wW   *@fa a P& J1 ze  ޠea a& & e $G 7`w S00d9O9vATADATADATA 7`w e  <e& aa : fZ1 he  ̟eBeef  H 8 8 ,  f 411   җ1- w h^$$ e$f 5, a a & J1 `e  Ğe  e5& .5 h5 M &  aa f =&R1 e *e@e E @b  H  ef  e e ewze n/b7 |1 `N  n @eE@`C 1 ęNe  @e    w> e7 w57 1 j  ݦe-ݪ@ `7` ߔeEm7&  tv Be eE` f j%@݅   7!$7Tڀ  7D<0p0 I w de eE`@   w̗܁ 5r2 1 Nl <1   mX   1 ؗe Η T L b 1 1 D mee ҃ f  E@`ew531 RN ~1 @  m  X1  H1 ze  df   %ɐ 1 C mۀ@`wJ 5w-7 1 |  w!w1 VAaN J Ж ȖvvaB eE` wd1 `  @ B2 eE`e$2C (  1  D ҕ1 F2 N` FF2 r W  N2H2 RH  N` n  N` N x >f Δe &N`   & 2 f e b Dw 8w: ( w57 |5 r  5 (  ԔN @ Ɣ . N\ V1 N^ F 7 5   x5 <  \5 Ɠf`  @5 * ؓ ( 6    .6 j|  X6 Nd | ̓ T-Lݰ~6 (< R  6 b݀  * z6    T6 ",  ޒ .ef e6"e@-: 19SY:.CNFSY:.SYMSY:.ICFSY:.LSTCFL>Option>/OPLITERAL$r1RSX-11 CFL-16 V2.00PageGroup Symbol    Offset Uses Group Symbols" Group Literals Type Length ValueNUMERICSTRINGASCIIRSXTIMVMSTIMPOINTERLOGICAL1112 222 'FalseTrue+ Group Allocation type Count Size (bytes): Named Literals (these do not take up space in the module) Literal name descriptors  Literal data descriptors  Module Header Module header  Module Symbol Table Group name descriptors  Symbol name descriptors  Module Procedure Area Procedure Descriptors  Statement Block headers  Statement Descriptors " Statement Extension Descriptors Expressions Expression Headers  Operators and Function Calls  Symbol References  Literal Data Data Areas Variable Data  Table Data  Symbol Declaration Descriptors Conditional Descriptors  BIT and FIELD type Symbols  Data Symbols  Symbol Names T2222233.3J3f3~33333 4 4 84 N4`4l4 444444Allocation Information:Additional Statistics: Total Module Size (bytes) % Total Module Allocated Size (bytes)  Total Source Lines $ Number of constant folds performed ) Maximum literal value heap size (bytes) $ Number of heap garbage collections ) Maximum literal value heap used (bytes)  Maximum value stack entries ! Maximum operator stack entries Maxi00d99k e D" 9|Bl ɕ 1  0M ɕ- ɕ$ ɕɕɕ 8@`w@  1 ɕwe < 쫎wɕ ɕ@`ȕȕɕɕ ɕ > w> R~ebrɕ ?? ɕ ɕwɕ 1 Nwwɕɕ 1 Cd5 8 : wxɕ  *1 wzɕ zw t^ɕ ^wqɕ :w  +ɕɕɕɕ ɕ! p dɕ" ʩw8 2w J& wq5 < Ĩ h R  (7 49 X F   FX V    wXX v ? >Rw7 7 tX v7 t7 lh5^4 B XU  w  !   $wwP-@T ¦^.wwy  w|yw~wL|wd z $0!"   dY#:""\ &  ew Ĭwb&  8 N d P)& pr/)l , X{ & xr 22e t5*7 j 訇5 5 D ¤5Df& `  # D 52L 6 J $Ne %% , &'(5pT ( \ " v f(j fZte NH   BNp 0:e `L;&  e 0$ef4 Z t \  GlR;$ $ 2$f ~ Nj NZ 0G  Thbe`e  UeR  V   W00d9O9vATADATADATA  .w0w 5@B  eeeb&  -l & NNb Ψ%    |Ⱍ Vefhn whEb^ z05> %0 wJW!  - -߀ 7E p055 . jN l5~je ҁ @ E 8N \8e 5 !!  waߖ%f5< D D 6 L "ݼ 5  xN z %w5|nh   0 @ lV; lf; >@` lr;ȕȕȕ@` l~;ȕ ȕ ȕȕ(ȕ@` l;ȕȕȕȕPȕ  -X5  Xe-, *0 7 7߇- ~/* - bވ0 7 7އ- ./*  X/* -|5  d7 e^   Ln?j e:އwx-0  ޗ  #4 p  * 5&\ t */* : %e݇w- 4/) $ 55B l  2  0 E@  l; & ΐ )& ΐ )& ΐ ) & ΐ )& ΐ )%  5$d r (@ )%e܇w5t 27!j eEf @  %8.wXRW  D W    W WW BW LW Q W V rA  l; Zۇۇۇۇۇۇۇf5V   Ne V%w-٪ Кnj@ PJ۰>۰w Dw>هf-4"  $v, pewmwm@ l;eww`eئ&  N -Rn i BU Q N T1Ete >7 z7 |9^e (2Pe 2N 0ڰ / e "H Ne seb 1a @eb x1v&&$ rf~btE - RIBE -$   %, , \mE @ 4 2f  |ew֓  l D!&`&f& :e ewz BO/ efN`& e   w2  @ e&fE e W  @I e&fIE& ne W @7 BO W AW Z-7e J 7J 7"J 74J 7n7 `7 b7 7 P wz) 8   0 z ~ 5 wR6 77 -1  B; A; 2< 2?  < mA VE 5 - n5 @H &* e R@ eH&fE& le NVP6 c  f7 d7 4@ HQc  1*S @ eI&fE& e Ɔw-5 %f)aa X7 7 n @m7j fewX5N7 :7 7 -:|  5-(j ^  lDJ  @ BO?: 4] B  (, (     -  e&E& e -x*.7 d! FP EP @ &BO&BOe& e w2 B n$ `\ W aW z p <Z " B`7>08%W0.W9+- -W'  -ׯ'> p ,$ FLUSHKEEP44COMMA00d997H7\7j7|77777777777888&828B8P8^8j8z888888  LRXrx $hHN. *444r 6<@(T\d "HRNj&.h F 2<FL2V`jp (0<FLRX^d60jpv60|6060606".28``2zH R X ^ d ~ V2.00 (Ht8L   (4 "**2:4BHVh~DPdp ()*+,4<DJPTUVixz !"$&)*,/25:LMNOPQbdeuxz{~ %,8L&5DX^`j~ %,8L!-/:?OQS]eoz|,,N %,8L %,8L %,8L,8L,8L8L,, -/4:>OQ\dntvz|"-/?OQS]eoz|4RdvS %,8L '7GYa,MZ^c %,8L %,8LP %,8Ls%,$).=CJPShnrx,,\Nn4Rdv!-/4:?OQ]dovz|,>\$).=CJPShnrx$).=CJPShnrx$).=CJPShnrx,[nt,>\P,P;x,S%,wS'7GYa$).=CJPShnrx,,,,$).=CJPShnrxnt, -/:>OQS\eoz|Chr, , %,8L,fsuy{$.=CJPShnrx %,8LC !,/i, %,8Lg, ,i4Rd4Rd!-/:?OQS]eoz|,,P !,/i !,/i  %,8Lx3 fsuy{ !,/i  ,/>\fisuy{$P %,9L&6FX^`m~ %,9L#-2\ $*.=CJPShnrx $*.=CJPShnrx$+.=CKPShnrx,[nt,>\P,P<x,S%,wS(7IYb$+.=CKPShnrx,,,,$+.=CKPShnrxnt,#-2\fisuy{ $P !"$%&)*.1567<?@DEGHIJKLMNPQRTUWXY[\]_`bcdfghjkmnpqstvwyz|}     !"$,./67:;<=?@ABCDEFGHIJKLMNOPQTUYZ]abilnrstvwxyz{}   !"#$%&'()-79:ABEFGHJKLMNOPQRSTUYZ^afghmqrvwyz{|}~     00d9O9vATADATADATA "$%&'()+,-./0123456789;<=>?@ABCDEGHIJKLM似+( 3&)024#,.:%*567;19-!"'$8/DCTUUUUba쮮EEEEFEEEEEFEE\\\\\\\\\]\\pqNORSSSVVVVVVVVVVWVVVVVVVVVWVVVVVVVVWVVVVVWVVVVo}~ GHJKJXY[Zcdcmmnfef ==rrrrrr`_iiiiiiiiijiih@BAILMMttttttvvvvvvlkuuuuuuyz|y{ywwxwwwxxxwxxxxҩ^_ZUײվZs  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~^p_ZG"Z?/?<#]uABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_$_|_namenumeric-literalstring-literal444Zf\fffffffffffffffffffffffffffffffffffffffffffffffffffff;(),.=[]:+-|*/><%#DOTOIFOFBYEQNEGTGELTLEOR_|_END$IFSETPUTGETNOTBITHEXBCDANDXORMODnameCALLTHENCASEFILEFINDLISTFLAGELSEBYTEWORDFILLNULLTRUEBEGINWHILEUNTIL$THEN$ELSEWRITELEAVETABLECRASHNAMEDASCIIVALUEFIELDOCTALRAD50WIDTHMATCHSHIFTFALSECOUNTMODULEPACKETFORMATRETURNEND_IFSELECTSEARCHENABLESIGNALDECODESTRINGBINARYLENGTHLITERAL$END_IFDECLAREPOINTERMESSAGELOGICALDECIMALMACHINECONTEXTEND_CASEEXTERNALEND_FILEEND_LISTREPEATEDRESERVEDLONGWORDQUADWORDRSX_TIMEVMS_TIME PROCEDURE SUBPACKET INCREMENT DECREMENT COROUTINE END_TABLE END_MODULE END_PACKET END_SELECT END_DECODE PARAMETERS END_DECLARE WRITE_GROUP BEGIN_TABLE SIGNAL_STOP WRITE_PACKET RSX_LONGWORD DYNAMIC_TABLEstring-literalnumeric-literalDKXK\K`KdKhKlKpKtKxK|KKKKKKKKKKKKKKKKKKKKKKKKKKKKKLL LLLL$L*L0L6L?BDFJOOSSX]bddflptwz|             "$&(**,.022468::<>@BDDGGGGGIMRRRSSTVWXXXY[[[]___acccccfffffffiitג =°†yuuȔȔPPɤně.Rdv{ssfцg$3Ȥnwنٛ۲ țʷʷɞ .: Rd=ݨ:  :  Ƹ肙͍̄̄̄̄̄̄̄̊ T T U $T ~W `V [ PV00d99RESINVPRT, Print expression list not allowed on RESERVED data.@RESBITILL, A BIT or FIELD data item cannot be declared RESERVED.;BITNOPREC, A BIT or FIELD must have a preceeding data item.CBITNOTVAR, A BIT or FIELD not allowed on variable length data item.DNUMFILLCH, A print fill character string must contain one character.ANULLOPERA, Internal - Null suffix operand on non-suffix operator.*INVFUNCT, Invalid function name specified.@INTFUNMIS, Internal - Function code missing from operator stack.3MODATTRIN, Invalid module attribute name specified.:FLUSHINV, FLUSH attribute not allowed with KEEP attribute. KEEPINV, 4TABLEBIG, TABLE element has too many literal values.4TABLESMAL, TABLE element has too few literal values.2BYTERAD50, A BYTE data item cannot print in RAD50.=INVNUMSIZ, Internal - A numeric variable has an invalid size.RADINVRAD, Invalid radix character specified in radix literal.7PROSTKOVR, Compiler internal production stack overflow.CINTPROUND, Internal - Compiler internal production stack underflow.BINTWRONGP, Internal - Wrong production popped internal production.9BITNUMINV, BIT number outside the the declared data item.@FIELDBITI, FIELD starting bit is outside the declared00d9O9vATADATADATA data item.0FIELDSMAL, FIELD width must be at least one bit.7FIELDBIG, FIELD exceeds size of the declared data item.8WRITEDES, WRITE-class statement has invalid destination.CSYMNOTLIT, Specified LITERAL symbol name not part of LITERAL group.HSYMNOTCOM, A variable is not valid in a compiletime constant expression.HVARLITGRP, A variable name cannot have the same group name as a LITERAL.?OPRNOTCOM, Operator in CTCE cannot be evaluated at compiletime.HFUNNOTCOM, Function call not allowed in compiletime constant expression.:FUNWRONGC, Incorrect number of arguments in function call.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.0j>x^LRJh00d:9 pf f z  f ff J whl y x  vm  jp`f wew.l x a& v vvA`f wf&& f& |hewk& -` Lx Fx 0v`  @!L o 5f @%f e m&E& Hh vew"k\&  a g$          m"'  a@`Em$@ m*&fE& ge ge &a vewRj-  w w   l\55  5`  f u wj v  &af t t , ,,"  e ! :tB` .tD` D  ҋ  D ыR     l\D |m       f tew i)W W W PVXV sf s6  Gl\@A P@A P@A P@A H@  @TTTR@BDQBDQBDQBBQ  6 v       Z W R Obu u u lu u lu l  - <LPV t,@- @ h D 4u4.- @ DMDC pu  f r%  N&&N e$ bkew4gPVf rM u u u -# 0uff re wf lqC `q  S   0r BJJJJJJRBXXXXXX` "(&2`$b lD7Y'&W, Е0wl|wlf w rx B m k `B l]B` ɵW e<QBaCa 5  ty@< TkDa Dk@ D @ D E& NUe& NU D a"K `@#  ] 6ewk hvC` 5 5  (5 5 5 f 6w@e # -  @  0  :    5!Jפ-G`!B]Ba JȢe00d :O9vATADATADATA] ]&A#]B eפ- 0l  5WW d5!!ע פ: F5<! ע פ:  (5< fפ  f  0W   i@`%wif= uP eff t111f 6uewiaf lt *uE] eKkW"  aD] "E] N h eQʐN h mm Jʵ : @`C] Ð r2 aa va v < @h2< :h2e  f  r] se n  : Z \ Lw.h taf r sBai*Cava>  t5 ~ K J    D e Aed lwg     Frf s & & & @& Е ~ e ѕ  ѕ: ѕ:  e e/ѐe:wf s& s swvf   M u @ A -#  wNf   @M u u u @ A B - #  wff   E D @ A s     u&@eH p p eH p eH cQ<[y1OJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECwm  lY qx ty65 pawf ta 6w6  wC w  S   w8 x x &y vv``W  Vpf wN&f` h jet n x  jv  `; NvD Rx  :v N`f& e 8w7B 2 Hx uB`  &f ve u v  Bԗ a z %ew k)& & - ~uv6v`  o  \uv6v` Xw  @uE`D`  n D!"6  # D!     uHe w"j v  t  @C`B` 6   $ - . 0 ; A Z _ a zۃ [ פ] " פ" @  Lu% 28R r wV  a@`AB S  & ew  5AEA5 ef f ^  RN H@ewv5’ @  B@A  @@P5e w<) @N   Ԁ )% ! a E`   v    % d  R  @  .     f @w   w  5B`  w2/      5@         @!   &  ~ f   3f f &f &ff  ^fE @fEe w`Eew~ lE @f\Ee dw`PEewHBEe 6 e,E        w   B 5 - 5(@7DDDDDDD D^ ~; D 5AbD@ * 7 BDw> B@ N <@6@ 2@@m,@7 "@ . D7 D@  C?? ?fCf$ ??7 ? ? 8CC ?7 C? 7 C N$ wC??e w   5  `˵>Cc5˵00d:95F $> t 5F p 5F l 5F h 5F 5|F X ~ &  8  e7 A5x@ >  > D  %5@@7 :@ j>  \>  Z   V % wf@m8=7 2=@eE& j  >w`= \p`^w<  C`D # -v?`p?-p?`j?-h?`b?-b?`\?-\?`V?`T? R?`L?`J?`H?-F?`@?->?`8?`6? 4?`.?-,?`&?%f>?=->>$> >>f`&  e  e  o>>e 7 Z=f 5J=#x>eEe~>f& wr>n>R>L>J>` R>e F>H>eB> <>eEm0>7,><>b->1==>& `&  e  e= =eEm=7=e  o==e 7 d<f=eEe L5D<=f& w=`z=z=v=V=P=N=` e V=N=w`P=wx-BF:| BeB eE=f \`=`=@  ef< < ::e m:H7 :7 ;  "7a? 2  7 7777e fe?E?@m7 & f @6Y V2w`|7 ?@    W  W W | de?  ?? `w f v C W!W! mDm  D!  -m W!p  ,%wH    %w0 eEm>7 f5 b m>7 J5-p> $^>Z>Z> w R>wL>А `D>-@>@>8>8>w 2>r5 >  > eEB K  `w=w =w== a  differences found No differences found/ TI &% NSY  x  kQSYSY 8  D 4 1r  2\   X 00e":95W E5W sW s W ! W 8W >W EW W W W Ō $|e  & & @( Tf  e ee e &f& v '&1     :! R R zR rj4* jv4* bvH0 Zv0 Rv1 Jv0 B<"5ew v, Bv     5B1 w  eeȵe ~ vo DEP%(5 eȵPe< &e  %&$@A 55@558 eBeeeȵee&e e4   QB4!00e*:O9vATADATADATA5  5 2  UE  4JE U 5@*& E& & f&ËDef Ë )̋Uw eE D` bl lrw \  B eE"s    s-  Csl&f &  m  f A N  %(eff NeP   #llD &eJ Ԕ %:ԕ: f"& f&f& & Ε lle  &&ff  ^\  ":t'.t'" F%R( ,4*j,4*P ^v24*T ^j  ` *  !נ נ  נננ"D נaנz E ѐEp(p נ$נ-נ0נ9נAנZנ_נ:  ^נ[ȕ]נ<ȕ>ȋ@ w נ%נ*נ$נ_נ-נ.נ0נ9נAנZ݃Ƞ נ0נ7נ*נ,A oȠm k  tנ"A   &A fנ$נ%נ*נ0נ9נAנZנ_נ-נ.  נ.נ; fנ0נ9 ]נ- X נ* QA  נ, Dנ=  >5 B>U (w>נ/* . .נ$נ-נ.נ0נ9נAנZ נ_ נ:  Dנ"  0 X E^`  UQ  UQ ËUI U `e ccD    Ĕ%*.A U 0 0 W ,Uw@W /D : cBDaW- N WN WOD!B N{ CECCD! D! ΋5  e ΐ UpRpRpBC5D  KR΋KBAE:D0CĊ \ eB  Dҁ CSĊ  WC E Cs Ε f)& 6 l(*  E 'W " =N  W :+W = 1 #W ,W / %W %W *Հ W <W [W >W ] v(* 6 ew  w & W+W- Ba. W#  B0  c  c S W %ec e`s  # 3  & ˥ Z ^C eB  8 .$&w ,*(5<w1  U U@  Xf&" -'&Q'&&**%*$ ,(%0 *&* t*5ND  D<  EU   w BC "&0(*7e "fSYqq1յ<pBՋ.p0p2&* 0=E%0=wJĥ[ĥ<C` >C ҥ, ~4B *㨂 De $ $ $ z  DEe    *1  ˕03 "   ˔Ӕ ʥ7*@<#8w R /$ ,:T < U@% DD%][%><w~  w<1  %,,:4 w *D ]Xf(e<500e2:95>Eu N  (e( 1  `((   >: 5 eCe5%& w &Ba +- ʥ# . U 0   b   `     0+1(e  @%&p*w f( f)f 8Ae f"( UCɗ&+(e$&%  "~' "*( .'w 4( D 8"!#($ĥ ĥ w 0 *0 @Q$    0 40 60))eB @  w:# (w(&* =ȥwz `p!2 EW!p0p252e( (<'##UfE @#U   P3)/ h#( P) .@#**fff  &*wp. tB5(8e$8w2A&(e j4p8q  (#4=A#@)( v *O*)@#0l @# 02ȕ8 00ĥ݇AĥĊ  ȕ000 60 @0 &*0 @ J& & fe# eB&B B , *  eBe>  # #D #=0/H#@&0 # = e0   0@e 6=#02/002# @#?@#040 6w/!0/ l0/!p!0 .=p0p2141612epl2l0pW=f(& e %&&eH =&e0  $U   E > >E(5E=uf p  wh " f &* *   f | >5>Eu   **8Ae f"( UCɗ&+(e$&%  Mw 0+1(e  %&p*w\ f( f)f 882e&( >0 0 0 80 B0 0 0 0)#0.> =00l&8el2 0 *w \(SB C DBe ?D1 J'&UBe(e$2e 4%[]%<>  1 >w BC "&0(*7e "fSYqq1յ<pBՋ.p0p2&* 0=E%0=wf&5ҕ[ "5ҕ, 5ҕ]E 5 5  e0Ґ 00e::O9vATADATADATAe6p 4 .8 D81416   J . r8e2 46f %8 E D/D!D l0l8epl0pɥ.ɕ wp U8UMw wT *) l0, *) $ )*)0,40,6 ,*1 VB 00fep=& /e`pw~w L ,) 8C * ) *w&*  Lep p  |ȥ#= EW9ť^*0 ` Ca C  =  R ȥ 0*ȥ = Eե^ Aȥ e@  = Ep2!)8eE`l0  0 0/ &l0 `p l064p 4 $p  8 V *`)w\ C#    D @)  6?0D)w n832cd& & & B  2OΕ   N Υ$Ε  22Υ   v Ε f 8e :* He*w,@)0,    8) )% ȥ  = ȥ l 0l  ȥ (ȥ- ȥe&=Ba@a 8e0b eȥe@ ] V= E8 el0  & 0 l0`p l064p 4 ep )wzȥ%  ,  rwL N JwTB # f  `* 8w()0406 l0 **=p!Օ^ *) l0, *) $ )*)0,40,6  DP5R RRR  8  0**> =00l&8el2 0 *e6p 4 8 81416   6  ..8em,0l0!D0e6p 4.) &f Z he) .  e6p 4 08*wz141612epl2l0p,*1 U8UMw w B 00fep=& /e`pw46f %8 E D/D!D l0l8epl0pɥ.ɕ XwH8e2 0,0, f 톇,, w      .% eB U5UU plp & NeՀ)*8Ae f"( UCɗ&+(e$&% 0+1(e  %&p*w f( f)f ABCDEFIMNOPQRSTUXYZ<> ":Y"]hplJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECw && D¥%  B&ХVA  C ea!  aeLbE  Е%̥V A6D Ћ  AP AЕ Bf  & .0 (+& 'AHŀ ȕ Е Е Е & : 4Е Aa %   & (A Е A  4 E00eB:9A& 2 w ` ť ť 0B TAaW'&Y'&w Del  ~= w D&el& dЕ- eaePPP"w D  &Е. ce  Е: Е- BW l " 5 ߥ& *  + 23E Ew    Е-   0@A W e`fÊ    E &   `@ ` B   & A @    &|&  f&&  e#e|& f&&G& & & & && '&& 89f"e\e!e 6 5f 2* eA &3w >*8I *=)98 8 eB &&  U ***e *Nlv ΋*.2  & #!)&eP(e && >e >E p* w**8Ae f"( UCɗ&+(e$&% 0+1(e  %&p*wj f( f)f F82e&( h0 0 0 80 B0 0 0 0)#0.)"(. <= . B  E (.8e2 ..8em,0l0!D0e6p 4.) ^&f (  e) .  e6p 4 &08*w=p!Օ^141612epl2l0p,*146f %8 E D/D!D l0l8epl0pɥ.ɕ w FU8UMwR w0,0, f 톇,, w      .% eB U5UU plp & NeՀ)*w 5 funhj uhdB$ 0jwaw< 8 v8w &  |*AdBbAep& f  P P aAAf@pnp C*8֋ 88*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ ŀajTI& af* n*`V @e,w jjlj ɥ@@aujk,bp j5f fˇ ȕ V‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ DlljaCeH###33 & 8 *++w  8jDl@ TeBT85l@ @( D eB&  & @# & V An5jP a@@` > ~ &@ . eRa-eR 00eJ:O9vATADATADATABAnB X/   @   RՀaeRÕweRR)K@ R   : "t'  <"w f) Z* w446l0w *D   wB**=D : `p46 f 64/=  D@) 0  8wn 46 8 pe*wv > =00l&8el2 0 *0+1(e  @%&p*w f( f)f x8Ae f"( UCɗ&+(e$&% 141612epl2l0p *) l0, *) $ )*)0,40,6 w  ) j ( fU %  BA `6p 4p`4 %60 4e6p 4 88 481416 4    b46f %8 E D/D!D l0l8epl0pɥ.ɕ @w0)"(. = . B  E  h(.0,0, f 톇,, w :     .% D eB U5UU plp & NeՀ)*,*1 U8UMw$ wh ,B 00fep=& /e`pw8e2 ..8em,0l0!D0e6p 4.) F&f   e) .  e6p 4 08*w=p!Օ^w 7 *\  r  \ Ar  5@f  \ r 0D qBCr r &   r vŝX\ X&r N D P r 3  |5xr  2  2 w 5>!\ 23 p  2  \ T3 @5I\  Е-& r  A  \ Е, A   LЕ, Е,Е/Е;L Д/ @f  r  2  ww @ 61w  @ B*w:@B 21 1ap1 6 5 5 W  x5p l2 |dl2XwLe`  3 V3. wx؃3au qss   55&; 55 ve  l2 W,4  3 hV3" w 4 @V4" w-@ 5 ve   W,p v  P" h!w N  (" @!w-@ differences found No differences found/ TI8R&% NSY888VkQSYSY t p1T2  + -- Illegal switch or switch value -- Open failure on output file -- Illegal /LI value -- Command syntax error************************************************** -- Too many differences for available core -- Error reading input file #1 -- Error reading input file #2 %1A) %2A%Q:%VA%X -- Open failure on input file #1 -- Open failure on input file #2 -- Error writing output file &?,-fW >5W E5W sW s W ! W 8W >W EW W W W Ō $|e w 5 funhj uhdB00fb:T: ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@ & & @( f  e ee e &f& v ('&15ew , Bv     5B1 wR .}'~(00fj:gl:vATADATADATA)-z>+ D- E %     U EU 5  5U @+ |*&*)E U *5@*& E& & f&ËDef Ë )̋U&ff &  m  f A N  % p, 80|X$L<H($|,?(?(wb  &[q$b @TITISYSYTIOVXV2XX  f  4 W# 0 Q & . *  \  l 0 0 0  l p 7 f& & A&f?A`e  P!" 0 b `Aw f hfp n -   x p` BJ  ʕ=ZTD ` : ( f : w4  wH T ȕFf 2  n 6 fn % ww 6eB feBzw $&< H # D  D f " 6 w   f   w d ` 5E5 E5pE~7 x pEf  5Vc 2 &4 2 ^l  K <bɥ= <8f  8 5  D ( w  Bf  wf *wBL CB CO DI FF LI LN MB SL TB@ VB SP Z  \ 07P CMP>00gr:T:5W E5W sW s W ! W 8W >W EW W W W Ō $|e  & & @( Df  e ee e '&1 < <p <, < *8 * *0 *| *X *$ < *L *< *H ` * ~ r v <( n * f <$ ^ r# V rJ$ N rp% F rj$5ew L, Bv     5B1 w 00gz:l:vATADATADATA1250  (r- DUt-E D  E E ܁ P&wE U &W )& #  4 &9U3uE uU.5`.U & E& & f&ËDef Ë )̋E U&  m  f A N  %&ff  &[q &[q`* < * `NNlNrN N`Nw 45 funhj uhdB$ 0jwaw< 8 v8w &  *AdBbAep& f  P aAAf@pnp C*8֋ 88*Ë7AB`f Va`& WaWz  ɥ"N  ajfu-nhwFɥ;]a)wנ"å.@j  a Bw@ ŀajTI& af* n*`V @e,w Xjjlj ɥ@@aujk,bp 5f fˇ ȕ 2‡ eSY e,5 funhwe,aja`W- f`nw^uhnw@ VDlljaCeH###33 & 8 *vJw  8jDl@  ~ &@ . eRa-eR BAnB X/   @   RՀaeRÕweRR)K@w 7 *l    l A  5f  l  0D qBCr r &   r vŝl X& N D P r 3  5   2  2 w 5!l 2' p  2  l T' @5Il  Е-& r  A l Е, A  Е, Е,Е/Е;\ Д/ @f    2  ww @ 61w  @ *w:@B 21 1ap1 6 5r 5j W  x5pL % |d%XwLe`  >@' f@'. 0w 3au qss   55; 55 ve  % W,D  n' fn'" w\ f' f'" Xw4-@ #4:^gtw c&`w c& & &f&  ¥%   %B&ХVA I C 2~  A  Е%V P~Е Bf a~2:27˲4X&1Hŀ ȕ ~00h:l:vATADATADATA `Е ~Ћ~ Е Е ~2ѲЕ A N  ~ 2A I~Е ~Е A HA   "Е. H AЕ; `~   A HEA  LIE 6L  - 7 &fwlh 7 `7^b @+s `,MceLG] m"@  D~, H N  7 f@   &  5]U E 6&@E A | Ɇ  E n@RPC~=85 @  . &f  ` `  6   .$  ~ ̥ZḀ90     ~kz?TLBOPzLB  T Ah ?h  T't CON>PfTIXSYb&& NSY I/O Error Code %D.QI/O Error Code %D. 5.000+++,,++,,,,+++++++++++++++++++++++++++++++++++++++++++++++112441444~44`3`3p32F422263@384333P3mProcessor FFFG G$GXGpGGGGGGH$H9HTHHHH I5I[IIIIIJPJJJJK(KVKKKK%N%R -- Unimplelmented command%N -- %VA%N%N%R -- Command Syntax Error%N -- %VA%N%N%R -- Unable to assign command LUN%N%N%R -- No reconfiguration driver is available%N --- Output to HRC is suppressed---%N%N%R -- Maximum INDIRECT command file depth exceeded%N -- %VA%N%N%R -- Bad INDIRECT command file specification%N -- %VA%N%N%R -- Open error on input command file00h::%N ONLINE MEMORY %N ONLINE ALL%N OFFLINE %N OFFLINE MEMORY %N OFFLINE ALL%N SET =%N BUILD%N CLEAR%N DISPLAY [
$$$=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 .00XLhg, .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;A*; BLOCK MOVE INSTRUCTION MACRO (TEMPORARY);N .MACRO MOVR$ SRC,DST,CNTM .NTYPE $$$S,SRC .NTYPE $$$D,DST .NTYPE $$$C,CNT .IF EQ,<<$$$S!$$$D!$$$C>&70>C$$$S = $$$S*^o100;$$$D = $$$D*^o10 .LIST MEB .WORD ^o075000+$$$S+$$$D+$$$C .NLIST MEB .IFF ;EQ-/ .ERROR ; Invalid addressing mode used in MOVR$ .ENDC ;EQ,<<$$$S!$$$D!$$$C>&70> .ENDM ;MOVR$V .IIF NDF S$$YDF , .LISTBUF MOV$ OPCODE .IF DF VC$CPR S CALL @CPSEN .IFF CALL $CPSEN .ENDC ;VC$CPR .ENDM;A*; BLOCK MOVE INSTRUCTION MACRO (TEMPORARY);N .MACRO MOVR$ SRC,DST,CNTM .NTYPE $$$S,SRC .NTYPE $$$D,DST .NTYPE $$$C,CNT .IF EQ,<<$$$S!$$$D!$$$C>&70>C$$$S = $$$S*^o100;$$$D = $$$D*^o10 .LIST MEB .WORD ^o075000+$$$S+$$$D+$$$C .NLIST MEB .IFF ;EQ-/ .ERROR ; Invalid addressing mode used in MOVR$ .ENDC ;EQ,<<$$$S!$$$D!$$$C>&70> .ENDM.; Title: BASTART.CMD.; Author: B. S. McCarthy.; Date: 05-FEB-81K.;C.; The version number of this command file is the baselevel number,R<.; followed by a modification level after the decimal point.B.; Therefore increment it by .01 for every change. Only change the6.; digit to the left of the decimal on new baselevels..;.; Version 57.04.;.;.; Modified for M-PLUS V2.0 by:D.;.; P. J. BezerediE.; A. S. Groupe0.; J. M. Kinnear.; J. C. FranziniK.; C. B. PetrovicI.;.; Modified for M-PLUS V2.1 by:D.;.; J. C. Franzinia.;.; Modified for M-PLUS V3.0 by:e.;.; J. C. Franzini .; B. S. McCarthy .;.; Modified for M-PLUS V4.1 by:m.;.; L. B. McCulley .;.; Modified for M-PLUS V4.2 by:e.;.; L. B. McCulleyy.;.; Modified for M-PLUS V4.5 by: .;.; D. Carroll 14-Jun-1993 57.03v.;@.; Insure that the baselevel symbol does not have any unexpected1.; characters when copying the second backup set.K.;!.; D. Carroll 19-April-1995 57.04t.;A.; Allow tapes00&hX+h,d=kgTADATADATA to be read from a VF: device configured as a tape,;5.; and support the toy clock in basline installationsn.;.;.;=.; This file is the startup command file for the RSX-11M-PLUSM@.; distribution kit baseline system. Its purpose is to conditionA.; the running environment to allow a SYSGEN to be performed, andn?.; to alert the user to any pertinent installation information.v.;E.; This command file must run on the current and previous versions of;".; RSX-11M-PLUS and on VAX-11 RSX..; .ENABLE SUBSTITUTIONr .ENABLE GLOBALo .SETF VMS< .IF EQ 5 .SETT VMS ! Running under VMS/VAX-11 RSX.; Get version and baselevel. 1 .SETS $VERSN "4.6" ! Default if no VERSION.CMDb .SETS $BLVL "85"s .TEST ":"o" .SETS TRGDSK [1:]# .TESTFILE 'TRGDSK'[1,1]VERSION.CMDn3 .IF EQ @'TRGDSK'[1,1]VERSION.CMDn .DISABLE LOWERCASET.; Save CLI and set to MCR.e .SETF DCLIe .IF NE "DCL" .GOTO 5M .SETT DCLIX .ENABLE QUIET SET TERM MCRT .DISABLE QUIETO.5: .; Continue..; Set terminal to /NONAMED mode if necessary.+ .SETF NAMMOD ! Assume not in NAMED mode* .IFT VMS .GOTO 8 ! If VMS, nonamed mode; .IFNDF .GOTO 8 ! If NDF, pre-V2.1, nonamed modeS1 .SETN F4$NAM 1000 ! Define bit mask for F4.NAMSI .PARSE "," JUNKS JUNKS JUNKS FMASK4 JUNKS ! Get 4th feature maskO2 .SETN TEMPN 'FMASK4'&F4$NAM ! Isolate bit F4.NAM: .IF TEMPN EQ 0 .GOTO 8 ! If EQ, named dir not supported7 .IF EQ "[]" .GOTO 8 ! If EQ, in nonamed modeu( .ENABLE QUIET ! Named mode, reset it SET /NONAMEDE .DISABLE QUIETs1 .SETT NAMMOD ! Remember we were in named modeS.8: .; ContinueF1 .SETN STATE 0 ! Initialize system state counterSD.; Summary of states (only applicable if executing on the baseline):.;?.; STATE = 0 We just got here (new installation). Do whole bit.TA.; STATE = 1 We got here from the baseline, but we have been here /.; before. Ask if they want to see whole bit.T4.; STATE = 2 Not the baseline, exit to [1,2]startup..; .SETS UIC "[200,200]"F.; This command file attempts to determine if the system it is runningN.; on is an M-PLUS V2.0 system or later by the absence of the symbol.B.; If this symbol is undefined, the assumption is that the currentH.; environment is an up-and-running V2.0 or later system. This will onlyG.; be incorrect if the user is attempting to use the old V2.0 baseline.eD.; This combination probably will not work because this command fileH.; will not attempt to bring the necessary devices on line, or otherwise$.; set up the necessary enviornment.K.; If is false or undefined, we are executing on an up-and-runningtL.; V2.0 or later system, not the baseline. In this case, we will not attemptM.; to set the system time, bring devices on line, or effect the system in anyt.; way.w .SETT INST .SETT ONL .IFNDF .GOTO 10e .IFT .GOTO BSL.10:;oH; RSX-11M-PLUS V'$VERSN' On-line Distribution Kit Installation Procedure;p<; This command file installs the RSX-11M-PLUS V'$VERSN' kit 9; and prepares it for performing a SYSGEN. It assumes therB; current environment is an up-and-running RSX-11M-PLUS V'$VERSN',3; RSX-11M-PLUS V3.0 (or later), or VAX/VMS system. aA; All the necessary devices must already be configured on line. <; The current system will not be affected in any way by the ; execution of this file..; .SETS $TIME "'' '
; baseline system. Either of the following command lines will; work:y; #; MCR> CON DISPLAY FULL ATTRIBUTESt; MCR> CON DIS FUL ATTd;e CON DIS FULL ATTR;i;u@; The CSR and vector addresses should be obvious from this list.A; Note which devices are in conflict and if they are NOT required @; in order to complete your SYSGEN, use the following command to6; remove the driver from the currently running system:;r ; UNL xx:; :; Substitute the device name such as "DK", or "MT" for the,; characters "xx" in the command line above.;oB; If this operation solves the problem answer Yes to the following ; question: ; 7; Do you now wish to try to bring all devices on line?e;r;d=; If the device IS REQUIRED in order for you to complete youra9; SYSGEN, then use the following command lines to set the '; appropriate CSR and/or vector values:o;n"; The CON command to set a CSR is:;e; MCR> CON SET xxa CSR=nnnnnn;:%; The CON command to set a vector is: ;"; MCR> CON SET xxa VEC=nnnc;s>; In the command lines above, "xxa" is the controller name for<; the device. The correspondance between controller name andC; logical device name can be seen in the above FULL device display.t;d>; Note that the controller must be off line before you will be<; allowed to reset the CSR and/or vector values. This is the@; case with all controllers excepting the system disk controller:; and the controller for this terminal. You may not modify#; the values for these two devices.O;E;x4 .ASK PAUSE Do you need to issue UNL or CON commands .IFF PAUSE .GOTO CONASK;h@; We will now pause to allow you to issue the appropriate CON orA; UNL commands. If you need more information about either program "; use the following command lines:;n; MCR> HELP UNL; MCR> HELP CON;tB; If you believe that you will be using this baseline system again@; and will have to repeat this configuration section, you should>; create an indirect command file which may be used to performC; the configuration and/or the UNLOAD commands. Here is a sample ofs@; creating an indirect command file to change the CSR address ofA; RK11 controller DKA and unload the driver for the RL01/02 (DL:)f;a; >INS [3,54]EDIr; >EDI BASECON.CMDl; [CREATING NEW FILE]; INPUT; CON SET DKA CSR=177404 ; UNL DL: ; ; *EX; >; +; This file may then be invoked as follows:o;p ; >@BASECON; >CON SET DKA CSR=177404 ; >UNL DL: ; >@ a;f .PAUSE G.CONASK:.ASK CONALL Do you now wish to try to bring all devices on linee .IFF CONALL .GOTO CONDNEg.CONALL: CON ONLINE ALLc .SETT $CONALd.CONDNE: .SETF TWODSKe .SETS NOINI "NOINI" .SETS TRGDSK "SY:"  .SETS UFD "/UFD"  .SETS PRSRV ""D .IFT TAPEKT .GOTO TAPKITG.; Disk kit (two disks)N .SETT TWODSK0;D; The disk distribution kit consists of two disk packs. One of theseI; contains the bootstrappable system and everything that is necessary forLF; SYSGEN. This is the disk from which this command file is executing.=; The other pack contains the sources of various parts of theI; RSX-11M-PLUS system, and other files that are not necessary for SYSGEN.EG; This pack should be spinning in another drive. Please enter the name"F; of this drive. This pack can also be used during SYSGEN to hold theJ; Executive listings and maps since they will not fit on the target system; disk.t;sF.100: .ASKS TRGDSK Enter name of second disk containing system sources .IF < 2 .GOTO 100i& .SETS TEMPS TRGDSK[:]) .IF TEMPS NE ":" .SETS TRGDSK TRGDSK+":"s .GOTO CRUFD.TAPKIT:;S;; Prepare to bring in the remainder of the distribution kit;h> .ASK TWODSK Is your target system disk an RC25, RK07, or RD52 .IFF TWODSK .GOTO BRU2NDs;cF; The disk onto which you have just load00&hX+h,d=kgTADATADATAed your RSX-11M-PLUS V'$VERSN'E; system now contains all the files that will be needed by the SYSGENAB; procedure. There is another backup set on the distribution tapeF; that contains all of the other sources shipped as part of the normalG; distribution. This backup set will be restored to another disk whichpE; you must provide. This disk can also be used during SYSGEN to holdKF; the Executive listing and maps since they will not fit on the target; system disk.;i.RK7: B; Please supply the name of a drive that contains an empty disk to; receive the source files.w; 3; NOTE: All current data on this disk will be lost.h;b= .ASKS DSK2 Enter the name of the disk to receive the sourceso .IF < 2 .GOTO RK7o$ .SETS TEMPS DSK2[:]% .IF TEMPS NE ":" .SETS DSK2 DSK2+":"s .SETS TRGDSK DSK2 .SETS NOINI "INI/HEADER:1654" .SETS UFD ""S .SETS PRSRV "/NOPRES"..; See if the disk is already mounted foreign. .TESTDEVICE 'DSK2's .TEST "FOR"e> .IF NE 0 .GOTO ASKFMT ! If NE, already mounted /FOR;v;; We will now mount the disk that will receive the sources.s;i .SETS ERREP "MRK7"S .SETS ERCNT "ASKFMT"o.MRK7: MOU 'DSK2'/FOR # .IF <> .GOTO ERRo.ASKFMT:3 .IFT VMS .GOTO ASKBAD ! FMT not available on VMSS;D<; The disk in 'DSK2' can now be formatted and/or checked forC; bad blocks if necessary. It is generally not necessary to formatdB; the disk unless you know that it is not properly formatted. The(; bad block check is highly recommended.;e1 .ASK FB Do you wish to format the disk in 'DSK2't .IFF FB .GOTO ASKBADu;s .IFNINS ...FMT INS $FMT .SETS ERREP "DOFMT" .SETS ERCNT "ASKBAD"2.DOFMT: FMT 'DSK2'/VERIFYU# .IF <> .GOTO ERRM.ASKBAD:;D; .ASK FB Do you wish to run the Bad Block Locator on 'DSK2'n .IFF FB .GOTO BRU2NDc;k .SETS ERREP "DOBAD" .SETS ERCNT "BRU2ND"e! .IFNINS ...BAD .IFF VMS INS $BADh.DOBAD: BAD 'DSK2'/LISTaK.; If BAD finds any bad blocks, it returns an ERROR status. We do not want!.; to consider that a real error.t! .IF > .GOTO ERRK'.; See if they want to verify the copy.E.BRU2ND:/ .IFF VMS .OR .IF NOINI NE "NOINI" .GOTO B2N020FL.; If we are running under VAX-11 RSX, the BRU switch combination /NOINI/UFDN.; will not work. So we have to create the directories we need by hand before!.; copying the second backup set.F .SETS UFD ""V;SI; We will now create the directories that are needed for the remainder ofr7; the distribution kit. You will not see the commands. ;e .ENABLE QUIET .GOSUB AMEUFD .DISABLE QUIET.B2N020:.; Continuev; H; Since the files in the second backup set are not necessary to generate@; your system you may wish to skip the verify pass to save time.;N7 .ASK TEMPL Do you want to verify the second backup sete .SETS VER ""  .IFT TEMPL .SETS VER "/VER"..; See if the tape is already mounted foreign. .TESTDEVICE 'TAPE'r .TEST "FOR"d> .IF NE 0 .GOTO INSBRU ! If NE, already mounted /FOR;h:; We will now mount the tape in 'TAPE' for access by BRU. ;U .SETS MOUDEN "/DENS='DENS'" .IF DENS EQ "" .SETS MOUDEN ""n .SETS ERREP "MTPE"c .SETS ERCNT "INSBRU"o.MTPE: MOU 'TAPE'/FOR'MOUDEN'e# .IF <> .GOTO ERR .INSBRU:;w(; Ensure that the BRU task is installed.;V) .IFNINS ...BRU .OR .IFT VMS .GOTO NSBRU2S .TESTFILE TI: .TEST ":"e! .SETS TIN [2:-1]T INS $BRU/TASK=BRU'TIN'T).NSBRU2: .IFNINS ...BRU .IFF VMS INS $BRUn; 9; We will now load the remainder of the distribution kit. ;B TIMEU; .SETS BRUDEN "/DENS:'DENS'" .IF DENS EQ "" .SETS BRUDEN "" .SETS ERREP "BRUKIT"E .SETS ERCNT "CRUFD".BRUKIT: .SETS TEMPS $BLVL.BKBLVL: .TEST TEMPS .IFT .GOTO BKBLX .SETS TEMPS TEMPS[1:-1] .GOTO BKBLVL.P.BKBLX: BRU /BAC:MPBL'TEMPS'SRC'UFD''PRSRV'/'NOINI''BRUDEN''VER' 'TAPE' 'TRGDSK'N.; When copying 2nd backup set to a second disk, BRU exits with WARN00g > .GOTO ERR ; .SETS TEMPS "/LOCK=UNLOAD"  .IFT VMS .SETS TEMPS "/UNLOAD"" DMO 'TAPE''TEMPS'.CRUFD: ; TIME. .IFF TWODSK .GOTO DOUFD.; Two disk target only>K.; If we have copied the second backup set to a second disk, it was mountedBM.; foreign above. If we are installing a disk kit on line, the user has leftoM.; the second disk mounted foreign after copying it. In either case, we muste-.; dismount it before mounting it Files-11. r .SETS TEMPS "/LOCK=NOUNLOAD" ! .IFT VMS .SETS TEMPS "/NOUNLOAD"T- .IFT TAPEKT .OR .IFT ONL DMO 'TRGDSK''TEMPS'O .SETS ERREP "MTRG"P .SETS ERCNT "CPYHLP"..MTRG: .SETS TEMPS "/OVR" .IFT VMS .SETS TEMPS "/OV=ID" MOU 'TRGDSK''TEMPS'# .IF <> .GOTO ERR 8.; Copy the help files from the second disk to the first.CPYHLP:;hD; We will now copy the help files from the second disk to the target; system disk.;e .ENABLE QUIET .TESTFILE SY:[0,0]001002.DIR1 .IF <> 1 UFD SY:[1,2]O .DISABLE QUIETS SET /UIC=[1,2]D PIP SY:[1,2]/CD='TRGDSK'[1,2].DOUFD:';MC; We will now create any UFDs that must be created on your disk(s).T$; You will not see the UFD commands.;I .ENABLE QUIET .TESTFILE SY:[0,0]001004.DIRU .IF <> 1 UFD SY:[1,4]e .TESTFILE SY:[0,0]001006.DIRo .IF <> 1 UFD SY:[1,6]w .TESTFILE SY:[0,0]001007.DIRm .IF <> 1 UFD SY:[1,7]  .TESTFILE SY:[0,0]001011.DIRI .IF <> 1 UFD SY:[1,11] .TESTFILE SY:[0,0]001034.DIR2 .IF <> 1 UFD SY:[1,34] .TESTFILE SY:[0,0]001054.DIRK .IF <> 1 UFD SY:[1,54] .TESTFILE SY:[0,0]006054.DIRe .IF <> 1 UFD SY:[6,54] .TESTFILE SY:[0,0]011024.DIR! .IF <> 1 UFD SY:[11,24]0 .TESTFILE SY:[0,0]011034.DIR>! .IF <> 1 UFD SY:[11,34]0 .TESTFILE SY:[0,0]011040.DIR1! .IF <> 1 UFD SY:[11,40]0" .TESTFILE 'TRGDSK'[0,0]001003.DIR$ .IF <> 1 UFD 'TRGDSK'[1,3]" .TESTFILE 'TRGDSK'[0,0]001004.DIR$ .IF <> 1 UFD 'TRGDSK'[1,4]" .TESTFILE 'TRGDSK'[0,0]001010.DIR% .IF <> 1 UFD 'TRGDSK'[1,10]U" .TESTFILE 'TRGDSK'[0,0]001034.DIR% .IF <> 1 UFD 'TRGDSK'[1,34]5" .TESTFILE 'TRGDSK'[0,0]001050.DIR% .IF <> 1 UFD 'TRGDSK'[1,50]E" .TESTFILE 'TRGDSK'[0,0]001064.DIR% .IF <> 1 UFD 'TRGDSK'[1,64]S" .TESTFILE 'TRGDSK'[0,0]011034.DIR& .IF <> 1 UFD 'TRGDSK'[11,34]" .TESTFILE 'TRGDSK'[0,0]011040.DIR& .IF <> 1 UFD 'TRGDSK'[11,40]" .TESTFILE 'TRGDSK'[0,0]012024.DIR& .IF <> 1 UFD 'TRGDSK'[12,24]" .TESTFILE 'TRGDSK'[0,0]012034.DIR& .IF <> 1 UFD 'TRGDSK'[12,34]" .TESTFILE 'TRGDSK'[0,0]012040.DIR& .IF <> 1 UFD 'TRGDSK'[12,40]" .TESTFILE 'TRGDSK'[0,0]013024.DIR& .IF <> 1 UFD 'TRGDSK'[13,24]" .TESTFILE 'TRGDSK'[0,0]013034.DIR& .IF <> 1 UFD 'TRGDSK'[13,34]" .TESTFILE 'TRGDSK'[0,0]013040.DIR& .IF <> 1 UFD 'TRGDSK'[13,40]" .TESTFILE 'TRGDSK'[0,0]014024.DIR& .IF <> 1 UFD 'TRGDSK'[14,24]" .TESTFILE 'TRGDSK'[0,0]014034.DIR& .IF <> 1 UFD 'TRGDSK'[14,34]" .TESTFILE 'TRGDSK'[0,0]014040.DIR& .IF <> 1 UFD 'TRGDSK'[14,40]" .TESTFILE 'TRGDSK'[0,0]015024.DIR& .IF <> 1 UFD 'TRGDSK'[15,24]" .TESTFILE 'TRGDSK'[0,0]015034.DIR& .IF <> 1 UFD 'TRGDSK'[15,34]" .TESTFILE 'TRGDSK'[0,0]015040.DIR& .IF <> 1 UFD 'TRGDSK'[15,40]" .TESTFILE 'TRGDSK'[0,0]023024.DIR& .IF <> 1 UFD 'TRGDSK'[23,24]" .TESTFILE 'TRGDSK'[0,0]023034.DIR& .IF <> 1 UFD 'TRGDSK'[23,34]" .TESTFILE 'TRGDSK'[0,0]023040.DIR& .IF <> 1 UFD 'TRGDSK'[23,40]" .TESTFILE 'TRGDSK'[0,0]024024.DIR& .IF <> 1 UFD 'TRGDSK'[24,24]" .TESTFILE 'TRGDSK'[0,0]024034.DIR& .IF <> 1 UFD 'TRGDSK'[24,34]" .TESTFILE 'TRGDSK'[0,0]025024.DIR& .IF <> 1 UFD 'TRGDSK'[25,24]" .TESTFILE 'TRGDSK'[0,0]025034.DIR& .IF <> 1 UFD 'TRGDSK'[25,34]" .TESTFILE 'TRGDSK'[0,0]025040.DIR&00#&hX+h,d=kgTADATADATA .IF <> 1 UFD 'TRGDSK'[25,40]" .TESTFILE 'TRGDSK'[0,0]027024.DIR& .IF <> 1 UFD 'TRGDSK'[27,24]" .TESTFILE 'TRGDSK'[0,0]027034.DIR& .IF <> 1 UFD 'TRGDSK'[27,34]" .TESTFILE 'TRGDSK'[0,0]027040.DIR& .IF <> 1 UFD 'TRGDSK'[27,40]" .TESTFILE 'TRGDSK'[0,0]050020.DIR& .IF <> 1 UFD 'TRGDSK'[50,20]" .TESTFILE 'TRGDSK'[0,0]050030.DIR& .IF <> 1 UFD 'TRGDSK'[50,30]" .TESTFILE 'TRGDSK'[0,0]050040.DIR& .IF <> 1 UFD 'TRGDSK'[50,40]" .TESTFILE 'TRGDSK'[0,0]075024.DIR& .IF <> 1 UFD 'TRGDSK'[75,24]" .TESTFILE 'TRGDSK'[0,0]075034.DIR& .IF <> 1 UFD 'TRGDSK'[75,34]" .TESTFILE 'TRGDSK'[0,0]075040.DIR& .IF <> 1 UFD 'TRGDSK'[75,40]" .TESTFILE 'TRGDSK'[0,0]121024.DIR' .IF <> 1 UFD 'TRGDSK'[121,24][" .TESTFILE 'TRGDSK'[0,0]121034.DIR' .IF <> 1 UFD 'TRGDSK'[121,34]," .TESTFILE 'TRGDSK'[0,0]121040.DIR' .IF <> 1 UFD 'TRGDSK'[121,40]]" .TESTFILE 'TRGDSK'[0,0]125024.DIR' .IF <> 1 UFD 'TRGDSK'[125,24]7" .TESTFILE 'TRGDSK'[0,0]125034.DIR' .IF <> 1 UFD 'TRGDSK'[125,34]0" .TESTFILE 'TRGDSK'[0,0]125040.DIR' .IF <> 1 UFD 'TRGDSK'[125,40]0" .TESTFILE 'TRGDSK'[0,0]126024.DIR' .IF <> 1 UFD 'TRGDSK'[126,24]D" .TESTFILE 'TRGDSK'[0,0]126034.DIR' .IF <> 1 UFD 'TRGDSK'[126,34]D" .TESTFILE 'TRGDSK'[0,0]126040.DIR' .IF <> 1 UFD 'TRGDSK'[126,40]D" .TESTFILE 'TRGDSK'[0,0]200001.DIRN .IF <> 1 UFD 'TRGDSK'[200,1] ! Sample files for system introduction" .TESTFILE 'TRGDSK'[0,0]200002.DIR7 .IF <> 1 UFD 'TRGDSK'[200,2] ! Field ServiceI" .TESTFILE 'TRGDSK'[0,0]002300.DIR< .IF <> 1 UFD 'TRGDSK'[2,300] ! UFD FOR UETP FILES .DISABLE QUIETE .GOTO DONE'.ERR:[;,F; An error has occured which prevents the distribution tape from beingD; copied correctly onto the target disk. If the error is of obviousE; origin, please correct the fault and either continue or restart the>*; installation process from the beginning. .IFT ONL .GOTO ERR1;TB; Depending upon the cause, it may be necessary to rebootstrap theB; standalone BRU system, reinitialize the disk volume, and proceedF; through this command file again. If an attempt is made to bootstrapD; this volume and repeat this load process, an incomplete master kit ; may result.m;i.ERR1:;d; Please select desired action: ;t; A -> Abort Installation?; C -> Continue Installation Procedure from the point of error>%; (the action will not be repeated)n/; P -> Pause while the error is being resolvedt'; R -> Repeat action that caused errorr;t7 .ASKS ER Enter code for desired action (A, C, P, or R),C .IF ER NE "A" .IF ER NE "C" .IF ER NE "P" .IF ER NE "R" .GOTO ERR1d .IF ER EQ "A" .GOTO ERROR .IF ER EQ "C" .GOTO 'ERCNT' .IF ER EQ "R" .GOTO 'ERREP' .SETS TEMPS "UNS" .IFT VMS .SETS TEMPS "RES"e;c@; This command file execution will now pause to enable the errorE; condition to be fixed. Please use the 'TEMPS' command to allow thee@; indirect command file processor to continue when the error has; been resolved. .PAUSEr .GOTO ERR1S E .DONE: TIMEf;d;rD; The preparation of the RSX-11M-PLUS kit is now complete. The nextC; time this disk is bootstrapped, this dialog will only be repeated"D; on request. We will now record the successful installation in theF; log file on the new system disk, and either exit if the installationF; was done on line, or proceed with the normal startup sequence if the; baseline system was used.n;e SET /UIC=[2,54] .OPEN LB:[2,54]INSTALOG.DAT) .DATA .; RSX-11M-PLUS Base Level '$BLVL'O .DATA .;* .DATA .; Installation started at: '$TIME'6 .DATA .; Installation completed at: '' '- .ERROR ;EXPRESSIONS NOT EQUAL .ENDM C;l; CALL SUBROUTINE; .MACRO CALL SUBR ARGa .IF IDN <$INTSV>, JSR R5,$INTSV .WORD ^C&PR7 .IFFa .IF IDN <$SAVNR>, JSR R5,$SAVNR .IFF .IF IDN <$SWSTK>, EMT 376 .WORD ARG .IFFn JSR PC,SUBR .ENDC .ENDC .ENDC .ENDM;U!; CALL AND RETURN FROM SUBROUTINET;$ .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 X .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;n; SET DIRECTIVE STATUS;N .MACRO DRSTS VALUE TRAP VALUER .ENDM;B;; INTERRUPT SAVE GENERATION MACR006cbibjbkb a a aO 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$:  .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 00>cDca__DATADATADATADATA;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 #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;A*; BLOCK MOVE INSTRUCTION MACRO (TEMPORARY);N .MACRO MOVR$ SRC,DST,CNTM .NTYPE $$$S,SRC .NTYPE $$$D,DST .NTYPE $$$C,CNT .IF EQ,<<$$$S!$$$D!$$$C>&70>C$$$S = $$$S*^o100;$$$D = $$$D*^o10 .LIST MEB .WORD ^o075000+$$$S+$$$D+$$$C .NLIST MEB .IFF ;EQ-/ .ERROR ; Invalid addressing mode used in MOVR$ .ENDC ;EQ,<<$$$S!$$$D!$$$C>&70> .ENDM ;MOVR$V .IIF NDF S$$YDF , .LISTBUF MOV$ OPCODE .IF DF VC$CPR S CALL @CPSEN .IFF CALL $CPSEN .ENDC ;VC$CPR.; .; SYSGEN.CMD.;/.; RSX-11M-PLUS SYSGEN -- Chain to SYSGEN.CLB;.;.;.;3.; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.a.; 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 LICENSEC.; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIScB.; 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.h.;B.; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTB.; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL.; EQUIPMENT CORPORATION.E.;B.; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF=.; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.G.;.; Version: 03.01S.;.; Written by:.;.; J. C. Franzini .;.; Modified for M-PLUS V3.0 by: .;!.; J. C. Franzini 31-Aug-84 03.01L.; 00FcGcibjbkb a a aJCF177 -- 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.G.;.; Version: 03.01S.;.; Written by:.;.; J. C. Franzini .;.; Modified for M-PLUS V3.0 by: .;!.; J. C. Franzini 31-Aug-84 03.01L.; .;.; SGNPREFIX.CMD.;..; RSX-11M-PLUS SYSGEN -- Prefix Command File2.; Allow unsupported systems to be generated..;.;.;2.; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A..; All rights reserved.;.;=.; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDe?.; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.C.;.; Version: 03.01 .;.; Written by:.;.; J. C. Franzinie.;.; Modified for M-PLUS V3.0 by:.;!.; J. C. Franzini 27-Aug-84 03.01D.; JCF174 -- cleanupS.;%.; Modified for RSX-11M-PLUS V4.5 by:-.;,.; D. Carroll 15-April-1994 (Tax day) 03.026.; DC282 -- Update what is supported, and by whom ....;F.; This command file can be used to generate nonstandard systems or toI.; predefine the SYSGEN questions which are not saved in the saved answerR .; files.TC.; EDIT THIS COMMAND FILE AT YOUR OWN RISK. IF YOU EDIT THIS FILE,C.; SYSGEN AND THE RESULTING SYSTEM WILL NOT BE SUPPORTED BY DIGITALJ .; OR MENTEC.7J.; 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.8L.; SYSGEN will find the latest version 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 generateHB.; a nonstandard system by printing out one of the messages below.G.; As long as your edited copy of SGNPREFIX remains in [200,200], everyC-.; SYSGEN you perform will be affected by it.o .ENABLE GLOBALn .ENABLE SUBSTITUTION  .DISABLE LOWERCASET .SETT Y .SETF NB.; ***************************************************************B.; * !!! WARNING !!! *.; * *B.; * IF YOU CHANGE THE DEFINITIONS OF THE FOLLOWING VARIABLES, *B.; * THE RESULTING SYSTEM WILL NOT BE SUPPORTED BY DIGITAL *B.; * EQUIPMENT CORPORATION OR MENTEC INCORPORATED, U.S.A. *B.; * *B.; ***************************************************************/ .SETF $18BIT ! 22-bit system will be generated*?.; .SETT $18BIT ! 18-bit system will be generated (UNSUPPORTED)W9 .SETF $M$PRO ! Single processor system will be generated G.; .SETT $M$PRO ! Multiprocessor system will be generated (UNSUPPORTED)  .SETL SUPRTD #$18BIT&#$M$PROO .IFT SUPRTD .GOTO 10* ;B ; ***************************************************************B ; ***************************************************************B ; ** **B ; ** WARNING -- THE RESULTING SYSTEM WILL NOT BE SUPPORTED **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 symbolT(.; .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 $D00NcBOca__DATADATADATADATAIRCT ! ...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 ; ************************************************* .TITLE DVINT  .IDENT /03.02/ F; ,; Copyright (c) 1995 by Mentec, Inc., U.S.A.; 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.;X; P. J. BEZEREDI 04-OCT-77;;A+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:P;=; P. J. BEZEREDI1 ; T. LEKAS; ;;; MODIFIED BY:;; J. W. BERZLE 07-SEP-83 03.00;C2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES;0 ; B. S. MCCARTHY 30-MAy-84 03.01;/; BM309 -- STREAMLINE PORCESSING OF INTERRUPTS ;t$; Modified for RSX-11M-PLUS V4.6 by:;; D. Carroll 18-Oct-1995 03.028; DC404 - Include PSECT definitions to allow to extend ; ICB pool automatically;C;I;S; ;DC404EB; OVERLAPPED SEEK/MIXED MASSBUS/LOADABLE DRIVER INTERRUPT ROUTINES1; FOR RH11/RH70(DB,DR,DS,MM,MF,EM) AND RK611(DM). ;I; MACRO LIBRARY CALLSE;E1 .MCALL DCBDF$,HWDDF$,KRBDF$,PCBDF$,SCBDF$,BGCK$AI DCBDF$ ;DEFINE DCB OFFSETSS$ HWDDF$ ;DEFINE HARDWARE REGISTERS KRBDF$ ;DEFINE KRB OFFSETSI# PCBDF$ ;DEFINE PARTITION OFFSETSM SCBDF$ ;DEFINE SCB OFFSETSl. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404;o; EQUATED SYMBOLSn; ;RH11/70 REGISTER OFFSETSI/RHCS2= 10 ;OFFSET TO CONTROL STATUS RGISTER 2 0RHAS= 16 ;OFFSET TO ATTENTION SUMMARY REGISTER)RHDT= 26 ;OFFSET TO DRIVE TYPE REGISTER  ;RK611 REGISTER OFFSETSE0RKCS2= 10 ;OFFSET TO CONTROL STATUS REGISTER 2/RKAS= 16 ;OFFSET TO ATTENTION/OFFSET REGISTERF&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 I00BVcGcibjbkb a a aNTO 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 REMAINING 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. ;NC; IF AN UNCONFIGURED (IN THE DATA BASE) UNIT RAISES IT'S ATTENTION,.C; WE WILL CRASH THE SYSTEM WITH R0 CONTAINING THE CURRENT ATTENTIONLE; BITS I00B^cOca__DATADATADATADATAN THE HIGH BYTE. THIS IS BECAUSE THE ONLY METHOD OF CLEARING D; AN ATTENTION IS TO SELECT AND CLEAR THE DRIVE AT THE DRIVER LEVEL.=; THIS CANNOT BE DONE BECAUSE THE UNIT HAS NO DATA STRUCTURE.L;F ; INPUTS:O; NONE. ;R ; OUTPUTS:; NONE. ;E5; ALL REGISTERS ARE PRESERVED (R4 AND R5 VIA $INTSE).R;- .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 ADDRESS  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?E 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 .IF DF K$$DAS+ MOV KDSAR5,-(SP) ;;;SAVE KERNEL DATA APR 5O .IFTF, MOV D.PCB(R2),R4 ;;;GET DRIVERS PCB ADDRESS) BEQ 10$ ;;;IF EQ DRIVER IS PART OF EXECU9 MOV P.REL(R4),KINAR5 ;;;MAP DRIVER IN INSTRUCTION SPACEF .IFTV2 MOV P.REL(R4),KDSAR5 ;;;MAP DRIVER IN DATA SPACE .IFTF=10$: MOV D.DSP(R2),R4 ;;;GET ADDRE00BfcGcibjbkb a a aSS OF DRIVER DISPATCH TABLE % BEQ 30$ ;;;IF EQ DRIVER IS UNLOADEDO: 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 ADDRESSV2 BIC #S2.ACT,S.ST2(R4) ;;;SHOW INTERRUPT INACTIVE# CALL @(SP)+ ;;;CALL PROPER DRIVER 30$: ;;;REF LABEL .IFTU. MOV (SP)+,KDSAR5 ;;;RESTORE KERNEL DATA APR 5 .ENDC/ MOV (SP)+,KINAR5 ;;;RESTORE KERNEL INSTR APR 5 (40$: MOV (SP)+,R4 ;;;RESTORE CSR ADDRESSXIT: RETURN ;;;O;+,; **-FRKDRV-EMULATE A DRIVER'S CALL TO $FORK;U;; THIS ROUTINE WILL SETUP THE STACK IN ORDER TO EMULATE THEA; DRIVER'S CALL TO $FORK.I;TD; NOTE: THIS ROUTINE ASSUMES THAT THE DRIVER IS LOADABLE AND LOADED.;; THIS IS DONE BECAUSE THIS ROUTINE IS ONLY CALLED FOR DATA ; TRANSFER INTERRUPTS.;: ; INPUTS:L; R5 = UCB ADDRESS); (SP) = ADDRESS TO RETURN TO AFTER $FORK5; ; 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 FOR 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 MA00BncCuca__DATADATADATADATASSBUS 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);WAS 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"; 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 .TITLE ACSUB .IDENT /03.01/C ;P,; Copyright (c) 1995 by Mentec, Inc., U.S.A.; All rights reservedK;E;C<; 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-78V;S+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:P;T; B. KRISHNAMURTHY; ; MODIFIED BY:; ; J. W. BERZLE 07-SEP-83 03.00; 2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES;E; D. Carroll 18-Oct-1995 03.01:; DC404 - Inc00CvcGcibjbkb a a alude PSECT statement to allow ICB pool to be; expanded during sysgen; ;.#; CPU ACCOUNTING COMMON SUBROUTINES;; MACRO LIBRARY CALLSI;D .MCALL ACNDF$,ABODF$,BGCK$A* ACNDF$ ;DEFINE ACCOUNTING BLOCK OFFSETS ABODF$ ;TASK ABORT CODES. ;DC404. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404;+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)tM; **-$QACNT-QUEUE ACCOUNT BLOCK TO SYSLOG (THE BLOCK IS ALREADY IN SEC. POOL);I; THESE ROUTINES QUEUE ALL THE ACCOUNTING DATA PACKETS TO THE SYSLOG TASKN; FOR PROCESSING;F ; INPUTS:F; ?; R0=VIRTUAL ADDRESS OF PACKET IN CALLING TASK'S SPACE ($QTRAN,E; $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;(;- .IF DF A$$CNT .ENABL LSB-*$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 ACTIVEE BEQ 45$ ;IF EQ NO SAVNR ;SAVE R4, R5T MOV R3,-(SP) ;SAVE R3 CLR R4 ;% BISB B.LEN(R0),R4 ;GET PACKET LENGTHS MOV R1,-(SP) ;SAVE UAB ADDRESSE MOV R4,R1 ;LENGTHN, 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;+6; **-$ALACC-ALLOCATE SECONDARY POOL FOR ACCOUNTING USE/; **-$ALTAB-ALLOCATE A TASK ACCOUNT BLOCK (TAB)M;$B; THIS ROUTINE DOES ALL SECONDARY POOL ALLOCATIONS FOR ACCOUNTING.C; A CHECK IS MADE TO INSURE THAT ACCOUNTING ALWAYS LEAVES A CERTAINTI; AMOUNT OF SEC POOL AVAILABLE. THE ALLOCATION WILL FAIL IF THIS MINIMUMEM; AMOUNT OF CANNOT BE LEFT AFTER THE ACCOUNTING ALLOCATION. IF AN ACCOUNTING0H; 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; 00C~cuca__DATADATADATADATAC=0 ALLOCATION SUCCESSFULO%; R0=APR BIAS TO MAP ALLOCATED BLOCK ; R1=NUMBER OF BLOCKS ALLOCATED; C=1 CANNOT DO ALLOCATION;I; REGISTERS R4, R5 PRESERVED;A;- .ENABL LSBT@$ALTAB::MOV #T.NTAF,-(SP) ;ERROR CODE FOR TAB ALLOCATION FAILURE BR 5$ ;JOIN COMMON CODEG@$ALACC::MOV #T.NAAF,-(SP) ;GENERAL ACCOUNTING ALLOCATION FAILURE?5$: BIT #BF.ERR,$ACNFE ;HAS THERE BEEN A FATAL ACCOUNTING ERRORT BNE 10$ ;IF NE YES1 MOV $SECFR,R2 ;GET AMOUNT OF FREE SECONDARY POOLY& SUB R1,R2 ;ALLOW FOR THIS ALLOCATION2 CMP $APLIM,R2 ;WILL THERE BE ENOUGH LEFT AFTER IT BHI 10$ ;IF HI NOC& 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 ;+*; **-$TMSTP-TIME STAMP AN ACCOUNTING BLOCK;SD; THIS ROUTINE COPIES THE CURRENT TIME FROM $TTNS INTO THE SPECIFIED2; OFFSET IN THE ACCOUNTING BLOCK IN SECONDARY POOL;V ; INPUTS:G;E2; R0=OFFSET TO START OF 3 WORD TIME FIELD IN BLOCK%; R1=APR BIAS TO MAP ACCOUNTING BLOCK2; ; OUTPUTS:;V; TIME FIELD OF BLOCK UPDATED ;F$; REGISTERS R1, R3, R4, R5 PRESERVED;F;-+$TMSTP::MOV KISAR6,-(SP) ;SAVE APR6 MAPPINGC$ 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 FIELDE/ INC R2 ;SKIP HIGH BYTE OF WORD FIELD IN SYSCMC! CMP #$TTNS,R2 ;COPYING COMPLETE?V BHI 10$ ;IF HI NO0" MOV (SP)+,KISAR6 ;RESTORE MAPPING20$: RETURN ;A;+-; **-$CPUTM-CALCULATE CPU TIME USED BY A TASK5; **-$CPUT1-CALCULATE CPU TIME USED BY SPECIFIED TASK ; F; 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.;C; INPUT:;,:; R0=TCB ADDRESS OF TASK TO BILL CPU TIME TO ($CPUT1 ONLY); NO INPUTS IF ENTRY AT $CPUTM; ; OUTPUT: ;$; NONE;L#; REGISTERS R0, R1, R2, R3 MODIFIEDP;-;- .ENABL LSBU; D10$: BGCK$A BF.ACC,BE.NCT,FATAL ;MUST BE ACTIVE TASK WITH ACCOUNTING;A*$CPUTM::MOV $TKTCB,R0 ;LOCATE CURRENT TASK! BEQ 10$ ;IF EQ, NO CURRENT TASKU8$CPUT1::MOV T.ACN(R0),R0 ;LOCATE TASK'S ACCOUNTING BLOCK$ BEQ 10$ ;IF EQ NO ACCOUNTING BLOCK% INCB $BILNG ;END CPU BILLING PERIODT4 MOV $ACCLK+2,R2 ;GET LOW ORDER PART OF CURRENT TIME# MOV $ACCLK,R3 ;GET HIGH ORDER PART)4 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) ;K00CcGcibjbkb a a a ADD R3,(R4) ;HIGH ORDER MOV (SP)+,R4 ;RESTORE R4' MOV (SP)+,KISAR6 ;RESTORE EXEC MAPPING .IFFK BR 40$ ;,30$: ;ADD CPU TIME INTO ACCOUNTING BLOCKS .ENDC;+B; **-$ADATA-ADD DATA TO THE APPROPRIATE FIELD OF ACCOUNTING BLOCKSI; **-$ADATS-ADD DATA TO APPROPRIATE FIELD ASSUMING SINGLE PRECISION VALUETC; **-$ADAT1-INCREMENT THE APPROPRIATE ACCOUNTING ACCUMULATION FIELDN;CI; THESE ROUTINES ADD THE SUPPLIED DATA TO THE ACCUMULATION FIELD OF EVERYSH; ACCOUNTING BLOCK LINKED OFF THE INITIAL BLOCK UNTIL END OF THE LIST IS>; REACHED. A STANDARD TWO WORD ACCUMULATION FIELD IS REQUIRED.; ; INPUTS:0; (; 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 VALUE + MOV R3,-(SP) ;GET HIGH ORDER PART OF VALUED/ ADC (SP) ;INCLUDE CARRY BIT FROM PREVIOUS ADD3 ADD (SP)+,140000(R1) ;ADD HIGH ORDER PART OF VALUEF BCC 45$ ;IF CC, OK CALL OVFLW ;HANDLE OVERFLOWR645$: MOV @#B.PNT+140000,KISAR6 ;MAP NEXT BLOCK IN LIST BNE 40$ ;IF NE, THERE IS ONE50$:" MOV (SP)+,KISAR6 ;RESTORE MAPPING RETURNR $ADAT1::MOV #1,R2 ;VALUE TO ADD$ADATS::MOV R3,-(SP) ;SAVE R3;, CLR R3 ;MAKE HIGH ORDER PART OF VALUE ZERO$ CALL $ADATA ;CALL ADDITION ROUTINE MOV (SP)+,R3 ;RESTORE R3( RETURNH .DSABL LSBO;+3; **-OVFLW-HANDLE FIELD OVERFLOW FOR $ADATA ROUTINE;D@; THIS LOCAL ROUTINE GETS CALLED WHEN THE ADD, ADC, ADD SEQUENCE=; IN THE $ADATA ROUTINE RESULTS IN C=1 OUT OF THE SECOND ADD.I>; IF THE ACCOUNTING BLOCK IS A TAB AND THE FIELD IS B.CPU, THEC; TASK HAS EXCEEDED ITS TIME LIMIT. IT IS THEREFORE ABORTED, UNLESS >; IT HAS ALREADY BEEN DEACTIVATED. THIS CAN HAPPEN BY THE CALL; TO $CPUTM OUT OF DREIF.O;C ; INPUTS: ;L(; R1=OFFSET TO FIELD IN ACCOUNTING BLOCK;(5; 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$QTRAN::$QTRN1::$QTRN2::$QACNT::$ALACC::$TMSTP::$CPUTM::$CPUT1::$ALTAB::$ACINP::$ACINC:: .ENDC .ENDABPT,KISAR6 ;POINT TO SYSTEM ACCOUNT BLOCKE2 BEQ 10$ ;IF 00Dcuca__DATADATADATADATA .TITLE DRREQ2 .IDENT /05.00/] U;A1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.D; All rights reserved-;-;5; D. N. CUTLER 13-SEP-73;E;s; MODIFIED BY:;C; J. W. BERZLE 26-JUN-84 05.00;y-; JWB085 -- PROPAGATE CONTEXT BLOCK POINTER $; (NAMED DIRECTORY SUPPORT)4;;I;F; REQUEST TASK DIRECTIVE;; MACRO LIBRARY CALLS6;S  .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.; ; DPB FORMAT:s;e"; 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 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 DIR00EcGcibjbkb a a a .TITLE DRABOF .IDENT /04.01/2 ; ;T1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.D; All rights reserved ; ;M ; COPYRIGHT (C) 1974, 1976, 1979;EA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED A; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSESA; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISA; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR A; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO ANDN1; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED.;oA; 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 CALLSo;  .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;-*$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 COD00EcFca__DATADATADATADATAE 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 R0,$TEMP0 ;INDICATE ABORT COD .TITLE DSDRVM .IDENT /12.08/;;S1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.K; All rights reservedT;A; <; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;C; P. J. BEZEREDI 19-SEP-79;,; PREVIOUSLY MODIFIED BY:R;;; P. J. BEZEREDI; R. T. PERRON;A; MODIFIED BY:;; B. S. MCCARTHY 6-AUG-85 12.08 ;I/; BM368 -- ADD CONDITIONAL SKIP OF FIRST DRIVEO!; NOT READY ERROR FOR POWERFAILA;A,; RH11/RH70-RS03/RS04 FIXED HEAD DISK DRIVER;; MACRO LIBRARY CALLS9;y .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 REGISTER!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).-;/00FcGcibjbkb a a a( 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 ;SETUP 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(R00Fcca__DATADATADATADATA5),-(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(R3),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.00FcGcibjbkb a a aSTS(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 ERROR$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 AN00FcGcHc__DATADATADATADATAY 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 CONDITION 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 SYMBOLSAR$$L11=1R5) ;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*44 .IIF DF R$$MPL .TITLE NETCM - CEX COMMON DATABASE3 .IIF NDF R$$MPL .TITLE CEXCM - CEX COMMON DATABASE  .IDENT /V03.19/ R;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.I; All rights reserved ;I;OH; 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 A00HcGcibjbkb a a 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.00 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 00HccHc__DATADATADATADATAQUEUEP .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 LONG 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@00HcIcibjbkb a a a .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 Double 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 .ENDCEAVL::.WORD 0 ; POINTER TO FIRST FREE BLOCK .WORD 0 .PSECTN .IFF ; NDF R$$MPL .IF NDF K$$DASE9$LTEEP::.WORD $SPVEX ; LAT PROCESS .TITLE DRCIN  .IDENT /5.00/;S1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.L; All rights reserved ;A;S<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;D; P. WANNHEDEN 24-MAY-77; ); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ;M; B. S. MCCARTHY;I+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:S;R; B. S. MCCARTHY;; MODIFIED BY:; ; J. W. BERZLE 17-OCT-85 5.00;L(; JWB167 - USE $QRMVA INSTEAD OF $QRMVT;R; ; MACRO LIBRARY CALLS ;y h# .MCALL HWDDF$,TCBDF$,PCBDF$,ITBDF$A% HWDDF$ ; DEFINE HARDWARE REGISTERSH TCBDF$ ; DEFINE TCB OFFSETS PCBDF$ ; DEFINE PCB OFFSETS ITBDF$ ; DEFINE ITB OFFSETS E;+!; **-$DRCIN-CONNECT TO INTERRUPT.N;-F; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CONNECT A SPECIFIED INTERRUPTG; VECTOR TO AN INTERRUPT SERVICE ROUTINE (ISR) IN THE TASK'S OWN SPACE,T;; OR TO DISCONNECT A PREVIOUSLY CONNECTED INTERRUPT VECTOR.L; F; IF THE FUNCTION "CONNECT" IS REQUESTED, THE OPERATION IS AS FOLLOWS:C; A BLOCK OF DYNAMIC MEMORY IS ALLOCATED AND SET UP AS AN INTERRUPTW@; TRANSFER BLOCK (ITB). THE ITB IS LINKED TO THE ITB LIST OF THE?; TASK WITH LISTHEAD (SINGLE WORD) IN P.DPCB OF THE TASK'S PCB.-7; CHECKPOINTING AND SHUFFLING IS DISABLED FOR THE TASK.E?; THE VECTOR IS SET UP TO POINT TO THE OFFSET X.JSR IN THE ITB,T@; WHICH CONTAINS A SUBROUTINE CALL TO THE SPECIAL INTERRUPT SAVE; ROUTINE $INTSC.N;E=; IF THE FUNCTION "DISCONNECT" IS REQUESTED, THE OPE00IccHc__DATADATADATADATARATION IST=; ESSENTIALLY THE REVERSE OF WHAT IS DESCRIBED FOR "CONNECT".S;L3; *************************************************(,; * NOTE - THE DISCONNECT FUNCTION, WHEN **; * DISCONNECTING THE LAST VECTOR (OR *,; * ONLY), CLEARS THE CHECKPOINT-DISABLE *0; * BIT (PS.CHK) AND NO-SHUFFLE-BIT (PS.NSF) */; * REGARDLESS OF WHAT THE STATE WAS BEFORE *T/; * VECTORS WERE CONNECTED OR ANY CHANGE IN *A,; * STATE WHILE VECTORS WERE CONNECTED. * ; * *; * EXCEPTIONS: *E-; * 1. IF THE TASK IS NOT CHECKPOINTABLE, * ; * PS.CHK IS NOT CLEARED. *.; * 2. IF THE TASK IS MARKED FOR ABORT FOR *3; * MEMORY PARITY ERROR, PS.NSF IS NOT CLEARED. *H3; ************************************************* ;N ; DPB FORMAT: ;C#; WD. 00 -- DIC(129.),DPB SIZE(7.).A%; WD. 01 -- INTERRUPT VECTOR ADDRESS.A/; WD. 02 -- BASE ADDRESS FOR MAPPING OF ISR ANDT'; ENABLE/DISABLE-INTERRUPT ROUTINES. D; WD. 03 -- ADDRESS OF INTERRUPT SERVICE ROUTINE. IF ZERO, DIRECTIVE<; IS "DISCONNECT FROM INTERRUPTS" AND REMAINING ARGUMENTS; ARE IGNORED.L8; WD. 04 -- ADDRESS OF ENABLE/DISABLE-INTERRUPT ROUTINE.0; WD. 05 -- (LOW BYTE) LOW BYTE OF PSW TO BE SET; BEFORE CALLING ISR.#; WD. 06 -- ADDRESS OF AST ROUTINE.;P ; INPUTS:;9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=POINTER TO WD. 01 IN DPBA/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.I,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;F6; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK).;S; IF SUCCESSFUL COMPLETION:R; CC-C 0; DIRECTIVE STATUS:N; +16; BEFORE RETURN, THE ENABLE/DISABLE-INTERRUPTS ROUTINE:; (IF SPECIFIED) IS CALLED IN KERNEL MODE WITH CC-C CLEAR.; ; IF DIRECTIVE IS REJECTED:R; CC-C 1; DIRECTIVE STATUS:U7; D.RS1 AN ITB COULD NOT BE ALLOCATED (NO POOL SPACE).R/; D.RS8 THE FUNCTION REQUESTED IS "DISCONNECT"A,; AND THE TASK IS NOT OWNER OF THE VECTOR.); D.RS16 ISSUING TASK IS NOT PRIVILEGED.1; D.RS17 THE SPECIFIED VECTOR IS ALREADY IN USE. 8; D.RS19 THE SPECIFIED VECTOR IS ILLEGAL (LOWER THAN 606; OR HIGHER THAN HIGHEST VECTOR SPECIFIED AT SYSGEN,; OR NOT A MULTIPLE OF 4).8; D.RS81 ISR OR ENABLE/DISABLE-INTERRUPT ROUTINE IS NOT1; WITHIN 4K WORDS FROM (BASE ADDRESS & 177700). ;- U .IF DF C$$INT O .ENABL LSBL T$DRCIN::, BIT #T3.PRV,T.ST3(R5) ; IS TASK PRIVILEGED? BEQ 95$ ; N - ILLEGAL, JUMPK   .IF DF M$$PRO .B BIT $CPBIT,T.RRM(R5) ;DOES TASK HAVE AFFINITY FOR THIS PROCESSOR? BEQ 100$ ;NO IF EQ E .ENDC 1 H" MOV (R3)+,R4 ; GET VECTOR ADDRESS BIT #3,R4 ; MULTIPLE OF 4?$ BNE 60$ ; N - ILLEGAL VECTOR, JUMP CMP R4,#60 ; VECTOR IN RANGE?R BLO 60$ ; N - JUMP CMP R4,#V$$CTRT BHIS 60$ ; N - JUMP4 MOV (R3)+,R0 ; GET BASE ADDRESS" MOV (R3)+,-(SP) ; GET ISR ADDRESS# BEQ 40$ ; ZERO - DISCONNECT, JUMPV;S; DIRECTIVE IS "CONNECT"; .IF DF E$$LOG&E$$NSIJ CMP @R4,#$NS0 ; VECTOR IN USE?B BLO 70$ ; Y - ILLEGAL, JUMPH CMP @R4,#$NS7 BHI 70$ ; Y - ILLEGAL, JUMPO .IFF ; DF E$$LOG&E$$NSI" CMP @R4,#$NONSI ; VECTOR IN USE ? BNE 70$ ; Y - ILLEGAL, JUMPE .ENDC ; DF E$$LOG&E$$NSIU1 BIC #77,R0 ; CLEAR LOWER 6 BITS IN BASE ADDRESS  P .IF DF U$$DAS) CALL $RELUI ; RELOCATE TO APR 6 ADDRESSE .IFF ; DF U$$DAS) CALL $RELOC ; RELOCATE TO APR 6 ADDRESSO .ENDC ; DF U$$DAS* SUB #20000,R2 ; RELOCATE TO APR 5 ADDRESS BCS 90$ ; OUT OF RANGE - JUMPV4 SUB R0,@SP ; GET DISPLACEMENT FROM "BASE" TO "ISR" CMP @SP,#20000 ; .GT. 4K WORDS? BHIS 90$ ; Y - ILLEGAL, JUMP4 MOV (R3)+,-(SP) ; GET ENB./DIS.INT. ROUTINE ADDRESS" BEQ 10$ ; NO SUCH ROUTINE - JUMP) SUB R0,@SP ; GET DISPLACEMENT FROM BASE6 BCS 90$ ; OUT OF RANGE - JUMPD CMP @SP,#20000 ; .GT. 4K WORDS? BHIS 90$ ; Y - ILLEGAL, JUMP# ADD R2,@SP ; MAKE APR 5 ADDRESSESE10$: ADD R2,2(SP) MOV R1,-(SP) ; SAVE APR 5 VALUE) MOV #X.LEN,R1 ; GET SIZE OF ITB IN BYTES  U .IF DF K$$DAS  MOV #$ICAVL-2,R0D. CALL $ALOC1 ; ALLOCATE ITB FROM ICB/ITB POOL  .IFF  D CALL $ALOCB ; ALLOCATE AN ITBP00Iccibjbkb a a a M .ENDC S BCS 80$ ; FAILURE - JUMP" MOV T.PCB(R5),R1 ; GET TASK'S PCB/ ADD #P.STAT,R1 ; POINT TO STATUS WORD (P.STAT)B* BIT #PS.CHK,@R1 ; CHECKPOINTING DISABLED? BNE 20$ ; Y - JUMP BIS #PS.CHK,@R1 ; N - DO IT0 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,@R1 ( 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) : MOV (SP)+,X.ISR-(R0) ; STORE ISR ADDRESS (X.ISR); CLR X.FORK+2-(R0) ; CLEAR FORK PC WORD (X.FORK+2)T7 MOV #$DQAC,(R0)+ ; STORE ADDRESS OF ROUTINE TO DEQUEUET ; AST BLOCK QUEUED BY $QASTC- TST (R0)+ ; STEP PAST AST QUEUE THREAD WORDS( 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)($ MOV @R3,(R0)+ ; AST ADDRESS (A.AST)4 MOV #1,(R0)+ ; NUMBER OF AST PARAMETERS = 1 (A.NPR)6 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 ITBD4 TST -(R1) ; BACK UP TO START OF ITB AND CLEAR CC-C0 CALLR $CLEDR ;CALL USER ENABLE/DISABLE ROUTINE ; R1 = POINTER TO ITB$ ; CC-C = 0 TO ENABLE INTERRUPTS,$ ; = 1 TO DISABLE INTERRUPTS;*;,; DIRECTIVE IS "DISCONNECT"L;T%40$: MOV @R4,R1 ; GET PC FROM VECTOR3) SUB #X.JSR,R1 ; GET START OF ITB (X.LNK)  MOV T.PCB(R5),R0 ; GET PCB11 BIT #PS.CHK,P.STAT(R0) ; CHECKPOINTING DISABLED?D( BEQ 100$ ; N - TASK HAS NO ITB'S, JUMP2 CALL $DISIN ; DISABLE INTERRUPTS, DEALLOCATE THE ; ITB ETCETERA7 BCS 100$ ; ERROR (TASK IS NOT OWNER OF VECTOR) - JUMPL DRSTS +1 ; EXIT WITH SUCCESS #60$: DRSTS D.RS19 ; ILLEGAL VECTORT*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 NOTS0 ; WITHIN RANGE (BASE&177700, BASE&177700+4K)(95$: DRSTS D.RS16 ; PRIVILEGE VIOLATION=100$: DRSTS D.RS8 ; DISCONNECT - TASK IS NOT OWNER OF VECTORB; ;P;+(; **-$DISIN-DISCONNECT INTERRUPT VECTOR.;T; INPUT:; R1 POINTER TO ITB0; R5 POINTER TO TASK TCB; ; OUTPUT:- ; IF SUCCESS:+; CC-C 0); THE FOLLOWING OPERATIONS ARE PERFORMED:G2; 1. THE ITB IS REMOVED FROM THE ITB LIST STARTING!; IN P.DPCB OF THE TASK'S PCB.C9; 2. IF A USER ROUTINE TO DISABLE INTERRUPTS WAS SUPPLIEDS=; WHEN THE VECTOR WAS CONNECTED TO, THAT ROUTINE IS CALLEDD"; IN KERNEL MODE WITH CC-C SET.F; 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.B; 5. IF THE AST BLOCK OF THE ITB IS IN THE AST QUEUE FOR THE TASK,; IT IS REMOVED.P7; 6. IF THIS WAS THE ONLY VECTOR CONNECTED TO THE TASK,E>; AND THE TASK IS CHECKPOINTABLE, CHECKPOINTING IS ENABLED.@; ALSO, UNLESS THE TASK IS MARKED FOR ABORT FOR MEMORY PARITY!; ERROR, SHUFFLING IS ENABLED.N%; 7. FINALLY, THE ITB IS DEALLOCATED.C; ); IF ERROR (TASK IS NOT OWNER OF VECTOR):O; CC-C 1; ; REGISTERS ALTERED: R0,R1,R2,R3;-;K; "$DISIN::MOV T.PCB(R5),R0 ; GET PCB0 ADD #P.DPCB,R0 ; POINT TO ITB LISTHEAD (P.DPCB)/ MOV 2(R0),-(SP) ; SAVE WORD FOLLOWING LISTHEADV$ CALL $QRMVA ; REMOVE FROM ITB LIST2 MOV (SP)+,2(R0) ; RESTORE WORD FOLLOWING LISTHEAD. BCS 130$ ; ITB NOT IN LIST - EXIT WITH ERROR, MOV R0,-(SP) ; SAVE POINTER TO ITB LISTHEAD SEC6 CALL $CLEDR ;CALL USER ROUTINE TO DISABLE INTERRUPTS ; WITH CC-C SETC- MOV X.VPC(R1),@X.VEC(R1) ; RESTORE VECTOR PCO, ADD #X.FORK,R1 ; POINT AT FORK BLOCK IN ITB# MOV #$FRKHD,R0 ; GET FORK LISTHEAD, MTPS #PR7 ; DISABLE INTERRUPTS6 CALL $QRMVA ;;; 00IcJcc__DATADATADATADATAREMOVE FROM FORK LIST IF IT IS THERE MTPS #0 ;;; ENABLE INTERRUPTSM1 ADD #X.AST-X.FORK,R1 ; POINT AT AST BLOCK IN ITBO MOV R5,R0' ADD #T.ASTL,R0 ; GET AST LIST LISTHEADI3 CALL $QRMVA ; REMOVE FROM AST LIST IF IT IS THERE $ SUB #X.AST,R1 ; RESTORE ITB POINTER# MOV R1,R0 ; GET ITB POINTER IN R0/ MOV (SP)+,R1 ; RESTORE POINTER TO ITB LISTHEAD ! TST (R1)+ ; ITB LIST NOW EMPTY?  BNE 120$ ; N - JUMPN ASSUME P.STAT,P.DPCB+4E TST (R1)+ ; POINT TO P.STAT 2 MOV T.ST2(R5),R2 ; Y - GET STATUS WORD 2 FROM TCB& BIT #T2.CHK,R2 ; TASK CHECKPOINTABLE? BNE 105$ ; N - JUMP#' BIC #PS.CHK,@R1 ; ENABLE CHECKPOINTINGT105$: ASSUME T2.ABO,100S" ROLB R2 ; TASK MARKED FOR ABORT? BPL 110$ ; N - JUMP < CMP T.EFLG(R5),#S.PRTY ; Y - IS REASON MEMORY PARITY ERROR?& BEQ 120$ ; Y - DON'T MAKE SHUFFLABLE(110$: BIC #PS.NSF,@R1 ; ENABLE SHUFFLING'120$: MOV #X.LEN,R1 ; GET LENGTH OF ITB  B .IF DF K$$DAS N MOV #$ICAVL-2,R3D, CALL $DEAC1 ; DEALLOCATE FROM ICB/ITB POOL 2 .IFF   CALL $DEACB ; DEALLOCATE ITB # .ENDC  CLC ; SUCCESS 130$: RETURN N .DSABL LSBC S .ENDC E L .ENDPOINTINGT105$: ASSUME T2.ABO,100S" ROLB R2 ; TASK MARKED FOR ABORT? BPL 110$ ; N - JUMP < CMP T.EFLG(R5),#S.PRTY ; Y - IS REASON MEMORY PARITY ERROR?& BEQ 120$ ; Y - DON'T MAKE SHUFFLABLE(110$: BIC #PS.NSF,@R1 ; ENABLE SHUFFLING'120$: MOV #X.LEN,R1 ; GET LENGTH OF ITB  B .IF DF K$$DAS N MOV #$ICAVL-2,R3D, CALL $DEAC1 ; DEALLOCATE FROM ICB/ITB POOL 2 .IFF   CALL $DEACB .TITLE QUEUE) .IDENT /10.01/$;S,; Copyright (c) 1995 by Mentec, Inc., U.S.A.; All rights reservedR; ;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;V; D. N. CUTLER 3-AUG-73 ;P!; MODIFIED FOR RSX-11M-PLUS V2.1:S;; B. S. MCCARTHYB;@$; MODIFIED FOR RSX-11M-PLUS V3.0 BY:;A; J. M. LAWLER; B. S. MCCARTHY; J. W. BERZLE;E; MODIFIED BY:;; J. W. BERZLE 23-OCT-85 10.00;N; JWB167 -- ADD $QRMVA ROUTINEU;; D. Carroll 18-Oct-1995 10.01:; DC404 - Include PSECT statement to allow ICB pool to be; fully extended by sysgen;H;U;R%; GENERAL QUEUE MANIPULATION ROUTINES ;Y; MACRO LIBRARY CALLS ;M# .MCALL PKTDF$,PCBDF$,CLKDF$,TCBDF$3+ PKTDF$ ;DEFINE CLI COMMAND BLOCK OFFSETS13 CLKDF$ ;DEFINE CLOCK QUEUE CONTROL BLOCK OFFSETSM, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS.. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;DC404;+!; **-$CLINS-CLOCK QUEUE INSERTION4;-G; THIS ROUTINE IS CALLED TO MAKE AN ENTRY IN THE CLOCK QUEUE. THE ENTRYyE; IS INSERTED SUCH THAT THE CLOCK QUEUE IS ORDERED IN ASCENDING TIME.I>; THUS THE FRONT ENTRIES ARE MOST IMMINENT AND THE BACK LEAST.; ; INPUTS: ;M1; R0=ADDRESS OF THE CLOCK QUEUE ENTRY CORE BLOCK.O#; R1=HIGH ORDER HALF OF DELTA TIME.N"; R2=LOW ORDER HALF OF DELTA TIME.; R4=REQUEST TYPE.5; R5=ADDRESS OF REQUESTING TCB OR REQUEST IDENTIFIER.E;E ; OUTPUTS:;@; THE CLOCK QUEUE ENTRY IS INSERTED IN THE CLOCK QUEUE ACCORDING$; TO THE TIME THAT IT WILL COME DUE.;T; NOTE:Q>; ON MULTIPROCESSOR SYSTEMS, A REQUEST WITH TYPE C.SYST!1000007; WILL BE EXECUTED ON A PRATICULAR UNIBUS RUN, WITH URMS<; SPECIFIED IN C.URM. TYPE C.CYST REQUESTS ON MP SYSTEMS ARE<; DEFAULTED TO RUN ON ANY UNIBUS RUN, WHICH IN PRACTICE WILL;; RESULT IN THE REQUEST EXECUTING ON THE CPU WHICH OWNS THEQ; CLOCK. ($CKURM)D;S>; A REQUEST WITH TYPE C.SCHD!100000 OR C.SSHT!100000 INDICATES?; THAT IT IS A SCHEDULE REQUEST WITH A DEFAULT NAMED DIRECTORY.;; THIS BIT IS SET IN THE DIRECTIVE CODE (E.G. DRMKT) AND INI=; TDSCH ON RESCHEDULE REQUESTS. C.NAM IS SET UP ACCORDINGLY. ;- .ENABL LSBC6$CLINS::CLR (R0)+ ;POINT TO TYPE FIELD AND CLEAR LINK MOVB R4,(R0)+ ;SET REQUEST TYPE INC R0 ;ADVANCE TO TCB ADDRESS, MOV R5,(R0)+ ;SET TCB OR REQUEST IDENTIFIER, ADD $ABTIM,R2 ;CALCULATE ABSOLUTE TIME WHEN ADC R1 ;REQUEST WILL COME DUE ) MOV R2,(R0)+ ;SET LOW ORDER PART OF TIMED*00Jccibjbkb a a a MOV R1,(R0) ;SET HIGH ORDER PART OF TIME/ MOV #$CLKHD,R2 ;POINT TO CLOCK QUEUE LIST HEADN/10$: MOV R2,R1 ;SAVE ADDRESS OF PREVIOUS ENTRY ( MOV (R1),R2 ;GET ADDRESS OF NEXT ENTRY BEQ 20$ ;IF EQ END OF LIST/ CMP (R0),C.TIM+2(R2) ;COMPARE HIGH ORDER TIMESL BHI 10$ ;IF HI NOT THIS ENTRYU BLO 20$ ;IF LO ENTRY GOES HERE. CMP -2(R0),C.TIM(R2) ;COMPARE LOW ORDER TIMES! BHIS 10$ ;IF HIS NOT THIS ENTRYB+20$: SUB #8.,R0 ;BACK UP TO FRONT OF BLOCK - MOV R0,(R1) ;SET NEW NEXT IN PREVIOUS ENTRYD$ MOV R2,(R0) ;SET NEXT IN NEW ENTRY .IF DF N$$DIR, CMPB #C.SCHD,R4 ;PERIODIC SCHEDULE REQUEST? BEQ 25$ ;IF EQ, YESF* CMPB #C.SSHT,R4 ;SINGLE SHOT TASK REQUEST BNE 27$ ;IF NE, NO025$: CLRB C.NAM(R0) ;INDICATE UIC IN CLOCK BLOCK2 TST R4 ;IS THERE A CONTEXT BLOCK INSTEAD OF UIC? BPL 27$ ;IF PL, NO6 INCB C.NAM(R0) ;INDICATE CONTEXT BLOCK IN CLOCK BLOCK27$: ;REFERENCE LABEL .ENDC ;DF N$$DIR04 CMPB #C.SYST,R4 ;A SYSTEM ROUTINE REQUEST (DRIVER)? BNE 30$ ;IF NE NOE5 MOV KINAR5,C.AR5(R0) ;SAVE KERNEL INSTR APR5 MAPPING. .IF DF M$$PRO* TST R4 ;IS THIS A URM SPECIFIC REQUEST ?' BMI 30$ ;IF EQ YES, LEAVE C.URM ALONEI1 MOV #177777,C.URM(R0) ;DEFAULT TO ANY UNIBUS RUNC .ENDC ; DF M$$PRO30$: RETURN ;K;+; **-$CLRMV-CLOCK QUEUE REMOVALS5; **-$CLRSM-CLOCK QUEUE REMOVAL - SELECTIVE MARK TIMED;TJ; THIS ROUTINE IS CALLED TO REMOVE ALL ENTRIES FOR A SPECIFIED TCB ADDRESSE; AND REQUEST TYPE FROM THE CLOCK QUEUE, OR SELECTIVELY BY EFN OR ASTI; ADDRESS IF ENTRY AT $CLRSM. ;V ; INPUTS:S;A*; R1=EFN NUMBER OR 0 (IF ENTRY AT $CLRSM).+; R2=AST ADDRESS OR 0 (IF ENTRY AT $CLRSM).I; R4=REQUEST TYPE.4; R5=ADDRESS OF REQUESTING TCB OR SYSTEM SUBROUTINE.;U ; OUTPUTS:;D?; ALL OF THE MATCHING ENTRIES FOR THE SPECIFIED TCB ADDRESS AREAB; REMOVED FROM THE CLOCK QUEUE. IF THE REQUEST TYPE IS NOT 'C.SYST4; THEN THE CLOCK QUEUE ENTRY CORE BLOCK IS RELEASED.;-4$CLRMV::CLR R1 ;MATCH ON ANY EVENT FLAG (MKTM ONLY). CLR R2 ;MATCH ON ANY AST ADDRESS (MKTM ONLY)6$CLRSM::MOV #$CLKHD,R0 ;POINT TO CLOCK QUEUE LIST HEAD/40$: MOV R0,R3 ;SAVE ADDRESS OF PREVIOUS ENTRYN( MOV (R3),R0 ;GET ADDRESS OF NEXT ENTRY BEQ 30$ ;IF EQ END OF LIST' CMPB R4,C.RQT(R0) ;REQUEST TYPE MATCH?  BNE 40$ ;IF NE NON: CMP R5,C.TCB(R0) ;TCB OR SYSTEM SUBROUTINE ADDRESS MATCH? BNE 40$ ;IF NE NOR TST R4 ;MARK TIME ENTRY? BNE 60$ ;IF NE NOE TSTB R1 ;EFN SPECIFIED?E BEQ 50$ ;IF EQ NO ! CMPB R1,C.EFN(R0) ;MATCH ON EFN?O" BEQ 55$ ;IF EQ YES, REMOVE ENTRY TST R2 ;AST ADDRESS SPECIFIED? BEQ 40$ ;IGNORE PACKET50$: TST R2 ;AST SPECIFIED? BEQ 55$ ;IF EQ NOI CMP R2,C.AST(R0) ;MATCH ON AST? BNE 40$ ;IF NE NOB#55$: MOV R2,-(SP) ;SAVE AST ADDRESSC MOV R1,-(SP) ;SAVE EVENT FLAG- MOV R3,-(SP) ;SAVE ADDRESS OF PREVIOUS ENTRY . MOV C.DST(R0),R3 ;GET EVENT FLAG MASK ADDRESS MOV T.PCB(R5),R4 ;GET TASK PCB? .IF DF X$$HDR6 MOV KISAR6,-(SP) ;SAVE MAPPING FOR POSSIBLE XTRNL HDR) MOV P.HDR(R4),-(SP) ;SAVE HEADER ADDRESS + BNE 57$ ;IF EQ HEADER IS RESIDENT IN POOLS- MOV P.REL(R4),KISAR6 ;MAP TO EXTERNAL HEADERT4 MOV #140000,(SP) ;REPLACE VIRTUAL ADDRESS OF HEADER057$: MOV (SP)+,R4 ;GET VIRTUAL ADDRESS OF HEADER .IFF ; DF X$$HDRS MOV P.HDR(R4),R4 ;GET HEADERV .IFTF ; DF X$$HDR .IF DF G$$GEF' CALL $DEAGF ;DEACCESS IF GROUP GLOBALT .ENDC ; DF G$$GEF .IFT ; DF X$$HDRS+ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGS .ENDC ; DF X$$HDR0 MOV (SP)+,R3 ;RESTORE ADDRESS OF PREVIOUS ENTRY! MOV (SP)+,R1 ;RESTORE EVENT FLAGS" MOV (SP)+,R2 ;RESTORE AST ADDRESS3 MOV (R3),R0 ;RESTORE ADDRESS OF CURRENT CLOCK BLKE& CLR R4 ;RESTORE CURRENT REQUEST TYPE*60$: MOV (R0),(R3) ;REMOVE ENTRY FROM LIST3 CMPB #C.SYST,C.RQT(R0) ;SYSTEM SUBROUTINE REQUEST?. BEQ 40$ ;IF EQ YES CONTINUE$' MOV R2,-(SP) ;SAVE NECESSARY REGISTERSG MOV R1,-(SP) ;;5 CALL $DCLKA ;DEALLOCATE CORE (MAY HAVE ACNTING UAB) & MOV (SP)+,R1 ;RESTORE SAVED REGISTERS MOV (SP)+,R2 ;( BR $CLRSM ;GO AGAINS .DSABL LSBE;+1; **-$QINSF-QUEUE INSERTION AT END OF LIST00Jccc__DATADATADATADATA (FIFO)R;OA; THIS ROUTINE IS CALLED TO MAKE AN ENTRY IN A FIRST IN FIRST OUTE3; LIST. THE ENTRY IS LINKED TO THE END OF THE LIST.0;R ; INPUTS:E;Y&; R0=ADDRESS OF THE TWO WORD LISTHEAD.); R1=ADDRESS OF THE ENTRY TO BE INSERTED.Y;C ; OUTPUTS:;R.; THE ENTRY IS LINKED TO THE END OF THE QUEUE.;;&; R0 AND R1 ARE PRESERVED ACROSS CALL.;- .ENABL LSBM7$QINSF::MOV 2(R0),R2 ;GET ADDRESS OF LAST ENTRY IN LISTB BR 20$ ;FINISH IN COMMON CODEE;+'; **-$QINSP-QUEUE INSERTION BY PRIORITYI;(A; THIS ROUTINE IS CALLED TO INSERT AN ENTRY IN A PRIORITY ORDERED ?; LIST. THE LIST IS SEARCHED UNTIL AN ENTRY IS FOUND THAT HAS A;; LOWER PRIORITY OR THE END OF THE LIST IS REACHED. THE NEW >; ENTRY IS THEN LINKED INTO THE LIST AT THE APPROPRIATE POINT.; ; INPUTS:N; &; R0=ADDRESS OF THE TWO WORD LISTHEAD.); R1=ADDRESS OF THE ENTRY TO BE INSERTED. ;M;Q ; OUTPUTS:;,0; THE ENTRY IS LINKED INTO THE LIST BY PRIORITY.;I&; R0 AND R1 ARE PRESERVED ACROSS CALL.;-,$QINSP::MOV R0,R3 ;COPY ADDRESS OF LISTHEAD.10$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT ENTRY( MOV (R2),R3 ;GET ADDRESS OF NEXT ENTRY BEQ 20$ ;IF EQ END 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 ; .DSABL LSB;+(; **-$QINSB-QUEUE INSERTION AT BEGINNING;Q@; THIS ROUTINE IS CALLED TO INSERT A QUEUE ENTRY INTO A QUEUE AT; THE BEGINNING.;T ; INPUTS:2;3&; R0=ADDRESS OF THE TWO WORD LISTHEAD.); R1=ADDRESS OF THE ENTRY TO BE INSERTED.3;N ; OUTPUTS:;O2; 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 POINTERU'5$: MOV R1,(R0) ;SET NEW FIRST POINTER+ RETURNI;+2; **-$QCNTP-QUEUE CONTROL PACKET TO CLI DISPATCHER;DB; THIS ROUTINE QUEUES SPECIAL PACKETS TO THE CLI DISPATCHER. THESE@; PACKETS CAN BE "BYE" COMMANDS BEING FORCED ON A TERMINAL LINE,D; OR A CONTROL PACKET WITH NO COMMAND TEXT SUCH AS A PROMPT REQUEST.;N ; INPUTS:E; >; R1=STATUS MASK FOR PACKET, OR ZERO TO GENERATE A BYE COMMAND;; R2=UCB ADDRESS OF TERMINAL COMMAND IS BEING GENERATED FORO;E ; OUTPUTS:;,2; C=0 PACKET WAS SUCCESSFULLY QUEUED TO DISPATCHER2; C=1 PACKET MAY NOT HAVE BEEN SUCCESSFULLY QUEUED9; Z=0 IF THERE WAS A POOL OR SEC POOL ALLOCATION FAILUREE9; Z=1 IF THE DISPATCHER WAS ALREADY ACTIVE (THIS WILL BEA4; THE NORMAL RETURN SINCE MCR... IS ALWAYS ACTIVE);R;-*$QCNTP::MOV KISAR6,-(SP) ;SAVE OLD MAPPING MOV R1,-(SP) ;SAVE STATUS WORD  MOV R2,-(SP) ;SAVE UCB ADDRESS - MOV #1,R1 ;NEED ONE BLOCK OF SECONDARY POOLS CALL $ALSEC ;ALLOCATE IT BCS 40$ ;IF CS, NO SEC POOL: MOV R0,KISAR6 ;MAP NEW BLOCKU< MOV #C.CTCB+140000,R2 ;POINT TO TCB FIELD IN SEC POOL BLOCK MOV $MCRPT,(R2)+ ;TCB ADDRESS MOV (SP)+,(R2)+ ;UCB ADDRESSO CLR (R2)+ ;NO TEXT# MOV (SP),(R2)+ ;INSERT STATUS WORDI( CLR (R2)+ ;INIT STARTING RETURN OFFSET/ MOV #433,(R2)+ ;SET TERMINATOR AND BLOCK COUNTA" TST (SP)+ ;IS THIS A BYE COMMAND BNE 20$ ;IF NE NOR5 MOV #3,@#C.CCT+140000 ;SET CHARACTER COUNT FOR "BYE" 6 BIS #CC.MCR,@#C.CSTS+140000 ;FORCE BYE COMMAND TO MCR MOV #"BY,(R2)+ ;MOVE IN "BYE" MOVB #'E,(R2)+ ;A"20$: MOVB #15,(R2)+ ;END WITH A CR BR QUEPKT ;GO TO COMMON CODE!40$: CMP (SP)+,(SP)+ ;CLEAN STACKE* COM (SP)+ ;SET C, CLEAR Z, AND POP STACK RETURN ;;+%; **-$QCPKT-QUEUE COMMAND LINE PACKET2<; **-$QCLNR-QUEUE COMMAND LINE PACKET WITH NO REQUEST OF CLI; ?; THESE ROUTINES QUEUE THE SECONDARY POOL COMMAND PACKET TO THEIA; APPROPRIATE CLI, AND OPTIONALLY REQUEST IT TO RUN. THEY COMMANDB8; PACKET IN SECONDARY POOL MUST BE COMPLETELY FILLED IN.;B;R ; INPUTS:N;YB; R1=COMMAND PACKET ADDRESS IN SECONDARY POOL (APR BIAS TO MAP IT); ; OUTPUTS:;OD; C=0 IF THE CLI WAS SUCCESSFULLY STARTED AFTER QU00Jdcibjbkb a a aEUEING THE COMMAND7; C=1 IF THE CLI MAY NOT HAVE BEEN SUCCESSFULLY STARTEDN+; Z=0 IF A POOL ALLOCATION FAILURE OCCUREDE$; Z=1 IF THE CLI WAS ALREADY ACTIVE;S>; NO STATUS IS RETURNED IF ENTRY WAS AT THE $QCLNR ENTRY POINT1; SINCE THE QUEUEING OPERATION ITSELF CANNOT FAILE;O;- .ENABL LSB ,$QCLNR::CLR R2 ;FLAG TO INDICATE NO REQUEST BR 10$ ;$QCPKT::MOV SP,R2 ;NON ZERO+10$: MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGI! MOV R1,KISAR6 ;MAP COMMAND BLOCKE1QUEPKT: MOV (SP)+,R3 ;GET ORIGINAL KISAR6 MAPPINGM< MOV @#C.CTCB+140000,-(SP) ;GET TCB ADDRESS TO REQUEST LATER! MOV (SP),-(SP) ;COPY TCB ADDRESSR TST R2 ;WILL CLI BE REQUESTED  BNE 15$ ;IF NE YES CLR 2(SP) ;DO NOT REQUEST CLIS,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 BLOCKO MOV KISAR6,R0 ;ADDRESS OF BLOCK MOV R3,KISAR6 ;RESTORE MAPPING  CMP (SP)+,(SP)+ ;CLEAN STACK)5 CALLR $DESEC ;DEALLOCATE PACKET AND FORGET ABOUT IT0)20$: MOV KISAR6,R1 ;GET ADDRESS OF PACKETM MOV R3,KISAR6 ;RESTORE MAPPING .IF DF V$$TRM MOV (R0),R2 ;GET DCB ADDRESS- CMP D.NAM(R2),#"VT ;IS IT A VIRTUAL TERMINALC BNE 30$ ;IF NE NOU0 CMP $MCRPT,(SP) ;IS COMMAND GOING TO DISPATCHER BNE 30$ ;IF NE NOI9 INCB U.OCNT(R0) ;INCREMENT USE COUNT OF VIRTUAL TERMINAL130$: .ENDC0 MOV #$CLICQ,R0 ;POINT TO COMMAND QUEUE LISTHEAD CALL $QSPIF ;INSERT IN QUEUE% MOV (SP)+,R0 ;GET TCB ADDRESS OF CLIE .IF DF A$$CLI+ CMP $MCRPT,R0 ;COMMAND GOING TO DISPATCHERS6 BEQ 40$ ;IF EQ YES, OPTIMIZE BY NOT CHECKING FOR AST7 CALL $DCAST ;DECLARE COMMAND ARRIVAL AST IF SPECIFIEDR! BCS 40$ ;IF CS, NO AST DECLARED/ CLR (SP) ;DO NOT REQUEST CLI SINCE IT GOT ASTD .ENDC ;A$$CLI140$: MOV (SP)+,R0 ;GET TCB ADDR OF CLI TO REQUESTS BEQ 50$ ;IF EQ, NO REQUEST CALLR $EXRQN ;REQUEST CLII50$: RETURN ;O .DSABL LSBI;+A; **-$QMCRL-QUEUE COMMAND LINE TO THE CLI OF A SPECIFIED TERMINAL B; **-$QMCR -QUEUE COMMAND LINE TO MCR REQARDLESS OF TERMINAL'S CLI/; **-$QCLIL-QUEUE COMMAND LINE TO SPECIFIED CLII;FD; THESE ROUTINES QUEUE COMMAND BUFFERS TO A CLI TASK FOR PROCESSING.<; THEY ONLY EXIST TO PROVIDE A COMPATABLE INTERFACE FOR CODEF; THAT HAS NOT BEEN CHANGED TO DEAL WITH THE NEW COMMAND PACKET FORMATE; AND THE USE OF SECONDARY POOL INSTEAD OF SYSTEM POOL. THEY PRESERVEUK; THE OLD INTERFACE BY ACCEPTING A STANDARD 84. BYTE PACKET IN SYSTEM POOL,E3; ALLOCATING SECONDARY POOL AND COPYING THE COMMANDUF; TEXT INTO IT. THE SYSTEM POOL IS DEALLOCATED, AND THE SECONDARY POOL:; PACKET USED INSTEAD. THIS ADDS CONSIDERABLE OVERHEAD, SO4; THESE ROUTINES SHOULD NOT BE USED BY ANY NEW CODE.;X ; INPUTS:I;A"; R0=CLI TCB ADDRESS ($QCLIL ONLY)-; R1=ADDRESS OF COMMAND PACKET IN SYSTEM POOLM;D ; OUTPUTS:;=; C=0 IF CLI WAS SUCCESSFULLY REQUESTED WITH THE COMMAND LINEE1; C=1 IF THE REQUEST MAY NOT HAVE BEEN SUCCESSFUL ?; Z=0 IF A SYSTEM OR SECONDARY POOL ALLOCATION FAILURE OCCURED ; Z=1 IF THE CLI ALREADY ACTIVE; ;- .ENABL LSBD($QMCRL::CLR -(SP) ;GO TO TERMINAL'S CLI BR 10$ ;'$QMCR:: MOV #CC.MCR,-(SP) ;FORCE TO MCR910$: MOV $MCRPT,-(SP) ;GIVE COMMAND TO COMMAND DISPATCHER BR 20$ ;2$QCLIL::CMP $MCRPT,R0 ;IS COMMAND INTENDED FOR MCR BEQ $QMCR ;IF EQ YES! CLR -(SP) ;GO TO TERMINAL'S CLI ! MOV R0,-(SP) ;TCB ADDRESS OF CLII520$: MOV 2(R1),-(SP) ;GET UCB ADDR OF SOURCE TERMINAL  BIT #1,(SP) ;PROMPT REQUEST??T BEQ 40$ ;IF EQ NOA MOV R1,R0 ;COPY PACKET ADDRESS! MOV #4,R1 ;GET LENGTH OF PACKET 30$: CALL $DEACB ;DEALLOCATE IT MOV (SP)+,R2 ;GET UCB ADDRESS BIC #1,R2 ;REMOVE ODD BIT  CMP (SP)+,(SP)+ ;CLEAN STACK,# MOV #CC.PRM,R1 ;SET PROMPT REQUESTC1 JMP $QCNTP ;CONVERT IT TO PROMPT REQUEST PACKET )40$: MOV R1,-(SP) ;SAVE ADDRESS OF PACKETCC MOV #/100,R1 ;GET NUMBER OF BLOCKS OF SEC POOL& CALL $ALSEC ;ALLOCATE SECONDARY POOL BCC 50$ ;IF CC, SUCCESS)0 MOV (SP)+,R0 ;GET ADDRESS OF SYSTEM POOL PACKET- MOV #M$$CRB,R1 ;LENGT00Jdcc__DATADATADATADATAH OF SYSTEM POOL PACKETN2 BR 30$ ;ISSUE A PROMPT FOR LACK OF ANYTHING ELSE(50$: MOV KISAR6,R3 ;SAVE CURRENT MAPPING( MOV R0,KISAR6 ;MAP SECONDARY POOL BLOCK. 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 ADDRESS ! CLR (R2)+ ;INIT CHARACTER COUNTC MOV (SP)+,(R2)+ ;STATUS BITSC) CLR (R2)+ ;INIT STARTING OFFSET OF TEXTA INC R2 ;SKIP TERMINATOR FIELDV0 MOVB R1,(R2)+ ;INSERT NUMBER OF SEC POOL BLOCKS4 MOV R0,-(SP) ;PUT SYSTEM POOL ADDRESS BACK ON STACK/ CMP (R0)+,(R0)+ ;POINT TO COMMAND TEXT IN POOL;460$: MOVB (R0)+,(R2) ;COPY A CHARACTER INTO SEC POOL' CMPB #15,(R2) ;IS IT A CARRIAGE RETURN2 BEQ 70$ ;IF EQ YES CMPB #33,(R2) ;IS IT AN ESCAPE+ BEQ 70$ ;IF EQ YES INC R2 ;ADVANCE POINTERC( INC @#C.CCT+140000 ;COUNT THE CHARACTER BR 60$ ;NEXT CHARACTER-70$: MOVB (R2),@#C.CTR+140000 ;SET TERMINATORF& MOVB #15,(R2) ;FORCE A CR TO END TEXT) MOV (SP)+,R0 ;GET ADDRESS OF POOL PACKET  MOV #M$$CRB,R1 ;LENGTHT) MOV R3,-(SP) ;SAVE ORIGINAL KISAR6 VALUE0 CALL $DEACB ;DEALLOCATE IT1 MOV SP,R2 ;INSURE NON-ZERO TO FORCE CLI REQUESTI JMP QUEPKT ;GO TO COMMON CODEI .DSABL LSBR;+>; **-$SCMDQ-SEARCH COMMAND QUEUE FOR BUFFER FOR SPECIFIED TASK6; **-$SRCCQ-SEARCH QUEUE FOR BUFFER FOR SPECIFIED TASK=; **-$SRUCB-SEARCH QUEUE FOR BUFFER FROM A SPECIFIED TERMINALVG; **-$SRCQ1-SEARCH QUEUE FROM MIDDLE FOR PACKET WITH SPECIFIED TCB ADDR G; **-$SRUC1-SEARCH QUEUE FROM MIDDLE FOR PACKET WITH SPECIFIED UCB ADDRT;MG; THESE ROUTINES SEARCH A QUEUE IN SECONDARY POOL FOR SPECIFIC PACKETS.MB; THEY ARE MAINLY INTENDED FOR USE ON THE QUEUE CONTAINING COMMANDB; PACKETS, THAT HAVE A TCB ADDRESS AT OFFSET 2, AND A TERMINAL UCBG; ADDRESS AT OFFSET 4. THE LISTHEAD MUST BE IN EXEC SPACE IF THE SEARCHP?; STARTS THERE. THE $SRCQ1 AND $SRUC1 ROUTINES START THE SEARCHDD; AT ANY PACKET IN THE QUEUE. THIS PACKET DOES NOT HAVE TO BE MAPPEDC; WHEN THE ROUTINE IS CALLED. NOTE THAT FOR ANY ROUTINE, THE PACKETS ; WILL NOT BE DEQUEUED IF FOUND.;N ; INPUTS: /; R0=LISTHEAD ADDRESS (FOR $SRCCQ, $SRUCB ONLY) E; R0=APR VALUE TO MAP PACKET TO START SEARCH AT ($SRCQ1, $SRUC1 ONLY)K#; R5=TCB OR UCB ADDRESS TO LOOK FORT; ; OUTPUTS:;U3; C=1 IF THERE IS NO ENTRY IN THE LIST THAT MATCHESE; C=0 IF THE ENTRY IS FOUNDR$; R0=ADDRESS OF BUFFER THAT MATCHES;S;- ASSUME C.CTCB,2 ASSUME C.CUCB,4 .ENABL LSBE4$SRUCB::MOV (R0),R0 ;POINT TO FIRST ELEMENT IN LIST7$SRUC1::MOV #4,R1 ;GET OFFSET TO UCB ADDRESS IN PACKETB BR 10$ ;GO TO COMMON CODEN7$SCMDQ::MOV #$CLICQ,R0 ;POINT TO COMMAND QUEUE LISTHEAD4$SRCCQ::MOV (R0),R0 ;POINT TO FIRST ELEMENT IN LIST7$SRCQ1::MOV #2,R1 ;GET OFFSET TO TCB ADDRESS IN PACKET +10$: MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGI MOV R0,KISAR6 ;MAP FIRST ENTRYF BEQ 40$ ;IF EQ, LIST IS EMPTYS)20$: CMP R5,140000(R1) ;IS THIS THE ENTRY  BEQ 50$ ;IF EQ YES$ MOV @#140000,KISAR6 ;MAP NEXT BLOCK BNE 20$ ;IF NE, MORE IN LIST40$: SEC ;NOT FOUND (50$: MOV KISAR6,R0 ;GET ADDRESS OF ENTRY" MOV (SP)+,KISAR6 ;RESTORE MAPPING RETURNC .DSABL LSBO;+,; **-$QRMVF-QUEUE REMOVAL FROM FRONT OF LIST;R@; THIS ROUTINE IS CALLED TO REMOVE THE NEXT (FRONT) ENTRY FROM A@; LIST. THE LIST ORGANIZATION MAY BE EITHER FIFO OR BY PRIORITY.;A ; INPUTS:S;N&; R0=ADDRESS OF THE TWO WORD LISTHEAD.;: ; OUTPUTS:;R*; C=1 IF THERE ARE NO ENTRIES IN THE LIST.1; C=0 IF THE NEXT ENTRY IS REMOVED FROM THE LIST.I#; R1=ADDRESS OF THE ENTRY REMOVED.O; ; R0 IS PRESERVED ACROSS CALL.;- .ENABL LSBP,$QRMVF::MOV R0,R2 ;COPY ADDRESS OF LISTHEAD( MOV (R2),R3 ;GET ADDRESS OF NEXT ENTRY" BNE 30$ ;IF NE LIST HAS AN ENTRY10$: SEC ;NO ENTRIES IN LIST RETURN ; ;+*; **-$QRMVA-QUEUE REMOVAL BY BLOCK ADDRESS;IB; THIS ROUTINE IS CALLED TO REMOVE A PARTICULAR BLOCK FROM A LIST.,; LIST ORGANIZATION MAY BE FIFO OR PRIORITY.;E ; INPUTS: ;T"; R0=ADDRESS OF TWO WORD LISTHEAD.&; R1=ADDRESS OF THE TCB TO SEARCH FOR.;T ; OUTPUTS:00Jdcibjbkb a a a;D@; C=1 IF THERE IS NO ENTRY IN THE LIST THAT MATCHES THE ADDRESS.3; C=0 IF A MATCHING ENTRY IS REMOVED FROM THE LIST. #; R1=ADDRESS OF THE ENTRY REMOVED. ; "; R0 IS PRESERVED ACROSS THE CALL.;-,$QRMVA::MOV R0,R3 ;COPY ADDRESS OF LISTHEAD.15$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT ENTRY) MOV (R2),R3 ;GET ADDRESS OF NEXT ENNTRYM BEQ 10$ ;IF EQ END OF LIST CMP R1,R3 ;ADDRESS MATCH ? BEQ 30$ ;IF EQ YES BR 15$ ;GO AGAIN;+(; **-$QRMVT-QUEUE REMOVAL BY TCB ADDRESS;TB; THIS ROUTINE IS CALLED TO REMOVE THE NEXT ENTRY FROM A LIST THAT?; MATCHES A SPECIFIED TCB ADDRESS. THE LIST ORGANIZATION MAY BET; EITHER FIFO OR BY PRIORITY.R;VH; NOTE: IN ADDITION TO MATCHING R1 WITH THE ELEMENTS ON THE LIST, R1 IS<; ALSO CHECKED AGAINST OFFSET 4 IN EACH ELEMENT ON THE LIST.;EI; FOR EXAMPLE, R1 COULD BE SET TO A TCB AND THE LISTHEAD COULD POINT TO AIJ; LIST OF I/O PACKETS. THE PACKET THAT GETS DEQUEUED IS THE ONE WHERE THEB; TCB IN R1 MATCHES THE TCB IN THE I/O PACKET (I.TCB AT OFFSET 4).;AD; THE $DETRG ROUTINE ALSO USES THIS FEATURE WHEN REMOVING ATTACHMENTD; DESCRIPTORS. SEE $DETRG ROUTINE IN MODULE PLSUB FOR MORE DETAILS.;R ; INPUTS:E;I%; R0=ADDRESS OF THE TWO WORD LISTEAD.E&; R1=ADDRESS OF THE TCB TO SEARCH FOR.;N ; OUTPUTS:;ED; C=1 IF THERE IS NO ENTRY IN THE LIST THAT MATCHES THE TCB ADDRESS.3; C=0 IF A MATCHING ENTRY IS REMOVED FROM THE LIST.K#; R1=ADDRESS OF THE ENTRY REMOVED.S;E; R0 IS PRESERVED ACROSS CALL.;- ASSUME ,C.TCB ASSUME ,C.TCB ASSUME I.TCB,C.TCB,$QRMVT::MOV R0,R3 ;COPY ADDRESS OF LISTHEAD.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 NOR!30$: MOV (R3),(R2) ;CLOSE UP LISTR BNE 40$ ;IF NE NO NEW LAST& MOV R2,2(R0) ;SET ADDRESS OF NEW LAST-40$: MOV R3,R1 ;SET ADDRESS OF ENTRY REMOVEDP CLC ;SUCCESS RETURN ;B .DSABL LSBB;+:; **-$QSPIB-QUEUE INSERTION AT BEGINNING IN SECONDARY POOL;D?; THIS ROUTINE IS CALLED TO INSERT AN ENTRY INTO A QUEUE AT THEGI; BEGINNING. THE QUEUE MUST BE IN SECONDARY POOL, WITH A STANDARD 2 WORDO&; LISTHEAD IN THE SYSTEM POOL OR SYSCM;R ; INPUTS: ;T-; R0=ADDRESS OF 2 WORD LISTHEAD IN EXEC SPACEMF; 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;E ; OUTPUTS:;;0; THE ENTRY IS INSERTED IN THE LIST AT THE FRONT;I; ALL REGISTERS ARE PRESERVEDI;E;-$QSPIB:: .IF DF P$$OOL6 MOV (R0),-(SP) ;SAVE ADDRESS OF CURRENT FIRST IN LIST% MOV KISAR6,-(SP) ;SAVE APR 6 MAPPING,( MOV R1,KISAR6 ;MAP ENTRY TO BE INSERTED; MOV 2(SP),@#140000 ;LINK NEW ENTRY TO PREVIOUS FIRST ENTRY + MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING & TST (SP)+ ;WAS IT NEW LAST IN LIST ?& BNE 10$ ;IF NE, THIS IS NOT NEW LAST# MOV R1,2(R0) ;SET NEW LAST POINTERR(10$: MOV R1,(R0) ;SET NEW FIRST POINTER RETURNE;+1; **-$QSPIF-QUEUE INSERTION AT END OF LIST (FIFO)E;-A; THIS ROUTINE IS CALLED TO MAKE AN ENTRY IN A FIRST IN FIRST OUTF4; LIST. THE ENTRY IS LINKED TO THE END OF THE LIST.E; THE LIST MUST BE IN SECONDARY POOL, WITH A STANDARD 2 WORD LISTHEAD ; IN THE SYSTEM POOL OR SYSCM.;N ; INPUTS:(;+; R0=ADDRESS OF 2 WORD LISTHEAD E; R1=ADDRESS OF ENTRY TO BE INSERTED. THIS VALUE WILL BE PUT INTO AN ; APR TO MAP THE ENTRY.;N ; OUTPUTS:;R-; THE ENTRY IS LINKED TO THE END OF THE QUEUET;E; ALL REGISTERS ARE PRESERVEDT; ;- .IFTF$QSPIF:: .IFTR TST (R0) ;IS LIST EMPTYN BEQ $QSPIB ;IF EQ YESU MOV KISAR6,-(SP) ;SAVE MAPPINGT, MOV 2(R0),KISAR6 ;MAP TO LAST BLOCK IN LIST) MOV R1,@#140000 ;LINK NEW BLOCK AFTER ITH MOV R1,KISAR6 ;MAP TO NEW BLOCK* CLR @#140000 ;CLEAR LINK WORD TO END LIST+ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGE) MOV R1,2(R0) ;UPDATE END OF LIST POINTERA RETURN ;+,; **-$QSPRF-QUEUE REMOVAL FROM FRONT OF LIST;O@; TH00Jdcc__DATADATADATADATAIS ROUTINE IS CALLED TO REMOVE THE NEXT (FRONT) ENTRY FROM AB; LIST. THE LIST MUST BE IN SECONDARY POOL WITH A STANDARD 2 WORD"; LISTHEAD IN SYSTEM POOL OR SYSCM; ; INPUT:;T&; R0=ADDRESS OF LISTHEAD IN EXEC SPACE;I ; OUTPUTS:;4); C=1 IF THERE ARE NO ENTRIES IN THE LISTA; R1=0O1; C=0 IF THE NEXT ENTRY IS REMOVED FROM THE LIST.I;; R1=ADDRESS OF ENTRY REMOVED. THIS ADDRESS SHOULD BE PUT0; IN AN APR TO MAP THE ENTRY.R;R ; ALL OTHER REGISTERS PRESERVED;R;- .IFTF$QSPRF:: .IFTE SEC ;ASSUME EMPTY LIST 1 MOV (R0),R1 ;GET ADDRESS OF FIRST BLOCK IN LISTS 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 LISTF* MOV (SP),KISAR6 ;RESTORE PREVIOUS MAPPING- MOV (R0),(SP) ;SAVE ADDRESS OF FIRST IN LISTI# MOV R1,(R0) ;UNLINK FIRST ELEMENT ' BNE 10$ ;IF NE, THERE IS MORE IN LISTP) MOV R0,2(R0) ;UPDATE END OF LIST POINTERS210$: MOV (SP)+,R1 ;SET ADDRESS OF FIRST FOR RETURN CLC ;AN ELEMENT WAS REMOVED 20$: RETURN1;+4; **-$QSPIP-QUEUE INSERTION IN SEC. POOL BY PRIORITY;I9; THIS ROUTINE IS CALLED TO INSERT A SECONDARY POOL BLOCKA$; INTO A LIST BY ITS PRIORITY FIELD.;1 ; INPUTS:E;O#; R0=LISTHEAD ADDRESS IN EXEC SPACET+; R4=OFFSET INTO BLOCK OF LINKWORD + 140000D$; KISAR6 MAPS THE BLOCK TO BE QUEUED;L ; OUTPUTS:;N; NONE.1; ; R0-R3 ARE DESTROYED.L;-0$QSPIP::MOV KISAR6,-(SP) ;SAVE BIAS OF NEW ENTRY4 MOVB 140000+T.PRI,-(SP) ;SAVE PRIORITY OF NEW ENTRY%10$: MOV R0,R2 ;SAVE ADDRESS OF LAST MOV R1,R3 ;SAVE BIAS OF LAST( MOV R4,R0 ;GET VIRTUAL ADDRESS OF NEXT MOV (R2),R1 ;GET BIAS OF NEXTA BEQ 20$ ;IF EQ END OF LIST! MOV R1,KISAR6 ;MAP TO NEXT BLOCKS& CMPB 140000+T.PRI,(SP) ;BELONG HERE ? BHIS 10$ ;IF HIS NOB)20$: TST (SP)+ ;DUMP PRIORITY FROM STACKH# MOV R3,KISAR6 ;REMAP TO LAST ENTRY! MOV (SP),(R2) ;LINK TO NEW ENTRYR& MOV (SP)+,KISAR6 ;RE-MAP TO NEW ENTRY! MOV R1,(R4) ;STUFF LINK POINTER0 RETURN ;;;+&; **-$GTSPK-GET SECONDARY POOL PACKET.;DC; THIS ROUTINE IS CALLED TO DEQUEUE A SPECIFIC PACKET FROM A QUEUE.U;A ; INPUTS:E;'; R0=ADDRESS OF LISTHEAD IN EXEC SPACE.$"; R1=APR VALUE FOR DESIRED PACKET.;A ; OUTPUTS:;S#; C=1 IF NO PACKET CAN BE DEQUEUED.E,; C=0 IF A PACKET WAS SUCCESSFULLY DEQUEUED.;; R1=ADDRESS OF THE ENTRY REMOVED. THIS ADDRESS SHOULD BE2; PUT IN AN APR TO MAP THE ENTRY.; ;-+$GTSPK::MOV R0,-(SP) ;SAVE LISTHEAD ADDRESSN MOV R2,-(SP) ;SAVE R2$ MOV KISAR5,-(SP) ;SAVE KERNEL APR 5$ MOV KISAR6,-(SP) ;SAVE KERNEL APR 6#10$: SEC ;ASSUME PACKET NOT FOUNDE1 MOV (R0),R2 ;GET ADDRESS OF NEXT PACKET IN LIST  BEQ 100$ ;IF EQ END OF LISTR, MOV KISAR5,KISAR6 ;SAVE POINTER TO PREVIOUS1 MOV R2,KISAR5 ;MAP THE NEXT PACKET THROUGH APR 5 ( CMP R1,R2 ;IS THIS THE DESIRED PACKET? BEQ 50$ ;IF EQ YES- MOV #120000,R0 ;POINT TO LINK WORD IN PACKET  BR 10$ ;GET NEXT PACKET 150$: CMP R0,6(SP) ;IS THIS THE FIRST IN THE LIST?N BNE 60$ ;IF NE NO MOV (SP)+,KISAR6 ;RESTORE APR 6! CALL $QSPRF ;DEQUEUE THE PACKETN BR 110$ ;:)60$: MOV (R0),@#140000 ;UNLINK THE PACKET,! BNE 90$ ;IF NE NOT LAST IN LISTL# MOV 6(SP),R0 ;GET LISTHEAD ADDRESS) MOV KISAR6,R2 ;COPY LAST IN LIST ADDRESSS* MOV (SP),KISAR6 ;RESTORE PREVIOUS MAPPING* MOV R2,2(R0) ;UPDATE LAST IN LIST POINTER90$: CLC ;INDICATE SUCCESS%100$: MOV (SP)+,KISAR6 ;RESTORE APR 6P%110$: MOV (SP)+,KISAR5 ;RESTORE APR 5: MOV (SP)+,R2 ;RESTORE R2F' MOV (SP)+,R0 ;RESTORE LISTHEAD ADDRESS RETURN ;S .ENDC .ENDCALL $QSPRF ;DEQUEUE THE PACKETN BR 110$ ;:)60$: MOV (R0),@#140000 ;UNLINK THE PACKET,! BNE 90$ ;IF NE NOT LAST IN LISTL# MOV 6(SP),R0 ;GET LISTHEAD ADDRESS) MOV KISAR6,R2 ;COPY LAST IN LIST ADDRESSS* MOV (SP),KISAR6 ;RESTORE PREVIOUS MAPPING* MOV R2,2(R0) ;UPDATE LAST IN LIST POINTER90$: CLC ;INDICATE SUCCESS%100$: MOV (SP)+,KISAR6 ;RESTORE APR 6P%110$: MOV (SP)+,KISAR5 ;RESTORE APR 5: MOV (SP)+,R2 ;RESTORE R2F' MOV (SP)+,R0 ;RESTORE LISTHEAD ADDRESS 00&dL-dibjbkb a a a************** ;.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 ! 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 ; * .TITLE DRFEAD .IDENT /01.03/D;.1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A..; All rights reserved ;.;DA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED3A; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE A; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS A; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORRA; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND61; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED..;LA; 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. M. MARTIN 16-JUL-82;A$; MODIFIED FOR RSX-11M-PLUS V3.0 BY:;T; B. S. MCCARTHY;T-; MODIFIED FOR RSX-11M-PLUS V3.0 UPDATE B BY:O;T; B. S. MCCARTHY 9-JUL-86 01.02F;R$; BM371 - FIX MAJOR MINDSET PROBLEM;M ; B. S. MCCARTHY 28-JUL-86 01.03;O-; BM372 - FIX MINOR MINDSET PROBLEM IN BM371N;U;+'; **-$DRFEA-TEST FEATURE MASK DIRECTIVE ;PC; THIS DIRECTIVE WILL TEST FOR THE PRESENCE OF A SPECIFIED FEATURE.A;I ; DPB FORMAT:O;A ; WD 00. -- DIC=177 , DPB SIZE=2; WD 01. -- FEATURE TO TESTA;N ; INPUTS:;2; R2=ADDRESS OF SECOND STATUS WORD OF CURRENT TASK!; R3=POINTER TO WORD 1 IN THE DPBP.; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK+; R5=ADDRESS OF THE TCB OF THE CURRENT TASKT;O ; OUTPUTS:;S.; C=0 IF DIRECTIVE WAS SUCCESSFULLY COMPLETED.9; DIRECTIVE STATUS OF IS.SET 'D.RS22' IS RETURNED IF THEA*; CORRESPONDING FEATURE MASK BIT IS SET.9; DIRECTIVE STATUS OF IS.CLR 'D.RS00' IS RETURNED IF THEP.; CORRESPONDING FEATURE MASK BIT IS NOT SET.; 3; IF A FEATURE VALUE IS SPECIFIED FOR WHICH THEREA4; IS NO FEATURE MASK WORD IS.CLR IS RETURNED WHICH5; PRESUMABLY WOULD INDICATE THAT THE SUPPORT IS NOTO ; PRESENT.;- .IF DF R$$FEA$DRFEA::3 MOV00L1dM7dc__DATADATADATADATA #$FMASK,R0 ;ASSUME TEST ON SYSTEM FEATURE MASKI, ;WORDS AS OPPOSED TO THE HARWARE FEATURE ;MASK WORDS.& MOV (R3),R1 ;GET FEATURE TO TEST FOR2 MOV #$FMEND-$FMASK,R3 ;GET # OF SYSTEM MASK WORDS# TST R1 ;WAS IT A HARWARE FEATURE?P1 BPL 10$ ;IF PL NOT A HARDWARE FEATURE MASK TEST 5 MOV #$HFMSK,R0 ;POINT TO HARDWARE FEATURE MASK WORDS4 MOV #$HFEND-$HFMSK,R3 ;GET # OF HARDWARE MASK WORDS. NEG R1 ;NEGATE SPECIFIED FEATURE TO TEST FOR.10$: DEC R1 ;NORMALIZE BIT VALUE TO BASE OF 0/ MOV R1,R2 ;SAVE FOR OFFSET COMPUTATIONS LATERA5 BIC #^C<17>,R1 ;MASK OFF ALL BUT BIT IDENTIFIER BITSE% ASL R1 ;CONVERT IT TO A WORD OFFSETF' MOV $BTMSK(R1),R1 ;GET BIT TO TEST FOR34 ASH #-4,R2 ;COMPUTE OFFSET TO FEATURE WORD TO TEST ASL R2 ;( CMP R2,R3 ;BEYOND LIMIT OF MASK WORDS?0 BHI 40$ ;IF HI YES, ASSUME SUPPORT NOT PRESENT1 ADD R2,R0 ;FORM ADDRESS OF FEATURE WORD TO TESTH! BIT R1,(R0) ;IS FEATURE PRESENTE BEQ 40$ ;IF EQ, NO DRSTS D.RS22 ;RETURN IS.SETZ!40$: DRSTS D.RS00 ;RETURN IS.CLR2 .ENDC ;R$$FEA;+'; **-$DRTFE-TEST TASK FEATURE DIRECTIVE ; H; THIS DIRECTIVE WILL TEST FOR THE PRESENCE OF A SPECIFIED TASK FEATURE.;(F; (AT THE MOMENT, THIS DIRECTIVE CAN ONLY CHECK BITS IN T.STS -> T.ST4C; OF THE TCB. THE DIRECTIVE COULD BE EXPANDED TO CHECK OTHER BINARYIH; TASK FEATURES, SUCH AS PRESENCE OR ABSENCE OF A PARTICULARS AST, ETC.);A ; DPB FORMAT:S; ; WD 00. -- DIC=209., DPB SIZE=2; WD 01. -- FEATURE TO TESTS;R ; INPUTS:N;.2; R2=ADDRESS OF SECOND STATUS WORD OF CURRENT TASK!; R3=POINTER TO WORD 1 IN THE DPB .; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK+; R5=ADDRESS OF THE TCB OF THE CURRENT TASKR; ; OUTPUTS:;O.; C=0 IF DIRECTIVE WAS SUCCESSFULLY COMPLETED.9; DIRECTIVE STATUS OF IS.SET 'D.RS22' IS RETURNED IF THEO*; CORRESPONDING FEATURE MASK BIT IS SET.9; DIRECTIVE STATUS OF IS.CLR 'D.RS00' IS RETURNED IF THEP.; CORRESPONDING FEATURE MASK BIT IS NOT SET.; 3; IF A FEATURE VALUE IS SPECIFIED FOR WHICH THEREA4; IS NO FEATURE MASK WORD IS.CLR IS RETURNED WHICH5; PRESUMABLY WOULD INDICATE THAT THE SUPPORT IS NOTO ; PRESENT.;- .IF DF R$$FEA-$DRTFE::MOV (R3),R1 ;GET FEATURE TO TEST FOR.10$: DEC R1 ;NORMALIZE BIT VALUE TO BASE OF 0/ MOV R1,R0 ;SAVE FOR OFFSET COMPUTATIONS LATERD5 BIC #^C<17>,R1 ;MASK OFF ALL BUT BIT IDENTIFIER BITS % ASL R1 ;CONVERT IT TO A WORD OFFSET ' MOV $BTMSK(R1),R1 ;GET BIT TO TEST FORR4 ASH #-4,R0 ;COMPUTE OFFSET TO FEATURE WORD TO TEST ASL R0 ;4 CMP R0,#T.ST3-T.ST2 ;BEYOND FIRST THREE MASK WORDS?& BLOS 35$ ;IF LOS NO, OFFSET OK AS IS0 CMP R0,#T.ST3+2-T.ST2 ;BEYOND FOURTH MASK WORD?0 BHI 40$ ;IF HI YES, ASSUME SUPPORT NOT PRESENT4 ADD #T.ST4-,R0 ;ADJUST TO SECOND MASK WORD535$: ADD R0,R2 ;FORM ADDRESS OF FEATURE WORD TO TESTA! BIT R1,(R2) ;IS FEATURE PRESENT  BEQ 40$ ;IF EQ, NO DRSTS D.RS22 ;RETURN IS.SETO!40$: DRSTS D.RS00 ;RETURN IS.CLR  .ENDC ;R$$FEA .ENDR ;COMPUTE OFFSET TO FEATURE WORD TO TEST ASL R0 ;4 CMP R0,#T.ST3-T.ST2 ;BEYOND FIRST THREE MAS .TITLE ERSUBR .IDENT /02.10/R;I,; Copyright (c) 1995 by Mentec, Inc., U.S.A.; All rights reservedC;B;K<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;O;H; P. J. BEZEREDI 16-NOV-81;M;R;;; J. R. KAUFFMAN ; C. PUTNAM+ ; S. C. ADAMSG; G. MARIGOWDA;R; ; MODIFIED BY:;; G. MARIGOWDA 14-JUL-86<; CHANGE THE STACK OFFSET TO ACCESS APR5 MAPPING V02.06;T; D. Carroll 16-Jan-1996 02.10<; DC430 - Don't zero X.CYLC except on seek optimized devices; ;t; ; ERROR LOGGING SUBROUTINESs;e;B; MACRO LIBRARY CALLSS;R8 .MCALL CLKDF$,EPKDF$,F11DF$,HDRDF$,HWDDF$,PKTDF$,UCBDF$ .MCALL BGCK$A% CLKDF$ ;DEFINE CLOCK QUEUE OFFSETS & EPKDF$ ;DEFINE ERROR PACKET OFFSETS" F11DF$ ;DEFINE FILES-11 OFFSETS% HDRDF$ ;DEFINE TASK HEADER OFFSETSI HWDDF$ ;DEFINE CPU REGISTERS-$ PKTDF$ ;DEFINE I/O PACKET OFFSETS UCBDF$ ;DEFINE UCB OFFSETS; ; EQUATED SYMBOLS9; 00M9d-dibjbkb a a aERRTIM= H$$RTZ*2 ;2 SECONDSIOC= X.IOC+140000 ;I/O COUNTv&ERHL= X.ERHL+140000 ;HARD ERROR LIMIT&ERSL= X.ERSL+140000 ;SOFT ERROR LIMIT&ERSC= X.ERSC+140000 ;SOFT ERROR COUNT&ERHC= X.ERHC+140000 ;HARD ERROR COUNT*ASSUME ERSC, IOC+6 ;ORDERING IS IMPORTANT/ASSUME X.WCNT, X.IOC+10 ;WORDS TRANSFERED COUNTF0ASSUME X.CYLC, X.IOC+14 ;CYLINDERS CROSSED COUNT-ASSUME V.PKSR, V.LABL+12. ;PACK SERIAL NUMBERP .IF DF E$$LOG;+; **-$DVER1-LOG A DEVICE ERROR;TD; THIS ROUTINE IS CALLED TO LOG A DEVICE ERROR. AN ERROR LOG PACKETC; WILL BE ALLOCATED AND THE CONTEXT OF THE CURRENT TRANSFER WILL BERG; SAVED. IF AN ERROR IS ALREADY IN PROGRESS FOR THIS DEVICE, THE ERRORUG; WILL BE IGNORED. INFORMATION CONCERNING ALL ACTIVE DEVICES WILL ALSO ; BE SAVED.;UF; THE ERROR CODE IS SETUP TO MARK THIS AS A HARD DEVICE ERROR. IF THED; OPERATION IS SUCCESSFUL, THE CODE WILL BE CHANGED TO A SOFT DEVICE-; ERROR WHEN THE I/O OPERATION IS TERMINATED. ;I ; INPUTS:T; :; 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;R ; OUTPUTS:;A<; IF THIS IS THE FIRST OCCURENCE OF THE ERROR, THE ERROR LOG;; PACKET IS FILED AND THE SCB IS SET TO POINT TO THE PACKETI/; ADDRESS AND THE ERROR IN PROGRESS BIT IS SET.E; $; NOTE: ALL REGISTERS ARE PRESERVED.;- .ENABL LSBO .IFTF ; DF E$$LOG$DVER1:: ;LOG DEVICE ERROR .IFT ; DF E$$LOGE MOV R0,-(SP) ;SAVE REGISTER6 MOV #E$CERR+<400*E$SDVH>,R0 ;GET THE HARD ERROR CODE% BR 10$ ;JOIN COMMON PROCESSING CODES .IFTF ; DF E$$LOG$DVTM2:: .IFT ; DF E$$LOG MOV R0,-(SP) ;SAVE REGISTER@ MOV #E$CERR+<400*E$STMO>,R0 ;SET UP THE ERROR LOG PACKET FOR... ;... A DEVICE TIMEOUT ERRORT(10$: CALL LOGTST ;CAN WE LOG THE ERROR? BCS 50$ ;IF CS NO MOV R1,-(SP) ;SAVE REGISTERSR MOV R2,-(SP) ;  MOV R3,-(SP) ;D; MOV #SM.HDR!SM.DID!SM.DOP!SM.DAT!SM.DAC,R2 ;SET FLAGS ...E) ;... HEADER SUBPACKET, DEVICE ID, ...E) ;... DEVICE OPERATION, DATA, ACTIVITYE8 MOVB S.RCNT(R4),R1 ;GET THE NUMBER OF REGISTERS TO SAVE+ ASL R1 ;CONVERT IT INTO A NUMBER OF BYTESV* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS/ BIT #KS.MBC,K.STS(R3) ;BAE REGISTERS PRESENT?  BEQ 30$ ;IF EQ NOU0 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 REGISTER#0 ADD 2(SP),R3 ;COMPUTE ACTUAL START OF REGISTERS;"; AT THIS POINT THE REGISTERS ARE:;.'; R0 = ENTRY TYPE CODE AND SUBTYPE CODEV*; R1 = LENGTH OF DEVICE REGISTERS IN BYTES; R2 = CONTROL MASK WORD,; R3 = BEGINNING ADDRESS OF DEVICE REGISTERS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;# MOV KISAR6,-(SP) ; SAVE MAPPING CALL $CRPK1 ;CREATE THE PACKET BCS 45$ ;IF CS FAILURE7 CMP R0,#E$CERR+<400*E$STMO> ;IS THIS A TIMEOUT ERROR?0 BNE 40$ ;IF NE NO 1 MOVB S.ROFF(R4),R2 ;GET OFFSET TO FIRST REGISTERR ASL R2 ;CONVERT IT TO BYTESS2 SUB R2,R1 ;COMPUTE ADDRESS TO STORE CSR CONTENTS5 MOV $DVSAV,(R1) ;PUT SAVED CSR CONTENTS IN SUBPACKET 840$: MOV R3,S.EMB(R4) ;SAVE THE ERROR LOG PACKET ADDRESS,45$: MOV (SP)+,KISAR6 ; RESTORE APR6 MAPPING! MOV (SP)+,R3 ; RESTORE REGISTERSS MOV (SP)+,R2 ;R MOV (SP)+,R1 ;P50$: MOV (SP)+,R0 ;C .ENDC ; DF E$$LOG3 BIS #S2.EIP,S.ST2(R4) ;INDICATE ERROR IN PROGRESSH CLC ;INDICATE NO UMD FUNCTION RETURN ;V .DSABL LSB ;+>; **-$LGER1-LOG AN ERROR LOG PACKET (NO ERROR NEED BE PRESENT);1D; THIS ROUTINE IS CALLED BY DRIVERS THAT WISH TO CREATE AN ERROR LOGE; PACKET WHEN NO ERROR IS PRESENT, I.E. FOR AN UNSOLICITED INTERRUPT.AF; THE PACKET WILL BE CREATED AND THE DRIVER IS RESPONSIBLE FOR FILLING$; IN THE NECESSARY DATA INFORMATION.; ; INPUTS:R;P); R1=LENGTH OF DATA TO BE LOGGED IN BYTESG8; R4=SCB ADDRESS (IF ZERO THEN NO I/O PACKET IS PRESENT); R5=UCB ADDRESS; ; OUTPUTS:;R.; C=1 IF ERROR CANNOT BE LOGGED FOR ANY REASON; C=0 IF ERROR CAN BE LOGGED.; R1=ADDRESS OF DATA AREA IN ERROR LOG PACKET!; R3=ADDRESS OF ERROR LOG PACKETE;R; R4 AND R00MAd7dc__DATADATADATADATA5 ARE PRESERVEDR; R0, R2 AND R3 ARE DESTROYEDC,; APR6 MAPPING DESTROYED: KISAR6 MAPS PACKET;- .IF DF E$$LOG*$LGER1::CALL LOGTST ;CAN WE LOG THE ERROR BCS 20$ ;IF CS NOU8 MOV #E$CDVI+<400*E$SDVI>,R0 ;ASSUME DEVICE INFORMATION0 MOV #SM.HDR!SM.DID!SM.DAT!SM.DAC,R2 ;SET FLAGS$ TST R4 ;DO WE HAVE AN SCB ADDRESS? BEQ 10$ ;IF EQ NON0 BIS #SM.DOP,R2 ;YES, LOG I/O PACKET INFORMATION- MOV #E$CERR+<400*E$SDVH>,R0 ;SET HARD ERRORO-10$: CLR R3 ;DO NOT FILL DATA SUBPACKET AREAR* 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 NOL0 MOV R3,S.EMB(R4) ;SAVE ERROR LOG PACKET ADDRESS. BIS #S2.EIP,S.ST2(R4) ;SET ERROR IN PROGRESS20$: RETURN ;A;+&; **-LOGTST-SEE IF WE CAN LOG AN ERROR;FB; THIS ROUTINE WILL CHECK TO SEE IF THE ERROR CANNOT BE LOGGED. IFA; LOGGING IS OFF, OR IF THERE IS ALREADY AN ERROR IN PROGRESS, OR$D; IF BOTH LIMITS HAVE BEEN REACHED, THE PACKET WILL BE REJECTED HEREE; INSTEAD OF LATER IN $FERL1 THE ERROR SEQUENCE NUMBER IS INCREMENTEDUA; IF LOGGING IS ON AND THERE IS NOT ALREADY AN ERROR IN PROGRESS.L;M ; INPUTS:(; "; R4=SCB ADDRESS OF ZERO IF NO SCB; R5=UCB ADDRESS;S ; OUTPUTS:;G(; C=0 IF ERROR CAN POTENTIALLY BE LOGGED; C=1 IF ERROR CANNOT BE LOGGED ;-+LOGTST: MOV KISAR6,-(SP) ;SAVE APR6 MAPPINGB0 BIT #ES.LOG,$ERFLA ;IS ERROR LOGGING TURNED ON? BEQ 20$ ;IF EQ NOR 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 LIMITING ENABLED? BEQ 10$ ;IF EQ NOU< MOV U.UCBX(R5),KISAR6 ;MAP UCB EXTENSION IN SECONDARY POOL BEQ 10$ ;IF EQ NO EXTENSIONE0 CMPB ERHC,ERHL ;IS THE HARD THRESHOLD EXCEEDED? BLO 10$ ;IF LO NO0 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 NOC+ CLR S.EMB(R4) ;INDICATE NO PACKET JUST YETS BR 30$ ; 20$: SEC ;CANNOT LOG THE ERROR+30$: MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPINGU RETURN ; .ENDC ; DF E$$LOG;+(; **-$FERL1-FINISH ERROR LOGGING PROCESS;BA; THIS ROUTINE IS CALLED AT I/O DONE TIME OR WHEN IT IS NECESSARYQ?; TO QUEUE AN ERROR LOG PACKET AFTER A SUCCESSFUL RECOVERY OF A; MID-TRANSFER ERROR.C; ; INPUTS:I; 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;B ; OUTPUTS:1; THE ERROR PACKET IS QUEUED TO THE ERROR LOGGER.R'; THE ERROR IN PROGRESS BIT IS CLEARED.;N; R1 AND R2 ARE DESTROYED.;-($FERL1:: ;FINISH ERROR LOGGING PROCESS .IF DF E$$LOG MOV KISAR6,-(SP) ; SAVE MAPPING MOV R3,-(SP) ;SAVE REGISTER TST R4 ;DO WE HAVE AN SCB?) BEQ 5$ ;IF EQ NO, R3 HAS PACKET ADDRESSN2 MOV S.EMB(R4),R3 ;GET ADDRESS OF ERROR LOG PACKET BEQ 40$ ;IF EQ NO PACKET5$: MOV R0,-(SP) ;SAVE REGISTER  MOV R3,KISAR6 ; MAP TO PACKET1 MOV @#140004+E$HSBF,R1 ; GET SUBPACKET MASK WORDT MOV R4,-(SP) ;SAVE R4, ROR R1 ;HEADER SUBPACKET IS ALWAYS PRESENT= MOV #E$HLEN+4,R4 ;ACCOUNT FOR THE LINK WORD, THE LENGTH WORDE' ;...AND THE HEADER SUBPACKET LENGTH( ROR R1 ;IS THE TASK SUBPACKET PRESENT? BCC 6$ ;IF CC - NOT PRESENT 6 ADD #E$TLEN,R4 ;ACCOUNT FOR THE TASK SUBPACKET LENGTH06$: ROR R1 ;IS THE DEVICE ID SUBPACKET PRESENT? BCC 7$ ;IF CC - NOT PRESENT ; ADD #E$ILEN,R4 ;ACCOUNT FOR THE DEVICE ID SUBPACKET LENGTHP77$: ROR R1 ;IS THE DEVICE OPERATION SUBPACKET PRESENT?W BCC 8$ ;IF CC - NOT PRESENTR1 ADD #E$ORTY,R4 ;GET TO THE "RETRY COUNTS" OFFSET$) ;...IN THE DEVICE OPERATION SUBPACKETE* ADD #140000,R4 ; POINT R4 TO RETRY COUNTS- MOV R2,(R4) ;...AND INSERT THE RETRY COUNTSN8$: MOV (SP)+,R4 ;RESTORE R4 TST R2 ;ANY RETRY COUNTS?T& BEQ 30$ ; IF EQ DO NOT UPDATE COUNTS< MOV U.UCBX(R5),KISAR6 ;MAP UCB EXTENSION IN SECONDARY POOL BEQ 30$ ;IF EQ NO EXTENSIONC( MOV #ERHC,R2 ;POINT TO HARD ERROR COUNT TSTB R0 ;SUCCESSFUL FUNCTION?I BMI 10$ ;IF MI NOW00MId-dibjbkb a a a( MOV #ERSC,R2 ;POINT TO SOFT ERROR COUNT10$:+ BITB #ES.LIM,$ERFLA ; IS LIMITING ENABLED?N7 BEQ 25$ ; IF EQ NO, DON'T TEST LIMITS OR UPDATE COUNT 8 CMPB (R2),-2(R2) ;IS THE THRESHOLD EQUALED OR EXCEEDED? BLO 15$ ;IF LO NO);4H; THE LIMIT (HARD OR SOFT) HAS ALREADY BEEN REACHED. DISCARD THE PACKET.;O MOV R3,KISAR6 ; REMAP PACKETM( MOV R3,R0 ; SET UP FOR DESEC (POINTER)' MOV @#140002, R1 ; GET LENGTH IN BYTESP: ADD #77+4,R1 ; ACCOUNT FOR LINK AND LENGTH AND TRUNCATION( ASH #-6,R1 ; CONVERT TO 32 WORD BLOCKS) CALL $DESEC ; DEALLOCATE SECONDARY POOL,$ BR 37$ ;...AND FINISH THE CLEAN UP; G; THE LIMIT (HARD OR SOFT) HAS NOT BEEN REACHED. UPDATE THE APPROPRIATE ; COUNTER.;E$15$: INCB (R2) ;COUNT ANOTHER ERROR+ INCB (R2) ;ADD ONE MORE FOR OVERFLOW TESTE BNE 20$ ;IF NE NO OVERFLOW" DECB (R2) ;NORMALIZE ERROR COUNT20$: DECB (R2) ;...# CMPB (R2), -2(R2) ; LIMIT REACHED?R BNE 25$ ; BR IF NO$ MOV R3, KISAR6 ; MAP BACK TO PACKET/ BISB #EH$LMR, E$HFLG+140004 ; YES. TELL ERRLOGT25$: CMP R2,#ERHC ; HARD ERROR?  BEQ 30$ ; BR IF YESO MOV R3,KISAR6 ; REMAP PACKET 0 CMPB #E$STMO,E$HTYS+140004 ;WAS THIS A TIMEOUT?2 BEQ 27$ ;IF EQ - YES, SO CONVERT TO SOFT TIMEOUT2 MOVB #E$SDVS, E$HTYS+140004 ; SET SOFT ERROR CODE BR 30$ ; GO TO QUEUE PACKETE927$: MOVB #E$STMS,E$HTYS+140004 ;MAKE THIS A SOFT TIMEOUTR30$:& CALL $QUPK1 ; QUEUE THE ERROR PACKET$37$: MOV (SP)+,R0 ;RESTORE REGISTERS40$: MOV (SP)+,R3 ; # MOV (SP)+,KISAR6 ; RESTORE MAPPINGE .ENDC ; DF E$$LOG TST R4 ;DO WE HAVE AN SCB? BEQ 50$ ;IF EQ NO 5 BIC #S2.EIP,S.ST2(R4) ;CLEAR ERROR IN PROGRESS FLAGS( CLR S.EMB(R4) ;SHOW NO ERROR LOG PACKET50$: RETURN ;Y;+#; **-$CRPK1-CREATE ERROR LOG PACKET,;HG; THIS ROUTINE IS CALLED TO CREATE AN ERROR LOG PACKET, EITHER FROM THEVG; SEND MESSAGE DIRECTIVE PROCESSING, OR WITHIN THE EXECUTIVE AS PART OF D; THE PROCESSING OF A MEMORY ERROR, NONSENSE INTERRUPT, TIME CHANGE,'; POWER FAIL RECOVERY, OR DEVICE ERROR. ;P ; INPUTS:N;;; R0=PACKET CODE; R1=LENGTH OF DATA SUBPACKETQ; R2=CONTROL MASK WORD1; R3=BEGINNING ADDRESS OF DATA FOR DATA SUBPACKETC%; R4=TCB ADDRESS (FOR TASK SUBPACKET)6; R5=UCB ADDRESS (FOR DEVICE IDENTIFICATION SUBPACKET);E ; OUTPUTS:;R; R0=UNCHANGED6; R1=BEGINNING ADDRESS OF DATA SUBPACKET DATA (OFFSET); R2=UNCHANGED,; R3=BEGINNING ADDRESS OF PACKET (APR VALUE); R4=UNCHANGED; R5=UNCHANGED;E; C=0 IF A PACKET WAS CREATEDC!; C=1 IF A PACKET WAS NOT CREATEDE; KISAR6 MAPS PACKET;S; OUTPUT PACKET FORMAT:;13; +-----------------------------------------------+ %; | RESERVED FOR PACKET LINK WORD |U3; +-----------------------------------------------+53; | PACKET LENGTH (LENGTH OF REMAINDER OF PACKET) |E3; +-----------------------------------------------+E; | HEADER SUBPACKET |O ; . .;C ; | |3; +-----------------------------------------------+G; | OTHER SUBPACKETS |= ; . .;A ; | |3; +-----------------------------------------------+K;- .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) ;...;-@; CHECK FOR TYPE OF SUBPACKET. NOTE THAT THERE WILL ALWAYS BE A?; HEADER SUBPACKET. AN EXTRA 4 BYTES IS ADDED TO THE LENGTH OFS>; 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 THERE5 BGCK$A BF.ERR,BE.HSP,FATAL ;HEADER SUBPACKET PROBLEM85$: 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 SUBPACKETW' BCC 20$ ;IF CC NO DEVICE ID SUBPACKET , ADD #E$ILEN,R1 ;ADD IN THE SUBPACKET LENGTH.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;E'; CHECK FOR A DEVICE ACTIVITY SUBPACKETP;EE; IF THERE IS A DEVICE ACTIVIT00MQd7dc__DATADATADATADATAY SUBPACKET, THERE WILL BE ONE ENTRY INRC; THE SUBPACKET FOR EACH ACTIVE DEVICE (LESS ONE IF THERE IS ALSO ATA; DEVICE OPERATION SUBPACKET) PLUS THE PREFIX HEADER LENGTH WORD. ; 330$: ROR R2 ;CHECK FOR A DEVICE ACTIVITY SUBPACKETU- BCC 60$ ;IF CC NO DEVICE ACTIVITY SUBPACKET : BIT #SM.DOP,4(SP) ;IS THERE A DEVICE OPERATION SUBPACKET? BNE 35$ ;IF EQ NOE 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 UCBP BCS 50$ ;IF CS NO MORE# MOV S.ST2(R4),R3 ;COPY STATUS BITST COM R3 ;REVERSE THEM5 BIT #S2.LOG!S2.ACT,R3 ;ACTIVE ERROR LOGGING DEVICE?E BNE 40$ ;IF NE NO  CMP R5,R0 ;IS THIS OUR UCB?C' BEQ 40$ ;IF EQ YES, IGNORE THIS ENTRY6# ADD #E$ALEN,R1 ;YES, COUNT THE I/OE BR 40$ ;LOOP050$: ADD #2,R1 ;ADD IN THE LENGTH OF THE PREFIX;$; CHECK FOR A DATA SUBPACKET; (60$: ROR R2 ;CHECK FOR A DATA SUBPACKET" BCC 70$ ;IF CC NO DATA SUBPACKET1 ADD 2(SP),R1 ;ADD IN THE LENGTH OF THE SUBPACKETB* ADD #2,R1 ;ADD IN THE PREFIX LENGTH WORD;T; ALLOCATE THE PACKETE;S570$: CMP #512.,R1 ;IS THE PACKET A REASONABLE LENGTH?I BLO 75$ ;IF LO NOE; &; CONVERT FROM BYTES TO 32 WORD BLOCKS;  MOV R1,-(SP) ; SAVE BYTE VALUEA( 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 IT775$: CALLR PKTXIT ;FAILURE, RESTORE REGISTERS AND EXIT)280$: MOV R0,-(SP) ;SAVE THE ADDRESS FOR FUTURE USE- MOV 14(SP),R5 ;RETRIEVE POSSIBLE UCB ADDRESSA;E; CREATE THE PACKETC;#; AT THIS POINT:;T9; 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;N5; AFTER SAVING THE APR6 MAPPING ON THE STACK WE HAVE:S;N2; 0(SP) SAVED APR6 MAPPING (WILL NOT BE RESTORED)*; 2(SP) SAVED APR BIAS OF ALLOCATED BLOCK; 4(SP) SAVED ENTRY CODES$; 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;;CREPKT:S+ MOV KISAR6,-(SP) ; SAVE APR6 ON THE STACK ;  MOV R0,KISAR6 ; MAP TO PACKET MOV #140000,R0 ; USE APR 6! CLR (R0)+ ; SETUP THE LINK WORDN/ SUB #4,R1 ;THE DATA LENGTH IS LESS THE HEADERW' MOV R1,(R0)+ ;PUT IN THE PACKET LENGTH / MOV #E$HLEN,(R0)+ ;PUT IN THE SUBPACKET LENGTHF/ MOV 10(SP),R2 ;GET THE SAVED CONTROL MASK WORD6+ MOV R2,(R0)+ ;INSERT IT INTO THE SUBPACKETV. MOV #6+,(R0)+ ;INSERT M-PLUS CODE/ MOV $SYSID,(R0)+ ;INSERT SYSTEM IDENTIFICATIONB MOV $SYSID+2,(R0)+ ;...;M>; INSERT THE FLAGS WORD, THE ENTRY AND ERROR SEQUENCE NUMBERS,;; AS WELL AS THE ENTRY CODE, TIME STAMP, PROCESSOR AND URM.E; : MOV #EH$NOR!<*400>,R3 ;CREATE FLAGS+ BIT #HF.QB,$HFMSK ;IS THIS A Q-BUS SYSTEM? BEQ 5$ ;IF EQ NO, SO GO ON. BIS #,R3;YES, SO SET THE FLAG BIT-5$: MOV R3,(R0)+ ;NOW PUT IT IN THE SUBPACKETI" INC $ENTSQ ;COUNT THE NEXT ENTRY MOV $ENTSQ,(R0)+ ;WRITE ITE2 MOV $ERRSQ,(R0)+ ;PUT IN THE ERROR SEQUENCE COUNT8 MOV 4(SP),(R0)+ ;PUT IN THE ENTRY TYPE CODE AND SUBCODE8 MOV #$TTNS-<6*2>,R3 ;GET THE POINTER TO THE SYSTEM TIME3 MOV #6,R1 ;GET THE NUMBER OF PARAMETERS TO INSERT#810$: MOVB (R3)+,(R0)+ ;INSERT THE ITEM IN THE TIME STAMP TSTB (R3)+ ;POINT AT NEXT ITEM SOB R1,10$ ;LOOP UNTIL DONE.4 MOVB $PRMOD,(R0)+ ;PUT IN THE PROCESSOR INFORMATION% CLRB (R0)+ ;CLEAR THE RESERVED BYTEP .IF DF M$$PRO% MOV @$CPURM,(R0)+ ;GET PROCESSOR URM  .IFF ; DF M$$PROS MOV #1,(R0)+ ;ASSUME CPAU .ENDC ; DF M$$PRO) ROR R2 ;DISCARD THE FLAG FOR THE HEADER;#; CREATE THE TASK SUBPACKETE;O;E; AT THIS POINT:;,2; R0=POINTER TO NEXT FREE ENTRY IN ALLOCATED BLOCK; R1=UNDEFINED'; R2=CONTROL MASK WORD, SHIFTED RIGHT 1 ; R3=UNDEFINED; R4=UNDEFINED; R5=UCB ADDRESS;D2CRETSK: ROR R2 ;CHECK THE FLAG FOR TASK SUBPACKET% BCC CREDID ;IF CC NO TASK SUBPACKETB/ MOV #E$TLEN,(00MYd-dibjbkb a a aR0)+ ;PUT IN THE SUBPACKET LENGTHE) MOV 14(SP),R1 ;GET THE SAVED TCB ADDRESSM( CALL CRTASP ;CREATE THE TASK SUBPACKET;,; CREATE THE DEVICE IDENTIFICATION SUBPACKET;; AT THIS POINT:; 2; 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;N0CREDID: ROR R2 ;IS THERE A DEVICE ID SUBPACKET? BCC CREDOP ;IF CC NO' MOV U.SCB(R5),R4 ;RETRIEVE SCB ADDRESSO6 MOV #E$ILEN,(R0)+ ;INSERT THE LENGTH OF THE SUBPACKET( CALL CRDEVP ;CREATE DEVICE INFORMATION3 BIT #DV.DIR,U.CW1(R5) ;IS THIS A DIRECTORY DEVICE?T' BEQ 5$ ;IF EQ NO, DON'T INTERPRET VCBN+ MOV U.VCB(R5),R3 ;GET A POINTER TO THE VCBI BNE 15$ ;IF NE VCB EXISTSL@5$: MOV #/2,R3 ;GET THE NUMBER OF WORDS TO CLEAR710$: CLR (R0)+ ;CLEAR OUT THE VOLUME NAME AND PACK ID.N& SOB R3,10$ ;LOOP UNTIL DONE CLEARING* BR 30$ ;DONE WITH THE VOLUME INFORMATION'15$: ADD #V.LABL,R3 ;POINT AT THE LABEL#< MOV #/2,R1 ;GET THE NUMBER OF WORDS TO MOVE620$: MOV (R3)+,(R0)+ ;TRANSFER VOLUME NAME AND PACK ID SOB R1,20$ ;LOOP UNTIL DONEQ( BIT #DV.SQD,U.CW1(R5) ;IS THIS A DISK? BEQ 30$ ;IF EQ YES2 CMP -(R0),-(R0) ;NO, BACKUP TO PACK SERIAL NUMBER% CLR (R0)+ ;CLEAR PACK SERIAL NUMBERU CLR (R0)+ ;...,30$: MOV #1,(R0)+ ;ALL DEVICES ARE OF TYPE 14 MOV U.CW3(R5),(R0)+ ;GET LOW ORDER BLOCKS IN DEVICE6 MOVB U.CW2(R5),(R0)+ ;GET HIGH ORDER BLOCKS IN DEVICE CLRB (R0)+ ;; ?; INSERT THE I/O COUNT INFORMATION AND CLEAR THEM IF REQUESTED.T<; NOTE THAT THIS INFORMATION IS IN SECONDARY POOL AND MAY OR; MAY NOT BE PRESENT.T;D< MOV U.UCBX(R5),KISAR6 ;MAP UCB EXTENSION IN SECONDARY POOL BEQ 35$ ;IF EQ NO EXTENSIONK;T>; MAP TO UCB EXTENSION, SAVE COUNTS ON THE STACK THEN MAP BACK!; TO ERROR PACKET AND FILL IT IN.A;D( 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 ORDERI: MOV -(R1),-(SP) ; SAVE HIGH ORDER BLOCKS TRANSFERED COUNT2 MOV -(R1),-(SP) ; SAVE SOFT AND HARD ERROR COUNTS! TST -(R1) ; BYPASS ERROR LIMITS5! MOV -(R1),-(SP) ; SAVE I/O COUNTO MOV -(R1),-(SP) ;...I& BIT #SM.ZER,26(SP) ; ZERO THE COUNTS? BEQ 33$ ; IF EQ NO CLR (R1)+ ;CLEAR THE COUNTSE CLR (R1)+ ;... TST (R1)+ ;... CLR (R1)+ ;... CLR (R1)+ ;... CLR (R1)+ ;...< MOV U.SCB(R5),R3 ; GET THE SCB ADDRESS FOR A MOMENT ;DC430@ BIT #S2.OPT,S.ST2(R3) ; DEVICE SUPPORT SEEK OPTIMIZATION ;DC430+ BEQ 33$ ; IF EQ, NOPE, CONTINUE ;DC430D CLR (R1)+ ;... CLR (R1)+ ;...&33$: MOV 20(SP), KISAR6 ; REMAP PACKET$ MOV #7,R3 ; MOVE 7 ITEMS TO PACKET34$: MOV (SP)+,(R0)+ ; GO) SOB R3,34$ ;...# BR 40$ ;JOIN COMMON CODE BELOW835$: ADD #16,R0 ;UPDATE POINTER. NOTE: A FLAG IS SET BY* ;...CRDEVP TO INDICATE THE DATA IN THE1 ;...UCB EXTENSION AREA IS INVALID. IT IS DONEB0 ;...THERE RATHER THAN HERE FOR GENERALITY AS# ;...OTHER ROUTINES CALL CRDEVP.P#40$: MOV 2(SP), KISAR6 ; MAP PACKET$;F'; CREATE THE DEVICE OPERATION SUBPACKET+;.; AT THIS POINT:;2; R0=POINTER TO NEXT FREE ENTRY IN ALLOCATED BLOCK; R1=UNDEFINED'; R2=CONTROL MASK WORD, SHIFTED RIGHT 3B; R3=UNDEFINED; R4=UNDEFINED; R5=UCB ADDRESS;:0CREDOP: ROR R2 ;CHECK FOR PRESENCE OF SUBPACKET% BCC CREIOA ;IF CC NO SUCH SUBPACKETN' MOV U.SCB(R5),R4 ;RETRIEVE SCB ADDRESSI/ MOV #E$OLEN,(R0)+ ;INSERT THE SUBPACKET LENGTHR- MOV S.PKT(R4),R1 ;GET THE I/O PACKET POINTERE& MOV I.TCB(R1),R1 ;GET THE TCB POINTER* CALL CRTASP ;INSERT THE TASK INFORMATION0 CALL CRIOPP ;INSERT THE I/O PACKET INFORMATION# CLR (R0)+ ;NO CURRENT RETRY COUNT ;D; I/O ACTIVITY SUBPACKET;D; AT THIS POINT:; 2; R0=POINTER TO NEXT FREE ENTRY IN ALLOCATED BLOCK; R1=UNDEFINED'; R2=CONTROL MASK WORD, SHIFTED RIGHT 4C; R3=UNDEFINED; R4=UNDEFINED; R5=UCB ADDRESS;R4CREIOA: ROR R2 ;CHECK FOR AN I/O ACTIVITY SUBPACKET- BCC CREDAT ;IF CC NO I/O ACTIVITY SUBPACKETP; D; THE LENGTH OF THE I/O ACTIVITY SUBPA00Mad7dc__DATADATADATADATACKET WILL BE COMPUTED WHEN THEC; ENTIRE SUBPACKET HAS BEEN CREATED. SAVE THE BEGINNING ADDRESS OFI; THE SUBPACKET FOR FUTURE USE. ;N3 MOV R0,-(SP) ;SAVE THE BEGINNING SUBPACKET ADDRESS:3 CLR (R0)+ ;GET RID OF ANYTHING IN THE LENGTH WORDO+ MOV R5,R2 ;SAVE UCB ADDRESS FOR REFERENCEH0 MOV #$SCDVT,-(SP) ;SETUP FOR THE COROUTINE CALL&10$: CALL @(SP)+ ;GET THE NEXT DEVICE BCS 20$ ;IF CS DONEY# MOV S.ST2(R4),R3 ;COPY STATUS BITSO COM R3 ;TOGGLE THEM5 BIT #S2.LOG!S2.ACT,R3 ;ACTIVE ERROR LOGGING DEVICE?C BNE 10$ ;IF NE NON CMP R5,R2 ;IS THIS OUR UCB?. BEQ 10$ ;IF EQ YES, IGNORE IT, CALL CRDEVP ;CREATE THE DEVICE INFORMATION) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSS- MOV I.TCB(R1),R1 ;GET THE TASK'S TCB ADDRESSG* CALL CRTASP ;CREATE THE TASK INFORMATION. TST -(R0) ;POINT BACK TO THE TI: UNIT NUMBER8 MOVB (R0),E$ATIU-E$AFNC(R0) ;INSERT THE TI: UNIT NUMBER0 CALL CRIOPP ;CREATE THE I/O PACKET INFORMATION BR 10$ ;LOOP UNTIL DONEE320$: MOV R0,R2 ;COPY THE CURRENT SUBPACKET ADDRESSE+ SUB (SP),R2 ;COMPUTE THE SUBPACKET LENGTHS9 MOV R2,@(SP)+ ;INSERT THE LENGTH IN THE SUBPACKET PREFIX ;T; CREATE THE DATA SUBPACKETV;P; AT THIS POINT:;C2; R0=POINTER TO NEXT FREE ENTRY IN ALLOCATED BLOCK; R1=UNDEFINED; R2=UNDEFINED; R3=UNDEFINED; R4=UNDEFINED; R5=UNDEFINED;E8CREDAT: BIT #SM.DAT,10(SP) ;DO WE HAVE A DATA SUBPACKET? BEQ 20$ ;IF EQ NO , MOV 6(SP),R3 ;GET THE DATA SUBPACKET LENGTH3 MOV R3,(R0) ;PUT IN THE LENGTH OF THE DATA ITSELF 1 ADD #2,(R0)+ ;ADD IN THE SUBPACKET HEADER LENGTHT5 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 ADDRESS % MOV 14(SP), R2 ;GET THE DATA ADDRESSD BEQ 15$ ;IF EQ, NO DATAF% MOV R3,R0 ;GET NUMBER BYTES TO MOVEE# MOV 2(SP),R1 ;DATA BUFFER APR BIAS ;E@; IF THE DATA BUFFER IS MAPPED THROUGH ANY APR'S BUT 5 OR 6, THEB; MAPPING WILL BE TRANSPARENT TO BLXIO. HOWEVER, IF IT'S IN APR6,@; 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?  BLOS 10$ ;IF YES, BRANCH' CMP #140000,R2 ;IS IT LOWER THAT APR6?R BHI 7$ ;SEE IF IT'S IN APR5D- SUB #20000, R2 ;CONVERT APR6 ADDRESS TO APR5R BR 10$ ;AND CONTINUE%7$: CMP #120000, R2 ;IS THIS IN APR5?R BHI 10$ ;BR IF NOT; I; WARNING: THIS STATEMENT REACHES OUT OF THIS MODULE'S "KNOWN" STACK AREAP<; TO GET THE APR5 MAPPING WHICH WAS SAVED BY ANOTHER MODULE:;T0 MOV 40(SP),R1 ;ELSE, GET THE SAVED APR5 MAPPING(10$: MOV 4(SP),R3 ;GET MAPPING TO PACKET MOV (SP),R4 ;ADDR OF BUFFER  CALL $BLXIO ;MOVE DATA MOV R4,R0 ;UPDATE POINTER 5 BIT #SM.MBC,12(SP) ;MASSBUS RHBAE REGISTERS PRESENT?S BEQ 15$ ;IF EQ NOT MOV 20(SP),R5 ;GET UCB ADDRESS;" MOV U.SCB(R5),R4 ;GET SCB ADDRESS* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS MOV R3,R2 ;COPY KRB ADDRESSE% ADD K.OFF(R3),R2 ;POINT TO UCB TABLEE) MOV KE.RHB(R2),R2 ;RETREIVE RHBAE OFFSETE MOV 2(SP),KISAR6 ;MAP DATAV( ADD 14(SP),R2 ;FORM AN I/O PAGE ADDRESS% MOV 2(R2),-(SP) ;COPY BOTH REGISTERSA MOV (R2),-(SP) ;...! MOV 10(SP), KISAR6 ;REMAP PACKET * MOV (SP)+,(R0)+ ;MOVE REGISTERS TO PACKET* MOV (SP)+,(R0)+ ;MOVE REGISTERS TO PACKET+15$: MOV (SP)+,R1 ;GET SUBPACKET DATA ADDR. #20$: CLC ;PACKET COULD BE CREATEDS$ TST (SP)+ ;DISCARD MAPPING TO DATA) MOV (SP)+,R3 ;RESTORE THE PACKET ADDRESSR,PKTXIT: MOV (SP)+,R0 ;RESTORE THE ENTRY CODE. INC (SP)+ ;DISCARD THE DATA SUBPACKET LENGTH, MOV (SP)+,R2 ;RESTORE THE CONTROL MASK WORD% INC (SP)+ ;DISCARD THE DATA ADDRESS;& MOV (SP)+,R4 ;RESTORE THE TCB ADDRESS& MOV (SP)+,R5 ;RESTORE THE UCB ADDRESS RETURN ;DONE;;+#; **-CRTASP-CREATE TASK INFORMATIONO;R=; CREATES THE FOLLOWING INFORMATION IN THE CURRENT SUBPACKET: ;03; +-----------------------------------------------+A; | TASK NAME IN RAD50 |+ ; | |3; +-----------------------------------------------+H; | TASK UIC |3; +-----------------------------------------------+R00Mid-dibjbkb a a a; | TASK TI: DEVICE NAME |D3; +-----------------------+-----------------------+R$; | FLAGS | TASK TI: UNIT NUMBER |3; +-----------------------+-----------------------++; ; FLAGS:; ET$PRV TASK IS PRIVILEGED ; ET$PRI TERMINAL IS PRIVILEGED;N ; INPUTS:T'; R0=POINTER TO SUBPACKET FOR INSERTION-; R1=POINTER TO TASK TCB; ; OUTPUTS: ; R0=UPDATED; R1 AND R3 ARE DESTROYED-; R4 AND R5 ARE PRESERVED-;-CRTASP: SAVNR ;SAVE R4 AND R5-* MOV T.NAM(R1),(R0)+ ;PUT IN THE TASK NAME MOV T.NAM+2(R1),(R0)+ ;...+ MOV T.PCB(R1),R4 ;GET A POINTER TO THE PCB-0 BIT #PS.OUT!PS.CKP,P.STAT(R4) ;TASK IN MEMORY ?' BEQ 2$ ;IF EQ, YES - UIC IS AVAILABLE-& CLR (R0)+ ;OTHERWISE, ASSUME UIC 0,0 BR 7$ ;L2$: ;REFERENCE LABELI .IF DF X$$HDR, MOV KISAR6,-(SP) ;SAVE CURRENT APR6 MAPPING. MOV P.HDR(R4),R5 ;GET A POINTER TO THE HEADER BNE 5$ ;IF NE IT'S RESIDENTT9 MOV P.REL(R4),KISAR6;SET APR6 MAPPING TO EXTERNAL HEADERS MOV #140000,R5 ;SET TO MAP APR6;;3;SAVE UIC AND REMAP PACKET AND INSERT UIC IN PACKETM;T%5$: MOV H.CUIC(R5),R5 ; SAVE THE UIC+ MOV (SP)+, KISAR6 ; RESTORE PACKET MAPPINGY MOV R5,(R0)+ ; INSERT UIC .IFF ; DF X$$HDRR. MOV P.HDR(R4),R4 ;GET A POINTER TO THE HEADER$ MOV H.CUIC(R4),(R0)+;INSERT THE UIC .ENDC ; DF X$$HDR7$: ;REFERENCE LABELG* MOV T.UCB(R1),R5 ;GET THE TI: UCB POINTER210$: 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 BYTER/ BIT #U2.PRV,U.CW2(R5) ;IS THE TI: PRIVILEGED?H BEQ 20$ ;IF EQ NOT+ BISB #ET$PRI,(R0) ;MARK THE TI: PRIVILEGEDT420$: BIT #T3.PRV,T.ST3(R1) ;IS THE TASK PRIVILEGED? BEQ 25$ ;IF EQ NO), BISB #ET$PRV,(R0) ;MARK THE TASK PRIVILEGED+25$: TSTB (R0)+ ;POINT PAST THE FLAG ENTRY. RETURN ;DONEE;+%; **-CRDEVP-CREATE DEVICE INFORMATIOND;R=; CREATES THE FOLLOWING INFORMATION IN THE CURRENT SUBPACKET:E;V3; +-----------------------------------------------+R$; | LOGICAL DEVICE NAME MNEMONIC |3; +-----------------------+-----------------------+2,; | CONTROLLER NUMBER | DEVICE UNIT NUMBER |3; +-----------------------+-----------------------+A*; | PHYSICAL SUBUNIT # | PHYSICAL UNIT # |3; +-----------------------+-----------------------+)%; | PHYSICAL DEVICE NAME MNEMONIC | 3; +-----------------------------------------------+O; | RESERVED | FLAGS |W3; +-----------------------+-----------------------+-;- ; INPUTS:-; R0=POINTER TO DATA AREA-; R4=SCB ADDRESS; R5=UCB ADDRESS;| ; OUTPUTS: ; R0=UPDATED; R1 AND R3 ARE DESTROYED2; R4 AND R5 ARE PRESERVEDE;-CRDEVP: SAVNR ;SAVE R4 AND R5- CLR -(SP) ;CLEAR FLAG WORD+ MOV U.DCB(R5),R3 ;GET A POINTER TO OUR DCB|. 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 KRBS( MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX15$: ASRB R3 ;MAKE IT A NUMBER ' MOVB R3,(R0)+ ;INSERT CONTROLLER INDEX43 MOVB U.UNIT(R5),(R0)+;GET THE PHYSICAL UNIT NUMBER)& CLRB (R0)+ ;CLEAR THE SUBUNIT NUMBER3 BITB #S3.SLV,S.ST3(R4) ;IS THERE ANY SLAVE UNITS?  BEQ 20$ ;IF EQ NOX4 MOVB U.SNUM(R5),-1(R0) ;YES, INSERT SUBUNIT NUMBER1 BIS #EI$SUB,(SP) ;FLAG AS A SUBCONTROLLER DEVICEN;C<; GET THE PHYSICAL CONTROLLER NAME BY SCANNING THE CTB LIST.;C020$: MOV #$CTLST,R3 ;GET ADDRESS OF CTB LISTHEAD+25$: MOV (R3),R3 ;GET THE NEXT CTB ADDRESSR BNE 30$ ;IF NE WE GOT ONEV' MOV U.DCB(R5),R3 ;ELSE GET DCB ADDRESSV6 MOV D.NAM(R3),(R0)+ ;USE DCB NAME FOR CONTROLLER NAME BR 55$ ;/30$: MOV L.DCB(R3),R1 ;GET DCB POINTER FROM CTBS@ 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 TH00Mqd7dc__DATADATADATADATAIS THE CORRECT CTB? BNE 25$ ;IF NE NO, LOOPR BR 50$ ;IT MUST BE.40$: TST (R1)+ ;SKIP COMMON INTERRUPT ADDRESS-45$: TST (R1) ;IS THIS THE END OF THE TABLE?T BEQ 25$ ;IF EQ YES1 CMP (R1)+,U.DCB(R5) ;DOES THE DCB MATCH OUR DCB?S BNE 45$ ;IF NE NOM950$: MOV L.NAM(R3),(R0)+ ;INSERT PHYSICAL CONTROLLER NAME555$: MOV (SP)+,(R0)+ ;SET FLAGSD RETURN ;O;+(; **-CRIOPP-INSERT I/O PACKET PARAMETERS;T.; INSERTS THE FOLLOWING I/O PACKET PARAMETERS:;B3; +-----------------------------------------------+B; | I/O FUNCTION CODE |3; +-----------------------+-----------------------+N; | RESERVED | FLAGS |T3; +-----------------------+-----------------------+ "; | TRANSFER OPERATION ADDRESS | ; | |3; +-----------------------------------------------+(%; | TRANSFER OPERATION BYTE COUNT |3; +-----------------------------------------------++; ; INPUTS:N; R0=POINTER TO SUBPACKET DATA; R4=SCB ADDRESS; R5=UCB ADDRESS;M ; OUTPUTS: ; R0=UPDATED; R1 AND R3 ARE DESTROYED-; R4 AND R5 ARE PRESERVEDN;-#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 CODE-;-& MOV U.DCB(R5),R1 ;GET THE DCB POINTER0 ADD #D.MSK+2,R1 ;AND POINT TO THE FUNCTION MASK CLRB R3 ;CLR MODIFIER FLAGSI( SWAB R3 ;PUT FUNCTION CODE IN LOW BYTE3 CMP R3,#15. ;IS THE FUNCTION IN THE SECOND MASKS?A) BLOS 10$ ;IF LOS FUNCTION IN FIRST MASKR* SUB #16.,R3 ;NORMALIZE THE FUNCTION CODE% ADD #8.,R1 ;POINT TO THE SECOND SET -10$: ASL R3 ;MAKE FUNCTION CODE A WORD INDEX= MOV $BTMSK(R3),R3 ;GET BIT THAT CORRESPONDS TO FUNCTION CODE ;B7; SEE IF THE FUNCTION IS OTHER THAN A TRANSFER FUNCTIOND;R( BIT R3,(R1)+ ;IS IT A CONTROL FUNCTION? BNE 20$ ;IF NE YES' BIT R3,(R1)+ ;IS IT A NOOPED FUNCTION?I BNE 20$ ;IF NE YES% BIT R3,(R1)+ ;IS IT AN ACP FUNCTION?  BNE 20$ ;IF NE YES. BIS #EO$TRA,(R0) ;FLAG AS A TRANSFER FUNCTION;S; INSERT THE OTHER FLAGS;T020$: BITB #UC.NPR,U.CTL(R5) ;IS IT A DMA DEVICE? BEQ 40$ ;IF EQ NOA' BIS #EO$DMA,(R0) ;FLAG AS A DMA DEVICES* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS9 BIT #KS.MBC!KS.EXT,K.STS(R3) ;22-BIT ADDRESSING DEVICE?F BEQ 35$ ;IF EQ NOB5 BIS #EO$EXT,(R0) ;FLAG AS EXTENDED ADDRESSING DEVICEE835$: BITB #S3.SIP,S.ST3(R4) ;IS THE DEVICE POSITIONING? BEQ 40$ ;IF EQ NORC40$: MOV S.PKT(R4),R2 ; GET THE POINTER TO THE I/O PACKET A BIT #1,I.IOSB+4(R2) ; TEST IF THIS IS AN INTERNAL I/O PACKET BEQ 41$ ; IF EQ NO: BIS #EO$IIO,(R0) ; THEN SET THE BIT TO INDICATE IT041$: MOV (R0)+,R1 ; GET COPY OF FLAG WORD0 BIT #EO$EXT,R1 ;DO WE HAVE AN EXTENDED ADDRESS? BNE 70$ ;IF NE YES& BIT #EO$DMA,R1 ;IS THIS A DMA DEVICE? BEQ 90$ ;IF EQ NOT; 2; INSERT THE TRANSFER OPERATION ADDRESS AND LENGTH;E& ADD K.OFF(R3),R3 ;POINT TO UMR AREA+2, MOV -(R3),2(R0) ;INSERT LOW BITS OF ADDRESS. MOVB -(R3),(R0)+ ;INSERT HIGH BITS OF ADDRESS CLRB (R0)+ ;FORGET ANY GARBAGE TST (R0)+ ;POINT PAST LOW BITS BR 100$ ;#670$: MOVB U.BUF+1(R5),(R0);ASSUME HIGH BITS ARE IN UCB8 BIT #KS.EXT,K.STS(R3) ;IS THIS A 22-BIT UNIBUS DEVICE? BEQ 80$ ;IF EQ NON) MOV S.PKT(R4),R2 ;GET I/O PACKET ADDRESSO. MOV I.PRM+6(R2),(R0);GET HIGH BITS OF ADDRESS&80$: BIC #^C<377>,(R0)+ ;CLEAR GARBAGE BR 95$ ;GO GET LOW BITS490$: MOV U.BUF(R5),(R0)+ ;STORE HIGH BITS OF ADDRESS695$: MOV U.BUF+2(R5),(R0)+ ;STORE LOW BITS OF ADDRESS1100$: MOV U.CNT(R5),(R0)+ ;MOVE IN THE BYTE COUNTG MOV (SP)+,R2 ;RESTORE REGISTERO RETURN ;0;+(; **-CALDEV-CALCULATE DEVICE UNIT NUMBER; 9; THIS ROUTINE WILL CALCULATE THE LOGICAL UNIT NUMBER FORS; THE GIVEN UCB.;I ; INPUTS:M; R0=POINTER TO PACKET DATAE; R3=DCB ADDRESS; R5=UCB ADDRESS;I ; OUTPUTS:); UNIT NUMBER STORED IN NEXT PACKET BYTE.A;-CALDEV: SAVNR ;SAVE R4 AND R5V/ SUB D.UCB(R3),R5 ;COMPUTE RELATIVE UCB ADDRESS:" CLR R4 ;GET READY FOR THE DIVIDE0 DIV D.UCBL(R3),00Myd-dibjbkb a a aR4 ;COMPUTE REALTIVE UNIT NUMBER0 ADD D.UNIT(R3),R4 ;COMPUTE ABSOLUTE UNIT NUMBER% MOVB R4,(R0)+ ;STORE IN ERROR PACKETL RETURN ;I;+-; **-$CREQ1-CREATE AND QUEUE ERROR LOG PACKET ;TC; THIS ROUTINE CREATES AND QUEUES ERROR LOG PACKET. IT USES $CRPK1TE; AND $QUPK1. IT'S INPUT IS THE SAME AS THE INPUT TO $CRPK1 AND IT'SEB; OUTPUT IS THE SAME AS THAT FROM $QUPK1. IF THE PACKET CANNOT BED; CREATED, $QUPKT IS NOT CALLED AND A RETURN IS MADE WITH CARRY SET.; KISAR6 MAPPING IS PRESERVED.;,;-$CREQ1:: MOV KISAR6,-(SP) ; SAVE MAPPING! CALL $CRPK1 ; CREATE THE PACKET# MOV (SP)+,KISAR6 ; RESTORE MAPPINGL) BCC $QUPK1 ; IF WE GOT PACKET, QUEUE ITA' RETURN ; ELSE, RETURN WITH CARRY SETU;+"; **-$QUPK1-QUEUE ERROR LOG PACKET;SF; THIS ROUTINE IS CALLED TO QUEUE AN ERROR LOG PACKET. IF THERE IS NOH; OTHER PACKET IN THE QUEUE, THE ERROR LOGGER IS REQUESTED WITH A DELAY.F; IF THERE IS ANOTHER PACKET ALREADY IN THE QUEUE, THE ERROR LOGGER IS; REQUESTED IMMEDIATLY.R;R ; INPUTS:-;C9; R3=POINTER TO PACKET FOR INSERTION IN QUEUE (APR VALUE)R;E ; OUTPUTS:;M; R4 AND R5 ARE PRESERVEDA#; ALL OTHER REGISTERS ARE DESTROYEDE;-$QUPK1::SAVNR ;SAVE R5 AND R4W+ MOV R3,R1 ;COPY THE POINTER TO THE PACKETO5 MOV $ERRPT,R5 ;SAVE FOR USE WHEN REQUESTING THE TASKE" BEQ 40$ ;IF EQ NO ERROR LOG TASK5 MOV #$ERHEA,R0 ;GET A POINTER TO THE QUEUE LIST HEADD< CALL $QSPIF ;INSERT THE ENTRY FIFO IN THE QUEUE (2ND POOL)6 CMP (R0)+,(R0) ;IS THIS THE FIRST ENTRY IN THE QUEUE? BNE 20$ ;IF NE NOP% MOV KISAR6,-(SP) ; SAVE APR6 MAPPING  MOV R1,KISAR6 ; MAP PACKET6 BIT #SM.CMD,E$HSBF+140004 ;IS THIS A COMMAND PACKET? BNE 10$ ; IF NO YESP# MOV (SP)+,KISAR6 ; RESTORE MAPPING,, MOV #C.LGTH,R1 ;SIZE OF A CLOCK QUEUE ENTRY& CALL $ALOCB ;ALLOCATE THE CORE BLOCK/ BCS 20$ ;IF CS FAILURE, TRY IMMEDIATE REQUEST#$ CLR C.UIC(R0) ;INDICATE DEFAULT UIC .IF DF A$$CNT# CLR C.UAB(R0) ;BILL TASK TO SYSTEMU .ENDC ; DF A$$CNT CLR R1 ;HIGH TIME = 0T MOV #ERRTIM,R2 ;LOW TIME ) MOV #C.SSHT,R4 ;SINGLE SHOT TASK REQUESTA- CALLR $CLINS ;INSERT THE ENTRY IN THE QUEUEC;H=; THERE IS ANOTHER PACKET IN THE QUEUE, SO IMMEDIATLY REQUEST; THE ERROR LOGGER.E;R'10$: MOV (SP)+,KISAR6 ; RESTORE MAPPINGK'20$: MOV R5,R0 ;COPY THE ERROR LOG TCB ' TST T.STAT(R0) ;IS IT ALREADY RUNNING? & BPL 30$ ;IF PL YES, DON'T REQUEST IT CLR R1 ;INDICATE DEFAULT UIC CALLR $TSKRT ;REQUEST THE TASK;S?; THE ERROR LOG TASK IS ALREADY RUNNING, SO DISMISS THE REQUESTR;M30$: RETURN ;EXIT.;R@; THE ERROR LOG TASK HAS BEEN REMOVED. DISCARD THE QUEUED ENTRY; 240$: MOV R1,R0 ;COPY THE ERROR LOG PACKET POINTER! MOV KISAR6, -(SP) ; SAVE MAPPING  MOV R1,KISAR6 ; MAP TO PACKET. MOV @#140002,R1 ; GET SIZE OF PACKET IN BYTES6 ADD #77+4,R1 ; ACCOUNT FOR LINK + LENGTH + TRUNCATION( ASH #-6,R1 ; CONVERT TO 32 WORD BLOCKS# MOV (SP)+,KISAR6 ; RESTORE MAPPINGC* CALLR $DESEC ; DEALLOCATE SECONDARY POOL;+-; **-$QRMV1-REMOVE ENTRY FROM ERROR LOG QUEUES;F; THIS ROUTINE REMOVES AN ENTRY FROM THE ERROR LOG QUEUE AND TRANSFERS; IT INTO A USER BUFFER.; ; INPUTS:V;,; R4=LENGTH OF USER BUFFER; R5=ADDRESS OF USER BUFFER);S ; OUTPUTS:;M; R1=LENGTH OF PACKETA; R4=UNCHANGED; R5=UNCHANGED;F%; C=0 PACKET WAS REMOVED SUCCESSFULLYN;; C=1 NO PACKET TO REMOVE OR PACKET TOO LONG. IF R1<>0 THE2=; PACKET WAS TOO LONG, AND R1 CONTAINS THE PACKET LENGTH.E;- $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 PACKETS MOV KISAR6,-(SP) ; SAVE MAPPING6 MOV R1,KISAR6 ; MAP TO PACKET - VALUE CAME FROM QSPRF% MOV @#140002,R0 ; GET SIZE OF PACKET5# MOV (SP)+,KISAR6 ; RESTORE MAPPINGV MOV R0,-(SP) ; SAVE SIZEP% MOV R4,-(SP) ; SAVE USER BUFFER SIZE ! MOV R5,R4 ; USER BUFFER ADDRESSN' CMP R0,(SP)+ ; IS THE PACKET TOO LONG?-# BHI 20$ ;IF HI PACKET IS TOO LONG;R?; PREPARE FOR $BLXIO.. INPUT IS R0= #BYTES, R1=SOURC00MdNdc__DATADATADATADATAE APR5 BIASEC; R2=SOURCE DISPLACEMENT, R3=DESTINATION APR6 BIAS, R4=DEST. DISPL.IE; OUTPUT FROM BLXIO IS: R0 ALTERED, R1,R3 PRESERVED, R2 AND R4 POINT;%; TO LAST BYTE OF SOURCE AND DEST. +1;V, MOV #120004,R2 ; SKIP LINK AND LENGTH WORDS! MOV KISAR6,R3 ; PRIV.TASK'S APR6, CALL $BLXIO ; MOVE THE BUFFER ,20$: MOV R1,-(SP) ; SWAP R0 AND R1 FOR DESEC MOV (SP)+,R0 ;... MOV (SP)+,R1 ;...- MOV R1,-(SP) ; SAVE SIZE IN BYTES FOR OUTPUTO7 ADD #77+4,R1 ; ACCOUNT FOR LENGTH, LINK AND TRUNCATION1 ASH #-6,R1 ; CONVERT TO BLOCKS! CALL $DESEC ; DEALLOCATE PACKETS( MOV (SP)+,R1 ;RESTORE THE PACKET LENGTH DEC R4 ;ADJUST SO THAT IF: ; R4>R5 WE TRANSFERRED DATAO$ ; R4; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ; ; M. B. GROSSMAN 10/15/78#; ; P. J. CARR ; J. GALLANT;E; MODIFIED BY: 15-AUG-86 3.02 E; P6; G. MARIGOWDA GM001 -- CONVERT TO USE EXEC VECTORING; ; ; TU58 TAPE CARTRIDGE DRIVER;A?; THIS DRIVER INTERFACES WITH THE TU58 VIA A DL11 AT 9600 BAUD.D@; COMMANDS, DATA AND DEVICE STATUS ARE FORMATTED INTO STRUCTURED=; PACKETS OF BYTES IN ACCORDANCE WITH RADIAL SERIAL PROTOCOL.S;R; MACRO LIBRARY CALLSA;M# .MCALL HWDDF$,PKTDF$,QIOSY$,SCBDF$D QIOSY$  SCBDF$ ,,SYSDEF$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;E; EQUATED SYMBOLS5;GRTRY= 2 ;RETRY COUNT/DDNUM= 6 ;NUMBER OF REGISTERS TO LOG ON ERROR;%; TU58 RADIAL SERIAL PROTOCOL SYMBOLS ;S; INSTRUCTION SETW; READ= 2 ;READ INSTRUCTIONAWRITE= 3 ;WRITE INSTRUCTIONC2POSIT= 5 ;POISITION INSTRUCTION -USER MODE DIAG.1DIAG= 7 ;DIAGONOSE INSTRUCTION -USER MODE DIAG.2TYPU58= 12 ;OPCODE TO CHECK FOR OLD OR NEW TU58;I; FLAGSF;DATA= 1 ;DATA FLAGCNTL= 2 ;CONTROL FLAGAINIT= 4 ;INITIALIZE FLAGCONT= 20 ;CONTINUE FLAGEND= 2 ;END FLAG;; DL11 INTERFACE OFFSET SYMBOLS=; +DDRCS= 0 ;RECEIVE CONTROL STATUS REGISTER #DDRBF= 2 ;RECEIVE BUFFER REGISTER/DDXCS= 4 ;TRANSMITTER CONTROL STATUS REGISTERU'DDXBF= 6 ;TRANSMITTER BUFFER REGISTERO;=; DL11 BIT ASSIGNMENTS; RDONE= 200 ;RECEIVER DONED%RIE= 100 ;RECEIVER INTERRUPT ENABLE"ERR= 100000 ;RECEIVER DATA ERRORTRDY= 200 ;TRANSMITTER READY(TIE= 100 ;TRANSMITTER INTERRUPT ENABLEBRK= 1 ;TRANSMIT BREAK; ; LOCAL BIT ASSIGNMENTS;A0FLCTL = 10 ;FLOW CONTROL BIT IN SWITCH BYTE OF ;COMMAND PACKET (BIT 3)ENTU58 = 1 ;NEW TU58 MICROCODED"CHKDON = 2 ;TU58 TYPE CHECK DONE&TU58C = 10 ;TU58 IS SENDING CONTINUE-TRNACK = 20 ;TRANSMITTING THE ACK CHARACTERE; ; LOCAL DATA;S;WORD1: .BLKW T$$U58 ;STORAGE FOR LAST THREE WORDS THAT AREV+WORD2: .BLKW T$$U58 ;TO GO IN ERROR PACKET WORD3: .BLKW T$$U58 ;;A; MAKE GTPKT$ A LOCAL MACROR; ( .MACRO GTPKT$ DEV,NCTRLR,ADDR,UCBSV,SUC CALL @GTPKT .IF B G BCC 65535$L RETURN 65535$:N .IFFT BCS ADDRB .ENDC .IF B  $$$=0 .IF B .IF EQ $$$  MOV R5,S.OWN(R4)= .ENDC .ENDC .IFFO .IF GT NCTRLR-1 MOV R5,UCBSV(R3)T .IFFR MOV R5,UCBSVA .ENDC .ENDC .ENDM;$; EXECUTIVE ENTRY POINT VECTOR TABLE; /EXEVEC: .WORD 0 ;FLAG FOR VECTOR NOT YET FILLEDL ALOCB: .WORD $ALOCB BLKCK: .WORD $BLKCK DEACB: .WORD $DEACB DTOER: .WORD $DTOER DVERR: .WORD $DVERR ERRSQ: .WORD $ERRSQ FORK: .WORD $FORK. GTBYT: .WORD $GTBYT GTPKT: .WORD $GTPKT IODON: .WORD $IODON PTBYT: .WORD $PTBYT VOLVD: .WORD $VOLVD ; KISR6: .WORD KISAR6 ; EXEVCL=<<<.-EXEVEC>/2>-1> ;;DRIVER DISPATCH TABLE;C1 DDT$ DD,T$$U58,00Nd-dibjbkb a a a,,,NEW ;2 INT. ENTRY PTS.;; PROGRAM SEQUENCE CONTROL;E7; PROGRAM FLOW IS CONTROLLED BY A POINTER TO A TABLE OFT9; ADDRESSES. THIS SEQUENCE CREATES AND DECODES THE RADIALA4; SERIAL PACKET INFORMATION. THE ACTUAL USER DATA IS9; TRANSFERRED WITHIN THE INTERRUPT SERVICE ROUTINE (ISR). 7; THIS METHOD PERMITS US TO WAIT FOR INTERRUPTS WITHOUT;; HAVING TO PRESERVE ANY PROCESSOR REGISTERS (INCLUDING THE 7; STACK). REPETITIVE SECTIONS OF CODE CAN BE EXECUTED AT9; NUMBER OF TIMES WITHOUT LOOP COUNTERS. THIS METHOD ALSO 7; DECREASES PROGRAM SIZE BY ALLOWING US TO USE BRANCHESW; RATHER THAN JSR'S.;E9; THE POINTER (LOCATION RADD) IS INCREMENTED VIA THE CODEC9; IN RTBK (RETURN BACK). RTBK THEN SHIFTS CONTROL TO THE S=; ADDRESS POINTED TO BY RADD. RTBK IS CALLED BY RMSG/SMSG OR (:; THE INTERRUPT SERVICE ROUTINE WHENEVER THE DL11 IS READY2; TO PERFORM THE NEXT NON-DATA TRANSFER OPERATION.;LA; THE MODIFIED RADIAL SERIAL PROTOCOL ALGORITHM IS THE FOLLOWING:T; =; ISSUE A COMMAND TO THE TU58 WITH THE OPCODE 12 AND THE FLOWRA; CONTROL BIT SET. RECEIVE THE FIRST BYTE OF THE TU58'S RESPONSE.SB; IF IT'S A '1', IT IS AN OLD TU58. THE '1' IS THE FLAG FOR A DATAD; PACKET. IF THE RESPONSE IS A '2', IT IS A NEW TU58. THE '2' IS THEB; FLAG FOR AN END PACKET. FLUSH THE REST OF THE TU58'S RESPONSE BYC; SENDING THE TU58 AN INIT COMMAND. THE MEMORY LOCATION FLGTYP WILL B; HAVE BIT 0 SET FOR THE NEW TU58 AND BIT 0 WILL BE CLEARED FOR AN ; OLD TU58. ;TC; THE COMMAND PACKET THAT AUTOCONFIGURES THE TU58 LOOKS AS FOLLOWS:A;T; BYTE BYTE CONTENTS ; ---- ---------------T; 0 FLAG - 2E; 1 BYTE COUNT 12 ; 2 OPCODE 12; 3 MODIFIER 0A ; 4 UNIT #4; 5 SWITCHES 10 (FLOW CONTROL BIT SET - BIT 3); 6 SEQUENCE # 0A; 7 SEQUENCE # 0 ; 8 BYTE COUNT 0; 9 BYTE COUNT 0N; 10 BLOCK # 0L; 11 BLOCK # 0 ; 12 CHECK SUM-LOWE; 13 CHECK SUM-HIGH;B;L; CTAB- COMMAND PACKET SEQUENCE ; ;; CONE IS THE ADDRESS RETURNED TO WHEN THE DL11 IS READY TOA:; 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. ; ;CTAB: .WORD CHALF,CONE,CTWO,CTHR,CFOUA,CFOUB,CFIV,CSIX,CSEV. .WORD CEIG,CNIN,CTEN,CELE,CTWE,CTHI,CFOR,CFIF;0; ITAB- INITIALIZATION SEQUENCE ; NITAB: .WORD IONE,ITWOA,ITWOB,ITWOC,ITWOD,ITWOE,ITHR,IFOU,IFIV,ISIX ;INIT. SEQ.;Q; TTAB- TRANSMIT DATA SEQUENCE;E/TTAB: .WORD TONE,TTWO,TTHR,TFOU,TFOUA,TFIV,TSIXF;T; RTAB- RECEIVE DATA SEQUENCEA;TFRTAB: .WORD RONE,RTWO,RTHR,RFOU ;INCOMING (READ) DATA PACKET ADDRESSES;."; ETAB- END PACKET DECODE SEQUENCE;E?ETAB: .WORD EONE,ETWO,ETHR,EFOU,EFIV,ESIX,ESEV ;READ END PACKETT/ .WORD EEIG,ENIN,ETEN,EELE,ETWE,ETHI ;FROM TU58C;,"; TYPTAB - DETERMINE TYPE OF TU58 ;N>TYPTAB: .WORD CONE,CTWO,TYPTHR,CFOUB,CFIV,TYPSIX,TYPSEV,TYPSEV3 .WORD TYPSEV,TYPSEV,TYPSEV,TYPSEV,CTHI,CFOR,TYPFIFB> .WORD TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSXT0 .WORD TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSXT,TYPSVT;T>; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER);E"RDAT: .BLKW T$$U58 ;RECEIVED DATA+RADD: .BLKW T$$U58 ;RETURN ADDRESS POINTER,(DBUF: .BLKW T$$U58 ;DL11 BUFFER ADDRESS/CKSM1: .BLKW T$$U58 ;CHECKSUM STORAGE-1ST WORDY" ;ALSO TEMPORARY DRIVER STORAGE/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 WRITTENX! ;ALSO USED FOR RETURN ADDRESSO ;DURING IOPKT SUBROUTINE- ;ALSO USED FOR INITIALIZATION RETRY COUNT8)FLGTYP: .BLKW T$$U58 ;BIT 0 - 0 OLD TU58R ; 1 NEW TU58, ;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 T00Nddc__DATADATADATADATAAPE CARTRIDGE INITIATORU; >; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN ANB; I/O REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION<; TO 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. IFN@; THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPERATION8; IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.; ; INPUT:; ;; R5 = ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATEDI;N ; OUTPUT:T;Q<; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST:; IS WAITING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED5; AND THE DRIVER INITIATES THE REQUESTED I/O FUNCTION ;- .ENABL LSBE1DDINI: GTPKT$ DD ;GET NEXT I/O PACKET TO PROCESSE;R1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ;E'; R1=ADDRESS OF THE I/O REQUEST PACKET.A; R2=PHYSICAL UNIT NUMBER.; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.S:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;6; TU58 TAPE CARTRIDGE DRIVE I/O REQUEST PACKET FORMAT:;Q"; 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.D=; WD. 03 -- POINTER TO 2ND LUN WORD IN REQUESTOR TASK HEADER.L>; 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)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 ADDRESS2; 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 TRANSFERD; WD. 15 -- NOT USED5; WD. 16 -- LOW BYTE MUST BE ZERO, HIGH BYTE NOT USED ,; WD. 17 -- LOGICAL OR PHYSICAL BLOCK NUMBER; WD. 20 -- NOT USED;C; DRIVE USUAGE OF UCBL;I); U.CW2+1 --- STORES DRIVER'S RETRY COUNT ;I;+3; THE TU58 UTILIZES RADIAL SERIAL PROTOCOL. ALL I/OU5; COMMANDS ARE INITIATED BY SENDING A COMMAND MESSAGE15; PACKET CONSISTING OF 14. BYTES OF INFORMATION. DATA 3; IS THEN TRANSFERRED TO THE UNIT (WRITE) OR TO THED6; USER'S BUFFER (READ) IN MESSAGE PACKETS OF UP TO 1285; BYTES EACH. TERMINATION OF AN OPERATION BY THE TU58 2; IS SIGNALED BY THE UNIT'S SENDING AN END MESSAGE3; PACKET WHICH CONTAINS INFORMATION CONCERNING THE R; SUCCESS OF THE TRANSFER.;-;-;T* MOVB #RTRY,U.CW2+1(R5) ;STORE RETRY COUNT$ CALL @VOLVD ;VALIDATE VOLUME VALID BCC 10$ ;IF CC SUCCESS5$: JMP XIT ;EXIT 10$: TST R0 ;TRANSFER FUNCTION? BPL 5$ ;IF PL NO2 MOV S.CSR(R4),DBUF(R3) ;STORE DL11 BUFFER ADDRESS/ MOV R3,R4 ;R4 IS USED FOR CONTROLLER INDEXINGE CALL @BLKCK ;CHECK PARAMETERSE. ADD #DDXBF,DBUF(R4) ;SAVE DL11 XMITTER BUFFER; ; SEND COMMAND PACKET';E:RINI: MOV #TYPTAB-2,RADD(R4); POINT TO WORD PRIOR TO TABLE/ CLR FLAG(R4) ;SET FLAG FOR TRANSMIT INTERRUPTS-9 CLR FLGTYP(R4) ;CLEAR FLAG TYPE WORD,DEFAULT IS OLD TU58L BR 145$ ;PREPARE TO SEND BYTE19RINI1: MOV #CTAB-2,RADD(R4) ;POINT TO WORD PRIOR TO TABLEF? BIC #TU58C!TRNACK,FLGTYP(R4); CLEAR ACK AND TU58 CONTINUE FLAGD/ CLR FLAG(R4) ;SET FLAG FOR TRANSMIT INTERRUPTSO BR 145$ ;PREPARE TO SEND BYTE ;E; SEND COMMAND PACKET.;,*CHALF: BITB #NTU58,FLGTYP(R4) ; NEW TU58 ? BNE 15$ ; YES. JMP RTBK ; NO - DON'T SEND INITIAL CONTINUE?15$: MOVB #CONT,@DBUF(R4) ; SEND CONTINUE TO ASSURE A RESPONSE-! BR 145$ ; PREPARE TO SEND BYTEW2CONE: MOVB #CNTL,@DBUF(R4) ;SEND COMMAND FLAG BYTE BR 145$ ;PREPARE TO SEND BYTE4)CTWO: MOV #10.,@DBUF(R4) ;SEND BYTE COUNT81 MOVB #10.,CKSM1+1(R4) ;CREATE CHECKSUM WORD FROMA' MOVB #CNTL,CKSM1(R4) ; FIRST TWO BYTESI BR 145$.CTHR: CALL IOPKT ;STORE I/O PKT ADDRESS IN R1;AD; POSITION AND DIAGNOSE FUNCTIONS ARE USER MODE DIAGNOSTIC FUNCTIONS;Y9 CMP #IO.DGN!IQ.UMD,I.FCN(R1) ;TU58 INTERNAL DIAGNOSTICS?V BNE 40$ ;IF NE NOS/ MOV #DIAG,CKSM2(R4) ;CREATE NEXT CHECKSUM WORDP. MOVB #DIAG,@DBUF(R4) ;SEND DIAGNOST00Nd-dibjbkb a a aIC OP CODE BR 140$ ;CONTINUE OPERATION4540$: CMP #IO.BLS!IQ.UMD,I.FCN(R1) ;POSITION FUNCTION?E BNE 60$ ;IF NE NO 0 MOV #POSIT,CKSM2(R4) ;CREATE NEXT CHECKSUM WORD$ MOVB #POSIT,@DBUF(R4) ;SEND OP CODE BR 140$ ;CONTINUEI760$: CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL BLOCK?A BNE 72$ ; IF NO NER/ MOV #READ,CKSM2(R4) ;CREATE NEXT CHECKSUM WORDM' MOVB #READ,@DBUF(R4) ;SEND READ OPCODE BR 110$ ;CONTINUE872$: CMPB #IO.WLB/256.,I.FCN+1(R1); WRITE LOGICAL BLOCK? BEQ 100$ ;IF EQ YESG MOV (SP)+,R1 ;RESTORE R1C3 CALL @FORK ;ENSURE PRIORITY=0 AND REGISTERS SAVED * MOV #IE.IFC&377,R0 ;ILLEGAL FUNCTION CODE- CLR CKSM2(R4) ;CLEAR BYTES TRANSFERRED COUNTD JMP IOCMP ;EXITF5100$: MOV #WRITE,CKSM2(R4) ;CREATE NEXT CHECKSUM WORD.) MOVB #WRITE,@DBUF(R4) ;SEND WRITE OPCODE.110$: BITB #US.WCK,U.STS(R5) ;WRITE CHECK SET? BNE 141$H- CMPB #20,I.FCN(R1) ;IS WLC OR RLC REQUESTED?O BNE 140$ ;IF NE NO BR 141$;C<; SEND A MODIFIER BYTE OF ONE FOR WRITECHECKS AND READCHECKS;F+CFOUA: MOVB #1,CKSM2+1(R4) ;ALTER CHECKSUM F! MOVB #1,@DBUF(R4) ;SEND MODIFIERR/ ADD #2,RADD(R4) ;SKIP OVER NEXT RETURN ADDRESSO BR 160$ ;CONTINUEL4140$: ADD #2,RADD(R4) ;SKIP OVER NEXT RETURN ADDRESS141$: MOV (SP)+,R1 ;RESTORE R1< MOV CKSM2(R4),WORD1(R4) ;STORE OP CODE AND COMMAND MODIFIER145$: JMP SMSG;K3; SEND A MODIFIER BYTE OF ZERO FOR READS AND WRITES.;($CFOUB: CLRB @DBUF(R4) ;SEND MODIFIER'160$: CALL CHKPT ;CHECKSUM CALCULATIOND BR 145$,CFIV: MOVB U.UNIT(R5),@DBUF(R4) ;SEND UNIT # MOVB U.UNIT(R5),CKSM2(R4) BR 145$(CSIX: BITB #NTU58,FLGTYP(R4) ;OLD TU58 ? BEQ 162$ ;YES;; MOVB #FLCTL,@DBUF(R4); SET FLOW CONTROL BIT IN SWITCH WORDD0 MOVB #FLCTL,CKSM2+1(R4); KEEP TRACK OF CHECKSUM BR 160$ ;1162$: CLRB @DBUF(R4) ; SEND 0R CLRB CKSM2+1(R4)D BR 160$CSEV:I)CEIG: CLRB @DBUF(R4) ;SEND TWO ZERO BYTES  BR 145$1CNIN: CALL IOPKT ;STORE I/O PACKET ADDRESS IN R1 # ADD #I.PRM,R1 ;POINT TO PARAMETERSE, MOV (R1)+,U.BUF(R5) ;INSERT RELOCATION BIAS- MOV (R1)+,U.BUF+2(R5) ;INSERT BUFFER ADDRESSC$ MOV (R1),CKSM2(R4) ;CREATE CHECKSUM) MOVB (R1),@DBUF(R4) ;SEND LOW BYTE COUNTM BR 141$;B; NOTE:E;L>; THE TU58 REQUIRES THAT THE NUMBER OF BYTES TO BE TRANSFERRED?; BE EVEN AND THAT THE STARTING ADDRESS OF THE DATA TRANSFER BEC; ON A WORD BOUNDARY.6;CTWE: ;SEND HIGH BLOCK NO.6CTEN: MOVB CKSM2+1(R4),@DBUF(R4) ;SEND HIGH BYTE COUNT BR 160$.CELE: CALL IOPKT ;STORE I/O PKT ADDRESS IN R10 MOVB I.PRM+12(R1),@DBUF(R4) ;SEND LOW BLOCK NO. MOV I.PRM+12(R1),CKSM2(R4)E BR 141$1CTHI: MOVB CKSM1(R4),@DBUF(R4) ;SEND LOW CHECKSUMV BR 145$4CFOR: MOVB CKSM1+1(R4),@DBUF(R4) ;SEND HIGH CHECKSUM;5; AFTER THE COMMAND PACKET IS SENT THE TU58 RESPONDS.S2; ITS RESPONSE DEPENDS ON THE OPERATION REQUESTED.6; A CONTINUE IS SENT IN RESPONSE TO A WRITE, THE FIRST3; DATA PACKET IS SENT IN RESPONSE TO A READ, AND ANF3; END PACKET IS SENT IN RESPONSE TO A DIAGNOSTIC ORT6; POSITION COMMAND. ALSO AN END PACKET MAY BE RECEIVED1; ON A FAILURE TO READ THE FIRST RECORD PROPERLY.4;:; DETERMINE THE APPROPRIATE INITIAL RESPONSE FROM THE TU58+; AND RECEIVE THE FIRST BYTE FROM THE TU58.;;D& INCB FLAG+1(R4) ;SET FLAG FOR RECEIVE. SUB #DDXBF-DDRBF,DBUF(R4) ;SET RECEIVE BUFFER* BR 25$ ;READ THE RESPONSE BYTE FROM TU58.CFIF: CALL IOPKT ;STORE I/O PKT ADDRESS IN R1+ CMPB #IO.DGN/256.,I.FCN+1(R1) ;DIAGNOSTIC?A BEQ 170$ ;IF EQ YEST) JMP DPACK ;ELSE DATA PACKET OR CONTINUEO170$: MOV (SP)+,R1 ;RESTORE R1# BR ENDP ;DO END PACKET PROCESSING ;D; DETERMINE TU58 TYPE COMMAND; 8TYPTHR: MOV #TYPU58,CKSM2(R4); CREATE NEXT CHECKSUM WORD. MOVB #TYPU58,@DBUF(R4); SEND TU58 TYPE OPCODE JMP 145$ ;PREPARE TO SEND BYTEBTYPSIX: MOVB #FLCTL,@DBUF(R4); SET FLOW CONTROL BIT IN SWITCH BYTE) MOVB #FLCTL,CKSM2+1(R4); CREATE CHECKSUMI JMP 160$ ; CREATE CHECKSUM9TYPSEV: CLRB @DBUF(R4) ; NOT IMPORTANT FOR COMMAND PACKET0! 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 NE00Nddc__DATADATADATADATAW TU58 BR 206$ ; FLUSH END PACKET4200$: CMPB RDAT(R4),#DATA ; DATA PACKET - OLD TU58 ?$ BEQ 204$ ; YES - FLUSH DATA PACKET JMP NTRY ; RETRY9204$: BIS #CHKDON,FLGTYP(R4); TU58 TYPE CHECK IS COMPLETEE, JMP NTRY1 ;FLUSH DATA PACKET BY DOING INIT<206$: ADD #DDXBF-DDRBF,DBUF(R4); POINT TO TRANSMITTER BUFFER JMP SMSG ; SEND A CONTINUE4TYPSXT: JMP RMSG ; FLUSH THE REST OF THE END PACKET>TYPSVT: ADD #DDXBF-DDRBF,DBUF(R4); POINT TO TRANSMITTER BUFFER! JMP RINI1 ; NEW TU58 - USE MRSPE;L:; RECEIVE AND MANIPULATE THE TU58'S END PACKET INFORMATION;48ENDP: MOV #ETAB-2,RADD(R4) ;POINT TO END PACKET SEQUENCE) CMPB RDAT(R4),#CNTL ;COMMAND/END PACKET?I BR 24$,;TA; AT EONE WE SHOULD HAVE RECEIVED THE BYTE COUNT OF AN END PACKETT; WHICH IS ALWAYS EQUAL TO 10.;R)EONE: CMPB RDAT(R4),#10. ;BYTE COUNT=10.?J24$: BEQ 25$ ;IF EQ YES JMP NTRY ;25$: JMP RMSG ;READ A BYTE -ETWO: CMPB RDAT(R4),#100 ;OP CODE=END PACKET?P BR 24$R1ETHR: MOVB RDAT(R4),CKSM1(R4) ;STORE SUCCESS CODEE MOVB RDAT(R4),WORD2(R4) ; BR 25$ ;2EFOU: MOVB RDAT(R4),WORD2+1(R4) ;STORE UNIT SELECTEFIV: ;DUMP BYTESESIX:U ESEV: BR 25$@EEIG: MOVB RDAT(R4),CKSM2(R4) ;STORE BYTE TRANSFERRED COUNT -LOW MOVB RDAT(R4),WORD3(R4) ; BR 25$NCENIN: MOVB RDAT(R4),CKSM2+1(R4) ;STORE BYTE TRANSFERRED COUNT -HIGH, MOVB RDAT(R4),WORD3+1(R4) ;ETEN: EELE:YETWE: BR 25$ ;DUMP BYTESR8ETHI: CALL @FORK ;ENSURE PRIORITY=0 AND REGISTERS SAVED# MOV #IS.SUC&377,R0 ;ASSUME SUCCESS4 TSTB CKSM1(R4) ;SUCCESSFUL?' BGT ERRPT ;IF GT YES, BUT HAD RETRIES;$ BEQ ENDOP ;IF EQ, COMPLETE SUCCESS, MOV #IE.DNR&377,R0 ;ASSUME DEVICE NOT READY- CMPB CKSM1(R4),#-9. ;CARTRIDGE NOT IN PLACE?O 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? BEQ ERRPT ;IF EQ YES/ MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERROR7%ERRPT: CALL LOGERR ;LOG DEVICE ERRORS BR ENDOP ;;+; **-LOGERR-LOG DEVICE ERROR; **-LOGTMO-LOG DEVICE TIMEOUT;S;EB; ALLOCATE A CORE BLOCK, FILL IT WITH THE APPROPRIATE INFORMATION,?; CALL THE EXECUTIVE ERROR LOGGING ROUTINE, DEALLOCATE THE COREK'; BLOCK, AND RETURN BACK TO THE CALLER.(; ;; IF FOR ANY REASON THE CORE BLOCK CANNOT BE ALLOCATED THEN 8; THE EXECUTIVE ERROR LOGGING ROUTINE WILL NOT BE CALLED;; AND THE ERROR SEQUENCE NUMBER WILL BE UPDATED TO INDICATEM); THAT A MISSED ERROR CONDITION OCCURRED. ;-&LOGERR: MOV R0,-(SP) ;SAVE STATUS CODE% MOV DVERR,-(SP) ;TO LOG DEVICE ERROR BR 70$ ;&LOGTMO: MOV R0,-(SP) ;SAVE STATUS CODE' MOV DTOER,-(SP) ;TO LOG DEVICE TIMEOUT 170$: MOV #DDNUM*2,R1 ;NUMBER OF BYTES TO ALLOCATEE$ CALL @ALOCB ;ALLOCATE A CORE BLOCK$ BCC 80$ ;IF CC BLOCK WAS ALLOCATED4 TST (SP)+ ; POP CO-ROUTINE ADDRESS THAT WAS PUT ON/ INC @ERRSQ ;INDICATE A MISSED ERROR CONDITION  BR 90$ ;END I/O ROUTINEE)80$: MOV R0,R1 ;COPY CORE BUFFER POINTERS& MOV DBUF(R4),R3 ;STORE BUFFER ADDRESS TST -(R3) ;POINT TO DL11 CSR8 MOV (R3)+,(R1)+ ;MOVE DL11 RECEIVE CSR INTO CORE BUFFER( MOV (R3)+,(R1)+ ;...DL11 RECEIVE BUFFER* MOV (R3)+,(R1)+ ;... DL11 TRANSMITTER CSR1 MOV WORD1(R4),(R1)+ ;OPCODE AND COMMAND MODIFIER 2 MOV WORD2(R4),(R1)+ ;SUCCESS CODE AND UNIT SELECT7 MOV WORD3(R4),(R1) ;BYTE COUNT LOW AND BYTE COUNT HIGHA" MOV R4,R3 ;SAVE CONTROLLER INDEX" MOV U.SCB(R5),R4 ;GET SCB ADDRESS) MOV R0,R2 ;SET WITH CORE BUFFER POINTERO) CALL @(SP)+ ;CALL ERROR LOGGING ROUTINE ( MOV R2,R0 ;RESTORE CORE BUFFER POINTER% MOV R3,R4 ;RESTORE CONTROLLER INDEXV3 MOV #DDNUM*2,R1 ;GET NUMBER OF BYTES TO DEALLOCATEE$ CALL @DEACB ;DEALLOCATE CORE BLOCK*90$: MOV (SP)+,R0 ;RESTORE I/O STATUS CODE RETURNMENDOP: CALL IOPKTW+ CMPB #IO.DGN/256.,I.FCN+1(R1) ;DIAGNOSTIC? BNE 95$ ;IF NE NOB4 MOV I.PRM+14(R1),@KISR6 ;SET BUFFER RELOCATION BIAS1 MOV I.PRM+16(R1),R0 ;GET REGISTER BUFFER ADDRESSS1 MOV DBUF(R4),R3 ;GET DL11 RECEIVE BUFFER ADDRESS & TST -(R3) ;POINT TO REC. CSR ADDRESS5 MOV (R3)+,(R0)+ ;MOV REC. CSR CONTENTS 00Nd-dibjbkb a a aTO USER BUFF.S( MOV (R3)+,(R0)+ ;MOV REC. BUFF CONTENTS) MOV (R3)+,(R0)+ ;MOV TRANS. CSR CONTENTSD* MOV (R3)+,(R0)+ ;MOV TRANS. BUFF CONTENTS- MOV CKSM1(R4),(R0) ;MOV TU58 END PACKET INFO:0 MOV #IS.SUC&377,R0 ;STORE I/O COMPLETION STATUS95$: TST (SP)+ ;RESTORE STACK;V/; COMMON EXIT CODE-ALL OPERATIONS COMPLETE HERE;V7IOCMP: MOV CKSM2(R4),R1 ;PICKUP BYTES TRANSFERRED COUNT(1XIT: MOVB U.CW2+1(R5),R2 ;STORE FINAL RETRY COUNT)/ BIS #RTRY*^D<256>,R2 ;MERGE INTIAL RETRY COUNTO CALL @IODON JMP DDINI ;NEXT I/O PACKET .DSABL LSB ;.B; WE ENTER HERE WHEN AN UNEXPECTED AND UNDESIRED BYTE IS RECEIVED.?; THE TU58 IS REINITIALIZED AND IF THE RETRY COUNT IS => 0, THE A; I/O FUNCTION IS STARTED OVER. OTHERWISE, AN ERROR IS LOGGED AND; THE OPERATION IS ABORTED.K;V .ENABL LSBI-NTRY: DECB U.CW2+1(R5) ;DECREMENT RETRY COUNT:=NTRY1: ADD #DDXBF-DDRBF,DBUF(R4); POINT TO TRANSMITTER BUFFER.;+;; TINIT TRIES TO REINITIALIZE THE TU58. IT WILL ATTEMPT THER:; INITIALIZATION ROUTINE OF SENDING BREAK, CLEARING BREAK,/; SENDING TWO INIT'S, AND RECEIVING A CONTINUE. ;XATINIT: CLR FLAG(R4) ;SET FOR TRANSMIT WITH NO USER DATA TRANSFER 0 MOV #ITAB-2,RADD(R4) ;POINT TO INITIALIZE TABLE BR 50$ ;WAIT R;T;; NULL TIMING CHARACTERS ARE SENT AT IONE AND ITWO TO ALLOWK>; ENOUGH TIME FOR THE BREAK BIT TO CAUSE A FRAMING ERROR. THIS3; SIGNALS THE TU58 TO STOP TRANSMITTING AND LISTEN.I;R0IONE: MOV DBUF(R4),CKSM1(R4) ;TEMP. STORE BUFFER* SUB #DDXBF-DDXCS,CKSM1(R4) ;POINT TO XCSR( BIS #BRK,@CKSM1(R4) ;SEND BREAK TO TU58ITWOA: ;SEND TIMING NULLSITWOB:ITWOC:ITWOD:(ITWOE: CLRB @DBUF(R4) ;SEND ANOTHER NULL50$: JMP SMSG ;WAIT;8; ITHR AND IFOU WILL CLEAR THE BREAK CONDITION AND ISSUE<; TWO INITIALIZE COMMANDS TO THE TU58. (THE FIRST IS IGNORED; BY THE CONTROLLER).T; &ITHR: BIC #BRK,@CKSM1(R4) ;CLEAR BREAK5 SUB #DDXCS-DDRBF,CKSM1(R4) ;TEMP. STORE REC. BUFFERI# TSTB @CKSM1(R4) ;DUMP REC. BUFFERR.IFOU: MOVB #INIT,@DBUF(R4) ;SEND ANOTHER INIT. BR 50$ ;WAIT R;B:; A CHARACTER IS RECEIVED AT ISIX. IF IT IS A CONTINUE, WE+; HAVE SUCCESSFULLY INITIALIZED THE DEVICE. ;U4IFIV: SUB #DDXBF-DDRBF,DBUF(R4) ;POINT TO REC. BUFF.& INCB FLAG+1(R4) ;SET FLAG FOR RECEIVE7 BISB #TU58C,FLGTYP(R4) ; TU58 MUST SEND A CONTINUE NOWH JMP RMSG ;WAIT.ISIX: ADD #DDXBF-DDRBF,DBUF(R4) ;POINT TO XBUFA BICB #TU58C,FLGTYP(R4) ; TU58 CONTINUE ALREADY SENT - CLEAR FLAG. TSTB U.CW2+1(R5) ;RETRY?  BGT 60$ ;IF GT YES3 CALL @FORK ;ENSURE PRIORITY=0 AND REGISTERS SAVED MOV #IE.FHE&377,R0 ;FATAL ERROR) CLR CKSM2(R4) ;CLEAR BYTE TRANSFER COUNTA# MOV #200,CKSM1(R4) ;SET ERROR CODEE0 SUB #DDXBF-DDRBF,DBUF(R4) ;POINT TO REC. BUFFER JMP ERRPT ;ERROR LOG AND EXIT '60$: BITB #NTU58,FLGTYP(R4); NEW TU58 ?  BNE 62$ ;YES5 BITB #CHKDON,FLGTYP(R4); COMPLETED TU58 TYPE CHECK ?R$ BNE 62$ ;YES - IT MUST BE OLD TU58' JMP RINI ;DETERMINE TU58 TYPE - RETRYT,62$: JMP RINI1 ;SEND COMMAND PACKET - RETRY;6<; HERE DATA PACKETS SENT BY THE TU58 ARE READ. THE NUMBER OF<; DATA BYTES IN THE PACKET IS RECEIVED AT RONE. IT IS STORED<; IN LOCATION FLAG AND THE CHECKSUM IS INITIALIZED. THE DATA;; IS TRANSFERRED WITHIN THE INTERRUPT SERVICE ROUTINE WHERE ;; THE CHECKSUM IS ALSO VERIFIED. THE FIRST BYTE OF THE NEXT ;; PACKET IS RECEIVED AT RFOU AND IF IT IS A DATA FLAG, THISP; CODE IS ENTERED AGAIN.;I+DPACK: CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ?8" BNE 102$ ;IF NE NO -IT'S A WRITE MOV (SP)+,R1 ;RESTORE R16'RFOU: CMPB RDAT(R4),#DATA ;DATA PACKET?E BEQ 96$ ;IF EQ YES 94$: JMP ENDP )96$: MOVB #DATA,CKSM1(R4) ;START CHECKSUMD* MOV #RTAB-2,RADD(R4) ;POINT TO READ TABLE BR 100$ ;READ A BYTE.RONE: MOVB RDAT(R4),FLAG(R4) ;STORE BYTE COUNT= MOVB RDAT(R4),CKSM1+1(R4) ;STORE HIGH BYTE OF FIRST CHECKSUME100$: JMP RMSG; 2; AT THIS POINT WE SEND A DATA PACKET TO THE TU58.8; THE DATA FLAG BYTE IS SENT AT TONE. THE NUMBER OF DATA4; BYTES IN THIS PACKET IS SENT AT TTWO. DATA IS THEN:; TRANSFERRED ALONG WITH THE CHECKSUM WITHIN THE INTERRUPT9; SERVICE ROUTINE. RETURN TO THIS SEGMENT IS MADE AT TFIVT600Nddc__DATADATADATADATA; AND THE FIRST BYTE OF THE NEXT PACKET IS RECEIVED AT3; TSIX, IF IT IS A CONTINUE ANOTHER PACKET IS SENT.R6; WHEN THE TU-58 HAS RECEIVED ALL THE DATA IT SENDS AN9; END PACKET FLAG INSTEAD OF A CONTINUE (THIS ALSO OCCURS4; IF THE TU58 ENCOUNTERS AN ERROR WRITING THE DATA).; 4102$: MOV I.PRM+4(R1),WCNT(R4) ;DUPLICATE BYTE COUNT MOV (SP)+,R1 ;RESTORE R1 FTSIX: BICB #TU58C,FLGTYP(R4) ; TU58 ALREADY SENT CONTINUE - CLEAR FLAG& CMPB RDAT(R4),#CONT ; CONTINUE FLAG ? BNE 94$ ;IF NE NOM6 MOV #TTAB-2,RADD(R4) ;POINT TO TRANSMIT (WRITE) TABLE# CLRB FLAG+1(R4) ;SET TRANSMIT FLAGI/ ADD #DDXBF-DDRBF,DBUF(R4) ;SET TRANSMIT BUFFERS% BR 130$ ;PREPARE TO SEND FIRST BYTEN*TONE: MOVB #DATA,@DBUF(R4) ;SEND FLAG BYTE% MOVB #DATA,CKSM1(R4) ;START CHECKSUM - CMP #128.,WCNT(R4) ;MORE THAN 1 PACKET LEFT?( BLO 120$ ;IF L0 YES =125$: MOVB WCNT(R4),CKSM1+1(R4) ;CREATE HIGH BYTE OF CHECKSUMP) CLRB WCNT(R4) ;ZERO REMAINING BYTE COUNTL BR 130$:120$: MOVB #128.,CKSM1+1(R4) ;CREATE HIGH BYTE OF CHECKSUM, SUB #128.,WCNT(R4) ;ADJUST REMAINING COUNT130$: JMP SMSG1TTWO: MOVB CKSM1+1(R4),@DBUF(R4) ;SEND BYTE COUNTR2 MOVB CKSM1+1(R4),FLAG(R4) ;SET UP FLAG BYTE COUNT BR 130$'TFIV: INCB FLAG+1(R4) ;SET RECEIVE BYTE . 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 LSB ;E%; IOPKT PUTS I/O PACKET ADDRESS IN R1R;; ; OUTPUT:I;B; R1 = I/O PACKET ADDRESS ;; (SP) = FORMER CONTENTS OF R1 TO BE RESTORED BY THE CALLER2;W.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 R4S3 JMP @WCNT(R4) ;NOTE R1 WILL BE RESTORED BY PROGRAMT;C>; RTBK (RETURN BACK) INCREMENTS THE RETURN ADDRESS POINTER AND; THEN JUMPS THERE.S;-RTBK: ADD #2,RADD(R4) ;POINT TO NEXT LOCATION= MOV @RADD(R4),-(SP) ;MOVE RETURN ADDRESS LOCATION ONTO STACKT( JMP @(SP)+ ;RETURN TO ADDRESS IN TABLE;9; THIS ROUTINE IS JUMPED TO IN ORDER TO SEND INFORMATION.P>; THE MAIN PROGRAM CONTINUES VIA THE INTERRUPT SERVICE ROUTINE@; CODE (SPT), UNLESS WRITE DATA IS TO BE TRANSFERRED (DATA COUNT; FLAG = NON-ZERO).P;C .ENABL LSBR-SMSG: SUB #DDXBF-DDXCS,DBUF(R4) ;POINT TO CSRU* BIT #TRDY,@DBUF(R4) ;IS TRANSMITTER READY BEQ 20$0SREC: ADD #DDXBF-DDXCS,DBUF(R4) ;POINT TO BUFFER# BITB #NTU58,FLGTYP(R4); NEW TU58 ?- BEQ 16$ ;NOR7 BITB #TRNACK,FLGTYP(R4) ; ACK CHAR FOR NEW TU58 MRSP ?D BEQ 16$ ; NO0 MOVB #CONT,@DBUF(R4) ;MUST BE READING FROM TU58) ;ACK TU58 THAT CHAR HAS BEEN RECEIVEDV3 BICB #TRNACK,FLGTYP(R4); COMPLETED THE ACKNOWLEDGES& JMP RPT1 ;PROCESS THE CHAR JUST READ16$: TSTB FLAG(R4) ;BYTE COUNT 0 BEQ RTBK ;IF EQ YESX" JMP SPT ;GO TO SEND DATA ROUTINE.20$: BIS #S2.ACT,S.ST2(R4) ;SET I/O ACTIVE BIT- BIS #TIE,@DBUF(R4) ;SET TRANS. INTER. ENABLEU$ MOV U.SCB(R5),R4 ;STORE SCB ADDRESS& MOVB S.ITM(R4),S.CTM(R4) ;SET TIMEOUT RETURNA .DSABL LSBE;U?; THIS ROUTINE IS JUMPED TO IN ORDER TO RECEIVE INFORMATION VIAG>; THE DL11. IF RECEIVER DONE IS SET, THEN A RETURN TO THE MAIN?; PROGRAM IS INITIATED VIA THE INTERRUPT SERVICE ROUTINE (RPT). =; IF THE DL11 DONE BIT IS CLEAR, A RETURN IS EXECUTED AND THEB>; 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.); .ENABL LSBD-RMSG: SUB #DDRBF-DDRCS,DBUF(R4) ;POINT TO CSRR" BIT #RDONE,@DBUF(R4) ;BYTE READY? BEQ 20$ ;IF EQ NOO)RREC: JMP RPT ;IF YES ENTER READ ROUTINE120$: BIS #S2.ACT,S.ST2(R4) ;. BIS #RIE,@DBUF(R4) ;SET REC. INTERRUPT ENABLE& MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESS! MOVB #40.,S.CTM(R4) ;SET TIMEOUTA RETURNS .DSABL LSB ;B; CHKPT CREATES A CHECKSUM;I; INPUT:;T; CKSM2(R4) = WORD TO BE ADDED; CKSM1(R4) = OLD CHECKSUM;D ; OUTPUT:E;; CKSM1(R4) = NEW CHECKSUM;F-CHKPT: ADD CKSM2(R4),CKSM1(R4) ;ADD TWO WORDSD ADC CKSM1(R4) ;ADD CARRYT ;FALL THROUGH TO RETURN?;B; 00Nd-dibjbkb a a aEND LOCAL ROUTINES; ;+; DDCAN-CANCEL I/O ENTRY POINT2; CANCEL I/O IS A NOP FOR FILE STRUCTURED DEVICES.;- DDCAN: RETURN ;+,; **-DDKRB-CONTROLLER ONLINE/OFFLINE ROUTINE;4&DDKRB: BCS 20$ ;IF CS OFFLINE REQUEST TST EXEVEC ;IF DONE ALREADY  BNE 20$ ;SKIP THIS MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3 MOV KINAR6,-(SP) ;SAVE KINAR6. MOV @#112,R0 ;GET ADDRESS OF TABLE OF ENTRIES: MOV (R0),R0 ;GET ADDRESS OF APR BIAS (1ST WORD IN TABLE)1 MOV (R0),KINAR6 ;MAP COMMON THROUGH I-SPACE APR6A MOV #EXEVEC,R3 ;POINT TO VECTOR) MOV #EXEVCL,R2 ;SPECIFY LENGTH OF VECTOR $ CALL @#140004 ;TRANSLATE THE VECTOR! MOV (SP)+,KINAR6 ;RESTORE KINAR6  MOV (SP)+,R3 ;RESTORE R3 MOV (SP)+,R2 ;RESTORE R2I 20$: RETURNT;+3; POWERFAIL REQUIRES NO OPERATION. REINITIALIZATION(=; OF THE TU58 WILL OCCUR DURING NORMAL OPERATION IF REQUIRED.I;- DDPWF: RETURN ;+&; **-DDUCB-UNIT ONLINE/OFFLINE ROUTINE;- DDUCB: RETURNP;+*; **-$DDINT TU58 INTERRUPT SERVICE ROUTINE;M'; INTERRUPTS ARE ISSUED WHEN EITHER THE %; RECEIVE OR TRANSMIT CSR'S INTERRUPTI#; 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 INFORMATION0; FOR TRANSMITTING. ;- .ENABL LSBS$DDOUT:: ;;;2 INT. ENTRY PTS6 INTSE$ DD,PR4,T$$U58 ;;;SAVE REGISTERS & SET PRIORITY- BIC #,@DBUF(R4) ;;;CLEAR INTERRUPTSU MOV R1,-(SP) ;;;SAVE R1$ MOV U.SCB(R5),R1 ;;;GET SCB ADDRESS CLRB S.CTM(R1) ;;;CLEAR TIMEOUT MOV (SP)+,R1 ;;;RESTORE R1H;E8; FLAG+1 IS SET FOR A TRANSMIT OPERATION AND CLEARED FOR9; A RECEIVE OPERATION. FLAG IS CHECKED TO DETERMINE IF WET; HAVE DATA TO TRANSFER.;T& TSTB FLAG+1(R4) ;;;RECEIVE INTERRUPT? BEQ 3$ ;IF EQUAL NO ; BIT #TRNACK,FLGTYP(R4); IN PROCESS OF ACKNOWLEDGING CHAR ?P) BEQ RPT ;NO -- JUST A RECEIVE INTERRUPT 4 ADD #DDXBF-DDXCS,DBUF(R4); POINT TO TRANSMIT BUFFER1 MOVB #CONT,@DBUF(R4) ;ACK THE CHAR THAT WAS READR3 BICB #TRNACK,FLGTYP(R4); COMPLETED THE ACKNOWLEDGET0 JMP RPT1 ; CONTINUE WITH THE RECEIVE INTERRUPT3$: - ADD #DDXBF-DDXCS,DBUF(R4) ;;;POINT TO BUFFERV' TSTB FLAG(R4) ;;;TRANSMIT DATA PACKET?  BNE SPT ;;;IF NE YES5$: JMP RTBK ;;;ELSE RETURN;;?; SPT IS THE CODE USED TO SEND USER DATA TO THE TU58. A RUNNING4>; CHECKSUM IS KEPT AND IS SENT AS THE LAST TWO CHARACTERS OF A@; DATA PACKET (TTHR,TFOU). AFTER ALL DATA HAS BEEN SENT, CONTROL ; IS PASSED TO THE MAIN PROGRAM.;E2SPT: CALL @GTBYT ;;;PUT USER'S DATA BYTE ON STACK3 BITB #1,FLAG(R4) ;;;CHECK FOR EVEN OR ODD BYTE NO.E+ BNE 20$ ;;;IF NE ODD,THEREFORE HIGH ORDERB ;;;BYTE IN CHECKSUMV5 MOVB (SP)+,CKSM2(R4) ;;;SAVE LOW ORDER CHECKSUM BYTE;* MOVB CKSM2(R4),@DBUF(R4) ;;;TRANSMIT BYTE BR 30$S<20$: MOVB (SP)+,CKSM2+1(R4) ;;;SAVE HIGH ORDER CHECKSUM BYTE, MOVB CKSM2+1(R4),@DBUF(R4) ;;;TRANSMIT BYTE! CALL CHKPT ;;;GENERATE CHECKSUMF*30$: DECB FLAG(R4) ;;;DECREMENT DATA COUNT 35$: JMP SMSGT>TTHR: MOVB CKSM1(R4),@DBUF(R4) ;;;SEND LOW ORDER CHECKSUM BYTE BR 35$8TFOU: MOVB CKSM1+1(R4),@DBUF(R4) ;;;SEND HIGH ORDER BYTE BR 35$I)TFOUA: BITB #NTU58,FLGTYP(R4); NEW TU58 ?  BNE 39$ ; YESV138$: JMP RTBK ; NO - CONTINUE NOT NEEDED FOR RSPH39$: MOVB #CONT,@DBUF(R4) ; SEND CONTINUE AFTER TRANSMITTING DATA PACKET BR 35$ ;; 9; RPT CHECKS FOR AN ERROR CONDITION IN THE DL11'S RECEIVEA:; BUFFER. IF DATA IS TO BE RECEIVED THIS ROUTINE TRANSFERS8; THE CHARACTER IN THE USER'S BUFFER AND KEEPS A RUNNING;; CHECKSUM. AFTER ALL DATA IS RECEIVED, THE FINAL TWO BYTES>; OF THE PACKET ARE PRESENT AT RTWO AND RTHR AND IF THEY EQUAL=; THE CHECKSUM, THEN CONTROL IS RETURNED TO THE MAIN PROGRAM.E;1RPT: ADD #DDRBF-DDRCS,DBUF(R4) ;;;POINT TO BUFFER/ MOV @DBUF(R4),RDAT(R4) ;;;STORE RECEIVED INFO.R BPL 80$ ;;;IF PL NO ERROR540$: JMP NTRY ;;;ATTEMPT RETRYO'80$: BITB #NTU58,FLGTYP(R4); NEW TU58 ?F2 BEQ RPT2 ;NO-DO NOT HAVE TO ACKNOWLEDGE THE DATA@ 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 ?5 BEQ RPT2 ; YES00NdOdc__DATADATADATADATA - THE CONTINUE IS FROM TU58 - NO ACKC682$: BIS #TRNACK,FLGTYP(R4); YES - MUST ACKNOWLEDGE IT4 ADD #DDXBF-DDRBF,DBUF(R4); POINT TO TRANSMIT BUFFER/ JMP SMSG ;NEW TU58-ACKNOWLEDGE CHAR JUST READ8RPT1: SUB #DDXBF-DDRBF,DBUF(R4); POINT TO RECEIVE BUFFER&RPT2: TSTB FLAG(R4) ;;;DATA TO RECEIVE BEQ 5$ ;;;IF EQ NO) MOVB RDAT(R4),-(SP) ;;;PUT DATA ON STACK , CALL @PTBYT ;;;PUT DATA INTO USER'S BUFFER4 BITB #1,FLAG(R4) ;;;ODD OR EVEN BYTE (FOR CHECKSUM)1 BNE 90$ ;;;IF NE ODD (HIGH ORDER CHECKSUM BYTE)-3 MOVB RDAT(R4),CKSM2(R4) ;;;LOW ORDER CHECKSUM BYTEK BR 100$:90$: MOVB RDAT(R4),CKSM2+1(R4) ;;;HIGH ORDER CHECKSUM BYTE CALL CHKPTI+100$: DECB FLAG(R4) ;;;DECREMENT DATA COUNTA BR 160$;RTWO: MOVB RDAT(R4),CKSM2(R4) ;;;RECEIVE LOW ORDER CHECKSUM BR 160$6RTHR: MOVB RDAT(R4),CKSM2+1(R4) ;;;RECEIVE HIGH ORDER 2 CMP CKSM1(R4),CKSM2(R4) ;;;ARE CHECKSUMS CORRECT? BNE 40$1160$: JMP RMSG ;;;READ FIRST BYTE OF NEXT PACKET .DSABL LSBR;+:; TIMEOUT IS ENTERED WHEN THE DL11 DOES NOT RESPOND WITHIN9; A CERTAIN PRESET TIME TO THE SUBROUTINES SMSG AND RMSG05; SETTING INTERRUPT ENABLE AND ISSUING A RETURN. THISU3; INDICATES A HARDWARE FAILURE OF THE DL11 OR TU58.T;-DDOUT:3 BIC #,@DBUF(R3) ;;;CLEAR INTERRUPT ENABLEL" MOV R3,R4 ;COPY CONTROLLER INDEX$ TSTB FLAG+1(R4) ; RECEIVE TIMEOUT ? BNE 2$ ; YES61$: SUB #DDXBF-DDXCS,DBUF(R4); POINT TO RECEIVE BUFFER BR 6$ ; 32$: BIT #TRNACK,FLGTYP(R4);IN PROCESS OF ACK CHAR ?R& BEQ 4$ ; NO - JUST A RECEIVE TIMEOUT0 BIC #TRNACK,FLGTYP(R4);CLEAR MUST ACK CHAR FLAG BR 1$ ;R64$: ADD #DDRBF-DDRCS,DBUF(R4); POINT TO RECEIVE BUFFER$6$: CALL LOGTMO ; LOG TIMEOUT ERROR# MOV R4,R3 ; COPY CONTROLLER INDEXT7 ADD #DDXBF-DDRBF,DBUF(R4); POINT TO TRANSMITTER BUFFERT( DECB U.CW2+1(R5) ;DECREMENT RETRY COUNT! BLE 10$ ;IF LE, NO RETRIES LEFTO JMP TINIT ;RE-INIT AND RETRY010$: CLR CKSM2(R3) ;CLEAR BYTE TRANSFERRED COUNT" MOV #IE.TMO&377,R0 ;TIMEOUT ERROR JMP ENDOP .ENDR& BEQ 4$ ; NO - JUST A RECEIVE TIMEOUT0 BIC #TRNACK,FLGTY .TITLE DXDRVT .IDENT /06.02/B; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ;L;T<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;D; H. J. LEV 16-JAN-75B; P. J. BEZEREDI ; P. J. CARR; ; MODIFIED BY:T;D%; G. MARIGOWDA 4-AUG-86 V06.02T/; GM001 -- CONVERT TO USE EXEC VECTORINGR;;P!; RX01 - RX11 FLOPPY DISK DRIVER ;T; FUNCTIONS RECOGNIZED:#<; IO.RPB - READ PHYSICAL BLOCK (MAY READ ANY SECTOR ON DISK)>; IO.WPB - WRITE PHYSICAL BLOCK (MAY WRITE ANY SECTOR ON DISK)8; IO.WDD - WRITE DELETED DATA - WRITE ANY SECTOR ON DISK3; SETTING THE DELETED DATA MARK IN SECTOR HEADERH=; THE FOLLOWING TWO FUNCTION CODES OPERATE ON 256 WORD BLOCKSE;; OF DATA (4 SECTORS) THE DRIVER AUTOMATICALLY INTERLEAVESA4; AND SKEWS SECTORS TO OPTIMIZE THE TRANSFER OF DATA7; SO THAT A LONG READ/WRITE MAY BE DONE WITHOUT LOOSINGD7; A REVOLUTION OF THE DISK. THE INTERLEAVE FACTOR IS 2S; AND THE SKEW FACTOR IS 6.O,; IO.RLB - READ LOGICAL BLOCKS OF 256. WORDS.; IO.WLB - WRITE LOGICAL BLOCKS OF 256. WORDS.;T8; IF DELETED DATA IS READ, THE STATUS CODE RETURNED WILL#; BE IS.RDD, OTHERWISE IT IS IS.SUC ;L# .MCALL HWDDF$,PKTDF$,QIOSY$,SCBDF$ % HWDDF$ ; DEFINE HARDWARE REGISTERSE% PKTDF$ ; DEFINE I/O PACKET OFFSETSN QIOSY$E SCBDF$ ,,SYSDEF; ; EQUATED SYMBOLS ;TRETRY = 8. ; ERROR RETRY COUNTI-DXNUM = 4 ; NUMBER OF REGISTERS TO ERROR LOGE;R2; RX11 DEVICE REGISTER OFFSETS AND BIT DEFINITIONS;R#RXCS = 0 ; CONTROL STATUS REGISTERRXDB = 2 ; DATA BUFFERBUNIT = 20 ; UNIT SELECT BITDONE = 40 ; RX11 DONE INTEBL = 100 ; INTERRUPT ENABLE.TR = 200 ; RX11 TRANSFER READY BIT (CPU-SILO)INIT = 40000 ; INITIALIZE RX11D; ; FUNCTION CODES;IGO = 1 ; GO BITFILL = 0+GO ; FILL SILOEMPTY = 2+GO ; EMPTY SILOWRITE = 4+GO ; WRITE A SECTORREAD = 6+GO ; READ A SECTORRDSTS = 12+GO ; READ STATUS#WRTDD = 14+GO ; WRITE DELETED DAT00Od-dibjbkb a a aAD RDERC = 16+GO ; READ ERROR CODE;O!; STATUS REGISTER BIT DEFINITIONSS;GDD = 100 ; DELETED DATA READRDY = 200 ; UNIT READYB;O ; LOCAL DATA;O;H; CONTROLLER TABLE AND RETRY COUNT TABLE ( INDEXED BY CONTROLLER NUMBER);L9RTTBL: .BLKW R$$X11 ; ERROR RETRY COUNT FOR CURRENT UNITS$CSRSV: .BLKW R$$X11 ; CSR SAVE AREA;L; MAKE GTPKT$ A LOCAL MACRO ;O( .MACRO GTPKT$ DEV,NCTRLR,ADDR,UCBSV,SUC CALL @GTPKT .IF B BCC 65535$  RETURNR65535$:G .IFFI BCS ADDRD .ENDC .IF B  $$$=0 .IF B .IF EQ $$$S MOV R5,S.OWN(R4)S .ENDC .ENDC .IFFE .IF GT NCTRLR-1 MOV R5,UCBSV(R3)D .IFFO MOV R5,UCBSV .ENDC .ENDC .ENDM;A$; EXECUTIVE ENTRY POINT VECTOR TABLE;L1EXEVEC: .WORD 0 ; FLAG FOR VECTOR NOT YET FILLEDCALOCB: .WORD $ALOCBBMSET: .WORD $BMSET;DEACB: .WORD $DEACB DTOER: .WORD $DTOERADVERR: .WORD $DVERRKERRSQ: .WORD $ERRSQBFORK: .WORD $FORKTGTPKT: .WORD $GTPKTCIODON: .WORD $IODON5VOLVD: .WORD $VOLVDA;DKISR6: .WORD KISAR6S;EXEVCL=<<<.-EXEVEC>/2>-1>E;$;; DRIVER DISPATCH TABLEC;./ DDT$ DX,R$$X11,,,,NEW ;GENERATE DISPATCH TABLED;+/; *** - DXINI FLOPPY DISK CONTROLLER INITIATOR ;CD; THIS ROUTINE IS ENTERED FROM THE QIO DIRECTIVE WHEN AN I/O REQUESTG; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPOGATE THEOD; EXECUTION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY,E; THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST. OTHERWISEH; A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSF; THE NEXT I/O OPERATION IS INITIATED. A RETURN TO THE CALLER IS THEN ; EXECUTED. ;L ; INPUTS: B; R5 - ADDRESS OF UCB WHICH IS ASSOCIATED WITH CONTROLLER TO BE IN;N ; OUTPUTS:<; IF THE CONTROLLER ASSOCIATED WITH THE SPECIFIED UCB IS NOTA; BUSY AND AN I/O REQUEST IS WAITING TO BE PROCESSED, THE REQUESTE>; IS DEQUEUED AND THE DRIVER INITIATES THE REQUESTED FUNCTION.;P;- .ENABL LSBE8DXINI: GTPKT$ DX,R$$X11 ; GET NEXT I/O PACKET TO PROCESS;I0; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT; ; R1 - ADDRESS OF THE I/O PACKET@; R2 - PHYSICAL UNIT NUMBER OF THE DEVICE TO PERFORM FUNCTION ON*; R3 - CONTROLLER NUMBER MULTIPLIED BY TWO; R4 - ADDRESS OF SCB7; R5 - ADDRESS OF UCB FOR DEVICE TO PERFORM FUNCTION ONF; ,; RX11 FLOPPY DISK I/O REQUEST PACKET FORMAT;T!; WD. 00 -- I/O QUEUE THREAD WORDD/; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBERN1; WD. 02 -- ADDRESS OF TCB OF THE REQUESTING TASK1A; WD. 03 -- POINTER TO SECOND LUN WORD OF REQUESTING TASKS HEADER 5; WD. 04 -- CONTENTS OF FIRST LUN WORD ( UCB ADDRESS)AA; WD. 05 -- I/O FUNCTION CODE (IO.RLB, IO.RPB, IO.WLB, OR IO.WPB) /; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK /; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCKEB; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT +1400002; 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 USED (IGNORED)5; WD. 16 -- LOW BYTE MUST BE ZERO, HIGH BYTE NOT USEDD,; WD. 17 -- LOGICAL OR PHYSICAL BLOCK NUMBER; WD. 20 -- NOT USED;B%; DRIVER USAGE OF WORDS IN I/O PACKETS5; I.PRM+6 (WD. 15) - STATUS REGISTER AFTER INTERRUPT 7; I.PRM+10 (WD. 16) - LOGICAL OR PHYSICAL SECTOR NUMBERP-; I.PRM+12 (WD. 17) - SIZE OF "THIS" TRANSFERF4; I.PRM+14 (WD. 20) - PHYSICAL SECTOR NUMBER (1-26.)3; I.PRM+15 (WD. 20) - PHYSICAL TRACK NUMBER (0-77.)R; ; ; INITIALIZE DRIVER ;T+10$: MOV #RETRY,RTTBL(R3) ; SET RETRY COUNTD% CALL @VOLVD ; VALIDATE VOLUME VALIDE BCS 16$ ; IF CS WE FAILEDA TST R0 ; TRANSFER FUNCTION?D BPL 16$ ; IF PL NO* TSTB I.PRM+10(R1) ; HIGH BLOCK SPECIFIED? BEQ 20$ ; NO15$: JMP 180$ ; YES, ERRORR16$: JMP 210$ ; EXIT6; %; SET UP FIRST BLOCK OR SECTOR NUMBER.;+?20$: MOV I.PRM+12(R1),R0 ; GET PHYSICAL OR LOGICAL BLOCK NUMBERS/ MOV #128.,I.PRM+12(R1) ; PRESET TRANSFER SIZE 7 BITB #IO.RPB&377,I.FCN(R1) ; PHYSICAL BLOCK FUNCTION?E BNE 30$ ; YES#+ A00Oddc__DATADATADATADATASL R0 ; CONVERT TO LOGICAL SECTOR NUMBERL ASL R0 ; WHICH IS LBN*4E#30$: MOV R0,I.PRM+10(R1) ; STORE ITR) MOV #RDSTS,R0 ; GET READ STATUS FUNCTION  TSTB U.UNIT(R5) ; UNIT 1? BEQ 31$ ; IF EQ NO( BIS #UNIT,R0 ; YES, SET UNIT SELECT BIT231$: 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 STATUS( JMP 155$ ; START THE FUNCTION.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 YES)&33$: CALL LOGERR ; LOG UNIT NOT READY3 MOV #IE.DNR&377,R0 ; SET UNIT NOT READY ERROR CODE$ JMP 200$ ; GOOD-BYE!.35$: MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS/ CALL TRKSEC ; CONVERT BLOCK # TO TRACK/SECTOR(" BCS 15$ ; IF CS BAD BLOCK NUMBER& MOV S.CSR(R4),R2 ; GET ADDRESS OF CSR1 CMPB #IO.WLB/256.,I.FCN+1(R3) ; WRITE FUNCTION?  BNE 140$ ;IF NE NO;1; FILL SILO BEFORE WRITE;26 CALL SETBUF ; SET UP BUFFER POINTER AND MAPPING REGI, MOV #FILL,(R2) ; SET "FILL BUFFER" FUNCTION)70$: CLR R3 ; ASSUME NO DATA TO TRANSFERT! DEC R1 ; MORE DATA TO TRANSFER?N BLT 74$ ; NO# MOVB (R0)+,R3 ; YES, GET NEXT BYTE:*74$: BITB #TR!DONE,(R2) ; CONTROLLER DONE? BMI 75$ ; IF MI YES  BEQ 74$ ; IF EQ NO BR 90$ ; SILO IS FULL -75$: MOVB R3,RXDB(R2) ; PUT NEXT BYTE IN SILOF& BR 70$ ; AND WAIT TILL IT'S ACCEPTED$90$: TST R1 ; ALL BYTES TRANSFERED? BMI 130$ ; IF MI YES%95$: JMP DXRTY ; RETRY LAST FUNCTIONE;O; EMPTY SILO AFTER READM;#3100$: MOV #EMPTY,(R2) ; SET "EMPTY BUFFER" FUNCTION;6 CALL SETBUF ; SET BUFFER POINTER AND MAPPING REGISTE+110$: BITB #TR!DONE,(R2) ; CONTROLLER DONE?S BMI 111$ ; IF MI YES BEQ 110$ ; IF EQ NOT BR 120$ ; SILO IS EMPTYF0111$: MOVB RXDB(R2),R3 ; GET NEXT BYTE FROM SILO DEC R1 ; DO WE WANT IT?2 BLT 110$ ; NO & MOVB R3,(R0)+ ; YES, PUT IT IN BUFFER BR 110$ ; GET NEXT BYTEL%120$: TST R1 ; ALL BYTES TRANSFERED?Y BGT 95$ ; IF GT ERRORR* MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS% CALL NXTSEC ; UPDATE TO NEXT SECTORP BNE 35$ ; IF NE CONTINUE JMP 193$ ; FINISHEDI;R); INITIATE TRANSFER BETWEEN SILO AND DISKR;;/130$: MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS1& MOV #WRITE,R0 ; ASSUME WRITE FUNCTION& MOV I.FCN(R3),R1 ; COPY FUNCTION CODE# BIC #7,R1 ; REMOVE QUALIFIER BITS % CMP #IO.WDD,R1 ; WRITE DELETED DATA?; BNE 141$ ; IF NE NO2 MOV #WRTDD,R0 ; SET "WRITE DELETED DATA" FUNCTION BR 141$ ;Y&140$: MOV #READ,R0 ; SET READ FUNCTION141$: TSTB U.UNIT(R5) ; UNIT 1?C BEQ 142$ ; IF EQ YES) BIS #UNIT,R0 ; YES, SET TO SELECT UNIT 1J3142$: MOVB S.CON(R4),R1 ; RETREIVE CONTROLLER INDEX 1 MOV R0,CSRSV(R1) ; SAVE FUNCTION AND UNIT NUMBERO CLRB RTTBL+1(R1) ; RESET FLAGS;% MOV R0,(R2) ; INITIATE THE FUNCTIONR2143$: BITB #TR!DONE,(R2) ; TRANSFER READY OR DONE?! BMI 150$ ; IF MI TRANSFER READYE BEQ 143$ ; IF EQ LOOP;% BR 95$ ; ERROR, NO TRANSFER REQUEST 6150$: MOVB I.PRM+14(R3),RXDB(R2) ; LOAD SECTOR NUMBER2151$: BITB #TR!DONE,(R2) ; TRANSFER READY OR DONE?! BMI 152$ ; IF MI TRANSFER READYN BEQ 151$ ; IF EQ LOOPT% BR 95$ ; ERROR, NO TRANSFER REQUESTR5152$: MOVB I.PRM+15(R3),RXDB(R2) ; LOAD TRACK NUMBERO3155$: MOVB S.ITM(R4),S.CTM(R4) ; SET TIME OUT COUNT' CALL @BMSET ;SET I/O ACTIVE IN BITMAP4* BIS #INTEBL,(R2) ;;; SET INTERRUPT ENABLE;+*; DXKRB-CONTROLLER ONLINE/OFFLINE ROUTINE;;;-%DXKRB: BCS 2$ ;IF CS OFFLINE REQUEST  TST EXEVEC ;IF ALREADY DONE3 BNE 2$ ;SKIP THISC MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3 MOV KINAR6,-(SP) ;SAVE KINAR6. MOV @#112,R0 ;GET ADDRESS OF TABLE OF ENTRIES: MOV (R0),R0 ;GET ADDRESS OF APR BIAS (1ST WORD IN TABLE)1 MOV (R0),KINAR6 ;MAP COMMON THROUGH I-SPACE APR6R MOV #EXEVEC,R3 ;POINT TO VECTOR) MOV #EXEVCL,R2 ;SPECIFY LENGTH OF VECTOR$ CALL @#140004 ;TRANSLATE THE VECTOR! MOV (SP)+,KINAR6 ;RESTORE KINAR6I MOV (SP)+,R3 ;RESTORE R3 MOV (SP)+,R2 ;RESTORE R2N 2$: RETURN ; DXPWF - POWER FAIL ENTRY POINT;; POWER FAIL IS HANDLED BY THE D00Od-dibjbkb a a aEVICE TIMING OUT, THEREFORE ;; NO WNRK IS DNNE HERE. IT WILL BE HANDLED WHEN THE DEVICES; TIME OUT ENTRY IS EXECUTED.,; DXPWF:;O; UNIT STATUS CHANGE ROUTINEDXUCB:;I ; DXCAN - CANCEL I/O ENTRY POINT4; CANCEL I/O IS A NOP OP FOR FILE STRUCTURED DEVICES;SDXCAN: RETURN ;C;+8; *** - $DXINT - RX11 FLOPPY DISK INTERRUPT ENTRY POINT;O;-6 INTSE$ DX,PR5,R$$X11 ;;; GENERATE INTERRUPT SAVE CODE MOV R3,-(SP) ;;; SAVE REGISTERO% MOV U.SCB(R5),R4 ;;; GET SCB ADDRESSA, MOV S.PKT(R4),R3 ;;; GET I/O PACKET ADDRESS% MOV S.CSR(R4),R4 ;;; GET CSR ADDRESSE5 MOV RXDB(R4),I.PRM+6(R3) ;;; SAVE CONTROLLER STATUS" MOV (SP)+,R3 ;;; RESTORE REGISTER( BIC #INTEBL,(R4) ;;; DISABLE INTERRUPTS( CALL @FORK ;;; CREATE A SYSTEM PROCESS MOV R4,R2 ; COPY CSR ADDRESS# MOV U.SCB(R5),R4 ; GET SCB ADDRESST) MOVB S.CON(R4),R3 ; GET CONTROLLER INDEX TST (R2) ; ANY ERRORS? BPL 160$ ; IF PL NOU+ BITB #2,RTTBL+1(R3) ; GET STATUS FUNCTION?O BEQ 156$ ; IF EQ NO  JMP 33$ ; DRIVE NOT READYR%156$: CALL LOGERR ; LOG DEVICE ERRORS BR DXRTY ; RETRY FUNCTIONS3160$: BITB #1,RTTBL+1(R3) ; INITIALIZE IN PROGRESS?A BNE 170$ ; IF NE YES+ BITB #2,RTTBL+1(R3) ; GET STATUS FUNCTION?L BEQ 161$ ; IF EQ NOR! JMP 32$ ; TEST IF UNIT IS READYV4161$: MOV S.PKT(R4),R3 ; RETREIVE I/O PACKET ADDRESS' CMPB #IO.RLB/256.,I.FCN+1(R3) ; READ?R 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 DATA.180$: MOV #IE.BLK&377,R0 ; SET BAD BLOCK ERROR BR 210$ ;;2190$: MOV #IE.VER&377,R0 ; SET UNRECOVERABLE ERROR BR 200$ ;EA193$: BITB #IO.RPB&377,I.FCN(R3) ; READ PHYSICAL BLOCK FUNCTION?C. BEQ 195$ ; NO, THEN IGNORE DELETED DATA MARK: MOV #IS.RDD&377,R0 ; YES, DEFAULT ON READ TO DELETED DATA- BIT #DD,I.PRM+6(R3) ; WAS DELETED DATA READ?  BNE 200$ ; YES1195$: MOV #IS.SUC&377,R0 ; NO, SET NORMAL SUCCESSL/200$: MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESSL* MOV I.PRM+4(R1),R1 ; SET BYTES TRANSFERED7 SUB U.CNT(R5),R1 ; CALCULATE BYTES ACTUALLY TRANSFERED;. MOVB S.CON(R4),R3 ; RETREIVE CONTROLLER INDEX* MOVB RTTBL(R3),R2 ; SET FINAL RETRY COUNT- BIS #RETRY*256.,R2 ; SET INITIAL RETRY COUNTQ210$: CALL @IODON ; SET DONED% JMP DXINI ; TRY FOR ANOTHER REQUESTD;U;+/; *** - DXOUT - FLOPPY DISK TIMEOUT ENTRY POINTS;-*DXOUT: CALL LOGTMO ;;; LOG DEVICE TIMEOUT;U; RETRY LAST FUNCTIONA;U3DXRTY: MOVB S.CON(R4),R3 ; RESTORE CONTROLLER INDEXS* MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS( BITB #IQ.X,I.FCN(R1) ; INHIBIT RETRIES? BNE 190$ ; IF NE YES# DECB RTTBL(R3) ; ANY RETRIES LEFT?I BEQ 190$ ; NO, ERROR6 MOVB #1,RTTBL+1(R3) ; YES, SET INITIALIZE IN PROGRESS) MOV #INIT,CSRSV(R3) ; SAVE FUNCTION CODED( MOV #INIT,(R2) ; INITIALIZE RX01 DRIVES JMP 155$ ; AND DO IT .DSABL LSBS;+; **-LOGERR-LOG DEVICE ERROR; **-LOGTMO-LOG DEVICE TIMEOUT;T=; THESE ROUTINES WILL ALLOCATE A CORE BLOCK, FILL IT WITH THER<; REGISTER INFORMATION, CALL THE APPROPRIATE EXECUTIVE ERROR@; LOGGING ROUTINE, DEALLOCATE THE CORE BLOCK, AND RETURN BACK TO ; THE CALLER.T;( ; INPUTS:E; R3=CONTROLLER INDEX ; R4=SCB ADDRESS; R5=UCB ADDRESS;S ; OUTPUTS:; R2=CSR ADDRESS; R4=SCB ADDRESS; R5=UCB ADDRESS;D; R0, R1 AND R3 ARE DESTROYED.;- .ENABL LSB1*LOGERR: MOV DVERR,-(SP) ; LOG DEVICE ERROR BR 10$ ;.LOGTMO: MOV DTOER,-(SP) ;;; LOG DEVICE TIMEOUT610$: MOV #DXNUM*2,R1 ; GET NUMBER OF BYTES TO ALLOCATE( CALL @ALOCB ; ALLOCATE THE ERROR BLOCK BCC 20$ ; IF CC OK% INC @ERRSQ ; INDICATE A MISSED ERRO  CMP (SP)+,DTOER ; TIMEOUT?O BNE 30$ ; IF NE NO3 BIC #INTEBL,@S.CSR(R4) ;;; CLEAR INTERRUPT ENABLE MTPS #0 ;;; ALLOW INTERRUPTS BR 30$ ;)20$: MOV R0,R1 ; COPY CORE BLOCK ADDRESS( MOV S.CSR(R4),R2 ; RETREIVE CSR ADDRESS" MOV (R2),(R1) ; SAVE CSR CONTENTS+ BIS CSRSV(R3),(R1)+ ; SET BITS 0-4 IN RXCS  MOV RXDB(R2),(R1)+ ; SAVE RXDBT* MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS# MOV I.PRM+6(R3),(R1)+ ; SAVE RXESE3 MOV #RDERC,(R2) ; EXECUTE READ ERROR CODE FUNCTION;00OdPdc__DATADATADATADATA&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 ADDRESSC4 MOV #DXNUM*2,R1 ; GET NUMBER OF BYTES TO DEALLOCATE* CALL @DEACB ; DEALLOCATE THE ERROR BLOCK,30$: MOV S.CSR(R4),R2 ; RETREIVE CSR ADDRESS RETURN ; .DSABL LSBM;+>; *** - TRKSEC - CONVERT LOGICAL OR PHYSICAL BLOCK NUMBER TO; TRACK-SECTOR PAIRR3; FROM ALGORITHM BY J GILBERT MODIFIED BY H. JACOBSN;R; INPUT:; R3 - I/O PACKET ADDRESSE+; I.PRM+10(R3) - LOGICAL OR PHYSICAL SECTOR,; ; OUTPUT:B; I.PRM+14(R3) - SECTOR (1-26.) ; I.PRM+15(R3) - TRACK (0-77.); R3 - UNCHANGED; C CLEAR - VALID BLOCKG0; C SET - BAD BLOCK NUMBER (PHYSICAL OR LOGICAL);L;-;TRKSEC: MOV I.PRM+10(R3),R1 ; GET LOGICAL OR PHYSICAL BLOCKE MOV #8.,R0 ; SET LOOP COUNT MOV #6400,R2 ; SET DIVISORN*1$: CMP R2,R1 ; DOES 26 GO INTO DIVIDEND?! BHI 2$ ; BRANCH IF NOT, C CLEARM' SUB R2,R1 ; SUBTRACT 26 FROM DIVIDEND SEC ; SET CARRY)2$: ROL R1 ; SHIFT DIVIDEND AND QUOTIENTO DEC R0 ; DONE? BGT 1$ ; NO, LOOP. MOVB R1,R0 ; GET TRACK NUMBER. CLRB R1 ; CLEAR TRACK NUMBER$ SWAB R1 ; SHIFT DONE SECTOR NUMBER5 BITB #IO.RPB&377,I.FCN(R3) ; PHYSICAL BLOCK WANTED? BNE 10$ ; YES.% CMP #12.,R1 ; NO, C=1 IF 13<=R1<=25 ' ROL R1 ; DOUBLE FOR INTERLEAVE FACTORM ASL R0 ; ADD TRACK -TRACK SKEW ADD R0,R1 ; SKEW BY 2*TRACKD ADD R0,R1 ; SKEW BY 4*TRACK  ADD R0,R1 ; SKEW BY 6*TRACKT ASR R0 ; RESTORE TRACK NUMBERC MOV #26.,R2 ; SET MODULUSI55$: SUB R2,R1 ; MODULO SECTOR INTO RANGE -26. TO -1.O' BGE 5$ ; LOOP TILL REMAINDER GOES NEGR$ ADD R2,R1 ; CONVERT TO RANGE 0-25.! INC R0 ; LBN0 STARTS ON TRACK 1I%10$: INC R1 ; CONVERT TO RANGE 1-26.A) MOV R1,I.PRM+14(R3) ; SAVE SECTOR NUMBERO) MOVB R0,I.PRM+15(R3) ; SAVE TRACK NUMBER : CMP #77.*256.,I.PRM+14(R3) ; IS IT A VALID TRACK/SECTOR? RETURN ;B;+7; *** - NXTSEC - UPDATE BLOCK NUMBER , BUFFER ADDRESSB; AND BUFFER POINTER;O; INPUT:; R3 - I/O PACKET ADDRESS ; R5 - UCB ADDRESS%; I.PRM+10(R3) - CURRENT BLOCK NUMBER 6; I.PRM+12(R3) - BYTES TRANSFERED DURING LAST FUNCTION$; U.CNT(R5) - BYTES LEFT TO TRANSFER; U.BUF(R5) - BUFFER ADDRESS;I ; OUTPUT:N%; I.PRM+10(R3) - UPDATED BLOCK NUMBERR#; U.BUF(R5) - UPDATED BY 128. BYTESP3; U.CNT(R5) - UPDATED BY NUMBER OF WORDS TRANSFERED1; Z SET - ALL BYTES TRANSFERED"; Z CLEAR - MORE BYTES TO TRANSFER; C CLEAR - VALID TRACK/SECTOR; C SET - BAD BLOCK NUMBER;P;+.NXTSEC: INC I.PRM+10(R3) ; UPDATE BLOCK NUMBER. ADD #2,U.BUF(R5) ; UPDATE MEMORY BLOCK NUMBER< SUB I.PRM+12(R3),U.CNT(R5) ; UPDATE BYTES LEFT TO TRANSFER RETURN ;5;+A; *** - SETBUF - SET UP BUFFER POINTER FOR CPU - SILO TRANSFERS;.; INPUT:; R3 - I/O PACKET ADDRESS ; R5 - UCB ADDRESS;1 ; OUTPUT:"; I.PRM+12(R3) - BYTES TO TRANSFER; R0 - BUFFER ADDRESSE; R1 - BYTES TO TRANSFER; ;-/SETBUF: MOV U.BUF+2(R5),R0 ; GET BUFFER ADDRESSC- MOV #128.,R1 ; DEFAULT TO 128. BYTE TRANSFERX0 CMP U.CNT(R5),R1 ; 128. BYTES LEFT TO TRANSFER? BHIS 10$ ; YES* MOV U.CNT(R5),R1 ; NO, GET RESIDUAL COUNT210$: MOV R1,I.PRM+12(R3) ; STORE BYTES TO TRANSFER- MOV U.BUF(R5),@KISR6 ; SET MAPPING REGISTERI RETURN ;- .ENDNSFERS;.; INPUT:; R3 - I/O PACKET ADDRESS ; R5 - UCB ADDRESS;1 ; OUTPUT:"; I.PRM+12(R3) - BYTES TO TRANSFER; R0 - BUFFER ADDRESSE; R1 - BYTES TO TRANSFER; ;-/SETBUF: MOV U.BUF+2(R5),R0 ; GET BUFFER ADDRESSC- MOV #128.,R1 ; DEFAULT TO .TITLE MMDRVS .IDENT /09.01/R .ENABLE LCB;L1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.R; All rights reservedU;;:<; This Software is Furnished Under a License And May Be Used>; or Copied Only in Accordance With the Terms of Such License.;;NB; RSX11M-PLUS RH11/RH70 TM02/TM03 Magnetic Tape Controller Driver; ; Version 09.01T;T;R; Modified By:;E>; CS005 -- Handle CALL for Controller Power Fail (C bit set).;5;0;G.PAGE ; Macro Library Calls ;EE.MCA00Pd-dibjbkb a a aLL ABODF$, HWDDF$, PKTDF$, UCBDF$, UMDIO$, KRBDF$, SCBDF$, QIOSY$h ABODF$ ;Define Abort CodesU$ HWDDF$ ;Define Hardware Registers$ PKTDF$ ;Define I/O Packet Offsets UCBDF$ ;Define UCB OffsetsC2 UMDIO$ ;Define User Mode Diagnostic Definitions& KRBDF$ ;Define KRB and KRB1 Offsets SCBDF$ ;Define SCB Offsetse* QIOSY$ ;Define QIO Functions and Errors;d; Equated Symbols-;aUS.ABO=1 ;Abort Request,#US.SUP=2 ;Supress Error Recovery,G.US.PWF=10 ;Power Fail Indication - in U.STS..RETRY=12 ;Retry Count - 10. retries/request.2MINREC=14. ;Write Request - Minimum Record Size.)REV=2 ;Reverse Bit - Space Operations.f3NOISE=MINREC ;Anything Smaller than this is NoiseC.PAGEO!; Register Definition and Offsetsf;t,RHCS1 = +0 ;RH Control and Status RegisterGO= 1 ;Go BitfIE= 100 ;Interrupt Enableu!RDY= 200 ;RH Controller Ready PSL= 2000 ;Port select;DVA= 4000 ;Device AvailableTRE= 40000 ;Transfer Error)CPE= 20000 ;RH Control Bus Parity ErrorR"SC= 100000 ;Special Condition ;I/O Commands.%FC.RWU= 103 ;Rewind Unload/Off-LineFC.RWD= 107 ;Rewind FC.RLS= 113 ;Release DriveFC.ERS= 125 ;Erase 3" Gaph$FC.WEF= 127 ;Write EOF (tape mark)FC.SPF= 131 ;Space Forward FC.SPR= 133 ;Space Reverse eFC.WRT= 161 ;WriteFC.RED= 171 ;ReadIFC.REV= 177 ;Read Reverse FC.CLR= 11 ;Drive Clear#RHWC = +2 ;RH Word Count Registere$RHBA = +4 ;RH Bus Address Register+MTFC = +6 ;TM02/TM03 Frame Count Registerr/RHCS2 = +10 ;RH Control and Status Register 2m#SCLR= 40 ;RH Controller Cleard(DPE= 400 ;MASSBUS Data Parity ErrorMXF= 1000 ;Missed TransferPGE= 2000 ;Program Error"NEM= 4000 ;Non-existent Memory!NED= 10000 ;Non-existent Drive3"UPE= 20000 ;Unibus Parity Error WCE= 40000 ;Write Check ErrorDLT= 100000 ;Data LateC>CS2ERR= DLT! WCE! UPE! NED! NEM! PGE! MXF! DPE ;RH TRE Errors-MTDS = +12 ;TM02/TM03 Drive Status Register0SLA= 1 ;Slave Attention!BOT= 2 ;Beginning of Tape s TM= 4 ;Tape Mark Detected#PES= 40 ;Phase Encoded StatusB"SSC= 100 ;Slave Status ChangeDRY= 200 ;Drive ReadyEOT= 2000 ;End of Tape 0WRL= 4000 ;Write LockEMOL= 10000 ;Medium On Line3&PIP= 20000 ;Positioning in Progress ERR= 40000 ;Error - Composite&MTER = +14 ;TM02/TM03 Error RegisterILF= 1 ;Illegal FunctionEILR= 2 ;Illegal Register ,RMR= 4 ;Register Modification Refused'CPR= 10 ;Control Bus Parity ErrornFMT= 20 ;Format Error; DPR= 40 ;Data Parity Error+INC= 100 ;Incorrectable Data - PE ModeS-VPE=INC ;Vertical Parity Error - NRZI Mode %PEF= 200 ;Format Error - PE ModeW"LRC=PEF ;LRCC Error - NRZI ModeNSG= 400 ;Non-standard Gapg 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 Errorn#OPI= 20000 ;Operation IncompletePUNS= 40000 ;Drive UnsafeF,COR= 100000 ;Correctable Data - PE Mode!CRC=COR ;CRC Error - NRZI Mode )DAT= CS! PEF! INC ;Data Detection errors +RHAS = +16 ;RH Attention Summary Registerd2MTCK = +20 ;TM02/TM03 CRC or Dead Track Register#MTDB = +22 ;TM02/TM03 Data BufferF,MTMR = +24 ;TM02/TM03 Maintenance Register+MTDT = +26 ;TM02/TM03 Drive Type RegisterN%MTSN = +30 ;TM02/TM03 Serial Number -MTTC = +32 ;TM02/TM03 Tape Control Register=TC.1600= 2000 ;1600 BPITC.800= 1000 ;800 BPIU?TC.FMT= 300 ;Formatting Mode - PDP-11 normal assy/dissassy;TC.EVN= 10 ;Even ParityC.PAGE E; The following define bits in the Tape Characteristic Word (U.CW2). g1M.PEOV= 100000 ;Tape past Logical End of Volumei/M.AEOV= 40000 ;Tape at Logical End of Volume=M.BOT= 20000 ;Tape at BOT@M.1600= 4000 ;Tape Density Control; '1'=1600 BPI, '0'=800BPI$M.HWL= 2000 ;Hardware Write Lock"M.RWD= 1000 ;Unit is Rewinding9M.SER= 00Pddc__DATADATADATADATA 400 ;Select Error - Tape Drive not accessibleU<M.IXG= 200 ;Inhibit Write with Extended Interrecord Gap$M.SWL= 100 ;Software Write Lock9M.EOF= 40 ;Tape Mark detected (FWD direction only).tM.EOT= 20 ;Tape at EOT 0M.EVN= 10 ;Even Parity-USRBTS=4310 ; Bits Controlled by the User - # ; M.1600! M.IXG! M.SWL! M.EVN B<NEWBTS=M.BOT!M.EOF!M.EOT ;Bits to be set before Call $IODON. ; Local Data; A; Controller Impure Data Tables (Indexed by Subcontroller Number) ; M; Diagnostic Functions use bit 15 of RTTBL as a Flag for Interrupt Servicing.t'RTTBL: .BLKW T$$M03 ;Error Retry Count 0SPTBL: .BLKW T$$M03 ;Current Space Count - 2's.*SPTOTL: .BLKW T$$M03 ;Total Blocks Spaced3SPRMNG: .BLKW T$$M03 ;Remaining Space Count - 2's.S+FMTBL: .BLKW T$$M03 ;Format Code Save Area-FCCDE: .BLKW T$$M03 ;Function Code Save AreaM.CMDCNT: .BLKW T$$M03 ;Command Count Save Area&BUFADR: .BLKW T$$M03 ;U.BUF Save Area/DONADR: .BLKW T$$M03 ;DONTBL Address Save Areab&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 Codec) .BYTE INDX ;I/O Handling (Tables) Indexl( .BYTE RQSTCD ;Device I/O Request Code ( .WORD RTRADR ;Tape Repositioned Return2 .WORD RTRYCD ;Device Error Recovery Request Code .ENDM ;DFENT =LGFCN: DFENT IO.RLB,FREAD,FC.RED,RTYCMD,FC.SPR ;Read Forward 0 DFENT IO.WLB,FWRTE,FC.WRT,RTYCMD,FC.ERS ;Write7 DFENT IO.RLV,FRREV,FC.REV,RTYCMD,FC.SPF ;Read ReverseI: DFENT IO.EOF,FWEOF,FC.WEF,RTYCMD,FC.ERS ;Write Tape Mark7 DFENT IO.ERS,FERSE,FC.ERS, 0, 0 ;Erase 3" GapN1 DFENT IO.RWD,FRWND,FC.RWD, 0, 0 ;Rewind(A DFENT IO.RWU,FRWDU,FC.RWU, 0, 0 ;Rewind Unload/Off-LineR7 DFENT IO.SPB,FSPCR,FC.SPF,SPCONT,FC.SPR ;Space Blocksr6 DFENT IO.SPF,FSPCF,FC.SPF,SPCONT,FC.SPR ;Space Files0 DFENT IO.STC,FSETC, 0, 0, 0 ;Set Char3 DFENT IO.SEC,FSENC, 0, 0, 0 ;Sense Char;SMOU: DFENT IO.SMO,FSMOU, 0, 0, 0 ;Mount/Set CharEENDFCN=. LNGHT=.-SMOU.PAGEE; Function Code Index TableI;RFREAD = 0 ;Read Logical Blocke FWRTE = 2 ;Write Logical Block'FRREV = 4 ;Read Logical Block Reverse,FWEOF = 6 ;Write Tape MarkFERSE = 10 ;Erase 3" GapEFRWND = 12 ;Rewind #FRWDU = 14 ;Rewind Unload/Off-lineTFSPCR = 16 ;Space Blocks,FSPCF = 20 ;Space Files%FSETC = 22 ;Set Tape Characteristics 'FSENC = 24 ;Sense Tape Characteristics *FSMOU = 26 ;Set and Mount CharacteristicsFRTRY = 30 ;Retry in Progress FSPRR = 22 ;Space Block ReverseFSPFR = 24 ;Space File Reverse$; Pre-initiation Processing Routines; PRETBL: .WORD PRERED ;ReadE .WORD PREWRT ;Write  .WORD PREREV ;Read Reverse e .WORD PREEOF ;Write Tape Mark  .WORD PREERS ;Erase 3" Gap .WORD PRECOM ;Rewind O' .WORD PRECOM ;Rewind Unload/Off-line C .WORD PRESPC ;Space Blocks 2 .WORD PRESPC ;Space Files $ .WORD PRESTC ;Set Characteristics & .WORD PRESEC ;Sense Characteristics . .WORD PRESMO ;Mount and Set Characteristics ; Succesful Completion Table; $DONTBL: .WORD REDDON ;Read Forward  .WORD WRTDON ;Write Forward  .WORD REVDON ;Read Reverse O .WORD EOFDON ;Write Tape Mark  .WORD EXTNST ;Erase 3" Gap .WORD RWDDON ;Rewind O' .WORD RWDDON ;Rewind Unload/Off-line ;$ .WORD SPFEXT ;Space Block Forward # .WORD SPFEXT ;Space File Forward l$ .WORD SPFEXT ;Space Block Reverse # .WORD SPFEXT ;Space File Reverse 7 .WORD SMODON ;IO.SMO Rewind Completion (TM03 problem)o) .WORD FATAL ;Error Recovery Completion u.PAGEe; Mask Table - Retriable ErrorsE; DAT= CS! PEF! INCAERRMSK: .WORD COR! DTE! DAT! FCE! FMT! CPR ;Read ForwardD: .WORD COR! DTE! DAT! FCE! FMT! CPR! NSG! DPR ;Write @ .WORD COR! DTE! DAT! FCE! FMT! CPR! OPI ;Read Reverse0 .WORD COR! DAT! CPR! NSG ;Write TMK .WORD 0 ;Erase 3" Gap& .WORD FMT! NEF ;Rewind 1 .WORD FMT! NEF ;Rewind Unl/OfflineO9 .WORD FCE! 00Pd-dibjbkb a a a OPI ;Space FWD Blocksc8 .WORD FCE! OPI ;Space FWD Files8 .WORD FCE! OPI ;Space REV Blocks8 .WORD FCE! OPI ;Space REV Files .WORD 0 ;No Function; .WORD 0 ;RetryD2; Retry Table; > Error Recovery RETRY Entry Points; $RTYTBL: .WORD REDRTY ;Read Forward  .WORD WRTRTY ;Write  .WORD REVRTY ;Read Reverse F .WORD WRTRTY ;Write Tape Mark $ .WORD FATAL ;Erase - Not Retriable .WORD RWDRTY ;Rewind & .WORD RWDRTY ;Rewind Unload/Off-line .WORD SPRRTY ;Space FWD Blocks .WORD SPFRTY ;Space FWD Files .WORD SPRRTY ;Space REV Blocks .WORD SPFRTY ;Space REV Files 9 .WORD FATAL ;IO.SMO Rewind not retriable (TM03 problem); .WORD FATAL ;Error during Error Recovery - Not Retriable. B; Error Check Table; > Specific Function, ERROR CHECK Entry Points; $CHKTBL: .WORD REDERR ;Read Forward  .WORD COMRTY ;Write  .WORD REVERR ;Read Reverse e .WORD COMRTY ;Write Tape Mark # .WORD FATAL ;Erase 3" Gap - Fatala .WORD RWDRTY ;Rewind & .WORD RWDRTY ;Rewind Unload/Off-line .WORD SPFEXT ;Space FWD Blocks .WORD SPFEXT ;Space FWD Filesc .WORD SPRERR ;Space REV Blocks .WORD SPRERR ;Space REV Files 3 .WORD FATAL ;IO.SMO Rewind - Fatal (TM03 problem)t) .WORD RTYCON ;Retry Frame Count Errors e.PAGEu; Driver Dispatch Table ;n2 DDT$ MM,T$$M03 ;Create the Driver Dispatch Table.;+A; **-MMINI-RH11/RH70 TM02/TM03 Magnetic Tape Controller Initiatora;MB; This Routine is entered from the Queue I/O directive when an I/OF; Request is queued and at the end of a previous I/O operation to pro-E; pagate the execution of the driver. If the specified Controller isE; not busy, then an attempt is made to dequeue the next I/O request. (G; Else a return to the caller is executed. If the dequeue attempt is vH; successful, then the next I/O operation is initiated. A return to the=; caller is then executed. If this unit is currently doing ae=; rewind any requests for it are rejected by the 'Acceptance'd:; routine. These requests will be done when the rewind is ; complete;o;a ; Inputs:-; :; R5=Address of the UCB of the Controller to be Initiated.;r ; Outputs:;y?; If the specified controller is not busy and an I/O request isEC; waiting to be processed, then the request is dequeued and the I/O; operation is initiated. ;-5MMINI: GTPKT$ MM,T$$M03 ;Get an I/O packet to processn;e&; The Following Arguments Are Returned;e; R1 > I/O request packet.0; R2 = Physical Unit Number of requested TM02/3.; R3 = RH Controller Index.e; R4 > Status Control Block.; R5 > Tape Drive UCB.;eD; RH11/RH70 TM02/TM03 Magnetic Tape Function Independent I/O Request; Packet Format:;n"; 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 headC; WD. 04 -- Contents of the first LUN word in requestor task headerpB; WD. 05 -- I/O function code (IO.RLB/IO.RWD/IO.SPB/IO.SPF/IO.EOF)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.-;e.10$: CALL $RQSUB ;Request the Subcontroller. MOV U.KRB1(R5),R2 ;R2 > KRB1. 1 MOVB K1.CON(R2),R3 ;R3 - Formatter Unit Number,e# ASL R3 ; Convert to Word Index.n$ MOV S.PKT(R4),R1 ;R1 > I/O Packet./ MOV #LGFCN,R2 ;R2 > Valid I/O Function Table.L+ MOV I.FCN(R1),R0 ;R0 - QIO Function Code.i0 BICB #US.SUP,U.STS(R5) ;Error Recovery allowed.* CLRB RTTBL+1(R3) ;Clear Diagnostic Flag.' BITB #IQ.UMD,R0 ;Diagnostic Function?t BEQ 20$ ;IF EQ, No.. MOV #100000,RTTBL(R3) ;Indicate Diagnostics,- BISB #US.SUP,U.STS(R5) ; no Error Recovery.,20$: BITB #IQ.X,R0 ;Error Recovery allowed? BEQ 25$ ;IF EQ, No., BISB #US.SUP,U.STS(R5) ;No Error Recovery.D25$: BICB #IQ.X!IQ.UMD!IQ.Q,R0 ;R0 - Funct00Pedc__DATADATADATADATAion Code for Validation.(30$: CMP R0,(R2) ;Function Code match? BEQ 50$ ;IF EQ, Yes.e# ADD #LNGHT,R2 ;Next I/O Function.c CMP R2,#ENDFCN ;End of table? ( BLO 30$ ;IF LO, No. Check next entry.140$: MOV #IE.IFC&377,R0 ;Yes - Illegal Function.M* CALL $RLSUB ;Release the Subcontroller.$ CALL $IOALT ;End this Request and1 BR MMINI ; service other outstanding Requests.o,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.P% TST RTTBL(R3) ;Diagnostic Function?5) BMI 60$ ;IF MI, Yes - Inhibit Retries./) MOV #RETRY,RTTBL(R3) ;Set Retry Count.e; Request the Controller;k660$: CMPB U.FCDE(R5),#FRREV ;Data Transfer Function? BLOS 70$ ;IF LOS, Yes.e4 CALL $RQCNC ;Request Controller for Control Fnct. BR 80$ ;Perform request.c:70$: CALL $RQCND ;Request Controller for Dt Trnsfr Fnct.#80$: MOV U.KRB1(R5),R3 ;R3 > KRB1.d- CALL SELECT ;Update Device Tape Char Info.L8 MOVB U.FCDE(R5),R0 ;R0 - QIO Index, I/O Function Code.$ MOV S.PKT(R4),R1 ;R1 > I/O Packet.1 MOVB K1.CON(R3),R3 ;R3 - Formatter Unit Number,S" ASL R3 ; Convert to Word Index.1 MOV #FATAL,DONTBL+FRTRY ;Preset Error Address.r* JMP @PRETBL(R0) ;Preprocess I/O Request..PAGE ;+/; **-PRESPC - Preprocess Space Function Request0; ,; This routine Pre-Process's Space Requests.; /; Spacing Function Dependent I/O Packet Format:5;3@; WD. 12 -- Spacing Count (positive=forward, Negative=backward).; WD. 13 -- Not Used.-; WD. 14 -- Not Used.n; WD. 15 -- Not Used.R; WD. 16 -- Not Used.M=; WD. 17 -- Relocation Bias Of Diagnostic Reg. Buffer Addresso7; WD. 20 -- Diag. Reg. Buffer Address (Displ. + 140000)E;-5PRESPC: MOV #IS.SUC&377,R0 ;Assume 0 Space Count andP1 CLR SPTOTL(R3) ; indicate No Blocks Spaced yet.e+ MOV U.BUF(R5),-(SP) ;Current Space Count.e BEQ 40$ ;IF EQ, Done. BMI 10$ ;IF MI, Space REV.o ;Space FWD# MOV #IE.EOV&377,R0 ;May be at EOVw! BIT #M.AEOV,U.CW2(R5) ;At EOV?-2 BNE 40$ ;IF NE, Yes - can't Space FWD from here. NEG (SP) ;I/O Space Count - 2's complement. BR 20$ ;Continuen ;Space REV<10$: BIC #M.AEOV,U.CW2(R5) ;Clear at End of Volume status.3 MOVB #FC.SPR,U.FCDE+1(R5) ;Space REV Function and / ADD #4,U.FCDE(R5) ; Space REV Function Index.B+20$: CLR U.BUF(R5) ;Init for Function Coder& CMP #IO.SPF,@IOFCN(R3) ;Space Files? BNE 30$ ;IF NE, No.5 MOV (SP),SPRMNG(R3) ;Remaining Spacing Count - 2's.e3 MOV (SP),I.PRM+4(R1) ;Save for later calculations.$( MOV #1,(SP) ;Set for MAX Space Count.230$: MOV (SP),U.CNT(R5) ;Current I/O Space Count.2 MOV (SP)+,SPTBL(R3) ;Save for Timeout situation./ BR PWFTST ;Start I/O if no PWFLD Indication. ,40$: TST (SP)+ ;Clean up Stack for Return. JMP EXTNST ;End Request.E.PAGEi;+H; **-PRESMO - IF Tape at BOT, Set Tape Characteristics per User Request.;-*PRESMO: BIT #M.BOT,U.CW2(R5) ;Tape at BOT?5 BNE SMORWD ;IF NE, Yes - Set Tape Characteristics.V' MOV #IE.FHE&377,R0 ;No, Fatal Error -t BR PREXIT ;End Request.;+G; **-SMORWD - Issue REWIND to clear possibly hung EOT status in TM03's.(E; Caused by manually rewinding an Online Tape Unit previously at EOT.f;-;SMORWD: BIC #M.AEOV,U.CW2(R5) ;Not at End of Volume Status.t& BIC #USRBTS!7,U.CW2(R5) ;Prepare for 2 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 and # JMP PRCOM ; request I/O REWIND.M3SMODON: BICB #US.PWF,U.STS(R5) ;Clear PWFLD Status.n% CALL SELECT ;Update Tape Char WordE& BR PRESEC ; and end IO.SMO Request.;+); **-PRESTC - Set Characteristics Commandi:; Sets User Controlled Bits in Tape Characteristics Word.;-/PRESTC: BIC #USRBTS!7,U.CW2(R5) ;Prepare for 72 BIC #^C,U.BUF(R5) ; User Controlled Bits.@ BIS U.BUF(R5),U.CW2(R5) ;Set User controlled Characteristics.;+.; **-PRESEC - Return Tape Characteristics Word;-=PRESEC: BIC #M.PEOV,U.CW2(R5) ;No M.PEOV for IO.SMO r00P e-dibjbkb a a aequest.S1 MOV U.CW2(R5),R1 ;Return Tape Characteristic's e- MOV #IS.SUC&377,R0 ; and indicate Success. PREXIT: JMP EXIT ;End Request..PAGEe;+*; **-PREWRT - WRITE Request Preprocessing:<; Verify At least Minimum Record Size .and. Write Enabled.;-6PREWRT: MOV #IE.SPC&377,R0 ;Assume Parameter Problems0 CMP #MINREC,I.PRM+4(R1) ;Minimum Record Size?' BHI PREEXT ;IF HI, Record too small.P;+,; **-PREEOF - Write Tape Mark Preprocessing:+; **-PREERS - 3" Gap Erasure Preprocessing:O; Verify Write Enabled.R;-PREEOF:p0PREERS: 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.o;+; **-PRERED - Read Forward and T); PREREV - Read Reverse Preprocessing:b;-PRERED:I0PREREV: MOV S.KRB(R4),R1 ;Retrieve KRB Address.0 BIT #FE.EXT,$FMASK ;22-bit Addressing enabled? BEQ 5$ ;IF EQ, No.p' BIT #KS.MBC,K.STS(R1) ;MASSBUS Device?P BNE 5$ ;IF NE, Yes.! CALL $STMAP ;Setup Unibus Map.R" ASL U.BUF(R5) ;Shift bits <4:5> # ASL U.BUF(R5) ; into bits <8:9>.5 ASL U.BUF(R5) ; ...P ASL U.BUF(R5) ; ...C( CALL $MPUBM ;Setup UMR's for transfer, MOV @S.KRB(R4),R2 ; and restore R2 (=CSR).5$: MOV R5,R1 ;R1 >  ADD #U.BUF,R1 ; U.BUF.r( BIT #FE.EXT,$FMASK ;22-bit Addressing? BNE 10$ ;IF NE, Yes.d ROL (R1) ; Setup  ROL (R1) ; A17, A16n ROL (R1) ; into  ROL (R1) ; Hi Byte.A'10$: CMPB #4,U.FCDE(R5) ;Read Reverse?C BNE PWFTST ;IF NE, No.M" SUB #2,U.CNT(R5) ;Read reverse -- ADD U.CNT(R5),2(R1) ; Adjust Buffer PointerL BCC 15$ ; to end of  ADCB 1(R1) ; Buffer Area./15$: ADD #2,U.CNT(R5) ;Restore Transfer Count. <PWFTST: MOV #IE.ABO&377,R0 ;Request Aborted IF PWFLD Status+ BITB #US.PWF,U.STS(R5) ;Power Fail occur?d# BEQ PRECOM ;IF EQ, No - ContinueR)PREEXT: JMP EXTNST ;Else - End Request.1;+(; **-PRECOM - Common Preprocessing Entry;H3; All requests have been preprocessed successfully.B$; Setup Formatter Mode Control and /; Subsequently perform I/O Function Execution.d;-7PRECOM: MOVB U.FCDE+1(R5),U.BUF(R5) ;Retrieve Function. (PRCOM: MOVB U.SNUM(R5),R0 ;Tape Unit #.# BIS #TC.1600,R0 ;Assume 1600 BPI.I, BIT #M.1600,U.CW2(R5) ;Assumption correct? BNE 10$ ;IF NE, Yes.  BIC #TC.1600,R0 ;Setup for BIS #TC.800,R0 ; 800 BPI.( BIT #M.EVN,U.CW2(R5) ;Even Parity Mode? BEQ 10$ ;IF EQ, No.# BIS #TC.EVN,R0 ;Even Parity Mode.u310$: BIS #TC.FMT,R0 ;Normal Assys/Disassy of Data.F, MOV R0,FMTBL(R3) ;Tape Drive Control Mode.;+; **-FNCEX - Function ExecutionM;OC; Issue I/O Function. RH Controller, Tape Formatter and Tape Drive):; ownership need be synchronized before I/O may proceed.;# ; Inputs:2; R2 = CSR Address R4 > SCB. ; R3 = Formatter Index R5 > UCB.;-*FNCEX: BIT #M.SER,U.CW2(R5) ;Select Error?) BNE SELERR ;IF NE, Yes - Select Error.?! BIT #PIP,MTDS(R2) ;Tape moving?E BEQ 10$ ;IF EQ, No.$ JMP WTRWD ;Wait until Tape Stops.810$: MOV DONTBL+FRTRY,DONADR(R3) ; > Retry Completion. " MTPS #PR5 ;Inhibit Interrupts." CALL SELDRV ;;Select Formatter.> MOV FMTBL(R3),MTTC(R2) ;;Select Tape Drive/Formatting mode.( MOV #TRE!FC.CLR,(R2) ;;Clear Formatter.. MOV U.CNT(R5),MTFC(R2) ;;Setup Command Count.7 BIC #M.AEOV!M.SER!M.RWD,U.CW2(R5) ;;Clear status bits.E3 CMPB U.FCDE(R5),#FRREV ;;Data Transfer Function?  BLOS 20$ ;;IF LOS, Yes.4 BISB #S3.SIP,S.ST3(R4) ;;Positioning in Progress. BR 25$ ;;Issue I/O Function.920$: NEG MTFC(R2) ;;Formatter Frame Count - 2's cmplmnt.M) MOV MTFC(R2),RHWC(R2) ;;RH Controller D ROR RHWC(R2) ;; Word Count.7 MOV U.BUF+2(R5),RHBA(R2) ;;Low order 16 bit address. MOV S.KRB(R4),R1 ;; > KRB.5 BIS #KS.DIP,K.STS(R1) ;;Data Transfer in Progress.n) BIT #FE.EXT,$FMASK ;;22-bit Addressing?e BEQ 30$ ;;IF EQ, No..) BIT #KS.MBC,K.STS(R1) ;;MASSBUS Device?  BEQ 30$ ;;IF EQ, No.e( ADD K.OFF(R1),R1 ;; > to UCB table and, MOV KE.RHB(R1),R1 ;; obtain RHB00Pedc__DATADATADATADATAAE Offset.% ADD R2,R1 ;;Form I/O page address.a< MOVB U.BUF+1(R5),(R1) ;;HI Order address bits to RHBAE reg.'25$: MOVB U.BUF(R5),(R2) ;;Start I/O. M BR 40$ ;;.. Cont.%30$: MOV U.BUF(R5),(R2) ;;Start I/O.S$40$: MOV U.KRB1(R5),R2 ;; R2 > KRB1 INC K1.STS(R2) ;; K1.STS .NE. ' BIS #S2.ACT,S.ST2(R4) ;; I/O active.r5 BICB #S3.SPU,S.ST3(R4) ;;Clear Spin-Up indication.R2 MOVB S.ITM(R4),S.CTM(R4) ;;Start Timeout Count.) CLR S.FRK+2(R4) ;;Reset Fork Interlock.V MTPS #PR0 ;;Allow Interrupts. RETURN ;+&; **-SELERR-Issue Select Error Message;,A; IF Not Diagnostic or ACP - Issue a Select Error Message to the )+; System Console Terminal every 15 seconds M3; (the unit is subsequently checked once a second),3; until Tape Drive comes ready or Request Aborted. B;-5SELERR: MOV #IE.DNR&377,R0 ;Assume Not Ready Status.49 BITB #US.SUP,U.STS(R5) ;User Mode Diagnostics or IQ.X? $ BNE 5$ ;IF NE, Yes - End Request./ TST U.ACP(R5) ;End Request if associated ACP?l BEQ 10$ ;IF EQ, No.05$: JMP EXTNST ;End Request - Device Not Ready'10$: CALL RLSDRV ;Release Tape Drive,a" CALL $RLSUB ; TM Subcontroller# CALL $RLCN ; and RH Controller.s4 DECB S.STS(R4) ;Time for a 'Select Error' message? BNE TIMER ;IF NE, No.+ MOV #T.NDSE,R0 ;Set up Error Message Code 2 MOVB #15.,S.STS(R4) ; and set up 15 sec Timeout.4 CALL $DVMSG ;Send the Error Message to Sys Consl.,TIMER: MOVB #1,S.CTM(R4) ;Set up a Timeout./TIMER1: CLR S.FRK+2(R4) ;Reset Fork Interlock.1 RETURN ;Wait for Timeout.T.PAGE ;+'; **-MMOUT - Device Timeout Entry PointV;;N; I/O Timeouts may be caused by Powerfailure or other Hardware considerations.;o; TIMEOUT CONSIDERATIONS: ;iI; 1. An RH Controller supports Parallel Operation and requires Concurrent G; Operation synchronization. An RH supports one current Drive Data iJ; Transfer Operation overlapped with other Drive(s) Non Data Transfers.O; There may be further restrictions on each Drive - i.e. Spacing Operations I; on a given Drive may not overlap Data Transfers on the same Drive.r;oL; 2. The RH Controller is operated with Interrupt ENABLED - this may result H; in an Interrupt occuring simultaneously with Driver being called atJ; Timeout Entry point. The Interrupt may be from some external event, =; such as a RWD completing, or a Tape Drive coming Online.p;tM; The Driver must be prepared for such an occurence - this is done by the eM; interlock S.FRK+2; IF S.FRK+2 is Zero, Interrupt processing is allowed. v;aH; 3. Another problem exists when a Driver has QUD a Fork while the Exec L; was sequencing to the same Driver's Timeout Entry Point. Timeout EntryD; code sequences with a Fork Block currently in the Fork Queue. ;p ; Inputs:I; R4 > SCB. R5 > UCB.m;- .ENABL LSB 3MMOUT: TST S.FRK+2(R4) ;;;Interrupt handling I/O ?n+ BEQ 10$ ;;;IF EQ, No - Device timed out.r' RETURN ;;;Interrupt will handle it.y010$: INC S.FRK+2(R4) ;;;Timeout will handle it.! MTPS #PR0 ;;;Allow interrupts.v& CALL $RQSUB ;Request Subcontroller.' CMPB #FRREV,U.FCDE(R5) ;Data Transfer?  BLT 20$ ;IF LT, No.6 CALL $RQCND ;Request Controller for DT XFR Function BR 30$ ; .. Continuer920$: CALL $RQCNC ;Request Controller for Cntrl Function430$: MOV U.KRB1(R5),R3 ;R3 - % MOVB K1.CON(R3),R3 ; Subcontroller t ASL R3 ; as Word Index.;% CALL SELDRV ;Select Subcontroller.R. MOV #IE.DNR&377,R0 ;Assume Not Ready Status.5 BIT #M.RWD,U.CW2(R5) ;Tape Drive in previous Rewind?l BEQ 40$ ;IF EQ, No.; Tape Drive in previous RWD.' BITB #US.ABO,U.STS(R5) ;Abort Request?- BNE 53$ ;IF NE, Yes - End current Request. 1 CALL SELECT ;Tape Drive available for Request?i835$: BCS SELERR ;IF CS, No - Issue 'Select Error' Msg.3 BIT #M.RWD,U.CW2(R5) ;Tape Drive - still RWD mode?N. BEQ 60$ ;IF EQ, No - Start current Request.2WTRWD: CALL RLSDRV ;ELSE Release the Tape Drive,% CALL $RLSUB ; Subcontroller anda! CALL $RLCN ; RH Controller.r! BR TIMER ;W00Pe-dibjbkb a a aait for one second. (; Tape Drive had I/O previously started.-40$: MOV SPTBL(R3),R1 ;Spacing via BLKS/TMK?B BEQ 52$ ;IF EQ, No. CMP R1,MTFC(R2) ;Blank tape?2 BEQ 50$ ;IF EQ, Yes. End Rqst(Can't Stop Tp Sp)8 MOV MTFC(R2),SPTBL(R3) ;Remember Blocks/TMK's spaced.! MOVB S.ITM(R4),S.CTM(R4) ;Wait  BR TIMER1 ; some more.D; Device I/O Timeout - Current I/O Not Completed in reasonable time.'50$: CALL $DVTMO ;Log Device Timeout. ' BCS 80$ ;IF CS, Diagnostic Function.1 JMP FATAL ;End Request - Space Timeouts Fatal.h-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.@; Timeouts are not retried because the tape position is unknown.;c(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.L?; The following handles a timeout during a diagnostic function.c;n480$: CALL SELDRV ;Select Subcontroller/Tape Drive.& CALL MMDINT ;Pass Device Registers.F; NOTE: The following may cause all I/O on other Drive(s) attached to G; the same RH Controller to abort. Other I/O requests will be handledu1; by their respective Driver Timeout handling. E,; *** Exception - Tape Spacing operations.; , MOV #SCLR,RHCS2(R2) ;RH Subsystem Clear - + ; Stop all I/O on that RH Controller.e/ CALL SELECT ;Select Subcontroller/Tape Drivea 90$: JMP EXTNST ; and Request. .DSABL LSB;.PAGES;+; **-MMCAN - Cancel I/O RequestT;->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.e 10$: RETURNa;+!; **-MMPWF - Power Fail Recovery u;aI; Powerfail is handled via the Device Timeout Facility - to avoid a race C>; condition that could exist in restarting the I/O Operation.;-/MMPWF: BCS 10$ ;IF CS, Controller Power Fail.p/ BISB #US.PWF,U.STS(R5) ; ELSE, Unit Power FailB(10$: RETURN ; Disallow normal QIO'S.;+;; **-MMINT RH11/RH70 TM02/TM03 Interrupt service routine.i;T5; R3 > KRB R5 > UCB (owner) - data transfer interrupt ,; R5 > UCB (1st slave) - other interrupts;-$MMINT::NOP ;;;" MOV U.KRB1(R5),R4 ;;;R4 > KRB1. MOV K1.OWN(R4),R5 ;;;R5 > UCB.# BNE 10$ ;;;IF NE - Owner exists.n5 MOV (R4),R5 ;;;Use Subcontroller's Tape Drive UCB..#10$: MOV U.SCB(R5),R4 ;;;R4 > SCB.l' TST S.FRK+2(R4) ;;;Fork Block in use? . 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.4; If interrupt not during non-data I/O - discard it. MOV U.KRB1(R5),R2 ;;;R2 > KRB1 TST K1.STS(R2) ;;;Started I/O? BEQ 14$ ;;;IF EQ, No.;?; Interrupt from SSC and non-data I/O complete asynchronously. ; MOV (R3),R2 ;;;R2 - CSR.i/; If non-data I/O complete - service interrupt.T- BIT #PIP,MTDS(R2) ;;;Non-data I/O complete?$ BEQ 13$ ;;;IF EQ, Yes.  MOV (R2),-(SP) ;;;Isolate I/Os$ BIC #^C<77>,(SP) ;;; Command Code.% CMP #6,(SP)+ ;;;Just completed RWD?;) BEQ 13$ ;;;IF EQ, yes - RWD initiated.t ; If SSC interrupt - discard it.% BIT #SSC,MTDS(R2) ;;;SSC condition? BNE 14$ ;;;IF NE, Yes. -13$: CALL $FORK ;;;Create a system process.r MOV U.KRB1(R5),R1 ;R1 > KRB1.a' CLR K1.STS(R1) ;K1.STS .EQ. I/O over.C TST K1.OWN(R1) ;Owned?- BNE 20$ ;IF NE, Yes - Solicited Interrupt.)4; Presently Unsolicited Interrupts are disregarded..14$: CALL $RQSUB ;Request the Subcontroller,! CALL $RQCNC ; Controller and,. CALL SELDRV ; Formatter/Tape Drive. C BIT #M.RWD!M.SER,U.CW2(R5) ;Previously Rewinding or Select Error?S BEQ 15$ ;IF EQ, No.5 INCB S.CTM(R4) ;Timeout Count - per original value.;'15$: CALL RLSDRV ;Release Tape Drive,5 CALL $RLSUB ; Subcontroller# CALL $RLCN ; and RH Controller.W+ CLR S.FRK+2(R4) ;Reset Fork interlock andc.18$: RETURN ; discard Unsolicited Interupt.120$: B00P!edc__DATADATADATADATAICB #S3.SIP,S.ST3(R4) ;I/O not in progress.h) BITB #US.ABO,U.STS(R5) ;Abort Request?l BEQ 25$ ;IF EQ, No. MOV #IE.ABO&377,R0 ;Aborting  BR ENDRQS ; Request.(25$: MOV #IS.SUC&377,R0 ;Assume Success/ MOVB K1.CON(R1),R3 ;Retrieve Formatter Number ASL R3 ; and make Word Index.6 MOV DONADR(R3),DONTBL+FRTRY ;Set Retry done Address.. MOVB U.FCDE(R5),R1 ;Retrieve Function Index.7 BIT #M.EOF!M.BOT,U.CW2(R5) ;Tape Mark seen last time?R BEQ 40$ ;IF EQ, No., BIS #M.PEOV,U.CW2(R5) ;Set for EOV check.@40$: BIC #NEWBTS,U.CW2(R5) ;Status bits that may have changed./ CALL SELECT ;Select subcontroller/tape unit.;# BIT #TRE,(R2) ;RH Transfer Error? BNE 50$ ;IF NE, Yes. *45$: BIT #ERR,MTDS(R2) ;Tape Drive Error? BNE 60$ ;IF NE, Yes.A. JMP @DONTBL(R1) ;No I/O Error - End Request. ; RH Controller Transfer Error -350$: BIT #CPE,(R2) ;Parr Err, MASSBUS Control Bus?B) BNE FATAL ;IF NE, Yes - Unrecoverable.l! MOV RHCS2(R2),R0 ;R0 - Possible+ BIC #^C,R0 ; RH Error Indication. BEQ 60$ ;IF EQ, No.+ BIT #DLT!UPE!DPE,R0 ;Repositioning Error?L BNE 67$ ;IF NE, Yes.t BIT #PGE!NED,R0 ;Retry Error?) BNE 57$ ;IF NE, Yes.B BIT #MXF,R0 ;Missed Transfer? BEQ 53$ ;IF EQ, No.# CMPB #4,U.FCDE(R5) ;Read Reverse?J BNE 57$ ;IF NE, No./ BIT #M.BOT,U.CW2(R5) ;BOT during Read Reverse?E 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)2(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.G57$: CALL LOGERR ;Log Error5 JMP FNCEX ;Reissue Request.3; Drive Error Indication - Determine IF RecoverableU*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?T BEQ FATAL ;IF EQ, No - Fatal.+67$: MOV MTER(R2),R0 ;R0 - Error Register.N4 JMP @CHKTBL(R1) ;Recover per Specific I/O Request.%; Unrecoverable Request - End Request7 FATAL: CALL LOGERR ;Log Error.* MOV #IE.FHE&377,R0 ;Unrecoverable Error."ENDRQS: JMP EXTNST ;End Request..PAGE:;+1; **-REVERR - Read Reverse Special Error Checking,; "; Test for Read Reverse into BOT.,; IF BOT THEN IS.SUC and Zero Byte Count.;- .ENABL LSB$,REVERR: BIT #OPI,R0 ;Operation Incomplete?. BEQ REDERR ;IF EQ, No - Not a BOT Condition! BIT #BOT,MTDS(R2) ;Tape at BOT?t+ BEQ FATAL ;IF EQ, No - Errors are Fatal. + BIS #M.BOT,U.CW2(R5) ;Indicate BOT Status. $ CLR MTFC(R2) ;No Data Transferred. BR 50$ ;End Request. ;+!; **-REDERR - Read Error CheckingT;-2REDERR: BIT #INC!PEF!DTE!FMT!CPR,R0 ;Retry Error? BNE 20$ ;IF NE, Yes." BIT #FCE,R0 ;Frame Count Error? BNE 30$ ;IF NE, Yes.U!10$: BIT #PES,MTDS(R2) ;PE Tape? ( BNE 40$ ;IF NE, Yes - Corrected Data.!20$: JMP COMRTY ;Retry Request.-"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 ;Log Error.)50$: MOV #IS.SUC&377,R0 ;Indicate SucessI(60$: JMP @DONTBL(R1) ; and End Request. .DSABL LSBF;+;; **-RWDERR/RWDRTY - Rewind .OR. Unload/Offline Error RetryY;-RWDERR:T2RWDRTY: BIC #M.1600,U.CW2(R5) ;Setup for 800BPI.2 BIT #TC.1600,FMTBL(R3) ;Last Request at 1600BPI?' BNE 10$ ;IF NE, Yes - Try 800BPI.B2 BIS #M.1600,U.CW2(R5) ;Setup to try at 1600BPI.410$: CMP #RETRY,RTTBL(R3) ;Retried at least once? BNE FATAL ;IF NE, Yes. DECB RTTBL(R3) ;Retry JMP PRCOM ; only once..PAGEC;+,; **-SPRERR - Space Reverse - Error Handling;- .ENABL LSB.,SPRERR: BIT #BOT,MTDS(R2) ;BOT Encountered? BEQ SPFEXT ;IF EQ, No.o+ BIS #M.BOT,U.CW2(R5) ;Indicate BOT Status..& MOV #IS.SUC&377,R0 ;Indicate Success BR 30$ ; and End Request.;+,; **-SPFEXT - Space Forwar00P)e-dibjbkb a a ad - Error Handling(; Space Functions - Completion Routines;-,SPFEXT: BIT #OPI,R0 ;Operation Incomplete?' BNE FATAL ;IF NE, Yes - Fatal Error.e& MOV #IS.SUC&377,R0 ;Indicate Success*10$: BIT #TM,MTDS(R2) ;Detected Tapemark? BEQ 30$ ;IF EQ, No./ MOV #IE.EOF&377,R0 ;Indicate Tapemark Status.D( 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?6SPCONT: CLR U.CNT(R5) ;Clear Requested Count for Calc( MOV #IE.EOV&377,R0 ;Assume EOV ending.. BIS #M.AEOV,U.CW2(R5) ;Indicate EOV status./30$: MOV S.PKT(R4),R1 ;Get I/O Packet Address.' CMPB #IO.SPF,I.FCN(R1) ;Space Files??, BEQ SPFDON ;Yes - Endup Files Completion.E; This works because we only get to SPRRTY: for successful completionBB; of the backup (Also MTFC=0), and IO.SPB cannot detect EOV after6; spacing over any blocks. (IO.SPF Doesn't Use U.CNT);T;Space Blocks - FWD/REV;P,SPRRTY: TST MTFC(R2) ;Enough Blocks Spaced? BEQ 35$ ;Yes - End Request.) BIT #TM!BOT,MTDS(R2) ;TMK or BOT seen?; BNE 35$ ;Yes - End Request.- MOV U.CNT(R5),R0 ;Retrieve Requested Count.I2 SUB MTFC(R2),R0 ;Calculate actual number spaced., ADD R0,SPTOTL(R3) ;Add it to total spaced./ MOV MTFC(R2),U.CNT(R5) ;Update Current Countt4 MOV MTFC(R2),SPTBL(R3) ; and save it for timeout." BR 70$ ;Try to Space some more.135$: MOV U.CNT(R5),R1 ;Retrieve Requested Count.o2 SUB MTFC(R2),R1 ;Calculate actual number spaced.0 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.s' MOV #IS.SUC&377,R0 ;Indicate Success,t( BR 50$ ; Setup count and End Request.+SPFDON: BIT #BOT!TM,MTDS(R2) ;BOT or TMK?n! BEQ 70$ ;IF EQ, No - Continue.T, BIT #BOT,MTDS(R2) ;Stopped for BOT or EOV?% BNE 50$ ;Don't increment the countF* BIT #M.AEOV,U.CW2(R5) ; because we didn't BNE 50$ ; pass a file.& INC SPRMNG(R3) ;Increment TMK Count./50$: MOV S.PKT(R4),R1 ;Get I/O Packet Address. / MOV I.PRM+4(R1),R1 ;Retreive Count Requested.)/ SUB SPRMNG(R3),R1 ;Subtract Number remaining.V-60$: NEG R1 ;Set for positive Return Value.  JMP EXIT ;End Request.s70$: JMP FNCEX .DSABL LSBS;+"; **-COMRTY - Common Retry Routine;t&; IF Retries Suppressed - End Request-; ELSE Call Function Specific Retry Routineo;-$COMRTY: CALL LOGERR ;Log the Error) MOVB U.FCDE(R5),R1 ;R1 - Function IndexN+ BITB #US.SUP,U.STS(R5) ;Retries allowed?R$ BNE 10$ ;IF NE, No - End Request.( DECB RTTBL(R3) ;Any more Retries left?$ BLE 10$ ;IF LE, No - End Request.0 MOV U.FCDE(R5),FCCDE(R3) ;Save Function Index/ MOV U.CNT(R5),CMDCNT(R3) ;Save Command CountJ0 MOV U.BUF(R5),BUFADR(R3) ;Save Buffer Address, MOVB #FRTRY,U.FCDE(R5) ;Set Retry Command7 JMP @RTYTBL(R1) ;GOTO Function Specific Retry routineo)10$: BIT #PEF!OPI,R0 ;Tape Format Error?E BEQ RTYCN1 ;IF EQ, No.;" MOV #IE.BBE&377,R0 ;Other Error.&RTYCON: JMP @DONTBL(R1) ;End Request.1RTYCN1: MOV #IE.VER&377,R0 ;Request Return Code.o BR RTYCON ;End Request..PAGE,;+; -- Write/WTMK Retry --;- .ENABL LSB (WRTRTY: MOV #FRTRY,R1 ;R1- Retry Index.3 MOV #RTNWRT,DONTBL(R1) ;I/O Cont after Reposition.3/ MOV #FC.SPR,U.BUF(R5) ;Setup I/O Request Code.  BR 15$ ;Reposition Tape.T.RTNWRT: BIT #M.IXG,U.CW2(R5) ;No Extended IRG? BNE RTYCMD ;IF NE, Yes.% BR BACK ;Recover from Write Error. ;+; -- Read FWD/REV Retry --;-REDRTY:N2REVRTY: CMP MTFC(R2),#NOISE ;800BPI - Min Record?% BLO RTYCMD ;IF LO, No - Ignore it. 'BACK: MOV #FRTRY,R1 ;R1 - Retry Index.e MOV IOFCN(R3),R0 ;R0 >" ADD #4,R0 ; Reposition Return.1 MOV (R0)+,DONTBL(R1) ;I/O Cont after Reposition.e- MOV (R0),U.BUF(R5) ;Setup I/O Request Code./115$: MOV #-1,U.CNT(R5) ;Reposition by one Block.T BR 20$ ;+; Reissue Original I/O Request;-9RT00P1edc__DATADATADATADATAYCMD: MOV FCCDE(R3),U.FCDE(R5) ;Restore Function Index,+ MOV CMDCNT(R3),U.CNT(R5) ; Command Count,N- MOV BUFADR(R3),U.BUF(R5) ; Buffer Address -c,20$: JMP FNCEX ; and Execute the Function. .DSABL LSBF.PAGE ;+-; **-REDDON - Read Forward Completion RoutineD;-EREVDON: BIC #M.EOF!M.AEOV,U.CW2(R5) ;Setup Status for REV completion.i8REDDON: MOV MTFC(R2),R1 ;Set Frame Count for Requestor./; TM03 Formatter - Auto Density setup on Reads.B6; IF TM03, Update Density Status for that Tape Unit. TM03DN: BIT #40,MTDT(R2) ;TM03? BEQ 5$ ;IF EQ, No.M/ BIT #M.BOT!M.RWD,U.CW2(R5) ;BOT or Rewinding?B BNE 5$ ;IF NE, Yes.( BIC #M.1600,U.CW2(R5) ;Assume 800BPI. BIT #PES,MTDS(R2) ;800 BPI?  BEQ 5$ ;IF EQ, Yes.' BIS #M.1600,U.CW2(R5) ;Else 1600BPI.5$: TSTB R0 ;Returning Error?.) BMI EXIT ;IF MI, Yes - More important.' BIT #BOT,MTDS(R2) ;Read REV into BOT?  BNE EXIT ;IF NE, Yes.0 CMP MTFC(R2),#NOISE ;Record at least Min Size? BHIS 10$ ;IF HIS, Yes. & BIT #M.1600,U.CW2(R5) ;1600 BPI Tape?3 BNE EXIT ;IF NE, Yes -LT Min allowed for 1600BPI,- JMP COMRTY ;LT Min not allowed for 800BPI.E810$: CMP R1,U.CNT(R5) ;Tape Data - More than Requested?# BLOS EXIT ;IF LOS, No - Success.Q& MOV #IE.DAO&377,R0 ;Inform the User. BR EXIT ;End Request.;+0; **-EOFDON - Write Tape Mark Completion Routine4; **-WRTDON - Write Logical Block Completion Routine;-)EOFDON: BIS #M.EOF,U.CW2(R5) ;TMK status.c4WRTDON: MOV U.CNT(R5),R1 ;Retrieve Requested Count.+ ADD MTFC(R2),R1 ;Calculate Actual Length.I BIT #EOT,MTDS(R2) ;EOT?o BEQ EXIT ;IF EQ, No.M/ MOV #IE.EOT&377,R0 ;EOT - Request End Status.P8 BIS #M.EOT,U.CW2(R5) ;EOT in Tape Characteristics Word. BR EXIT ;End Request./RWDDON: BIT #PIP,MTDS(R2) ;Rewind in progress?T BEQ 10$ ;IF EQ, Done.3 BIS #M.RWD,U.CW2(R5) ;Indicate Rewind in Progress.T:10$: BIC #M.AEOV,U.CW2(R5) ;No End of Volume indication.- BICB #US.PWF,U.STS(R5) ;Clear PWRFLD Status..6EXTNST: CLR R1 ;No additional Status being Returned.#EXIT: MOV @S.KRB(R4),R2 ;R2 = CSR.,0 CALL MMDINT ;Pass Dev Regs IF User Mode Diag." CALL RLSDRV ;Release the Drive.+ MOV U.KRB1(R5),R3 ;Retrieve KRB1 Address.a+ MOVB K1.CON(R3),R3 ;Get Formatter Number. ASL R3 ;Make a Word Index.e% MOVB RTTBL(R3),R2 ;Set Retry Count.D) BIS #RETRY*256.,R2 ;Set Original Count.d+ BIC #M.PEOV!7,U.CW2(R5) ;No PEOV Status.;. 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./ JMP MMINI ;Service outstanding I/O Requests.k;+-; **-CHKEOV - Check For Logical End Of VolumeD;B ; Outputs: ; C=1 If EOV; C=0 If Not EOV;-CHKEOV: CLC ;Assume Not EOV.s$ BIT #REV,U.BUF(R5) ;REV Operation?& BNE 20$ ;IF NE, Yes - can't be EOV.+ MOV MTFC(R2),-(SP) ;Retrieve frame Count.h4 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.4 BIT #M.PEOV,U.CW2(R5) ;TMK or BOT seen last time? BEQ 10$ ;IF EQ, No - CC.B SEC ;EOV. )10$: BIS #M.EOF,U.CW2(R5) ;Set EOF status 20$: RETURN .PAGEV;+; **-SELDRV - Select Tape Unit,; **-SELECT - Select And Set Hardware Status;V,; This routine attempts to select a drive. I; It sets up BOT, EOT, HWL, SER bits in the Tape Characteristics Word.n; ; Outputs:; C=0 If Good Select; C=1 If Bad SelectO;-%SELDRV: MOV @S.KRB(R4),R2 ;R2 - CSR.3 MOVB U.UNIT(R5),RHCS2(R2) ;Select the formatter.R BIT #GO,(R2) ;Go Bit Set?m+ BNE 10$ ;IF NE, Yes - don't touch MTTC !V1 MOV MTTC(R2),-(SP) ;Save Slave Select Register.: MOVB U.SNUM(R5),(SP) ;Select " MOV (SP)+,MTTC(R2) ; Slave Unit. 10$: RETURN 2SELECT: CALL SELDRV ;Select Formatter and Slave.> B00P9e-dibjbkb a a aIC #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.R2 BIS #M.SER,U.CW2(R5) ;Select Error - indicate it. RETURN 110$: BIT #PIP,MTDS(R2) ;Positioning in Progress?; BNE 20$ ;IF NE, Yes.M! BIT #BOT,MTDS(R2) ;Tape at BOT?S 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?c BEQ 20$ ;IF EQ, No." BIS #M.EOT,U.CW2(R5) ;EOT status.120$: BIT #WRL,MTDS(R2) ;Tape Drive Write-Locked?e BEQ 30$ ;IF EQ, No." BIS #M.HWL,U.CW2(R5) ;HWL status."30$: CLC ;Tape Drive available. RTRN: RETURN;+.; **-LOGERR - Subroutine To Log Device Errors;-+LOGERR: TST RTTBL(R3) ;User Mode Function?,. BMI RTRN ;IF MI, Yes - They will handle it.. JMP $DVERR ;Log the Error - They will RTRN..PAGE;+!; **-$RQSUB-Request Subcontroller;:#; Obtain Access To Subcontroller - BA; IF Allowed to perform an I/O Operation, Set Subcontroller Busy.#;, ; Inputs:T2; R5 > UCB, Requestor Unit. 0(SP)= > Driver Return; 2(SP)= > Drivers Caller. ; Outputs: ; R4 > SCB, ; R5 > UCB, Requestor Unit.;; NOTE:R; S.FRK+2 is Always Non-Zero.r/; Driver has Exclusive Access to Subcontroller.c;-$$RQSUB: MOV U.SCB(R5),R1 ;R1 > SCB. MOV U.KRB1(R5),R0 ;R0 > KRB1.e9 CMP R5,K1.OWN(R0) ;Requestor already own Subcontroller?u BEQ 10$ ;IF EQ, Yes.n% TST K1.OWN(R0) ;Subcontroller Busy?w BNE 20$ ;IF NE, Yes.a5 MOV R5,K1.OWN(R0) ;Requestor - Subcontroller Owner.U ; Requestor Subcontroller Owner.(10$: MOV R1,R4 ;Subcontroller Owner - 0 MOV #42,S.FRK+2(R4) ; IF S.FRK+2 .NE. - owned. RETURN>; Requestor not Subcontroller Owner .and. Subcontroller Busy. 420$: MOV R1,S.FRK+6(R1) ; Save SCB in R4 Save Area.+ ADD #S.FRK+6,R1 ; R1 > to R5 Save Area+2;1 MOV R5,-(R1) ; Save R5,e, MOV (SP)+,-(R1) ; Save Drivers Return @,& CLR -(R1) ; and Clear Link Word.% ADD #K1.CRQ,R0 ; R0 > to Wait Queue( JMP $QINSF ; and Queue this Request.;+!; **-$RLSUB-Release Subcontrollere;0; IF Requestor not Subcontroller Owner, Return. ;F>; ELSE Release Subcontroller, place Fork Block for subsequent:; Requests (if any) from the Controller Wait Queue to the ?; Fork Queue and make Requestor the Owner of the Subcontroller.1;t ; Inputs:r ; R4 > SCB, ; R5 > UCB of Requestor. V;P ; Outputs:#; IF Owned - Subcontroller Released ; R3 Altered ;-&$RLSUB: MOV U.KRB1(R5),R3 ;R3 > KRB1.1 CMP R5,K1.OWN(R3) ;Requestor own Subcontroller? BNE 30$ ;IF NE, No.; Requestor owns Subcontroller.r2 CLR K1.OWN(R3) ;Release Subcontroller ownership.!; Handle other Requestors Queued. 3 ADD #K1.CRQ,R3 ;R3 > Subcontroller Request Queue.e, MOV (R3),R4 ;Any other Requestors Queued?. BEQ 20$ ;IF EQ, No other Requestors Queued.* MOV (R4),(R3) ;Update Beginning of List. BNE 10$ ;IF NE, List updated. MOV R3,2(R3) ;Empty list. B10$: MOV 4(R4),K1.OWN-K1.CRQ(R3) ;Prev Reqstr - R5 from Fork List." CLR (R4) ;Clear Fork Link Word.) CALL $QFORK ;Fork Block to Fork Queue. !20$: MOV U.SCB(R5),R4 ;R4 > SCB.3 30$: RETURNu;+; **-RLSDRV - Release the Driveq;tL; IF A Multi Access (Dual Ported) Unit, Issue Drive Release and note in SCB.; ; Inputs: ; R2 > CSR.e ; R4 > SCB.$;-ERLSDRV: MOVB #TRE/256.,1(R2) ;Clear RH errors - CS1 14,13; CS2 15-8.L# BIT #PIP,MTDS(R2) ;Tape movement?.1 BNE 5$ ;IF NE, Yes - Can't init RH, tape subsyW1 MOV #TRE!10,(R2) ;Clear RH errors, selected TM.R"5$: BIT #S2.MAD,S.ST2(R4) ;RH01? BEQ 10$ ;IF EQ, No.2 MOVB #FC.RLS,(R2) ;Release Drive (Subcontroler).? BISB #S3.DRL,S.ST3(R4) ; and Show Dual Access Unit released.A*10$: MOVB #IE,(R2) ;Re-enable Interrupts. RETURN .PAGEe;+ ; **-MMDINTn;s"; IF Diagnostic Control Function, +; pass Device Registers via $CRPAS routine.o;- ; Inputs: ; R2 > CSR R4 > SCB ;-MMDINT: MOV R1,-(SP) ;Save R1* MOV S.PKT(R4),R1 ;Get I/O Packet Address3 BITB #IQ.UMD,I.00PAeQCec__DATADATADATADATAFCN(R1) ;Diagnostic Function Call?  BEQ 20$ ;IF EQ, No.; CMPB #IO.EOF/256.,I.FCN+1(R1) ;Write EOF Control Function?D BEQ 10$ ;IF EQ, Yes.S: CMPB #IO.RWD/256.,I.FCN+1(R1) ;Control other than IO.EOF? BEQ 10$ ;IF EQ, Yes.-4 CALL $CRPAS ;Pass Device Registers to Diagnostics BR 20$ ; .. Cont.510$: MOV I.PRM+14(R1),I.PRM+16(R1) ;Move WD20 to WD21u1 MOV I.PRM+12(R1),I.PRM+14(R1) ;Move WD17 to WD20' MOV R1,-(SP) ;Save I/O Packet AddressT4 CALL $CRPAS ;Pass Device Registers to Diagnostics* MOV (SP)+,R1 ;Restore I/O Packet Address6 MOV I.PRM+14(R1),I.PRM+12(R1) ;Move WD20 back to WD176 MOV I.PRM+16(R1),I.PRM+14(R1) ;Move WD21 back to WD2020$: MOV (SP)+,R1 ;Restore R1 RETURNI .ENDBEQ 10$ ;IF EQ, Yes.-4 CALL $CRPAS ;Pass Device Registers to Diagnostics BR 20$ ; .. Cont.510$: MOV I.PRM+14(R1),I.PRM+16(R1) ;Move WD20 to WD21u1 MOV I.PRM+12(R1),I.PRM+14(R1) ;Move WD17 to WD20' MOV R1,-(SP) ;Save I/O Packet AddressT4 CALL $CRPAS ;Pass Device Registers to Diagnos .TITLE MTDRV+ .IDENT /05.08/ ;t1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reservedM;(;,<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;a; VERSION 05.08r;o; SCOTT G. DAVIS 9-JUL-74.;n; PREVIOUSLY MODIFIED BY:,;R; P. J. BEZEREDI; D. N. CUTLER ; S. G. DAVIS.; C. A. D'ELIA ; B. LYONS; T. J. MILLER; F. L. STRAIGHT;d; MODIFIED BY:;S;;;s+; PB122 -- RETURN IS.SUC FOR EOT ON READS.;D5; TL069 -- CHECK THAT A CANCEL IS ISSUED BY THE TASK,'; WHICH ISSUED THE CURRENT OPERATION(;,.; TL070 -- RETURN THE CORRECT BLOCK COUNT FOR; IO.SPB AT EOV;P#; TL071 -- FIX BRANCH OUT OF RANGE ;S#; TL074 -- DO NOT LOG DATA OVERRUNo; *; TL075 -- RETURN EOV FOR IO.SPF, NOT EOT;F8; CS001 -- TAPE DENSITY SUPPORT IDENTIFICATION IN U.CW3;.2; CS002 -- DEVICE NOT READY IF TAPE UNIT OFF LINE;T); CS003 -- BOT STATUS IF TAPE UNIT READYP;2"; CS004 -- REMOVE REDUNDANT CODE,%; S2.ACT NOT BEING RESET IN S.ST2.S;S-; CS005 -- IO.STC/IO.SMO 1600BPI NOT ALLOWED '; ALLOW BAD TAPE READ ERROR RECOVERYR;T.; CS006 -- CORRECT CS003; BOT STATUS VALID IF*; TAPE UNIT READY .OR. ENDING OPERATION; >; CS007 -- HANDLE CALL FOR CONTROLLER POWER FAIL (C BIT SET).;T;T;F&; TM11 MAGNETIC TAPE CONTROLLER DRIVER;C; MACRO LIBRARY CALLSC;2* .MCALL HWDDF$,PKTDF$,ABODF$,CLKDF$,UCBDF$ HWDDF$0 PKTDF$  ABODF$  CLKDF$  UCBDF$ ;DEFINE UCB OFFSETSR;T; EQUATED SYMBOLS ; %US.ABO=1 ;ABORT IN PROGRESS - U.STSO2US.BSP=2 ;INTERNAL BACKSPACE IN PROGRESS - U.STSUS.PWF=10 ;POWER FAIL STATUSRETRY=12 ;RETRY COUNTT;U; REGISTER BIT SYMBOLS;RCS.GO=1 ;GO!CS.EXM=60 ;EXTENDED MEMORY BITSLCS.IE=100 ;INTERRUPT ENABLEB"CS.RDY=200 ;CONTROLLER READY BITCS.EVN=4000 ;EVEN PARITYCS.CLR=10000 ;POWER CLEAR#CS.DN5=20000 ;556 BPI DENSITY BITC#CS.DN8=40000 ;800 BPI DENSITY BITCDS.TUR=1 ;TAPE UNIT READYFDS.RWS=2 ;REWINDINGEDS.HWL=4 ;WRITE LOCKDS.SDN=10 ;SETTLE DOWNDS.7CH=20 ;UNIT IS 7 CHANNELDS.BOT=40 ;BEGINNING OF TAPEDS.MOL=100 ;MEDIUM ON LINEDS.BTE=400 ;BAD TAPE ERROR"DS.RLE=1000 ;RECORD LENGTH ERROR#DS.EOT=2000 ;END OF TAPE DETECTEDYDS.BGL=4000 ;BUS GRANT LATEEDS.PAE=10000 ;PARITY ERROR)DS.CRE=20000 ;CYCLICAL REDUNDANCY ERRORS!DS.TM=40000 ;TAPE MARK DETECTED2 DS.ILG=100000 ;ILLEGAL COMMAND(RD.GAP=10000 ;GAP SHUTDOWN IN PROGRESS1RD.LPC=40000 ;READ LPC CHARACTER AND RTTBL FLAGL;;H; MAG TAPE STATUS REGISTER BIT DEFINITIONS (SENSE AND SET CHARACTERISTIC;40M.PEOV=100000 ;TAPE PAST LOGICAL END OF VOLUME-M.AEOV=40000 ;TAPE AT LOGICAL END OF VOLUMERM.BOT=20000 ;TAPE AT BOT M.7CH=10000 ;UNIT IS 7 CHANNEL0M.1600=4000 ;TAPE DENSITY CONTROL - '0'=800BPI!M.HWL=2000 ;HARDWARE WRITE LOCKDM.RWD=1000 ;UNIT IS REWINDINGP%M.SER=400 ;SELECT ERROR HAS OCCUREDG4M.IXG=200 ;INHIBIT WRITE WITH EXTENDED INTERRECORD M.SWL=100 ;SOFTWAR00QIe-dibjbkb a a aE WRITE LOCK.M.EOF=40 ;LAST COMMAND ENCOUNTERED TAPE MARK(M.EOT=20 ;LAST COMMAND ENCOUNTERED EOTM.EVN=10 ;EVEN PARITY0+M.CDM=4 ;CORE DUMP MODE (7 CHANNEL ONLY)V$M.200=2 ;200 BPI (7 CHANNEL ONLY)$M.556=1 ;556 BPI (7 CHANNEL ONLY)0USRBTS=317 ;STATUS BITS CONTROLLED BY THE USERDNEWBTS=M.PEOV!M.BOT!M.EOF!M.EOT ;STATUS BITS TO BE SET BEFORE $IODON;; ; COMMANDS;NRWU=101 ;REWIND AND OFFLINERED=103 ;READWRT=105 ;WRITEWWEF=107 ;WRITE END-OF-FILE=SPF=111 ;SPACE FORWARDSPR=113 ;SPACE REVERSEC#WTE=115 ;WRITE WITH EXTENDED GAPCRWD=117 ;REWIND-U.SPC = U.VCB+2 ;SPACING COUNT, RDBLK TEMP.M;E; LOCAL MACROS;;0;; THE FOLLOWING MACRO DEFINES ENTRIES IN THE FUNCTION TABLEN;O..MACRO DFENT COM,TIMOUT,PWF,OPCODE,TYPE,INTADD .WORD COM .BYTE PWF,TIMOUT. .BYTE TYPE,OPCODE .WORD INTADDF .ENDM DFENT; ; LOCAL DATA;W>; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER);;; DIAGNOSTIC FUNCTIONS USE BITS 14-15 OF RTTBL AS FLAGS FORP"; INTERRUPT AND FUNCTION HANDLING.'RTTBL: .BLKW T$$M11 ;ERROR RETRY COUNTI(SPTBL: .BLKW T$$M11 ;FOR SPACE CHECKING8INTADD: .BLKW T$$M11 ;CURRENT INTERRUPT SERVICE ADDRESS;E; LEGAL FUNCTION DISPATCH TABLEL;8LGFCN: DFENT IO.RLB,8.,0,RED,0,RDBLK ;READ LOGICAL BLOCK3 DFENT IO.WLB,6.,0,WRT,0,WRBLK ;WRITE LOGICAL BLOCKT/ DFENT IO.EOF,2.,0,WEF,0,WREOF ;WRITE TAPE MARKT& DFENT IO.RWD,2.,1,RWD,0,REWND ;REWIND4 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 FILE/ DFENT IO.STC,0,-1,0,-1,-1 ;SET CHARACTERISTICSC1 DFENT IO.SEC,0,-1,1,-1,-1 ;SENSE CHARACTERISTICST9 DFENT IO.SMO,0,1,-1,-1,-1 ;MOUNT AND SET CHARACTERISTICS!ENDFCN=. ;END OF FUNCTION TABLER;;; DRIVER DISPATCH TABLET;.( DDT$ MT,T$$M11 ;GENERATE DISPATCH TABLE;+2; **-MTINI-TM11 MAGNETIC TAPE CONTROLLER INITIATOR;WH; 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 THESH; 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 LSBS7MTINI: GTPKT$ MT,T$$M11 ;GET NEXT I/O PACKET TO PROCESSE;.1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:D;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.;ED; TM11 MAGNETIC TAPE FUNCTION INDEPENDENT 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.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/IO.RWD/IO.SPB/IO.SPF/IO.EOF)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.U; 9 MOV #$MTCLK,S.MTCK+C.SUB(R4) ;SET ADDR OF CLOCK ROUTINEO# CLR S.FRK+2(R4) ;INIT FORK PC WORDO- MOV #LGFCN,R2 ;POINT TO LEGAL FUNCTION TABLEE( CLRB RTTBL+1(R3) ;CLEAR DIAGNOSTIC FLAG$ MOV I.FCN(R1),R0 ;GET FUNCTION CODE+ BITB #IQ.UMD,R0 ;DIAGNOSTIC FUNCTION CALL?O BEQ 20$ ;IF EQ NO67 MOV #100000,RTTBL(R3) ;STOP RETRIES AND SET DIAG. FLAGO5 CMP #IO.LPC!IQ.UMD,R0 ;READ LPC CHARACTER FUNCTION?S BNE 15$ ;IF NE NOO* BIS00QQeCec__DATADATADATADATA #RD.LPC,RTTBL(R3) ;SET LPC READ FLAG0 MOV #IO.RLB!IQ.UMD,R0 ;CONVERT TO READ LOGICAL% MOV R0,I.FCN(R1) ;SAVE FOR LATER USE -15$: BIC #IQ.UMD,R0 ;CLEAR FOR FUNCTION CHECK320$: BICB #IQ.X,R0 ;CLEAR IQ.X WILL BE TESTED LATER  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?  BNE 20$ ;IF NE NO0 BR 40$ ;ILLEGAL FUNCTION! JMP 230$ ;FINISH IN COMMON CODE.;0; FUNCTION CODE MATCH FOUNDN;.35$: BITB #US.PWF,U.STS(R5) ;POWER FAIL OCCUR? BEQ 45$ ;IF EQ NO# TSTB (R2) ;LEGAL FUNCTION? BMI 45$ ;IF MI YES% BNE 43$ ;IF NE THIS IS A BETTER ONEC40$: MOV #IE.IFC&377,R0 ;NOO JMP 230$ ;INFORM THE USER;243$: BICB #US.PWF,U.STS(R5) ;ALLOW ALL FUNCTIONS345$: MOV (R2)+,S.CTM(R4) ;SET UP FOR PROPER TIMEOUTT# 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 FUNCTIONR)50$: BEQ 90$ ;IF EQ NON-SPACING FUNCTIONR;L/; SPACING FUNCTION DEPENDENT I/O PACKET FORMAT:I;E@; WD. 12 -- SPACING COUNT (POSITIVE=FORWARD, NEGATIVE=BACKWARD).; WD. 13 -- NOT USED.B; WD. 14 -- NOT USED. ; WD. 15 -- NOT USED.5; WD. 16 -- NOT USED.;:; WD. 17 -- RELOCATON BIAS OF DIAGNOSTIC REG. BLK. ADDRESS?; WD. 20 -- DIAG. REG. BUFFER ADDRESS (REAL OR DISPL. + 140000)C; 5 BISB #S3.SIP,S.ST3(R4) ;SET POSITIONING IN PROGRESS$= MOV U.BUF(R5),I.PRM+4(R1) ;MOVE SPACING COUNT TO COMMON PLAC:- CLR U.BUF(R5) ;RESET TO TAKE ON OPCODE BELOW = MOV I.PRM+4(R1),U.CNT(R5) ;MOVE SPACING COUNT TO COMMON PLAC & BNE 60$ ;IF NE SOME SPACING REQUIRED/ CLR I.PRM+4(R1) ;CLEAR COUNT FOR STATUS RETURN  JMP 220$ ;NO SPACING REQUIRED5!60$: BMI 65$ ;IF MI SPACE REVERS- BIT #M.AEOV,U.CW2(R5) ;AT EOV?G BEQ 70$ ;IF EQ NO - PROCEEDG! MOV #IE.EOV&377,R0 ;STILL AT EOVL/ CLR I.PRM+4(R1) ;CLEAR COUNT FOR STATUS RETURN  JMP 230$ ;TELL THE USERM65$: ;REFERENCE LABEL) NEG U.CNT(R5) ;CONVERT TO POSITIVE COUNTB NEG I.PRM+4(R1) ;THIS ONE, TOOE8 BIS #2,U.BUF(R5) ;CHANGE SPACE FORWARD TO SPACE REVERSE/70$: CMPB -1(R2),#1 ;SPACE FILE OR SPACE BLOCK?D BEQ 80$ ;IF EQ SPACE BLOCK6 MOV U.CNT(R5),U.SPC(R5) ;SAVE COUNT OF FILES TO SPACE+ NEG U.SPC(R5) ;SET UP FOR FINAL ACCOUNTINGE( MOV #-1,U.CNT(R5) ;SET UP FOR BIG SPACE080$: MOV U.CNT(R5),SPTBL(R3) ;SAVE SPACING COUNT/ NEG SPTBL(R3) ;MAKE IT MATCH REGISTER CONTENTS% BR 110$ ;SKIP SOME CHECKS AND BIC'SF;E:; READ/WRITE LOGICAL FUNCTION DEPENDENT I/O PACKET FORMAT:;4+; WD. 12 -- RELOCATION BIAS OF DATA BUFFER.G ; WD. 13 -- DATA BUFFER ADDRESS.-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.D; WD. 15 -- NOT USED.E; WD. 16 -- NOT USED.U; WD. 17 -- NOT USED. :; WD. 20 -- RELOCATON BIAS OF DIAGNOSTIC REG. BLK. ADDRESS?; WD. 21 -- DIAG. REG. BUFFER ADDRESS (REAL OR DISPL. + 140000)T;RG; NO FUNCTION DEPENDENT PARAMETERS ARE REQUIRED FOR REWIND OR WRITE EOF; 90$: ;REF LABEL .IF DF M$$EXT, CALL $STMAP ;SET UP UNIBUS MAPPING ADDRESS .ENDC7 CMPB -2(R2),#2 ;WRITE EOF, REWIND OR REWIND & OFFLINE?-, BEQ 100$ ;IF EQ YES - SEE IF WRITELOCK SET CMPB (R2),#WRT ;WRITE? BNE 110$ ;IF NE NO. MOV #IE.SPC&377,R0 ;ASSUME PARAMETER PROBLEMS! CMP I.PRM+4(R1),#14. ;TOO SHORT?G BLO 163$ ;IF LO YESS BR 105$ ;SKIP EXMEM BIT CLEARD*100$: CLR U.BUF(R5) ;NOTHING THERE FOR WEF5 BISB #S3.SIP,S.ST3(R4) ;SET POSITIONING IN PROGRESS  CMPB (R2),#WEF ;WRITE EOF?F/ BNE 110$ ;IF NE NO, SKIP CHECK FOR WRITE LOCKU6105$: MOV #IE.WLK&377,R0 ;ASSUME (SOFTWARE) WRITE LOCK BIT #M.SWL,U.CW2(R5) ;LOCKED? BNE 163$ ;IF NE YESFC110$: BISB (R2)+,U.BUF(R5) ;PICK UP FUNCTION CODE FROM COMMAND TABL;3 MOV (R2),INTADD(R3) ;SET INITIAL INTERRUPT ADDRESSE$ TST RTTBL(R3) ;DIAGNOSTIC FUNCTION?# BMI 120$ ;IF MI YES, STOP RETRIESS* MOV #RETRY,RTTBL(R3) ;SET UP RETRY COUNTS-120$: CALL SELECT ;SELECT THE REQUIRED DRIVE;) BCS SELERR ;IF CS SELECT ERROR OCCURREDE2 MOV U.CW2(R5),R1 ;PICK UP DRIVE'S CHARACTERISTICS% BIT #00QYe-dibjbkb a a aM.EVN,R1 ;EVEN PARITY REQUIRED?; BEQ 140$ ;IF EQ NO2 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 MODE?; BNE 170$ ;IF NE YESB BIT #M.556,R1 ;556 BPI? BNE 150$ ;IF NE YEST- BIC #CS.DN5,U.BUF(R5) ;RESET BIT FOR COMMAND  BIT #M.200,R1 ;200 BPI? BEQ 170$ ;IF EQ NO.150$: BIC #CS.DN8,U.BUF(R5) ;RESET COMMAND BIT BR 170$;AC; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING TERMINATED.EA; IF THE OPERATION WAS DIAGNOSTIC, THE QIO REQUEST IS TERMINATED. A; TIMEOUTS ARE USUALLY CAUSED BY POWERFAILURE BUT MAY ALSO BE THE;F; RESULT OF HARDWARE CONSIDERATIONS. IN PARTICULAR, A LENGTHY SPACING:; OPERATION MAY RESULT IN A TIMEOUT WHICH WILL BE IGNORED.;;1MTOUT: MOV S.CSR(R4),R2 ;;;PICK UP ADDRESS OF CSRM$ BITB #US.ABO,U.STS(R5) ;;;ABORTING? BEQ 152$ ;;;IF EQ NO/ BIC #M.RWD,U.CW2(R5) ;;;REWIND NOT IN PROGRESS BR 162$ ;;;TERMINATE152$: ;;;REFERENCE LABELO* MOVB S.CON(R4),R3 ;;;FETCH CONTROLLER NO.# BIT #M.RWD,U.CW2(R5) ;;;REWINDING?N BNE 155$ ;;;IF NE YESU' MOV SPTBL(R3),R0 ;;;SPACE IN PROGRESS?B BEQ 154$ ;;; IF EQ THEN NO# CMP R0,2(R2) ;;;IS THE TAPE BLANK?T BNE 153$ ;;; IF NE THEN NO$ CALL $DTOER ;;; LOG DEVICE TIMEOUT) BR 161$ ;;; EXIT WITH IE.DNR ERROR CODEP153$: ;;; REF. LABELU6 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 TIMEOUT;+ BCS 161$ ;IF CS ABORT DIAGNOSTIC FUNCTION;/155$: BIC #CS.IE,(R2) ;;;CLEAR INTERRUPT ENABLEL MTPS #0 ;;;ALLOW INTERRUPTS0 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? / BEQ 120$ ;IF EQ NO - REISSUE ORIGINAL COMMANDA. 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 TIMEOUTA&160$: BIT #M.RWD,U.CW2(R5) ;REWINDING? BNE 164$ ;IF NE YESG3161$: MOV #IE.DNR&377,R0 ;INDICATE DEVICE NOT READYR4162$: CALL MTDINT ;PASS DIAGNOSTIC DEVICE REGISTERS$ BIS #CS.CLR,(R2) ;RESET CONTROLLER#163$: JMP 230$ ;REPORT FATAL ERROR,/164$: BIT #DS.MOL,-2(R2) ;EVERYTHING COPASETIC?5 BEQ SELERR ;IF EQ NO$ BIT #DS.BOT!DS.RWS,-2(R2) ;TAPE OK? BNE 165$ ;IF NE OK8SELERR: MOV #IE.DNR&377,R0 ;NOT READY - IF TAPE OFF LINE$ TST RTTBL(R3) ;DIAGNOSTIC FUNCTION?. 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 BITR 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 MESSAGE7 BR 172$ ;SET THE TIMOUTF*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 COMPLETEF&170$: BIT #M.RWD,U.CW2(R5) ;REWINDING? BEQ 177$ ;IF EQ NO)172$: MOVB #1,S.CTM(R4) ;SET UP A TIMEOUTE RETURN ;THAT IS ALL FOR NOW&175$: BIS #M.BOT,U.CW2(R5) ;SAY AT BOT177$: ;REF LABELB .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 NEEDED, MOV R2,-(SP) ;SAVE R2% CALL $MPUBM ;MAP UNIBUS TO TRANSFER( MOV (SP)+,R2 ;RESTORE R2B .ENDC7178$: CMP (R2)+,(R2)+ ;POINT TO MEMORY ADDRESS REGISTERI, MOV U.BUF+2(R5),(R2) ;SET UP BUFFER ADDRESS0 MOV U.CNT(R5),-(R2) ;SET UP BYTE COUNT REGISTER NEG (R2) ;NEED 2S COMPLEMENT@180$: MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNT7 BIC #M.AEOV!M.SER!M.RWD,U.CW2(R5) ;RESET VARIOUS FLAGSU$ BICB #US.BSP,U.STS(R5) ;RESET FLAGS/ BIT #RD.LPC,RTTBL(R3) ;READ LPC CHAR FUNCTION?T BEQ 185$ ;IF EQ NO- BIS #RD.LPC,6(R2) ;SE00QaeCec__DATADATADATADATAT LPC READ IN MTRD REG.E'185$: CALL $BMSET ;SET I/O ACTIVE FLAG+ MOV U.BUF(R5),-(R2) ;INITIATE THE FUNCTIOND RETURN ;DONEM;B7; CANCEL I/O OPERATION IS A NOP FOR TM11 MAGNETIC TAPES);E.MTCAN: CMP I.TCB(R0),R1 ;CANCEL FOR THIS TASK? BNE 111$ ;BRANCH IF NOT)2 BISB #US.ABO,U.STS(R5) ;FLAG THE ABORT CONDITION 111$: RETURN;DH; 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.L;M/MTPWF: BCS 112$ ;IF CS, CONTROLLER POWER FAIL.N/ BISB #US.PWF,U.STS(R5) ; ELSE, UNIT POWER FAILA ; DISALLOW NORMAL QIO'S. , CALL DRVSTS ;INDICATE TAPE DENSITY SUPPORT 112$: RETURN;H; STATUS FUNCTION PROCESSING;O190$: ;REFERENCE LABEL;! MOV R2,-(SP) ;SAVE TABLE POINTERU+ CALL SELECT ;SET BOT, HWL, AND 7CH STATUS  MOV (SP)+,R2 ;RESTORE POINTER8 MOV U.CW2(R5),I.PRM+4(R1) ;ASSUME SENSE CHARACTERISTICS) TSTB (R2)+ ;DETERMINE FUNCTION REQUIREDE% BEQ 210$ ;IF EQ SET CHARACTERISTICSW) BPL 220$ ;IF PL "SENSE CHARACTERISTICS"N"201$: BIT #M.BOT,U.CW2(R5);AT BOT? BNE 210$ ;IF NE, YES.S&203$: MOV #IE.FHE&377,R0 ;FATAL ERROR, BR 230$ ; END REQUEST.3210$: BIT #M.1600,U.BUF(R5) ;TRYING TO SET 1600BPI?O% BNE 203$ ;IF NE, YES - NOT ALLOWED.,0 BIC #USRBTS,U.CW2(R5) ;PREPARE TO SET NEW BITS.; BIC #^C,U.BUF(R5) ;LEAVE ONLY USER CONTROLLED BITSU) BIS U.BUF(R5),U.CW2(R5) ;NEW STATUS WORDR;S; NO SPACING REQUIREDN;U: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 BITS + CLR 2(R2) ;ASSURE PROPER VALUE FOR RETURN  JMP 540$ ;CLEAN UP AND EXIT,;+4; **-$MTINT-TM11 MAGNETIC TAPE CONTROLLER INTERRUPTS;-5 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?E. BNE 300$ ;;;IF NE YES, RETURN FROM INTERRUPT' CALL $FORK ;;;CREATE A SYSTEM PROCESSF'240$: MOV U.SCB(R5),R4 ;GET SCB ADDRESS,3 MOV S.CSR(R4),R2 ;PICK UP COMMAND REGISTER ADDRESSE: BIT #DS.TUR!DS.RWS!DS.ILG!DS.EOT!DS.BOT,-(R2) ;UNIT DONE? BNE 250$ ;IF NE YESP; CMPB U.BUF(R5),#RWU ;WAS IT A REWIND AND OFFLINE FUNCTION? , BEQ 220$ ;IF EQ YES, COMPLETE WITH SUCCESS* MOV R4,R0 ;GET ADDR OF CLOCK QUEUE BLOCK ADD #S.MTCK,R0 ;; CLR R1 ;SET UP HIGH TICKST MOV #1,R2 ;TIMEOUT UNTIL TUR$ MOV #C.SYST,R4 ;TYPE OF CLOCK ENTRY CALLR $CLINS ;TIMEOUT !$MTCLK:: ;REF LABEL FOR TIMEOUT4& MOV C.TCB(R4),R5 ;RESTORE UCB ADDRESS BR 240$ ;SEE IF UNIT READY/250$: MOVB S.CON(R4),R3 ;PICK UP CONTROLLER NO.D/ BIT #DS.MOL,(R2)+ ;IS THE DRIVE STILL ON-LINE?  BNE 260$ ;IF NE YESR( JMP 161$ ;ISSUE "DEVICE-NOT-READY" MSG@260$: BIC #CS.IE!CS.EXM,(R2) ;CLEAR INT. ENABLE AND EX.MEM BITS/ MOVB S.ITM(R4),S.CTM(R4) ;RESET TIMEOUT COUNTR, CLR S.FRK+2(R4) ;ALLOW INTERRUPT PROCESSING5 MOV -2(R2),R1 ;GET CONTENTS OF DRIVE STATUS REGISTERR8 BITB #US.BSP,U.STS(R5) ;INTERNAL BACKSPACE IN PROGRESS?, BNE 280$ ;IF NE YES - CALL SERVICE ROUTINE<270$: MOV #IS.SUC&377,R0 ;ASSUME SUCCESS FOR VARIOUS REASONS TST (R2) ;ANY ERRORS?L BMI 280$ ;IF MI YESI TST U.SPC(R5) ;SPACING FILE? . BNE 280$ ;IF NE, YES. TREAT AS ERROR ANYWAY.6 CMPB (R2),#RWD+CS.RDY-CS.GO-CS.IE ;WAS THAT A REWIND? BNE 275$ ;IF NE NO% BIS #M.RWD,U.CW2(R5) ;SET STATUS BITC275$: JMP 500$ ;SUCCESS!!)280$: TST RTTBL(R3) ;DIAGNOSTIC FUNCTION?S BMI 290$ ;IF MI YESE+ BIT #DS.ILG!DS.CRE!DS.PAE!DS.BGL!DS.BTE,R1C% ; ANY ERRORS IN STATUS REG (MTS)?  BEQ 290$ ; IF EQ THEN NO CALL $DVERR ; LOG DEVICE ERROR2290$: CALL @INTADD(R3) ;CALL THE INTERRUPT ROUTINE, BIS #S2.ACT,S.ST2(R4) ;SET I/O ACTIVE FLAG- MOV (SP)+,INTADD(R3) ;SAVE INTERRUPT ADDRESSY1300$: RETURN ;WAIT FOR END OF NEXT COMMAND STEPA;N; WRITE LOGICAL FUNCTION;S(WRBLK: BIT #DS.TM,R1 ;DID WRITE SEE EOF? BNE 320$ ;IF NE YES$; ; WRITE TAPE MARK FUNCTION;S'WREOF: BIT #34404,R1 ;ANY OTHER ERRORS?R00Qie-dibjbkb a a a( BEQ 325$ ;IF EQ NO - REALLY SUCCESSFUL& MOV #IE.WLK&377,R0 ;ASSUME WRITE-LOCK BIT #DS.HWL,R1 ;WRITE LOCK? BNE 325$ ;IF NE YES " BIT #34400,R1 ;RECOVERABLE ERROR? BNE 320$ ;IF NE YESS;R; REWIND FUNCTIONS;G&REWND: MOV #IE.FHE&377,R0 ;FATAL ERROR BR 325$ ; .. CONT 7320$: MOV #IE.BBE&377,R0 ;ASSUME BAD TAPE OR EQUIVALENT # TSTB U.CW2(R5) ;SHOULD WE REWRITE?; BMI 325$ ;IF MI, NO." BIT #2,@R2 ;IS THIS A WRITE EOF? BNE 420$ ;IF NE YES< BIS #WTE-WRT,U.BUF(R5) ;DO WRITE WITH EXTENDED GAP FROM NOW BR 420$ ;DO THE OPERATIONE;K(325$: BR 490$ ;GO FINISH UP INT SERVICE;W; SPACE FILE FUNCTION;;N,SPCFL: BIT #DS.TM,R1 ;TAPE MARK ENCOUNTERED? BNE 350$ ;IF NE YESR/ MOV U.SPC(R5),2(R2) ;SOMETHING ELSE STOPPED US7;F; SPACE BLOCK FUNCTION;CSPCBK: BIT #DS.BOT,R1 ;AT BOT?3 BNE 490$ ;IF NE YES, NOT AN ERROR, BUT NEED STACKL BIT #DS.TM,R1 ;EOF? BEQ 340$ ;IF EQ NO& CALL CHKEOV ;SEE IF AT END OF VOLUME BCC 410$ ;IF CC NOT FOUND, BR 360$ ;POSITION TAPE AT EOV 3340$: BIT #DS.BTE!DS.EOT,R1 ;BAD TAPE ERROR OR EOT? ( BNE RDBLK ;IF NE YES - NOT RECOVERABLE BR REWND ;FATAL;9350$: CALL CHKEOV ;DID TAPE REACH LOGICAL END OF VOLUME?0# 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 DETECTEDN& BIS #M.AEOV,U.CW2(R5) ;SET STATUS BIT BR 380$ ;FIX COUNT AND RETURNE/370$: INC U.SPC(R5) ;ANOTHER TAPE MARK DETECTED, BNE 390$ ;IF NE NOT DONE-380$: MOV U.SPC(R5),2(R2) ;SET UP FINAL COUNTR- MOV S.PKT(R4),R3 ;GET THE I/O PACKET ADDRESSV+ MOV I.FCN(R3),-(SP) ;GET THE FUNCTION CODEO) 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 RETURNV 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 SPACING ' MOV 2(R2),SPTBL(R3) ;SAVE RECORD COUNT,8 ADD #-CS.RDY+CS.GO+CS.IE,(R2) ;REISSUE SPACING COMMAND" CALL @(SP)+ ;WAIT FOR COMPLETION BR SPCFL ;SEE WHAT HAPPENED;I; READ LOGICAL FUNCTIONU;I*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?P BNE 420$ ;IF NE, YES.S BR REWND ; ELSE - OPI.5405$: MOV #IE.DAO&377,R0 ;ASSUME RECORD LENGHT ERROR.2" BIT #DS.RLE,R1 ;RECORD LTH ERROR? BNE 490$ ;IF NE YESC!410$: MOV #IE.EOF&377,R0 ;TRY EOFC BIT #DS.TM,R1 ;EOF DETECTED?+ BNE 490$ ;IF NE YESA- MOV #IS.SUC&377,R0 ;ASSUME SUCCESS FOR EOT'SN BIT #DS.EOT,R1 ;EOT?H BNE 490$ ;IF NE NO& MOV #IE.VER&377,R0 ;ASSUME DATA ERROR420$: MOV R1,-(SP) ;SAVE R1. MOV S.PKT(R4),R1 ;RETREIVE I/O PACKRT ADDRESS* BITB #IQ.X,I.FCN(R1) ;RETRIES SUPPRESSED? BEQ 430$ ;IF EQ NO CONTINUEN MOV (SP)+,R1 ;RESTORE R1  BR 490$ ;EXITS430$: MOV (SP)+,R1 ;RESTORE R1& DECB RTTBL(R3) ;DECREMENT RETRY COUNT BLE 490$ ; IF LE NOO0 MOV INTADD(R3),U.SPC(R5) ;SAVE ORIGINAL ADDRESS! CALL BSPACE ;BACKSPACE THE TAPEM! CALL @(SP)+ ;WAIT FOR BACKSPACEO. MOV U.SPC(R5),INTADD(R3) ;RESTORE INT ADDRESS2 CLR U.SPC(R5) ;RESET TO INDICATE NOT SPACING FILE TST (SP)+ ;CLEAN UP THE STACKP JMP 177$ ;RETRY ;A-; END OF INTERRUPT SERVICE ROUTINE PROCESSINGP;S$490$: TST (SP)+ ;CLEAN UP THE STACK)500$: MOV R5,R3 ;MAKE A COPY OF UCB BASE1 ADD #U.CW2,R3 ;COMPUTE OFFSET TO MAG TAPE STATUSC$ MOV (R3),-(SP) ;SAVE CURRENT STATUS5 BIC #NEWBTS,(R3) ;CLEAR STATUS BITS TO BE DETERMINED BIT #DS.BOT,R1 ;AT BOT? BEQ 510$ ;IF EQ NO BIS #M.BOT,(R3) ;SET STATUS BIT510$: BIT #DS.TM,R1 ;TAPE MARK?E BEQ 520$ ;IF EQ NOT TAPE MARKC9 CMPB (R2),#SPR+CS.RDY-CS.IE-CS.GO ;WAS THAT A BACKSPACE?P2 BEQ 520$ ;IF EQ YES - DON'T SET INTERNAL EOF BIT BIS #M.EOF,(R3) ;SET STATUS BIT520$: MOV R1,-(SP) ;SAVE R10/ CALL MTDINT ;PASS DIAGNOSTIC DEVICE REGISTERS. MOV (SP)+,R1 ;RESTORE R1A) BCS 530$ ;IF CS FUNCTION WAS DIAGNOSTICN+ BIT #DS.ILG!DS.CRE!DS.PAE!DS.BGL!DS.BTE,R1S% ; ANY ERRORS IN STAT00QqeCec__DATADATADATADATAUS 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 EOTE BIT #DS.EOT,R1 ;EOT?S BEQ 539$ ;IF EQ NO& TSTB R0 ;ALREADY RETURNING AN ERROR? BMI 538$ ;IF MI YEST,535$: MOV #IE.EOT&377,R0 ;SET FOR EOT STATUS4538$: BIS #M.EOT,(R3) ;REMEMBER EOT FOR NEXT COMMAND- MOV 2(R2),-(SP) ;PRESERVE THE COUNT REGISTERD0 BIS #CS.CLR,@R2 ;STOP THE DRIVE IF RUNNING AWAY, MOV (SP)+,2(R2) ;RESTORE THE COUNT REGISTER539$: TST (SP)+ ;CLEAN STACKC6540$: MOV S.PKT(R4),R1 ;RETRIEVE ADDRESS OF I/O PACKET6 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 VALUEA" ADD 2(R2),R1 ;FIX COUNT REMAINING. MOVB S.CON(R4),R3 ; RETRIEVE CONTROLLER INDEX* MOVB RTTBL(R3),R2 ; GET FINAL RETRY COUNT0 BIS #RETRY*256.,R2 ; MERGE STARTING RETRY COUNT# CALL $IODON ;FINISH I/O OPERATIONI JMP MTINI ;GO AGAINP .DSABL LSBT;H@; THIS SUBROUTINE CHECKS FOR THE LOGICAL END-OF-VOLUME CONDITION;,; RETURNS WITH CC IF NOT EOV.K; RETURNS WITH CS IF EOV. ;E)CHKEOV: MOV 2(R2),-(SP) ;SAVE FRAME COUNT2/ ADD U.CNT(R5),(SP) ;GET NUMBER ACTUALLY SPACEDT2 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 CCD .ENDC BIT #2,(R2) ;FORWARD SPACE?G# BNE 30$ ;IF NE NO - CANNOT BE EOVO$ BIT #M.EOF!M.BOT,U.CW2(R5) ;AT EOV?" BEQ 30$ ;IF EQ NO - EXIT WITH CC SEC ;EOV DETECTED30$: RETURN ;V;E:; THIS SUBROUTINE ISSUES A COMMAND TO BACKSPACE ONE RECORD;(CBSPACE: BISB #US.BSP,U.STS(R5) ;SET INTERNAL BACKSPACE IN PROGRESSA$ MOV #-1,2(R2) ;BACKSPACE ONE RECORD) MOVB #SPR,(R2) ;ISSUE BACKSPACE FUNCTION$ RETURNB;U/; THIS ROUTINE ATTEMPTS TO SELECT A TAPE DRIVE.I5; THE CURRENT STATUS OF THE DRIVE WITH REGARD TO 7CH,F#; BOT, AND HWL IS SET AT THIS TIME. ;N; ON RETURN: CC==>GOOD SELECT.; CS==>BAD SELECT;3*SELECT: CALL DRVSTS ;GET TAPE UNIT STATUS+ MOVB 1(R2),U.BUF+1(R5) ;SET UP FOR COMMANDN) MOV -2(R2),-(SP) ;SAVE TAPE UNIT STATUS.= BIC #,U.CW2(R5) ;CLEAR EXCESSN SEC ;ASSUME SELECT ERRORA$ BIT #DS.MOL,(SP) ;DID DRIVE SELECT?" BEQ 10$ ;IF EQ NO - SELECT ERROR6 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 - FATALN'7$: BIT #DS.TUR!DS.SDN,(SP) ;TRUST BOT?> BNE 8$ ;IF NE, YES.T' BIC #DS.BOT,(SP) ;MAY BE INTERMITTENT.V/8$: SWAB (SP) ;UNIT SELECTABLE. CARRY CLEARED.(8 BIC #^C,(SP) ;CLEAR EXTRA BITS BIS (SP),U.CW2(R5) ;5% BICB #US.ABO,U.STS(R5) ;NOT ABORTING 710$: INC (SP)+ ;CLEAN UP STACK WITHOUT AFFECTING CARRYI BCC 20$ ;IF CC GOOD SELECT+ BIS #M.SER,U.CW2(R5) ;SET SELECT ERROR BIT 20$: RETURN ;N;+F; SUBROUTINE SELECTS A TAPE UNIT AND TRIES TO OBTAIN TAPE UNIT STATUS.;$M; IF TAPE UNIT READY, DETERMINE 7/9 TRACK STATUS AND UPDATE U.CW3 ACCORDINGLYP;-#DRVSTS: MOV S.CSR(R4),R2 ;R2 - CSR.N) MOVB U.UNIT(R5),1(R2) ;SELECT TAPE UNIT.B+ MOV #50.,-(SP) ;INTERVAL TILL DEV REG RDY.5$: DEC (SP) ;INTERVAL OVER ?. BNE 5$ ;IF NE, NO.% BIT #DS.TUR,-2(R2) ;TAPE UNIT READY? - BEQ 10$ ;IF EQ, NO. BITS 0-5 NOT AVAILABLE. ( MOVB #UD.800,U.CW3(R5) ;INDICATE (ONLY)) MOVB #UD.UNS,U.CW3+1(R5) ;9TRACK/800BPI.R' BIT #DS.7CH,-2(R2) ;7TRACK TAPE UNIT ?B BEQ 10$ ;IF EQ, NO.* MOVB #UD.200,U.CW3(R5) ;INDICATE 7 TRACK,1 MOVB #UD.800,U.CW3+1(R5) ;200 TO 800BPI SUPPORT.S'10$: TST (SP)+ ;RETURN STACK AS FOUND.N RETURNR;+9; **-MTDINT-TM11 DIAGNOSTIC INTERRUPT AND TIMEOUT HANDLER;$?; IF ENTRY WAS FROM A DIAGNOSTIC CONTROL FUNCTION THEN MOVE I/OR7; PACKET WORDS 17-20 TO WORDS 20-21 FOR $CRPAS ROUTINE.5B; FOR ANY DIAGNOSTIC FUNCTION PASS THE UNIBUS DEVICE REGISTERS VIA; THE $CRPAS ROUTINE.C;0; INPUTS; R2= CSR ADDRESS7; R4= SCB ADDRESS;Q ; OUTPUTSQ00QyeR{eibjbkb a a a; R1= IO PACKET ADDRESSW;-0MTDINT: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS CLC ;2 BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION CALL? BEQ 4$ ;IF EQ NO % MOV R1,-(SP) ;SAVE IO PACKET ADDRESS 3 CMPB #IO.EOF/256.,I.FCN+1(R1) ;WRITE EOF FUNCTION?C BEQ 1$ ;IF EQ YES> CMPB #IO.RWD/256.,I.FCN+1(R1) ;CNTRL FUNCT.OTHER THAN IO.EOF? BEQ 1$ ;IF EQ YES2 CALL $CRPAS ;PASS DEVICE REGISTERS TO DIAGNOSTIC( MOV (SP)+,R1 ;RESTORE IO PACKET ADDRESS BR 3$ ;RETURN 41$: MOV I.PRM+14(R1),I.PRM+16(R1) ;MOVE WD20 TO WD211 MOV I.PRM+12(R1),I.PRM+14(R1) ;MOVE WD17 TO WD20T52$: CALL $CRPAS ;PASS DEVICE REGISTERS TO DIAGNOSTIC ( MOV (SP)+,R1 ;RESTORE IO PACKET ADDRESS6 MOV I.PRM+14(R1),I.PRM+12(R1) ;MOVE WD20 BACK TO WD176 MOV I.PRM+16(R1),I.PRM+14(R1) ;MOVE WD21 BACK TO WD2073$: BIC #RD.LPC,10(R2) ;CLEAR LPC MODE BIT IN MTRD REG..+ SEC ;SET DIAGNOSTIC FUNCTION CALL RETURNS 4$: RETURN .END DIAGNOSTIC( MOV (SP)+,R1 ;RESTORE IO PACKET ADDRESS BR 3$ ;RETURN 41$: MOV I.PRM+14(R1),I.PRM+16(R1 .TITLE QITBL  .IDENT /03.01/1;,1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.;; All rights reservedO;A;S<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;4; B. S. MCCARTHY 20-JUL-81;$; POLISH INTERPRETER DATA BASE;EH; THIS MODULE WAS SPLIT OUT OF DRTBL TO ALLOW THE QIO DIRECTIVE AND THIS4; TABLE TO BE PLACED IN THE SECOND DIRECTIVE COMMON.;A;E; PREVIOUSLY MODIFIED BY:O;. ; J. KAUFMAN; B. S. MCCARTHY; J. W. BERZLE;.;1+; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:I;,"; ERIC POSTPISCHIL 12-DEC-86 03.00;S:; edp040 -- ADD SON OF GET DEVICE INFORMATION SUBFUNCTION; TO GIN DIRECTIVE.C ; B. S. MCCARTHY 5-MAR-87 03.01;S4; BM384 -- MOVE DRGIN DISPATCH TABLE INTO DRGIN FOR!; INSERTION INTO VECTOR COMMON. ; ;I .PAGE;+1; POLISH INTERPRETER DATA BASE FOR QIO PROCESSINGL;D; FUNCTION CODE DISPATCH VECTOR;-)$FCDSP::.WORD FCIFC ;10-ILLEGAL FUNCTIONM. .WORD $FCPKT ;11-FIND FILE NAME IN DIRECTORY .IF DF R$$LKL .WORD UNLCK ;12-UNLOCK BLOCK .IFFS" .WORD FCIFC ;12-ILLEGAL FUNCTION .ENDC2 .WORD $FCPKT ;13-REMOVE FILE NAME FROM DIRECTORY/ .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 FILEC$ .WORD FCRVB ;21-READ VIRTUAL BLOCK% .WORD FCWVB ;22-WRITE VIRTUAL BLOCKD .WORD FCEXT ;23-EXTEND FILED .WORD FCCRE ;24-CREATE FILE.4 .WORD FCDEL ;25-MARK FILE FOR DELETE/TRUNCATE FILE' .WORD $FCPKT ;26-READ FILE ATTRIBUTESD( .WORD $FCPKT ;27-WRITE FILE ATTRIBUTES0 .WORD $FCPKT ;30-USER MAGTAPE CONTROL FUNCTION* .WORD FCWVB ;31-TRANSMIT PROCESS MESSAGE) .WORD FCRVB ;32-RECEIVE PROCESS MESSAGEW$ .WORD FCCON ;33-CONNECT TO PROCESS) .WORD FCDIS ;34-DISCONNECT FROM PROCESSE* .WORD FCNCT ;35-NETWORK CONTROL FUNCTION" .WORD FCIFC ;36-ILLEGAL FUNCTION" .WORD FCIFC ;37-ILLEGAL FUNCTION .PAGE .IF NDF M$$NETE*FCCON: ;REF LABEL IF NO NETWORK SUPPORT*FCDIS: ;REF LABEL IF NO NETWORK SUPPORT*FCNCT: ;REF LABEL IF NO NETWORK SUPPORT .IFTF;O; ILLEGAL FUNCTION;T1FCIFC: .WORD $IEIFC ;SET ILLEGAL FUNCTION STATUSE;S8; ACCESS FILE FOR READ, READ/WRITE, OR READ/WRITE/EXTEND;N9FCACC: .WORD $CKDMO ;CHECK IF VOLUME MARKED FOR DISMOUNTR5 .WORD $CKALN ;CHECK IF FILE ALREADY ACCESSED ON LUNO .IF DF M$$MUP5 .WORD $CKMOU ;CHECK IF VOLUME MOUNTED FOR THIS USERA .ENDC# .WORD $BDPKT ;BUILD AN I/O PACKET .WORD $CKLHD ;LOCK DOWN HEADER* .WORD $CKIWN ;INCREMENT WINDOW I/O COUNT+ .WORD $CKRLK ;SYNCHRONIZE ACCESS AND EXIT;E; DEACCESS FILE;C3FCDAC: .WORD $CKNLN ;CHECK IF FILE ACCESSED ON LUN# .WORD $BDPKT ;BUILD AN I/O PACKETR .WORD $CKLHD ;LOCK DOWN HEADER* .WORD $CKIWN ;INCREMENT WINDOW I/O COUNT .WORD $CKRLK ;EXIT;C; READ VIRTUAL BLOCK;D3FCRVB: .WORD $CKNLN ;CHECK IF FILE ACCESSED O00ReSec__DATADATADATADATAN LUNV* .WORD $CKRAC ;CHECK READ ACCESS AND EXIT;$; WRITE VIRTUAL BLOCKC; 3FCWVB: .WORD $CKNLN ;CHECK IF FILE ACCESSED ON LUNR+ .WORD $CKWAC ;CHECK WRITE ACCESS AND EXITR; ; CREATE FILE'; CREATE & ACCESS NOT LEGAL COMBINATIONO-; CREATE & EXTEND DOES NOT INCR PENDING COUNTO; SINCE NO WINDOW;O9FCCRE: .WORD $CKDMO ;CHECK IF VOLUME MARKED FOR DISMOUNTN5 .WORD $CKALN ;CHECK IF FILE ALREADY ACCESSED ON LUN FCDEL:FCEXT:;C; BUILD AN I/O PACKET FOR FIND, ENTER, REMOVE, EXTEND, DELETE, READ "; ATTRIBUTES, AND WRITE ATTRIBUTES;R$FCPKT:: .IF DF M$$MUP5 .WORD $CKMOU ;CHECK IF VOLUME MOUNTED FOR THIS USER$ .ENDC# .WORD $BDPKT ;BUILD AN I/O PACKETA .WORD $CKLHD ;LOCK DOWN HEADER* .WORD $CKIWN ;INCREMENT WINDOW I/O COUNT .WORD $CKXIT ;EXIT;N ; EXPLICIT UNLOCK BLOCK FUNCTION;M .IF DF R$$LKL3UNLCK: .WORD $CKNLN ;CHECK IF FILE ACCESSED ON LUNL& .WORD $UNLXT ;SET REGISTERS AND EXIT .ENDC .IFFI;C; CONNECT TO PROCESS;V9FCCON: .WORD $CKDMO ;CHECK IF VOLUME MARKED FOR DISMOUNT7 .WORD $CKALN ;CHECK IF PROCESS ALREADY CONNECTED ON L  .IF DF X$$HDR. .WORD $CKHDR ;CHECK IF EXTERNAL HEADER VALID .ENDC ;X$$HDR5 .WORD $CKCON ;ADDRESS CHECK CONNECT BUFFER AND EXIT .WORD $CKLHD ;LOCK DOWN HEADER, .WORD $CKRLK ;INTERLOCK LUN USAGE AND EXIT;; DISCONNECT FROM PROCESSO;$7FCDIS: .WORD $CKNLN ;CHECK IF PROCESS CONNECTED ON LUN 0 .WORD $CKDIS ;CHECK BUFFER AND COPY PARAMETERS .WORD $CKLHD ;LOCK DOWN HEADER, .WORD $CKRLK ;INTERLOCK LUN USAGE AND EXIT;.; NETWORK CONTROL FUNCTION;A9FCNCT: .WORD $CKDMO ;CHECK IF VOLUME MARKED FOR DISMOUNTH .IF DF X$$HDR. .WORD $CKHDR ;CHECK IF EXTERNAL HEADER VALID .ENDC ; DF X$$HDR) .WORD $CKPRM ;COPY PARAMETERS TO PACKETD .WORD $CKLHD ;LOCK DOWN HEADER .WORD $CKXIT ;EXIT .ENDC;OF; TABLE OF SPECIAL FUNCTION CODES TO BE CHECKED BY SOFTWARE WRITE LOCK;$WLKTB:: ;DEVICE DEPENDENT CODESA! .WORD IO.SMD ;SET MEDIA DENSITYE! .WORD IO.EOF ;WRITE END OF FILE  .WORD IO.ERS ;ERASE TAPE# .WORD IO.DSE ;DATA SECURITY ERASEO ;DIAGNOSTIC CODESM% .WORD IO.WDH ;WRITE DATA AND HEADERR& .WORD IO.WTD ;WRITE TRACK DESCRIPTOR0 .WORD IO.TDD ;WRITE TRACK DESCRIPTOR DISPLACED' .WORD IO.CEW ;WRITE BLOCK ON CE TRACKH* .WORD 0 ;TERMINATOR FOR WRITE LOCK TABLE .END;OF; TABLE OF SPECIAL FUNCTION CODES TO BE CHECKED BY SOFTWARE WRITE LOCK;$WLKTB:: ;DEVICE DEPENDENT CODESA! .WORD IO.SMD ;SET MEDIA .TITLE SSTSRT .IDENT /12.02/T;C,; Copyright (c) 1995 by Mentec, Inc., U.S.A.; All rights reservedA;E;A+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:B;1; B. S. MCCARTHY;R+; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY: ;"; B. S. MCCARTHY 22-DEC-86 12.00;R ; BM377 -- MOVE DRDSP TO DIR11M;C; J. W. BERZLE 7-MAY-87 12.01F; (; JWB212 -- CORRECT TEST OF STACK DEPTH;1 ; D. Carroll 18-Oct-1995 12.025; DC404 - Include PSECT statement to allow sysgen toS; fully expand ICB pool ... ;S; MACRO LIBRARY CALLSC; 8 .MCALL ABODF$,HDRDF$,HWDDF$,PKTDF$,BGCK$A,BGCK$R,BCKDF$$ BCKDF$ ;DEFINE THE BUGCHECK CODES" ABODF$ ;DEFINE TASK ABORT CODES% HDRDF$ ;DEFINE TASK HEADER OFFSETSU$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;D ; LOCAL DATA;CE; FLOATING POINT EXCEPTION VECTOR (FINAL SETUP OF THIS VECTOR AND, IFAC; NECESSARY, THE PIRQ VECTOR IS PERFORMED IN INITL AND THE MCR SAVEE ; COMMAND.)t;l .IF DF F$$LPP!F$$LTPx .ASECTo.=244 .WORD $FLTRP ; .WORD PR7 ; .PSECTD .ENDC;P; SEGMENT FAULT VECTOR; .ASECTD.=250H .WORD $SGFLT ; .WORD PR7 ;N .PSECT ;DC404 ;DC404. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;**-1 ;+; (; **-$EMSST-NON RSX EMT/TRAP INSTRUCTION; J; THIS ROUTINE IS TRANSFERED TO BY THE DIRECTIVE DISPATCHER WHEN A NON RSXK; EMT OR A TRAP INSTRUCTION IS EXECUTED. THE MACHINE STATE HAS ALREADY BEENC; SAVED. THE EMT/TRAP CODE (LOW BYTE00Se{eibjbkb a a a OF INSTRUCTION) IS SETUP TO BEG; PASSED TO THE USER AND CONTROL IS TRANSFERED TO THE SST EXIT ROUTINE.;. ; INPUTS:5;); R5=ADDRESS OF THE EMT/TRAP INSTRUCTION. ; ; OUTPUTS:; '; 04(SP)=EMT/TRAP CODE MULTIPLIED BY 2.T*; 02(SP)=SST CODE (SCEMT=EMT, SCTRP=TRAP).<; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO USER STACK (6).;- .ENABL LSBT.$EMSST::MOV (SP),R5 ;GET EMT/TRAP INSTRUCTION) BIC #177400,(SP) ;CLEAR INSTRUCTION CODEE ASL (SP) ;MULTIPLY CODE BY 22 MOV #S.CEMT,-(SP) ;ASSUME NON-RSX EMT INSTRUCTION BIT #400,R5 ;EMT INSTRUCTION?A( BEQ 10$ ;IF EQ YES-SET NUMBER OF BYTES+ MOV #S.CTRP,(SP) ;SET FOR TRAP INSTRUCTION (10$: MOV #3*2,-(SP) ;SET NUMBER OF BYTES) JMP SSTXT ;TAKE COMMON SST EXIT ROUTINE2;+,; **-$FLTRP-FLOATING POINT EXCEPTION (11/40);)I; THIS ROUTINE IS TRAPPED TO WHEN AN 11/40 FLOATING POINT EXCEPTION FAULTEI; OCCURS. THE CURRENT MACHINE STATE IS SAVED AND CONTROL IS TRANSFERED TOR; THE SST EXIT ROUTINE.;;T ; INPUTS:Y;; NONE.E;- ; OUTPUTS:;N; 02(SP)=SST CODE (SCFLT).<; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO USER STACK (4).;-3$FLTRP:: ;DEFINE UNCONDITIONALLY FOR VECTOR SETUPM .IF DF F$$LTP. DIRSV$ ;;;SAVE REGISTERS AND CLEAR PRIORITY: MOV #S.CFLT,-(SP) ;SET FOR FLOATING POINT EXCEPTION FAULT7 MOV #BE.FLT,R3 ;FLOATING POINT EXCEPTION BUGCHECK CODE  BR 20$ ;SET NUMBER OF BYTESS .ENDC;+E; **-$FPPR7-$FPPR8-$FPPRQ-FLOATING POINT PROCESSOR EXCEPTION HANDLINGE;@; THESE ROUTINES HANDLE EXCEPTION FAULTS FROM THE FLOATING POINTD; PROCESSOR. THE FLOATING POINT EXCEPTION AND ADDRESS REGISTERS ANDH; THE CURRENT TASK TCB ARE SAVED AND THEN AN ATTEMPT IS MADE TO QUEUE ANE; AST TO THE TASK AT FORK LEVEL. THESE ROUTINES SUPPORT TWO MODES OFTE; OPERATION DEPENDING ON WHETHER THE FPP'S EXCEPTION FAULTS CAN OCCURNF; WHILE THE PROCESSOR IS AT PRIORITY 7 OR NOT. IF THE FPP'S EXCEPTION@; FAULT CAN OCCUR WHILE THE PROCESSOR IS AT PRIORITY 7, THEN THE>; PROCESSOR MUST HAVE A PIRQ REGISTER. INITL AND THE MCR SAVE@; COMMAND DETERMINE WHICH MODE OF OPERATION IS TO BE USED OR NOTD; DEPENDING ON WHETHER THE PROCESSOR HAS A PROGRAM INTERRUPT REQUEST=; REGISTER (PIRQ) OR NOT, AND SET UP THE FPP AND PIRQ VECTORS.0; ACCORDINGLY. THE ROUTINES OPERATE AS FOLLOWS.;EH; 1. IF THE PROCESSOR DOES NOT HAVE A PIRQ REGISTER THEN THE FPP MUST?; NEVER FAULT WHEN THE PROCESSOR IS AT PRIORITY 7 OR IT MUST BEA@; SYNCHRONOUS. IN THIS CASE THE FLOATING POINT EXCEPTION VECTORA; POINTS TO $FPPR7, AND THE PROCESSOR SIMPLY CALLS INTERRUPT SAVEE"; AND FORK TO GET TO SYSTEM STATE.;UG; 2. IF THE PROCESSOR HAS A PIRQ REGISTER, THE FLOATING POINT EXCEP-RA; TION TRAP VECTOR POINTS TO $FPPR8 AND THE PIRQ VECTOR POINTS TOR@; $FPPRQ. FLOATING POINT TRAPS ARE CONVERTED TO PIRQ PRIORITY 1A; INTERRUPTS AFTER SAVING THE FLOATING POINT STATUS. ON THE PIRQ A; TRAP AN INT SAVE AND FORK IS USED TO GET TO SYSTEM STATE. NOTEYB; THAT THIS STRATEGY WOULD ALSO WORK FOR PROCESSORS DESCRIBED IN 1; ABOVE.; ; INPUTS:C;OC; THE FLOATING POINT EXCEPTION REGISTER CONTAINS THE REASON FOR THEUD; FAULT AND THE FLOATING POINT ADDRESS REGISTER CONTAINS THE ADDRESS; OF THE FAULTING INSTRUCTION.;$ ; OUTPUTS:;IB; AN ATTEMPT IS MADE TO QUEUE AN AST TO THE TASK CAUSING THE FAULT@; WITH THE CONTENTS OF THE FLOATING POINT EXCEPTION REGISTER AND; AND ADDRESS REGISTER.R;- .IF DF F$$LPP;$FPPR7::STST $FLSTS ;;;STORE FLOATING POINT EXCEP AND ADDRU BR 14$ ;;;;$FPPR8::STST $FLSTS ;;;STORE FLOATING POINT EXCEP AND ADDRH8 BIS #<2*256.>,PIRQ ;;;POST PROGRAMMED INTERRUPT REQUEST! RTI ;;;WAIT FOR PIRQ INTERRUPTI6$FPPRQ::CLR PIRQ ;;;DISABLE PROGRAM INTERRUPT REQUEST414$: MOV $TKTCB,$FLTCB ;;;MUST SAVE FAULTING TCB NOW$ CALL $INTSV,PR1 ;;;GO TO PRIORITY 1+ MOV $FLFRK,R4 ;;;SET ADDRESS OF FORK BLOCKN( CALL $FORK0 ;;;CREATE A SYSTEM PROCESS0 MOV #AS.FPA,R4 ;GET CODE FOR FLOATING POINT AST0 MOV $FLTCB,R5 ;GET TCB ADDRESS OF FAULTING TASK) CALL $DASTT ;DECLARE FLOATING POINT AST; BCS 15$ ;IF CS NO AST DECLARED. MOV $FLST00Seec__DATADATADATADATAS,A.PRM+2(R1) ;INSERT AST PARAMETERS MOV $FLSTS+2,A.PRM(R1) ;T15$: RETURN ;P .IFFP$$FPPR7:: ;REFERENCE LABEL FOR SAVE$FPPR8:: ;REFERENCE LABELF$FPPRQ:: ;REFERENCE LABELB .ENDC;++; **-$ILINS-ILLEGAL OR RESERVED INSTRUCTIONE;DD; THIS ROUTINE IS TRAPPED TO WHEN AN ILLEGAL OR RESERVED INSTRUCTIONG; IS EXECUTED. THE CURRENT MACHINE STATE IS SAVED AND CONTROL IS TRANS-S!; FERRED TO THE SST EXIT ROUTINE.D;A ; INPUTS: ;N; NONE.B;1 ; OUTPUTS:;S; 02(SP)=SST CODE (SCILI).@; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO THE USER STACK (4).;RC; THIS ROUTINE IS ALSO ENTERED WHEN THE CSM INSTRUCTION IS EXECUTED;E; ON A PROCESSOR THAT DOES NOT SUPPORT CSM. IT WILL FIELD THE ILLEGAL$3; INSTRUCTION TRAP AND EMULATE THE CSM INSTRUCTION.U;E:; NOTE: ONLY ONE FORM OF THE CSM INSTRUCTION IS SUPPORTED.;E'; MOV #
,-(SP) ; CSM (SP)+S;A; KERNEL STACK ON ENTRY.;T; 0(SP) = TRAP PC + 2S; 2(SP) = PS PRIOR TO TRAP;:2; KERNEL STACK IMMEDIATELY BEFORE RTI INSTRUCTION.;T3; 0(SP) = (10) (VIRTUAL ADDRESS IN SUPERVISOR MODE)S8; 2(SP) = PS WITH PROPER PREVIOUS AND CURRENT MODE SUPER;;1; SUPER STACK IMMEDIATELY BEFORE RTI INSTRUCTION.L;I,; 0(SP) = ADDRESS OF SUPERVISOR MODE ROUTINE; 2(SP) = RETURN ADDRESS; 4(SP) = PS PRIOR TO TRAP;E;-$ILINS:: ;;;REF LABELE .IF DF S$$LIB .IF NDF X$$DBT $ TST $STKDP ;;;PREVIOUS MODE USER ? BLE 17$ ;;;IF LE NOP .ENDC ;NDF X$$DBT# MOV (SP),-(SP) ;;;COPY TRAP PC + 2A" SUB #2,(SP) ;;;CALCULATE TRAP PC) MFPI @(SP)+ ;;;PICK UP TRAP INSTRUCTION ! CMP (SP),#7027 ;;;IS IT CSM #N ?E BEQ 155$ ;;;IF EQ YESP" CMP (SP),#7026 ;;;IS IT CSM (SP)+1 BNE 165$ ;;;IF NE NO - ILLEGAL INSTRUCTION TRAPP4155$: TSTB $SUPFL ;;;TASK MAPPED TO SUPER WINDOWS ?1 BEQ 165$ ;;;IF EQ NO - ILLEGAL INSTRUCTION TRAP : BIT #10,SR3 ;;;IS THE INSTRUCTION LEGAL ON THIS MACHINE?1 BNE 165$ ;;;IF NE NO - ILLEGAL INSTRUCTION TRAPP: 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 STACK  MOV R0,-(SP) ;;;SAVE R01 BCS 156$ ;;;IF CS WE DETERMINED 2 INST AGO THISI ;;;WAS CSM (SP)+3 MOV #2,2(SP) ;;;IT WAS CSM (SP)+ - SET CONSTANT TOS, ;;;ADD TO USER STACK FOR ADJUSTING BELOW, MFPI SP ;;;GET PREVIOUS MODE STACK POINTER7$DSLM1::MFPD$ @(SP)+ ;;;GET ADDR OF SUPER MODE ROUTINEI" BR 157$ ;;;FINISH IN COMMON CODEB156$: MOV 4(SP),-(SP) ;;;GET ADDRESS OF SECOND HALF OF INSTRUCTION& MFPI @(SP)+ ;;;GET IMMEDIATE OPERAND-157$: MOV SP,R0 ;;;COPY KERNEL STACK POINTERN ADD #6,R0 ;;;POINT TO TRAP PC;% MOV (R0)+,-(SP) ;;;PUSH PC OF CALLERI$ MOV (R0),-(SP) ;;;PUSH PS OF CALLER8 MOV #CSMODE!PMODE,(R0) ;;; CURRENT=SUPER, PREVIOUS=USER. BIC #17,(SP) ;;;CLEAR STACKED CONDITION CODES) BMI 16$ ;;;IF MI PREVIOUS MODE WAS USERR7 BIC #^CPSMODE&PMODE,(R0) ;;;SET PREVIOUS MODE TO SUPERI%16$: MFPI SP ;;;GET PREVIOUS MODE SP57 ADD 12(SP),(SP) ;;;ADJUST FOR STACK DIFFERENCE BETWEENR ;;;(SP)+ AND #N VARIATIONM MOV (SP),R0 ;;;COPY IT9 SUB #6,(SP) ;;;ADJUST SP FOR PUSHED PS,PC,SUPER ROUTINET5 BIC #^CPSMODE&PMODE,PS ;;;SET PREVIOUS MODE TO SUPERV MTPI SP ;;;SET SUPER SPA% MTPD -(R0) ;;;PUSH PS ON USER STACKN& MTPD -(R0) ;;;PUSH PC ON SUPER STACK- MTPD -(R0) ;;;PUSH ADDRESS OF SUPER ROUTINE  MOV (SP)+,R0 ;;;RESTORE R0B$ CMP (SP)+,(SP)+ ;;;POINT TO TRAP PS=$DSLM2::MFPI 10 ;;;SET RETURN PC IN SUPER MODE FROM SUPER 101& RTI ;;;RETURN TO (SUPER VIRTUAL 10)2165$: TST (SP)+ ;;;POP CSM INSTRUCTION FROM STACK .ENDC ;DF S$$LIB#17$: DIRSV$ ;;;SAVE REGISTERS,; MOV #S.CILI,-(SP) ;SET FOR ILLEGAL OR RESERVED INSTRUCTION 2 MOV #BE.ILI,R3 ;ILLEGAL INSTRUCTION BUGCHECK CODE BR 20$ ;SET NUMBER OF BYTES( .PAGE;+; **-$IOTRP-IOT INSTRUCTION0;;H; THIS ROUTINE IS TRAPPED TO WHEN AN IOT INSTRUCTION IS EXECUTED. IF THEA; STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED VIA A JUMP TOPG; $CRASH. ELSE THE CURRENT MACHINE STATE IS SAVED AND 00Se{eibjbkb a a aCONTROL IS TRANS-S ; FERED TO THE SST EXIT ROUTINE.;SB; IF THE CURRENT TASK HAS FAST MAPPING ENABLED ($FMAPP>0) THEN THEF; FAST MAP DESCRIPTOR IN THE REGISTERS IS USED TO REMAP A PLAS WINDOW.7; (SEE DRMAP, WHERE THE REMAPPING ACTUALLY TAKES PLACE)U;R ; INPUTS:;A; NONE. ;$ ; OUTPUTS:;UC; IF THE CURRENT STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED.X>; ELSE THE FOLLOWING ARGUMENTS ARE SETUP ON THE CURRENT STACK:; ; 02(SP)=SST CODE (SCIOT).A; 00(SP)=NUMBER OF BYTES TO BE TRANSFERRED TO THE USER STACK (4).E;-;E; NOTES:;TC; REGISTER CONTENTS ON ENTRY/EXIT TO FAST MAP ARE DEFINED IN DRMAP.H .PAGE?18$: BGCK$A BF.EXE,BE.IOT,INTERNAL ;;;SETUP ERROR CODES FOR IOTN ;;;IN SYSTEM STATEE# JMP $CREMT ;;;GO CRASH THE SYSTEM /$IOTRP::TST $STKDP ;;;RUNNING ON SYSTEM STACK?E# BLE 18$ ;;;IF LE NO, SYSTEM FAULTT .IF DF F$$MAP&X$$HDR&P$$LAS. TST $FMAPP ;;;FAST MAP IN USE FOR THIS TASK? BEQ 189$ ;;;IF EQ NO .IF DF D$$PAR2 MOV $DRAP3,KINAR5 ;;;MAP TO PLAS DIRECTIVE COMMON .ENDC ; DF D$$PAR- JMP $DRFMP ;;;GO EXECUTE FAST MAP DIRECTIVES189$: ;;;REFERENCE LABEL. .ENDC ; DF F$$MAP&X$$HDR&P$$LAS, DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITY+ MOV #S.CIOT,-(SP) ;SET FOR IOT INSTRUCTIONT BR 20$ ;SET NUMBER OF BYTESP;+; **-$SGFLT-SEGMENT FAULTB;1E; THIS ROUTINE IS TRAPPED TO WHEN A SEGMENT FAULT OCCURS. THE CURRENT$J; MACHINE STATE IS SAVED, SR0 THRU SR2 ARE SETUP TO BE PASSED TO THE USER,4; AND CONTROL IS TRANSFERED TO THE SST EXIT ROUTINE.;M ; INPUTS:C;D; NONE.;J ; OUTPUTS:;O; 10(SP)=CONTENTS OF SR0.S; 06(SP)=CONTENTS OF SR2.A; 04(SP)=CONTENTS OF SR1.X; 02(SP)=SST CODE (SCSGF).A; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO THE USER STACK (10).N;-3$SGFLT::DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITYL MOV #SR0+4,R5 ;POINT SR2S MOV (R5),-(SP) ;SAVE SR2  MOV (SP),-(SP) ;COPY SAVED SR2N MOV -(R5),-(SP) ;SAVE SR1 MOV -(R5),4(SP) ;SAVE SR02 BIC #160000,(R5) ;UNFREEZE MEMORY MANAGEMENT UNIT) MOV #S.CSGF,-(SP) ;SET FOR SEGMENT FAULTD$ MOV #5*2,-(SP) ;SET NUMBER OF BYTES, MOV #BE.SGF,R3 ;SEGMENT FAULT BUGCHECK CODE( BR SSTXT ;TAKE COMMON SST EXIT ROUTINE;+?; **-$TRACE-TRACE (T-BIT) OR BREAK POINT INSTRUCTION (BPT) TRAP ;CI; THIS ROUTINE IS TRAPPED TO WHEN A TRACE TRAP (T-BIT) OCCURS OR A BREAK-#H; POINT TRAP INSTRUCTION IS EXECUTED. THE CURRENT MACHINE STATE IS SAVED4; AND CONTROL IS TRANSFERED TO THE SST EXIT ROUTINE.;A ; INPUTS:C;6; NONE. ;F ; OUTPUTS:;N; 02(SP)=SST CODE (SCBPT).@; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO THE USER STACK (4).;-3$TRACE::DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITY;4 MOV #S.CBPT,-(SP) ;SET FOR TRACE OR BREAKPOINT TRAP2 MOV #BE.BPT,R3 ;TRACE OR BREAKPOINT BUGCHECK CODE BR 20$ ;SET NUMBER OF BYTESE;+5; **-$TRP04-TRAPS AT 4 (ODD ADDRESS, NONEX MEM, ETC.)R;IJ; THIS ROUTINE IS TRAPPED TO WHEN A TRAP AT 4 OCCURS. IF A STACK VIOLATIONF; HAS CAUSED THE TRAP (I.E. A STACKPOINTER OF LESS THAN 400), THEN THED; THE SYSTEM IS CRASHED. ELSE THE CURRENT MACHINE STATE IS SAVED AND0; CONTROL IS TRANSFERED TO THE SST EXIT ROUTINE.; ; INPUTS:G;E; NONE.T;I ; OUTPUTS:;.; 02(SP)=SST CODE (SCOAD).@; 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$ ;;;SAVE REGISTERS AND SET PRIORITY% CLR -(SP) ;SET FOR ODD ADDRESS TRAPF: 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 ROUTINE@30$: BGCK$A BF.EXE,BE.STK,DIRECT ;;;SETTUP THE ERROR CODES FOR A ;;;STACK OVERFLOW .DSABL LSB ;+"; **-SSTXT-COMMON SST EXIT ROUTINE;0H; CONTROL IS TRANSFERED TO THIS ROUTINE TO EFFECT AN SST. IF THE CURRENTI; STACK DEPTH IS NOT ZERO, THEN THE SYSTEM IS CRASHED. ELSE AN ATTEMPT ISVG; MADE TO EFFECT AN SST FOR THE CURRENT TASK. IF THE TASK DOES NOT HAVEVJ; AN APPROPRIATE SST VECTOR ENTRY OR A PUSH OF THE SST PARAMETERS ONTO THEG; TASK STACK CANNOT BE EFFECTED, THE00Seec__DATADATADATADATAN THE TASK IS ABORTED. ELSE THE SST$,; IS SETUP AND A DIRECTIVE EXIT IS EXECUTED.;F; INPUTS: (MAPPED SYSTEM);.#; 24(SP)=PS WORD SAVED BY SST TRAP.S#; 22(SP)=PC WORD SAVED BY SST TRAP.S; 20(SP)=SAVED R5.; 16(SP)=SAVED R4.; 14(SP)=SAVED R3.; 12(SP)=SAVED R2.; 10(SP)=SAVED R1.; 06(SP)=SAVED R0.B; 04(SP)=SST PARAMETER (ZERO OR MORE PARAMETERS MAY BE SPECIFIED).; 02(SP)=SST CODE.8; 00(SP)=NUMBER OF BYTES TO BE TRANSFERED TO USER STACK.;R; R3 - BUGCHECK ERROR CODE; ; OUTPUTS:;EF; AN ATTEMPT IS MADE TO EFFECT THE SPECIFIED SST FOR THE CURRENT TASK.;- .ENABL LSBN0SSTXT: MOV $SAHPT,R5 ;GET ADDRESS OF TASK HEADER1 CMP #-1,$STKDP ;FAULT OCCUR AT STACK DEPTH ZERO? BNE 7$ ;IF NE NO' MOV SP,R1 ;COPY CURRENT STACK POINTER 4 ADD (SP),R1 ;ADD NUMBER OF BYTES TO BE TRANSFERRED$ MOV 16(R1),R0 ;GET FAULT PC ADDRESS5 CMP R0,#$DRLM1 ;FAULT OCCUR IN DIRECTIVE DISPATCHER?  BLO 3$ ;IF LO NO5 CMP R0,#$DRLM2 ;FAULT OCCUR IN DIRECTIVE DISPATCHER?  BHI 3$ ;IF HI NO .IF DF D$$PAR3 CMP KINAR5,$DRAPR ;YES, BUT DID THE FAULT OCCUR INE& ;THE DIRECTIVE DISPATCHER? (IS THE$ ;FIRST DIRECTIVE COMMON MAPPED?) BNE 3$ ;IF NE NO .ENDC ; DF D$$PAR JMP 90$ ;YES3$:; .IF DF D$$PAR1 CMP KINAR5,$DRAP2 ;2ND DIRECTIVE COMMON MAPPED ?D, BNE 7$ ;IF NE NO, CAN'T HAVE BEEN IN DRQIO .ENDC ; DF D$$PAR. CMP R0,#$DQLM1 ;TRAP OCCUR IN QIO DIRECTIVE ? BLO 7$ ;IF LO NO. 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 POINTERD3 ADD (SP),R1 ;ADD NUMBER OF BYTES TO BE TRANSFEREDC$ MOV 16(R1),R0 ;GET FAULT PC ADDRESS8 CMP R0,#$DSLM1 ;FAULT OCCUR IN CSM INSTRUCTION EMULATE? BLO 8$ ;IF LO NO8 CMP R0,#$DSLM2 ;FAULT OCCUR IN CSM INSTRUCTION EMULATE? BHI 8$ ;IF HI NO& BIT #PMODE,PS ;PREVIOUS MODE KERNEL ?2 BEQ 100$ ;IF EQ YES, - EXCEPTION IN CSM EMULATOR8$: ;REFERENCE LABELS .ENDC ;DF S$$LIB  .IF DF P$$D70' CLR @$CPUER ;CLEAR CPU ERROR REGISTERF .IF NDF M$$EXTS NOP ;THIS NOP MUST BE HERE.% ;UNLESS THE MICRO CODE BUG IN THE & ;11/60 IS FIXED (ECO M7872-00007),$ ;CLEARING THE CPU ERROR REGISTER( ;WILL CAUSE THIS WORD TO BE SKIPPED. .ENDC .ENDC, CLR $TEMP0 ;INDICATE USE NORMAL ABORT CODE+$CNBPT:: ;ENTRY POINT FROM BOM$ DIRECTIVE # MOV R5,R4 ;COPY ADDRESS OF HEADERI3 ADD #H.ODVA,R4 ;POINT TO ODT SST VECTOR DESCRIPTORC) MFPI SP ;GET CURRENT TASK STACK POINTERC& CALL 10$ ;SST ADDRESS IN ODT VECTOR?, MOV #80$,-(SP) ;SST ADDRESS IN TASK VECTOR?/10$: MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADER ( MOV (R4)+,R3 ;GET ADDRESS OF SST VECTOR* BEQ 20$ ;IF EQ NO VECTOR THIS DESCRIPTOR .IF DF S$$LIB0 BIS #PMODE,PS ;ASSUME SST HANDLED IN USER STATE- BIT #1,R3 ;AST HANDLED IN SUPERVISOR STATE?N BEQ 15$ ;IF EQ NOI8 BIC #^CPSMODE&PMODE,PS ;SET PREVIOUS MODE TO SUPERVISOR% DEC R3 ;REMOVE SUPERVISOR MODE FLAGR .ENDC415$: CMP 6(SP),(R4) ;VECTOR LONG ENOUGH TO COVER SST BHIS 20$ ;IF HIS NO MOV R3,R0 ;COPY VECTOR ADDRESS, MOV #2,R1 ;TWO BYTE SIZE FOR ADDRESS CHECK0 ADD 6(SP),R3 ;POINT TO APPROPRIATE VECTOR ENTRY) CALL $ACHRO ;CHECK FOR READ ONLY ACCESSC* BCS 20$ ;IF CS VECTOR ELEMENT IS INVALID( MFPD$ (R3) ;GET ADDRESS OF SST ROUTINE MOV (SP)+,R3 ;D" BNE 30$ ;IF NE SST ROUTINE FOUND020$: TST (R4)+ ;POINT TO NEXT VECTOR DESCRIPTOR RETURN ;S&30$: TST (SP)+ ;REMOVE RETURN ADDRESS3 MOV 2(SP),R1 ;GET NUMBER OF BYTES TO BE TRANSFEREDO) SUB R1,(SP) ;CALCULATE NEW TOP OF STACKM, MOV (SP),R0 ;COPY NEW TOP OF STACK ADDRESS) MTPI SP ;RESTORE NEW TASK STACK POINTERR1 CALL $ACHCK ;ADDRESS CHECK PUSH ONTO TASK STACK & BCS 70$ ;IF CS ADDRESS CHECK FAILURE .IF DF X$$HDR4 MOV -(R4),$TEMP0 ;SAVE SST ADDRESS FROM TASK HEADER .ENDC ; DF X$$HDR- CALL $RELOM ;RELOCATE AND MAP STACK ADDRESS . MOV (SP)+,R1 ;GET NUMBER OF BYTES TO TRANSFER5 CMP -(R1),-(R1) ;ADJUST BY 4 BYTES (PS AND PC WORDS)G ASR R00SeTeibjbkb a a a1 ;CONVERT TO WORD COUNTE' TST (SP)+ ;REMOVE SST CODE FROM STACKT.40$: DEC R1 ;ANY MORE PARAMETERS TO TRANSFER? BLT 50$ ;IF LT NOE2 MOV (SP)+,(R0)+ ;TRANSFER PARAMETER TO TASK STACK BR 40$ ;*50$: MOV #$UMPC,R1 ;POINT TO SAVED PC WORD. MOV (R1),(R0)+ ;SAVE PC AT TRAP ON USER STACK MOV R3,(R1)+ ;SET SST PC WORD- MOV (R1),(R0) ;SAVE PS AT TRAP ON USER STACKC' MOV #CMODE!PMODE,(R1) ;SET SST PS WORD  .IF DF S$$LIB .IF DF X$$HDR- BIT #1,$TEMP0 ;SUPERVISOR MODE SST ROUTINE ? .IFF ; DF X$$HDRW, BIT #1,-(R4) ;SUPERVISOR MODE SST ROUTINE ? .ENDC ; DF X$$HDR BEQ 55$ ;IF EQ NOA+ 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 MODE1) TST (R0) ;WAS PREVIOUS MODE SUPERVISOR?V BMI 54$ ;IF MI NO : BIC #^CPSMODE&PMODE,(R1) ;SET PREVIOUS MODE TO SUPERVISOR54$: ;REFERENCE LABEL .ENDC55$: RETURN ;EXIT FROM TRAPH;6; SST FAULT AT NON ZERO STACK DEPTH-FATAL SYSTEM ERROR;F060$: BGCK$R #BF.EXE,R3,FATAL;BUGCHECK THE SYSTEM$ ;FACILITY IS GENERAL EXEC ERROR. ;THE ERROR CODE IS FOR THE ;SST CAUSING THE PROBLEM.Q; 2; SST CANNOT BE EFFECTED BECAUSE OF BAD TASK STACK;S170$: MOV #S.CSST,R0 ;SET BAD STACK SST ABORT CODEV BR 81$ ;ABORT TASK;I7; SST CANNOT BE EFFECTED BECAUSE OF NO SST VECTOR ENTRY ;E%80$: MOV 4(SP),R0 ;SET SST ABORT CODE) TST $TEMP0 ;IS THERE A BOM$ ABORT CODE?H BEQ 81$ ;IF EQ NO, OK AS IS + MOV $TEMP0,R0 ;USE BOM$ ERROR CODE INSTEADC181$: MOV #$STACK-22,SP ;RELOAD EXEC STACK POINTERL&85$: CALLR $ABCTK ;ABORT CURRENT TASK;D/; FAULT FROM PROTECTED LIMITS IN DRDSP OR DRQIO ; 90$: .IF DF P$$D70' CLR @$CPUER ;CLEAR CPU ERROR REGISTERT .IF NDF M$$EXTS NOP ;THIS NOP MUST BE HERE.% ;UNLESS THE MICRO CODE BUG IN THEU& ;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 INDICATORT- MOV 20(R1),PS ;RESTORE CORRECT PREVIOUS MODE $ DRSTS D.RS98 ;SET DIRECTIVE STATUS;A:; FAULT FROM PROTECTED LIMITS IN CSM INSTRUCTION EMULATION;'; AT THIS POINT THE STACK IS AS FOLLOWSR;C,; 0(SP) - NUMBER OF BYTES TO BE TRANSFERRED; . ; SST PARAMETERS; . %; 0(R1) - RETURN POINTER TO $DIRXT ; 2(R1) - SAVED R0 FROM TRAP7; 4(R1) - SAVED R1P; 6(R1) - SAVED R2W; 10(R1) - SAVED R3B; 12(R1) - SAVED R4; 14(R1) - SAVED R5 ; 16(R1) - SAVED PCN; 20(R1) - SAVED PSS; .R*; $STACK-6 - SAVED R0 DURING CSM EMULATION; $STACK-4 - PC OF CSM TRAP ; $STACK-2 - PS OF CSM TRAPN;M6; WE WILL CLEAN UP THE STACK AND MAKE IT LOOK AS IF WE; ENTERED THROUGH $DIRSV .IF DF S$$LIB100$:A MTPS #PR7 ;DISABLE INTERRUPTSE( MOV 14(R1),R5 ;;;RESTORE R5 FROM $DIRSV# MOV #$STACK-6,SP ;;;TRUNCATE STACKT# MOV (SP),R0 ;;;GET SAVED R0 VALUER MOV R5,(SP) ;;;SAVE R5 MOV 20(R1),R5 ;;;AND GET OLD PS6 BIC #^C,R5 ;;;CLEAR ALL BUT PREVOIUS MODE BITS+ BIS R5,PS ;;;SET PREVIOUS MODE TO CORRECTD MOV R4,-(SP) ;;;SAVE R4/ MOV SP,@$HEADR ;;;SAVE STACK POINTER IN HEADERC- MOV 4(R1),R1 ;;;RESTORE ORIGINAL VALUE OF R1M MTPS #0 ;;;ALLOW INTERRUPTS % MOV R3,-(SP) ;SAVE REST OF REGISTERS$ MOV R2,-(SP) ;TO MAKE IT LOOK MOV R1,-(SP) ;LIKE A NORMAL SST MOV R0,-(SP) ;ENTRY TO THES MOV #$DIRXT,-(SP) ;EXECUTIVE,) MOV #S.CCSM,R0 ;SET BAD STACK ABORT CODE; BR 85$ ;ABORT CURRENT TASK .ENDC ;DF S$$LIBC .DSABL LSBL .ENDUT PREV .TITLE DRGCL2 .IDENT /06.04/] S1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.,; All rights reservedl;8;t+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:e;t; J. W. BERZLE; J. R. KAUFFMAN;I+; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:C; ; B. S. MCCARTHY 5-MAR-87 06.04;1,; BM385 -- ADD $DRGC1 LABEL FOR MOVEMENT TO#; VECTOR COMMON. ALSO MOVE $RLMCBE ; to DREIF;E;+; **-$DRGCL-GET COMMAND LINE;K ; INPUTS:K;:9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK00Teec__DATADATADATADATA./; R3=ADDRESS OF THE 80. BYTE BUFFER IN THE DPB. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.h,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; ;- e .MCALL PKTDF$,TCBDF$.  .IF DF N$$DIR .MCALL LNMDF$' LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETST .ENDC ;DF N$$DIR1( PKTDF$ ;DEFINE COMMAND BUFFER OFFSETS TCBDF$ ;TCB OFFSETS6 .IIF GE </100>-200 .ERROR ;LENGTH TOO LONG .IF DF D$$PAR$DRGC1:: .IFF ; DF D$$PARK$DRGCL:: .ENDC ; DF D$$PAR MOVB -(R3),R0 ;GET DPB SIZE CMPB (R3)+,#41. ;IS IT GMCR$S BEQ GMCR ;IF EQ YESU CMPB R0,#3 ;IS IT SNXC$O BEQ SNXC ;IF EQ YEST .IF DF A$$CLI CMPB R0,#7 ;IS IT GCCI$F BEQ GCCI ;IF EQ YES .ENDC ;A$$CLI DRSTS D.RS99 ;ILLEGAL DPB SIZE;+; **-GMCR$ DIRECTIVE;P<; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TRANSFER A 1 TO 80.>; BYTE COMMAND LINE TO THE LAST MCR FUNCTION TASK REQUESTED BY; THE MCR DISPATCHER.G;: ; DPB FORMAT:D;A$; WD. 00 -- DIC(127.),DPB SIZE(41.).*; WD. 01 -- FIRST WORD OF 80. BYTE BUFFER.; .I; .; . ); WD. 50 -- LAST WORD OF 80. BYTE BUFFER.B;S5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)S; -; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.I;; DIRECTIVE STATUS EQUAL TO THE LENGTH OF THE COMMAND LINEC; IN BYTES IS RETURNED.I; C=1 IF DIRECTIVE IS REJECTED. :; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE ISSUING0; TASK IS NOT THE LAST TASK THAT WAS REQUESTED; BY THE MCR DISPATCHER.;.;-5GMCR: CALL $SCMDQ ;SEARCH COMMAND QUEUE FOR A PACKET  BCC 30$ ;IF CC, FOUND ONE &20$: DRSTS D.RS80 ;NO COMMAND PRESENT-30$: MOV R3,R4 ;SET DESTINATION DISPLACEMENTN( MOV KISAR6,R3 ;SET DESTINATION APR BIAS MOV R0,KISAR6 ;MAP COMMANDR7 BIT #CC.CLI,C.CSTS+140000 ;IS COMMAND INTENDED FOR CLI  BNE 20$ ;IF NE YES% MOV R0,-(SP) ;SAVE ADDRESS OF BUFFER MOV R0,R1 ;SET SOURCE APR BIAS) MOVB C.CBLK+140000,R5 ;GET SIZE OF BLOCK  SWAB R5 ;PUT IN HIGH BYTE; BISB C.CTR+140000,R5 ;GET TERMINATOR CHARACTER IN LOW BYTEE; MOV C.CSO+140000,-(SP) ;GET OFFSET TO START RETURNING FROM 8 MOV C.CCT+140000,R0 ;GET NUMBER OF CHARACTERS IN BUFFER, CMP #79.,R0 ;CAN ENTIRE BUFFER BE RETURNED BHIS 50$ ;IF HIS YES3 CLR 2(SP) ;DO NOT DEALLOCATE BUFFER AFTER COPYING+1 MOV #78.,R0 ;SET NUMBER OF CHARACTERS TO RETURN : ADD R0,C.CSO+140000 ;SET TO STARTING OFFSET FOR NEXT TIME@ SUB R0,C.CCT+140000 ;REMOVE THESE FROM CHARACTERS PRESENT COUNT@50$: MOV #C.CTXT+120000,R2 ;DISPLACEMENT OF START OF SOURCE TEXT1 ADD (SP)+,R2 ;POINT TO FIRST CHARACTER TO RETURNG .IF NDF D$$PARR, ADD R0,4(SP) ;SET CHARACTER COUNT +1 IN DSW .IFF ; NDF D$$PARR- ADD R0,10(SP) ;SET CHARACTER COUNT +1 IN DSWB .IFTF ; NDF D$$PARC TST R0 ;IS THERE ANY TEXTF BEQ 55$ ;IF EQ NOM, CALL $BLXIO ;COPY CHARACTERS INTO USER DPB)55$: MOV R3,KISAR6 ;MAP DESTINATION AGAINF4 MOVB #15,R3 ;ASSUME CONTINUATION MUST BE INDICATED0 MOVB #'-,(R4)+ ;HYPHEN FOR ASSUMED CONTINUATION* MOV (SP)+,R1 ;GET ADDRESS OF SOURCE BLOCK' BEQ 60$ ;IF EQ, THERE IS CONTINUATIONE .IFT ; NDF D$$PAR3 DEC 2(SP) ;ADJUST DSW TO ELIM INITIAL VALUE OF +1D .IFF ; NDF D$$PAR3 DEC 6(SP) ;ADJUST DSW TO ELIM INITIAL VALUE OF +1 .ENDC ; NDF D$$PAR1 DEC R4 ;SET TO OVERWRITE HYPHEN WITH TERMINATORM( MOV #$CLICQ,R0 ;POINT TO QUEUE LISTHEAD CALL $GTSPK ;DEQUEUE PACKETE MOV R1,R0 ;COPY PACKET ADDRESS! MOVB R5,R3 ;GET REAL TERMINATORD( SWAB R5 ;GET SIZE OF BLOCK IN LOW BYTE MOVB R5,R1 ;GET SIZE OF BLOCKE CALL $DESEC ;DEALLOCATE IT,60$: MOVB R3,(R4) ;PUT TERMINATOR IN BUFFER RETURN ;ALL DONE ;+; **-SNXC$ DIRECTIVE;UA; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CALL THE TERMINAL DRIVERN>; TO HAVE IT SEND THE NEXT COMMAND FROM THE SPECIFIED TERMINALD; TO THE CLI DISPATCHER FOR EXECUTION. THE NEED FOR THIS ARISES WHENA; THE TERMINAL IS IN SERIAL COMMAND EXECUTION MODE. NORMALLY, THESJ; NEXT COMMAND WILL BE CALLED FOR BY DREIF FOR WHEN A TASK WITH T3.CMD SETG; EXITS. IF THE TASK PROCESSING THE COMMAND WILL NOT EXIT 00Teeibjbkb a a aHOWEVER, THISMF; DIRECTIVE PROVIDES A WAY FOR IT TO SIGNAL TO THE SYSTEM THAT COMMANDB; EXECUTION IS COMPLETE, AND THE NEXT COMMAND CAN BE SENT FROM THE%; TYPEAHEAD BUFFER INSIDE THE DRIVER. <; IF THE TASK ISSUING THE DIRECTIVE IS SET TO PROMPT ON EXITB; HOWEVER, A TASK EXIT PROMPT WILL BE QUEUED UP INSTEAD OF CALLING?; THE DRIVER. THE DRIVER WILL GET CALLED BY MCR... AFTER IT HASA<; PROCESSED THE TASK EXIT PROMPT, OR BY A RE-ISSUANCE OF THE>; SNXC$ DIRECTIVE BY THE CLI IF THE CLI IS RECEIVING TASK EXIT@; PROMPT REQUESTS. THIS SCHEME CORRECTLY SYNCHRONIZES THE PROMPT4; REQUESTS AND COMMAND LINES ON THE USER'S TERMINAL.;O ; DPB FORMAT:N;R"; WD. 00 -- DIC(127.),DPB SIZE(3.):; WD. 01 -- ASCII NAME OF TERMINAL TO REQUEST COMMAND FROM); WD. 02 -- OCTAL UNIT NUMBER OF TERMINAL ;L5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)V;W-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.S&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.Y2; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF THE; LENGTH IS ILLEGAL.2; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE-; SPECIFIED TERMINAL IS NOT THE TASK'S TI:,O,; AND THE TASK IS NOT PRIVILEGED OR A CLI.2; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF THE5; SPECIFIED DEVICE DOES NOT EXIST, OR IS NOT A TTY.L; ;-3SNXC: MOV (R3)+,R0 ;GET NAME OF DEVICE IF SPECIFIED & BEQ 10$ ;IF EQ, DEVICE NOT SPECIFIED MOV (R3),R1 ;GET UNIT NUMBER1 CALL $CVDVN ;CONVERT DEVICE NAME TO UCB ADDRESSD' BCS 40$ ;IF CS, DEVICE DOES NOT EXISTF MOV R2,R0 ;COPY UCB ADDRESS # CALL $MPLND ;FOLLOW ANY REDIRECTSR, BIT #DV.TTY,U.CW1(R0) ;IS DEVICE A TERMINAL BEQ 40$ ;IF EQ NO @ BIT #T3.PRV!T3.CLI,T.ST3(R5) ;IS ISSUING TASK PRIVILEGED OR CLI BNE 20$ ;IF NE YES/ CMP T.UCB(R5),R0 ;DID TASK SPECIFY ITS OWN TI:A BEQ 20$ ;IF EQ YES# DRSTS D.RS16 ;PRIVILEGE VIOLATION 010$: 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 EXITS BEQ 50$ ;IF EQ NO % MOV #CC.EXT,R1 ;SET TASK EXIT PROMPTP4 BIT #T3.CMD,(R5) ;IS TASK PART OF CMD FROM TERMINAL BEQ 30$ ;IF EQ NO)3 BIS #CC.TTD,R1 ;FORCE CALL OF $SNCMD AT SOME POINT3!30$: MOV R0,R2 ;COPY UCB ADDRESSA- CALL $QCNTP ;QUEUE TASK EXIT PROMPT REQUESTP BR 60$ ;,40$: DRSTS D.RS92 ;ILLEGAL DEVICE SPECIFIED750$: BIT #T3.CMD,(R5) ;IS TASK PART OF CLI CMD FROM TTYB BEQ 70$ ;IF EQ NOT' CALL $SNCMD ;HAVE TTDRV SEND NEXT CMDO160$: BIC #T3.MCR!T3.CMD,(R5) ;DON'T DO THIS AGAINS70$: RETURN ;THE END;+; **-GCCI$ DIRECTIVE;PG; THIS DIRECTIVE IS USED BY A CLI TASK TO GET A COMMAND LINE. IT CANNOTIG; BE ISSUED BY A NON-CLI TASK. IT OFFERS SUCH CAPABILITIES AS RETURNINGRF; A SPECIFIC COMMAND, IDENTIFYING THE COMMAND'S PARENT TASK, LEAVING AK; COMMAND QUEUED AFTER RETREIVAL FOR RETREIVAL AGAIN BY A FUTURE DIRECTIVE,CK; AND RETURNING INFORMATION ABOUT THE TERMINAL THE COMMAND ORIGINATED FROM.D;HC; THE FORMAT OF THE COMMAND BUFFER SET UP IN THE CLI TASK SPACE IS: ;I+; +---------------------------------------+D#; ! ASCII DEV NAME OF ISSUING TTY !D+; !---------------------------------------!O+; ! NUM OF CHAR RETURNED ! OCTAL UNIT NUM.!S+; !---------------------------------------!C; ! COMMAND SIZE !+; !---------------------------------------! ; ! STATUS ! TERMINATOR !+; !---------------------------------------!E ; ! !O; ! COMMAND TEXT IN ASCII ! ; ! !I+; +---------------------------------------+N;U;R@; THE FORMAT OF THE INFORMATION BUFFER IN THE CLI TASK SPACE IS:;-+; +---------------------------------------+ ; ! U.CW2 OF ISSUING TERMINAL !-+; !---------------------------------------!!"; ! NAME OF PARENT TASK (IF ANY) !; ! (2 WORDS) !-+; !---------------------------------------!- ; ! ADDRESS OF OCB FROM PARENT !+; !---------------------------------------!-#; ! LOGIN UIC OF ISSUING TERMINAL !O+; !---------------------------------------! %; ! CURRENT UIC OF ISSUING TERMINAL !-+; !---------------------------------------!U"; ! ADDR OF CMD. IF NOT DEQUEUED !+00Teec__DATADATADATADATA; +---------------------------------------+; K; EXTRA FIELDS CAN BE ADDED TO THE END OFF THIS BUFFER IF REQUIRED, BECAUSE E; THE TASK SUPPLIES BOTH THE ADDR AND LENGTH OF ITS TASK BUFFER. ONLY-F; THAT MUCH DATA IS COPIED BACK TO THE TASK. THE TASK BUFFER IS FILLEDB; FROM THE FRONT WITH THE FIELDS IN THE ABOVE ORDER. IF THE BUFFERC; IS NOT LONG ENOUGH TO HOLD ALL OF THE DATA, THE FIELDS THAT WOULDFE; NOT FIT ARE NOT SUPPLIED, BUT NO INDICATION OF THIS DATA TRUNCATION J; IS GIVEN TO THE TASK. THUS IF MORE FIELDS ARE ADDED IN A FUTURE RELEASE,F; OLD TASKS WOULD STILL WORK SINCE THEY WILL GET EXACTLY WHAT THEY GOT/; BEFORE, THEY JUST WOULD NOT GET THE NEW DATA. ;G!; DPB FORMAT FOR GCCI$ DIRECITVE:T;C#; WD. 00 -- DIC(127.),DPB SIZE(7.).E:; WD. 01 -- NO COMMAND PRESENT ACTION, HIGH BYTE RESERVED..; WD. 02 -- ADDRESS OF COMMAND TO BE RETURNED.2; 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.O0; WD. 06 -- LENGTH OF TASK'S INFORMATION BUFFER.; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)G;-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. 6; DIRECTIVE STATUS OF +1 IS RETURNED IF A COMMAND HAS); BEEN SUCCESSFULLY RETURNED TO THE CLIC9; DIRECTIVE STATUS OF 'D.RS00' IS RETURNED IF NO COMMANDR0; IS QUEUED FOR THE CLI, AND THE CLI INDICATED2; THAT IT WANTED TO BE STOPPED. THE CLI WILL GET&; THIS STATUS AFTER IT IS UNSTOPPED.; C=1 IF DIRECTIVE IS REJECTED.U9; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF AN ILLEGALF; DPB SIZE IS SPECIFIED.5; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF EITHERC.; BUFFER OR THE DPB ARE NOT ENTIRELY WITHING; THE TASK'S ADDRESS SPACE.M/; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF L5; A GCCI$ WITH STOP ON NO COMMAND OPTION WAS ISSUEDO; FROM AST STATE:; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE ISSUING; TASK IS NOT A CLIL7; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED FROM A GCCI$R3; DIRECTIVE IF THERE IS NO COMMAND QUEUED FOR THE 1; CLI, AND THE TASK WANTED AN ERROR RETURNED INE; THIS CASE.2; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF THE+; ISSUING CLI TASK ATTEMPTED TO RECEIVE AH,; COMMAND FROM A TERMINAL WITH A DIFFERENT/; PROTECTION UIC FROM THE CLI'S CURRENT GROUPO2; AND THE CLI HAD AN ACTIVE GROUP GLOBAL CONTEXT; FOR THE FORMER GROUP.';S; ;- 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$ DRSTS D.RS16 ;SET DIRECTIVE STATUS)100$: MOV (R3)+,-(SP) ;SAVE NO CMD ACTIOND# TST T.ST2(R5) ;TASK AT AST STATE??A BPL 103$ ;IF PL NO5 BIT #2,(SP) ;IS STOP ON NO COMMAND OPTION SPECIFIED  BEQ 103$ ;IF EQ NO$ DRSTS D.RS80 ;SET DIRECTIVE STATUS)103$: MOV (R3)+,R4 ;SAVE DESIRED CMD ADDR % MOV (R3)+,R0 ;GET CMD BUFFER ADDRESSC$ BNE 110$ ;IF NE, THERE IS A BUFFER)105$: DRSTS D.RS98 ;SET DIRECTIVE STATUSM110$: MOV (R3)+,R1 ;GET LENGTH) CMP #11,R1 ;IS IT ABOVE MINIMUM LENGTH0 BHI 105$ ;IF HI NO. MOV R1,$TEMP0 ;SAVE LENGTH OF TASK CMD BUFFER. MOV R0,-(SP) ;SAVE ADDRESS OF TASK CMD BUFFER+ CALL $ACHKW ;ADDRESS CHECK COMMAND BUFFER,& MOV (R3)+,R0 ;GET INFO BUFFER ADDRESS BEQ 120$ ;IF EQ, NO BUFFER% MOV (R3),R1 ;GET INFO BUFFER LENGTH0! BMI 105$ ;IF MI, ILLEGAL LENGTHA( CALL $ACHKW ;ADDRESS CHECK INFO BUFFER9120$: MOV $CLICQ,R0 ;GET ADDRESS OF FIRST PACKET IT QUEUE8! BEQ 131$ ;IF EQ, QUEUE IS EMPTY /130$: CALL $SRCQ1 ;FIND A COMMAND FOR THIS CLII BCC 140$ ;IF CC, FOUND ONE; ; NO COMMAND EXISTS FOR THIS CLI;S131$: TST (SP)+ ;CLEAN STACKV& MOV (SP)+,R0 ;GET DESIRED ACTION CODE BEQ 135$ ;IF EQ, RETURN ERROR, ASR R0 ;FORCE TASK TO EXIT?? BCS 133$ ;IF CS YESF ASR R0 ;FORCE TASK TO STOP??" BCC 135$ ;IF CC NO, RETURN ERROR CALL $STPCT ;STOP THE TASK DRSTS D.RS00 ;SET IS.CLR)133$: JMP $DREXT ;FORCE THE TASK TO EXIT '135$: DRSTS D.RS8 ;SET ERROR CONDITION,;E; CAN THIS PACKET BE USEDR; 140$: MOV R0,KISAR6 ;MAP PACKETB# CMP R4,R0 ;IS IT THE DESIRED00Teeibjbkb a a a ONE?C BEQ 150$ ;IF EQ YESC TST R4 ;TAKE ANY ONE?; BEQ 150$ ;IF EQ YES+,145$: MOV @#140000,R0 ;POINT TO NEXT IN LIST BR 130$ ;RESTART SEARCH;<150$: BIT #CC.CLI,@#C.CSTS+140000 ;IS THIS COMMAND FOR A CLI BEQ 145$ ;IF EQ NO( MOV @#C.CUCB+140000,R4 ;GET UCB ADDRESS" MOV R0,-(SP) ;SAVE PACKET ADDRESS6 BIT #CC.MSG,@#C.CSTS+140000 ;IS THIS A SYSTEM MESSAGE BNE 190$ ;IF NE YESR .IF DF X$$HDR MOV $SAHDB,KISAR6 ;MAP HEADER% MOV $SAHPT,R0 ;GET ADDRESS OF HEADER, .IFF ;X$$HDRS% MOV $HEADR,R0 ;GET ADDRESS OF HEADERR .ENDC ;X$$XDR* ADD #H.CUIC,R0 ;POINT TO PROTECTION GROUP7 TSTB T.GGF(R5) ;TASK HAVE ACTIVE GOUPT GLOBAL CONTEXT?  BEQ 152$ ;IF EQ NO# CMPB U.LUIC(R4),1(R0) ;SAME GROUP?Q BEQ 152$ ;IF EQ YES@# DRSTS D.RS17 ;RETURN IE.RSU ERRORM152$: ( .IF DF N$$DIR ;NAMED DIRECTORY SUPPORT, MOV T.CTX(R5),R1 ;GET CURRENT CONTEXT BLOCK BEQ 153$ ;NONE# CALL $DLCTX ;DELETE CONTEXT BLOCK6 A .ENDC ;DF N$$DIRP*153$: MOV T.OCBH(R5),R1 ;POINT TO OCB LIST BR 155$ ;D%154$: MOV (R1),R1 ;POINT TO NEXT OCB;'155$: BEQ 156$ ;IF EQ, END OF OCB LISTT2 CMP O.MCRL(R1),(SP) ;IS THIS OCB FOR THIS COMMAND BNE 154$ ;IF NE NO .IF DF N$$DIR A MOV O.STAT+10(R1),T.CTX(R5) ;PUT CONTEXT BLOCK FROM OCB INTO TCBD .ENDC ;DF N$$DIR . MOV O.STAT+4(R1),(R0) ;SET NEW PROTECTION UIC' MOV (R0)+,-(SP) ;SAVE PROTECTION UICC+ MOV O.STAT+6(R1),(R0) ;SET NEW DEFAULT UIC * BIS (R0)+,(SP)+ ;EITHER UIC SPECIFIED ?# BNE 158$ ;IF NE YES, LEAVE THEMT' CMP -(R0),-(R0) ;BACK UP UIC POINTERR BR 157$ ;X156$: .IF DF N$$DIR > MOV U.CTX(R4),T.CTX(R5) ;PUT CONTEXT BLOCK FROM TERM INTO TCB C .ENDC ;DF N$$DIR;2157$: MOV U.LUIC(R4),(R0)+ ;SET NEW PROTECTION UIC) MOV U.UIC(R4),(R0)+ ;SET NEW DEFAULT UICD158$:  .IF DF N$$DIR' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGC( MOV T.CTX(R5),KISAR6 ;MAP CONTEXT BLOCK BEQ 1585$ ;IF EQ, NONE- INCB C.REF+140000 ;INCREMENT REFERENCE COUNTR(1585$: MOV (SP)+,KISAR6 ;RESTORE MAPPING .ENDC ;DF N$$DIRR7159$: MOV -2(R3),R0 ;GET ADDR OF INFO BUFFER IF PRESENTI! BEQ 190$ ;IF EQ, NO INFO BUFFERX CALL $RELOC ;RELOCATE ADDRESS 2 MOV R1,KISAR6 ;MAP INFO BUFFER IN USER TASK SPACE# MOV (R3),R3 ;GET LENGTH OF BUFFERM;U(; FILL INFORMATION BUFFER IN TASK SPACE;;$ ASR R3 ;CONVERT TO WORD COUNT,% BCS 105$ ;IF CS, LENGTH IS NOT EVENX) BEQ 190$ ;IF EQ, BUFFER HAS LENGTH ZERO  MOV U.CW2(R4),(R2)+ ;GET U.CW2;2 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$ ;I%160$: MOV (R1),R1 ;POINT TO NEXT OCBE(164$: BEQ 170$ ;IF EQ, END OF OCB LIST 2 CMP O.MCRL(R1),(SP) ;IS THIS OCB FOR THIS COMMAND BNE 160$ ;IF NE NO5 MOV O.STAT(R1),(R2)+ ;COPY FIRST HALF OF PARENT NAMEE8 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 ADDRESSC DEC R3 ;ROOM LEFT IN BUFFER? BLT 190$ ;IF LT, NOS+ MOV O.STAT+4(R1),(R2) ;COPY PROTECTION UICM" MOV (R2)+,R0 ;SAVE PROTECTION UIC DEC R3 ;ROOM LEFT IN BUFFER? BLT 190$ ;IF LT, NO( MOV O.STAT+6(R1),(R2) ;COPY DEFAULT UIC$ BIS (R2)+,R0 ;EITHER UIC SPECIFIED?! BNE 185$ ;IF NE YES, LEAVE THEM ADD #2,R3 ;RESTORE LENGTHI- CMP -(R2),-(R2) ;BACK UP INFO BUFFER POINTER) BR 180$ ;D)170$: CLR (R2)+ ;CLEAR PARENT NAME FIELDD CLR (R2)+ ;T DEC R3 ;ANOTHER WORD IN BUFFER BLT 190$ ;IF LT NO$ CLR (R2)+ ;CLEAR OCB ADDRESS FIELD%180$: DEC R3 ;ANOTHER WORD IN BUFFERO BLT 190$ ;IF LT NO% MOV U.LUIC(R4),(R2)+ ;COPY LOGIN UICR DEC R3 ;ROOM LEFT IN BUFFER1 BLT 190$ ;IF LT NO+ MOV U.UIC(R4),(R2)+ ;COPY CURRENT UIC CODE2"185$: DEC R3 ;ROOM LEFT IN BUFFER BLT 190$ ;IF LT NO0 CLR (R2) ;ASSUME DO NOT SUPPLY COMMAND ADDRESS' TSTB 4(SP) ;IS COMMAND TO BE DEQUEUED8 BPL 190$ ;IF PL YES 0 MOV (SP),(R2) ;SUPPLY ADDRESS OF COMMAND BUFFER;;/; COPY COMMAND FROM POOL INTO THE TASK'S BUFFERR;2F190$: BIC #T3.MCR!T3.CMD,T.ST3(R5) ;ASSUME NO PROMPT OR SERIAL CMD EXE- MOV (SP)+,R5 ;COPY POINTER 00TeUec__DATADATADATADATATO BUFFER IN POOL ' MOV R5,KISAR6 ;MAP COMMAND IN SEC POOL1, MOV (SP),R0 ;GET ADDRESS OF BUFFER IN TASK ASSUME C.CSO,C.CMCD: MOV @#C.CSO+140000,(SP) ;SAVE START OFFSET OR MSG NUMBER3 MOVB @#C.CTR+140000,-(SP) ;SAVE COMMAND TERMINATOR(, MOV @#C.CSTS+140000,-(SP) ;SAVE STATUS WORD0 MOV @#C.CCT+140000,-(SP) ;SAVE CHARACTER COUNT& CALL $RELOC ;RELOCATE BUFFER ADDRESS) MOV R1,KISAR6 ;MAP USER'S COMMAND BUFFER. MOV R1,R3 ;SAVE APR BIAS, BIT #CC.MSG,2(SP) ;IS THIS A MESSAGE PACKET BNE 200$ ;IF NE YESN MOV R4,R1 ;COPY UCB ADDRESSM MOV (R4),R0 ;POINT TO DCB0* TST (R0)+ ;POINT TO ADDRESS OF FIRST UCB+ SUB (R0)+,R1 ;CALC RELATIVE ADDRESS OF UCBV" 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 PAIRT& DIV R2,R0 ;CALC RELATIVE UNIT NUMBER MOV (SP)+,R2 ;RESTORE R2A3 ADD R0,(R2)+ ;CALC LOGICAL UNIT NUMBER IN LOW BYTE- INC (SP) ;INCREASE CHAR COUNT TO INCLUDE CRB- MOV #1,-(SP) ;REMEMBER TO DECREMENT IT LATERR BR 210$ ;4*200$: CLR (R2)+ ;ZERO TO INDICATE MESSAGE, MOV 6(SP),(R2)+ ;PUT MESSAGE CODE IN BUFFER0 CLR 6(SP) ;ZERO FOR LATER CODE THAT USES C.CSO1 CLR 10(SP) ;FORCE MESSAGE BUFFER TO BE DEQUEUEDB. CLR -(SP) ;DO NOT HAVE TO CORRECT CHAR COUNT.210$: MOV 2(SP),R1 ;GET NUMBER OF CHARS IN CMD+ MOV $TEMP0,R0 ;GET LENGTH OF TASK'S BUFFERR. SUB #10,R0 ;CALC SPACE AVAILABLE FOR COMMAND+ CLR -(SP) ;ASSUME LENGTHS WILL BE CORRECTA2 CMP R0,R1 ;COMPARE SIZE OF TASK AND POOL BUFFERS' BLO 220$ ;IF LO, USE TASK BUFFER SIZEL! MOV R1,R0 ;USE POOL BUFFER SIZE% BIT #CC.MSG,6(SP) ;IS THIS A MESSAGEU2 BNE 220$ ;IF NE YES, DO NOT DECREMENT ANY COUNTS5 MOV #400,(SP) ;HAVE TO DECREMENT COUNT IN UPPER BYTE5220$: MOVB R0,-1(R2) ;PUT ACTUAL COUNT IN TASK BUFFERO, SUB (SP)+,-2(R2) ;CORRECT ACTUAL CHAR COUNT- MOV R1,(R2) ;PUT BUFFER SIZE IN TASK BUFFER02 SUB (SP)+,(R2)+ ;CORRECT SIZE OF ORIGINAL COMMAND TST (SP)+ ;POP C.CCT OFF STACK MOV (SP)+,R1 ;GET STATUS BITSC BIC #^C,R1 ;ISOLATE STATUS BITS TO BE PASSED, ASH #7,R1 ;SHIFT INTO POSITION4 BISB (SP)+,R1 ;PUT TERMINATOR CHARACTER IN POSITION9 MOV R1,(R2)+ ;PUT TERMINATOR AND STATUS BITS IN USER BUFR TST R0 ;ANY CHARACTERS TO COPY BEQ 240$ ;IF EQ NO MOV R5,R1 ;SET SOURCE APR BIAS MOV R2,R4 ;DESTINATION DISPR/ MOV #C.CTXT+120000,R2 ;SET SOURCE DISPLACEMENTF+ ADD (SP),R2 ;POINT TO START OF VALID TEXTN. CALL $BLXIO ;COPY COMMAND INTO TASK'S BUFFER&240$: MOV R5,KISAR6 ;MAP COMMAND AGAIN# TST (SP)+ ;CLEAN C.CSO FROM STACKU6 BIT #CC.MSG,@#C.CSTS+140000 ;IS THIS A SYSTEM MESSAGE BNE 260$ ;IF NE YESM( MOV $TKTCB,R3 ;CURRENT TASK TCB ADDRESS% TST @#C.CCT+140000 ;ANY TEXT PRESENTE BEQ 250$ ;IF EQ NO/ CMPB #33,@#C.CTR+140000 ;TERMINATED BY ESCAPE?, BEQ 250$ ;IF EQ YESS, BIS #T3.MCR,T.ST3(R3) ;FORCE PROMPT ON EXIT=250$: BIT #CC.TTD,@#C.CSTS+140000 ;DID CMD ORIGINATE IN TTDRVT BEQ 260$ ;IF EQ NO> BIS #T3.CMD,T.ST3(R3) ;PROPOGATE SERIAL CMD EXECUTION ON EXIT.260$: TSTB (SP)+ ;LEAVE COMMAND PACKET QUEUE? BMI DUN ;IF MI YES% MOV R5,R1 ;GET CMD ADDR IN SEC POOLS" MOV #$CLICQ,R0 ;POINT TO LISTHEAD CALL $GTSPK ;DEQUEUE PACKETE MOV R1,R0 ;COPY PACKET ADDRESS. MOVB @#C.CBLK+140000,R1 ;GET LENGTH OF PACKET. CALLR $DESEC ;DEALLOCATE AND RETURN TO DRDSP DUN: RETURNS .ENDC ;A$$CLI .ENDROMPT ON EXIT=250$: BIT #CC.TTD,@#C.CSTS+140000 ;DID CMD ORIGINATE IN TTDRVT BEQ 260$ ;IF EQ NO> BIS #T3.CMD,T.ST3(R3) ;PROPOGATE SERIAL CMD EXECUTION ON EXIT.26 .TITLE DRGTK  .IDENT /06.00/C; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.A; All rights reserved#;I;R<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;A; VERSION 05.05E;;; D. N. CUTLER 27-MAR-74;P;U; PREVIOUSLY MODIFIED BY:I;; T. J. MILLER; P. J. BEZEREDI; J. M. LAWLER; T. M. MARTIN ; T. LEKAS;T;BE; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 UPDATE F (OR VERSION 4.0) BY:I;O; ERIC P00Ueeibjbkb a a aOSTPISCHIL 9-MAR-87.>; 06.00 edp050 -- CORRECT MOVEMENT OF T.PRI FROM WORD TO BYTE%; AS INDICATED BY HANS PILMEYER.;H;S;W; MACRO LIBRARY CALLSA;C .MCALL HDRDF$,PCBDF$,TCBDF$% HDRDF$ ;DEFINE TASK HEADER OFFSETSS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSL, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;+; **-$DRGTK-GET TASK PARAMETERSI; H; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A SIXTEEN WORD BUFFER WITH; TASK PARAMETERS.;F ; DPB FORMAT:0;Y"; WD. 00 -- DIC(63.),DPB SIZE(2.).-; WD. 01 -- ADDRESS OF A SIXTEEN WORD BUFFER.F; ; BUFFER FORMAT:;A.; WD. 00 -- FIRST HALF OF ISSUING TASK'S NAME./; WD. 01 -- SECOND HALF OF ISSUING TASK'S NAME.C0; WD. 02 -- FIRST HALF OF TASK'S PARTITION NAME.1; WD. 03 -- SECOND HALF OF TASK'S PARTITION NAME.B>; WD. 04 -- FIRST HALF OF REQUESTER TASK NAME (NOT SUPPORTED).?; WD. 05 -- SECOND HALF OF REQUESTER TASK NAME (NOT SUPPORTED).L; WD. 06 -- TASK PRIORITY.; WD. 07 -- CURRENT TASK UIC. $; WD. 10 -- NUMBER OF LOGICAL UNITS.; WD. 11 -- PROCESSOR INDICATORF+; WD. 12 -- STD FLAGS WORD (NOT SUPPORTED).:-; WD. 13 -- ADDRESS OF TASK SST VECTOR TABLE.N3; WD. 14 -- SIZE OF TASK SST VECTOR TABLE IN WORDS.C"; WD. 15 -- SIZE OF TASK IN BYTES./; WD. 16 -- SYSTEM ID CODE (6 FOR RSX-11M+). %; WD. 17 -- PROTECTION UIC WORD. F ; ; INPUTS: ;T9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.E3; R3=ADDRESS OF THE SIXTEEN WORD BUFFER IN THE DPB. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.O,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; A; NOTE THAT IF THE REQUESTING TASK HAS A NON RESIDENT TASK HEADERT=; WE WILL ENTER AT $DRGTK WITH THE TASK HEADER MAPPED THROUGHL=; KERNEL APR 6. HOWEVER, WE ALSO NEED TO MAP THE USER BUFFERY<; AREA WITH APR 6. THEREFORE, WE WILL SAVE NECESSARY HEADER?; INFORMATION IN THE INTERNAL DPB SAVE AREA (WE NO LONGER NEED K*; THE DPB) BEFORE MAPPING THE USER BUFFER.;S5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)O;H$; C=0 WITH A DIRECTIVE STATUS OF +1.;- C4$DRGTK::MOV (R3),R3 ;GET ADDRESS OF 16. WORD BUFFER .IF DF X$$HDRR1 MOV #$DICSV+2,R0 ;USE INTERNAL DPB FOR SAVE AREAT T .IF DF M$$MUP' MOV H.DUIC(R4),(R0)+ ;SAVE DEFAULT UICS .IFF % MOV H.CUIC(R4),(R0)+ ;OR CURRENT UIC  .ENDC* MOV H.NLUN(R4),(R0)+ ;SAVE NUMBER OF LUNS0 MOV H.TKVA(R4),(R0)+ ;SAVE TASK SST VECTOR ADDR0 MOV H.TKVL(R4),(R0) ;SAVE LENGTH OF SST VECTOR ASR (R0)+ ;IN TERMS OF WORDS3 MOV H.WND(R4),R1 ;POINT TO NUMBER OF WINDOW BLOCKSA .IF DF U$$DAS5 BIT #T4.DSP,T.ST4(R5) ;TASK HAVE I/D SPACE ENABLED ?U BEQ 10$ ;IF EQ, NO6 ADD #W.BLGH,R1 ;YES, POINT TO WINDOW 1 (D SPACE ROOT)10$: ;REFERENCE LABEL .ENDC ; DF U$$DAS4 MOV W.BHVR+2(R1),(R0) ;CALCULATE TASK SIZE IN BYTES SUB W.BLVR+2(R1),(R0) ; M INC (R0)+ ;R) MOV H.CUIC(R4),(R0) ;SAVE PROTECTION UICR .ENDC/ MOV #16.*2,R1 ;SET LENGTH OF BUFFER IN BYTES E, CALL $ACHKP ;ADDRESS CHECK PARAMETER BLOCK, MOV T.NAM(R5),(R3)+ ;INSERT NAME OF TASK  MOV T.NAM+2(R5),(R3)+ ;* MOV T.PCB(R5),R0 ;GET ADDRESS OF TASK PCB. MOV P.NAM(R0),(R3)+ ;INSERT NAME OF PARTITION MOV P.NAM+2(R0),(R3)+ ;0 CMP (R3)+,(R3)+ ;POINT TO TASK PRIORITY ADDRESS- MOVB T.PRI(R5),(R3)+ ; INSERT TASK PRIORITY.; CLRB (R3)+ ; CLEAR HIGH BYTE.B .IF DF X$$HDR/ MOV #$DICSV+2,R4 ;ADDRESS OF SAVED HEADER INFOE MOV (R4)+,(R3)+ ;INSERT UIC*( MOV (R4)+,(R3)+ ;INSERT NUMBER OF LUNS( MOV $PRMOD,(R3)+ ;INSERT PROCESSOR TYPE- TST (R3)+ ;POINT TO TASK SST VECTOR ADDRESS2 MOV (R4)+,(R3)+ ;INSERT TASK SST VECTOR ADDRESS 6 MOV (R4)+,(R3)+ ;INSERT LENGTH OF SST VECTOR IN WORDS% MOV (R4)+,(R3)+ ;TASK SIZE IN BYTESP .IF DF R$$PRO! MOV #11,(R3)+ ;SET CODE FOR P/OSR .IFF ;R$$PROE T$ MOV #6,(R3)+ ;SET CODE FOR RSX-11M+ .ENDC ;R$$PRO" MOV (R4),(R3) ;SET PROTECTION UIC .IFFA .IF DF M$$MUP) MOV H.DUIC(R4),(R3)+ ;INSERT DEFAULT UIC3 .IFFR) MOV H.CUIC(R4),(R3)+ ;INSERT CURRENT UICR .ENDC, MOV H.NLUN(R4),(R3)+ ;INSERT NUMBER OF LUNS( MOV $PRMOD,00UeVec__DATADATADATADATA(R3)+ ;INSERT PROCESSOR TYPE- TST (R3)+ ;POINT TO TASK SST VECTOR ADDRESSS5 MOV H.TKVA(R4),(R3)+ ;INSERT TASK SST VECTOR ADDRESSP: MOV H.TKVL(R4),(R3) ;INSERT LENGTH OF SST VECTOR IN WORDS' ASR (R3)+ ;CONVERT TO LENGTH IN WORDSD3 MOV H.WND(R4),R1 ;POINT TO NUMBER OF WINDOW BLOCKSE .IF DF U$$DAS5 BIT #T4.DSP,T.ST4(R5) ;TASK HAVE I/D SPACE ENABLED ?S BEQ 20$ ;IF EQ, NO6 ADD #W.BLGH,R1 ;YES, POINT TO WINDOW 1 (D SPACE ROOT)20$: ;REFERENCE LABEL .ENDC ; DF U$$DAS4 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/OSP .IFF ;R$$PRO, )' MOV #6,(R3)+ ;SET CODE FOR RSX-11M+ A .ENDC ;R$$PRO+ MOV H.CUIC(R4),(R3) ;SET PROTECTION UIC T .ENDC RETURN ; D .ENDBIT #T4.DSP,T.ST4(R5) ;TASK HAVE I/D SPACE ENABLED ?S BEQ 20$ ;IF EQ, NO6 ADD #W.BLGH,R1 ;YES, POINT TO WINDOW 1 (D SPACE ROOT)20$: ;REFERENCE LABEL .ENDC ; DF U$$DAS4 MOV W.BHVR+2(R1@ .TITLE XXATT - ATTACH AND DETACH PROCESSING FOR GENERIC DEVICES .IDENT /1.00/;F1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reservedV;,;)5; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAYH5; BE USED AND COPIED ONLY IN ACCORDANCE WITH THET5; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THEA5; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHERD5; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE:5; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TOV5; AND OWNERSHIP OF THE SOFTWARE IS HEREBY R; TRANSFERRED.;.5; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TOI5; 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 ;H; MACRO LIBRARY CALLSI;  .MCALL UCBDF$,CPRDF$ UCBDF$ ,,1N CPRDF$P;+$; **-XXATT - PROCESS ATTACH REQUESTS; F; THIS ROUTINE IS DISPATCHED TO FROM XXDRV AFTER AN IO.ATT REQUEST HAS,; BEEN PROCESSED SUCCESSFULLY BY THE HOST. ;OF; IF THE UCB IS HTn: OR HT377:, ALLOCATE AN AST CONTROL BLOCK WITH TWOJ; EXTRA WORDS AND PUT THE TCB AND OF THE TASK AND THE LUN IN THOSE FIELDS.:; QUEUE THE AST CONTROL BLOCK AT OFFSET U.RAST OF THE UCB.;IJ; IF THE UCB IS NS:, ALLOCATE AN AST CONTROL BLOCK WITH ZERO PARAMETERS. ;*; IF THE UCB IS ANYTHING ELSE, WE'RE DONE.;R ; INPUTS:;X; R5 => UCB OF UNIT ATTACHED; R3 => DCB OF UNIT ATTACHED; R1 => CURRENT I/O PACKET;A; OUTPUTS: NONE.;P&; REGISTERS MODIFIED: R0, R1, R2, R3;-;T;U"; DEFINE LOCAL SYMBOLS AND STORAGE;O MAP6 = 140000ACBLNK: .BLKW 1 XXATT:: ; L; LOOK FOR ACB IN UCB QUEUE -- IF THIS IS NOT A NETWORK DEVICE, WE WILL WANTG; TO REJECT THE ATTACH IF WE FIND AN ACB (BECAUSE THE DEVICE IS ALREADYRL; ATTACHED). IF IT IS A NETWORK DEVICE, WE WILL WANT TO CHECK THE SPECIFIED; AST ADDRESS.;/ MOV R5,R0 ;GET POINTER TO ACB QUEUE LIST HEADU ADD #U.RAST,R0 ;=2$: MOV (R0),R0 ;GET NEXT ACB* BEQ 3$ ;IF EQ NOT IN LIST - LOOK OFF TCB 1( CMP A.PRM+14(R0),I.TCB(R1) ;RIGHT TASK? BNE 2$ ;IF NE NO/ CMPB A.PRM+16(R0),I.LN2(R1) ;RIGHT LUN NUMBER?  BNE 2$ ;IF NE NO BR 8$ ;FOUND ITS3$:O; %; SEARCH LIST OFF TCB FOR CORRECT ACBC;H" MOV I.TCB(R1),R0 ;GET TCB ADDRESS ADD #T.ASTL,R0 ;POINT TO LIST5$: MOV (R0),R0 ;GET NEXT ACB BEQ 10$ ;IF EQ NONET, CMPB A.PRM+16(R0),I.LN2(R1) ; MATCHING LUN? BNE 5$ ;IF NE NO8$: ;TJ; WE FOUND AN ACB. NETWORK ACBS GET CHANGED. OTHER DEVICES GET REJECTED.* CMP D.NAM(R3),#"NS ; IS THIS THE NETWORK?# BNE 45$ ; NO, GO RETURN AN ERROR. ;F; FOUND ACB, CHANGE AST ADDRESSR;; MOV I.PRM(R1),A.AST(R0)  CLC ; INDICATE SUCCESS. RETURN10$:I; WE DID NOT FIND AN ACB. CHECK TO SEE IF WE NEED ONE OR THIS ATTACH CANS; BE PERFORMED WITHOUT AN ACB.* CMP D.NAM(R3),#"NS ; IS THIS THE NETWORK?6 BEQ 12$ ; YES, SKIP OTHER CHECKS AND ACCEPT REQUEST.B B00Veeibjbkb a a aIS #SF$BLK,SNDCOD ; INDICATE TASK IS BLOCKED FOR THIS OPERATION.: CMP D.NAM(R3),#"HT ; IS THIS ONE OF OUR PSEUDO-TERMINALS?: BNE 19$ ; NO, DON'T SET UP AN ACB; U.RAST MAY NOT EXIST.; ; CHECK FOR UNSOL. CHARACTER AST;* BIT #TF.AST,I.FCN(R1) ;DO WE NEED AN ACB? BEQ 19$ ;IF EQ NOR12$:; ; ALLOCATE AN AST CONTROL BLOCK ;E& MOV R1,R3 ;GET ADDRESS OF I/O PACKET* MOV #30.,R1 ;SET SIZE OF ACB TO ALLOCATE/ MOV #ACBLNK,R4 ;GET ADDRESS TO STORE LINK INTOI, CALL ALACB ;ALLOCATE AN ACB FOR THE ATTACH+ BCS 40$ ;IF CS, ALLOCATION FAILED...ERROR  MOV R5,R0 ;GET UCB ADDRESS# ADD #U.RAST,R0 ;POINT TO LINK WORD?" TST 2(R0) ;IS SECOND WORD EMPTY? BNE 18$ ;IF NE NOS( MOV R0,2(R0) ;INITIALIZE QUEUE LISTHEAD:18$: MOV R2,R1 ;ADDRESS OF LINK WORD IN AST CONTROL BLOCK CALL $QINSF ;QUEUE IT UP19$: CLC ; INDICATE SUCCESS. RETURN ;RETURN SUCCESSFULLY;#; ERROR PROCESSING FOR ATTACHO;E40$:. MOV #IE.NOD&377,R0 ;ERROR - NO DYNAMIC MEMORY" BR 49$ ; JOIN COMMON ERROR CODE.45$:> MOV #IE.DAA&377,R0 ; INDICATE ERROR, DEVICE ALREADY ATTACHED.49$: SEC ;INDICATE FAILURE RETURN ;K;+'; **-ALACB - ALLOCATE AST CONTROL BLOCKB;1D; THIS SUBROUTINE ALLOCATES AN AST CONTROL BLOCK AND INITIALIZES THED; FIXED DATA. DATA THAT IS CHARACTERISTIC-DEPENDENT (SUCH AS A.AST)(; MUST BE SET BY THE CALLER UPON RETURN.; ; INPUTS::; R1 = SIZE IN BYTES OF ACB TO ALLOCATE (SAVED IN A.PRM+4); R3 => CURRENT I/O PACKET ; R5 => UCBA; ; OUTPUTS:99; CC-C CLEAR IF SUCCESSFUL ALLOCATION; CC-C SET OTHERWISEN@; R2 => LINK WORD OF ALLOCATED ACB (ACB'S HAVE NEGATIVE OFFSETS)&; ACBLNK => LINK WORD OF ALLOCATED ACB;T,; THE ALLOCATED ACB IS FORMATTED AS FOLLOWS:;A); +-------------------------------------+E7; | XXDRV KINAR5 BIAS | A.KSR5 (-4)U); |-------------------------------------|P7; | DEQUEUE SUBROUTINE ADDRESS (DQACB) | A.DQSR (-2)O); |-------------------------------------|N$; | THREAD WORD (0) | (0)); |-------------------------------------|O1; | LENGTH OF CONTROL BLOCK (0) | A.CBLT); |-------------------------------------|L0; | # BYTES TO ALLOC ON STACK | A.BYT); |-------------------------------------|-.; | AST ADDRESS (0) | A.AST); +-------------------------------------+40; | # AST PARAMETERS | A.NPR); |-----------------+-------------------|..; | U.HTID | 0 | A.PRM); |-----------------+-------------------|)-; | UCB OF ATTACHED UNIT | A.PRM+2 ); |-----------------+-------------------|.3; | FLAG BYTE | ACB SIZE | A.PRM+4 ); |-----------------+-------------------|T,; | ^C AST ADDRESS | A.PRM+6); |-------------------------------------|A'; | AST ADDRESS | A.PRM+10-); |-------------------------------------| .; | REMOTE PACKET HEADER BIAS | A.PRM+12); |-------------------------------------| 1; | TCB ADDRESS OF TASK | A.PRM+14-); |-------------------------------------|.#; | | LUN # | A.PRM+16-); +-------------------------------------+ ;E; REGISTERS MODIFIED: R1;-;-ALACB: CALL $ALOCB ;ALLOCATE SPACE  BCS 10$ ;BR IF ERROR7 MOV KINAR5,(R0)+ ;INSERT DRIVER APR 5 MAPPING (A.KSR5) 9 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,ACBLNK ;STORE POINTER TO THE ACBT TST (R0)+ ;SKIP OVER LINK WORD1 CLR (R0)+ ;SET BLOCK LENGTH ZERO TO FORCE SYSXT . ;TO CALL US WHEN BLOCK IS DEQUEUED (A.CBL)& MOV #14.,(R0)+ ;ASSUME NOT A TERMINAL* BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL BEQ 6$ ;IF EQ NO< MOV #16.,-2(R0) ;ALLOCATE 16. BYTES ON TASK'S STACK (A.BYT)=6$: CLR (R0)+ ;UNSOLICITED INPUT AST ADDRESS - CLEAR FOR NOW  CLR (R0)+ ;NO PARAMETERS* BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL BEQ 7$ ;IF EQ NO MOV #1,-2(R0) ;1 PARAMETER 7$: CLRB (R0)+ ;6 MOVB I.PRM+2(R3),(R0)+ ;SAVE USER DEFINED TERMINAL ID MOV R5,(R0)+ ;SAVE 00VeWeXe__DATADATADATADATAUCB ADDRESSX+ MOVB R1,(R0)+ ;SAVE AST CONTROL BLOCK SIZE. CLRB (R0)+ ;ACB FLAG BYTE " CLR (R0)+ ;ASSUME NOT A TERMINAL* BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL BEQ 8$ ;IF EQ NOA MOV I.PRM+4(R3),-2(R0) ;SAVE CONTROL-C AST ADDRESS IN ACB IF ONEE)8$: MOV I.PRM(R3),(R0)+ ;SAVE AST ADDRESS(- CLR (R0)+ ;CPRBUF BIAS (FILLED IN BY KXDRV)S. MOV I.TCB(R3),(R0)+ ;SAVE TCB ADDRESS OF TASK% MOVB I.LN2(R3),(R0) ;SAVE LUN NUMBER10$: RETURN ;ALL DONEV;R;+&; **-DQACB - DEQUEUE AST CONTROL BLOCK;D; INPUT:#; R0 - ADDRESS OF AST CONTROL BLOCKS;.;-DQACB:: ;C+; GET HEADER ADDRESS FROM AST CONTROL BLOCKN;' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGL$ MOV A.PRM+12(R0),KISAR6 ;MAP HEADER' MOV #1,H$STAT+MAP6 ;SET SUCCESS STATUSB CLR H$STAT+2+MAP6 ;" MOV (SP)+,KISAR6 ;RESTORE MAPPING;0; SEND RESPONSE TO CPR;  MOV R0,-(SP) ;SAVE ACB ADDRESS;& CPSEN$ #SN$RSP,A.PRM+12(R0),#H$SIZE+6" MOV (SP)+,R0 ;RESTORE ACB ADDRESS; !; CHECK FOR ACB MARKED FOR DELETE-;Q1 BITB #AF.MDE,A.PRM+5(R0) ;ACB MARKED FOR DELETE?S BEQ 10$ ;IF EQ NOS JMP DEACB ;DEALLOCATE ACB NOWR10$:;F; QUEUE AST TO UCB AGAIN;M% MOV R0,R1 ;GET ADDRESS OF LINK WORD$ MOV A.PRM+2(R0),R0 ;GET UCB ADDRESS# ADD #U.RAST,R0 ;POINT TO LIST HEADU& CALL $QINSF ;QUEUE AST CONTROL BLOCK RETURNM.PAGE9 .SBTTL PPDET - POST-QUEUE PROCESSING FOR DETACH REQUESTSR;;;+; **-XXDET - DETACH REQUESTS;EF; THIS ROUTINE IS DISPATCHED TO FROM XXINI AFTER AN IO.DET REQUEST HASE; BEEN DEQUEUED OR SPECIFY AST REQUEST HAS BEEN MADE FOR THE NETWORK.$; DEALLOCATE AST CONTROL BLOCK.L;T ; INPUTS: ; R5 => UCBU; R1 => CURRENT I/O PACKET;R; OUTPUTS: NONE.;I*; REGISTERS MODIFIED: R0, R1, R2, R3, R4;-;DXXDET::R;P; LOOK FOR ACB IN UCB QUEUEQ;F/ MOV R5,R4 ;GET POINTER TO ACB QUEUE LIST HEAD. ADD #U.RAST,R4 ;Q& MOV R4,R0 ;SAVE ADDRESS OF LIST HEAD'2$: MOV R0,R2 ;SAVE ADDRESS OF CURRENT  MOV (R2),R0 ;GET NEXT ACB * BEQ 3$ ;IF EQ NOT IN LIST - LOOK OFF TCB D( CMP A.PRM+14(R0),I.TCB(R1) ;RIGHT TASK? BNE 2$ ;IF NE NO/ CMPB A.PRM+16(R0),I.LN2(R1) ;RIGHT LUN NUMBER?: BNE 2$ ;IF NE NO; -; DEQUEUE AST CONTROL BLOCK AND DEALLOCATE IT;R MOV (R0),(R2) ;CLOSE UP LIST  BNE 25$ ;IF NE NO NEW LAST MOV R2,2(R4) ;NEW LASTU25$:' BR DEACB ;DEALLOCATE AST CONROL BLOCKI3$:A;%; SEARCH LIST OFF TCB FOR CORRECT ACBD;S" MOV I.TCB(R1),R2 ;GET TCB ADDRESS ADD #T.ASTL,R2 ;POINT TO LIST5$: MOV (R2),R2 ;GET NEXT ACB BEQ 6$ ;IF EQ NONE CMP A.PRM+2(R2),R5 ;RIGHT UCB?. BNE 5$ ;IF NE NO) CMPB A.PRM+16(R0),I.LN2(R1) ; RIGHT LUN?L BNE 5$ ; NO, KEEP LOOKING.> BISB #AF.MDE,A.PRM+5(R2) ;SET BIT TO DEALLOCATE AFTER DEQUEUE6$: RETURN ;AND FINISH10$:;S; DEALLOCATE AST CONTROL BLOCK;M1DEACB: MOVB A.PRM+4(R0),R1 ;GET LENGTH OF THE ACBE- CMP -(R0),-(R0) ;BACK UP TO START OF THE ACB # CALL $DEACB ;DEALLOCATE THE BLOCKR% RETURN ;COMPLETE SUCCESSFUL DETACHP .ENDIST5$: MOV (R2),R2 ;GET NEXT ACB BEQ 6$ ;IF EQ NONE CMP A.PRM+2(R2),R5 ;RIGHT UCB;?; MMPRE.MAC - PREFIX FILE FOR BUILDING MM LOADABLE CRASH DRIVERB;5; Created 28-JAN-88.;*C$$CDA=0 ; LOADABLE CRASH DRIVER SUPPORT3L$$CDA=0 ; LOADABLE CRASH DRIVERS TO BE ASSEMBLEDSMM$$CD=0 ; CRASH DRIVER IS MM;M1DEACB: MOVB A.PRM+4(R0),R1 ;GET LENGTH OF THE ACBE- CMP -(R0),-(R0) ;BACK UP TO START OF THE ACB # CALL $DEACB ;DEALLOCATE THE BLOCKR% RETURN ;COMPLETE SUCCESSFUL DETACHP .ENDIST5$: MOV (R2),R2 ;GET NEXT ACB BEQ 6$ ;IF EQ NONE CMP A.PRM+2(R2),R5 ;RIGHT UCB .TITLE DREXPA .IDENT /05.04/O;U1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.J; All rights reserved;;A;L<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;R; T. J. MILLER 8-JUL-76 ; ); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ; ; M. S. FOXD; J. M. LAWLER; B. S. MCCARTHY;R+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:; ; J. R. KAUFFMAN; J. M. LAWLER; L. B. MCCULLEY;A+; MODIFIED FOR RSX-11M00Xeeibjbkb a a a-PLUS VERSION 4.0 BY:D; ; B. S. MCCARTHY;i+; MODIFIED FOR RSX-11M-PLUS VERSION 4.1 BY: ; ; B. S. MCCARTHY 4-NOV-87 05.04S;W7; BM404 -- ADD SUPPORT FOR D SPACE OVERMAP CHECK FIELDP; ; MACRO LIBRARY CALLS ; # .MCALL HWDDF$,HDRDF$,PCBDF$,TCBDF$L" HWDDF$ ;DEFINE HARDWARE OFFSETS% HDRDF$ ;DEFINE TASK HEADER OFFSETSO1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSD, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS A M;+; **-$DREXP-EXTEND PARTITION;AD; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EXTEND THE PARTITION OF THE3; ISSUING TASK BY A POSITIVE OR NEGATIVE INCREMENT.;. ; DPB FORMAT:N;8"; WD. 00 -- DIC(89.),DPB SIZE(3.).; WD. 01 -- EXTEND INCREMENT.L; WD. 02 -- RESERVED. ;L ; INPUTS:.;L@; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.0; R3=ADDRESS OF THE EXTEND INCREMENT IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.F,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)I;R-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.(; DIRECTIVE STATUS OF '+1' IS RETURNED.;E; C=1 IF DIRECTIVE IS REJECTED. 9; DIRECTIVE STATUS OF 'D.RS8' IF TASK NOT IN SYSTEM CON-E1; TROLLED PARTITION, TASK IS NOT CHECKPOINTABLE 1; AND SPECIFIED POSITIVE INCREMENT, OR TASK HASR2; PREALLOCATED CHECKPOINT SPACE AND IS EXTENDING ; GREATER THAN INSTALLED SIZE.9; DIRECTIVE STATUS OF 'D.RS88' IF SPECIFIED INCREMENT ISR ; INVALID.;- .IF DF E$$XPR A N .IF DF D$$PAR$DRXP1:: .IFF ; DF D$$PARY$DREXP:: .ENDC ; DF D$$PAR .IF DF U$$DAS!S$$LIB 4 MOV H.SMAP(R4),-(SP) ;KEEP A COPY OF SUPER AND USER ;MAPPING MASKS  .ENDC ; DF U$$DAS!S$$LIBT=; FIRST DETERMINE THAT THE TASK HAS NO I/O IN PROGRESS TO ITSE1; TASK REGION, AND DISALLOW DIRECTIVE IF IT DOES.C4 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 PROGRESS?; NEXT CHECK FOR OTHER TASKS HAVING AN ATTACHMENT DESCRIPTOR TO.@; THE ISSUING TASKS TASK REGION. IF THEY DO, WE CAN'T UPDATE THE&; WINDOW SO WE DISALLOW THE DIRECTIVE.'5$: MOV T.PCB(R5),R0 ;POINT TO TASK PCBI0 TST @P.ATT(R0) ;ARE THERE OTHER TASKS ATTACHED? BEQ 7$ ;IF EQ NO( DRSTS D.RS17 ;OTHER TASKS ARE ATTACHEDA; CALCULATE POTENTIAL NEW SIZE OF TASK REGION BASED ON P.SWSZ ANDTA; THE INCREMENT IN THE DPB, DEFAULTING TO T.MXSZ IF THE INCREMENT5; WAS NOT SPECIFIED.97$: MOV T.MXSZ(R5),R1 ;ASSUME RETURNING TO INSTALLED SIZE * MOV (R3),R3 ;PICK UP SPECIFIED INCREMENT* BEQ 10$ ;IF EQ DEFAULT TO INSTALLED SIZE& ADD P.SWSZ(R0),R3 ;CALCULATE NEW SIZE MOV R3,R1 ;COPY NEW SIZE=; VERIFY THAT THE NEW SIZE IS LEGAL BY CHECKING FOR EXCEEDINGT>; $MXEXT AND IF TASK HAS ALLOCATED CHECKPOINT SPACE IS THE NEW; SIZE TOO BIG.T-10$: CMP R1,P.SWSZ(R0) ;TASK INCREASING SIZE?S BLO 30$ ;IF LOS NO1 CMP R1,$MXEXT ;INCREASING PAST CURRENT MAXIMUM? 5 BHI 45$ ;IF HI YES 4 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?  BEQ 30$ ;IF EQ NO ; CMP R1,T.MXSZ(R5) ;EXTENDING TO LARGER THAN INSTALLED SIZEX BLOS 30$ ;IF LOS NOI DRSTS D.RS18 ;YES, ILLEGAL<; CALCULATE NEW SIZE FROM VIRTUAL ZERO AND VALIDATE THAT THE!; HEADER STILL FITS IN THE REGIONI 30$: ;P .IF DF P$$LAS( MOV R1,-(SP) ;SAVE NEW TASK REGION SIZE0 SUB T.OFF(R5),R1 ;NORMALIZE TO TASK REGION ZERO .ENDC ; DF P$$LAS. 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 .ENDC8 CMP (SP),H.HDLN(R4) ;NEW TASK SIZE SMALLER THAN HEADER? BLO 45$ ;IF LO YESB; CHECK THROUGH THE WINDOWS FOR ONE WHICH OVERLAPS THE NEW SIZE OF&; THE TASK WINDOW 0 (OR 1 IF I/D TASK)735$: MOV H.WND(R4),R4 ;POINT TO NUMBER OF WINDOW BLOCKSK00XfeXe__DATADATADATADATA .IF DF U$$DAS- TST $DICSV+4 ;WAS AN OVERLAP MASK SPECIFIED?F BEQ 359$ ;IF EQ NO * BIT #T3.ROV,T.ST3(R5) ;RESIDENT OVERLAID?2 BNE 359$ ;IF NE YES, DON'T NEED TO CHECK OVERLAP0 MOVB W.BFPD+2(R4),R3 ;GET PDR ADDRESS (I SPACE)& SUB #UISDR0,R3 ;ADJUST TO OFFSET ZERO< BIT #T4.DSP,T.ST4(R5) ;TASK BUILD WITH SEPARATE I/D SPACE ?2 BEQ 355$ ;IF EQ NO, RETURN WITH ALL OVERMAP MASK- MOVB W.BFPD+W.BLGH+2(R4),R3 ;GET PDR ADDRESS & SUB #UDSDR0,R3 ;ADJUST TO OFFSET ZERO$355$: ASR R3 ;CONVERT TO BYTE INDEX$ MOVB R1,R2 ;GET NEW SIZE OF WINDOW, ADD #177,R2 ;ROUND UP TO NEXT APR BOUNDARY' ASH #-7,R2 ;CONVERT TO NUMBER OF APRSL& ADD R3,R2 ;FORM ENDING PDR NUMBER +1. MOVB $BCMSK-1(R2),R2 ;GET MASK UP TO LAST APR/ BICB $BCMSK-1(R3),R2 ;GET MASK UP TO FIRST APRF BIT R2,$DICSV+4 ;ANY OVERLAP?$ BNE 90$ ;IF NE YES, ILLEGAL EXTEND359$:3 .ENDC ;DF U$$DASN. MOV (R4)+,R2 ;PICK UP NUMBER OF WINDOW BLOCKS. TST (R4)+ ;POINT TO TASK LOW VIRTUAL ADDRESS .IF DF U$$DAS6 BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D ? BEQ 36$ ;IF EQ NO71 ADD #W.BLGH,R4 ;YES, POINT TO WINDOW 1 - D SPACE; DEC R2 ;ADJUST WINDOW COUNTD 36$: ;R .ENDC ; DF U$$DAS .IF DF P$$LAS5 BIT #T3.ROV,T.ST3(R5) ;TASK HAVE RESIDENT OVERLAYS ?M- BNE 42$ ;IF NE YES, KEEP WINDOW ZERO INTACTR .ENDC ; DF P$$LAS/ MOV (R4),R3 ;PICK UP TASK LOW VIRTUAL ADDRESS ASL R3 ;CONVERT TO 32W BLOCKSF ROL R3 ; ROLB R3 ;+ SWAB R3 ;A4 ADD R1,R3 ;CALC HIGH VIRTUAL ADDRESS IN 32W BLOCKS CMP R3,#2000 ;LEGAL SIZE? BHIS 45$ ;IF HIS NO3537$: ADD (R4),(SP) ;CALCULATE NEW TOP VIRTUAL ADDRESS '40$: DEC R2 ;MORE WINDOW BLOCKS TO GO?D BLE 50$ ;IF LE NOC5 ADD #W.BLGH,R4 ;POINT TO LOW VIRTUAL ADDRESS OF NEXTR+ TST W.BSIZ-W.BLVR(R4) ;ESTABLISHED WINDOW?  BEQ 40$ ;IF EQ NOO E .IF DF U$$DAS< BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D SPACE ? BEQ 41$ ;IF EQ NO 5 BITB #20,W.BFPD-W.BLVR(R4) ;IS THIS D SPACE WINDOW ? BEQ 40$ ;IF EQ NO, DON'T CHECK41$: ;REFERENCE LABEL .ENDC ; DF U$$DAS I .IF DF P$$LAS A 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?A BPL 40$ ;IF PL YES .ENDC ; DF S$$LIB# BR 44$ ;CHECK FOR ADDRESS OVERLAPN842$: 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 BLOCKSI BIC #176000,R3 ;K: ADD W.BOFF-W.BLVR(R4),R3 ;CALCULATE LAST 32W BLOCK MAPPED3 CMP 2(SP),R3 ;REDUCING SIZE CONFLICT WITH WINDOW ?D BLO 90$ ;IF LO YES744$: BIT #T3.ROV,T.ST3(R5) ;IS TASK RESIDENT OVERLAID ?F2 BNE 40$ ;IF NE YES, UNCHANGED VIRTUAL ADDRESSING S .ENDC ; ( CMP (SP),(R4) ;VIRTUAL ADDRESS OVERLAP? BLOS 40$ ;IF LOS NO 45$: BR 90$ ;ILLEGAL SIZE 50$: TST (SP)+ ;CLEAN STACK 6; CHECK TO SEE IF TASK REGION CAN BE EXTENDED IN PLACE .IF DF P$$LAS+ MOV (SP)+,R1 ;RESTORE NEW TASK REGION SIZEF .ENDC ; DF P$$LAS/ MOV P.MAIN(R0),R2 ;POINT TO MAIN PARTITION PCB 0 CMP R1,P.SIZE(R2) ;MAIN PARTITION LARGE ENOUGH? BHI 90$ ;IF HI NOS4 MOV R1,P.SWSZ(R0) ;SET SWAP SIZE FOR TASK PARTITION, CLR R4 ;INITIALIZE END OF HOLE CALCULATION6 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 PARTITIONS) ADD P.SIZE(R3),R4 ;CALCULATE END OF HOLEA60$: ADD P.REL(R3),R4 ;1 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 YESD; TASK REGION COULD NOT BE EXTENDED IN PLACE - ATTEMPT TO CHECKPOINT.; SO THAT WE CAN BRING TASK IN AT ITS NEW SIZE! CALL $SETRT ;FORCE RESCHEDULINGO$ 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 AGAIN6 BIT #PS.CKP,P.STAT(R0) ;WAS THE CHECKPOINT INITIATED? BEQ 65$ ;IF EQ NOW00X feibjbkb a a a1 TALLY$ B.CKEX,XA$$CP ;COUNT AN EXTEND CHECKPOINT .IF DF U$$DAS!S$$LIBE* TST (SP)+ ;CLEAN MAPPING WORDS OFF STACK .ENDC ; DF U$$DAS!S$$LIBA RETURN ;); DIRECTIVE RETURN FOR INVALID INCREMENT P/90$: DRSTS D.RS84 ;INVALID INCREMENT SPECIFIEDB" ;(PLACED HERE TO KEEP BRANCHES ;ALIVE)C>; ATTEMPTING TO CHECKPOINT TASK REGION FAILED. RESET SWAP SIZE; AND RETURN DIRECTIVE STATUSA/65$: MOV P.SIZE(R0),P.SWSZ(R0) ;RESET SWAP SIZEK4 DRSTS D.RS1 ;POOL OR CHECKPOINT FILE ALLOC FAILURE?; IF THE TASK REGION IS DECREASING IN SIZE, CALL $NXTSK ON EXITA; FROM THIS DIRECTIVE TO INSURE REALLOCATION OF NEWLY FREED SPACE$-70$: CMP R1,P.SIZE(R0) ;DECREASING TASK SIZE?V BHIS 71$ ;IF HIS NO0 .IF DF U$$DAS!S$$LIB # MOV (SP),-(SP) ;COPY MAPPING MASKS . MOV #$NXTSK,2(SP) ;INSURE THAT PARTITION WILL ;BE REALLOCATEDE .IFF ; DF U$$DAS!S$$LIB8 MOV #$NXTSK,-(SP) ;INSURE PARTITION WILL BE REALLOCATED .ENDC ; DF U$$DAS!S$$LIBS?; IF THE TASK HAS I/O IN PROGRESS TO OTHER THAN THE TASK REGIONN;; SET THE MAPPING CHANGE BIT. THIS COMPENSATES FOR POSSIBLEE!; UNMAPPING OF I/O STATUS BLOCKS.L8 TSTB T.IOC(R5) ;DOES TASK HAVE I/O? (MUST BE IN COMMON) BEQ 71$ ;IF EQ NOH5 BIS #T3.MPC,T.ST3(R5) ;SET MAPPING BIT DUE TO SHRINKP71$:;+; ** W A R N I N G **S;;; SPM HOOKPOINT NUMBER 10.; ); DO NOT CHANGE THE INSTRUCTION FOLLOWINGB; LABEL WITHOUT CHECKING SPM;-+$SPH10==. ;SPM CHANGES THE INSTRUCTION ATS ;THE LOCATION OF THIS LABEL ( MOV R1,P.SIZE(R0) ;EXTEND TASK IN PLACEA; IF THE TASK WAS BUILT WITH RESIDENT OVERLAYS, WE DO NOT ATTEMPTA3; TO CHANGE THE MAPPING OF ANY OF THE TASKS WINDOWS  .IF DF P$$LAS4 BIT #T3.ROV,T.ST3(R5) ;TASK HAVE RESIDENT OVERLAYS?+ BNE 80$ ;IF NE YES, DO NOT CHANGE MAPPING .ENDC;; SET UP TO UNMAP CURRENT TASK WINDOW (0, OR 1 IF I/D TASK)A" MOV $SAHPT,R1 ;GET HEADER ADDRESS3 MOV H.WND(R1),R1 ;POINT TO NUMBER OF WINDOW BLOCKSS .IF DF U$$DAS1 BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH I/D SPACEE BEQ 73$ ;IF EQ NOP/ ADD #W.BLGH,R1 ;YES, POINT TO WINDOW 1 INSTEADV .ENDC ; DF U$$DAS473$: MOVB W.BFPD+2(R1),R3 ;PICK UP FIRST PDR ADDRESS7; LOOP TO UNMAP CURRENT CONTEXT OF TASK WINDOW (0 OR 1)E74$: CLR (R3)+ ;UNMAP NEXT PDRY  .IF DF U$$DAS& CMP #UDSDR0+2,R3 ;DATA SPACE WINDOW ? BLOS 7405$ ;IF LOS YES6 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 P .IF DF S$$LIB I8 BITB $BTMSK-2-UINDR0-2(R3),(SP) ;SUPER D SPACE MAPPED ? BNE 741$ ;IF NE NO0 CLR SDSDR0-UINDR0-2(R3) ;UNMAP SUPER DATA SPACE 2 .ENDC C .IF DF U$$DAS# BR 741$ ;SKIP D SPACE WINDOW CODE A7405$: BICB $BTMSK-UDSDR0-2(R3),1(SP) ;INDICATE USER D NOT MAPPED8 BITB $BTMSK-2-UDSDR0-2(R3),(SP) ;SUPER D SPACE MAPPED ? BNE 741$ ;IF NE NO0 CLR SDSDR0-UDSDR0-2(R3) ;UNMAP SUPER DATA SPACE .ENDC ; DF U$$DAS 3741$: 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 CONTEXT<; IF THIS IS A USER I/D SYSTEM, WE MUST RE-ESTABLISH POINTER6; TO WINDOW 0 SINCE $MAPTK WILL RE-ADJUST THE POINTER. .IF DF U$$DAS- MOV $SAHPT,R1 ;GET ADDRESS OF CURRENT HEADERI3 MOV H.WND(R1),R1 ;POINT TO NUMBER OF WINDOW BLOCKS3 .ENDC ; DF U$$DAS& CALL $MAPTK ;MAP TASK ADDRESS WINDOW- MOV P.REL(R0),R3 ;CALCULATE FIRST APR OFFSETC .IF DF P$$LAS ADD W.BOFF-W.BLPD(R1),R3 ;R .ENDC% MOV (R1),R2 ;PICK UP LAST PDR IMAGE ' MOVB -(R1),R4 ;PICK UP NUMBER OF PDR'S ) MOVB -(R1),R1 ;PICK UP FIRST PDR ADDRESSM1; LOOP TO SET UP APRS FOR NEW TASK WINDOW CONTEXTM,75$: MOV R3,UINAR0-UINDR0(R1) ;LOAD NEXT PAR# MOVB R2,(R1)+ ;SET ACCESS NEXT PDRC# MOVB #177,(R1)+ ;SET SIZE NEXT PDRI .IF DF U$$DAS& CMP #UDSDR0+2,R1 ;DATA SPACE WINDOW ? BLOS 755$ ;IF LOS YESS6 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 PAR0 MOV -2(R1),UDSDR0-UINDR0-2(R1) ;LOAD 00XfYfe__DATADATADATADATAUSER D PDR .ENDC ; DF U$$DAS D .IF DF S$$LIB 12 BITB $BTMSK-2-UINDR0-2(R1),(SP) ;SUPER D MAPPED ? BNE 76$ ;IF NE NO - MOV R3,SDSAR0-UINDR0-2(R1) ;LOAD SUPER D PAR 1 MOV -2(R1),SDSDR0-UINDR0-2(R1) ;LOAD SUPER D PDRV 1 .IF DF U$$DAS" BR 76$ ;SKIP D SPACE WINDOW CODE=755$: BISB $BTMSK-UDSDR0-2(R1),1(SP) ;INDICATE D SPACE MAPPEDT8 BITB $BTMSK-2-UDSDR0-2(R1),(SP) ;SUPER D SPACE MAPPED ? BNE 76$ ;IF NE NOR- MOV R3,SDSAR0-UDSDR0-2(R1) ;LOAD SUPER D PAR(1 MOV -2(R1),SDSDR0-UDSDR0-2(R1) ;LOAD SUPER D PDR; .ENDC ; DF U$$DAS L .IFTF ; DF S$$LIB#76$: ADD #200,R3 ;ADVANCE APR BASEB DEC R4 ;MORE TO GO?V 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 YES. BITB $BTMSK-UINDR0(R1),1(SP) ;USER D MAPPED ? BNE 80$ ;IF NE NOD. MOV R2,UDSDR0-UINDR0(R1) ;SET LAST USER D PDR .ENDC ; DF U$$DAS .IFT ; DF S$$LIBN 0 BITB $BTMSK-2-UINDR0(R1),(SP) ;SUPER D MAPPED ? BNE 80$ ;IF NE NOR/ MOV R2,SDSDR0-UINDR0(R1) ;SET LAST SUPER D PDR L .ENDC ; .IF DF U$$DAS% BR 80$ ;SKIP DATA SPACE WINDOW CODE ;78$: BITB $BTMSK-2-UDSDR0(R1),(SP) ;SUPER DATA SPACE MAPPED  BNE 80$ ;IF NE NO$/ MOV R2,SDSDR0-UDSDR0(R1) ;SET LAST SUPER D PDR7 .ENDC ; DF U$$DAS M'; CLEANUP STACK AND EXIT FROM DIRECTIVE8 I80$: ;REFERENCE LABEL .IF DF U$$DAS$ MOV $SAHPT,R1 ;POINT TO TASK HEADER4 MOV (SP)+,H.SMAP(R1) ;RESTORE D SPACE MAP IN HEADER .IFF ; DF U$$DASE .IF DF S$$LIB& TST (SP)+ ;CLEAN MAP BYTES OFF STACK .ENDC ; DF S$$LIB .ENDC ; DF U$$DAS RETURN ;D .ENDC .END78$: BITB $BTMSK-2-UDSDR0(R1),(SP) ;SUPER DATA SPACE MAPPED  BNE 80$ ;IF NE NO$/ MOV R2,SDSDR0-UDSDR0(R1) ;SET LAST SUPER D PDR7 .ENDC ; DF U$$DAS M'; CLEANUP STACK AND EXIT FROM DIRECTIVE8 I80$: ;REFERENCE LABEL .IF DF U$$DAS$ MOV $SAHPT,R1 ;POINT TO TASK HEADER4 MOV (SP)+,H.SMAP(R1) ;RESTORE D SPACE MAP IN HEADER .IFF ; DF U$$DASE .IF DF S$$LIB .TITLE DLDRVC .IDENT /07.03/ A;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.R; All rights reserved;N;8<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;7; PREVIOUSLY MODIFIED BY:; ; P. J. BEZEREDI; R. T. PERRON ; P. J. CARR; D. R. DONCHINL ; J. GALLANT; G. MARIGOWDA;A+; MODIFIED FOR RSX-11M-PLUS VERSION 4.1 BY:A;1#; PAUL K. M. WEISS 16-DEC-1987 7.02.; @; PKW146 - SET KS.DIP SO $IODON WON'T DEALLOCATE UMRS ON ATTACH;A ; MARC J. NOEL 22-APR-1988 7.03;n@; MJN015 - CLEAR KS.DIP BEFORE SETTING UP THE CONTROLLER INDEX;S; RL11/RL01 DISK DRIVERE;D;Y.MCALL HWDDF$,PKTDF$,QIOSY$ $ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS QIOSY$J;E; EQUATED SYMBOLSR;,RETRY= ^D<8> ;CONTROLLER ERROR RETRY COUNT3RLCNT= ^D<7> ;NUMBER OF REGISTERS TO LOG ON ERRORO*RLBPT= ^D<512*20> ;BYTES PER RL01 SURFACE)RLSPU= ^D<15> ;TIME FOR RL01 TO SPIN UPD;W; RL11 DEVICE REGISTER OFFSETS;"RLCS= 0 ;CONTROL STATUS REGISTERRLBA= 2 ;BUS ADDRESS REGISTERE RLDA= 4 ;DISK ADDRESS REGISTER!RLMP= 6 ;MULTI-PURPOSE REGISTERY+RLBAE= 10 ;BUS ADDRESS EXTENSION REGISTERF; ; RLCS BIT ASSIGNMENTS; ERR= 100000 ;COMPOSITE ERRORDE= 040000 ;DRIVE ERRORL"NXM= 020000 ;NON-EXISTANT MEMORYDLT= 010000 ;DATA LATEHNF= 010000 ;HEADER NOT FOUNDGDCK= 004000 ;DATA CHECK ERRORY HCRC= 004000 ;HEADER CRC ERROR#OPI= 002000 ;OPERATION INCOMPLETE &A17= 000040 ;EXTENDED ADDRESS BIT 17&A16= 000020 ;EXTENDED ADDRESS BIT 16DS0= 000400 ;DRIVE SELECT 0 DS1= 001000 ;DRIVE SELECT 1 DRDY= 1 ;DRIVE READYWCHK= 2 ;WRITE CHECK FUNCTIONTWRITE= 2 ;WRITE OFFSET$GSTS= 4 ;GET DRIVE STATUS FUNCTIONSEEK= 6 ;SEEK FUNCTION RDH= 10 ;READ HEADERS FUNCTIONREAD= 14 ;READ DATA FUNCTIONIE= 100 ;INTERRUPT ENABLE CRDY= 200 ;CONTROLLER READY ;D; RLDA STATUS CODESC;0MRK= 1 ;MARKER BITSTS= 2 ;GET STATUS BITSN= 00Yfeibjbkb a a a4 ;SIGN BIT FOR SEEKRST= 10 ;DRIVE RESET BIT(HS= 20 ;HEAD SELECT BIT FOR DIFFERENCE,REV= 200!MRK ;REVERSE SEEK DIFFERENCE WORD;E!; RLMP GET STATUS BIT ASSIGNMENTS;KWDE= 100000 ;WRITE DATA ERRORT!CHE= 040000 ;CURRENT HEAD ERRORT WLS= 020000 ;WRITE LOCK STATUS"SKTO= 010000 ;SEEK TIMEOUT ERRORSPD= 004000 ;SPEED ERRORWGE= 002000 ;WRITE GATE ERRORRVC= 001000 ;VOLUME CHECK!DSE= 000400 ;DRIVE SELECT ERROR DT= 000200 ;DRIVE TYPE!HSS= 000100 ;HEAD SELECT STATUSNCO= 000040 ;COVER OPENHH= 000020 ;HEADS HOMEBH= 000010 ;BRUSHES HOME.SLM= 000005 ;DRIVE IN SEEK-LINEAR MODE STATE;E; DRIVE STATUS FLAGS;S%RVSK= 200 ;REVERSE SEEK IN PROGRESS 0SDWN= 100 ;DRIVE ERROR SETTLE DOWN IN PROGRESS;T ; LOCAL DATA;W; CONTROLLER IMPURE DATA TABLES;,; THESE ARE INDEXED BY THE CONTROLLER NUMBER;G7RTTBL: .BLKW R$$L11 ;RETRY COUNT FOR CURRENT OPERATIONK:PRMSV: .BLKW R$$L11*6 ;PARAMETER SAVE AREA FOR WRITE CHECK VC$DL = 00; $; EXECUTIVE ENTRY POINT VECTOR TABLE;E0EXEVEC: .WORD 0 ; FLAG FOR VECTOR NOT YET FILLEDALOCB: .WORD $ALOCB BLKC2: .WORD $BLKC2 BMSET: .WORD $BMSETVCVLBN: .WORD $CVLBNVDEACB: .WORD $DEACBEDTOER: .WORD $DTOER DVERR: .WORD $DVERRTERRSQ: .WORD $ERRSQFORK: .WORD $FORKFMASK: .WORD $FMASKRGTPKT: .WORD $GTPKTSIODON: .WORD $IODONCMPUBM: .WORD $MPUBMRLCN: .WORD $RLCN RQCND: .WORD $RQCNDRSTMAP: .WORD $STMAP:SGFIN: .WORD $SGFINMVOLVD: .WORD $VOLVDI;CKISR6: .WORD KISAR6;XSCTM: .WORD S.CTM SITM: .WORD S.ITMSKRB: .WORD S.KRBLSOWN: .WORD S.OWNESPKT: .WORD S.PKT.SSTS: .WORD S.STS:SST2: .WORD S.ST2E;.EXEVCL=<<<.-EXEVEC>/2>-1>$;B S.VCTM = -1O S.VITM = -1T S.VKRB = -1T S.COWN = -1. S.VPKT = -1 S.VSTS = -1$ S.VST2 = -1 ;R; SCB REFERENCE PATCH TABLE;T :SCBPAT: .WORD CTM1,SCTMO .WORD CTM2,SCTM .WORD CTM3,SCTM .WORD CTM4,SCTM .WORD ITM1,SITM .WORD ITM2,SITM .WORD ITM3,SITM .WORD RKRB1,SKRB. .WORD KRB1,SKRB .WORD KRB2,SKRB .WORD KRB3,SKRB .WORD KRB4,SKRB .WORD KRB5,SKRB .WORD KRB6,SKRB .WORD KRB7,SKRB .WORD KRB10,SKRBS .WORD KRB11,SKRBS .WORD KRB12,SKRB. .WORD KRB13,SKRBC .WORD KRB14,SKRBM .WORD PKT1,SPKT .WORD PKT2,SPKT .WORD PKT3,SPKT .WORD PKT4,SPKT .WORD PKT5,SPKT .WORD PKT6,SPKT .WORD PKT7,SPKT .WORD STS1,SSTS .WORD STS2,SSTS .WORD STS3,SSTS .WORD STS4,SSTS .WORD RST21,SST2O" .WORD 0 ;END OF THE TABLE;I;,;DRIVER DISPATCH TABLE;.5 DDT$ DL,R$$L11,NEW=Y,OPT=Y ;GENERATE DISPATCH TABLEO;+.; **-DLINI-RL11/RL01 DISK CONTROLLER INITIATOR;KB; 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 TOPE; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED CONTROLLERPG; IS NOT BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST.SB; 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.;+ ; 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;-7DLINI: GTPKT$ DL,R$$L11 ;GET NEXT I/O PACKET TO PROCESSQ;T1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:T;D$; R1= ADRS OF THE I/O REQUEST PACKET1; R2= PHYSICAL UNIT NUMBER OF THE REQUESTED DRIVEO; R3= CONTROLLER INDEX,; R4= ADRS OF THE STATUS CONTROL BLOCK (SCB)2; R5= ADRS OF THE UCB OF THE DRIVE TO BE INITIATED;F6; RL11/RL01 DISK CONTROLLER I/O REQUEST PACKET FORMAT:;E!; WD. 00 -- I/O QUEUE THREAD WORDH/; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBERS1; WD. 02 -- ADRS OF THE TCB OF THE REQUESTOR TASKR<; 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 -- RELOCATION00Y!ffe__DATADATADATADATA 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:+; I.PRM+6 (WD. 15) - EXTENDED ADDRESS BITS8; I.PRM+10 (WD. 16) - CYLINDER # OR DESIRED DISK ADDRESSA; I.PRM+12 (WD. 17) - SECTOR/SURFACE # OR BYTES REMAINING TO XFERB;R+ CALL @RQCND ;REQUEST ACCESS TO CONTROLLERO* MOV S.VPKT(R4),R1 ;GET I/O PACKET ADDRESSPKT1=.-2# MOV S.VKRB(R4),R3 ;GET KRB ADDRESSOKRB1=.-2D BIS #KS.DIP,K.STS(R3) ;MARK CONTROLLER AS DATA TRANSFER IN PROGRESS- MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEXL- MOV #RETRY,RTTBL(R3);SET INITIAL RETRY COUNT + CALL DLVV ;PROCESS VOLUME VALID FUNCTIONSX, BIT #FE.EXT,@FMASK ;IS THIS A 22-BIT SYSTEM BEQ 15$ ;IF EQ NOI. BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? BEQ 10$ ;IF EQ NO / MOVB U.BUF+1(R5),R0 ;GET EXTENDED ADDRESS BITSC( 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$ ;110$: CALL @STMAP ;SETUP UNIBUS MAPPING REGISTERSL# CALL @MPUBM ;MAP UNIBUS TO MEMORY .15$: MOV S.VPKT(R4),R1 ;GET I/O PACKET ADDRESSPKT2=.-2. MOVB U.UNIT(R5),U.BUF+1(R5) ;SET UNIT NUMBER, MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION6 BIS #READ!IE,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTION+ CMPB #IO.RLB/^D<256>,I.FCN+1(R1) ;REALLY?C$ BHIS 20$ ;IF HIS FUNCTION IS LEGAL" CALLR DLFIN ;FUNCTION IS ILLEGAL'20$: BEQ 25$ ;IF EQ FUNCTION IS A READ 9 SUB #WRITE,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTIONC525$: MOV I.PRM+12(R1),R0 ;RETRIEVE SECTOR AND SURFACEU. MOV I.PRM+10(R1),R2 ;RETRIEVE CYLINDER NUMBER ASH #7,R2 ;PUT IT IN POSITION., BIS R0,R2 ;MERGE IN THE SECTOR AND SURFACE/ MOV R2,I.PRM+10(R1) ;SAVE DESIRED DISK ADDRESSN& BIC #^C<77>,R0 ;ISOLATE SECTOR NUMBER9 MOV U.CNT(R5),I.PRM+12(R1) ;ASSUME ONLY ONE XFER NEEDEDY( MOV #^D<40>,R2 ;SET SECTORS PER SURFACE. SUB R0,R2 ;CALCULATE SECTORS LEFT ON SURFACE$ SWAB R2 ;GET BYTES LEFT ON SURFACE5 CMP U.CNT(R5),R2 ;ARE ADDITIONAL TRANSFERS REQUIRED?: BLOS 30$ ;IF LOS NOE4 MOV R2,U.CNT(R5) ;SET BYTE COUNT FOR FIRST TRANSFER'30$: MOV S.VKRB(R4),R3 ;GET KRB ADDRESS KRB2=.-2- MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEXE3 MUL #6,R3 ;FORM AN INDEX INTO PARAMETER SAVE AREAB# ADD #PRMSV,R3 ;POINT TO THIS ENTRY- MOV U.BUF(R5),(R3)+ ;SAVE INITIAL PARAMETERSF MOV U.BUF+2(R5),(R3)+ ;... MOV U.CNT(R5),(R3)+ ;...B MOV I.PRM+10(R1),(R3)+ ;...  MOV I.PRM+12(R1),(R3)+ ;...S MOV I.PRM+6(R1),(R3)+ ;...;+*; THIS SECTION WILL INITIATE THE OPERATION;-0DLINIO: MOV @S.VKRB(R4),R2 ;RETREIVE CSR ADDRESSKRB3=.-2- MOV S.VPKT(R4),R3 ;GET ADDRESS OF I/O PACKETPKT3=.-2$ CLRB U.CW2+1(R5) ;CLEAR DRIVE FLAGS5 BITB #US.VV,U.STS(R5) ;IS SOFTWARE VOLUME VALID SET?E BEQ 5$ ;IF EQ NO CALL DLGST ;GET DRIVE STATUS BR 6$ ;SKIP RESETI+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 NOW4 BITB #US.VV,U.STS(R5);IS SOFTWARE VOLUME VALID SET? BEQ 10$ ;IF EQ NOA" BIT #VC,R1 ;IS VOLUME CHECK SET?, BNE 20$ ;IF NE ERROR OR POWERFAIL RECOVERY4 CALL DLRST ;CLEAR ANY OTHER DRIVE ERROR CONDITIONS% MOV RLMP(R2),R1 ;GET THE STATUS INFO5+ BIC #WLS!DT!HSS,R1 ;REMOVE IRRELEVANT BITS$ BIT #DRDY,(R2) ;IS THE DRIVE READY? BEQ 20$ ;IF EQ NOS410$: CMP #HH!BH!SLM,R1 ;HEADS, BRUSHES AND STATE OK? BEQ 35$ ;IF EQ YES720$: BITB #US.SPU,U.STS(R5) ;IS THE DRIVE SPINNING UP?/ BNE DLPWF1 ;IF NE YES, WAIT FOR IT TO SPIN UPO( CALL DL00Y)feibjbkb a a aDVER ;LOG DRIVE NOT READY ERROR.25$: MOV #IE.DNR&377,R0 ;SET RETURN ERROR CODE CALLR DLFIN ;EXIT FATALI$30$: CALL DLRST ;RESET DRIVE ERRORS435$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UP4 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 FUNCTION  CALL DLXCT ;EXECUTE THE SEEK. BMI DLEROR ;IF MI ERROR DURING SEEK FUNCTION240$: MOVB S.VITM(R4),S.VCTM(R4) ;SET TIMEOUT COUNTITM1=.-4CTM1=.-2. BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? BEQ 45$ ;IF EQ NON7 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 COUNT0 ROR R1 ;MAKE IT A WORD COUNT NEG R1 ;ALSO NEGATIVEE 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.;-DLCAN: RETURN ;;;NOP FOR RL11N;+:; 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.;-3DLPWF: BCS DLCAN ;IGNORE CONTROLLER POWERFAIL CALLC) TSTB S.VSTS(R4) ;IS DRIVE CURRENTLY BUSYESTS1=.-2 BEQ DLPWF2 ;IF EQ NO7 MOVB #4,S.VSTS(R4) ;ALLOW FOR A FULL MINUTE TO SPIN UPVSTS2=.-26DLPWF1: MOVB #RLSPU,S.VCTM(R4);EXTEND TIMEOUT FOR UNITCTM2=.-25DLPWF2: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UPA RETURN ;L;+%; **-$DLINT-RL11/RL01 DISK CONTROLLERH&; INTERRUPT AND ERROR SERVICE ROUTINES;-8 INTSE$ DL,PR5,R$$L11 ;;;SAVE REGISTERS AND SET PRIORITY( CALL @FORK ;;;CREATE A SYSTEM PROCESS' MOV U.SCB(R5),R4 ;RETRIEVE SCB ADDRESS3 BITB #RVSK,U.CW2+1(R5) ;REVERSE SEEK IN PROGRESS? BEQ 5$ ;! JMP DLIO1 ;IF NE YESL5 5$: MOV @S.VKRB(R4),R2 ;RETRIEVE CSR ADDRESSCKRB4=.-20 MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL OPERATION/ MOV S.VPKT(R4),R3 ;RETRIEVE I/O PACKET ADDRESSLPKT4=.-2# MOV (R2),R1 ;GET CONTENTS OF RLCS% BMI DLEROR ;IF MI AN ERROR OCCURRED8 SUB U.CNT(R5),I.PRM+12(R3) ;GET BYTES LEFT TO TRANSFER BEQ DLPASS ;IF EQ NONE LEFTY9 MOV I.PRM+12(R3),U.CNT(R5) ;ASSUME LAST TRANSFER COMINGT5 CMP I.PRM+12(R3),#RLBPT ;IS THIS THE LAST TRANSFER?  BLOS 10$ ;IF LOS YES3 MOV #RLBPT,U.CNT(R5);TRANSFER A WHOLE TRACKS WORTH(/10$: BIC #CRDY,R1 ;CLEAR CRDY TO START FUNCTIONS9 MOV R1,U.BUF(R5) ;SAVE CURRENT FUNCTION AND ADDRESS BITS34 MOV RLBA(R2),U.BUF+2(R5) ;SAVE CURRENT BUS ADDRESS. BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? BEQ 20$ ;IF EQ NOB7 MOV RLBAE(R2),I.PRM+6(R3) ;SAVE EXTENDED ADDRESS BITSQ220$: MOV I.PRM+10(R3),R0 ;GET INITIAL DISK ADDRESS MOV R0,R1 ;COPY DISK ADDRESS- BIS #77,R0 ;UPDATE CYLINDER AND SURFACE ... & INC R0 ;... LEAVING SECTOR BITS ZERO+ MOV R0,I.PRM+10(R3) ;SAVE NEW DISK ADDRESST0 CALL DLDIF0 ;CALCULATE MID-TRANSFER DIFFERENCE! CALLR DLGO ;GO DO THE OPERATION )DLEROR: BIT #DRDY,R1 ;IS THE DRIVE READY?U BEQ 25$ ;IF NE YES& MOV RLMP(R2),R1 ;GET THE STATUS INFO, BIC #WLS!DT!HSS,R1 ;REMOVE IRRELEVANT BITS0 CMP #HH!BH!SLM,R1 ;HEADS, BRUSHES AND STATE OK? BEQ DLERR ;YES, THEN DO RETRYE925$: MOVB S.VITM(R4),S.VCTM(R4);WAIT FOR DRIVE TO QUIESCESITM2=.-4CTM3=.-26 MOVB #SDWN,U.CW2+1(R5) ;FLAG SETTLE DOWN IN PROGRESS RETURN ;R.DLERR: MOV (R2),R1 ;RETRIEVE CONTENTS OF RLCS. BITB #IQ.UMD,I.FCN(R3) ;DIAGNOSTIC FUNCTION?* BNE DLPASS ;IF NE YES, GO PASS REGISTERS! MOV R1,-(SP) ;SAVE RLCS CONTENTS2 CALL DLDVER ;LOG DEVICE ERROR ( MOV (SP),R1 ;RETRIEVE CONTENTS OF RLCS+ MOV #IE.BBE&377,R0 ;ASSUME BAD BLOCK ERROR; COM (SP) ;TOGGLE THE BITS& BIT #HCRC!OPI,(SP)+ ;BAD BLOCK ERROR? BEQ DLFIN ;IF EQ YES/ MOV #IE.VER&300Y1ffe__DATADATADATADATA77,R0 ;ASSUME UNRECOVERABLE ERROR# BIT #NXM,R1 ;NON-EXISTANT MEMORY?  BNE DLFIN ;IF NE YES BIT #DE,R1 ;DRIVE PROBLEMS?R BEQ 50$ ;IF EQ NOL/ CALL DLGST ;EXECUTE GET DRIVE STATUS FUNCTION?% BIT #WGE,RLMP(R2) ;WRITE GATE ERROR?S BEQ DLFIN ;IF EQ NOV. BIT #WLS,RLMP(R2) ;IS THE DRIVE WRITE LOCKED? BEQ DLRTY ;IF EQ NOI. MOV #IE.WLK&377,R0 ;SET WRITE LOCK ERROR CODE BR DLFIN ;-50$: BIT #10,U.BUF(R5) ;WRITE CHECK FUNCTION?O BNE DLRTY ;IF NE NOO$ BIT #OPI,R1 ;OPERATION INCOMPLETE? BNE DLRTY ;IF NE YES! BIT #DCK,R1 ;WRITE CHECK ERROR?E BEQ DLRTY ;IF EQ NOD4 MOV #IE.WCK&377,R0 ;YES, SET WRITE CHECK ERROR CODE5DLRTY: MOV S.VPKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESSSPKT5=.-2' BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES? BNE DLFIN ;IF NE YES( MOV S.VKRB(R4),R3 ;RETRIEVE KRB ADDRESSKRB5=.-2( MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX' DECB RTTBL(R3) ;ANY MORE RETRIES LEFT?0 BLE DLFIN ;IF LE NOR%DLIO: CALL DLRST ;RESET DRIVE ERRORSE*DLIO1: JMP DLINIO ;RETRY ENTIRE OPERATION5DLPASS: BITB #IQ.UMD,I.FCN(R3) ;DIAGNOSTIC FUNCTION?E BEQ 10$ ;IF EQ NON3 MOV I.PRM+14(R3),@KISR6;SET BUFFER RELOCATION BIASO1 MOV I.PRM+16(R3),R3 ;GET REGISTER BUFFER ADDRESSD) CALL REGPAS ;MOVE REGISTERS INTO BUFFERH BR DLFIN ;EXIT910$: BITB #IO.WLC&377,I.FCN(R3) ;WRITE WITH WRITE CHECK?E BNE 20$ ;IF NE YES. BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED? BEQ DLFIN ;IF EQ NOT020$: MOV U.BUF(R5),R1 ;GET CURRENT FUNCTION CODE- BIT #WCHK,R1 ;WRITE OR WRITE CHECK FUNCTION?I BEQ DLFIN ;IF EQ NO ' BIT #10,R1 ;WAS FUNCTION WRITE CHECK?I BEQ DLFIN ;IF EQ YES# MOV S.VKRB(R4),R1 ;GET KRB ADDRESSEKRB6=.-2- MOVB K.CON(R1),R1 ;RETRIEVE CONTROLLER INDEXF' MOV #RETRY,RTTBL(R1);RESET RETRY COUNTR3 MUL #6,R1 ;FORM AN INDEX INTO PARAMETER SAVE AREA7 ADD #PRMSV,R1 ;...I1 MOV (R1)+,U.BUF(R5) ;RESTORE STARTING PARAMETERSC MOV (R1)+,U.BUF+2(R5) ;... MOV (R1)+,U.CNT(R5) ;...T MOV (R1)+,I.PRM+10(R3) ;...R MOV (R1)+,I.PRM+12(R3) ;...R MOV (R1)+,I.PRM+6(R3) ;...3 BIC #10,U.BUF(R5) ;CONVERT TO WRITE CHECK FUNCTIONI BR DLIO ;START THE WRITE CHECK3DLFIN: MOV S.VPKT(R4),R2 ;GET ADDRESS OF I/O PACKETPKT6=.-2, MOV I.PRM+4(R2),R1 ;GET TOTAL TRANSFER SIZE0 SUB I.PRM+12(R2),R1 ;CALCULATE BYTES TRANSFERED# MOV S.VKRB(R4),R3 ;GET KRB ADDRESSKRB7=.-2* BIC #KS.DIP,K.STS(R3) ;DATA TRANSFER OVER- MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEX.) MOVB RTTBL(R3),R2 ;GET FINAL RETRY COUNTP3 BIS #RETRY*^D<256>,R2 ;MERGE STARTING RETRY COUNTV$ CALL @RLCN ;RELEASE THE CONTROLLER# CALL @IODON ;FINISH I/O OPERATIONO! JMP DLINI ;PROCESS NEXT REQUESTK;+$; **-DLOUT-RL11/RL01 DISK CONTROLLER; DEVICE TIMEOUT ROUTINE;I9; DEVICE TIMEOUT RESULTS IN THE OPERATION BEING REPEATED.1=; TIMEOUTS ARE USUALLY CAUSED BY A POWER FAILURE BUT MAY ALSOS*; BE THE RESULT OF A HARDWARE MALFUNCTION.;-7DLOUT: MOV S.VPKT(R4),R3 ;;;RETRIEVE I/O PACKET ADDRESSMPKT7=.-21 BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP?, BEQ 20$ ;;;IF EQ NOR0 DECB S.VSTS(R4) ;;;HAVE WE WAITED A MINUTE YET?STS3=.-2 BNE 10$ ;;;IF NE NOO) INCB S.VSTS(R4) ;;;LEAVE CONTROLLER BUSYSTS4=.-2 BR 30$ ;;;LOG DEVICE TIMEOUT!10$: MTPS #0 ;;;ALLOW INTERRUPTST! BR DLIO ;RETRY ENTIRE OPERATIONN720$: BITB #SDWN,U.CW2+1(R5) ;;;IS DRIVE SETTLING DOWN?I BEQ 30$ ;;;IF EQ NOE! MTPS #0 ;;;YES, ALLOW INTERUPTSO JMP DLERR ;PROCESS THE ERROR!30$: MTPS #0 ;;;ALLOW INTERRUPTS. BITB #IQ.UMD,I.FCN(R3) ;DIAGNOSTIC FUNCTION?* BNE DLPASS ;IF NE YES, GO PASS REGISTERS! CALL DLDTER ;LOG DEVICE TIMEOUTT) MOV #IE.DNR&377,R0 ;SET DEVICE NOT READYI JMP DLRTY ;RETRY OPERATION;+0; **-DLXCT,DLGST,DLRST-RL11/RL01 DISK CONTROLLER; FUNCTION EXECUTION ROUTINEST;B5; THIS ROUTINE WILL EXECUTE A GET DRIVE STATUS OR ANY+9; NON-INTERRUPTABLE FUNCTION AND WAIT FOR ITS COMPLETION.;P ; INPUTS:S; R1 = FUNCTION CODE; R2 = CSR ADDRESS; R5 = UCB ADDRESS; ; OUTPUTS: ; R1 = CONTENTS OF RLCS (TESTED); FUNCTION EXECUTED?;-<DLRST: MOV #RST!STS!MRK,RLDA(R2) ;SET MESSAGE CODES IN RLDA& CALL DLDST ;DO00Y9feibjbkb a a a THE DRIVE RESET FIRST8DLGST: MOV #STS!MRK,RLDA(R2) ;SET MESSAGE CODES IN RLDA,DLDST: MOV #GSTS,R1 ;SET GET STATUS FUNCTION'DLXCT: MOV R1,-(SP) ;SAVE FUNCTION CODES/ MOVB U.UNIT(R5),1(SP);MERGE CURRENT DRIVE BITS MOV (SP)+,(R2) ;LOAD RLCS410$: BIT #ERR!CRDY,(R2) ;FUNCTION COMPLETE OR ERROR? BEQ 10$ ;IF EQ NO=, MOV (R2),R1 ;SAVE RLCS AND TEST FOR ERRORS RETURN ;N;+%; **-DLDIFF-RL11/RL01 DISK CONTROLLER(; CYLINDER ADDRESS DIFFERENCE CALCULATOR;M<; 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 BEC=; ISSUED. THE SEEK IS FOLLOWED BY A READ HEADERS TO CAUSE ANM ; INTERRUPT.;A ; INPUTS::; R0 = DESIRED DISK ADDRESS ;P ; OUTPUTS:; R1 = DIFFERENCE WORD$; RLDA = LOADED WITH DIFFERENCE WORD; IF EQ NO SEEK IS NECESSARY;-7DLDIFF: MOV #RETRY*2,-(SP) ;SET READ HEADER RETRY COUNTE110$: MOV #RDH,R1 ;CODE FOR READ HEADERS FUNCTIONT" CALL DLXCT ;EXECUTE THE FUNCTION% BPL 20$ ;IF PL FUNCTION EXECUTED OKA DEC (SP) ;ANY RETRIES LEFT?R BGT 10$ ;IF GT YES8 CMP (SP)+,(SP)+ ;REMOVE RETRY COUNT AND CALLERS ADDRESS CALL DLDVER ;LOG HEADER ERRORU CALL DLRST ;RESET DRIVE 5 MOV #REV,RLDA(R2) ;LOAD REVERSE SEEK DIFFERENCE WORD) MOV #SEEK,R1 ;GET CODE FOR SEEK FUNCTIONH. MOV #IE.VER&377,R0 ;ASSUME THE SEEK WILL FAIL CALL DLXCT ;EXECUTE THE SEEK BMI DLFIN ;IF MI WE FAILED/ BIC #^C,R1 ;GET ONLY UNIT SELECT BITSO+ BIS #IE!RDH,R1 ;LOAD CODES FOR READ HEADER2; MOVB #RVSK,U.CW2+1(R5) ;INDICATE REVERSE SEEK IN PROGRESST7 MOVB S.VITM(R4),S.VCTM(R4) ;SET DEVICE TIMEOUT COUNTERCITM3=.-4CTM4=.-2# MOV R1,(R2) ;LOAD FUNCTION AND GOU! RETURN ;WAIT FOR THE INTERRUPT##20$: TST (SP)+ ;REMOVE RETRY COUNTR& MOV RLMP(R2),R1 ;RETREIVE HEADER WORD)DLDIF0: BIC #77,R0 ;MASK OUT SECTOR BITS  BIC #77,R1 ;...% CMP R0,R1 ;DO WE NEED TO DO A SEEK?F BEQ 40$ ;IF EQ NO( MOV R0,-(SP) ;SAVE DESIRED DISK ADDRESS' BIC #^C<100>,(SP) ;ISOLATE SURFACE BITE( ASR (SP) ;PUT INTO THE PROPER POSITION ASR (SP) ;... ! BIC #100,R0 ;REMOVE SURFACE BITT BIC #100,R1 ;...) SUB R0,R1 ;SUBTRACT DESIRED FROM ACTUAL,%; BEQ 30$ ;IF EQ ONLY CHANGE SURFACE $ BCC 30$ ;IF CC ACTUAL .GE. DESIRED4 NEG R1 ;ACTUAL < DESIRED, MAKE POSITIVE DIFFERENCE1 BIS #SN,R1 ;SET SIGN FOR MOVE TO CENTER OF DISKT30$: INC R1 ;SET MARKER BIT# BIS (SP)+,R1 ;MERGE IN SURFACE BITQ& MOV R1,RLDA(R2) ;LOAD DIFFERENCE WORD40$: RETURN ;S;+%; **-DLDXXX-RL11/RL01 DISK CONTROLLERR; ERROR LOGGING ROUTINES;OB; 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.;F?; 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; R3 = CONTROLLER INDEXB;- .ENABL LSBR6DLDVER: MOV DVERR,-(SP) ;ADDRESS OF EXEC ERROR ROUTINE BR 10$ ;8DLDTER: MOV DTOER,-(SP) ;ADDRESS OF EXEC TIMEOUT ROUTINE610$: MOV #RLCNT*2,R1 ; GET NUMBER OF BYTES TO ALLOCATE$ CALL @ALOCB ;ALLOCATE A CORE BLOCK$ BCC 20$ ;IF CC BLOCK WAS ALLOCATED/ INC @ERRSQ ;INDICATE A MISSED ERROR CONDITIONP: CMP (SP)+,DTOER ;ALLOCATION FAILURE, TIMEOUT IN PROGRESS? BNE 30$ ;IF NE NO ) MOV @S.VKRB(R4),R2 ;RETRIEVE CSR ADDRESS KRB10=.-2 ' BIC #IE,(R2) ;;;CLEAR INTERRUPT ENABLEN MTPS #0 ;;;ALLOW INTERRUPTSR/ BR 30$ ;DON'T LOG ERROR IF ALLOCATION FAILURE*20$: MOV R0,R3 ;SET POINTER TO CORE BLOCK$ MOV @S.VKRB(R4),R2 ;GET CSR ADDRESS KRB11=.-2G- CALL REGPAS ;MOVE REGISTERS INTO00YAffe__DATADATADATADATA CORE BLOCKA$ MOV R0,R2 ;COPY CORE BLOCK ADDRESS. CALL @(SP)+ ;CALL EXEC ERROR LOGGING ROUTINE) MOV R2,R0 ;GET BACK CORE BLOCK ADDDRESSL3 MOV #RLCNT*2,R1 ;GET NUMBER OF BYTES TO DEALLOCATE ( CALL @DEACB ;DEALLOCATE THE CORE BLOCK'30$: MOV S.VKRB(R4),R3 ;GET KRB ADDRESSE KRB12=.-2T# MOV (R3),R2 ;RETRIEVE CSR ADDRESST- MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEXL RETURN: .DSABL LSBS;+@; MOVE THE CONTROLLER/DRIVE REGISTERS INTO THE SPECIFIED BUFFER.; ; INPUTS:S; R2 = CSR ADDRESS; R3 = BUFFER ADDRESS,;-!REGPAS: MOV (R2),(R3)+ ;MOVE RLCS+ MOV RLBA(R2),(R3)+ ;MOVE RLBA MOV RLDA(R2),(R3)+ ;MOVE RLDA MOV RLMP(R2),(R3)+ ;MOVE RLMP CLR (R3)+ ;ASSUME NO RLBAE. BIT #DV.EXT,U.CW1(R5) ;DOES THE RLBAE EXIST? BEQ 10$ ;IF EQ NO, MOV RLBAE(R2),-2(R3);MOVE RLBAE$10$: CLR (R3)+ ;EXTRA WORD IS BLANK/ CALL DLGST ;EXECUTE GET DRIVE STATUS FUNCTIONR% MOV RLMP(R2),(R3) ;SAVE DRIVE STATUSC RETURN ;V;+(; **-DLVV-PROCESS VOLUME VALID FUNCTIONS;S;; THIS ROUTINE WILL VALIDATE VOLUME VALID AND HANDLE DEVICE -; SPECIFIC VOLUME VALID AND SIZING FUNCTIONS. ;V ; INPUTS:V; R1 = I/O PACKET ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS; ; OUTPUTS:6; IF THIS IS A TRANSFER FUNCTION ONLY R0 IS DESTROYED.7; IF THIS IS A VOLUME VALID FUNCTION, THE PROPER ACTION:6; IS TAKEN AND CONTROL IS TRANSFERED DIRECTLY TO THE; PROPER PLACE IN THE DRIVER.R;-)DLVV: CALL @VOLVD ;VALIDATE VOLUME VALID BCS 20$ ;IF CS WE FAILED& TST R0 ;IS THIS A TRANSFER FUNCTION? BMI 40$ ;IF MI YES$ MOV @S.VKRB(R4),R2 ;GET CSR ADDRESS KRB13=.-2 $ MOV R1,R3 ;COPY I/O PACKET ADDRESS( CALL DLRST ;RESET DRIVE AND GET STATUS TST I.PRM+2(R3) ;SIZE THE DISK? BPL 10$ ;IF PL NOT TST (SP)+ ;REMOVE RETURN. MOV #IE.SZE&377,R0 ;ASSUME NON-EXISTANT DRIVE# MOV (R2),R1 ;GET CONTENTS OF RLCSD. BIC #^C,R1 ;GET RID OF UNWANTED BITS' CMP #ERR!OPI,R1 ;DOES THE DRIVE EXIST?L BEQ 30$ ;IF EQ NOL( MOV #IS.SUC&377,R0 ;YES, ASSUME SUCCESS' CALLR DLPASS ;PASS REGISTERS AND EXITI010$: BIT #VV$SET,I.PRM+2(R3) ;SET VOLUME VALID? BEQ 25$ ;IF EQ NOV, MOV RLMP(R2),R1 ;GET THE STATUS INFORMATION$ BIT #DRDY,(R2) ;IS THE DRIVE READY? BEQ 15$ ;IF EQ NOS+ BIC #WLS!DT!HSS,R1 ;REMOVE IRRELEVANT BITS 0 CMP #HH!BH!SLM,R1 ;HEADS, BRUSHES AND STATE OK? BEQ 25$ ;IF EQ YES,15$: MOV #IE.DNR&377,R0 ;SET DRIVE NOT READY720$: BICB #US.VV,U.STS(R5) ;CLEAR SOFTWARE VOLUME VALIDE25$: TST (SP)+ ;REMOVE RETURN30$: CALLR DLFIN ;FINISH UP40$: RETURN ;D;+'; **-DLCHK-VALIDATE AND CONVERT THE LBNS;I9; 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 IN ; $DRQRQ AFTER CALLING $IOALT.;B ; INPUTS:E; R1 = I/O PACKET ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;R ; OUTPUTS:7; IF THE CHECKS SUCCEED, THEN THE LBN IN THE I/O PACKETL4; IS REPLACED BY THE DISK ADDRESS. R1 IS PRESERVED.;F8; IF THE CHECKS FAIL, THE $IOALT IS ENTERED WITH A FINAL7; STATUS OF IE.BLK AND A RETURN TO THE CORRECT PLACE IN ; $DRQRQ IS EXECUTED.S;R; R0, R2, AND R3 ARE DESTROYED.U;P<; NOTE: ALL FUNCTIONS PUT INTO THE DRIVER QUEUE ARRIVE HERE.=; THESE FUNCTIONS INCLUDE, IO.ATT, IO.DET, AND ACP FUNCTIONS.U;-9DLCHK: CMPB #IO.ATT/256.,I.FCN+1(R1) ;IS THIS AN ATTACH?D$ BEQ 30$ ;IF EQ YES, LEAVE IT ALONE2 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 CODET$ BIC #7,(SP) ;REMOVE QUALIFIER BITS0 CMP #IO.STC,(SP)+ ;IS IT A SET CHARACTERISTICS?$ BEQ 30$ ;IF EQ YES, LEAVE IT ALONE4 MOV I.PRM+12(R1),R0 ;RETRIEVE STARTING BLOCK NUMBER+ MOV R1,R3 ;ASSUME PHYSICAL BLOCK FUNCTIONI6 BITB #IO.WPB&377,I.FCN(R1) ;PHYSICAL BLOCK FUNCTION? BNE 20$ ;IF NE YES) CALL @BLKC2 ;CHECK LOGICAL BLOCK NUMBERQ0 CMPB #IO.WLB/256.,I.FCN+1(R3) ;WRITE FUNCTION? BNE 10$ ;IF NE NOH8 BITB #IO.WLT&377,I.FCN(R3) ;WRITE LAST TRACK FUNCTION? BNE 10$ ;IF NE YES/ MOV R0,I.PRM+6(R3) ;SAVE STARTING BLO00YIfZPfibjbkb a a aCK NUMBERS, ADD #20.,(R1) ;ADD 1 TRACKS WORTH OF BLOCKS$ MOV R3,R1 ;COPY I/O PACKET ADDRESS) CALL @BLKC2 ;CHECK LOGICAL BLOCK NUMBERN; MOV I.PRM+6(R3),R0 ;RESTORE ORIGINAL STARTING BLOCK NUMBER'10$: ASL R0 ;CONVERT BLOCKS TO SECTORSO20$: CLR R2 ;NO HIGH BITS* CALL @CVLBN ;CONVERT LBN TO DISK ADDRESS! ASH #6,R1 ;POSITION SURFACE BITR& BIS R1,R0 ;MERGE SURFACE WITH SECTOR5 MOV R0,I.PRM+12(R3) ;SAVE SECTOR AND SURFACE ADDRESST4 MOV R2,I.PRM+10(R3) ;SAVE STARTING CYLINDER ADDRESS$ MOV R3,R1 ;COPY I/O PACKET ADDRESS30$: RETURN ;R;+,; **-DLKRB-CONTROLLER ONLINE/OFFLINE ROUTINE;L;; THIS ROUTINE WILL HANDLE RECONFIGURATION CALLS FOR ONLINERB; CONTROLLER AND OFFLINE CONTROLLER FOR THE RL11, RLV11 AND RLV12.; C; FOR ONLINE, IT WILL DETERMINE IF THE RLBAE REGISTER EXISTS AND IFI@; SO, IT WILL INSURE THAT THE ADDRESS BITS ARE REPLICATED IN THE; CSR.;T&; FOR OFFLINE, KS.EXT WILL BE CLEARED.; ; INPUTS: ; R2 = KRB ADDRESS; R3 = CTB ADDRESS; C=1 IF OFFLINE REQUEST; C=0 IF ONLINE REQUESTT;D ; OUTPUTS:8; FOR ONLINE, KS.EXT WILL BE SET IF THE CONTROLLER HAS A; VALID RLBAE.!; FOR OFFLINE, KS.EXT IS CLEARED.N;-.DLKRB: BIC #KS.EXT,K.STS(R2) ;ASSUME NO RLBAE BCS 20$ ;IF CS OFFLINE REQUEST TST EXEVEC ;IF DONE ALREADYM BNE 2$ ;SKIP THISS MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3 MOV KINAR6,-(SP) ;SAVE KINAR6. MOV @#112,R0 ;GET ADDRESS OF TABLE OF ENTRIES: MOV (R0),R0 ;GET ADDRESS OF APR BIAS (1ST WORD IN TABLE)1 MOV (R0),KINAR6 ;MAP COMMON THROUGH I-SPACE APR6U MOV #EXEVEC,R3 ;POINT TO VECTOR) MOV #EXEVCL,R2 ;SPECIFY LENGTH OF VECTORA$ CALL @#140004 ;TRANSLATE THE VECTOR MOV (SP)+,KINAR6 ;RESTOR KINAR6 MOV (SP)+,R3 ;RESTORE R3O MOV (SP)+,R2 ;RESTORE R2F( MOV #SCBPAT,R0 ;GET PATCH TABLE ADDRESS#1$: MOV (R0)+,R1 ;MOVE TABLE ENTRY P BEQ 2$ ;IF EQ END OF THE TABLE' MOV @(R0)+,(R1) ;IF NEQ START TO PATCH1 BR 1$ ;COMPLETE IT 02$: BIT #FE.EXT,@FMASK ;IS THIS A 22-BIT SYSTEM? BEQ 20$ ;IF EQ NOL- CALL @SGFIN ;TURN NXM'S INTO SET CARRY BITSE# MOV (R2),R4 ;RETREIVE CSR ADDRESST- BIS #A16!A17,(R4) ;SET EXTENDED ADDRESS BITS CLR RLBAE(R4) ;CLEAR RLBAE BITS% BCS 10$ ;IF CS RLBAE DOES NOT EXISTM/ BIT #A16!A17,(R4) ;DID THE ADDRESS BITS CLEAR?R BNE 10$ ;IF NE NOG/ BIS #KS.EXT,K.STS(R2) ;YES, SET RLBAE PRESENTB0 ADD K.OFF(R2),R2 ;CALCULATE OFFSET TO UCB TABLE4 MOV #RLBAE,KE.RHB(R2) ;SET BAE OFFSET IN DATA BASE*10$: BIC #A16!A17,(R4) ;RESET ADDRESS BITS20$: RETURN ;Q;+&; **-DLUCB-UNIT ONLINE/OFFLINE ROUTINE;S;; THIS ROUTINE WILL HANDLE RECONFIGURATION CALLS FOR ONLINE11; UNIT AND OFFLINE UNIT FOR RL01 AND RL02 DRIVES.R;;=; FOR ONLINE, IF KS.EXT IS SET THEN DV.EXT IS ALSO SET. THIS#;; IS DONE TO ELIMINATE UNNECESSARY CODE TO RETREIVE THE KRBN ; ADDRESS.;T!; FOR OFFLINE, DV.EXT IS CLEARED.B;A ; INPUTS:); R3 = CONTROLLER INDEXU; R4 = SCB ADDRESS; R5 = UCB ADDRESS; C=1 IF ONLINE REQUEST0; C=0 IF OFFLINE REQUEST;D ; OUTPUTS:3; FOR ONLINE, DV.EXT IS SET IN THE UCB IF KS.EXT ISE; SET IN THE KRB.S!; FOR OFFLINE, DV.EXT IS CLEARED.N;-.DLUCB: BIC #DV.EXT,U.CW1(R5) ;ASSUME NO RLBAE BCS 10$ ;IF CS OFFLINE REQUEST# MOV S.VKRB(R4),R2 ;GET KRB ADDRESSO KRB14=.-2#. BIT #KS.EXT,K.STS(R2) ;DOES THE RLBAE EXIST? BEQ 10$ ;IF EQ NOR, BIS #DV.EXT,U.CW1(R5) ;YES, SET BIT IN UCB10$: RETURN ;  .ENDRLER INDEXU; R4 = SCB ADDRESS; R5 = UCB ADDRESS; C=1 IF ONLINE REQUEST0; C=0 IF OFFLINE REQUEST;D ; OUTPUTS:3; FOR ONLINE, DV.EXT IS SET IN THE UCB IF KS.EXT ISE; SET IN THE KRB .TITLE EXDBTN .IDENT /08.02/R;N1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.B; All rights reservedF;E;Q<; 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 7-DEC-74 ; ); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ;E; B. S. MCCARTHY;S$; MODIFIED FOR RSX-11M-PLUS V2.1 BY:;U; B. S. MCCARTHY;E+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:T; ; J. C. FRANZINI; B. S. MCCARTHY;T+; MO00ZQffe__DATADATADATADATADIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:;o; B. S. MCCARTHY ; K. L. NOEL; +; MODIFIED FOR RSX-11M-PLUS VERSION 4.1 BY: ;S; K. L. NOEL 11-JAN-88 V08.02L;N+; KLN076 -- FIX DOUBLE "P" PROBLEM FOR CPRD;E;TF; THIS IS A VERSION OF ODT THAT MAY BE USED TO DEBUG RSX-11M EXECUTIVEG; MODULES. IT IS AN OUTGROWTH OF THE STANDARD RSX-11 ODT WHICH WAS PRO-F$; DUCED BY M. SMITH , H. LEV ET. AL.;A; MACRO LIBRARY CALLSR;X .MCALL HWDDF$ .MCALL CPRDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS& CPRDF$ ;DEFINE CPR SPECIFIC SYMBOLS;; EQUATED SYMBOLSY; %BPT=3 ;BREAKPOINT INSTRUCTION CODEU'BKP=16 ;NUMBER OF BREAKPOINTS -1 X 2A*LPB=177516 ;LINE PRINTER BUFFER REGISTER*LPS=177514 ;LINE PRINTER STATUS REGISTER0RLR=16 ;NUMBER OF RELOCATION REGISTERS -1 X 2/TBT=20 ;T-BIT MASK FOR PROCESSOR STATUS WORDR4TKB=177562 ;CONSOLE TERMINAL INPUT BUFFER REGISTER4TKS=177560 ;CONSOLE TERMINAL INPUT STATUS REGISTER5TPB=177566 ;CONSOLE TERMINAL OUTPUT BUFFER REGISTERG5TPS=177564 ;CONSOLE TERMINAL OUTPUT STATUS REGISTER TPR0=0TPR1=2TPR2=4TPR3=6;A; LOCAL MACROS;C; DECODE NEXT COMMAND ;B .MACRO DECODE IOT .ENDM;E; ERRORB;E .MACRO ERROR7 EMT 0 .ENDM;S; TEST MODE FOR EXEC OR USER;  .MACRO TESTM ADDR JSR R5,TESTM0 .WORD ADDRS .ENDM;O; TYPE OUT CHARACTER(S)2;;>; TYPE OUT IS EFFECTED WITH A TRAP INSTRUCTION WITH THE BOTTOM; BYTE ENCODED AS FOLLOWS:;P!; 300 = OUTPUT BOTH BYTES IN R0. ; 200 = OUTPUT LOW BYTE IN R0.O$; 340 = OUTPUT A SEQUENCE. ; 240 = OUTPUT A SEQUENCE.;A8; ALL OTHER COMBINATIONS ARE TREATED AS THE ACTUAL BYTE ; TO OUTPUT. .MACRO TYPE ARG .IF IDN ,O TRAP 200 .IFF .IF IDN , TRAP 300 .IFF. .IF IDN ,R TRAP 340. .IFFD .IF IDN ,Y TRAP 240A .IFF2 TRAP ARG&177T .ENDC .ENDC .ENDC .ENDC .ENDM H .PAGE( .SBTTL MULTIPROCESSOR LOADABLE XDT NODE;UI; THIS IS A COPY OF THE PROTOTYPE NODE IN XDTINI. IT MUST BE KEPT IN SYNCC; WITH THAT COPY. ;0 .IF DF L$$XDT&M$$PRO.)$XDTND:: ; PROTOTYPE CODE START ADDRESSS.PROTO-.AISA5: .WORD 0 ; ADDRESS OF APR5 (PSEUDO D).$.XDTA5: .BLKW 1 ; XDT APR5 CONTENTS1.KISA5: .BLKW 1 ; SAVED APR5 CONTENTS DURING XDTI9.KINA5: .BLKW 1 ; SAVED I-SPACE APR5 CONTENTS DURING XDT:.VECTR: .WORD V$$CTR+4 ; HIGHEST VECTOR ADDRESS (DEFAULTED ; TO ASSEMBLY VALUE)0.RTN: MOV .KINA5,@#KINAR5 ; RESTORE I SPACE APR58 MOV .KISA5,@.AISA5 ; RESTORE D SPACE APR5 IF NECESSARY3.RTNI: RTI ; EXIT TO EXEC (MAY BE CHANGED TO RTI)X1.CRSH: MOV .KINA5,@#KINAR5 ; RESTORE I SPACE APR5S8 MOV .KISA5,@.AISA5 ; RESTORE D SPACE APR5 IF NECESSARY JMP @#0 ; JUMP TO CRASHR).CRADD = .-2 ; ADDRESS OF CRASH ADDRESSO'.ODDA: CMP SP,.VECTR ; STACK OVERFLOW ?D BLO .SOVFL ; IF LO YES/ JSR R5,.COMMN ; ODD ADDRESS OR OTHER TRAP FOUR  .WORD 0$.SGMT: JSR R5,.COMMN ; SEGMENT FAULT .WORD 2..BPTI: JSR R5,.COMMN ; BREAKPOINTS,T-BIT TRAPS .WORD 4,.IOTX: JSR R5,.COMMN ; IOT INSTRUCTION TRAPS .WORD 67.ILLI: JSR R5,.COMMN ; ILLEGAL INSTRUCTION TRAPS (->10), .WORD 10R .NEMT: JSR R5,.COMMN ; EMT TRAPS .WORD 12R- JMP @#0 ; ALWAYS ALLOW EXEC TO HANDLE TRAPSU).TRADD = .-2 ; ADDRESS OF CRASH ADDRESSR .WORD 06.FPPE: JSR R5,.COMMN ; 11/40 FLOATING POINT EXCEPTIONS .WORD 16O,.COMMN: MOV (R5),R5 ; GET SST VECTOR OFFSET( MOV @#KINAR5,.KINA5 ; SAVE I SPACE APR54 MOV @.AISA5,.KISA5 ; SAVE D SPACE APR5 IF NECESSARY. 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 !0/.SOVFL: MOV @#KINAR5,.KINA5 ; SAVE I SPACE APR5.4 MOV @.AISA5,.KISA5 ; SAVE D SPACE APR5 IF NECESSARY. MOV .XDTA5,@#KINAR5 ; MAP INTO XDT IN I SPACE: MOV .XDTA5,@.AISA5 ; MAP INTO XDT IN D SPACE IF NECESSARY2 JMP @#SOVFL ; JUMP TO STACK OVERFLOW ENTRY POINT*.PLENG = . - .PROTO ; LENGTH OF DSR BLOCK .ENDC ; DF L$$XDT&M$$PROD .PAGE00ZYfPfibjbkb a a a .IF DF X$$DBT .SBTTL LOCAL DATA; ; LOCAL DATA;A; CONTEXT VARIABLES F; THE ORDER OF THESE ITEMS IS INTENTIONAL, SEE REGISTER MAPPING SCHEME;D1INTBEG =. ;STARTING ADDRESS OF INTERNAL REGISTERS.UR0: 0 ;USER R0 $0 0 ; R1 $1 0 ; R2 $2 0 ; R3 $3 0 ; R4 $4 0 ; R5 $5USP: 0 ;USER SP $6UPC: $INITL ;USER PC $7 UST: PR7 ;USER PS $SARG: 0 ;ARGUMENT REGISTER $A;LOW: 0 ;LOW LIMIT $LHI: 0 ;HIGH LIMIT $H#CNST: $XDT ;CONSTANT REGISTER $CO QUAN: 0 ;QUANTITY REGISTER $QFORM: 0 ;FORMAT REGISTER $F;E; INTERNAL TABLESO;,/INTINX =. ;STARTING ADDRESS OF INTERNAL TABLEST;D:; BREAKPOINT CONTROL LISTS, AND EXTRA SLOT FOR SINGLE STEP; +ADR1: ;ADDRESS OF THE BREAKPOINT ($0B-$7B) 3 .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/UIN: ;USER INSTRUCTION SAVE LOCATION ($0I-$7I) * .WORD BPT,BPT,BPT,BPT,BPT,BPT,BPT,BPT,BPT; ; RELOCATION REGISTERS;$#RELT: ;RELOCATION TABLES ($0R-$7R)O .WORD -1,-1,-1,-1,-1,-1,-1,-12INTEND=.-2 ;END OF INTERNAL REGISTERS AND TABLES;O ; EXEC SST TRAP VECTOR ADDRESSES;TD; THIS TABLE IS READ/WRITE AND THERE IS ONE SUCH TABLE PER PROCESSOR;T3SSTVEC: + ODDA ;0-ODD ADDRESS, OR HALT, VECTOR @4T + SGMT ;1-SEGMENT FAULT + BPTI ;2-T-BIT OR BPT  + IOTX ;3-IOT, + ILLI ;4-RESERVED OR ILLEGAL INSTRUCTION + NEMT ;5-EMT4 + $TRTRP ;6-TRAP (EXECUTIVE ALWAYS HANDLES TRAPS);NE; WORDS AND ORDERED BYTES, ITEMS MUST BE KEPT FROM COMMAND TO COMMAND,;-1CAD: .WORD 0 ;ADDRESS OF CURRENTLY OPEN REGISTER 5DOT: .WORD 0 ;ADDRESS OF LAST EXPLICITLY OPENED CELL+BW: .WORD 0 ;LAST OPEN MODE 1=BYTE, 2=WORDU;OPN: .WORD 0 ;LOCATION OPEN FLAG 0=NOT OPEN, NON-ZERO=OPEN,&D.ARGS: .WORD 0 ;SEMI COLON PUSH WORD;U>; THE FOLLOWING ITEMS NEED NOT BE KEPT FROM COMMAND TO COMMAND/; THEIR ORDER IS INTENTIONAL SO KNOW THY MAKER!; )OP: .BYTE 0 ;CURRENT ARITHMETIC OPERATORP"SMFD: .BYTE 0 ;SEMI-COLON COUNTER EXP: .WORD 0 ;EXPRESSION BUCKET0OUTB: .WORD TPB ;CONSOLE PRINTER BUFFER ADDRESS1OUTS: .WORD TPS ;CONSOLE PRINTER STATUS REGISTERE'PPC: .BLKW 1 ;SAVED PC LAST BREAKPOINTT .IF DF M$$PRO4STENB: .BLKW 1 ;USED TO REENABLE SANITY TIMER IF IT% ;WAS ENABLED WHEN XDT WAS ENTEREDL .ENDC% .IF DF C$$XDJ ;XDT SUPPORTED ON KXJ /KXJNOT: .WORD 0 ;EQ 1 IF HOST IN ATTACHED MODEN! ;EQ 0 IF HOST IN NOT ATTACHEDP .ENDC ; C$$XDJ ;M;; THE FOLLOWING ITEMS MUST BE KEPT FROM COMMAND TO COMMAND.D; T: .BYTE 0 ;T BIT IN USE FLAG P: .BYTE -1 ;PROCEED ALLOW FLAG9S: .BYTE 0 ;SINGLE INSTRUCTION MODE, 0=NORMAL, >0=ENABLE.: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 INDICATIOR .IF DF K$$DAS ;DMODE: .BYTE 'D,40 ;MODE FLAG (I OR D) AND SPACE CHARACTERT6REGFL: .BYTE 0 ;REGISTER BEING DISPLAYED FLAG (1=YES))REGSV: .BYTE 0 ;SAVED REGFL FOR CHAININGT  .ENDC .EVEN; 5; THE BELOW LOCATION IS USED IN BREAKPOINT PROCESSING.;E TRTC: BPT ;TRACE TRAP PROTOTYPE;N8; ALL XDT TYPE ERRORS JUST GO TO "ERR" OR SOMEWHERE ELSE;PSSTXDT: + ERR ;0-ODD ADDRESS + ERR ;1-SEGMENT FAULT % + ERR ;2-BPT OR T-BIT ("MCR" CALL)0 + DCD ;3-IOT ("DECODE")+ + ERR ;4-RESERVED OR ILLEGAL INSTRUCTION0 + ERR ;5-EMT ("ERROR")P + TYPE ;6-TRAPF;Y; SST VECTOR ADDRESS TABLE; SSTADR: .WORD 4 ;ODD ADDRESSV .WORD 250 ;SEGMENT FAULT .WORD 14 ;BPTN .WORD 20 ;IOTO .WORD 10 ;ILLEGAL INSTRUCTIONP .WORD 30 ;EMT .WORD 34 ;TRAP;P+; INTERNAL REGISTER NAME AND CONTROL TABLES ;"; NON-INDEXED REGISTER NAMES;X:NIXMAP: .ASCII /01234567/ ;USER REGISTER NAMES FOR MAPPING"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 QUANTITYT .BYTE 'F ;FORM FORMAT CONTROL  .BYTE 0 ;END OF 00Zaffe__DATADATADATADATATHIS LISTT;T; INDEXED REGISTER NAMES; &INXREG: .BYTE 'B ;ADR1 BKPT ADDRESSES" .BYTE 'G ;CT BKPT PROCEED COUNTS& .BYTE 'I ;UIN BKPT USER INSTRUCTIONS% .BYTE 'R ;RELT RELOCATION REGISTERSN .BYTE 0 ;END OF THIS LIST1;7; INDEXED REGISTER TABLE BASES; .EVEN'INXTBL: .WORD ADR1 ;BKPT ADDRESS TABLER .WORD CT ;BKPT PROCEED COUNTSC .WORD UIN ;BKPT'D INSTRUCTIONN .WORD RELT ;RELOCATION TABLES6 .WORD INTEND+2 ;END OF TABLE AREA FOR ADDRESS MAPPING; ; CHARACTER CONVERSION LISTS.;T3ALTTAB: .BYTE 033,175,176 ;ALTERNATE ALT-MODE FORMSR .BYTE 0 ;END OF THIS LIST TOOB;R"; COMMAND NAME AND DISPATCH TABLES; (COMTAB: ;ADDRESS OF THE CHARACTER TABLE;R6; OPEN REGISTER COMMANDS (ORDER AND POSITION CRITICAL);T .BYTE '\,'/,'','",'%;L; CLOSE REGISTER COMMANDS ;L .BYTE 015,012,'^,'_,'@,'>,' CLOSE, NO SUCESSIVE OPEN% .WORD CLLNFD ; CLOSE, OPEN NEXT/& .WORD CLUPAR ;^ CLOSE, OPEN PREVIOUS. .WORD CLBACK ;_ CLOSE, OPEN PC RELATIVE MODE& .WORD CLATSG ;@ CLOSE, OPEN INDIRECT1 .WORD CLGRTH ;> CLOSE, OPEN PC OFFSET AS BRANCHE* .WORD CLLSTH ;< CLOSE, OPEN OLD SEQUENCE;C; SPECIAL FORMSO;R+ .WORD REGT ;$ INTERNAL REGISTER REFERENCEA* .WORD EQUALS ;= PRINT LEFT SIDE IN OCTAL, .WORD CHRCEE ;C CONSTANT REGISTER CONTENTS, .WORD CHRQUE ;Q QUANTITY REGISTER CONTENTS0 .WORD CHRDOT ;. LAST OPENED LOCATION'S ADDRESS;L ; OPERATORSN;X+ .WORD SEMI ;; MULTIPLE ARGUMENT DELIMITERO .WORD MINS ;- SUBTRACTIONR .WORD PLUS ;+ .WORD ADDITION .WORD STAR ;* MULTIPLY BY 50" .WORD COMM ;, RELOCATION COMPUTE; ; COMMANDS;;' .WORD SEBK ;B SET / CLEAR BREAKPOINTS ! .WORD GOTO ;G GO TO USER'S DATAN0 .WORD KILO ;K KOMPUTE AND TYPE RELOCATION DATA/ .WORD LIST ;L LIST MEMORY ON SPECIFIED DEVICES( .WORD OFST ;O TYPE PC RELATIVE OFFSETS' .WORD PROC ;P PROCEED FROM BREAKPOINTO0 .WORD RELO ;R SET / RESET RELOCATION REGISTERS, .WORD SNGL ;S SET / RESET SINGLE STEP MODE% .WORD EXIT ;X EXIT TO CRASH ROUTINEP   .IF DF K$$DAS- .WORD INSTM ;I SWITCH TO INSTR DISPLAY MODEE, .WORD DATAM ;D SWITCH TO DATA DISPLAY MODE .ENDC E .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) ; MOV R3,-(SP) ;E MOV R2,-(SP) ;S MOV R1,-(SP) ;E MOV R0,-(SP) ;R! MOV PC,SP ;CHANGE STACK POINTERS3 MOV #SSTADR,R0 ;POINT TO TRAP VECTOR ADDRESS TABLE./ MOV #SSTXDT,R1 ;POINT TO XDT TRAP VECTOR TABLEN710$: MOV (R1)+,@(R0)+ ;INSERT XDT TRAP VECTOR ADDRESSESL! CMP R1,#SSTADR ;ANY MORE TO SET?  BLO 10$ ;IF LO YES C U .IF DF M$$PRO P' CMP #$INITL,UPC ;SYSTEM BOOTED BEFORE?K/ BEQ 20$ ;NO, ALWAYS PROMPT (CANNOT USE $XDTFLD) ;OR $XDTPR BECAUSE D-SPACE NOT SET UP $ ;IF THIS IS AN I/D SPACE SYSTEM 0 BIS $CPBIT,$XDTFL ;SHOW THIS CPU AS INITIALIZED' BIT $CPBIT,$XDTPR ;WANT AN XDT PROMPT? BNE 20$ ;YES& JMP LEAVE ;NO, JUST RETURN TO CALLER # 20$: ;P T .IF DF K$$DAS/ CALL SETRW ;SET I-SPACE DESCRIPTOR REGS TO RWV O .ENDC E  .ENDC T  MOV PC,SP ;LENGTHEN STACK 7 TYPE CRLF ;PLACE TERMINAL CARRIAGE IN PROPER POSITION;$ TYPE 'X ;OUTPUT XDT IDENTIFICATION TYPE 'D ;T TYPE 'T ;$ 00ZifPfibjbkb a a a TYPE ': ;O TYPE 40 ;U) MOV $SYSID,R0 ;GET SYSTEM IDENTIFICATIONI* TYPE R0+R0 ;OUTPUT SYSTEM IDENTIFICATION3 MOV $SYSID+2,R0 ;GET SECOND HALF OF IDENTIFICATIOND TYPE R0+R0 ;OUPUT IT, TOO !P7 TYPE CRLF ;PLACE TERMINAL CARRIAGE IN PROPER POSITION. DECODE ;GET FIRST COMMAND*XDTSTK: ;REF LABEL - START OF XDT STACK .DSABL LSBC .IF DF M$$PRO,$XDTIN:: ;INITIALIZE XDT FOR THIS PROCESSO7 BIT $CPBIT,$XDTFL ;THIS PROCESSOR ALREADY INITIALIZED?I BEQ 10$ ;NO RETURN ; 710$: MOV (SP)+,UPC ;RETURN TO CALLER WHEN DONE WITH XDTY BR $XDT ;C O .ENDC 0; .SBTTL "$," PROCESSOR - INTERNAL REGISTER MAPPERO ;SYNTAX--E";$L DELIVER INTERNAL ADDRESS OF L&;$NL DELIVER INTERNAL ADDRESS OF L+2N0;$N DELIVER INTERNAL ADDRESS OF USER REGISTER N&;SEE MAPPING TABLES, RANGE OF N IS 0-7(REGT: JSR PC,GETNUM ;GET AN OCTAL NUMBER JSR PC,RTST ;CHECK FOR ERROR% BCC 5$ ;R4 HAS BEEN MULTIPLIED BY 4H 3$: ERROR ;R"5$: TST R2 ;SEE IF ANYTHING TYPED, BNE 10$ ;IF SO IS INDEXED OR USER REGISTER" JSR R5,LOOKUP ;SEE IF NON-INDEXED + NIXREG+ BCS 12$ ;NON-INDEXED TURNS INTO A COMMANDT, MOV R1,R4 ;PLACE IN LIST IS INTERNAL ORDER1 ADD #UST,R4 ;GET ADDRESS IN R4, GOTTA READ CHARA BR 20$ "10$: JSR R5,LOOKUP ;SEE IF INDEXED + INXREG BCC 15$ ;WAS TRULY INDEXED512$: CMP #7+7,R4 ;INTERNAL USER REGISTER RANGE CHECK  BLO 3$J. ADD #UR0,R4 ;SET ACCESS TO R0-R7 OF THE USER" BR 25$ ;AVOID READING OF COMMAND815$: ADD INXTBL(R1),R4 ;COMPUTE ADDRESS TO INDEXED TABLE,20$: JSR PC,GET ;GET THE ASSUMED TERMINATOR.25$: INC R2 ;SHOW THEM THAT R4 GOT VALID DATA T S .IF DF K$$DAS  V( INCB REGFL ;SET FLAG FOR REGISTER OPEN .ENDC, JMP CLGL ;RE-USE CHARACTER, R2 IS NON-ZERO 04 .SBTTL "K" PROCESSOR - COMPUTE AND PRINT RELOCATION ;SYNTAX--I);AK TYPE RELOCATION DEAL FROM DOT TO AG);L;AK TYPE RELOCATION DEAL FROM L TO A /;IF A IS NULL THE THE OLD BEST FIT RULE APPLIESE3;TYPES =N,DDDDDD WHERE N IS THE RELOCATION REGISTERR#; AND D-D IS THE RELOCATION BIAS )KILO: TST R2 ;SEE WHO PICKS THE REGISTERH BNE 10$ TST R3 ; ADDRESS SPECIFIED?. BNE 5$ ; YES& MOV CAD,R4 ; NO, GET CURRENT ADDRESS BR 7$ ;N15$: MOV R5,R4 ; GET ADDRESS SPECIFIED ON COMMANDO27$: JSR PC,LOCA ; GET CLOSEST RELOCATION REGISTER/ MOV R0,R4 ;DID WE FIND A RELOCATION REGISTER? $ BMI ERR ;CAN'T FIND ONE THATS GOOD"10$: BIC #177770,R4 ;EDIT REGISTER TYPE '= ;OUTPUT CUER TYPE 40 ;! MOVB R4,R0 ;TYPE REGISTER & A ,O ADD #"0,,R0 TYPE R0+R0 ;" ASL R4 ;GO GET IT AS TABLE INDEX# TST R3 ;SEE WHO TYPED THE ADDRESSB BNE 15$ MOV CAD,R5 ;THAT CAD!D15$: SUB RELT(R4),R5 MOV R5,R0 ;BIAS COMPUTET JSR PC,CADW ;PRINT AS WORD DECODEG A+ .SBTTL "A-Q-." PROCESSORS - SPECIAL VALUES E;MERELY SUBSTITUTE THE VALUE IN R4 WITH THE CONTENTS OF THE SPECIFIED ;REGISTER.+CHRQUE: MOV QUAN,R4 ;LAST QUANTITY PRINTED# BR CHR001'CHRCEE: MOV CNST,R4 ;CONSTANT REGISTERP BR CHR001%CHRDOT: MOV CAD,R4 ;CURRENT LOCATION#$CHR001: INC R2 ;ALLOW AS R4 IS REAL+ JSR PC,GET ;GET NEXT CHARACTER AND ASSUME  BR CLGL ;IT IS A TERMINATORD , .SBTTL COMMAND DECODER AND MAIN LOOP OF ODT; COMMAND DECODER - ODTA%; ALL REGISTERS MAY BE USED (R0-R5), );ERROR ENTRY, TYPE FLAG AND GO DO COMMANDL(ERR: CALL SETCN ;SET OUTPUT FOR CONSOLE" TYPE '? ;OUTPUT ERROR INDICATION;E/; DECODE FROM THE TOP, CLOSE ALL AND DO CR/LF/_1;H-DCD: MOV #XDTSTK,SP ;SET THE STACK FOR SANITY1$ CALL SETCN ;SET OUTPUT FOR CONSOLE7 TYPE CRLF ;PLACE TERMINAL CARRIAGE IN PROPER POSITIONE CLR OPN ;SET NO LOCATION OPEN  L .IF DF K$$DAS D& CLRB REGFL ;CLEAR REGISTER OPEN FLAG .ENDC $ TYPE 'X ;OUTPUT INPUT SOLICITATION TYPE 'D ;S TYPE 'T ; TYPE 76 ;'>'(;MAINTAIN OPENED LOCATION, RE-INIT INPUT-NEWC: CLRB SMFD ;CLEAR SEMI-COLON FLAG/COUNTR& CLR R3 ;ZERO SECONDARY ARGUMENT FLAG CLR R5 ;AND ARGUMENT;NEW SUB-EXPRESSION ENTRYK$NEWE: CLRB OP ;CLEAR OPERATOR FOUND1 CLR EXP ;SET ZERO IN EXPRESSION SO FAR LOCATIONR%00Zqffe__DATADATADATADATA;GET NUMBER AND THEN SCAN FOR COMMANDO7NEWN: JSR PC,GETNUM ;GET AN OCTAL NUMBER AND TERMINATOR (;NON-OCTAL CHAR TYPED WHAT ARE WE TO DO?)CLGL: JSR R5,LOOKUP ;GO SEE IF IT IS REALT + COMTAB ;THIS DEFINES REAL" BCS ERR ;EASY ENOUGH IF NOT REAL$ TST R2 ;IF NOTHING TYPE BOTHER NOT BEQ CL01 ;WITH THE EXPRESSIONR" JSR PC,EXPCOM ;COMPUTE EXPRESSION+CL01: JMP @COMDIS(R1) ;GO TO PROPER ROUTINE -;FOR THE BENEFIT ALL REGISTERS ARE AS FOLLOWSC-;R0 LAST CHARACTER TYPED, THE COMMAND ITSELF!1;R1 TABLE INDEX TO COMMAND ADDRESSES, IT IS USED.S/;R2,R4 FIRST ARGUMENT, IF R2<>0 THEN R4 IS DATA0;R3,R5 SECOND ARGUMENT, IF R3<>0 THEN R5 IS DATA; '; SET OUTPUT DEVICE TO CONSOLE TERMINALT; /SETCN: MOV #TPB,OUTB ;SET OUTPUT BUFFER ADDRESSE) MOV #TPS,OUTS ;SET OUTPUT STATUS ADDRESSB RETURN ;H E@ .SBTTL "\-/-'-"-%-:" PROCESSOR - OPEN AND TYPE CONTENT COMMANDS ;SYNTAX--P.;NC OPEN LOC N IN MODE C, SET MODE FOR NEXT$;C TYPE LAST OPENED LOC IN MODE COCWORD: ;OCTAL WORD - R1=2ANWORD: ;ANSII WORD - R1=6MODULO: ;RADIX 50 WORD - R1=10A/;OPEN WORD MODE ENTRY, R1 CONTAINS FORMAT INDEXR' MOV #2,R0 ;SET BYTE FLAG TO WORD FLAGE BR OPE004 ;GO TO IT ACE HOLEOCBYTE: ;OCTAL BYTE - R1=0ANBYTE: ;ANSII BYTE - R1=4.OPE001: MOV #1,R0 ;SET WORD FLAG TO BYTE FLAG.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 SOOTHO+ MOV R4,CAD ;SET ADDRESS FOR EXPLICIT OPEND MOV R4,DOT ;RESET RETURN PTR.  1 A .IF DF K$$DAS' MOVB REGFL,REGSV ;INIT REGFL SAVE BYTEV , .ENDC T L#10$: CMP #1,R0 ;CHECK ON BYTE MODEI BEQ 15$ ;NOT BYTE MODE# BIT #1,CAD ;SEE IF ADDRESS IS ODDE BEQ 15$ ;ALL IS GOOD! CLR R1 ;THEY GET BYTE MODE ONLY BR OPE001%15$: MOV R1,-(SP) ;SAVE FORMAT MAINLYB JSR PC,GETCAD ;GET THE DATA MOV (SP)+,R1 ;GET FORMATO0 JSR PC,@TYFORM(R1) ;PRINT DATA IN PROPER FORMAT% BR NEWC ;GO GETTA NEW COMMAND TO DOE DB .SBTTL "-->-<-^-_-@" PROCESSOR - CLOSE AND OPEN REGISTERS F;CARRIAGE RETURN%CLCRET: JSR PC,PUTCAD ;CLOSE LOCATION DECODE ;RETURN TO DECODER;LESS THAN, BACK TO MAIN STREAMN0CLLSTH: INCB SEQ ;SET FLAG TO LATER RESTORE CAD;LINE FEED, NEXT ONE DOWNR)CLLNFD: JSR PC,PUTCAD ;CLOSE PRESENT CELL:# TSTB SEQ ;SHOULD CAD BE RESTORED?J BEQ OP5 ;BRANCH IF NOT( MOV DOT,CAD ;RESTORE PREVIOUS SEQUENCE .IF DF K$$DAS N( MOVB REGSV,REGFL ;RESTORE REGISTER FLAG .ENDC( CLRB SEQ ;RESET FLAG; NO LONGER NEEDED BR OP2A ;P&OP5: ADD BW,CAD ;GENERATE NEW ADDRESS,OP2: ;MOV CAD,DOT ;INITIALIZE DOT (REMOVED)3OP2A: TYPE CRLF ;PLACE CARRIAGE IN PROPER POSITIONA MOV CAD,R0 ;NUMBER TO TYPE JSR PC,RORA ; CHECK FORMAT MOVB FM,R0 ;SET FORMAT ASR R0 ;SPLIT R0 IN HALF) MOVB COMTAB(R0),R0 ;SET SUFFIX CHARACTER  TYPE R0 ;PRINT CHARACTER MOV CAD,R4 ;SET UP THE DATAE! CLR R2 ; SET TO USE CAD ADDRESSD CLRB OP ;THIS IS BECUZER CLR EXP- JMP CLGL ;R0 HAS TERMIN, R4- DATA, R2= FLAGG;UP ARROW, NEXT ONE UPCLUPAR: JSR PC,PUTCAD;" SUB BW,CAD ;GENERATE NEW ADDRESS BR OP2 ;GO DO THE REST ;BACK ARROW, PC RELATIVE COMPUTE.CLBACK: JSR PC,TCLS ;TEST WORD MODE AND CLOSE ADD R4,R2 ;COMPUTE CMPB (R2)+,(R2)+ ;NEW ADDRESSPCS: MOV R2,CAD ;UPDATE CAD BR OP2A ;GO FINISH UPS$;AT SIGN, ABSOLUTE OR INDIRECT CHAIN.CLATSG: JSR PC,TCLS ;TEST WORD MODE AND CLOSE! MOV R4,R2 ;GET ABSOLUTE ADDRESSP BR PCSS';GREATER THAN, PC OFFSET BRANCH ADDRESSI$CLGRTH: JSR PC,TCLS ;TEST AND CLOSE. MOVB R4,R1 ;COMPUTE NEW ADDRESS, EXTEND SIGN ASL R1 ;R2=2@R2) ADD #2,R1 ;+2D ADD R1,R2 ; +PCR BR PCSE ;HANDY DANDY TO DO SOME LEG WORK'TCLS: JSR PC,PUTCAD ;CLOSE CURRENT CELLC# CMP #2,BW ;ONLY WORD MODE ALLOWEDS BNE ERR1 ;BRANCH IF ERRORD# MOV CAD,R2 ;CURRENT ADDRESS IN R2N# MOV R2,DOT ;MARK CURRENT POSITIONG S C .IF DF K$$DAS % MOVB REGFL,REGSV ;SAVE REGISTER FLAG & CLRB REGFL ;CLEAR OPEN REGISTER FLAG .ENDC RTS00ZyfPfibjbkb a a a PC L1 .SBTTL "O" PROCESSOR - COMPUTE AND PRINT OFFSETSO ;SYNTAX--R;AO TYPE OFFSETS FROM . TO AR!;L;AO TYPE OFFSETS FROM L TO A 1;TYPES _PPPPPP >DDDDDD WHERE P-P IS PC RELATIVE; AND D-D IS BRANCH OFFSET&OFST: TST R3 ;HOW ABOUT A VALUE OTHER BNE 10$ ;THAN CADR MOV CAD,R5 ;RELUCTANTLY 10$: SUB R5,R40 SUB #2,R4 ;NO TRICKS, ODD AND NON-EXIST THINGS TYPE '_ ;TYPE PC RELATIVE CUEE TYPE 40 ;V MOV R4,R0% MOV R4,-(SP) ;GOOD IDEA TO SAVE THIS ! JSR PC,CADW ;TYPE VALUE + BLANK.! TYPE 76 ;TYPE OFFSET BRANCH CUER MOV (SP)+,R0 ASR R0 ;DIVIDE6OF09: JSR PC,CADW ;16 BITS SO YOU CAN SEE HOW FAR OFF DECODE ; GET NEXT COMMAND @ .SBTTL "=" PROCESSOR - PRINT LEFT SIDE EXPRESSION ON RIGHT SIDE2EQUALS: MOV R4,R0 ;PROPER PRIOR PLANNING PREVENTS BR OF09 ;POOR PERFORMANCE ;JUST ANOTHER ERROR CALL ERR1: ERRORD N) .SBTTL SST INTERRUPT VECTOR ENTRY POINTST;U*; SEGMENT FAULT - V1 - "MP" - NO PROCEED;O)SGMT: TESTM $SGFLT ;TEST IF IN EXEC MODEU' BIC #160000,SR0 ;UNFREEZE SEGMENT UNIT  MOV #"MP,EXP ;ENTRY PREFIX BR NIXP ;9; *; STACK OVERFLOW - - "SO" - NO PROCEED(; ODD ADDRESS - V0 - "OD" - NO PROCEED$; BPT - V2 - "BE" - SPECIAL CASES ; T-BIT - V2 - "TE" - PROCEED; IOT - V3 - "IO" - PROCEED/; RESERVED OR ILLEGAL - V4 - "IL" - NO PROCEEDN;E)ODDA: MOV #"SO,EXP ;ASSUME STACK OVERFLOW " CMP SP,#V$$CTR+4 ;STACK OVERFLOW? BLO NIXP ;IF LO YES1$ TESTM $TRP04 ;TEST IF IN EXEC MODE MOV #"OD,EXP ;"OD:" FOR ODD ONE BR NIXP ;NIX ON PROCEEDS)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 MODEV MOV #"IO,EXP ;"IO:" FOR IOTEE BR ALOP ;ALLOW PROCEED)ILLI: TESTM $ILINS ;TEST IF IN EXEC MODE( MOV #"IL,EXP ;"IL:" FOR ILL INSTRUCTIONNIXP: MOVB #-1,P ;NO PROCEEDK BR INTR ;B;X; EMT - V5 - "EM" - PROCEED"; TRAP - V6 - "TR" - NO PROCEED;D)NEMT: TESTM $EMTRP ;TEST IF IN EXEC MODEP MOV #"EM,EXP ;"EM:" FOR EMTEE#ALOP: MOVB #BKP+2,P ;ALLOW PROCEED Y;B); COMMON INTERRUPT SERVICE AND DISPATCHER ;R3INTR: BIT #TBT,2(SP) ;T-BIT SET IN STACKED PS WORD?S 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 SERVICE  ;ROUTINE EXITS WITH AN RTI.P(1$: MOV (SP)+,UPC ;SET THE USER PC VALUE$ MOV (SP)+,UST ;AND HIS ENTRY STATUS! MOV R0,UR0 ;SAVE EXEC REGISTERSF+ MOV #UR0+2,R0 ;POINT TO REGISTER SAVE AREAY( MOV R1,(R0)+ ;SAVE REGISTERS R1 THRU SP MOV R2,(R0)+ ;N MOV R3,(R0)+ ;) MOV R4,(R0)+ ;A MOV R5,(R0)+ ;B MOV SP,(R0)+ ;& MOV #XDTSTK,SP ;SET XDT STACK POINTER B 1 .IF DF M$$PRO J R/ CLR -(SP) ;ASSUME SANITY TIMER IS NOT ENABLEDI6 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 ; 63$: MOV (SP)+,STENB ;SAVE POLARITY OF SANITY TIMER BIT + .ENDC3 MOV #SSTADR,R0 ;POINT TO TRAP VECTOR ADDRESS TABLE / MOV #SSTXDT,R1 ;POINT TO XDT TRAP VECTOR TABLEM0 MOV #SSTVEC,R2 ;POINT TO TABLE OF TRAP CONTENTS35$: MOV @(R0),(R2)+ ;SAVE THE CURRENT TRAP CONTENTSF1 MOV (R1)+,@(R0)+ ;SET XDT TRAP VECTOR ADDRESSES I! CMP R1,#SSTADR ;ANY MORE TO SET?; BLO 5$ ;IF LO YESF .IF DF K$$DAS ;/ CALL SETRW ;SET KERNEL INSTRUCTION DESCRIPTORE ;REGISTERS TO READ/WRITE .ENDC C;TRY AND FIND OUT WHAT TO DO& TSTB P ;SEE IF CONTROLLED BREAKPOINT) BNE 10$ ;NOT DUE TO A PLANNED INTERRUPTD- TSTB T ;IS A BPT OR T-BIT, SEE IF A PROCEEDP/ BNE TBIT ;COMMAND IS BEING DONE, GO FINISH ITF+ TSTB S ;NO REMOVAL OF BREAKS ON S.I. MODE  BNE 12$ ;SKIP NEXT TWO WORDS;R; REMOVE EXEC BREAKPOINTSD;S-10$: MOV #ADR1,R4 ;POINT TO BREAKPOINT VECTOR  F  .IF DF K$$DAS  D211$: MOV UIN-ADR1(R4),-(SP) ;PUSH CORRECT CONTENTS( MTPI @(R4)+ ;REINSERT CORRECT CONTEN00Zffe__DATADATADATADATATS .IFF711$: MOV UIN-ADR1(R4),@(R4)+ ;REINSERT CORRECT CONTENTS  .ENDC' CMP #ADR1+BKP,R4 ;ANY LEFT TO RESTORE? BHIS 11$ ;IF HIS YES312$: MOV UPC,R5 ;GET A COPY OF THE PC AT INTERRUPTD# TSTB P ;BREAKPOINT OR T-BIT CHECKV& BNE 30$ ;DEFINITELY NOT A BREAKPOINT# MOVB S,R4 ;SEE IF SINGLE STEPPINGE BNE 22$ ;AND PRETEND.;AT THIS POINT IT MAY BE DUE TO T-BIT OR A BPT) MOVB #BKP+2,P ;SET ALLOW TO THE 8'TH ONE4 ( .IF DF K$$DAS T2 MFPI -(R5) ;GET TRAPPED INSTRUCTION FROM I-SPACE CMP (SP)+,TRTC ;IS IT A BPT?( .IFFN T- CMP -(R5),TRTC ;BACK-UP R5 AND SEE WHAT'S UPP .ENDC O! BEQ 30$ ;IT WAS A NON-BREAK BPT* MOV #BKP,R4 ;SET ADDRESS OF LEGIT BREAKS-15$: CMP R5,ADR1(R4) ;LOOK IT UP IN THE TABLE( BEQ 20$ ;FOUND THE NASTY LITTLE BUGGER SUB #2,R4 ;KEEP AT ITS BGE 15$ ;UNLESS NO MOREE- MOV #"TE,R4 ;NOT THERE, MUST BE T-BIT ERRORR& TST (R5)+ ;RESET PC TO MAKE IT RIGHT BR 26$ ;LABOR+20$: MOV R5,UPC ;BACK-UP PC FOR BREAKPOINTE)22$: MOVB R4,P ;BREAKPOINT IS A REAL ONE ) DEC CT(R4) ;CHECK OUT THE PROCEED COUNTT$ BNE 31$ ;LABOR ON A MIS-CONCEPTION! INC CT(R4) ;RESET PROCEED COUNT-" ASR R4 ;OCTAL TO UN-BIASED ASCII ADD #"0B,R4 ;BIAS TO ASCII#26$: MOV R4,EXP ;SET THE PREFIX UP,;COMMON TYPE ROUTINE FOR SST VECTORS USED UP230$: TYPE CRLF ;PLACE CARRIAGE IN PROPER POSITION MOV EXP,R0 ;THE PREFIX TYPE R0+R0 ; TYPE ': ;R& MOV R5,R0 ;TYPE ADDRESS OF INTERRUPT( JSR PC,RORA ;AND THE REST OF THE ENTRY DECODE2 31$: JMP C990 ;BRANCH STRETCHER N; .SBTTL "G, S, P" PROCESSORS - GO, SINGLE STEP, AND PROCEEDB;O; "G" PROCESSOR - GO TO PROGRAM; ;SYNTAX--E!;LG START PROGRAM AT LOCATION LS ;G START PROGRAM AT CURRENT PC&GOTO: TST R2 ;SEE IF SPECIFIC ADDRESS BEQ 10$ ;NOE MOV R4,UPC ;SET THE PC$10$: CLRB S ;NO SINGLE INSTRUCTIONS TBIT: CLRB T ;CLEAR T-BIT FLAGS BIS #TBT,UST ;BOTH $ TSTB S ;SEE IF WE NEED A T-BIT BIT BNE GRTT ;NO GO ON BIC #TBT,UST ;SET THE TEE BIT;E; SET EXEC BREAKPOINTS;C-10$: MOV #ADR1,R4 ;POINT TO BREAKPOINT VECTORC S .IF DF K$$DAS P N+20$: MFPI @(R4) ;SAVE CONTENTS OF LOCATIONA MOV (SP),UIN-ADR1(R4) ;+ MOV TRTC,(SP) ;PUSH BREAKPOINT INSTRUCTIONA) MTPI @(R4)+ ;SET BREAKPOINT INSTRUCTIONF A .IFF  Q620$: MOV @(R4),UIN-ADR1(R4) ;SAVE CONTENTS OF LOCATION MOV TRTC,@(R4)+ ;SET BREAKPOINT .ENDC F .IF DF M$$PRO BIT #1,SR0 ;MAPPING ENABLEDE) BEQ 24$ ;IF EQ NO, CAN'T GET TO LOWCR'S# .IF DF K$$DAS& BIT #4,SR3 ;KERNEL D-SPACE ENABLED ?) BEQ 24$ ;IF EQ NO, CAN'T GET TO LOWCR'SC .ENDC ; DF K$$DAS, MOV KISAR6,-(SP) ;SAVE CURRENT EXEC MAPPING% MOV R0,-(SP) ;AND A SCRATCH REGISTERV; MOV UIN-ADR1(R4),-(SP) ;FETCH USER INSTRUCTION FOR UPDATESB( MOVB $NCPU,R0 ;GET NUMBER OF PROCESSORS# ASL R0 ;AND CONVERT TO WORD INDEXN121$: MOV $K6TAB-2(R0),KISAR6 ;REMAP TO NEXT LOWCR0 MOV (SP),140000+UIN-ADR1(R4) ;STUFF INSTRUCTION# SUB #2,R0 ;POINT BACK TO NEXT CPUT BGT 21$ ;IF GT THERE IS ONED# TST (SP)+ ;GET RID OF INSTRUCTIONA' MOV (SP)+,R0 ;RESTORE SCRATCH REGISTER / MOV (SP)+,KISAR6 ;RESTORE CURRENT EXEC MAPPINGP24$: .ENDC ; DF M$$PRO& CMP #ADR1+BKP,R4 ;ANY MORE TO INSERT? BHIS 20$ ;IF HIS YES TGRTT:  T .IF DF K$$DAS " BIT #1,SR0 ;MAPPING ENABLED YET? BEQ LEAVE ;IF EQ NOV, BIT #4,SR3 ;KERNEL DATA SPACE ENABLED YET? BEQ LEAVE ;IF EQ NO2 MOV #KINDR0,R0 ;POINT TO KERNEL INSTR DESCR REG 0)25$: BIC #4,(R0)+ ;SET RO ACCESS FOR EXEC2 CMP R0,#KINDR7 ;DONE YET? BLOS 25$ ;IF LOS NON U .ENDC ()LEAVE: CLR OPN ;CLEAR LOCATION OPEN FLAGP3 MOV #SSTADR,R0 ;POINT TO TRAP VECTOR ADDRESS TABLEN0 MOV #SSTVEC,R1 ;POINT TO EXEC TRAP VECTOR TABLE,30$: MOV (R1)+,@(R0)+ ;SET EXEC TRAP VECTORS1 CMP R0,#SSTADR+ ;ANY MORE TO SET?E BLO 30$ ;IF LO YES Q .IF DF M$$PRO ; N/ BIS STENB,$STENB ;POSSIBLY ENABLE SANITY TIMER M .ENDC R% .IF DF C$$XDJ ;XDT SUPPORTED ON KXJ5) BIT #4,SR3 ;IS KERNEL D SPACE ENABLED?P9 BEQ 40$ ;IF EQ NO, THIS MUST BE VIRGIN BOOT NOT ON KXJ!00ZfPfibjbkb a a a BIT #F5.XDJ,$FMSK5 ;XDT ON KXJ?O BEQ 40$ ;IF EQ NOS, TST KXJNOT ;HAS HOST BEEN NOTIFIED ALREADY BEQ 40$ ;IF EQ YES" MOV $KXPTR,R0 ;GET ADDRESS OF DCB% MOV D.UCB(R0),R0 ;GET ADDRESS OF UCBP% MOV U.SCB(R0),R0 ;GET ADDRESS OF SCBO% MOV S.KRB(R0),R0 ;GET ADDRESS OF KRBF& MOV K.CSR(R0),R0 ;GET ADDRESS OF TPR0& MOV #RI$XDD,TPR2(R0) ;XDT DETACH CODE+ MOV $KXVC1,R1 ;GET ADDRESS OF FIRST VECTOR& ADD #4,R1 ;GET ADDRESS OF XDT VECTOR' MOV R1,@#KXJQIR ;NOTIFY HOST OF DETACHR , CLR KXJNOT ;KEEP TRACK OF DETACH OURSELVES135$: TST TPR2(R0) ;HOST RECEIVED DETACH MESSAGE?T BNE 35$ ;IF NE NOY .ENDC ; C$$XDJY40$: $! MOV #UR0+2,R0 ;POINT TO SAVED R1D3 MOV (R0)+,R1 ;RESTORE REGISTERS R1 THRU SP THEN R0G MOV (R0)+,R2 ;O MOV (R0)+,R3 ;R MOV (R0)+,R4 ;  MOV (R0)+,R5 ;R MOV (R0)+,SP ;S MOV UR0,R0 ; MOV UST,-(SP) ;SET EXEC PS WORD MOV UPC,-(SP) ;SET EXEC PC WORD# MOV (SP),PPC ;SET PREVIOUS PC WORDORTN: RTT ;RETURN TO EXECUTIVEO;H%; "S" PROCESSOR - SINGLE STEP PROCEEDT ;SYNTAX--A+;NS EXECUTE N INSTRUCTIONS AND THEN STOPE;S EXECUTE ONE INSTRUCTIONI$SNGL: MOVB #BKP+2,R0 ;FAKE THE BREAK' MOVB R0,S ;SET THE FLAG FOR S.I. MODEV& BR PR01 ;FAKE A PROCEED IN S.I. MOOD;R); "P" PROCESSOR - PROCEED FROM BREAKPOINTV ;SYNTAX-- +;NP PROCEED THRU THIS BREAKPOINT N TIMES0;P ASSUME N=1PROC: CLRB S ;SET FAST MODE MOVB P,R0 ;GET NUMBER OF BREAK% BMI PR02 ;THERE WASN'T ONE SO FAR ? (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 STARTS$10$: MOV R4,CT(R0) ;SET USER'S COUNT/C990: CMPB P,#BKP ;SEE IF A REAL ONE OR A FAKET 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 GRTTPR02: ERROR ;ANNOUNCE ERROR C; .SBTTL "L" PROCESSOR - LIST MEMORY ON THE SPECIFIED DEVICEB ;SYNTAX--R4; 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 LIMITSC BEQ 10$ ;IF SPECIFIED TO DO SO MOV R4,HI10$: TST R3 ;DO THE LOW ONE BEQ 15$ MOV R5,LOWF,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 ARGUEU: MOV #LPS,OUTS ;SET OUTPUT STATUS REGISTER TO LINE PRINTER MOV #LPB,OUTB ; TYPE 14 ;OUTPUT A FORM FEED +17$: MOV LOW,R5 ;GET STARTING DUMP ADDRESS $ MOVB OBW,R0 ;GET ADDRESS INCREMENT. SUB R0,R5 ;BIAS ADDRESS BY ADDRESS INCREMENT! MOV R5,CAD ;SET CURRENT ADDRESS% TST -(SP) ;MAKE A HOLE IN THE STACKR20$: CLR (SP) ;NEW LINE UPW& JSR PC,SNAGIT ;ACCESS DEVICE FOR DATA, JSR PC,SPRINT ;PRINT ADDRESS AND FIRST ITEM!25$: JSR PC,SNAGIT ;GET MORE DATAK# JSR PC,DPRINT ;JUST PRINT THE DATAR INC (SP) ;COUNT THE DATA CMP #7,(SP) ;CHECK THE COUNT) BNE 25$ ;JUST LIKE THEY TOLD YOU AT THE # BR 20$ ;FAMOUS PROGRAMMERS SCHOOLR G$ .SBTTL "X" PROCESSOR - EXIT COMMAND;S; EXIT COMMAND;, ; SYNTAX X;SI; THE EXIT COMMAND IN XDT EFFECTS A JUMP TO THE EXECUTIVE $CRASH ROUTINE.K; EXIT: ;REFERENCE LABEL(% .IF DF C$$XDJ ;XDT SUPPORTED ON KXJS) BIT #4,SR3 ;IS KERNEL D SPACE ENABLED?S9 BEQ 10$ ;IF EQ NO, THIS MUST BE VIRGIN BOOT NOT ON KXJP! BIT #F5.XDJ,$FMSK5 ;XDT ON KXJ?C BEQ 10$ ;IF EQ NOA, TST KXJNOT ;HAS HOST BEEN NOTIFIED ALREADY BEQ 10$ ;IF EQ YES" MOV $KXPTR,R0 ;GET ADDRESS OF DCB% MOV D.UCB(R0),R0 ;GET ADDRESS OF UCBX% MOV U.SCB(R0),R0 ;GET ADDRESS OF SCBY% MOV S.KRB(R0),R0 ;GET ADDRESS OF KRBF& MOV K.CSR(R0),R0 ;GET ADDRESS OF TPR0& MOV #RI$XDD,TPR2(R0) ;XDT DETACH CODE+ MOV $KXVC1,R1 ;GET ADDRESS OF FIRST VECTOR& ADD #4,R1 ;GET ADDRESS OF XDT VECTOR' MOV R1,@#KXJQIR ;NOTIFY HOST OF DETACHR, CLR KXJNOT ;KEEP TRACK OF DETACH OURSELVES135$: TST TPR2(R0) ;HOST RECEIVED DETACH MESSAGE?  BNE 35$ ;IF NE NOR .ENDC ; C$$XDJ 10$: .IF DF C$$CDA! MOV #UR0+2,R0 ;POINT TO SAVED R1R3 MOV (R0)+,R1 ;RESTORE REG00Zffe__DATADATADATADATAISTERS R1 THRU SP THEN R0S MOV (R0)+,R2 ;K MOV (R0)+,R3 ;D MOV (R0)+,R4 ;V MOV (R0)+,R5 ;T MOV (R0)+,SP ; MOV UR0,R0 ;3 MOV UST,$CRUST ; MOVE USER PS FOR THE CRASH MODULEF3 MOV UPC,$CRUPC ; MOVE USER PC FOR THE CRASH MODULER5 JMP $CRALT ; ALTERNATE ENTRY POINT TO THE CRASH MOD  .IFF ; DF C$$CDAH) HALT ;HALT SYSTEM (MOSTLY USED IN P/OS  .ENDC ; DF C$$CDA , .SBTTL UTILITIES - COMMAND SUPPORT ROUTINES);TEST FOR VALID RELOCATION REGISTER IN R4R5RTST: CMP #RLR/2,R4 ;GET A GOOD NUMBER FOR A REGISTERM$ BLO 10$ ;NOT TOO GOOD, QUESTION IT ASL R4 10$: RETURN ; $;SNAG MEMORY LOCATION JSR PC,SNAGIT;NEEDS--3;CAD POINTS TO MEMORY WORD (APPROXIMATELY THAT IS)P0;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 DO  BLOS 10$ ;IF NOT DO NOT - DECODE ;GO RESET STACK AND NO NEXT COMMAND!10$: JSR PC,GETCAD ;ACCESS METHODE" MOV R0,R5 ;MAKE A COPY FOR LATER RETURN ;R!;SEARCH HIT PRINT JSR PC,SPRINTG$;CAD POINTS TO THE LOC TO BE PRINTED7;R5 CONTAINS THE CONTENTS OF THE LOCATION TO BE PRINTED5SPRINT: TYPE CRLF ;PLACE CARRIAGE IN PROPER POSITION, MOV CAD,R0 ;THE LOCATION JSR PC,RORA ;THE MODET% MOVB FM,R0 ;PICK UP OLD CURENT MODED ASR R0 ;HALVES MOVB COMTAB(R0),R0 ;AH HA! TYPE R0 ;TYPE THE MODE REGISTERT#;DATA PRINT ROUTINE JSR PC,DPRINT ";PRINTS DATA IN R5 IN CURRENT MODE!DPRINT: MOVB FM,R1 ;SET THE MODEO" MOV R5,R0 ;THIS IS THE POOR DATA MOV R5,-(SP) ;SAVE THE DATA0 JSR PC,@TYFORM(R1) ;DO THAT __ TO THE POOR DATA MOV (SP)+,R5 ;RESTORE THE DATAO RTS PC ;RESTORE THE PC C ;L%; GET CHARACTER FROM CONSOLE TERMINALC;RGET:& .IF DF C$$XDJ ;XDT SUPPORTED ON KXJ) BIT #4,SR3 ;IS KERNEL D SPACE ENABLED?;8 BEQ 5$ ;IF EQ NO, THIS MUST BE VIRGIN BOOT NOT ON KXJ BIT #F5.XDJ,$FMSK5 ;XDT ON KXJ? BNE 10$ ;IF NE YES .IFTF ; C$$XDJ 5$:  TSTB TKS ;CHARACTER READY? BPL 5$ ;IF PL NO MOVB TKB,R0 ;READ INPUT BYTE .IFT ; C$$XDJ H BR 15$ ;JOIN COMMON CODE+10$: MOV $KXPTR,R0 ;GET ADDRESS OF KXJ DCBS% MOV D.UCB(R0),R0 ;GET ADDRESS OF UCBC% MOV U.SCB(R0),R0 ;GET ADDRESS OF SCBO% MOV S.KRB(R0),R0 ;GET ADDRESS OF KRBD& MOV K.CSR(R0),R0 ;GET ADDRESS OF TPR0# MOV #100000,TPR3(R0) ;SET HIGH BIT 2 MOV #RI$XDR,TPR2(R0) ;SET XDT READ FUNCTION CODE MOV R0,-(SP) ;SAVE TPR0 ADDRESS+ MOV $KXVC1,R0 ;GET ADDRESS OF FIRST VECTOR& ADD #4,R0 ;GET ADDRESS OF XDT VECTOR' MOV R0,@#KXJQIR ;NOTIFY HOST OF DETACH  MOV (SP)+,R0 ;RESTORE R0)12$: TST TPR2(R0) ;HAS CHARACTER ARRIVED?R BNE 12$ ;IF MI NOX613$: TST TPR3(R0) ;SEE IF CPRSYS HAS GIVEN US THE CHAR BMI 13$ ;IF MI, NOT YETC$ MOV TPR3(R0),-(SP) ;READ INPUT BYTE CLR TPR3(R0) ;CLEAR REGISTER MOV (SP)+,R0 ;GET CHARACTER15$: .IFTF ; C$$XDJM .IF DF R$$PRO/ MOV #115,@#173202 ;CLEAR THE PENDING INTERRUPTP .ENDC ; DF R$$PRO" BIC #177600,R0 ;CLEAR EXCESS BITS CMPB R0,#12 ;BRANCH IF E BEQ 40$ ;NO ECHO 'SI JSR R5,LOOKUP ;CHECK IF ALTMODE + ALTTAB BCS 20$ ;R MOVB #'$,R0 ;CHANGE TO $ IF SO'20$: MOV R0,-(SP) ;SAVE INPUT CHARACTERE TYPE R0 ;ECHO CHARACTER & MOV (SP)+,R0 ;RESTORE INPUT CHARACTER$ CMP #141,R0 ;LOWER CASE CHARACTER? BHI 30$ ;IF HI NOT$ CMP #172,R0 ;LOWER CASE CHARACTER? BLO 30$ ;IF LO NO- SUB #40,R0 ;CONVERT TO UPPER CASE CHARACTERH30$: CMPB #' ,R0 ;CVT BLANK BNE 40$ MOVB #'+,R0 ;INTO +C40$: RETURN ;; !; TYPE CHARACTER ON OUTPUT DEVICE ; .TYPE: MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESS( SUB #2,(SP) ;POINT TO TRAP INSTRUCTION/ MOVB @(SP)+,-(SP) ;GET LOW BYTE OF INSTRUCTIONR BMI 10$ ;IF MI CONTROL BYTEE! MOV (SP)+,R0 ;SET BYTE TO OUTPUTA BR 30$ ;)10$: BIT #40,(SP) ;OUTPUT CONTENTS OF R0?  BEQ 20$ ;IF EQ YES% MOV (PC)+,R0 ;SET TO OUTPUT I .BYTE 15,12 ;0#20$: ASLB (SP)+ ;OUTPUT TWO BYTES?H BPL 30$ ;IF PL NOC TYPE R0 ;TYPE OUT FIRST BYTE SWAB R0 ;SET UP HIGH BYTE30$: .IFT ; C$$XDJ) BIT #4,SR3 ;IS KERNEL00ZfPfibjbkb a a a D SPACE ENABLED?)9 BEQ 31$ ;IF EQ NO, THIS MUST BE VIRGIN BOOT NOT ON KXJS BIT #F5.XDJ,$FMSK5 ;XDT ON KXJ? BNE 45$ ;IF NE YES  .IFTF ; C$$XDJC&31$: TSTB @OUTS ;OUTPUT DEVICE READY? BPL 31$ ;IF PL NO0 MOVB R0,@OUTB ;OUTPUT BYTEN&35$: TSTB @OUTS ;OUTPUT DEVICE READY? BPL 35$ ;IF PL YES1 CMPB #15,R0 ;WAS OUTPUT BYTE A CARRIAGE RETURN?P BNE 50$ ;IF NE NO3+ CMP #LPS,OUTS ;OUTPUT DEVICE LINE PRINTER?E BEQ 50$ ;IF EQ YES" MOV #5,-(SP) ;SET FILL COUNT TO 5 CLRB R0 ;SET OUTPUT NULLSE40$: TYPE R0 ;OUTPUT A NULL DEC (SP) ;ANY MORE TO OUTPUT?O BGT 40$ ;IF GT YES TST (SP)+ ;CLEAN STACK .IFT ; C$$XDJ BR 50$ ;JOIN COMMON CODE45$:  MOV R0,-(SP) ;SAVE CHARACTER$' MOV $KXPTR,R0 ;GET ADDRESS OF KXJ DCBN% MOV D.UCB(R0),R0 ;GET ADDRESS OF UCB?% MOV U.SCB(R0),R0 ;GET ADDRESS OF SCBW% MOV S.KRB(R0),R0 ;GET ADDRESS OF KRBE& MOV K.CSR(R0),R0 ;GET ADDRESS OF TPR07 TST KXJNOT ;HAVE WE ALREADY NOTIFIED HOST FOR ATTACH?P BNE 455$ ;IF NE, YES% MOV #1,KXJNOT ;SET NOTIFICATION FLAG " MOV #RI$XDA,TPR2(R0) ;ATTACH CODE MOV R0,-(SP) ;SAVE TPR0 ADDRESS+ MOV $KXVC1,R0 ;GET ADDRESS OF FIRST VECTORX& ADD #4,R0 ;GET ADDRESS OF XDT VECTOR' MOV R0,@#KXJQIR ;NOTIFY HOST OF DETACHK% MOV (SP)+,R0 ;RESTORE TPR0 ADDRESS D1453$: TST TPR2(R0) ;HOST RECEIVED ATTACH MESSAGE?  BNE 453$ ;IF NE NO455$:  MOV (SP),TPR3(R0) ;OUTPUT BYTEM. MOV #RI$XDW,TPR2(R0) ;SET WRITE FUNCTION CODE MOV R0,-(SP) ;SAVE TPR0 ADDRESS+ MOV $KXVC1,R0 ;GET ADDRESS OF FIRST VECTOR,& ADD #4,R0 ;GET ADDRESS OF XDT VECTOR' MOV R0,@#KXJQIR ;NOTIFY HOST OF DETACH # MOV (SP)+,R0 ;RESTORE TPR0 ADDRESSE&46$: TST TPR2(R0) ;CHARACTER RECEIVED? BNE 46$ ;IF MI NOE% MOV (SP)+,R0 ;RESTORE CONTENTS OF R0D .ENDC ; C$$XDJR 50$: RTI ; R# .SBTTL UTILITIES - PRETTY PRINTERSI4;PRINT ADDRESS- RELOC, SYMBOLIC, OR ABSL JSR PC.RORA;R0 ADDRESS TO BE PRINTED,;FORM CORE ADDRESS FORMAT (0-RELOC 1-ABSOL);REGISTER '$R ' OR '$DR 'D;CORE 'D,XXXXXX ' OR 'XXXXXX ' 1RORA: MOV R0,-(SP) ;CALLING VALUE ONA TOPPA SATCKT  V .IF DF K$$DAS I/ MOV DMODE,R0 ;PICK UP MODE CHARACTER AND SPACER' TSTB REGFL ;ATTEMPT TO OPEN REGISTER?E BEQ 50$ ;IF EQ NON4 MOV #"D ,R0 ;DATA SPACE USED IF REGISTER NOT THERE $ .IFTF CMP #INTBEG,(SP)B" BHI 50$ ;BELOW FIRST NON-INDEXED CMP #INTEND,(SP)O! BLO 50$ ;ABOVE LAST NON-INDEXED TYPE '$ ;ANNOUNCE INTENSIONS CMP #INTINX,(SP)A BLOS 20$ ;GO TO DO INDEXED/ MOV (SP)+,R0 ;NON-INDEXED REGISTER ----- "$R "X- SUB #INTBEG,R0 ;CLEANED UP STACK, GET OFFSETO( ASR R0 ;BYTE THAT WORD, WORD THAT BYTE/ MOVB NIXMAP(R0),R0 ;MAGIC CHARACTER FROM TABLET15$: BIS (PC)+,R0 & .BYTE 000,' ;CHARACTER PLUSSA BLANK' TYPE R0+R0 ;NAME PLUS BLANK AND SPLITT RETURN ;,20$: CLR R1 ;SEE WHICH SET OF TABLES WE GOT822$: CMP INXTBL+2(R1),(SP) ;LOOK ON AHEAD TO FIND BEHIND# BHI 24$ ;R1 POINTS TO BASE OF SETU2 TST (R1)+ ;THINK ABOUT THOSE DUMMY ENTRIES DUMMY BR 22$X/24$: MOV (SP)+,R0 ;INDEXED REGISTER ---- "$DR " ; SUB INXTBL(R1),R0 ;GET ADDRESS AND COMPUTE OFFSET IN WORDS;# ASR R0 ;AND FINALLY IN PLAIN TALK  ADD #'0,R0 ;CONVERT TO ASCII# TYPE R0 ;TYPE OUT REGISTER NUMBERE ASR R1;/ MOVB INXREG(R1),R0 ;PICK UP THE REAL CHARACTERL BR 15$ ;GO PRINT REST OF IT050$: ;REF LABEL E .IFT  TST OPN ;IS A LOCATION OPEN? BEQ 60$ ;IF EQ NOO TYPE R0+R0 ;OUTPUT MODE INFO 60$: ;O E .ENDC 1, 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 BESTA BMI 80$ ;BUT NOT ALL THE TIME # MOV R1,(SP) ;SET THE DISPLACEMENTP' ADD #"0,,R0 ;PRINT REGISTER AND COMMA; TYPE R0+R0 ;DISK AND COREP%80$: MOV (SP)+,R0 ;PRINT R0 AS A WORDT%;TYPE R0 AS BYTE OR WORD, TWO ENTRIESF; FOR A WORD JSR PC,CADWN; FOR A BITE JSR PC,CADB1CADW: MOV R0,QUAN ;SET THE FAMOUS QUANTITY VALUEC MOV #6,R3 ;# OF DIGITS MOV #-2,R4 ;# OF BITS FIRST-38 BR CA01 ;DO THE COMMON THING+CADB: CLR QUAN ;SET FOR ALL OF QUAN A BYTEA00Zffe__DATADATADATADATA, MOVB R0,QUAN ;SET THE QUANTITY THING AGAIN# MOV #3,R3 ;THERE ARE THREE DIGITS  MOV #-1,R4 ;AND ONLY TWO BITS, SWAB R0 ;SWITCH ENDSCA01: MOV R0,-(SP) ;SAVE R0D110$: ADD #3,R4 ;COMPUTE THE NUMBER OF BITS TO DOT CLR R0 15$: ROL (SP) ;GET A BIT ROL R0 ;STORE IT AWAYD DEC R4 ;DECREMENT COUNTERD# BGT 15$ ;LOOP IF MORE BITS NEEDEDO ADD #'0,R0 ;CONVERT TO ASCII TYPE R0 ;TYPE IT" DEC R3 ;SEE IF MORE DIGITS TO DO BGT 10$ ;LOOP IF SO( MOVB #' ,R0 ;SET UP FOR TRAILING SPACE TST (SP)+ ;GET RID OF JUNK TYPE R0 ;A RETURN ;,  E3;TYPE CONTENTS OF WORD IN FORMAT JSR PC,@TYFORM(R1),";R0 WORD OR BYTE TO BE TYPED, RHJ ;R1 CODE- ENTRY PT, FORMAT, CODETYFORM: + CADB ;BYTE OCTAL - 0 + CADW ;WORD OCTAL - 2 + 30$ ;BYTE ANSII - 4R + 20$ ;WORD ANSII - 6R + 10$ ;RADIX 50 - 10 210$: JSR PC,TYRADX ;R0 GETS THE RADIX 50 TREATMENT$ BR 35$ ;APPEND A BLANK TO 3 CHAR'S20$: TYPE R0 ;TYPE BYTE IN R0 SWAB R0 ;SWAP EM AND TYPE IT30$: TYPE R0 ;TYPE BYTE IN R035$: TYPE 40 ;TYPE A SPACE0 RETURN ; /;TYPE CONTENTS OF R0 IN RADIX 50 JSR PC,TYRADXP'TYRADX: MOV #3,R5 ;COUNT OF CHARACTERSY* MOV #50$,R2 ;POINTER TO COEFFICENT TABLE" MOV R0,R1 ;COPY OF RADIX 50 WORD10$: MOV R1,R0 ; GET DIVIDEND MOV (R2)+,R1 ; GET DIVISORW2 JSR PC,$DIV ; DIVIDE, R0=QUOTIENT, R1 =REMAINDER" TST R0 ; IS QUOTIENT ZERO? (SP)? BEQ 12$ ;"SP" = 040D 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)T&14$: ADD #11,R0 ;16+11+11 = 40 + (SP)&16$: ADD #11,R0 ;11+11 = 22 + (.,0-9) TYPE R0 ;TYPE CHARACTER IN R0F DEC R5 ;COUNT THE CHARACTERS BNE 10$ ; LOOP RTS PCR#;COEFFICENT TABLE, RADIX 50 CONVERTE/50$: .WORD +1600.,+40.,+1. ;40.^2, 40.^1, 40.^0  M .PAGE> .SBTTL "I" AND "D" PROCESSOR - SET INSTR OR DATA DISPLAY MODE ;SYNTAX--D;I SET INSTR DISPLAY MODE4 B 1 .IF DF K$$DAS 7INSTM: MOVB #'I,DMODE ;SET FOR INSTRUCTION DISPLAY MODE: DECODE ;DECODE NEXT COMMAND A ;SYNTAX--A;D SET DATA DISPLAY MODE S 0DATAM: MOVB #'D,DMODE ;SET FOR DATA DISPLAY MODE DECODE ;DECODE NEXT COMMAND O .ENDC E2 .SBTTL "B" PROCESSOR - SET AND REMOVE BREAKPOINTS ;SYNTAX--V;B CLEAR ALL BREAKPOINTS;NB CLEAR BKPT N*;A;B SET BKPT AT A, USE FIRST FREE BKPT;A;NB SET BKPT N AT AT>;DEPENDS MIGHTILY UPON LOCATION "TRTC" CONTAINING A TRAP INST.2;AND THAT A FREE BKPT CONTAINS THE ADDRESS "TRTC".0SEBK: ASL R4 ;MPY R4 X2, JUST IN CASE ALL IS GO2 MOV #TRTC,R0 ;SET MAGIC VALUE IN R0, JUST IN CASE! TST R3 ;CHECK FOR THE REAL CASER( BEQ REMB ;REMOVAL CASES, CLEAR THEM UP BIT #1,R5 ;LOOK AT ADDRESS BNE ERR0 ;THAT'S ODD ?( TST R2 ;SEE IF I GET TO PICK IT OR NOT! BNE 15$ ;OR NOT, DISAPPOINTMENTA910$: CMP R0,ADR1(R4) ;LOOK FOR LOCATION WITH FREE ADDRESS  BEQ 15$ ;A HIT% TST (R4)+ ;KEEP AT FOR A LONG WHILET BR 10$ ;LOOOOOOOOP-15$: MOV R5,R0 ;R0 HAS ADDRESS OF BREAKPOINTS BR RE02 ;GO TUCK IT IN;REMOVE SOME BREAKPOINTS REMB: TST R2 ;SEE IF ONE OR ALL BEQ RALL ;ALL .RE02: JSR PC,SETBRK ;SET THE ONE SET UP TO SET BCC RALL2 ;IT HAPPENED$ERR0: ERROR ;SOME THING WENT WRONG;E; REMOVE ALL BREAKPOINTS; RALL: CLR R4 ;R4 IS ZERON!10$: JSR PC,SETBRK ;SET THEM TILLN BCC 10$ ;THEY GET OUTTAORALL2: DECODE ;HAND!!!!D; %; SUBROUTINE TO SET/CLEAR BREAKPOINTST;R.SETBRK: CMP #BKP,R4 ;LEGAL BREAKPOINT NUMBER? BLO 10$ ;IF LO NOF .IF DF M$$PRO BIT #1,SR0 ;MAPPING ENABLED ?E( BEQ 8$ ;IF EQ NO, CAN'T GET TO LOWCR'S .IF DF K$$DAS& BIT #4,SR3 ;KERNEL D-SPACE ENABLED ?( BEQ 8$ ;IF EQ NO, CAN'T GET TO LOWCR'S .ENDC ; DF K$$DAS, MOV KISAR6,-(SP) ;SAVE CURRENT EXEC MAPPING% MOV R0,-(SP) ;AND BREAKPOINT ADDRESSR( MOVB $NCPU,R0 ;GET NUMBER OF PROCESSORS ASL R0 ;CHANGE TO WORD INDEX05$: MOV $K6TAB-2(R0),KISAR6 ;REMAP TO NEXT LOWCR1 MOV (SP),140000+ADR1(R4) ;SET BREAKPOINT ADDRESSN0 MOV #1,140000+CT(R4) ;AND INITIAL PROCEED COU00ZfPfibjbkb a a aNT# SUB #2,R0 ;POINT BACK TO NEXT CPUQ BGT 5$ ;IF GT THERE IS ONE( MOV (SP)+,R0 ;RESTORE BRAKPOINT ADDRESS/ MOV (SP)+,KISAR6 ;RESTORE CURRENT EXEC MAPPING' BR 9$8$:S .ENDC ; DF M$$PRO( MOV R0,ADR1(R4) ;SET BRAEKPOINT ADDRESS) MOV #1,CT(R4) ;SET INITIAL PROCEED COUNTS)9$: TST (R4)+ ;ADVANCE BREAKPOINT NUMBER10$: RETURN ;T O6 .SBTTL "R" PROCESSOR - RELOCATION REGISTER PROCESSING;DETERMINE IF CLEAR OR SET/RELO: TSTB SMFD ;SEMI-COLON ABSENT MEANS CLEARD- BEQ 10$ ;CLEAR DISPATCH, OR FALL TO SETTING ;FORMS HERE--T; A;NR SET RELOC(N) TO A;ABSENT A OR N DEFAULTS TO 0! JSR PC,RTST ;PROTECTION EDITINGC% BCS ERR0 ;ILLEGAL REGISTER NUMBER ?. .IF DF M$$PRO M) BIT #1,SR0 ;MEMORY MANAGEMENT ENABLED ?V' BEQ 5$ ;IF EQ NO, CAN'T GET TO LOWCRS .IF DF K$$DAS) BIT #4,SR3 ;KERNEL DATA SPACE ENABLED ?O' BEQ 5$ ;IF EQ NO, CAN'T GET TO LOWCRSS .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 INDEX 93$: MOV $K6TAB-2(R0),KISAR6 ;MAP TO NEXT PROCESSORS LOWCR,5 MOV R5,140000+RELT(R4) ;AND SET RELOCATION REGISTERR) SUB #2,R0 ;POINT BACK TO NEXT PROCESSORR BGT 3$ ;IF GT MORE TO GO' MOV (SP)+,R0 ;RESTORE WORKING REGISTERW' MOV (SP)+,KISAR6 ;RESTORE EXEC MAPPINGE DECODE ;GO GET NEXT COMMAND5$: ;REF LABEL' .ENDC ; DF M$$PRO. MOV R5,RELT(R4) ;SET THE APPROPRIATE REGISTER DECODE ;GO GET NEXT COMMAND ;FORMS HERE--T#;R RESET ALL TO -1 FOR RELOC(0-7)S;NR RESET ONLY RELOC(N) !10$: TST R2 ;SEE IF NR OR JUST R  BEQ 15$ ;CLEAR ALL" JSR PC,RUCL ;CLEAR THE ONE IN R4% BCS ERR0 ;ERROR, INVALID REGISTER ?T DECODE ;NEXT COMMAND15$: JSR PC,RUAL ;DO THEM ALL DECODE ;OFF AND ONI;G.; SUBROUTINE TO RESET RELOCATION BASE REGISTER;D .ENABL LSB )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 NUMBERL10$: RETURN ;0;.; SUBROUTINE TO CLEAR ALL RELOCATION REGISTERS;N$RUAL: CLR R4 ;START WITH REGISTER 0/20$: CALL RUCL ;CLEAR NEXT RELOCATION REGISTER, BCS 10$ ;IF CS ALL DONED" INC R4 ;ADVANCE TO NEXT REGISTER BR 20$ ; .DSABL LSB  F/ .SBTTL EXPRESSION SETUP COMMANDS ( ; + - * , )B;SEMI-COLON PROCESSORB"SEMI: INCB SMFD ;COUNT SEMI-COLON( CMPB #2,SMFD ;PUSH CONTENTS INTO MULTI BNE SEM1 ;SEMI COLON ARG LISTR MOV R5,D.ARGS%SEM1: MOV R2,R3 ;PUSH R2 AND R4 INTON* MOV R4,R5 ;R3 AND R5 (FLAG AND CONTENTS) JMP NEWE ;CONTINUE SCANNER;ADDITION SETUPLPLUS: CLRB OP ;OP IS 0 FOR +: BR CO00;SUBTRACT SET UPMINS: MOVB #2,OP BR CO00;MULTIPLY BY 50 AND ADDA"STAR: MOVB #-2,OP ;OP IS -2 FOR *CO00: CLR R4 ;R4 IS RESET JMP NEWNC;MEMORY RELOCATION CHECKCOMM: ASL R4 ;ALL NEED IT X 2. CMP R4,#RLR ;SEE IF REGISTER IS OUT OF RANGE BGT ERR2O, MOV RELT(R4),EXP ;COMPUTE REAL CORE ADDRESS BR PLUSERR2: ERROR ;OOPSU R! .SBTTL MISCELLANEOUS SUBROUTINES ;(; TEST IF IN EXEC MODE;W9TESTM: MOV (R5)+,-(SP) ;PICK UP EXEC TRAP ROUTINE ADDRESSP( TST $STKDP ;ALLOW EXEC TO HANDLE TRAP?+ BGT 20$ ;IF GT YES, TRAP WAS IN USER MODEY$ BLT 10$ ;IF LT NO, BAD STACK DEPTH7 CMP 4(SP),#$DRLM1 ;TRAP OCCUR IN DIRECTIVE DISPATCHER?M BLO 5$ ;IF LO NO7 CMP 4(SP),#$DRLM2 ;TRAP OCCUR IN DIRECTIVE DISPATCHER?I .IF NDF D$$PARF( BLOS 20$ ;IF LO YES, PASS TRAP TO EXEC .IFF ; NDF D$$PAR BHI 5$ ;IF HI NO, CMP KINAR5,$DRAPR ;IS THE DISPATCHER MAPPED' BEQ 20$ ;IF EQ YES, PASS TRAP TO EXECT .ENDC ; NDF D$$PARK5$:C .IF DF D$$PAR/ CMP KINAR5,$DRAP2 ;2ND DIRECTIVE COMMON MAPPEDB% BNE 10$ ;IF NE NO, XDT HANDLES TRAPD .ENDC ; DF D$$PAR1 CMP 4(SP),#$DQLM1 ;TRAP OCCUR IN QIO DIRECTIVE ?  BLO 10$ ;IF LO NOM0 CMP 4(SP),#$DQLM2 ;TRAP OCCUR IN QIO DIRECTIVE?1 BLOS 20$ ;IF LOS YES, ALLOW EXEC TO HANDLE TRAP%10$: MOV R5,(SP) ;SET TO XDT ADDRESSC%20$: MOV (SP)+,R5 ;SET RETURN ADDRESSH RTS R5 ;PROCESS TRAP S00Zffe__DATADATADATADATA E.;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 CHUCK; BMI 20$ BEQ 10$ NEG R4 ;MINUS, OP=2I10$: ADD EXP,R4 ;PLUS, OP=0115$: MOV R4,EXP ;COMMON OUT, SET EXP TO WHATEVERS CLRB OP ;IS IN R4 TOOA$ INC R2 ;SET R2 SO THAT R4 IS, OP=0 RTS PC:320$: MOV EXP,-(SP) ;GET THE LEFT SIDE OF EXPRESSION  ASL (SP) ; MULTIPLY BY 10P ASL (SP) ; ASL (SP) ; ADD (SP),R4 ; ADD IT ASL (SP) ; MULTIPLY BY 40, ASL (SP) ; WHICH IS LIKE MULTIPLYING BY 50& ADD (SP)+,R4 ;AND ADD IT TO THE RIGHT BR 15$ ;COMMON OUT C %;BUILD AN OCTAL NUMBER JSR PC,GETNUM$;NEEDS AND RETURNS--#;R0 NON-OCTAL TERMINATING CHARACTERP;R2 OCTAL CHARACTER COUNTN$;R4 OCTAL NUMBER THAT I GOT, YOU GETGETNUM: CLR R2 ;NEW R2 AND R4 CLR R4 !10$: JSR PC,GET ;GET 1 CHARACTERS' CMPB #'0,R0 ;NON-OCTAL, LESS THAN "0"L BHI GETC99I' CMPB #'7,R0 ;NON-OCTAL, LESS THAN "7"A BLO GETC99 + BIC #177770,R0 ;MAKE INTO ACCEPTABLE RANGEP ASL R4 ; SHIFT LEFTI ASL R4 ; 3 BITS( ASL R4 ; ADD R0,R4 ;PLANT LO PLACE  INC R2 ;ACCOUNT FOR NEW ONE  BR 10$ ;NEXT ONE OR OTHER(;SCAN A LIST OF CHARACTERS JSR R5,LOOKUP;CALL--C; R0 HAS THE CHARACTER ; JSR R5,LOOKUP ;THAT IS IT (; + LIST TO USE, 00 BYTE IS END OF LIST;RETURNS AT CALL + 2 WITH--E;R0 STILL HAS CHARACTERP*;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 ONEP BNE 20$ ;RIGHT IT WASN'T' SUB (R5)+,R1 ;COMPUTE INDEX AND RETURN # ASL R1 ;DO THIS FOR EVERBODY, C=0O BR 30$ '20$: TSTB (R1)+ ;CHECK FOR END OF LIST # BNE 10$ ;IF NOT LOOK AT NEXT ITEMC+ TST (R5)+ ;END, AVOID ILLEGAL INSTRUCTIONO# SEC ;SECURITY EXCHANGE COMMISION0 30$: RTS R5 ;SECURITY ELSEWHERE A +3;GET CONTENTS OF ADDRESS IN THE MODE JSR PC,GETCAD2;NEEDS--;R0 THE MODE 1=BYTE, 2=WORD;CAD THE ADDRESSO;DEVI THE DEVICE CODE ;RETURNS--;R0 HAS THE DATA YOU ASKED FORP .IF DF K$$DAS  N&GETCAD: MOV SP,OPN ;SET LOCATION OPEN1 CALL GETIT ;READ WORD OR BYTE FROM PROPER SPACE $ MOV (SP)+,R0 ;RETRIEVE WORD OR BYTEGETC99: RTS PC ;  .IFFA E&GETCAD: MOV CAD,R3 ; GET CORE ADDRESS MOV SP,OPN ; SET LOCATION OPEN% ASR R0 ;PUSH BW FLAG INTO CARRY BITI! BCC 10$ ;2 WON'T FIT SO IS WORD  MOVB (R3),R0 ;ACCESS BYTEC BR GETC9910$: MOV (R3),R0 ;ACCESS WORDGETC99: RTS PC ;STACK ACCESSV T .IFTF/;PUT R4 INTO ADDRESS IN THE MODE JSR PC,PUTCADO;NEEDS--.;R2 CONTENT FLAG, 0 FOR NONE, ELSE R4 IS GOLD ;R4 THE DATA .;BW THE MODE FLAG, IF 0 THEN NO LOCATION OPEN .IFTR R(PUTCAD: MOV BW,R0 ;PICK UP MODE AN CC'S1 CALL GETIT ;READ WORD OR BYTE FROM PROPER SPACES TST R2 ;CHECK FOR TYPED VALUEN BEQ 12$ ;NO DATA) TST OPN ;IS A LOCATION OPEN AT PRESENT?T BEQ 12$ ;NOT OPENR BIT #177776,R0 ;CHECK MODEC BNE 5$ ;WORD MODE  MOVB R4,(SP) ;WRITE THE DATA A BIT #1,CAD ;HIGH BYTE? BEQ 10$ ;IF EQ NOI& 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?F BNE 11$ ;IF NE YES) MTPI (R3) ;WRITE WORD BACK TO I SPACE E BR 12$ ; R+11$: MTPD (R3) ;WRITE WORD BACK TO D SPACEA$12$: MOV (SP)+,R4 ;RETURN DATA IN R4 RTS PC ; T .IFF Q%PUTCAD: MOV CAD,R3 ;GET CORE ADDRESSK TST R2 ;CHECK FOR TYPED VALUE " BEQ 12$ ;NO DATA NO DODO ;**-1! MOV BW,R0 ;PICK UP MODE AN CC'SQ* TST OPN ; IS A LOCATION OPEN AT PRESENT? BEQ 12$ ;NOT OPEN NOT STORED$ BIT #177776,R0 ;CHECK MODE ;**-1 BNE 10$ ;WORD MODE MOVB R4,(R3) ;BYTE MODE BR 12$ ;BRANCH MODEM10$: MOV R4,(R3) ;WORD MODE%12$: BIC #1,R3 ;INSURE EVEN ADDRESS , MOV (R3),R4 ;READ WORD FROM OPEN LOCATION RTS PC ; ;**-1 .IFTF;GET WORD FROM PROPER SPACED O;NEEDS-- ;R0 BW FLAG S ;RETURNS--.;R1 0 IF 00Zf[fibjbkb a a aDATA FROM I SPACE, 1 IF FROM D SPACE0;R3 CURRENT ADDRESS FROM CAD WITH LOW BIT CLEAR N .IFTA C'GETIT: MOV CAD,R3 ;GET CURRENT ADDRESSE BIC #1,R3 ;CLEAR LOW ORDER BIT) MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESSV CLR R1 ;ASSUME I SPACE  TSTB REGFL ;REGISTER ACCESS?" BNE 10$ ;IF NE YES, USE D SPACE ! CMPB DMODE,#'D ;IN D SPACE MODE?  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 NOS# SWAB (SP) ;REVERSE BYTES ON STACKI030$: MOV (SP)+,2(SP) ;PLACE WORD IN PROPER PLACE RETURN ;N D S6;SET KERNEL I-SPACE DESCRIPTOR REGISTERS TO READ/WRITE I;NEEDS--;R0R!;CALLED ONLY FOR I/D SPACE SYSTEMT ;RETURNS-- R'SETRW: BIT #1,SR0 ;MAPPING ENABLED YETC BEQ 20$ ;NO,+ BIT #4,SR3 ;KERNEL DATA SPACE ENABLED YET BEQ 20$ ;NOA2 MOV #KINDR0,R0 ;POINT TO KERNEL INSTR DESCR REG 0(10$: BIS #4,(R0)+ ;SET RW ACCESS FOR XDT CMP R0,#KINDR7 ;DONE YETE BLOS 10$ ;NO20$: RETURN ;A S  .ENDC T O);SELECT RELOCATION REGISTER JSR PC,LOCAI!;CAD ADDRESS TO USE IN SELECTION ;RETURNS--.;R0 REGISTER NUMBER FOUND, -1 IF NONE FOUND";R1 DISTANCE, RELOCATION FACTOR;;SUBROUTINE TO LOCATE RELOCATION REGISTER NEAREST BUT STILLN5;BELOW THE ADDRESS IN CAD. RETURNS WITH THE REGISTERP9;NUMBER IN R0, AND WITH THE DISTANCE BETWEEN THE REGISTER ;AND (CAD) IN R1+;IF NO GOOD RELOC. REG. FOUND, R0 WILL = -1X LOCA: CLR R0, MOV #-1,-(SP) ;INITIALIZE RELOC. REG. INDEX2 MOV (SP),R1 ;INITIALIZE DISTANCE TO A HIGH VALUE)10$: CMP R0,#RLR ;ARE WE DONE COMPARING?I BHI 20$ ;BRANCH IF DONE. CMP RELT(R0),R4 ;IS CURR. RELOC. BIAS > (R4)?4 BHI 15$ ;IF SO, BRANCH -- DON'T SUBTRACT, GET NEXT* MOV R4,R2 ;OTHERWISE TAKE THE DIFFERENCE. SUB RELT(R0),R2 ;OF CURR. RELOC. REG. AND CAD/ CMP R1,R2 ;IS THE RESULT THE SMALLEST SO FAR?T/ BHI 25$ ;BRANCH IF YES (UNSIGNED CONDITIONAL) 815$: TST (R0)+ ;OTHERWISE, BUMP R0 FOR NEXT RELOC. REG.' BR 10$ ;LOOP BACK FOR NEXT COMPARISONV"20$: MOV (SP)+,R0 ;PUT REG.# IN R0 RTS PC ;JOB OVER, RETURN425$: MOV R2,R1 ;REMEMBER SMALLEST DIFFERENCE IN XXY( ASR R0 ;AND ASSOCIATED REGISTER NUMBER MOV R0,(SP) ; IN (SP) & ASL R0 ;RESTORE R0 TO ORIGINAL VALUE BR 15$ ;GO FO NEXT COMPARISON. .ENDC ;DF X$$DBT2 .IIF DF X$$DBT .END $XDT .IIF NDF X$$DBT .ENDE T THE SMALLEST SO FAR?T/ BHI 25$ ;BRANCH IF YES (UNSIGNED CONDITIONAL) 815$: TST (R0)+ ;OTHERWISE, BUMP R0 FOR NEXT RELOC. REG. .TITLE CODRVP .IDENT /03.00/M; O1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.O; All rights reservedV;,; 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.; O6; 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$; MODIFIED FOR RSX-11M-PLUS V4.1 BY:;T; ; L. KOGAN 20JAN-88 03.00 ; ,; LK732 -- SAVE R1,R2 BEFORE CALLING $IOFIN; ; MACRO CALLSF;A* .MCALL ABODF$,HWDDF$,PKTDF$,TCBDF$,UCBDF$# ABODF$ ; DEFINE TASK ABORT CODESC% HWDDF$ ; DEFINE HARDWARE REGISTERSA% PKTDF$ ; DEFINE I/O PACKET OFFSETSA- TCBDF$ ; DEFINE TASK CONTROL BLOCK OFFSETS UCBDF$ ; DEFINE UCB OFFSETS;T; DRIVER DISPATCH TABLEB;I DDT$ CO,1,NONE V;+#; **-COINI-CONSOLE DRIVER INITIATOR;C; EXAMINE FUNCTION CODE. IO.WLB PACKETS ARE QUEUED TO COT'S PACKET ?; QUEUE. THE TERMINAL DRIVER IS REQUESTED TO PROC00[f\fe__DATADATADATADATAESS 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 CALLR $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 LAST30$: MOV R1,-(SP) ; SAVE R1 MOV R2,-(SP) ; SAVE R2# CALL $IOFIN ; FINISH I/O REQUESTO MOV (SP)+,R2 ; RESTORE R2C MOV (SP)+,R1 ; RESTORE R1  BR 10$ ; GO AGAIN>40$: MOV U.RED2(R5),R5 ; IS THERE A DEFAULT CONSOLE TERMINAL? BEQ EXIT ; NO - CONTINUE 3 JMP $IOKIL ; YES- KILL ANY I/O WHICH CODRV MIGHTO ; HAVE GIVEN TO TTDRV.;+ ; **-COOUT - TIMEOUT ENTRY POINT;?; COT SETS S.CTM, THE CURRENT TIMEOUT COUNT, WHEN IT CONTAINS ATA; PARTIALLY FILLED LOGFILE BUFFER. WHEN THE COUNT EXPIRES, CODRVVC; INFORMS COT THAT IT IS TIME TO FLUSH THIS BUFFER TO THE LOGFILE. ;V; INPUTS: R5 = UCB ADDRESS(; R4 = SCB ADDRESS ;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 ATA; PARTIALLY FILLED LOGFILE BUFFER. WHEN THE COUNT EXPIRES, CODRVVC; INFORMS COT THAT IT IS TIME TO FLUSH THIS BUFFER TO THE LOGFILE. ;V; INPUTS: R5 = UCB ADDRESS(; R4 = SCB ADDRESS ;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 TH .TITLE CRDRVX .IDENT /09.00/E;T1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A..; All rights reservedE;T;N<; 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 3-MAR-74 ;P; MODIFIED FOR M-PLUS V2.0 BY:; ; A. GROUPE ; P. J. CARR;U; MODIFIED BY:; ; P. J. CARR 10-FEB-82 08.01;=$; PJC044 -- CORRECT DETACH FUNCTION; ; P. J. CARR 8-APR-82 08.02 ;3; PJC050 -- CHECK FOR CARD DO00\ffibjbkb a a aNE CONDITION IN CRINTD; ; P. J. CARR 2-JUN-82 08.03 ;54; PJC057 -- CORRECT PROCESSING OF PICK CHECK ERRORS;T; 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= 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 .BY00\ffe__DATADATADATADATATE 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 INITIATED. ;- .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(R400\ffibjbkb a a a) ;;;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 ;SET 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 00\ffe__DATADATADATADATA& 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 TRANSLATE 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 (A00\ffibjbkb a a 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 LSB; 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 TTCIS .IDENT /05.04/;0; Copyright (c) 1995-1999 by Mentec Inc., U.S.A.; 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.;;; 23-JAN-78 PETER WANNHEDEN;; PREVIOUSLY MODIFIED BY:;; P. WANNHEDEN ; C. F. SPITZ; D. R. DONCHIN;; MODIFICATIONS:;!; DD158 12-OCT-82 DALE R. DONCHIN<; DISALLOW INPUT PROCESSING CONCURRENT WITH FORK PROCESSING;; S. C. ADAMS 24-OCT-83 5.01&; SA135 -- REFERENCE U.TFRQ AS A WORD; ; 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; D. Carroll 15-Feb-1993 05.041; DC127 -- Insure we are at device priority when3; aquiring the UCB fork queue lock on mP systems ;F;+D; CONTROLLER INDEPENDENT ROUTINES TO SET UP FOR INTERRUPT PROCESSING; AND TO QUEUE A FORK REQUEST.;-;S;G .MCALL UCBDF$,SCBDF$R UCBDF$ ,,TTDEF. SCBDF$  O .IF DF R$$MPL 5 .MCALL KRBDF$ Q KRBDF$D  .ENDC ;R$$MPL J .PSECT MAP5;2;-;+*; TTSET - COMMON INTERRUPT SET UP ROUTINE.;D; INPUT:; R2 SAVED BY CALL (JSR R2)./; POINTS TO POINTER TO CTB POINTER. (RSX-11M+)7'; POINTS TO CONTROLLER TYPE. (RSX-11M); 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;G;; 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 00]f^f_f__DATADATADATADATA2, 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-R6; 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 ;;;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 TTOIS  .IDENT /05.04/ ;E1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.N; All rights reserved;;B;O<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;B;S; 23-JAN-78 PETER WANNHEDEN ;I; PREVIOUSLY MODIFIED BY:U;I; P. WANNHEDEN; D. R. DONCHINU ; T. LEKAS;C; MODIFICATIONS:; ; D. R. DONCHIN 05-JUN-83 05.01 ,; DD173 -- FIX MINOR PROBLEMS IN DHV11 CODE;U; D. R. DONCHIN 14-SEP-83 05.02R ; DD179 -- ADD HOSTSYNC SUPPORT;E; S. C. ADAMS 23-APR-84 05.03M4; 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_ffibjbkb a a aB #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_g`gf__DATADATADATADATA .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;T1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.:; All rights reservedA;1;-<; 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` ga gibjbkb a a aESTORE 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 TTCT .IDENT /02.01/R;S1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.L; All rights reservedT;R;OA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDTA; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE A; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISA; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR.A; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND)1; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED. ;.A; 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;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;;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$ ;TR00aggf__DATADATADATADATAY 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 THEY 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 CHARACTERB00ag gibjbkb a a a;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. ,; AT 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 CHARA00a!ggf__DATADATADATADATACTER 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 CLOCK 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:: ;INPUT INTERRUPT SERVICE ROUTINE00b)g gibjbkb a a a .TITLE XMDRV  .IDENT /04.1/;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.-; All rights reserved;<; 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.;T?; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUTo7; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BYh ; 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 DRIVER 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); LISTHE00b1ggf__DATADATADATADATAAD 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. .IFF0XLADDR=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(00b9g gibjbkb a a aR4) ;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;+; TERMINATE (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-4R00bAggf__DATADATADATADATA 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 MOV #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 EIT00bIg gibjbkb a a aHER "#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)+,6(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; 00bQggf__DATADATADATADATARECEIVE 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 #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 00bYg gibjbkb a a aTHRU 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;+; **-XMTMO-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 00baggf__DATADATADATADATA 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 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 00bigdnhibjbkb a a aLOAD 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 TURNED OFF.H;A;W ; IN .TITLE TTMIS  .IDENT /04.01/O;I1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.N; All rights reservedA;O;T<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;L;E; 23-JAN-78 PETER WANNHEDEN;; PREVIOUSLY MODIFIED BY:T;D ; C. F. SPITZ; D. R. DONCHINT;; MODIFICATIONS:;D; S. C. ADAMS 18-MAY-85 04.01S; SA381 -- MOVE TO MAP5.6;O; ;+0; COMMON MULTIPLEXER INTERRUPT SERVICE ROUTINES.,; USED BY FOLLOWING CONTROLLERS: DH, DJ, DZ.;-;y;h c .IF DF T$$MUX e .MCALL UCBDF$,SCBDF$  h .IF DF R$$MPL T .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;T;D;+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,R5 ;;;00dtheuhf__DATADATADATADATAGET 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,R5 ;;; .TITLE TTUS .IDENT /01.00/R;;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.R; All rights reservedP;;<; 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;R; MODIFICATIONS:;A;+/; STUB PORT DRIVER FOR USER-WRITTEN PORT DRIVER;; E; THIS MODULE PROVIDES THE INTERFACE BETWEEN TTDRV AND A USER-WRITTEN; PORT DRIVER:;NB; 1. IN THE CONTROLLER ON-LINE CODE, INITIALIZE CELLS IN THE USER 7; PORT TO CONTAIN ADDRESSES OF TTDRV'S ENTRY POINTS.,;cM; 2. IN THE INPUT AND OUTPUT SERVICE ROUTINES, PERFORM GENERAL TTDRV SERVICESA; ?; 3. CALL THE APPROPRIATE ROUTINE IN THE PORT DRIVER VIA $MPPROM; ;- .IF DF T$$USP  .MCALL KRBDF$ A .MCALL HWDDF$,UCBDF$,PRTDF$# HWDDF$ ;DEFINE HARDWARE SYMBOLST UCBDF$ ;DEFINE UCB SYMBOLS$ PRTDF$ ;DEFINE USER PORT OFFSETS KRBDF$ ;DEFINE KRB SYMBOLS3.IIF NDF R$$MPL, .ERROR ;SUPPORTED ONLY ON M-PLUSLB.IIF NDF R$$CON, .ERROR ;SOME OF THE OFFSETS THAT FOLLOW REQUIRE/ ;THIS TO BE A SYSTEM WITH RECONFIGURATION.R;R ; LOCAL DATA;G .PSECT MAP5 .PAGE .SBTTL RESUME OUTPUT;+; USRESX - RESUME OUTPUT.V;$; 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.;R; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.TOC 0 ; U.TTOC 0O;-USABOX::+ MOV #P.RABO+120000,R0 ;SET UP USER ADDRESSR. CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL STOP OUTPUT;+!; USSTOX - STOP (SUSPEND) OUTPUT. ;U; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S1.CTS 1V;-USSTOX::+ MOV #P.RSTO+120000,R0 ;SET UP USER ADDRESSC. CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER .SBTTL POWER UPA;+; USPWUP - POWER-UP.;E; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USCPUP::+ MOV #P.RCPU+120000,R0 ;SET UP USER ADDRESSE. 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 DESTROYEDT;-USCONL::1 MOV KISAR6,-(SP) ;SAVE THE CURRENT APR6 MAPPING # MOV K.OWN(R2),R5 ;GET UCB ADDRESSB# MOV U.DCB(R5),R1 ;GET DCB ADDRESSR# MOV D.PCB(R1),R1 ;GET PCB ADDRESS ; MOV P.REL(R1),KISAR6 ;MAP TO USER TO PLUG IN OUR ADDRESSESM% MOV #140000,R0 ;SET UP USER ADDRESSS3 ADD @#140000+P.ROFF,R0 ;ADD OFFSET TO TTDRV TABLE.2 TST P.TTII(R0) ;HAS IT ALREADY BEEN INITIALIZED? BNE 10$ ;BR IF INIT. ALREADY;I!; FILL IN TT: DRIVER ENTRY POINTS-;E( 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-LINEK CALLR MAPUSR ;AND CALL USER .PAGE .SBTTL UNIT ON-LINE;;+; USUONL - UNIT ON-LINE0;+; 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 USERA .SBTTL UNIT POWER-UP;+; USUPUP - UNIT POWER-UP.P;I; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; R0 AND R1 ARE DESTROYED ;-USUPUP::+ MOV #P.RUPU+120000,R0 ;SET UP U00e|hfhibjbkb a a aSER ADDRESSL- CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USER. .SBTTL MODEM TIMER;+; USMTIM - MODEM TIMER.;N; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-USMTIM::+ MOV #P.RMTI+120000,R0 ;SET UP USER ADDRESSR- CALLR MAPUS1 ;AND CALL ROUTINE TO CALL USERB .PAGE .SBTTL CONTROLLER OFF-LINE;+; USCOFF - CONTROLLER OFF-LINE;2; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; R0 AND R1 ARE DESTROYED;-USCOFF::1 MOV KISAR6,-(SP) ;SAVE THE CURRENT APR6 MAPPINGE# MOV K.OWN(R2),R5 ;GET UCB ADDRESSM# MOV U.DCB(R5),R1 ;GET DCB ADDRESSN# MOV D.PCB(R1),R1 ;GET PCB ADDRESSD; MOV P.REL(R1),KISAR6 ;MAP TO USER TO PLUG IN OUR ADDRESSES.% MOV #140000,R0 ;SET UP USER ADDRESSC3 ADD @#140000+P.ROFF,R0 ;ADD OFFSET TO TTDRV TABLEE( CLR (R0) ;INDICATE CONTROLLER HAS NOT ;BEEN INITIALIZED' MOV (SP)+,KISAR6 ;RESTORE OUT MAPPINGA+ 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;C; 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 USERD .PAGE( .SBTTL INPUT INTERRUPT SERVICE ROUTINE;+"; INPUT INTERRUPT SERVICE ROUTINE.;-$USINP::'; TTSET$ US ;;;SAVE R2, R3 AND SET UP:R ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS%; MOV K.OWN(R4),R5 ;;;GET UCB ADDRESST CALL MAPD R+ CALLR ICHAR1 ;;;DO COMMON INPUT CHARACTERO ;;;PROCESSING AND RETURN .PAGE) .SBTTL OUTPUT INTERRUPT SERVICE ROUTINED;+"; OUTPUT INTERRUPT SERVICE ROUTINE;- ,$USOUT::'; TTSET$ US ;;;SAVE R2, R3 AND SET UP:U ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS$ MOV K.OWN(R4),R5 ;;;GET UCB ADDRESS .PAGE .SBTTL START OUTPUT;+; USSTAX - START OUTPUT.;R; 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;T; 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 ROUTINEA .PAGE .SBTTL LOCAL SUBROUTINES ; ; LOCAL SUBROUTINESE;E .PAGE;+/; MAPUSR - MAP TO AND CALL THE USER SUBROUTINE.R;DF; INPUT: R0 - OFFSET IN THE USER'S CODE OF THE ROUTINE TO BE CALLED; R5 - UCB ADDRESS; ; R1 IS DESTROYEDH?; DATA APR5 IS DESTROYED FOR THE USER ROUTINE BY $MPPRO BUTT%; RESTORED LATER FOR TTDRV'S USE.F;-MAPUS1:E, SUB #U.TSTA,R5 ;ADJUST BACK TO START OF UCBMAPUSR:0" 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 APPLICATIONE. MOV R0,-(SP) ;SET UP VIRTUAL ADDRESS FOR USER6 CALL $MPPRO ;USE EXEC ROUTINE TO MAP IT AND CALL IT RETURN ;BACK TO CALLERO .ENDC ;T$$USP  .END- UCB ADDRESS; ; R1 IS DESTROYEDH?; DATA APR5 IS DESTROYED FOR THE USER ROUTINE BY $MPPRO BUTT%; RESTORED LATER FOR TTDRV'S USE.F;-MAPUS1:E, SUB #U.TSTA,R5 ;ADJUST BACK TO START OF UCBMAPUSR:0" 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 APPLICATIONE. MOV R0,-(SP) ;SET UP VIRTUAL ADDRESS FOR USER6 CALL $MPPRO ; .TITLE TTODNE .IDENT /06.01/L;T1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reserved; ;1<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;A;1; 30-JAN-78 PETER WANNHEDENA;T; PREVIOUSLY MODIFIED BY:M;U; P. WANNHEDEN; D. R. DONCHINV ; T. LEKAS ; S. ADAMS;E;; MODIFIED BY:;); L. KOGAN 06-JUN-85 05.06*; LK608 -- FIX ^R PROCESSING AFTER IO.WBT;S; L. KOGAN 02-NOV-85 06.0100fhuhf__DATADATADATADATA5; LK705 -- MAKE 11M AND 11M+ TTDRV MODULES IDENTICAL ;5 .PSECT MAP5.6;,;+!; ODONE - OUTPUT DONE PROCESSING.1; ; INPUT:; R5 POINTER TO U.TSTA;C ; OUTPUT:Y&; THE DATABASE IS UPDATED AS REQUIRED.,; ANOTHER OUTPUT OPERATION MAY BE INITIATED.;N; REGISTERS ALTERED: R2,R3,R4V;-;M;F .ENABL LSB;..SBTTL ODONE - OUTPUT DONE; EODONE:: BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT INTERRUPT UNEXPECTED?0+ ;;;(COULD HAPPEN FOR EXAMPLE IF WE COMEW! ;;;HERE WHEN ABORTING OUTPUT) BNE 40$ ;;;Y - JUMPD ASSUME US.OIU,1. INCB U.STS-U.TSTA(R5) ;;;NOW IT IS UNEXPECTED10$: ;;;REFERENCE LABEL .IF DF T$$SPL5 MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;;;MAP UCBX AND TABUF . MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPL.$ MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX1 BEQ 40$ ;;;NONE - JUMP (THIS CAN ONLY HAPPEN IFO( ;;;WE COME HERE TO DO A SPECIAL ECHO ;;;SUCH AS BELL) .IFTF ;T$$SPL& CLRB U.TOTI(R4) ;;;CLEAR OUTPUT TIMER$ TST U.TCO(R4) ;;;DOING TASK OUTPUT? BNE 20$ ;;;Y - JUMP* BIT #S2.BEL,2(R5) ;;;BELL ECHO REQUESTED? BNE BELL1 ;;;Y - JUMP:. ASSUME S1.OBY,100 ;S1.OBY MUST BE IN LOW BYTE$ BICB #S1.OBY,@R5 ;;;SET OUTPUT FREE ASSUME S1.IBY,200 BPL CFGRQ ;;;INPUT FREE - JUMP< TSTB U.TISV(R4) ;;; CHECK IF IN THE MIDDLE OF ^R PROCESSING2 BNE LK1 ;;; YES GOTO FINISH ECHOING INPUT BUFFER. BIT #S1.DSI,@R5 ;;;INPUT PROCESSING DISABLED? BNE 40$ ;;;Y - JUMP.5LK1: CALL ECHD1 ;;;INPUT BUSY - ENTER INPUT ROUTINES ;;;FALL THRU TO "NXTIC"O.PAGE>.SBTTL NXTIC - GET NEXT INPUT CHARACTER FROM TYPE-AHEAD BUFFER;;+:; NXTIC - GET NEXT INPUT CHARACTER FROM TYPE-AHEAD BUFFER.; ; INPUT:; R5 POINTER TO U.TSTA; ; OUTPUT:M<; IF A CHARACTER CAN BE OBTAINED FROM THE TYPE-AHEAD BUFFER,8; AND THE CHARACTER CAN BE PROCESSED, IT IS REMOVED FROM7; THE TYPE-AHEAD BUFFER AND ICHAR2 IS CALLED TO PROCESS5; THE CHARACTER.;D?; IF THERE IS CURRENTLY AN IO.RSD OUTSTANDING GET THE CHARACTER-(; FROM THE APPROPRIATE TYPEAHEAD BUFFER.;N; ELSE A RETURN IS EXECUTED.;-;X;NNXTIC::C .IF DF B$$MAP2 ASSUME B$$MAP,1 ;;;THERE CAN ONLY BE ONE TERMINAL% ;;;THAT SUPPORTS IO.RSD CURRENTLY . 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 TABUF4 BCS 15$ ;;;IF CS, NONE THERE...CHECK INPUT TIMEOUT" CALL IPROC ;;;CAN WE PROCESS IT? BCS 40$ ;;;N - RETURN / CALL RCTAB ;;;Y - REMOVE CHARACTER FROM TABUFB&11$: CALL ICHAR2 ;;;PROCESS CHARACTER BR NXTIC ;;;LOOP .IF DF B$$MAP;=; R4 CONTAINS THE I/O PACKET ADDRESS OF AN IO.RSD FROM RSDPRC ;P-12$: MOV I.PRM+10(R4),R2 ;;;GET THE DATA TYPE ASL R2 ;;;MAKE IT A WORD INDEX8 MOV T.RSDT(R2),R2 ;;;GET THE ADDRESS OF THE APPROPRIATE ;;;TYPEAHEAD BUFFER;; >; GET THE CHARACTER, IF ANY, FROM THE SPECIAL TYPEAHEAD BUFFER;T% INC R2 ;;;POINT TO RETRIEVE POINTER? TSTB 1(R2) ;;;BUFFER EMPTY?L9 BEQ 40$ ;;;Y - NO MORE CHARACTERS, TRY NORMAL TYPEAHEADA& MOVB (R2),R3 ;;;GET RETRIEVE POINTER+ INCB (R2) ;;;UPDATE THE RETRIEVAL POINTERH CMPB (R2),2(R2) ;;;WRAP-AROUND? BNE 13$ ;;;N - JUMP:3 CLRB (R2) ;;;Y - RESET POINTER TO START OF BUFFER;*13$: DECB 1(R2) ;;;DECREMENT ACTIVE COUNT ADD #3,R2 ;;;POINT TO THE DATA2 ADD R2,R3 ;;;POINT TO NEXT CHARACTER TO RETRIEVE CLR R2 ;;;PREPARE FOR BISB3 BISB (R3),R2 ;;;PUT THE CHARACTER IN THE LOW BYTE $ BR 11$ ;;;GO PROCESS THE CHARACTER .ENDC ;B$$MAP; K; THERE IS NOTHING IN THE TYPEAHEAD BUFFER. SEE IF WE NEED TO TIME-OUT THER; INPUT REQUEST.;T15$:= BIT #S5.ITI,U.TST5-U.TSTA(R5) ;;;IMMEDIATE TIMEOUT ON INPUT? ! BEQ 40$ ;;;IF EQ, NO...ALL DONES .IF DF T$$SPL# MOV #120000,R4 ;;;SET UCBX POINTERM .IFF ;T$$SPL, MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX POINTER BEQ 40$ ;;;IF EQ, NONE...EXITE .ENDC ;T$$SPL ASSUME U.TCI,0S6 TST (R4) ;;;IS THERE A CURRENT INPUT REQUEST PACKET? BEQ 40$ ;;;IF EQ, NO...GIVE UP) TST @(R4) ;;;IS THERE ALREADY A STATUS?  BNE 40$ ;;;B00fhhibjbkb a a aR IF YES. MOV #IS.TMO,@(R4)+ ;;;SET A COMPLETION STATUS6 CALLR IDONE ;;;COMPLETE INPUT REQUEST WITH A TIMEOUT.PAGE D.SBTTL CFGRQ - CONDITIONALLY FORK TO GET A REQUEST PACKET FROM QUEUE;#;+@; CFGRQ - CONDITIONALLY FORK TO GET A REQUEST PACKET FROM QUEUE.;,; INPUT:; R5 POINTER TO U.TSTA;I ; OUTPUT:.>; IF THERE IS A PACKET IN THE QUEUE THAT MAY BE PROCESSED NOW,3; A FORK REQUEST IS QUEUED TO GET A REQUEST PACKET. ;-;.;V%CFGRQ:: CALL TSTRQ ;;;TEST I/O QUEUE / ;;;RETURN IF NOTHING WORTH FORKING IN QUEUER* MOV #FR.GRQ,R3 ;;;FORK/GET REQUEST PACKET BR 30$ ;;;;UD20$: MOV #FR.ORD,R3 ;;;FORK/OUTPUT REQUEST DONE (AT LEAST PARTIALLY)&30$: CALLR FORK ;;;QUEUE FORK REQUEST; ;R.SBTTL BELL - OUTPUT A BELL ;E;+; BELL - OUTPUT A BELL.;N; INPUT:; R5 POINTER TO U.TSTA;U ; OUTPUT:F6; IF ECHO IS SUPPRESSED, IMMEDIATE RETURN (NO ACTION).3; ELSE A BELL IS OUTPUT IF POSSIBLE, OR FLAGGED FORT; OUTPUT AT FIRST OPPORTUNITY.; ; REGISTERS ALTERED: R2,R3,R4R;-;T;G(BELLL:: CALL LOCKI ;LOCK OUT INTERRUPTS*BELL:: BIT #S1.RNE,@R5 ;;;ECHO SUPPRESSED? BNE 40$ ;;;Y - RETURNF;/;P6; IF TRANSMITTER IS FREE, THE SPECIAL ECHO IS STARTED.3; IF TRANSMITTER IS BUSY, THE FLAG IS SET IN U.TSTAB1; TO FORCE THE SPECIAL ECHO AT FIRST OPPORTUNITY.:; ;P BIS #S2.BEL,2(R5) ;;;SET CR? BIT #S1.DSI!S1.OBY,@R5 ;;;OUTPUT BUSY OR FORK PROCESSING BUSY?E BEQ 10$ ;;;NEITHER - DO IT NOW;GM; A SPECIAL ECHO MAY BE DELAYED BECAUSE FORK PROCESSING IS BUSY (S1.DSI SET).-;T40$: RETURN ;;;Y - WAITL; .DSABL LSBS;E;:+BELL1: BIC #S2.BEL,2(R5) ;;;CLEAR BELL FLAG$& MOV #ASBELL,R3 ;;;POINT TO BELL CHAR./ BR ECHCHR ;;;GO AND OUTPUT A SINGLE CHARACTERA;I;R.PAGEY4.SBTTL ECHSTR, ECHCHR - ECHO A STRING OR A CHARACTER; ;+; ECHSTR - ECHO A STRING.;S; INPUT:; R2 STRING LENGTH; R3 POINTER TO THE STRING; R4 POINTER TO UCBX; R5 POINTER TO U.TSTA;I; ALTERNATE ENTRY - ECHCHR:; SAME AS ECHSTR, BUT PRESETS R2 TO 1 TO ECHO 1 CHARACTER.; ALTERNATE ENTRY - ECHRLR?; SAME AS ECHCHR, BUT LOCKS OUT INTERRUPTS BEFORE THE OPERATIONR&; AND ALLOWS INTERRUPTS BEFORE RETURN.;P; REGISTERS ALTERED: R2,R3,R4 ;-;N;U(ECHRL:: CALL LOCKI ;LOCK OUT INTERRUPTS'ECHCHR::MOV #1,R2 ;;;STRING LENGTH = 1A .IF DF T$$ACD, BR ECHSTR ;;;SET UP UCBX FOR BUFFERED ECHO=MECHO:: BIC #S2.OBF,2(R5) ;;;INDICATE NON-BUFFERED MULTI-ECHOX. CLR U.TFOB(R4) ;;;SET EMPTY MULTI-ECHO BUFFER$ ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2) BR ECHSET ;;;SET UP UCBX FOR MULTI-ECHO ;ECHSTR::BIS #S2.OBF,2(R5) ;;;SET UP UCBX FOR NON-MULTI-ECHOF ADD #U.TOP,R4 ;;;POINT TO U.TOP .IFF 'ECHSTR::ADD #U.TOP,R4 ;;;POINT TO U.TOP, .IFTF! CLR (R4)+ ;;;U.TOP <-- 0 (ECHO)U2ECHSET: MOV R3,(R4)+ ;;;U.TOP+2 <-- BUFFER ADDRESS ASSUME U.TOC,U.TOP+4$ MOV R2,@R4 ;;;U.TOC <-- BYTE COUNT! BR STARTX ;;;START TRANSMISSION;;D;T;+*; STARTX - START TRANSMISSION OF A BUFFER.;E; INPUT:; R5 POINTER TO U.TSTA; U.TOP+2 BUFFER ADDRESS; U.TOC BYTE COUNT; 5; CALLS CONTROLLER-DEPENDENT ROUTINE TO START OUTPUT.U+; NOTE - MUST BE CALLED ON DEVICE PRIORITY!;;NC; ALTERNATE ENTRY: STAXL - START TRANSMISSION OF A LIST OF BUFFERS..;F; INPUT:; R4 POINTER TO UCBX; R5 POINTER TO UCB3'; U.TFOB POINTER TO FIRST OUTPUT BUFFERS8; EACH BUFFER CONTAINS A LINK TO THE NEXT BUFFER IN THE1; FIRST WORD, AND BYTE COUNT IN THE SECOND WORD.T;X; REGISTERS ALTERED: R2,R3,R4E;-;;N-STAXL:: MOV U.TFOB(R4),R2 ;;;GET FIRST BUFFERA ADD #U.TOP,R4 ;;;POINT TO U.TOP% CALL UPUB ;;;SET UP UCBX FOR OUTPUTT .IFTT. BIS #S2.OBF,2(R5) ;;;INDICATE BUFFERED OUTPUT .ENDC*STARTX::BIS #S1.OBY,@R5 ;;;SET OUTPUT BUSY ASSUME US.OIU,17 DECB U.STS-U.TSTA(R5) ;;;SET OUTPUT INTERRUPT EXPECTED . .IFT ;T$$SPL . MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPLF$ MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX .ENDC ;T$$SPL2 MOVB OPTIMR,U.TOTI(R4) ;;;INITIALIZE OUTPUT TIMER ASSUME CT.STA,0( CLR R2 ;;;SET INDEX FOR "START OUTPUT"1 CALLR CTRD ;;;CALL CONTROLLER DEPEND00fhghf__DATADATADATADATAENT ROUTINER;T;T .ENDFTT. BIS #S2.OBF,2(R5) ;;;INDICATE BUFFERED OUTPUT .ENDC*STARTX::BIS #S1.OBY,@R5 ;;;SET OUTPUT BUSY ASSUME US.OIU,17 DECB U.STS-U.TSTA(R5) ;;;SET OUTPUT INTERRUPT EXPECTED . .IFT ;T$$SPL . MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPLF$ MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX .ENDC ;T$$SPL2 MOVB OPTIMR,U.TOTI(R4) ;;;INITIALIZE OUTPUT TIMER ASSUME CT.STA,0( CLR R2 ;;;SET INDEX FOR "START OUTPUT"1 CALLR CTRD ;;;CALL CONTROLLER DEPEND .TITLE TTFP .IDENT /07.01/;B1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.N; All rights reservedB;R;;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;R;;; 09-FEB-78 PETER WANNHEDEN;.; PREVIOUSLY MODIFIED BY:U;T; D. R. DONCHINC ; T. LEKAS ; J. KAUFFMANV ; S. C. ADAMS(; R. S. PHILPOTT; B. S. MCCARTHY; ; MODIFICATIONS ;;; ; S.C. ADAMS 27-FEB-86 07.000; SA454 -- FIX PROBLEMS WITH CONTINUATION LINES;D; S.C. ADAMS 29-APR-86 07.01-; SA457 -- ADD CONDITIONAL FOR BIC IN U.TST6i;s;s .MCALL EVNDF$,PKTDF$S PKTDF$S EVNDF$D .PSECT MAP5.6;M;+?; MODULE TTFP - CONTAINS FORK LEVEL PROCESSING ROUTINES FOR THEE; FOLLOWING FORK REQUESTS:$; FR.SUI START OF UNSOLICITED INPUT,; FR.AST CHARACTER THAT CAUSES AST RECEIVED;; FR.SCA TERMINAL MANAGEMENT SWITCH CHARACTERS WERE STRUCKT/; FR.ICS INPUT COUNT STATE TRANSITION OCCURRED-*; FR.OOB OUT-OF-BAND CHARACTER WAS STRUCK;T<; ALL THESE ROUTINES ARE CALLED BY THE FORK DISPATCHER WITH:#; R4 POINTER TO UCBX (IF IT EXISTS)s; R5 POINTER TO U.TSTA&; S1.DSI 1 TO DISABLE INPUT PROCESSING;-;;*.SBTTL FPSUI - START OF UNSOLICITED INPUT.;R .ENABL LSBH;;FPSUI:: CALL GCTAB ;GET CHARACTER THAT STARTS UNSOL. INPUTP) BCS 30$ ;NOT THERE ANY MORE - FORGET ITE .IF DF T$$IDO. TST $MCRPT ;IS THE MCR DISPATCHER INSTALLED?, BEQ CTAST ;EQ NO - QUEUE THE AST TO C$CTEX .ENDC ;T$$IDO3 CMPB R2,#CH.SP ;IS IT A "FUNNY" CHARACTER (CONTROLA ;CHARACTER OR SPACE)?T BHI 10$ ;N - OK, JUMPT7 CMPB R2,#CH.CR ;OF THE FUNNY CHARACTERS, WE ONLY ALLOW1( ;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?S BNE 50$ ;N - IGNOREN10$: ;REFERENCE LABEL .IF NDF T$$SPLI CALL ALUCBX ;ALLOCATE UCBX BCS 50$ ;FAILED - JUMP .ENDC ;NDF T$$SPL% CALL ALTB ;ALLOCATE AN INPUT BUFFERC BCS 40$ ;FAILED - JUMP MOV R2,-(SP) ;OK - SAVE POINTER. CLR -(SP) ;RESET CLI PROMPT STATUS FOR ^U/^R ASSUME U.TCI,0 6 MOV @R4,R3 ;GET CURRENT INPUT PACKET IF THERE IS ONE BEQ 20$ ;INPUT FREE - JUMP0 MOV #IS.CC,@R3 ;INPUT BUSY - SET STATUS = IS.CC) ;(BY DEFINITION, IT MUST BE SOLICITEDH ;INPUT)S9 MOVB @R3,1(SP) ;SHOW THAT A READ WAS INTERRUPTED BY A ^CN MOV R4,-(SP) ;SAVE R4 CALL FPIRD ;SAY INPUT DONE MOV (SP)+,R4 ;RESTORE R4DA20$: MOV (SP)+,U.TFPB(R4) ;SAVE ^U/^R STATUS IN NOW UNUSED OFFSETE; MOV (SP)+,U.TFIB(R4) ;SET UP POINTER TO FIRST INPUT BUFFERT< 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;; ;+7; SUBROUTINE FPSUI1 - SET UP UCB FOR UNSOLICITED INPUT.R:; FALL THROUGH FROM ABOVE OR CALLED FROM TTICH @ INT STATE;P; INPUT:; R4 POINTER TO U.TFIB; R5 POINTER TO U.TSTA&; U.TFIB POINTER TO FIRST INPUT BUFFER; ; OUTPUT:S ; UCB SET UP.O&; R2 POINTER TO SECOND WORD OF BUFFER.; THIS WORD INITIALIZED TO 0.; R4 POINTER TO U.TIC.;P; REGISTERS ALTERED: R2,R4;-;.;N6FPSUI1::MOV @R4,R2 ;GET POINTER TO FIRST INPUT BUFFER ASSUME U.TTIC,U.TFIB-2#1 MOV #M$$CRB-4,-(R4) ;INITIALIZE TOTAL BYTE COUNTE! ; = 1 FULL CLI COMMAND BUFFERD+ CALL NXTIB ;SET UP UCB FOR INPUT TRANSFER ? MOV R2,U.TCI-U.TIC(R4) ;STORE POINTER TO SECOND WORD IN BUFFER5- ;THIS WORD WILL RECEIVE COMPLETION STATUSN CLR @R2 ;INITIALIZE STATUS9 BIS #S1.IBY!S1.IBF!S100ghhibjbkb a a a.USI,@R5 ;SET FLAGS FOR UNSOLICITEDI ;BUFFERED INPUT 3 BIC #S1.RST!S1.PTH!S1.RES!S1.RNF!S1.RSP!S1.TNE,@R5R BIC #S5.ITI,U.TST5-U.TSTA(R5) 2 .IF DF T$$EIO BIC #S6.EIO,U.TST6-U.TSTA(R5) U .ENDC ;T$$EIO) MOV 4(R5),-(SP) ;GET CHARACTERISTIC WORD4 BIC #^C,(SP) ;GET RID OF EVERYTHING BUT TSY ASSUME S3.TSY,S1.TSY @ BIS (SP)+,(R5) ;RESTORE THE TSY BIT ACCORDING TO CHARACTERISTIC30$: RETURN ;L;E40$:;PA; FAILED TO ALLOCATE INPUT BUFFER. WITH A LITTLE EFFORT, WE COULD1>; DEALLOCATE THE UCBX, AFTER CHECKING WHETHER IT IS NEEDED FOR; SOME OTHER PURPOSE.S;N& CALL BELL ;BUFFER ALLOCATION FAILURE ;OUTPUT A BELL AND:50$: CALLR RCTAB ;REMOVE CHARACTER FROM TYPE-AHEAD BUFFER ;AND FORGET IT ALL.PAGER1.SBTTL FPAST - CHARACTER THAT CAUSES AST RECEIVED ;R .IF DF T$$CCA?FPAST:: CALL GCTAB ;GET A CHARACTER FROM THE TYPE-AHEAD BUFFERR BCS 30$ ;NONE THERE - IGNORE .IF NDF T$$SPL TST R4 ;UCBX PRESENT?P0 BEQ 30$ ;N - TERMINAL MUST BE DETACHED, IGNORE .ENDC ;NDF T$$SPL! MOV U.TAST(R4),R1 ;GET AST BLOCK 3 BEQ 30$ ;NONE - TERMINAL MUST BE DETACHED, IGNOREI1 MOVB R2,A.PRM(R1) ;INSERT CHARACTER IN AST BLOCKBA BISB #AF.LCK,A.PRM+5(R1) ;ASSUME TASK ONLY WANTS NOTIFICATION...% ;...SO LOCK THE AST CONTROL BLOCKA$ CMPB R2,#CH.CTC ;IS CHARACTER A ^C? BNE 60$ ;N - JUMPT3 MOV A.PRM+6(R1),R0 ;ASSUME SPECIFICATION OF ^C ASTS! BNE 70$ ;GOOD ASSUMPTION - JUMPN@60$: MOV A.PRM+10(R1),R0 ;GET ADDRESS OF UNSOLICITED AST ROUTINE8 BITB #TF.NOT,A.PRM+5(R1) ;TASK WANTS NOTIFICATION ONLY? BNE 80$ ;Y - JUMPC970$: CALL RCTAB ;REMOVE CHARACTER FROM TYPE-AHEAD BUFFERM+ BICB #AF.LCK,A.PRM+5(R1) ;UNLOCK AST BLOCKC=80$: MOV R0,A.AST(R1) ;INSERT TASK AST ADDRESS INTO AST BLOCKI3 JMP QUEAEN ;QUEUE ASYNCHRONOUS EVENT NOTIFICATION  .ENDC ;T$$CCA.PAGE^4 .SBTTL FPSCA - SWITCH CHARACTERS HAVE BEEN DETECTED .IF DF T$$SCA ;G; THIS FORK ROUTINE IS EXECUTED WHEN A USER HAS REQUESTED RECOGNITION I; OF SWITCH CHARACTERS BY SETTING UP THE TC.SSC CHARACTERISTIC. ENTERINGIC; SWITCH CHARACTERS IS A REQUEST TO ENTER TERMINAL MANAGEMENT MODE.O; FPSCA::B .IF NDF T$$SPLC TST R4 ;IS THERE A UCBX?C* BEQ 30$ ;IF EQ, NO...MUST HAVE DETACHED .ENDC ;NDF T$$SPL8 TST U.TSCA(R4) ;IS THERE POINTER TO TERM MGMT ACB/TEP?0 BEQ 30$ ;IF EQ, IT WENT AWAY...IGNORE REQUEST MOV #IS.TMM,R0 ;SET TMM STATUS CALL KILLI1 ;KILL INPUT5 MOV U.TSCA(R4),R1 ;GET POINTER TO TERM MGMT ACB/TEPO& JMP QUEAEN ;QUEUE TEP TO IT'S OWNER .ENDC ;T$$SCA.PAGEI5 .SBTTL FPICS - INPUT COUNT STATE TRANSITION OCCURREDN .IF DF T$$ICSM;OH; THIS FORK ROUTINE IS EXECUTED WHEN A USER HAS REQUESTED NOTIFICATIONF; OF THE TYPE-AHEAD BUFFER GOING FROM EMPTY TO NON-EMPTY BY SETTING UPG; THE TC.ICS CHARACTERISTIC. A TSA EVENT PACKET WILL BE QUEUED TO THE E6; SYSTEM-STATE PROCESS THAT SET UP THE CHARACTERISTIC.;FPICS::L0 CALL GCTAB ;IS THERE STILL A CHAR IN THE TAB?* BCS 30$ ;IF CS, NO...FORGET THE REQUEST .IF NDF T$$SPL TST R4 ;IS THERE A UCBX?B* BEQ 30$ ;IF EQ, NO...MUST HAVE DETACHED .ENDC ;NDF T$$SPL/ MOV U.TICA(R4),R1 ;GET POINTER TO ICS ACB/TEPA0 BEQ 30$ ;IF EQ, IT WENT AWAY...IGNORE REQUEST& JMP QUEAEN ;QUEUE ACB TO IT'S OWNER .ENDC ;T$$ICS.PAGES. .SBTTL FPOOB - OUT-OF-BAND CHARACTER DETECTED .IF DF T$$OOBT;AH; THIS FORK ROUTINE IS EXECUTED WHEN A USER HAS REQUESTED NOTIFICATIONO; OF INPUT OF OUT-OF-BAND CHARACTERS BY SETTING UP THE TC.OOB CHARACTERISTIC. .M; IF THE USER IS A TASK, AN AST WILL BE QUEUED. OTHERWISE A TSA EVENT PACKETVL; WILL BE QUEUED TO THE SYSTEM-STATE PROCESS THAT SET UP THE CHARACTERISTIC.;EFPOOB::3 .IF NDF T$$SPLT TST R4 ;IS THERE A UCBX?E* BEQ 30$ ;IF EQ, NO...MUST HAVE DETACHED .ENDC ;NDF T$$SPL/ MOV U.TOBA(R4),R1 ;GET POINTER TO ICS ACB/TEP 0 BEQ 30$ ;IF EQ, IT WENT AWAY...IGNORE REQUEST' CALL QUEAEN ;QUEUE TEP TO IT'S OWNERF ASSUME U.TCI,0N;HD; CHECK IF A STATUS HAS BEEN SET. (IS.OOB). THIS MEANS THAT THE OOBG00ghhf__DATADATADATADATA; CHARACTER WAS A CLEAR OOB AND THEREFORE, THE READ MUST BE TERMINATED. ;U TST (R4)+ ;IS THERE INPUT?T1 BEQ 30$ ;RETURN IF NOT. (IF NOT R4 NOT NEEDED)F TST @-(R4) ;IS THERE STATUS?R BEQ 30$ ;RETURN IF NOTE" CALLR KILLI ;TERMINATE THE READ .ENDC ;T$$OOB .DSABL LSB1.PAGEI@.SBTTL CTAST - FOR INTERRUPT-DO SEND AN AST TO C$CTEX - FOR P/OS;T .IF DF T$$IDO;U<; THIS IS A HACK TO SEND AN AST TO A TASK CALLED C$CTEX WHEN?; ^C IS TYPED AND NO ONE WANT'S IT. THE AST ROUTINE IS ASSUMED ; TO BE AT LOCATION 250F;,;R; SEE IF THE TASK IS INSTALLED;()CTAST: CMPB R2,#CH.CTC ;IS IT A CTRL-C?N BEQ 970$ ;EQ YES - OK GO ON& CRASH ;WE SHOULD ONLY GET HERE FOR ;A CTRL-C (OR INT-DO)K)970$: CALL RCTAB ;GET RID OF THE CTRL-C MOV #CTEX,R3 ;GET CTEX'S NAMEC CALL $SRSTD ;LOOK FOR ITA BCS 990$ ;IF CS - NOT HERE% BIT #TS.EXE,T.STAT(R0) ;TASK ACTIVE?K# BNE 990$ ;IF NE NO - DON'T DO ITE$ MOV R0,-(SP) ;SAVE THE TCB ADDRESS;T; GET SOME POOLE;  MOV #6.*2,R1 ;SIZE CALL $ALOCB ;GET IT( BCS 980$ ;IF CS - NO POOL - FORGET IT;B; FILL IN THE AST BLOCKL;N MOV R0,R1 ;COPY BLOCK ADDRESS+ TST (R0)+ ;POINT PAST AST LIST LINK WORD $ 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 ADDRESSB4 CLR (R0)+ ;NUMBER OF EXTRA WORDS TO PUT ON USER'S# MOV (SP)+,R0 ;GET THE TCB ADDRESS 4 CALLR $QASTT ;QUEUE THE AST AND THROW THE ^C AWAY"980$: TST (SP)+ ;CLEAN THE STACK 990$: RETURN .ENDC ;T$$IDO.PAGES&.SBTTL FPKIL - SEND KILL PACKET TO CLI;  .IF DF T$$SPC .PSECT MAP6FPKIL::B .IF DF C$$CTCC BIT #UM.KIL,U.MUP-U.TSTA(R5) ;CREATE ^C NOTIFICATION PACKET IF CLRA- BNE 10$ ;IF NE, KILL PACKET MUST BE CREATED 9 MOV #CC.CLI!CC.CTC,R1 ;SET ^C NOTIFICATION PACKET STATUSB BR 20$ ;JUMP TO COMMON CODE 10$: .ENDC ;C$$CTC- BIC #UM.KIL,U.MUP-U.TSTA(R5) ;CLEAR KILL BITA( CLR U.TFPB(R4) ;RESET CLI PROMPT STATUS;?; THE FOLLOWING CODE IS AN ATTEMPT TO CAUSE TTDRV TO CYCLE BACKOC; THROUGH FPKIL SUCH THAT WHEN CONTROL C IS TYPED TO A CONTINUATIONC=; LINE, WE FIRST COME THROUGH AND KILL THE LINE THEN AGAIN TOUD; ABORT TASKS. THIS BEHAVIOR IS BEING CHANGED AS IT IS INCONSISTENTC; WITH THE ACTION OF TTDRV WHEN A COMMAND LINE IS TERMINATED BY ^C.F; .IF DF T$$SPLU;7; MOVB #CH.CTC,U.TECO-U.TSTA(R5) ;PUT ^C IN ECHO BUFFERB;#; .IFF ;T$$SPL;(0; MOVB #CH.CTC,U.TECB(R4) ;PUT ^C IN ECHO BUFFER;P; .ENDC ;T$$SPLH;O-; FRKBIT BIS,#FR.PFP ; POST-FORK PROCESS A ^CC;B$ MOV #CC.KIL,R1 ;SET CLI KILL STATUS 20$: MOV R5,R2 ;GET UCB ADDRESS SUB #U.TSTA,R2 ;T* CALL $QCNTP ;QUEUE CONTROL PACKET TO CLI RETURNR .ENDC ;T$$SPC.PAGEI6 .SBTTL QUEAEN - QUEUE ASYNCHRONOUS EVENT NOTIFICATION V* .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB;I;+;$3; **-QUEAEN - QUEUE ASYNCHRONOUS EVENT NOTIFICATION ;O ; INPUTS::; R1 => AST CONTROL BLOCK OR TSA EVENT PACKET TO BE QUEUED'; R4 => UCBX (MUST EXIST AND BE MAPPED)B; R5 => U.TSTA OF CURRENT UCBX;A ; OUTPUTS:; R0 IS DESTROYEDI*; R3 IS DESTROYED IF A TEP IS PASSED IN R1;;-;. .ENABL LSBLQUEAEN:: .IF DF R$$IIC ASSUME A.CBL,E.VSIZ- TST A.CBL(R1) ;IS THIS AN AST CONTROL BLOCK?E$ BNE 10$ ;IF NE, NO...MUST BE A TEP .IFTF ;R$$IIC6 BITB #AF.QUE,A.PRM+5(R1) ;IS THIS ACB ALREADY QUEUED?# BNE 20$ ;IF NE, YES...JUST RETURN .IF DF T$$OOB/ BITB #AF.OOB,A.PRM+5(R1) ;IS THIS ACB FOR OOB?  BEQ 5$ ;IF EQ, NO(; TSTB A.PRM+24(R1) ;IS THERE A CHARACTER IN THE OOB BUFFER?A BEQ 20$ ;IF EQ, NO... RETURN CALL RCBUF ;GET THE CHARACTER ) MOVB R2,A.PRM(R1) ;AND PUT IT IN THE ACBU5$:: .ENDC ;T$$OOB- BISB #AF.QUE,A.PRM+5(R1) ;MARK ACB AS QUEUEDI2 MOV U.ATT-U.TSTA(R5),R0 ;GET TCB OF ATTACHED TASK) CALLR $QASTT ;QUEUE THE AST TO THE TASKU .IFT ;R$$IIC 10$:/ MOV R1,R3 ;COPY TEP POINTER FOR QUEUE ROUTINET!; BR QUETEP ;SKIP TO QUEUE A TEP.5 .SBTTL QUETEP - QUEUE TERMINAL EVENT PACKET TO OWNERN;;+;.L; **-QUETEP 00ghhhibjbkb a a a- THIS ROUTINE IS CALLED TO PASS A TSA EVENT PACKET TO A ROUTINEE; SET UP TO PROCESS THE EVENT. THE DOUBLEWORD ADDRESS OF THE ROUTINETD; TO BE CALLED IS EXPECTED TO BE IN THE TEP. NOTE THAT AN INTERLOCKE; MECHANISM IS PROVIDED TO DISABLE A FUTURE CALL WITH THE SAME PACKETLG; IF NECESSARY. IT IS UP TO THE CALLED ROUTINE TO CLEAR THE INTERLOCK.,; ; INPUT: ; R3 => TEP TO PASS TO ITS OWNER;E;-;PQUETEP::5 BIT #EF.QUE,E.VFLG(R3) ;IS THE PACKET ALREADY QUEUEDT4 BNE 20$ ;IF NE, YES...CANNOT QUEUE A LOCKED PACKET@ BIS #EF.QUE,E.VFLG(R3) ;LOCK PACKET UNTIL OWNER IS DONE WITH IT? MOV E.VAPR(R3),-(SP) ;SAVE DOUBLEWORD ADDRESS OF THE PACKET...D' MOV E.VADR(R3),-(SP) ;...OWNER ROUTINE % CALL $MPPRO ;MAP AND CALL THE OWNERO .ENDC ;R$$IIC20$: RETURN ;ALL DONE .DSABL LSB * .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB7 .SBTTL RCBUF - REMOVE CHARACTER FROM TYPE-AHEAD BUFFERE;-;+;UI; **-RCBUF - THIS ROUTINE IS CALLED TO REMOVE A CHARACTER FROM A STANDARDI@; FORMAT TYPE-AHEAD BUFFER. NOTE: THIS MUST BE CALLED ONLYB; WHEN IT IS KNOWN THAT THERE ARE CHARACTERS TO BE RETRIEVED!;O; INPUT:.; R1 => ACB IN WHICH TYPE-AHEAD BUFFER RESIDES ; OUTPUT:O#; R2 CHARACTER THAT WAS RETRIEVEDH;W;-; .IF DF T$$OOBRCBUF:! CALL LOCKI ;LOCK OUT INTERRUPTS4 MOV R1,R3 ;;;MAKE COPY OF ACB ADDRESS TO PLAY WITH/ ADD #A.PRM+23,R3 ;;;POINT TO RETRIEVAL POINTERE% CLR R2 ;;;PREPARE FOR BYTE TRANSFER 2 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- OKR- CLRB -1(R3) ;;;START AT BEGINNING NEXT TIME-10$:# DECB (R3)+ ;;;DEC CHARACTER COUNTA ADD R2,R3 ;;;POINT TO... INC R3 ;;;THE CHARACTER CLR R2 ;;;GET READY FOR IT% BISB (R3),R2 ;;;GET CHARACTER IN R2Y RETURND .ENDC ;T$$OOB;A;# .END3,R3 ;;;POINT TO RETRIEVAL POINTERE% CLR R2 ;;;PREPARE FOR BYTE TRANSFER 2 BISB (R3),R2 ;;;GET OFFSET TO RETRIEVE CHARACTER& INCB (R3) ;; .TITLE TTATTW .IDENT /06.15/E;N,; Copyright (c) 1995 by Mentec, Inc., U.S.A.; All rights reserved ;N; A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDAA; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE A; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISA; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORAA; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO ANDT1; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED.E;TA; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTtA; 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; 09-FEB-78 PETER WANNHEDEN ;A; PREVIOUSLY MODIFIED BY:M;N; P. WANNHEDEN ; C. F. SPITZ ; D. R. DONCHINO; B. S. MCCARTHY ; T. LEKAS ; S. C. ADAMSS; R. S. PHILPOTT;S;R; MODIFICATION HISTORY:H;N; L. KOGAN 4-APR-86 6.046; LK709 -- FIX CONDITIONALS WHEN SF.SMC IS DEFINED AND; SF.GMC IS NOT DEFINEDE; ; L. KOGAN 18-JUN-86 6.05O1; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT ; ; S.C. ADAMS 14-JUNE-86 6.06; SA459 -- FIX COMMENT IN MCOOB ; ; S. R. CLOUTIER 23-JUN-86 6.079;; ADD CALL TO LAT PORT DRIVER, ON DETACH, IF TERMINAL IS A; LAT APPLICATION TERMINAL.; ; S.C. ADAMS 5-AUG-86 6.08; SA464 -- ADD LAT 5.1 SUPPORT; ; S.C. ADAMS 5-AUG-86 6.09>; SA465 -- REMOVE RESTRICTION THAT TERMINAL CANNOT BE ATTACHEDB; FOR AST NOTIFICATION TO SET OTHER NOTIFICATION CHARACTERISTICS;; S. R. CLOUTIER 7-AUG-86 6.10A; SRC SUPPLY STATUS IE.DNR IN ROUTINE PPHNG BEFORE CALLING KILLO1S;-;; CHECK TO SEE IF I/O PACKET HAS BEEN TAKEN BY LAT PROCESSL!; IN PPHNG BEFORE COMPLETING I/O ;L; S. R. CLOUTIER 9-SEP-86 6.11B; SRC MAKE CORRECTIONS TO MCMAP AND MCQDP LAT APPLICATION TERMINAL ; ROUTINES6;- ; T. M. SCHOELLER 10-DEC-86 6.12B; TMS050 -- REMAP APR5 BEFORE 00hhhf__DATADATADATADATACALLING CKTAB VIA CHANGING THE STACK;B; L. KOGAN 26-FEB-87 6.13I6; LK722 -- DO NOT KILL I/O ON LOCAL LINES AFTER IO.HNG;.; S.C. ADAMS 12-JUN-87 6.14 @; SA473 -- CHECK THAT LAT PROCESS IS INSTALLED BEFORE GET OR SET; CHARACTERSITICSF;O$; Modified for RSX-11M-PLUS V4.6 by:; ); D. Carroll 14-Nov-1995 6.15 (CFS.34881)R>; DC416 -- Correct handling for user port when setting remote 8; characteristics. If T$$UMD is defined, handle remote7; characteristics the same as other controllers whichL8; support modem characteristics. This is only included1; if T$$USP is also defined, which is standard.F; ;H;+; ****** T T A T T ******1;D; THIS MODULE CONTAINS THE ROUTINES TO PROCESS I/O REQUESTS WITH THE; FOLLOWING FUNCTION CODES:i0; IO.ATT, IO.DET, IO.HNG, IO.GTS, SF.GMC, SF.SMCJ; MOST OF THIS PROCESSING IS DONE WHEN THE I/O REQUEST IS REMOVED FROM THEL; TERMINAL'S REQUEST QUEUE. HOWEVER, IO.GTS AND IO.GMC ARE NEVER PUT IN THEK; QUEUE SO THEIR PROCESSING ROUTINE IS CALLED IMMEDIATELY FROM TTINI. ALSOcN; CONTAINED IN THIS MODULE IS THE ROUTINE FOR DEALLOCATING AST CONTROL BLOCKS.M; IT IS CALLED FROM THE EXECUTIVE WHEN AN AST HAS BEEN DEQUEUED AND EFFECTED.R;-; & .SBTTL .MCALLS AND SYMBOL DEFINITIONS1 .IF DF T$$TSA!T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOBG .MCALL EVNDF$,PKTDF$T* EVNDF$ ;DEFINE TSA EVENT PACKET OFFSETS+ PKTDF$ ;DEFINE AST CONTROL BLOCK SYMBOLSQ1 .ENDC ;T$$TSA!T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOBE .IF NDF R$$MPLP .MCALL HWDDF$,SCBDF$E HWDDF$ ;DEFINE KINAR5 SCBDF$ ;DEFINE S.DMCS .ENDC .IF DF T$$GTS .MCALL TTSYM$+ TTSYM$ ;DEFINE F1.XXX AND F2.XXX SYMBOLSH;A=; DEFINE TERMINAL SUPPORT WORDS RETURNED BY AN IO.GTS REQUEST ; ; ALWAYS SUPPORTED OPTIONS:$;A0TSP1 = F1.ACR!F1.BUF!F1.CCO!F1.HLD!F1.LWC!F1.RNE.TSP1 = TSP1!F1.RST!F1.SYN!F1.TRW!F1.UTB!F1.VBF;OTSP2 = F2.FDX!F2.SFF; $; CONDITIONALLY SUPPORTED OPTIONS:;T!.IIF DF T$$BTW TSP1 = TSP1!F1.BTWO!.IIF DF T$$CCA TSP1 = TSP1!F1.UIAW!.IIF DF T$$ESC TSP1 = TSP1!F1.ESQI!.IIF DF T$$RPR TSP1 = TSP1!F1.RPR.!.IIF DF T$$RUB TSP1 = TSP1!F1.RUB ;Y!.IIF DF T$$GMC TSP2 = TSP2!F2.GCHF!.IIF DF T$$SMC TSP2 = TSP2!F2.SCHA!.IIF DF T$$CUP TSP2 = TSP2!F2.CUPT!.IIF DF T$$EIO TSP2 = TSP2!F2.EIOD!.IIF DF T$$TSA TSP2 = TSP2!F2.NCTF .ENDC ;T$$GTS.PAGEE9 .SBTTL PPATT - POST-QUEUE PROCESSING FOR ATTACH REQUESTS=;.;+6; **-PPATT - POST-QUEUE PROCESSING FOR ATTACH REQUESTS;DF; THIS ROUTINE IS DISPATCHED TO FROM TTINI AFTER AN IO.ATT REQUEST HASF; BEEN DEQUEUED FOR A TERMINAL. ALWAYS SAVE THE USER-DEFINED TERMINAL%; ID AND PROCESS IO.ATT SUBFUNCTIONS.D;$ ; INPUTS:; R5 => U.TSTA OF TERMINAL UCB=; R4 => UCBX FOR TERMINAL (GUARANTEED TO EXIST AND BE MAPPED)$; R3 => CURRENT I/O PACKET;D; OUTPUTS: NONE.;.*; REGISTERS MODIFIED: R0, R1, R2, R3, R4;-;O;MOVE THIS TO APR6 .IF NDF T$$OVL .PSECT MAP6 .ENDC ;NDF T$$OVL/ .IF DF T$$ONI ;IF AN OVERLAID NON I/D SYSTEMP8$DALED: .WORD 0 ;THIS WILL BE INITIALIZED BY TTDAT CODE/ ;THIS MUST BE THE FIRST WORD IN THE OVERLAYE .IF DF T$$GMC!T$$SMCE;.@; TABLE OF CHARACTERISTIC CODES FOR GET MULTIPLE CHARACTERISTICSG; FUNCTION (SF.GMC) AND SET MULTIPLE CHARACTERISTICS FUNCTION (SF.SMC). ;R7; EACH RECOGNIZED CODE HAS A 1-WORD ENTRY IN THE TABLE.M*; THIS WORD CONTAINS ONE OF THE FOLLOWING:;H(; 1. IF THE WORD NOT = 0 AND BIT 15 = 0:;; LOW BYTE = A BITMASK THAT MAPS THE DESIRED CHARACTERISTICD7; VALUE IN THE PROPER BYTE IN THE UCB. BITS ARE SET FORL ; RELEVANT BITS IN THE UCB BYTE.6; HIGH BYTE = OFFSET FROM START OF THE UCB TO THE BYTE+; THAT CONTAINS THE DESIRED CHARACTERISTIC.O;E; 2. IF BIT 15 = 1:S6; THE WORD IS THE ADDRESS OF A SUBROUTINE THAT HANDLES!; THIS PARTICULAR CHARACTERISTIC.R=; (ALL VIRTUAL ADDRESSES IN THE DRIVER ARE 120000 OR HIGHER).O;I; 3. IF THE WHOLE WORD = 0:<; THIS CHARACTERISTIC IS NOT RECOGNIZED BY SF.GMC OR SF.SMC.;T; (; DEFINE MACRO TO GENERATE TABLE ENTRIES;T .MACRO MCGEN NAME,OFS,BMB .IF LE NAME-MCHI  .=MCT00hhhibjbkb a a aAB+<2*>B .IF NB BM .IF LE BM-377 .BYTE BM,OFST .IFFT .BYTE BM/400,OFS+1N .ENDC .IFFE .WORD OFS .ENDC .IFF. .ERROR ;ILLEGAL CHARACTERISTICH .ENDC .ENDM MCGEN; 4MCHI == TC.MAX-1 ;HIGHEST RECOGNIZED CHARACTERISTIC;VMCTAB:: .REPT MCHI+ .WORD 0 ;INITIALIZE WHOLE TABLE TO ZEROSI .ENDR* MCGEN TC.WID,U.CW4,377 ;NUMBER OF COLUMNS2 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 SPEED4 MCGEN TC.PAR,MCPAR ;PARITY GENERATION AND CHECKING" MCGEN TC.EPA,MCEPA ;PARITY SENSE- MCGEN TC.CLN,MCCLN ;7-BIT CHARRACTER LENGTHA .IF DF T$$MOD" MCGEN TC.ASP,MCASP ;ANSWER SPEED5 MCGEN TC.ABD,U.TSTA+6,S4.ABD ;AUTO-BAUD SPEED DETECTC .ENDC ;T$$MOD .ENDC ;D$$H11!D$$Z11!D$$V110 MCGEN TC.ISL,U.UNIT,377 ;SUB-LINE ON CONTROLLER# MCGEN TC.TTP,MCTTP ;TERMINAL TYPEI! MCGEN TC.SCP,U.CW2,U2.CRT ;SCOPE1: MCGEN TC.HFL,U.TSTA+6,S4.HFL ;HORIZONTAL FILL REQUIREMENT8 MCGEN TC.VFL,U.TSTA+6,S4.VFL ;VERTICAL FILL REQUIREMENT1 MCGEN TC.HFF,U.TSTA+6,S4.HFF ;HARDWARE FORM-FEEDY+ MCGEN TC.HHT,U.TSTA+6,S4.HHT ;HARDWARE TABR< MCGEN TC.ACR,U.TSTA+4,S3.ACR ;AUTOMATIC CR-LF ON LONG LINES+ MCGEN TC.PPT,U.TSTA+4,S3.PPT ;PRINTER-PORTS3 MCGEN TC.SMR,U.CW2,U2.LWC ;LOWERCASE INPUT ENABLED1 .IF DF T$$ESC7 MCGEN TC.ESQ,U.CW2,U2.ESC ;ESCAPE SEQUENCES RECOGNIZEDC .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 TERMINALO/ MCGEN TC.PRI,U.CW2,U2.PRV ;PRIVILEGED TERMINAL * MCGEN TC.FDX,U.TSTA+4,S3.FDX ;FULL DUPLEX; MCGEN TC.PTH,U.TSTA+4,S3.PTH ;PASS-THROUGH MODE IS ENABLEDR# MCGEN TC.BIN,MCBIN ;READ-PASS-ALLO> MCGEN TC.8BC,U.TSTA+4,S3.8BC ;8 BIT CHARACTERS PASSED ON READ4 MCGEN TC.TBF,MCTBF ;TYPE-AHEAD BUFFER ACTIVE COUNT& MCGEN TC.CTS,MCCTS ;CONTROL-S STATUS3 MCGEN TC.HSY,MCHSY ;HOST/TERMINAL SYNCHRONIZATIONH' MCGEN TC.ANI,U.TSTA+6,S4.ANI ;ANSI CRTA- MCGEN TC.AVO,U.TSTA+6,S4.AVO ;ADVANCED VIDEO;) MCGEN TC.BLK,U.TSTA+6,S4.BLK ;BLOCK MODEV& 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 ;REGIS. MCGEN TC.SFC,U.TSTA+6,S4.SFC ;SOFT CHARACTERS;G .IF DF R$$MPL!A$$CLIB .IF DF C$$CTC5 MCGEN TC.TLC,U.TSTA+4,S3.CTC ;CONTROL-C NOTIFICATIONE .ENDC ;C$$CTC' MCGEN TC.NBR,U.MUP,UM.NBR ;NOBROADCASTN .ENDC ;R$$MPL!A$$CLII .IF DF T$$ACD4 MCGEN TC.ACD,MCACD ;ANCILLARY CONTROL DRIVER (ACD) .ENDC ;T$$ACD. MCGEN TC.RAT,U.TSTA+4,S3.TAB ;READ-AHEAD TYPE .IF DF T$$SER? MCGEN TC.TBM,U.MUP,UM.SER ;TYPEAHEAD BUFFER MODE (TASK OR CLI)E .ENDC ;T$$SER;G .IF DF T$$OOB: MCGEN TC.OOB,MCOOB ;OUT-OF-BAND/HELLO/INCLUDE CHARACTERS .ENDC ;T$$OOB .IF DF T$$ICS0 MCGEN TC.ICS,MCICS ;NOTIFY OF CHANGE IN TABUF ;(INPUT COUNT STATE)$ .ENDC ;TT$ICS .IF DF T$$SCA/ MCGEN TC.SSC,MCSSC ;SPECIFY SWITCH CHARACTERSD3 MCGEN TC.TMM,MCTMM ;EXIT TERMINAL MANAGEMENT MODER .ENDC ;T$$SCA) MCGEN TC.TSY,MCTSY ;OUTPUT FLOW CONTROLA& .IF DF T$$MHU ;MODEM HANG-UP NOTIFY8 MCGEN TC.MHU,MCMHU ;REQUEST MODEM HANG-UP NOTIFICATION .ENDC ;T$$MHU .IF DF T$$LTH&M$$NET< MCGEN TC.QDP,MCQDP ;GET QUEUE DEPTH AND LAT CONNECT STATUS( MCGEN TC.MAP,MCMAP ;SET UP LAT MAPPING .ENDC ;T$$LTH&M$$NETG .=MCTAB+<2*MCHI> ;END OF TABLE;.;C .ENDC ;T$$GMC!T$$SMCA .ENDC ; T$$ONISPPATT:: ; MOVB I.PRM+2(R3),U.TTID(R4) ;SAVE USER-DEFINED TERMINAL IDE .IF DF T$$ESC3 BIT #TF.ESQ,I.FCN(R3) ;TASK WANT ESCAPE SEQUENCES? .IF DF T$$CCA BEQ 10$ ;IF EQ, NO...SKIPT .IFF ;T$$CCAU( BEQ ADHSUC ;COMPLETE SUCCESSFUL ATTACH .ENDC ;T$$CCA* BIS #S3.RES,4(R5) ;REMEMBER TO PARSE THEM10$: .ENDC ;T$$ESC .IF DF T$$CCA: BIT #TF.AST,I.FCN(R3) ;ATTACH FOR UNSOLICITED INPUT AST?1 BEQ 19$ ;IF EQ, NO...COMPLETE SUCCESSFUL ATTACH;1 MOV I.PRM+4(R3),-(SP) ;GET CONTROL-C AST ADDRESSV0 BEQ 15$ ;IF EQ, NONE...CHECK00hhhf__DATADATADATADATA OTHER AST ADDRESS5 BIT #TF.XCC,I.FCN(R3) ;CONFLICTING SUBFUNCTION CODE?K' BNE 20$ ;IF NE, YES...RETURN AN ERRORA15$: .IF NDF S$$LIBO: BIS I.PRM(R3),(SP) ;"OR" IN UNSOLICITED INPUT AST ADDRESS$ ASR (SP)+ ;WAS EITHER ADDRESS ODD?+ BCS 30$ ;IF CS, YES...INVALID AST ADDRESSN .IFF ;S$$LIBF; BIS I.PRM(R3),(SP)+ ;"OR" IN UNSOLICITED INPUT AST ADDRESSN .ENDC ;S$$LIB3 BEQ 30$ ;IF EQ, NEITHER ADDRESS SPECIFIED...ERROR4* MOV #24.,R1 ;SET SIZE OF ACB TO ALLOCATE8 ADD #U.TAST,R4 ;POINT TO ATTACH ACB POINTER IN THE UCBX, CALL ALACB ;ALLOCATE AN ACB FOR THE ATTACH+ BCS 40$ ;IF CS, ALLOCATION FAILED...ERRORC MOVB I.FCN(R3),(R0)+ ;PUT FUNCTION CODE MODIFIERS IN ACB FLAG BYTET9 MOV I.PRM+4(R3),(R0)+ ;SAVE CONTROL-C AST ADDRESS IN ACBI? MOV I.PRM(R3),(R0) ;LIKEWISE FOR UNSOLICITED INPUT AST ADDRESSR .IFTF ;T$$CCA+19$: BR ADHSUC ;COMPLETE SUCCESSFUL ATTACHB .IFT ;T$$CCA 20$: TST (SP)+ ;CLEAN STACK730$: MOV #IE.SPC,R0 ;SET ILLEGAL AST ADDRESS ERROR CODE# BR 50$ ;JOIN COMMON ERROR CODE.40$: MOV #IE.NOD,R0 ;ERROR - NO DYNAMIC MEMORY950$: CLR U.ATT-U.TSTA(R5) ;CLEAR POINTER SET UP BY $GSPKT .IF DF T$$ESC; BIC #S3.RES,4(R5) ;DON'T REMEMBER ESCAPE SEQUENCES ANYMOREM .ENDC ;T$$ESC$ BR ADHFIN ;COMPLETE ATTACH REQUEST .ENDC ;T$$CCA.PAGEN9 .SBTTL PPDET - POST-QUEUE PROCESSING FOR DETACH REQUESTSD;C;+6; **-PPDET - POST-QUEUE PROCESSING FOR DETACH REQUESTS;PF; THIS ROUTINE IS DISPATCHED TO FROM TTINI AFTER AN IO.DET REQUEST HASI; BEEN DEQUEUED FOR A TERMINAL. FLUSH THE TYPEAHEAD BUFFER IF NECESSARY,IG; CLEAN UP TERMINAL STATUS, AND DEALLOCATE UNNECESSARY DATA STRUCTURES..;D ; INPUTS:; R5 => U.TSTA OF TERMINAL UCB5; R4 => UCBX FOR TERMINAL (ONLY IF T$$SPL IS DEFINED)D; R3 => CURRENT I/O PACKET;; OUTPUTS: NONE.;G*; REGISTERS MODIFIED: R0, R1, R2, R3, R4;-;HPPDET::D .IF DF T$$SER; BIT #UM.SER,U.MUP-U.TSTA(R5) ;DETACH WHILE IN SERIAL MODE?I& 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 ADDRESSA. CALL MPROT ;CALL ROUTINE TO FLUSH TYPE AHEAD .IFF ;T$$OVL 6 CALL I1CTXL ;FLUSH TYPE-AHEAD BUFFER WITH INTERRUPTS ;LOCKED OUTP .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). ;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$$OOBV/ BIC #S3.TME!S3.MHE!S3.ICE,4(R5) ;DISABLE THESEU7 BIC #S5.TMM,U.TST5-U.TSTA(R5) ;AND TERMINAL MANAGEMENTL# .ENDC ;T$$SCA!T$$MHU!T$$ICS!T$$OOBP* .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB .IF NDF T$$SPLO" MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX3 BEQ ADHSUC ;IF EQ, UCBX IS GONE...COMPLETE DETACH) .ENDC ;T$$SPL7 ADD #U.TAST,R4 ;POINT TO UNSOLICITED INPUT ACB ADDRESS$-X = U.TAST ;SYMBOL NEEDED FOR ASSUME MACROSP .IF DF T$$CCA3 CALL DEACB ;DEALLOCATE ATTACH ACB IF THERE IS ONE$% TST (R4)+ ;SKIP TO NEXT ACB POINTER) X = X + 2H .ENDC ;T$$CCA .IF DF T$$SCA ASSUME U.TSCA,X X = X + 2.4 CALL DEACB ;DEALLOCATE SWITCH CHARACTER ACB IF ONE% TST (R4)+ ;SKIP TO NEXT ACB POINTERT .ENDC ;T$$SCA .IF DF T$$MHU ASSUME U.TMHA,X X = X + 2U0 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 + 2+ CALL DEACB ;DEALLOCATE ICS ACB/TEP IF ONEA% 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, .IF DF T$$LTH ; IF LAT TERMINALS IN SYSTEM9 BIT #S6.LAT,U.TST6-U.TSTA(R5) ;LAT APPLICATION TERMINAL? % BEQ 20$ ; IF EQ - NO, JUST COMPLETEO .IF D00hhhibjbkb a a aF T$$OVL MOV #LHDET,-(SP) ;GET ADDRESS" CALL MPROT ;CALL ROUTINE IN TTLH .IFF ;T$$OVL CALL LHDET ;CALL TTLH DIRECTLY ;I .ENDC ;T$$OVL' BCS PPHNG ; IF CS, HANG UP THE LINE..$ .ENDC ;T$$LTH20$:' BR ADHSUC ;COMPLETE SUCCESSFUL DETACHB.PAGE ? .SBTTL PPHNG - POST-QUEUE PROCESSING FOR MODEM HANGUP REQUESTSO;;+<; **-PPHNG - POST-QUEUE PROCESSING FOR MODEM HANGUP REQUESTS;-F; THIS ROUTINE IS DISPATCHED TO FROM TTINI AFTER AN IO.HNG REQUEST HASE; BEEN DEQUEUED FOR A TERMINAL. INITIATE A TIMEOUT ON THE LINE WHICH ;; WILL CAUSE DTR TO DROP AND THE TERMINAL TO BE LOGGED OUT.L;L ; INPUTS:; R5 => U.TSTA OF TERMINAL UCB5; R4 => UCBX FOR TERMINAL (ONLY IF T$$SPL IS DEFINED); R3 => CURRENT I/O PACKET; ; OUTPUTS: NONE.;"; REGISTERS MODIFIED: R0, R1, R2;-;NPPHNG::E .IF DF T$$SPL' MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP UCBXI MOV #120000,R4 ;POINT TO UCBX .IFF ;T$$SPLI' MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBXR .ENDC ;T$$SPL .IF DF T$$MOD+ BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE?3 BEQ ADHSUC ;IF EQ, LINE IS LOCAL. DO NOT KILL I/OD& MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS7 BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIERS4 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 CTRD. .IFF ;T$$OVLM8 CALL CTRD ;INITIATE TIMEOUT WHICH WILL CAUSE DTR TO BE0 ;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/O0 RETURN ;ELSE RETURN (PACKET WAS TAKEN BY LAT)10$: .ENDC ;T$$MOD% MOV R3,-(SP) ;SAVE IO PACKET POINTERE .IF DF T$$OVL* MOV #I1CTXL,-(SP) ;GET ADDRESS OF ROUTINE( CALL MPROT ;AND MAP AND CALL FLUSH TAB .IF NDF T$$SPL  TST R4 ;IS THERE A UCBX?- BEQ 15$ ;IF NOT, DON'T KILL INPUT OR OUTPUTT .ENDC ;NDF T$$SPL3 MOV #IE.ABO&377,R0 ;SET COMPLETION STATUS FOR READF* MOV #KILLI1,-(SP) ;GET ADDRESS OF ROUTINE) CALL MPROT ;AND MAP AND CALL KILL INPUTE4 MOV #IE.DNR&377,R0 ;SET COMPLETION STATUS FOR WRITE* MOV #KILLO1,-(SP) ;GET ADDRESS OF ROUTINE* CALL MPROT ;AND MAP AND CALL KILL OUTPUT .IFF ;T$$OVL CALL I1CTXL ;FLUSH TAB .IF NDF T$$SPLC TST R4 ;IS THERE A UCBX?- BEQ 15$ ;IF NOT, DON'T KILL INPUT OR OUTPUTT .ENDC ;NDF T$$SPL3 MOV #IE.ABO&377,R0 ;SET COMPLETION STATUS FOR READ$ CALL KILLI1 ;KILL INPUT 4 MOV #IE.DNR&377,R0 ;SET COMPLETION STATUS FOR WRITE CALL KILLO1 ;KILL OUTPUT .ENDC ;T$$OVL,15$: MOV (SP)+,R3 ;RESTORE IO PACKET POINTER20$: .IF DF T$$MHU/ BIT #S3.MHE,4(R5) ;IS CHARACTERISTIC ENABLED?L BEQ ADHSUC ;BR IF NO .IF DF T$$SPL4 MOV #120000,R4 ;POINT TO UCBX. IT IS POSSIBLE THAT) ;A CALL FROM FPORD TO THE EXEC CAUSES1( ;US TO LOSE THE VALUE THAT WAS IN R4 .IFF ;T$$SPLS' MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBXT .ENDC ;T$$SPL# MOV U.TMHA(R4),R1 ;GET ACB ADDRESSR .IF DF T$$OVL MOV #QUEAEN,-(SP) CALL MPROT ;QUE AST TO TASK .IFF ;T$$OVL) CALL QUEAEN ;QUEUE AST TO ATTACHED TASK .ENDC ;T$$OVL .ENDC ;T$$MHU;)J; HERE TO COMPLETE AN IO.ATT, IO.DET, IO.ORG OR IO.HNG I/O WITH A SUCCESS3; (ADHSUC) OR A PRESET (ADHFIN) COMPLETION STATUS.; ADHSUC:R# MOV #IS.SUC,R0 ;SET SUCCESS STATUS ADHFIN:H .IF DF T$$OVL# CLR R1 ;CLEAR SECOND WORD OF IOSBU$ CALLR $IOFIN ;FINISH IO AND RETURN .IFF ;T$$OVLU& JMP IOFIN ;FINISH OFF THE I/O PACKET .ENDC ;T$$OVL.PAGE .IF DF T$$LTH< .SBTTL PPORG - POST-QUEUE PROCESSING FOR ORIGINATE REQUESTS;H;+A; **-PPORG - POST-QUEUE PROCESSING TO ORIGINATE A CONNECTION TO A ; TERMINAL SERVER (ORIGINATE);/F; THIS ROUTINE IS DISPATCHED TO FROM TTINI AFTER AN IO.ORG REQUEST HASE; BEEN DEQUEUED FOR A TERMINAL. CHECK THAT THIS HAS BEEN ESTABLISHED$@; AS A LAT APPLICATION TERMINAL AND IF SO, CALL THE LAT PROCESS.;I ; INPUTS:; R5 => U.TSTA OF TERMINAL UCB5; R4 => UCBX FOR TERMINAL (ONLY IF T$$SPL IS DEFINED)G; R3 => CURR00hhhf__DATADATADATADATAENT I/O PACKET; ; OUTPUTS: NONE.;E; REGISTERS MODIFIED: R0;-;+PPORG::O .IF DF T$$SPL' MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP UCBX MOV #120000,R4 ;POINT TO UCBX .IFF ;T$$SPLI' MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBXO .ENDC ;T$$SPL9 BIT #S6.LAT,U.TST6-U.TSTA(R5) ;LAT APPLICATION TERMINAL?L0 BNE 10$ ;IF NE, YES...CAN ORIGINATE CONNECTION7 MOV #!,R0 ;CONNECTION REJECTED / BR ADHFIN ;COMPLETE REQUEST WITH ERROR STATUS$10$:& MOV R3,-(SP) ;SAVE I/O PACKET POINTER2 MOV R3,R0 ;GET IRP ADDRESS TO R0 FOR LAT PROCESS3 MOV #PO$ORG,R3 ;GET ORIGINATE CODE FOR LAT PROCESS. .IF DF T$$OVL) MOV #LTPRC,-(SP) ;GET ADDRESS OF ROUTINE.$ CALL MPROT ;AND MAP AND CALL LTPRC .IFF ;T$$OVLO CALL LTPRC ;CALL LAT PROCESS .ENDC ;T$$OVL) MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSE" TST R0 ;ERROR BACK FROM PROCESS?1 BNE ADHFIN ;IF NE, NO - ERROR, COMPLETE REQUESTE1 RETURN ;ELSE RETURN, LAT WILL COMPLETE REQUESTU ;WHEN CONNECTION COMPLETES .ENDC ;T$$LTH.PAGETA .SBTTL PPSPC/PPSPC1 - POST-QUEUE PROCESSING FOR SPECIAL REQUESTSC; ;+6; **-PPSPC - POST-QUEUE PROCESSING FOR SF.SMC REQUESTSB; **-PPSPC1 - POST-QUEUE PROCESSING FOR IO.GTS AND SF.GMC REQUESTS;$L; THESE ROUTINES ARE DISPATCHED TO FROM TTINI TO PROCESS IO.GTS, SF.GMC, ANDM; SF.SMC REQUESTS. PPSPC IS USED WHEN AN SF.SMC REQUEST IS DEQUEUED. PPSPC1NI; IS USED WHEN AN IO.GTS OR SF.GMC REQUESTS ARE INITIATED, SINCE THEY CAN ; COMPLETE ASYNCHRONOUSLY.;C ; INPUTS:"; R5 => U.TSTA OF THE TERMINAL UCB; R3 => CURRENT I/O PACKET;R; OUTPUTS: NONE.;Q*; REGISTERS MODIFIED: R0, R1, R2, R3, R4J; R1 IS PRIMARILY USED AS A POINTER INTO THE USER'S CHARACTERISTIC BUFFER.;-;M;KEEP THIS IN APR 5S .IF NDF T$$OVLA .PSECT MAP5 .ENDC ;T$$OVL .IF DF T$$SMCPPSPC::Q .IF NDF T$$SPLE" .IF DF T$$OVL ;IF OVERLAID TTDRV1 MOV (SP),-(SP) ;FORCE A REMAP FIRST BEFORE CKTAB 0 MOV 4(SP),2(SP) ;BRING UP THE APR BIAS ON STACK5 MOV #CKTAB,4(SP) ;THIS REQUEST MAY WANT TO CREATE ORL! ;REMOVE A TYPE-AHEAD BUFFER -R ;CHECK ON THE WAY OUT ' .IFF ;DF T$$OVL ;IF NOT OVERLAID TTDRV 5 MOV #CKTAB,-(SP) ;THIS REQUEST MAY WANT TO CREATE ORE! ;REMOVE A TYPE-AHEAD BUFFER -I ;CHECK ON THE WAY OUTA .ENDC ;DF T$$OVL. .ENDC ;NDF T$$SPL0 MOV #IRESEL,-(SP) ;RESET S1 BITS ON THE WAY OUT .ENDC ;T$$SMC .IF DF T$$GTS!T$$GMC!T$$SMC6PPSPC1::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?I7 BNE CHKCHR ;IF NE, NO...CHECK GET/SET CHARACTERISTICSR;E1; PROCESS REQUESTS TO GET TERMINAL DRIVER SUPPORTK; 8 MOV #TSP1,(R1)+ ;STORE FIRST WORD OF SUPPORT PARAMETERS, CMP I.PRM+4(R3),#2 ;WANTS MORE THAN 1 WORD?3 BEQ JCHRSC ;IF EQ, NO...GIVE ONLY WHAT USER WANTSC# MOV #TSP2,(R1)+ ;STORE SECOND WORD  .ENDC ;T$$GTS .IF DF T$$GTS!T$$GMC!T$$SMCJCHRSC:R JMP CHRSUC ;FINISH OFF REQUESTCHKCHR:+; BR NXTCHR ;CHECK CHARACTERISTICS SUPPORTS .ENDC ;T$$GTS!T$$GMC!T$$SMC.PAGEI= .SBTTL . NXTCHR - PROCESSING LOOP FOR SF.GMC/SF.SMC REQUESTS .IF DF T$$GMC!T$$SMC ;ND; LOOP HERE TO START PROCESSING NEXT CHARACTERISTIC FROM USER BUFFER;ANXTCHR:C$ SUB #2,I.PRM+4(R3) ;ANY MORE TO DO?7 BMI JCHRSC ;IF MI, NO...FINISH SUCCESSFUL I/O REQUESTC8 MOVB (R1)+,R0 ;GET NEXT CHARACTERISTIC FROM USER BUFFER, BEQ ERCNIH ;IF EQ, BAD CODE...RETURN ERROR CMP R0,#MCHI ;TOO HIGH?0 BHI ERCNIH ;IF HI, YES...RETURN BAD CODE ERROR ASL R0 ;MULTIPLY CODE BY 2' ADD #MCTAB-2,R0 ;MAKE POINTER IN MCTABC .IF DF T$$SPL7 MOV $DALED,KISAR6 ;MAP CHARACTERISTIC TABLE (IN TTCOM) .IFTF ;T$$SPL CLR R2 ;INIT BITMASK) BISB (R0)+,R2 ;GET BITMASK FOR THIS CODE! MOVB (R0)+,R4 ;GET OFFSET IN UCB?2 MOV -(R0),R0 ;GET FULL WORD IF SUBROUTINE ADDRESS .IFT ;T$$SPL)+ MOV I.PRM(R3),KISAR6 ;RESTORE TASK MAPPING' TST R0 ;IS CHARACTERISTIC RECOGNIZED00hhhibjbkb a a a?R .ENDC ;T$$SPL8 BEQ ERCNIH ;IF EQ, UNRECOGNIZED CHARACTERISTIC...ERROR4 BPL 10$ ;IF PL, NOT A SUBROUTINE...PROCESS BITMASK> CMP R0,#160000 ;NEGATIVE OFFSET (NOT A SUBROUTINE AFTER ALL)?3 BHIS 10$ ;IF HIS, NOT A SUBROUTINE ADDRESS...SKIP .IF DF T$$GMC&T$$SMCB: CMP I.FCN(R3),#SF.GMC ;DO TEST FOR SF.GMC BEFORE DISPATCH .ENDC ;T$$GMC&T$$SMC)5 CALL (R0) ;DISPATCH TO ROUTINE TO HANDLE SPECIAL...)" ;...CASES OF SF.GMC AND SF.SMC, BR NXTCHR ;LOOP TO GET NEXT CHARACTERISTIC10$:) ADD R5,R4 ;POINT TO UCB OFFSET + U.TSTA,2 SUB #U.TSTA,R4 ;BACK UP POINTER TO THE UCB OFFSET .ENDC ;T$$GMC!T$$SMCO .IF DF T$$GMC&T$$SMC0% CMP I.FCN(R3),#SF.SMC ;IS IT SF.SMC?T4 BEQ 100$ ;IF EQ, YES...PROCESS SET CHARACTERISTICS .ENDC ;T$$GMC&T$$SMCC .IF DF T$$GMC;R<; PROCESS REQUEST TO RETURN TERMINAL CHARACTERISTICS TO USER;T3 MOVB (R4),(R1) ;STORE CURRENT VALUE IN USER BUFFERS MOVB R2,R0 ;COPY BITMASK COMB R0 ;INVERT IT% BICB R0,(R1) ;CLEAR IRRELEVANT BITST20$: ASRB R2 ;SHIFT BITMASK RIGHT BCS 30$ ;CARRY - JUMPS1 RORB (R1) ;SHIFT VALUE IN USER BUFFER RIGHT TOO; BR 20$ ;LOOP30$:+ INC R1 ;SKIP OVER VALUE FIELD JUST STORED;, BR NXTCHR ;LOOP TO GET NEXT CHARACTERISTIC .ENDC ;T$$GMC .IF DF T$$SMC;T1; PROCESS REQUEST TO SET TERMINAL CHARACTERISTICSO;T100$:M: MOVB -1(R1),R0 ;GET CHARACTERISTIC CODE WE ARE PROCESSING- CMPB #TC.WID,R0 ;WANT TO CHANGE BUFFER SIZE?B* BNE 110$ ;IF NE, NO...SKIP TO NEXT CHECK1 CMPB #15.,(R1) ;TRYING TO MAKE BUFFER TOO SMALL?T) BLO 200$ ;IF LO, NO...SKIP TO SET WIDTH ' BR ERCVL1 ;RETURN INVALID VALUE ERRORO110$: ( CMPB #TC.ISL,R0 ;WANT TO CHANGE U.UNIT?= BEQ ERCFIX ;IF EQ, YES...NOT ALLOWED - FIXED CHARACTERISTICT6 CMPB #TC.PRI,R0 ;TRYING TO CHANGE TERMINAL PRIVILEGE?< BEQ ERCPRI ;IF EQ, YES...NOT ALLOWED - PRIVILEGE VIOLATION .IF DF T$$MOD9 CMPB #TC.ABD,R0 ;WANT TO CHANGE AUTOBAUD CHARACTERISTIC?H+ BEQ 120$ ;IF EQ, YES...MUST BE PRIVILEGEDK6 CMPB #TC.ASP,R0 ;WANT TO CHANGE DEFAULT ANSWER SPEED?2 BNE 200$ ;IF NE, NO...PROCESS THE CHARACTERISTIC120$:B/ MOV I.TCB(R3),R0 ;GET ISSUING TASK TCB ADDRESSC/ BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED?I4 BEQ ERCPRI ;IE EQ, NO...RETURN PRIVILEGE VIOLATION .ENDC ;T$$MOD200$: ) MOV R2,-(SP) ;SAVE BITMASK TO BE CHANGEDF. MOVB (R1),R0 ;GET NEW VALUE FROM USER BUFFER210$:  ASRB R2 ;SHIFT BITMASK RIGHT, BCS 220$ ;IF CS, SHIFTED FAR ENOUGH...SKIP ROLB R0 ;SHIFT NEW VALUE LEFTE! BR 210$ ;LOOP FOR MORE SHIFTINGE220$:T& ROLB R2 ;PICK UP LOST BIT FROM CARRY% COMB R2 ;INVERT RIGHT-ADJUSTED MASKV# BITB R2,(R1)+ ;NEW VALUE IN RANGE?D4 BNE ERCVAL ;IF NE, NO...RETURN INVALID VALUE ERROR BICB (SP)+,@R4 ;CLEAR OLD VALUE BISB R0,@R4 ;SET NEW VALUE .IF DF T$$SER, CMPB -2(R1),#TC.TBM ;SERIAL CHARACTERISTIC? BNE 300$ ;IF NE, NO...SKIP" TSTB R0 ;NOSERIAL NOW IN EFFECT? BNE 300$ ;IF NE, NO...SKIP@ BIC #UM.CMD,U.MUP-U.TSTA(R5) ;ELSE, YES...CLEAR CMD IN PROGRESS300$:B .ENDC ;T$$SER CMPB #TC.PTH,-2(R1) ;PASSTHRU?P BNE 301$ ;BR IF NOTR" BIC #S1.PTH,(R5) ;CLEAR OLD VALUE ASSUME S1.PTH*400,S3.PTHA" SWAB R0 ;GET BYTE IN RIGHT PLACE# BISB R0,(R5) ;SET OR CLEAR S1.PTH 301$:R-;PROCESS FORMFEED AND NO-ECHO CHARACTERISITCS;.7 CMPB #TC.NEC,-2(R1) ;IS THIS A NO-ECHO CHARACTERISTIC?I' BNE 303$ ;BR IF NOT TO CHECK FORMFEED02 BIC #U2.NEC,U.CW2-U.TSTA(R5) ;Y - CLEAR OLD VALUE ASSUME S4.HFF*400,U2.HFFT ASSUME S3.NEC*400,U2.NEC*2I ASRB R0 ;GET NEW VALUE BR 305$ ;BR TO SET NEW VALUE303$:H8 CMPB #TC.HFF,-2(R1) ;IS THIS A FORMFEED CHARACTERISTIC?6 BNE NXTCHR ;IF NE, NO...LOOP FOR NEXT CHARACTERISTIC; BIC #U2.HFF,U.CW2-U.TSTA(R5) ;Y - CLEAR OLD FORMFEED VALUE$305$:P3 BISB R0,U.CW2+1-U.TSTA(R5) ;SET NEW FORMFEED VALUEP) BR NXTCHR ;LOOP FOR NEXT CHARACTERISTICE .ENDC ;T$$SMC.PAGEI4 .SBTTL . ERROR HANDLING FOR GET/SET CHARACTERISTICS;Y%; ERRORS IN SF.GMC OR SF.SMC REQUESTS0;. .IF DF T$$GMC!T$$SMC0FERCNIH: MOV #!,R0 ;ILLEGAL CHARACTERISTIC TYPE00hhhf__DATADATADATADATA .ENDC ;T$$GMC!T$$SMC)CHRFN1: / DEC R1 ;BACK UP CHARACTERISTIC BUFFER POINTER. BR CHRFIN ;FINISH IT OFF .IF DF T$$SMC8ERCPRI: MOV #IE.PRI&377,R0 ;ATTEMPT TO EXCEED PRIVILEGES BR CHRFN1 ;FINISH IT OFF7ERCVAL: TST (SP)+ ;CLEAN UP STACK FOR THIS ENTRY POINTS/ DEC R1 ;BACK UP CHARACTERISTIC BUFFER POINTERAERCVL1:R@ MOV #!,R0 ;ILLEGAL CHARACTERISTIC VALUE BR CHRFIN ;FINISH IT OFFHERCFIX: MOV #!,R0 ;ATTEMPT TO CHANGE FIXED CHAR. BR CHRFN1 ;FINISH IT OFF .IF DF D$$H11!D$$Z11!D$$V11GERCSPD: MOV #!,R0 ;INVALID SPEED FOR CONTROLLER BR CHRFN1 ;FINISH IT OFF .ENDC ;D$$H11!D$$Z11!D$$V11 .IFTF ;T$$SMCIERCNSC:: MOV #!,R0 ;NOT A SETTABLE CHARACTERISTIC  BR CHRFN1 ;FINISH IT OFF .IFT ;T$$SMCV* .IF DF T$$SPL!T$$SCA!T$$MHU!T$$ICS!T$$OOBEERCUPN: MOV #!,R0 ;STORAGE ALLOCATION FAILUREA 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$$OOB1>ERCIAA: MOV #!,R0 ;ILLEGAL AST ADDRESS BR CHRFN1 ;FINISH IT OFF# .ENDC ;T$$SCA!T$$MHU!T$$ICS!T$$OOBV .ENDC ;T$$SMC .IF DF T$$GTS!T$$GMC!T$$SMCCHRSUC:0/ MOV #IS.SUC,R0 ;SET SUCCESSFUL COMPLETION CODE  .ENDC ;T$$GTS!T$$GMC!T$$SMCCHRFIN: . SUB I.PRM+2(R3),R1 ;GET OFFSET IN USER BUFFER/ MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING $ JMP $IOFIN ;FINISH THE I/O REQUEST.PAGE;2 .SBTTL . GET/SET TERMINAL CHARACTERISTICS SUPPORT2 .SBTTL . MC*SP - TERMINAL SPEED (RCV/XMT/ANSWER) .IF DF T$$GMC!T$$SMCA;D'; GET/SET RECEIVE/TRANSMIT/ANSWER SPEEDC;$E .IF DF D$$H11!D$$Z11!D$$V11 ;ONLY DH11, DZ11 AND DHV11 CAN SET SPEEDSMCRSP::CMCXSP::# .IF DF T$$MODMCASP::P .ENDC ;T$$MOD .IF DF T$$GMC&T$$SMC BEQ 310$ ;GET SPEED - JUMP .ENDC ;T$$GMC&T$$SMCR .IF DF T$$SMC;; ; SET SPEEDR;T* MOVB (R1)+,R0 ;SET SPEED - GET USER VALUE1 BEQ ERCVAL ;IF EQ, INVALID CHARACTERISTIC VALUER CMP R0,#SPHI ;IN RANGE?6 BHI ERCVAL ;IF HI, NO...INVALID CHARACTERISTIC VALUE0 CALL SPDPRM ;CALL CONTROLLER DEPENDENT ROUTINE* BCC 10$ ;IF CC, SUCCESSFUL SPEED SETTING= MOV #ERCSPD,(SP) ;CHANGE RETURN ADDRESS TO PROCESS THE ERROR#10$:+ RETURN ;RETURN FOR MORE/ERROR COMPLETION .ENDC ;T$$SMC .IF DF T$$GMC;E ; GET SPEEDP;(310$: MOV #100000,R0 ;INDICATE GET SPEED% INC R1 ;BUMP POINTER IN USER BUFFER;0 CALL SPDPRM ;CALL CONTROLLER DEPENDENT ROUTINE .IF DF T$$MOD BIT #1000,R0 ;GET ANSWER SPEED? BEQ 320$ ;N - JUMP. MOVB U.CW3+1-U.TSTA(R5),R0 ;GET ANSWER SPEED? BR 330$ ;JOIN COMMON CODER .ENDC ;T$$MOD320$:U) MOVB U.CW3-U.TSTA(R5),R0 ;GET SPEED BITSC% CMPB -2(R1),#TC.XSP ;TRANSMIT SPEED?O+ BNE 330$ ;N - MUST BE RECEIVE SPEED, JUMPM .IF DF R$$EIS: ASH #-4,R0 ;PUT TRANSMIT SPEED BITS INTO PROPER POSITION .IFF ;R$$EISA6 ASR R0 ;PUT TRANSMIT SPEED BITS INTO PROPER POSITION ASR R0 ; ASR R0 ; ASR R0 ; .ENDC ;R$$EIS.330$: BIC #^C<17>,R0 ;CLEAR ALL BUT SPEED BITS .IF DF T$$SPL!T$$ONI.+ MOV $DALED,KISAR6 ;MAP DRIVER SPEED TABLES$ .ENDC ;T$$SPL!T$$ONI.( MOV R4,-(SP) ;SAVE START OF SPEED TABLE- MOV #SPHI,R2 ;GET NUMBER OF ENTRIES IN TABLER340$: CMPB R0,(R4)+ ;MATCH?  BEQ 350$ ;Y - JUMP SOB R2,340$ ;N - LOOPS0 MOV @SP,R4 ;UNRECOGNIZED SPEED - RETURN A ZERO'350$: SUB (SP)+,R4 ;GET OFFSET IN TABLE  .IF DF T$$ONI!T$$SPL + MOV I.PRM(R3),KISAR6 ;RESTORE TASK MAPPINGA .ENDC ;T$$ONI!T$$SPLS% MOVB R4,-1(R1) ;STORE IN USER BUFFERP) RETURN ;RETURN FOR NEXT CHARACTERISTIC$ .ENDC ;T$$GMC.PAGEE' .SBTTL . MCPAR/MCEPA - PARITY OPTIONSM;R2; GET/SET PARITY GENERATION AND CHECKING AND SENSE;N .ENABL LSBIMCPAR::R .IF DF T$$GMC&T$$SMCT6 BEQ 1000$ ;GET PARITY GENERATION AND CHECKING - JUMP .ENDC ;T$$GMC&T$$SMCE .IF DF T$$SMC;$$; SET PARITY GENERATION AND CHECKING;.6 BIC #U3.PAR,U.CW3-U.TSTA(R5) ;ASSUME DISABLING PARITY TSTB (R1)+ ;CHECK ASSUMPTION00hhhibjbkb a a a BEQ 1010$ ;CORRECT - JUMPOD BIS #U3.PAR,U.CW3-U.TSTA(R5) ;ENABLE PARITY GENERATION AND CHECKING6 BR 1010$ ;JOIN COMMON CODE TO CHANGE LINE PARAMETERS .ENDC ;T$$SMC .IF DF T$$GMC;N$; GET PARITY GENERATION AND CHECKING;1000$:) CLRB (R1) ;ASSUME PARITY IS NOT ENABLEDG) BIT #U3.PAR,U.CW3-U.TSTA(R5) ;CHECK THAT BEQ 1030$ ;CORRECT - JUMPF( INCB (R1) ;SHOW THAT PARITY IS ENABLED5 BR 1030$ ;JOIN COMMON CODE TO CHECK LINE PARAMETERS  .ENDC ;T$$GMC; ; GET/SET PARITY SENSE;BMCEPA::  .IF DF T$$GMC&T$$SMC3$ BEQ 1020$ ;GET PARITY SENSE - JUMP .ENDC ;T$$GMC&T$$SMC  .IF DF T$$SMC;E; SET PARITY SENSE;E9 BIC #U3.OPA,U.CW3-U.TSTA(R5) ;ASSUME SETTING EVEN PARITYN TSTB (R1)+ ;CHECK ASSUMPTION BNE 1010$ ;CORRECT - JUMPI- BIS #U3.OPA,U.CW3-U.TSTA(R5) ;SET ODD PARITYC1010$:5 MOV #6000,R0 ;INDICATE DEVICE DEPENDENT SPEED FORMATT, BISB U.CW3-U.TSTA(R5),R0 ;GET CURRENT SPEED6 BR 1040$ ;RESET TO CURRENT SPEED AND PARITY SETTINGS .ENDC ;T$$SMC .IF DF T$$GMC;F; GET PARITY SENSE;B1020$: CLRB (R1) ;ASSUME ODD PARITY ASSUME U3.OPA,100000! TST U.CW3-U.TSTA(R5) ;CHECK THATS BMI 1030$ ;CORRECT - JUMP3 INCB (R1) ;SHOW EVEN PARITYN1030$: INC R1 ;BUMP POINTER# MOV #100000,R0 ;INDICATE GET SPEEDI .ENDC ;T$$GMC .IF DF T$$GMC ! T$$SMC ;C1040$:6 CALL CTRPRM ;MAKE SURE INTERFACE HAS SETTABLE PARITY3 RETURN ;RETURN TO CALLER FOR NEXT CHARACTERISTIC0 .ENDC ;DF T$$GMC ! T$$SMC6 .SBTTL . MCCLN - SETTING (7/8-BIT) CHARACTER LENGTH;E; GET/SET CHARACTER LENGTHC; MCCLN::M .IF DF T$$GMC&T$$SMCO# BEQ 1050$ ;GET CHAR LENGTH - JUMPK .ENDC ; T$$GMC&T$$SMC .IF DF T$$SMC; ; SET 7-BIT CHARACTER LENGTH;R, BIC #S5.CLN,U.TST5-U.TSTA(R5) ;ASSUME 8-BIT TSTB (R1)+ ;CHECK ASSUMPTION BEQ 1060$ ;CORRECT - JUMP0) BIS #S5.CLN,U.TST5-U.TSTA(R5) ;SET 7-BITS7 BR 1060$ ; JOIN COMMON CODE TO CHANGE LINE PARAMETERSA .ENDC ;T$$SMC .IF DF T$$GMC;; GET CHARACTER LENGTH;T1050$: CLRB (R1) ;ASSUME 8-BIT* BIT #S5.CLN,U.TST5-U.TSTA(R5) ;CHECK THAT BEQ 1070$ ;CORRECT - JUMP INCB (R1) ;SET 7-BIT LENGTHJ5 BR 1070$ ;JOIN COMMON CODE TO CHECK LINE PARAMETERS .ENDC ;T$$GMC .IF DF T$$SMC/1060$: MOV #10000,R0 ;INDICATE SET 7-BIT LENGTH) BR 1080$S .ENDC ; DF T$$SMC .IF DF T$$GMC1070$: INC R1 ;BUMP POINTER# MOV #20000,R0 ;INDICATE GET LENGTHD .ENDC ;DF T$$GMCR .IF DF T$$GMC ! T$$SMCF1080$:6 CALL CTRPRM ;MAKE SURE INTERFACE HAS SETTABLE LENGTH4 RETURN ;RETURN TO CALLER FOR NEXT CHARACTERISTICS .ENDC ;DF T$$GMC ! T$$SMC .DSABL LSBT;T7; LOCAL SUBROUTINE TO CALL CONTROLLER-DEPENDENT ROUTINEM;RSPDPRM:N$ CMPB -2(R1),#TC.RSP ;RECEIVE SPEED? BEQ 10$ ;IF EQ, YES...SKIP& BIS #400,R0 ;N - FLAG TRANSMIT SPEED10$: .IF DF T$$MOD# CMPB -2(R1),#TC.ASP ;ANSWER SPEED?M BNE CTRPRM ;IF NE, NO...SKIP$ BIS #1000,R0 ;Y - FLAG ANSWER SPEED .ENDC ;T$$MODCTRPRM: MOV R1,-(SP) ;Save R1+ CLR R1 ;Indicate not flow control change.T .ENDC ;D$$H11!D$$Z11!D$$V11 .ENABLE LSBCTRPR2: MOV #10$,-(SP)9 CALL MPCCOR ;MAP DRIVER DATA AND RETURN AS A CO-ROUTINEL5 MOV #CT.PRM,R2 ;SET INDEX FOR LINE PARAMETER ROUTINER .IF DF T$$OVL( MOV #CTRD,-(SP) ;GET ADDRESS OF ROUTINE CALL MPROT ;AND GOTO ROUTINE8 RETURN ;CAN'T USE CALLR CAUSE OF STACK INPUT TO MPROT .IFF ;T$$OVLF7 CALLR CTRD ;CALL CONTROLLER ROUTINE AND PRESERVE CC-CN .ENDC ;T$$OVL10$:+ MOV (SP)+,R1 ;Restore R1 and preserve CC-Ct RETURN ;Donen;T .DSABLE LSB.PAGE1; .SBTTL . MCTSY, MCHSY, MCBIN - FLOW CONTROL STATUS CHANGER .ENABL LSB MCTSY:: ; OUTPUT FLOW CONTROL .IF DF T$$GMC&T$$SMCX0 BEQ 9100$ ;GET OUTPUT FLOW CONTROL INFO - JUMP .ENDC ;T$$GMC&T$$SMCS .IF DF T$$SMC;O; SET OUTPUT FLOW CONTROLR; 4 MOV #^B<1000>,-(SP) ; ASSUME NO OUTPUT FLOW CONTROL6 BIC #S3.TSY,-U.TSTA(R5) ; ASSUME NO TTSYNCH TSTB (R1)+ ; CHECK ASSUMPTION' BEQ 9900$ ; CORRECT - NOTIFY THE PORTr00hhhf__DATADATADATADATA0 BIS #S3.TSY,-U.TSTA(R5) ; SET TTSYNCH6 MOV #^B<0100>,(SP) ; SET FLAG FOR ENABLE FLOW CONTROL BR 9900$ ; NOTIFY THE PORT .ENDC ;T$$SMC .IF DF T$$GMC19100$: CLRB (R1) ; ASSUME NO OUTPUT FLOW CONTROLC+ BIT #S3.TSY,-U.TSTA(R5) ; CHECK BEQ 9950$ ; CORRECT - RETURN& INCB (R1) ; SHOW OUTPUT FLOW CONTROL BR 9950$ ; AND RETURNL .ENDC ;T$$GMCMCHSY:: ; Input flow controlM .IF DF T$$GMC&T$$SMC / BEQ 9200$ ;Get input flow control info - JumpY .ENDC ;T$$GMC&T$$SMC< .IF DF T$$SMC;S; Set input flow control;P3 MOV #^B<0010>,-(SP) ; ASSUME NO INPUT FLOW CONTROLT5 BIC #S4.HSY,-U.TSTA(R5) ; Assume no HSYNCH0 TSTB (R1)+ ; Check assumptionF' BEQ 9900$ ; Correct - Notify the portS/ BIS #S4.HSY,-U.TSTA(R5) ; Set HSYNCH6 MOV #^B<0001>,(SP) ; SET FLAG FOR ENABLE FLOW CONTROL BR 9900$ ; Notify the port .ENDC ;T$$SMC .IF DF T$$GMC09200$: CLRB (R1) ; Assume no input flow control+ BIT #S4.HSY,-U.TSTA(R5) ; CheckM BEQ 9950$ ; Correct - Return& INCB (R1) ; Show output flow control BR 9950$ ; And returnF .ENDC ;T$$GMCMCBIN:: ; Read Pass All .IF DF T$$GMC&T$$SMCT* BEQ 9300$ ;Get read pass all info - Jump .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC;-; Set read pass allC;4 MOV #^B<1000>,-(SP) ; ASSUME NO OUTPUT FLOW CONTROL9 BIS #S3.RAL,-U.TSTA(R5) ; Assume read pass all  TSTB (R1)+ ; Check assumptionu' BNE 9900$ ; Correct - Notify the port.9 BIC #S3.RAL,-U.TSTA(R5) ; Set no read pass all2 BIT #S3.TSY,-U.TSTA(R5) ; TTSYNCH now?7 BEQ 9900$ ; If EQ no - Notify port of no flow controlA7 MOV #^B<0100>,(SP) ; Set the output flow control flagss 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) ; CheckL BEQ 9950$ ; Correct - Return INCB (R1) ; Show read pass all BR 9950$ ; And return$ .ENDC ;T$$GMC .IF DF T$$SMC;3?; Notify the port of the flow control status change. The flags<; are passed in R1. ;T29900$: MOV (SP),-(SP) ; Duplicate the top of stack MOV R1,2(SP) ; Save R1B MOV (SP)+,R1 ; Settup the flag ' CALLR CTRPR2 ; Call the port and exito .ENDC ;T$$SMC .IF DF T$$GMC9950$:' INC R1 ; POINT TO NEXT CHARACTERISTIC" RETURN ; All done with this one .ENDC ;T$$GMC .DSABL LSB .PAGE( .SBTTL . MCTTP - TERMINAL TYPE OPTIONS;d; GET/SET TERMINAL TYPEC;MCTTP::$ .IF DF T$$GMC&T$$SMCp$ BEQ 460$ ;GET TERMINAL TYPE - JUMP .ENDC ;T$$GMC&T$$SMCi .IF DF T$$SMC;(; SET TERMINAL TYPE.J; IF THE TYPE IS RECOGNIZED (CONTAINED IN THE TABLES TTYP1, TTYP2, TTYP3),J; SET THE CORRESPONDING IMPLICIT CHARACTERISTICS. IMPLICIT CHARACTERISTICS; ARE:; TC.HHT; TC.HFF; TC.HFL; TC.LPP; TC.SCP; TC.VFL; TC.WID; 5; IN ADDITION, THE CURSOR POSITIONING TYPE IS STORED.;B.; IN ANY CASE, STORE NEW TYPE VALUE IN U.TTYP.;  CLR R2 ;GET NEW TYPE VALUE+ BISB @R1,R2 ;WITHOUT SIGN EXTEND PROBLEMSE BEQ 440$ ;ZERO - UNKNOWN, JUMP( CMPB R2,#TTPHI ;IN TERMINAL TYPE TABLE? BHI 440$ ;N - UNKNOWN, JUMPS/ MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGT- TSTB TTYP2-1(R2) ;UNSUPPORTED TERMINAL TYPE?T BEQ 435$ ;Y - JUMP? BIC #U2.CRT,U.CW2-U.TSTA(R5) ;ASSUME 0 FOR ALL CHARACTERISTICSC; BIC #S4.HFF!S4.HHT!S4.HFL!S4.VFL,6(R5) ;MORE BITS TO CLEARIA BIC #U3.UPC,U.CW3-U.TSTA(R5) ;ASSUME TERMINAL SUPPORTS LOWERCASEU CMPB R2,#T.AS35 ;CHECK THAT) BHI 400$ ;ASSUMPTION WAS CORRECT - JUMPE< BIS #U3.UPC,U.CW3-U.TSTA(R5) ;FORCE CONVERSION TO UPPERCASE7400$: MOVB TTYP1-1(R2),R0 ;GET IMPLICIT CHARACTERISTICSS* BICB #300,R0 ;CLEAR OUT CURSOR POS. TYPE;P:; HFF,HFL,HHT,VFL MUST BE IN THE LOW BYTE OF STATUS WORD 4;  .IIF GE S4.HFF-400 .ERROR .IIF GE S4.HFL-400 .ERROR .IIF GE S4.HHT-400 .ERROR .IIF GE S4.VFL-400 .ERROR5 BISB R0,6(R5) ;STORE IMPLICIT CHARACTERISTICS IN LOW5 ;BYTE OF STATUS WORD 4A BIC #U2.HFF,U.CW2-U.TSTA(R5) ;ASSUME NEW TYPE DOESN'T SUP00hhhibjbkb a a aPORT FFS2 BITB #S4.HFF,R0 ;WAS FORMFEED CHARACTERISTIC SET? BEQ 420$ ;N - JUMP< BIS #U2.HFF,U.CW2-U.TSTA(R5) ;INDICATE TERMINAL SUPPORTS FF420$: = MOVB TTYP2-1(R2),U.CW4-U.TSTA(R5) ;STORE IMPLICIT PAGE WIDTHT? MOVB TTYP3-1(R2),U.TLPP-U.TSTA(R5) ;STORE IMPLICIT PAGE LENGTHR BPL 430$ ;NOT A SCOPE - JUMP8 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 SCOPET430$:A: .IIF LT S4.ABD-400 .ERROR ; ABD MUST BE IN THE HIGH BYTEB BICB #^C,7(R5) ;SET EXTENDED TERMINAL CHARACTERISTICS BISB TTYP4-1(R2),7(R5) ; ...H435$: ;REFERENCE LABELT+ MOV I.PRM(R3),KISAR6 ;RESTORE TASK MAPPING(440$:W/ MOVB (R1),U.TTYP-U.TSTA(R5) ;SET TERMINAL TYPET> BIC #U2.L3S!U2.VT5,U.CW2-U.TSTA(R5) ;CLEAR TERMINAL TYPE BITS CMPB (R1)+,#T.L30S ;LA30S?C BNE 450$ ;N - JUMP= BIS #U2.L3S,U.CW2-U.TSTA(R5) ;OTHERWISE, SET LA30S TYPE FLAGI BR 455$ ;SKIP TO FINISHT!450$: CMPB -1(R1),#T.VT05 ;VT05B?R BNE 455$ ;IF NE, NO...SKIP= BIS #U2.VT5,U.CW2-U.TSTA(R5) ;OTHERWISE, SET VT05B TYPE FLAGA455$:I) RETURN ;RETURN FOR NEXT CHARACTERISTIC  .ENDC ;T$$SMC .IF DF T$$GMC; ; GET TERMINAL TYPE(;4460$:M: MOVB U.TTYP-U.TSTA(R5),(R1)+ ;GIVE USER THE TERMINAL TYPE) RETURN ;RETURN FOR NEXT CHARACTERISTICP .ENDC ;T$$GMC.PAGE 1 .SBTTL . MCTBF - TYPEAHEAD BUFFER COUNT OPTIONSU;T@; FLUSH TYPEAHEAD OR GET TYPEAHEAD BUFFER ACTIVE CHARACTER COUNT;5MCTBF::- .IF DF T$$GMC&T$$SMCB BEQ 510$ ;GET COUNT - JUMP .ENDC ;T$$GMC&T$$SMC  .IF DF T$$SMC;Y; FLUSH THE TYPE-AHEAD BUFFERT; # INC R1 ;SKIP PAST DUMMY SET VALUE$7 CALL MPCCOR ;MAP DATABASE AND COME BACK AS CO-ROUTINE6 .IF DF T$$OVL MOV #I1CTXL,-(SP) ;GET ADDRESSI. CALL MPROT ;CALL ROUTINE TO FLUSH TYPE AHEAD RETURN ;BACK FROM COROUTINE .IFF ;T$$OVLF7 CALLR I1CTXL ;FLUSH TYPE-AHEAD BUFFER WITH INTERRUPTSR ;LOCKED OUTF .ENDC ;T$$OVL .ENDC ;T$$SMC .IF DF T$$GMC;C7; GET THE NUMBER OF CHARACTERS IN THE TYPE-AHEAD BUFFERC;$510$: .IF DF T$$SPL5 MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP THE UCBX AND TABUFS! MOV #120000+U.TTBF,R2 ;GET TABUFM .IFF ;T$$SPLO/ MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING#$ MOV U.TTAB-U.TSTA(R5),R2 ;GET TABUF .IFTF ;T$$SPL* MOVB 2(R2),R2 ;GET ACTIVE CHARACTER COUNT .IFF ;T$$SPLV& MOV I.PRM(R3),KISAR6 ;MAP USER BUFFER .ENDC ;T$$SPL% MOVB R2,(R1)+ ;STORE COUNT IN BUFFER.) RETURN ;RETURN FOR NEXT CHARACTERISTICH .ENDC ;T$$GMC.PAGE 6 .SBTTL . MCTYP/MCTBS - TYPEAHEAD BUFFER SIZE OPTIONS;V,; GET/SET TYPEAHEAD BUFFER PRESENCE AND SIZE;S .IF DF T$$SPL .ENABL LSBUMCTYP::  .IF DF T$$GMC&T$$SMCI BEQ 520$ ;GET PRESENCE - JUMP .ENDC ;T$$GMC&T$$SMCR .IF DF T$$SMC;;/; ENABLE TYPEAHEAD WITH AN OPTIMAL DEFAULT SIZEU;9 MOV #<<2*64.>->,R2 ;COMPUTE OPTIMAL TABUF SIZE' TSTB (R1)+ ;ASSUME ENABLING TYPEAHEAD  BNE 530$ ;CORRECT - JUMP CLR R2 ;INDICATE NO TYPEAHEADH BR 530$ ;ENFORCE THAT  .ENDC ;T$$SMC .IF DF T$$GMC;EI; RETURN WHETHER TYPEAHEAD IS ENABLED OR DISABLED (ENABLED IMPLIES A SIZEF; OF 2 OR GREATER);S0520$: MOVB #1,(R1)+ ;ASSUME TYPEAHEAD IS ENABLED BR 580$ ;CHECK THATM .ENDC ;T$$GMC;$; GET/SET TYPEAHEAD BUFFER SIZEN;EMCTBS::D .IF DF T$$GMC&T$$SMCS BEQ 570$ ;GET COUNT - JUMP .ENDC ;T$$GMC&T$$SMCT .IF DF T$$SMC; 3; SET THE SIZE OF THE TYPEAHEAD BUFFER (0 -> 255.).U2; A SIZE OF ZERO OR ONE IMPLIES TYPEAHEAD DISABLED;E# CLR R2 ;PREPARE TO PICK UP A BYTE$+ BISB (R1)+,R2 ;GET THE USER SPECIFIED SIZEB'530$: MOV R1,-(SP) ;SAVE BUFFER POINTER< MOV #120000+U.TAST,R1 ;SET POINTER TO UNSOLICITED INPUT ACB X = U.TAST .IF DF T$$CCA4 MOV (R1)+,-(SP) ;SAVE UNSOLICITED INPUT ACB ADDRESS X = X + 2 .ENDC ;T$$CCA .IF DF T$$SCA ASSUME U.TSCA,X X = X + 23 MOV (R1)+,-(SP) ;SAVE SWITCH CHARACTER ACB ADDRESSE .ENDC ;T$$SCA .IF DF T$$MHU ASSUME U.TMHA,X X = X + 2O/ MOV (R1)+,-(SP) ;SAVE MODEM HANGUP ACB ADDRESSR00hihf__DATADATADATADATA .ENDC ;T$$MHU .IF DF T$$ICS ASSUME U.TICA,X X = X + 2Z* MOV (R1)+,-(SP) ;SAVE ICS ACB/TEP ADDRESS .ENDC ;T$$ICS .IF DF T$$OOB ASSUME U.TOBA,X X = X + 2 * MOV (R1)+,-(SP) ;SAVE OOB ACB/TEP ADDRESS .ENDC ;T$$OOB MOV R2,R1 ;PUT SIZE IN R1 BNE 540$ ;SETTING NOTYPEAHEAD? MOV #1,R1 ;Y - SET SIZE TO 1540$: MOV R1,-(SP) ;SAVE SIZE : ADD #T$$UXL+4+77,R1 ;COMPUTE TOTAL NUMBER OF BYTES NEEDED8 ASH #-6,R1 ;CONVERT TO NUMBER OF SECONDARY POOL BLOCKS' CALL $ALSEC ;ATTEMPT TO ALLOCATE THEM BCS 560$ ;FAILURE - JUMP: MOV R0,-(SP) ;SAVE ADDRESS OF SEC POOL RETURNED BY $ALSEC5 MTPS #TTPRI ;PREVENT INTERRUPTS WHILE CHANGING SIZEO .IF DF T$$OVL* MOV $DALED,KISAR6 ;;MAP TO DATA FOR MPROT: MOV #DEUCBX,-(SP) ;;DEALLOCATE THE CURRENT UCBX AND TABUF CALL MPROT ;; ... .IFF ;T$$OVLS1 CALL DEUCBX ;;DEALLOCATE CURRENT UCBX AND TABUF$ .IFTF ;T$$OVL( MOV (SP)+,R0 ;;RETRIEVE THE NEW ADDRESS/ MOVB (SP),U.TBSZ-U.TSTA(R5) ;;SET THE NEW SIZEC- BIS #S3.TAB,4(R5) ;;ASSUME SETTING TYPEAHEAD0 DEC (SP)+ ;;CHECK THAT BNE 550$ ;;CORRECT - JUMPP$ BIC #S3.TAB,4(R5) ;;SET NOTYPEAHEAD550$:T .IFT ;T$$OVLL2 MOV #STUCBX,-(SP) ;;CREATE THE NEW UCBX AND TABUF CALL MPROT ;; ...M# MOV I.PRM(R3),KISAR6 ;; REMAP TASK .IFF ;T$$OVLA- CALL STUCBX ;;CREATE THE NEW UCBX AND TABUF .ENDC ;T$$OVL8 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 POINTERC .IIF DF T$$MHU, MOV (SP)+,-(R1) ;;RESTORE MODEM HANGUP ACB POINTER3C .IIF DF T$$SCA, MOV (SP)+,-(R1) ;;RESTORE SWITCH CHAR. ACB POINTER-C .IIF DF T$$CCA, MOV (SP)+,-(R1) ;;RESTORE UNSOL. INPUT ACB POINTERM MTPS #PR0 ;;ENABLE INTERRUPTS * MOV (SP)+,R1 ;RESTORE TASK BUFFER POINTER" RETURN ;GET NEXT CHARACTERISTIC;V<; ALLOCATION FAILURE TRYING TO CREATE A NEW TYPEAHEAD BUFFER;T560$:MSTKPOP = X - U.TAST + 2B, 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;&; GET THE SIZE OF THE TYPEAHEAD BUFFER;U570$:NB MOVB U.TBSZ-U.TSTA(R5),(R1)+ ;GET SIZE ASSUMING TYPEAHEAD ENABLED580$:E) BIT #S3.TAB,4(R5) ;IS TYPEAHEAD ENABLED?H BNE 590$ ;CORRECT - JUMP CLRB -1(R1) ;RETURN SIZE = 0590$:H" RETURN ;GET NEXT CHARACTERISTIC .ENDC ;T$$GMC .DSABL LSB  .ENDC ;T$$SPL.PAGEK" .SBTTL . MCCTS - CONTROL-S STATE;I; GET/SET CONTROL-S STATUS; MCCTS::R .IF DF T$$GMC&T$$SMCE BEQ 630$ ;GET ^S STATUS - JUMP .ENDC ;T$$GMC&T$$SMC .IF DF T$$SMC; ; SET OR CLEAR ^S CONDITION$;. 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;RF; NOTE: DUE TO MAPPING COMPLICATIONS, THE FOLLOWING CODE IS DUPLICATED; FROM I1CTSL AND I1CTQL* ;N - FAKE A ^Q. TASK MAPPED ON RETURN! CALL LOCKI ;LOCK OUT INTERRUPTS * BIC #S2.CTS,2(R5) ;;;CLEAR CONTROL-S FLAG0 MOV #CT.RES,R2 ;;;SET INDEX FOR "RESUME OUTPUT"@ BITB #US.OIU,U.STS-U.TSTA(R5) ;;;EXPECTING AN OUTPUT INTERRUPT?# BNE 660$ ;;;IF NE, NO...JUST EXIT  BR 620$+610$: ;FAKE A ^S, RETURN WILL REMAP TASKM! CALL LOCKI ;LOCK OUT INTERRUPTSA( BIS #S2.CTS,2(R5) ;;;SET CONTROL-S FLAG. MOV #CT.STP,R2 ;;;SET INDEX FOR "STOP OUTPUT"620$:  .IF DF T$$OVL( MOV #CTRD,-(SP) ;GET ADDRESS OF ROUTINE CALL MPROT ;AND GOTO ROUTINE RETURN .IFF ;T$$OVLU1 CALLR CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINEV .ENDC ;T$$OVL .ENDC ;T$$SMC .IF DF T$$GMC;,; GET TERMINAL ^S AND ^O STATUSO;U/630$: CLRB @R1 ;ASSUME NEITHER ^S OR ^O IS SET  ASSUME S2.CTS,100000E* TST 2(R5) ;VERIFY ASSUMPTION FOR ^S BIT$ BPL 640$ ;ASSUMED CORRECTLY - JUMP. INCB @R1 ;ASSUMPTION WAS WRONG - SET THE BIT7640$: BIT #S2.CTO,2(R5) ;VERIFY ASSUMPTION FOR ^O BIT# BEQ 650$ ;^O IS NOT SET - JUMP4 BISB 00h ihnibjbkb a a a#2,@R1 ;^O IS SET, SET CORRESPONDING USER BIT650$: INC R1 ;SKIP PAST VALUE FIELDE .ENDC ;T$$GMC .IF DF T$$GMC!T$$SMCC'660$: RETURN ;GET NEXT CHARACTERISTICM .ENDC ;T$$GMC!T$$SMCU.PAGEB+ .SBTTL . MCACD - ANCILLARY CONTROL DRIVERS .IF DF T$$ACD;T(; GET/SET ANCILLARY CONTROL DRIVER (ACD);LMCACD::S .IF DF T$$GMC&T$$SMCI) BEQ 810$ ;GET ACD IDENTIFICATION NUMBER .ENDC ;T$$GMC&T$$SMC  .IF DF T$$SMC;^1; SET/RESET THE ACD ASSOCIATED WITH THIS TERMINAL2;12 MOV R1,-(SP) ;SAVE CHARACTERISTICS BUFFER POINTER& MOV R3,-(SP) ;SAVE I/O PACKET POINTER/ CLR -(SP) ;ASSUME NO TARGET ACD WAS SPECIFIEDN! TSTB @R1 ;CHECK THAT ASSUMPTIONN BEQ 730$ ;VALID - JUMP;BF; SEARCH THE ACB LIST (LISTHEAD IS $ACDHD) FOR THE PROTOTYPE ACB WHICHK; HAS THE SAME IDENTIFICATION NUMBER AS THE NUMBER SPECIFIED BY THE REQUESTM;< MOV $ACDHD,R0 ;TARGET ACD SPECIFIED, FIND ITS PROTOTYPE ACB: BEQ 710$ ;THERE ARE NO ACDS IN THE SYSTEM - RETURN ERRORI700$: CMPB A.NUM(R0),@R1 ;HAVE WE FOUND THE MATCHING PROTOTYPE ACD BLOCK?I BEQ 720$ ;Y - JUMP+ MOV A.LIN(R0),R0 ;N - GET NEXT ACB IN LISTO BNE 700$ ;KEEP LOOKING710$: TST (SP)+ ;CLEAN STACKO) MOV (SP)+,R3 ;RESTORE I/O PACKET POINTERT5 MOV (SP)+,R1 ;RESTORE CHARACTERISTICS BUFFER POINTERW, TST (SP)+ ;CLEAN RETURN ADDRESS FROM STACK$ JMP ERCVL1 ;RETURN BAD VALUE ERROR;M2; FOUND THE ACB. CHECK IF CONNECTS ARE DISALLOWED;AG720$: BITB #AS.DLT!AS.DIS,A.STA(R0) ;ACD MARKED FOR DELETE OR DISABLED?A BNE 710$ ;Y - ERRORN;H ; ATTEMPT TO ALLOCATE A FULL ACB;Q6 MOV R0,-(SP) ;SAVE R0 DESTROYED BY ALLOCATION ROUTINE) CLR R1 ;EXTRA STEP TO AVOID SIGN EXTENDS+ BISB A.FLEN(R0),R1 ;SET LENGTH OF FULL ACBE CALL $ALOCB ;ALLOCATE AN ACB9 MOV R0,R2 ;COPY ACB ADDRESS WITHOUT AFFECTING CARRY BITN5 MOV (SP)+,R0 ;RESTORE R0 WITHOUT AFFECTING CARRY BITL% BCS 710$ ;ALLOCATION FAILED - ERROR ;CG; SAVE THE ADDRESS OF THE FULL ACB, AND COPY THE COMMON FIELDS FROM THER; PROTOTYPE ACB INTO ITD;0 MOV R2,@SP ;REPLACE ZERO WITH FULL ACB ADDRESS$ INC A.ACC(R0) ;UPDATE ACD USE COUNT. MOV (R0)+,(R2)+ ;COPY RELOCATION BIAS (A.REL)5 MOV (R0)+,(R2)+ ;COPY DISPATCH TABLE POINTER (A.DIS)T7 MOV (R0)+,(R2)+ ;COPY FIRST FUNCTION MASK WORD (A.MAS): MOV (R0)+,(R2)+ ;COPY SECOND FUNCTION MASK WORD (A.MAS+2): MOV (R0),(R2) ;COPY ID NUMBER (A.NUM) AND LENGTH (A.FLEN); H; IF THE TERMINAL IS CURRENTLY LINKED TO AN ACD, FIND THE PROTOTYPE ACB.H; IF IT CANNOT BE FOUND THEN A SERIOUS ERROR HAS OCCURRED AND THE SYSTEM ; IS CRASHED.O;T.730$: MOV U.ACB-U.TSTA(R5),R2 ;GET CURRENT ACB BEQ 770$ ;NONE - JUMP+5 MOV $ACDHD,R0 ;SEARCH THE ACB LIST FOR ITS PROTOTYPED9 BEQ 750$ ;LIST IS EMPTY YET TERMINAL HAS AN ACD - CRASHT<740$: CMPB A.NUM(R0),A.NUM(R2) ;IS THIS THE RIGHT PROTOTYPE? BEQ 760$ ;Y - JUMP1 MOV A.LIN(R0),R0 ;GET NEXT PROTOTYPE ACB IN LISTN BNE 740$ ;KEEP LOOKING:750$: CRASH ;CAN'T FIND PROTOTYPE OF CURRENT ACD - CRASH;CK; FOUND THE PROTOTYPE. DECREMENT THE USE COUNT AND DISCONNECT THE ACD FROM<; THE TERMINAL. THEN ALERT THE ACD TO WHAT HAS TAKEN PLACE.;B-760$: DECB A.ACC(R0) ;DECREMENT THE USE COUNTR= CLR U.ACB-U.TSTA(R5) ;DISASSOCIATE THE ACD FROM THE TERMINALE: MOV #A.DISC,R1 ;SET TO CALL ACD AT DISCONNECT ENTRY POINT. MOV R2,R0 ;MAKE ACB ADDRESS AVAILABLE TO ACD CALL 790$ ;SWITCH TO ACD;NA; COMPLETE DISCONNECT PROCESSING BY DEALLOCATING THE OLD FULL ACB ;N+ MOV R2,R0 ;COPY ADDRESS OF NOW UNUSED ACB) CLR R1 ;EXTRA STEP TO AVOID SIGN EXTENDO+ BISB A.FLEN(R0),R1 ;SET LENGTH OF FULL ACBN! CALL $DEACB ;DEALLOCATE THE ACBA;L*; CONNECT THE NEW ACD IF ONE WAS SPECIFIED;S3770$: MOV @SP,R0 ;GET THE NEW ACD FULL ACB ADDRESS ! BEQ 780$ ;NONE SPECIFIED - EXIT ;TC; INFORM THE ACD OF THE CONNECT AND THEN PERFORM THE CONNECT ITSELF ;I8 CLRB A.IOS(R0) ;ASSUME CONNECT REQUEST WILL BE ACCEPTED; MOV #A.CONN,R1 ;SET TO CALL ACD AT ITS CONNECT ENTRY POINTM CALL 790$ ;SWITCH TO THE ACD" MOV (SP),R0 ;GET THE ACB ADDRESS. TSTB A.IOS(R0) ;WAS CONNECT REQUEST A00hnhf__DATADATADATADATACCEPTED? BEQ 775$ ;Y - JUMP) CLR R1 ;EXTRA STEP TO AVOID SIGN EXTENDC@ BISB A.FLEN(R0),R1 ;SET LENGTH OF FULL ACB THE ACD HAS REJECTED! CALL $DEACB ;DEALLOCATE THE ACB0 BR 710$ ;RETURN AN ERRORJ775$: MOV R0,U.ACB-U.TSTA(R5) ;LINK THE ACB TO CONNECT ACD TO THE TERMINAL;C; SET/RESET EXIT PROCESSING ;U780$: TST (SP)+ ;CLEAN STACKO) MOV (SP)+,R3 ;RESTORE I/O PACKET POINTER 5 MOV (SP)+,R1 ;RESTORE CHARACTERISTICS BUFFER POINTER ) TSTB (R1)+ ;POINT TO THE NEXT PARAMETERC) RETURN ;RETURN FOR NEXT CHARACTERISTIC ;PN; SUBROUTINE TO SET UP STACK PARAMETERS AND THEN CALL THE EXECUTIVE SUBROUTINE:; WHICH SWITCHES FROM THE DRIVER TO THE ACD AND BACK AGAIN;C790$: & MOV KINAR5,-(SP) ;SET CURRENT MAPPING .IF DF T$$COM. MOV KDSAR5,-(SP) ;SET CURRENT D-SPACE MAPPING .ENDC% MOV R1,-(SP) ;SET ENTRY POINT OFFSETA: JMP $SWAC1 ;JUMP TO ROUTINE TO AVOID EXTRA STACK STORAGE .ENDC ;T$$SMC .IF DF T$$GMC;N;; RETURN THE IDENTICATION NUMBER OF THE CURRENT ACD, IF ANYR;R;810$: CLRB (R1)+ ;ASSUME THERE IS NO ACD FOR THIS TERMINALP+ MOV U.ACB-U.TSTA(R5),R0 ;GET THE ACD BLOCKI BEQ 820$ ;NONE - JUMP 8 MOVB A.NUM(R0),-1(R1) ;RETURN ITS IDENTIFICATION NUMBER820$:P) RETURN ;RETURN FOR NEXT CHARACTERISTIC .ENDC ;T$$GMC .ENDC ;T$$ACD.PAGEG4 .SBTTL . MCRMT - LOCAL/REMOTE/DIALOUT LINE STATUS;P; GET/SET REMOTE STATUS ;A .IF DF T$$MODMCRMT:: .IF DF T$$GMC&T$$SMC ( BNE 100$ ;IF NE, SET NEW REMOTE STATUS .ENDC ;T$$GMC&T$$SMC  .IF DF T$$GMC;1; GET REMOTE STATUSN;C" CLRB (R1)+ ;ASSUME LINE IS LOCAL5 BIT #U2.RMT,U.CW2-U.TSTA(R5) ;IS THIS A REMOTE LINE? - BEQ 10$ ;IF EQ, NO...ASSUMPTION WAS CORRECTT$ 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 CORRECTO) INCB -1(R1) ;TELL USER LINE IS DIAL-OUTE10$:) RETURN ;RETURN FOR NEXT CHARACTERISTIC .ENDC ;T$$GMC .IF DF T$$SMC;;$; SET LINE REMOTE/NOREMOTE/DIAL-OUT.;$&; THE STATE OF THE LINE IS AS FOLLOWS:; 3; LOCAL -> U2.RMT CLEAR, S4.DLO CLEAR, US.DSB CLEARLE; INCOMING CALLS -> U2.RMT SET, S4.DLO CLEAR, US.DSB SET IF NO CALLER J; OUTGOING CALLS -> U2.RMT SET, S4.DLO SET, US.DSB SET IF NO CALLER/CALLEE;4100$:R) MOV I.TCB(R3),R0 ;GET ISSUING TASK'S TCB / BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED?T2 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 MODET) RETURN ;RETURN FOR NEXT CHARACTERISTIC ;G; LINE IS REMOTE OR DIAL-OUT;S110$:D, TSTB (R1) ;IS USER SETTING THE LINE LOCAL?& BEQ 200$ ;IF EQ, YES...SKIP TO DO IT;#F; RESET OR SWITCH BETWEEN REMOTE AND DIAL-OUT. DON'T HANGUP THE LINE.;P2 CMPB #1,(R1)+ ;IS USER SETTING THE LINE DIAL-OUT?1 BNE 120$ ;IF NE, YES...SKIP TO MAKE IT DIAL-OUTL) BIC #S4.DLO,6(R5) ;SET LINE DIAL-IN ONLYE) RETURN ;RETURN FOR NEXT CHARACTERISTICY120$:I% BIS #S4.DLO,6(R5) ;SET LINE DIAL-OUTN) RETURN ;RETURN FOR NEXT CHARACTERISTICT;A); ERROR PROCESSING FOR SET REMOTE OPTIONSO;190$:$, TST (SP)+ ;CLEAN RETURN ADDRESS FROM STACK( JMP ERCPRI ;RETURN PRIVILEGE VIOLATION;#:; HERE TO DISPATCH ON CONTROLLER TYPE TO CHANGE LINE STATE;T200$:. .IF DF R$$MPL! MOV U.SCB-U.TSTA(R5),R0 ;GET SCB? MOV S.KRB(R0),R0 ;GET KRB' MOVB K.PRM(R0),R0 ;GET CONTROLLER TYPER .IFF ;R$$MPL-/ MOVB U.CTYP-U.TSTA(R5),R0 ;GET CONTROLLER TYPEY .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 HEREN BR RMTDC ;PRO VIDEO INTERFACEE BR RMTDV ;DHV11I RETURN ;TTLH (LAT)E .IF DF T$$USP ;DC416 BR RMTUS ;USER PORT ;DC416 .IFF ;DF,T$$USP ;DC416B" RETURN ;JUST IN CASE ;DC416 .ENDC ;DF,T$$USP ;DC416 .IF DF D$$M11 .IF DF R$$MPLRMTDH:!00hnnibjbkb a a a MOV U.SCB-U.TSTA(R5),R0 ;GET SCBO 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$$ONIM) MOV $DALED,KISAR6 ;MAP DRIVER DATA SPACEE .ENDC ;T$$SPL!T$$ONI; .IF DF T$$ONI. MOV YMC12,R0 ;GET POINTER TO DM11-BB KRB LIST .IFF ;T$$ONI . MOV YMCP1,R0 ;GET POINTER TO DM11-BB KRB LIST .ENDC ;T$$ONI .IF DF T$$SPL!T$$ONI$( MOV I.PRM(R3),KISAR6 ;REMAP TASK BUFFER .ENDC ;T$$SPL!T$$ONIU5 CMPB L.NUM-L.KRB(R0),(SP)+ ;IS THIS KRB IN THE LIST?* BLOS RMTER ;IF LOS, NO...RETURN AN ERROR .IFF ;R$$MPLTRMTDH:! MOV U.SCB-U.TSTA(R5),R0 ;GET SCB TST S.DMCS(R0) ;GET DM11-BB CSR* BEQ RMTER ;IF EQ, NONE...REPORT AN ERROR .ENDC ;R$$MPL .ENDC ;D$$M11 .IF DF T$$UMD ;DC416 ;DC416RMTUS: ;DC416 .ENDC ;DF,T$$UMD ;DC416 ;DC416 .IF DF D$$VMDRMTDV: .ENDC ;D$$VMD .IF DF D$$LMDRMTDL: .ENDC ;D$$LMD .IF DF D$$ZMDRMTDZ: .ENDC ;D$$ZMD8 BIC #U2.RMT,U.CW2-U.TSTA(R5) ;ASSUME SETTING LINE LOCAL* BIC #S4.DLO,6(R5) ;CANNOT DIAL OUT EITHER CMPB @R1,#1 ;ASSUMPTION TRUE?' BLO 20$ ;IF LO, YES...GO SET IT LOCALR! BEQ 15$ ;IF EQ, SET LINE REMOTER% BIS #S4.DLO,6(R5) ;SET LINE DIAL-OUT15$:3 BIS #U2.RMT,U.CW2-U.TSTA(R5) ;ALLOW INCOMING CALLS 20$:( INCB U.TMTI-U.TSTA(R5) ;SET MODEM TIMER7 BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIER TSTB (R1)+ ;LINE NOW REMOTE?( BNE 30$ ;IF NE, YES...ALL DONE WITH IT3 BICB #US.DSB,U.STS-U.TSTA(R5) ;LOCAL - ENABLE LINES30$:) RETURN ;RETURN FOR NEXT CHARACTERISTICT;A; LINE STATUS CANNOT BE CHANGEDM;O .IF NDF D$$M11 RMTDH: .ENDC ;NDF D$$M11 .IF NDF T$$UMD ;DC416RRMTUS: ;DC416 ;DC416 .ENDC ;NDF,T$$UMD ;DC4165 ;DC416 .IF NDF D$$VMDCRMTDV: .ENDC ;NDF D$$VMD .IF NDF D$$LMD,RMTDL: .ENDC ;NDF D$$LMD .IF NDF D$$ZMDRRMTDZ: .ENDC ;NDF D$$ZMDRMTDJ:RMTDC:RMTER: TST (SP)+ ;CLEAN OFF THE STACK6 JMP ERCNSC ;RETURN NON-SETTABLE CHARACTERISTIC ERROR .ENDC ;T$$SMC .ENDC ;T$$MOD.PAGET2 .SBTTL . MCSSC - TERMINAL MGMT SWITCH CHARACTERS .IF DF T$$SCA;F#; GET/SET FOR SET SWITCH CHARACTERS ; F; WHEN ISSUED VIA INTERNAL I/O, THE CHARACTERISTIC BUFFER FORMAT IS:;4); +-------------------------------------+D); 1 | RESERVED | TC.SSC | 0.); |-------------------------------------|D$; 3 | TEP ADDRESS OR 0 | 2); +-------------------------------------+A;?; THE ASSOCIATED TEP MUST BE PROPERLY FORMATTED WITH THE SWITCH;%; CHARACTERS STORED IN OFFSET E.VSWC.B; A; WHEN ISSUED FROM A TASK, THE CHARACTERISTIC BUFFER FORMAT IS:;E); +-------------------------------------+H); 1 | RESERVED | TC.SSC | 0T); |-------------------------------------|-$; 3 | AST ADDRESS OR 0 | 2); |-------------------------------------|-.; 5 | SWITCH CHARACTERS | 4); +-------------------------------------+-;-MCSSC::-8 MOV #U.TSCA,R4 ;SET OFFSET INTO UCBX OF ACB/TEP POINTER .IF DF T$$SMC? MOV #S3.TME,R2 ;IDENTIFY FLAG TO ENABLE/DISABLE CHARACTERISTICA4 MOV #22.,R0 ;SET SIZE OF ACB TO ALLOCATE IF NEEDED .IFTF ;T$$SMC9 CALL GSAENC ;GET/SET STANDARD ASYNCH EVENT NOTIFICATION + ;IT MAY RETURN WITH INTERRUPTS DISABLED- .IFT ;T$$SMCD .IF DF T$$GMC, BVS 100$ ;IF VS, REQUEST WAS SF.GMC...SKIP .ENDC ;T$$GMC3 ;;;CO-ROUTINE DISABLED INTERRUPTS TIL WE FINISH-, BNE 10$ ;;;IF NE, WE HAVE AN ACB TO MODIFY0 TST (R1)+ ;;;ELSE, USER CLEARED CHARACTERISTIC5 BR 1000$ ;;;RETURN TO GSAENC TO COMPLETE PROCESSINGD10$:< 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;S+; GET TERMINAL MANAGEMENT SWITCH CHARACTERSC;100$:0, BNE 110$ ;IF NE, WE HAVE AN ACB/TEP...SKIP4 CLR (R1)+ ;INDICATE SWITCH CHARACTERS ARE DISABLED00hnhf__DATADATADATADATA BR 1000$ ;FINISH OFF REQUEST110$:  .IF DF R$$IIC7 BCC 120$ ;IF CC, CURRENT SETTING IS FOR AN ACB...SKIP = MOV E.VSWC(R2),(R1)+ ;STORE SWITCH CHARACTERS IN USER BUFFERA) BR 1000$ ;FINISH OFF THE CHARACTERISTICE120$: .ENDC ;R$$IIC> MOV A.PRM+6(R2),(R1)+ ;STORE SWITCH CHARACTERS IN USER BUFFER .ENDC ;T$$GMC1000$:@ SUB #2,I.PRM+4(R3) ;CO-ROUTINE PROCESSED 2 MORE BYTES OF BUFFER4 RETURN ;RETURN TO CO-ROUTINE OR TO GET NEXT CHAR..PAGEI0 .SBTTL . MCTMM - EXIT TERMINAL MANAGEMENT MODE;I&; GET/SET FOR TERMINAL MANAGEMENT MODE;;B; CHARACTERISTIC PACKET FORMAT:I;O; +------------------------+; | 0 | TC.TMM |; +------------------------+; MCTMM::O .IF DF T$$GMC&T$$SMC2+ BEQ 2120$ ;GET TERMINAL MANAGEMENT STATUS+ .ENDC ;T$$GMC!T$$SMC  .IF DF T$$SMC;NC; CHECK FOR ERRORS, EITHER TRYING TO ENABLE TM WITH A QIO OR TRYINGE#; TO EXIT TM WHEN TM IS NOT ACTIVE.O;- TSTB (R1)+ ;EXITING TM?.2 BNE 2110$ ;BR IF NOT. CANNOT ENABLE TM WITH QIO- BIT #S5.TMM,U.TST5-U.TSTA(R5) ;ARE WE IN TM?O0 BEQ 2110$ ;TRYING TO EXIT WHEN WE'RE NOT IN IT) MOV R1,-(SP) ;SAVE REGISTERS OVER KILLI1 MOV R3,-(SP) ;-'; MAP UCBX, AND TERMINATE PENDING READS.;D .IF DF T$$SPL MOV #120000,R4 ;POINT TO UCBX5 MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP THE UCBX AND TABUFC .IFF ;T$$SPL / MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGY- MOV U.TUX-U.TSTA(R5),R4 ;GET POINTER TO UCBX .IFTF ;T$$SPL+ MOV #IS.TMM,R0 ;REASON FOR CANCELLED READSE .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 POINTERU9 BIC #S5.TMM,U.TST5-U.TSTA(R5) ;CLEAR TERMINAL MANG'T BITT .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$$SPLE. MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER .ENDC ;T$$SPL) RETURN ;RETURN FOR NEXT CHARACTERISTICD .IF DF T$$OVL&T$$SPLP. MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER .ENDC ;T$$OVL&T$$SPLG;S ; USER ERROR;L2110$: JMP ERCVAL ;ILLEGAL VALUER .ENDC ;T$$SMC .IF DF T$$GMC;E$; GET TERMINAL MANAGEMENT MODE STATE; 2120$:" CLRB (R1)+ ;ASSUME TM NOT ACTIVE- BIT #S5.TMM,U.TST5-U.TSTA(R5) ;IS TM ACTIVE?O BEQ 2130$ ;BR IF NO INCB -1(R1) ;SAY ENABLED2130$:) RETURN ;RETURN FOR NEXT CHARACTERISTICU .ENDC ;T$$GMC .ENDC ;T$$SCA.PAGEO2 .SBTTL . MCMHU - MODEM HANGUP EVENT NOTIFICATION .IF DF T$$MHU;M(; GET/SET FOR MODEM HANG-UP NOTIFICATION;P; GET/SET PACKET:R*; +-------------------------------------+,; 1 | RESERVED | TC.MHU | 0*; |-------------------------------------|/; 3 | ADDRESS OF AST (TASK) OR TEP (TSA) | 2T*; +-------------------------------------+;$MCMHU::N8 MOV #U.TMHA,R4 ;SET OFFSET INTO UCBX OF ACB/TEP POINTER .IF DF T$$SMC? MOV #S3.MHE,R2 ;IDENTIFY FLAG TO ENABLE/DISABLE CHARACTERISTICM4 MOV #20.,R0 ;SET SIZE OF ACB TO ALLOCATE IF NEEDED .ENDC ;T$$SMC9 CALL GSAENC ;GET/SET STANDARD ASYNCH EVENT NOTIFICATION-, RETURN ;RETURN TO GET NEXT CHARACTERISTIC .ENDC ;T$$MHU.PAGE 7 .SBTTL . MCICS - INPUT COUNT STATE EVENT NOTIFICATION| .IF DF T$$ICS; /; GET/SET CHARACTERISTIC BUFFER FORMAT FOR ICS:-;-*; +-------------------------------------+*; 1 | RESERVED | TC.ICS | 0*; |-------------------------------------|/; 3 | ADDRESS OF AST (TASK) OR TEP (TSA) | 2 *; +-------------------------------------+;C;$MCICS::C8 MOV #U.TICA,R4 ;SET OFFSET INTO UCBX OF ACB/TEP POINTER .IF DF T$$SMC? MOV #S3.ICE,R2 ;IDENTIFY FLAG TO ENABLE/DISABLE CHARACTERISTIC 4 MOV #20.,R0 ;SET SIZE OF ACB TO ALLOCATE IF NEEDED .ENDC ;T$$SMC9 CALL GSAENC ;GET/SET STANDARD ASYNCH EVENT NOTIFICATION-) RETURN ;RETURN FOR NEXT CHARACTERISTIC  .ENDC ;T$$ICS00hnnibjbkb a a a.PAGE ; .SBTTL . MCOOB - OUT-OF-BAND CHARACTER EVENT NOTIFICATIONR .IF DF T$$OOB;P ; GET/SET OUT-OF-BAND CHARACTERS;-I; WHEN THIS CHARACTERISTIC IS ISSUED VIA INTERNAL I/O, THIS IS THE FORMAT '; OF THE GET/SET CHARACTERISTIC BUFFER:M;#*; +-------------------------------------+(; 1 | RESERVED | TC.OOB | 0*; |-------------------------------------|/; 3 | OOB TEP ADDRESS OR ZERO | 2N*; +-------------------------------------+;A9; NOTE THAT THE TEP MUST BE FORMATTED WITH THE BIT MASKS.O;OD; WHEN ISSUED FROM A USER TASK, THE CHARACTERISTIC BUFFER FORMAT IS:;U*; +-------------------------------------+'; 1 | RESERVED | TC.OOB | 0 *; |-------------------------------------|); 3 | OOB AST VIRTUAL ADDRESS | 2-*; |-------------------------------------|$; 5 | OOB BIT MASK 1 | 4*; |-------------------------------------|$; 7 | OOB BIT MASK 2 | 6*; |-------------------------------------|+; 11 | HELLO/CLEAR BIT MASK 1 | 10M*; |-------------------------------------|1; 13 | HELLO/CLEAR BIT MASK 2 | 12-*; |-------------------------------------|1; 15 | INCLUDE BIT MASK 1 | 14-*; |-------------------------------------|1; 17 | INCLUDE BIT MASK 2 | 16-*; +-------------------------------------+; ;4>; IN HELLO/CLEAR BIT MASKS, 0 => CLEAR OOB; 1 => HELLO OOB.>; CHARACTERS THAT ARE CLEAR OOB CANNOT ALSO BE INCLUDE OOB.;1MCOOB::O8 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-4 MOV #52.,R0 ;SET SIZE OF ACB TO ALLOCATE IF NEEDED .IFTF ;T$$SMC9 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$$GMC3 ;;;CO-ROUTINE DISABLED INTERRUPTS TIL WE FINISH , BNE 10$ ;;;IF NE, WE HAVE AN ACB TO MODIFY2 ADD #12.,R1 ;;;ELSE, USER CLEARED CHARACTERISTIC+ BR 1000$ ;;;SKIP FOR RETURN TO CO-ROUTINE 10$:;SM; PERFORM CONSISTENCY CHECKS ON THE OOB BITMASKS SUPPLIED BY THE TASK. THE.L; RULES SPECIFY THAT NO CLEAR-OOB CHARACTERS CAN BE INCLUDE-OOB AND THAT ALLL; CLEAR-OOB AND INCLUDE-OOB CHARACTERS MUST BE DECLARED AS OOB CHARACTERS INK; THE FIRST BITMASK DOUBLEWORD. AN ERROR IN THE FIRST CHECK (CLEAR/INCLUDECI; CONFLICT) WILL LEAVE THE BUFFER POINTER AT THE OFFENDING CLEAR-OOB MASKNL; WORD. FAILING THE SECOND CHECK LEAVES THE BUFFER POINTER AT THE OFFENDING; OOB DECLARATION BITMASK WORD. ;0" ADD #A.PRM+5,R2 ;;;POINT TO FLAGS# CLRB (R2) ;;;INITIALIZE FLAG BYTEE> 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-ROUTINE30$:3 MOV #ERCVL1,2(SP) ;;;FORCE RETURN TO ERROR ROUTINEF8 RETURN ;;;EXIT CO-ROUTINE FOR RETURN TO ERROR ROUTINE .ENDC ;T$$SMC .IF DF T$$GMC;O,; GET OUT-OF-BAND CHARACTER AST AND BITMASKS;A100$:M, 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 BITMASKE# ADD #8.,R1 ;SKIP REST OF BITMASKSA BR 1000$ ;FINISH OFF REQUEST110$:O .IF DF R$$IIC7 BCC 120$ ;IF CC, CURRENT SETTING IS FOR AN ACB...SKIP2;)O; WE GET HERE WHEN GET WAS DONE FROM EXTERNAL I/O BUT THE GOTTEN CHARACTERISTICR; WAS OF THE INTERNAL I/O TYPE;F; ADD #E.VOBM,R2 ;POINT TO WHERE OOB BITMASKS START IN A TEPS( BR 130$ ;FINISH OFF THE CHARACTERISTIC120$:E .ENDC ;R$$IIC= ADD #A.PRM+6,R2 ;POINT TO WHERE OOB BITMASKS START IN AN ACB130$:1! MOV00hnhf__DATADATADATADATA (R2)+,(R1)+ ;COPY OOB MASK 1D! MOV (R2)+,(R1)+ ;COPY OOB MASK 2B) MOV (R2)+,(R1)+ ;COPY HELLO/CLEAR MASK 1F) MOV (R2)+,(R1)+ ;COPY HELLO/CLEAR MASK 2T) MOV (R2)+,(R1)+ ;COPY OOB INCLUDE MASK 1R) MOV (R2)+,(R1)+ ;COPY OOB INCLUDE MASK 2H .ENDC ;T$$GMC1000$:C SUB #12.,I.PRM+4(R3) ;CO-ROUTINE PROCESSED 12 MORE BYTES OF BUFFER 4 RETURN ;RETURN TO CO-ROUTINE OR TO GET NEXT CHAR. .ENDC ;T$$OOB.PAGEN: .IF DF T$$LTH&M$$NET ;THIS IS CONDITIONAL ADDITIONALLY ON, ;A NET AS $LTEEP IS NOT DEFINED W/O NET.* ;IF THE SYSTEM DOESN'T HAVE A NETWORK,$ ;THE LAT CODE WON'T EVER EXECUTE> .SBTTL . MCMAP - GET/SET MAPPING FOR LAT APPLICATION TERMINALK; BUFFER FOR ESTABLISHING MAPPING AND ESTABLISHING TERM AS LAT APPLICATION:;.*; +-------------------------------------+'; |BUFFER SIZE OR 0| TC.MAP |B*; |-------------------------------------|"; | UP TO 16. BYTES |$; | FOR SERVER NAME |; | . |*; |-------------------------------------|"; | SERVICE NAME |; | . |; | . |*; |-------------------------------------|%; | PORT NAME |E; | . |; | . |*; +-------------------------------------+;NF; WHEN THE BUFFER SIZE IS ZERO, WE ARE VOIDING THE MAPPING AND THE LATI; APPLICATION TERMINAL STATUS. IN THIS CASE, NO BUFFER FOLLOWS THE WORD G; CONTAINING TC.MAP AND THE 0 BYTE. ELSE, THE BUFFER SIZE MUST BE LESS I; THAN OR EQUAL TO 52. AND MUST BE EVEN. EACH NAME IS ALLOWED TO BE 16.M$; BYTES IN LENGTH WITH A TRAILING 0.; ); SET LAT BY DEFAULT SETS NOBRO AND SLAVE--; SET NOLAT BY DEFAULT CLEARS NOBRO AND SLAVE ; ; MCMAP::  .IF DF T$$GMC!T$$SMC-! CMPB #52., (R1) ;CORRECT SYNTAX?N BLO ERSYN ;IF 52. OR LESS, OK  BITB #1,(R1) ;IS IT ODD? BNE ERSYN ;NOT ALLOWED10$:$ MOV $CTLST,R2 ;GET FIRST CONTROLLER615$: CMP U.DCB-U.TSTA(R5),L.DCB(R2) ;IS THIS OUR UNIT? BEQ 20$ ;IF EQ, YES - BRANCH MOV (R2),R2 ;GET NEXT ENTRYM BNE 15$ ;IF NE, CHECK IT#17$: TST (SP)+ ;POP RETURN ADDRESS  JMP ERCNSC ;PROCESS ERROR ; /20$: CMP L.NAM(R2),#"LH ;SHOULD BE LH CONTROLERD) BNE 17$ ;IF NOT, BRANCH - MAP NOT LEGALA3 CMP $LTEEP,#$SPVEX ;IS THERE A RETURN INSTRUCTIONR ;AT THE LAT ENTRY POINT?& BEQ 17$ ;IF SO, LAT IS NOT INSTALLED;? CLR -(SP)$ MOVB (R1),(SP) ;SAVE SIZE OF BUFFER) MOV R3,-(SP) ;SAVE POINTER TO I/O PACKET( MOV #PO$MAP,R3 , MOV (SP),R0 ;GET IRP ADDRESS TO R0 FOR LAT ;USER BUFFER IN R1 FOR LAT8 MOV KISAR6,R2 ;GET MAPPING OF USER BUFFER TO R2 FOR LAT$ MOV KISAR6,-(SP) ;SAVE APR6 MAPPING( MOV $DALED,KISAR6 ;MAP DRIVER DATA AREA .IF DF T$$OVL) MOV #LTPRC,-(SP) ;GET ADDRESS OF ROUTINE$ CALL MPROT ;AND GO TO ROUTINE .IFF ;T$$OVL % CALL LTPRC ;CALL MAP TO LAT PROCESSO .ENDC ;T$$OVL' MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPING ) MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESS % MOV (SP)+,R2 ;GET BUFFER LENGTH BACK(, TST R0 ;DID WE GET AN ERROR BACK FROM LAT? BNE ERLAT ;IF NE, ERRORM( CMPB #SF.GMC,I.FCN(R3) ;WAS THIS A GET? BEQ 50$ ;IF EQ, YES - RETURN;V7; SET LAT APPLICATION TERMINAL CHARACTERISTICS, BUT NOT ; S6.LAT (LAT PROCESS DOES THIS);G TSTB (R1) ;LAT OR NOLAT? BEQ 30$ ;EQ -> NOLAT - BRANCH. .IF DF R$$MPL!A$$CLIR) BIS #UM.NBR,U.MUP-U.TSTA(R5) ;SET NOBROL .ENDC ;R$$MPL!A$$CLIS3 BIS #U2.SLV,U.CW2-U.TSTA(R5) ;SET TERMINAL SLAVEDD BR 50$M;(+; SET NOLAT (S6.LAT CLEARED BY LAT PROCESS)I;E30$: .IF DF R$$MPL!A$$CLI- BIC #UM.NBR,U.MUP-U.TSTA(R5) ;SET BROADCAST3 .ENDC ;R$$MPL!A$$CLI55 BIC #U2.SLV,U.CW2-U.TSTA(R5) ;SET TERMINAL UNSLAVEDM;C#50$: INC R1 ;UPDATE BUFFER POINTERA ADD R2,R1 ;SKIP OVER BUFFER < SUB R2,I.PRM+4(R3) ;ROUTINE PROCESSED BUFFER LEN CHARACTERS RETURN ;DONER .ENDC ;T$$GMC&T$$SMCT.PAGE;G .SBTTL MCQDP - GET CONNECT STATUS/QUEUE DEPTH OF LAT APPLICATION TERM.E;M8; SET MULTIPLE CHARACTERISTICS FOR MCQDP IS NOT ALLOWED.;T ; RETURN IS:; 0 = CONNECTEDL; -1 = DISCONNECTEDP; 1 -> 255 = Q00hnnibjbkb a a aUEUE DEPTH;MCQDP::$ .IF DF T$$GMC&T$$SMCS BNE 20$ ;SET (NOT ALLOWED) .ENDC ;T$$GMC&T$$SMCI .IF DF T$$GMC$ MOV $CTLST,R2 ;GET FIRST CONTROLLER55$: CMP U.DCB-U.TSTA(R5),L.DCB(R2) ;IS THIS OUR UNIT?  BEQ 8$ ;IF EQ, YES - BRANCH MOV (R2),R2 ;GET NEXT ENTRY; BNE 5$ ;IF NE, CHECK ITC;T$7$: BR 20$ ;ERROR, NOT A LAT DEVICE;E.8$: CMP L.NAM(R2),#"LH ;SHOULD BE LH CONTROLER( BNE 7$ ;IF NOT, BRANCH - MAP NOT LEGAL3 CMP $LTEEP,#$SPVEX ;IS THERE A RETURN INSTRUCTION> ;AT THE LAT ENTRY POINT?& BEQ 20$ ;IF SO, LAT IS NOT INSTALLEDN; CALL TO LAT PROCESS WILL INSERT THE QUEUE DEPTH INDICATOR IN THE USER BUFFER10$:) MOV R3,-(SP) ;SAVE POINTER TO I/O PACKETR* MOV R3,R0 ;GET IRP ADDRESS TO R0 FOR LAT MOV #PO$GQD,R3($ MOV KISAR6,-(SP) ;Save APR6 mapping* MOV $DALED,KISAR6 ;Map data area in TTCOM/ MOV (SP),R2 ;SET UP USER BUFFER MAPPING IN R2B .IF DF T$$OVL) MOV #LTPRC,-(SP) ;GET ADDRESS OF ROUTINE$ CALL MPROT ;AND GOTO ROUTINE .IFF ;T$$OVL % CALL LTRPC ;CALL MAP TO LAT PROCESS  .ENDC ;T$$OVL' MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPINGR) MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSF TST R0 ;ERROR? BNE ERLAT ;IF NE, YESO RETURNE .ENDC ;T$$GMC .IF DF T$$SMC; SET IS NOT ALLOWED#20$: TST (SP)+ ;POP RETURN ADDRESSi JMP ERCNSC ;PROCESS ERRORa .ENDC ;T$$SMC .IF DF T$$SMC!T$$GMCRERSYN:' JMP ERCVAL ;AND JUMP TO PROCESS ERROR#ERLAT: TST (SP)+ ;POP RETURN ADDRESSL JMP CHRFN1 ;FINISH I/O .ENDC ;T$$SMC!T$$GMCL .ENDC ;T$$LTH&M$$MAP .PAGE .SBTTL TTATT SUBROUTINES+< .SBTTL . GSAENC - GET/SET GENERAL ASYNCH EVENT NOTIFICATION# .IF DF T$$SCA!T$$MHU!T$$ICS!T$$OOBL;I;+F; **-GSAENC - GET/SET ASYNCHCHRONOUS EVENT NOTIFICATION CHARACTERISTIC;D;; THIS ROUTINE PROCESSES THE COMMON PART OF AN ASYNCHRONOUSSO; EVENT NOTIFICATION CHARACTERISTIC. TO SET ONE OF THESE, THE TERMINAL MUST BEUL; ATTACHED AND MAY NOT HAVE UNSOLICITED INPUT AST'S SPECIFIED. THIS ROUTINEM; ESTABLISHES AN ACB (UNLESS ONE ALREADY EXISTS) FOR THE REQUESTED CHARACTER-BK; ISTIC, SAVES THE USER-SPECIFIED AST ADDRESS IN THE ACB, CALLS THE CALLINGIL; ROUTINE AS A CO-ROUTINE WITH INTERRUPTS LOCKED OUT TO ALLOW SETTING UP THEM; CHARACTERISTIC DEPENDENT PART OF THE ACB. UPON RETURN FROM THE CO-ROUTINE,SL; INTERRUPTS ARE ENABLED AND THE MAIN CHARACTERISTIC HANDLER IS RETURNED TO.;TA; NOTE THAT IF THE CHARACTERISTIC IS BEING SET OR DISABLED VIA ANNL; INTERNAL I/O REQUEST, THE CO-ROUTINE SEQUENCE IS NOT EXECUTED AND A RETURN>; TO THE MCXXX DISPATCH ROUTINE (NXTCHR) IS EXECUTED. THIS ISH; BECAUSE THE CHARACTERISTIC BUFFER IS FORMATTED DIFFERENTLY SINCE A TEPF; IS EXPECTED TO ALREADY CONTAIN THE NEEDED CHARACTERISTIC PARAMETERS.E; BY DESIGN, THE CALLING ROUTINE ASSUMES IT WILL NOT GET RETURNED TO.E;D; NOTE THAT AN SF.GMC REQUEST FROM A TASK CAN BE HANDLED EVEN IF THEG; CHARACTERISTIC CURRENTLY HAS A TEP ASSOCIATED WITH IT. IN THIS CASE,AK; THE CO-ROUTINE MUST COPY THE CHARACTERISTIC DEPENDENT PARAMETERS FROM THEE; TEP TO THE USER BUFFER.C;O ; INPUTS::; R0 = SIZE OF AN AST CONTROL BLOCK FOR THE CHARACTERISTIC@; R1 => HIGH BYTE OF CURRENT CHARACTERISTIC ENTRY IN USER BUFFERF; R2 = BIT IN STATUS WORD 3 MARKING CHARACTERISTIC AS ENABLED/DISABLED; R3 => CURRENT I/O PACKET,; R4 = OFFSET TO ACB/TEP POINTER IN THE UCBX&; R5 => U.TSTA OF CURRENT TERMINAL UCB;E ; OUTPUTS:I.; WHEN CALLING THE CALLER AS A CO-ROUTINE::; CC-V = SET IF REQUEST IS SF.GMC; CC-V = CLEAR FOR SF.SMC9; CC-Z = SET IF NO TEP/ACB EXISTS; CC-Z = CLEAR OTHERWISE>; CC-C = SET IF REQUEST IS SF.GMC AND A TEP IS ASSOCIATED WITH=; THE CHARACTERISTIC (ONLY CHECK IF CC-V SET AND CC-Z CLEAR)N:; R1 => NEXT WORD OF USER CHARACTERISTIC BUFFER TO PROCESS&; R2 => ACB/TEP FOR THE CHARACTERISTIC2; R4 => UCBX POINTER TO ACB/TEP FOR CHARACTERISTIC;C/; WHEN RETURNING TO CHARACTERISTIC HANDLER: :; R1 => NEXT WORD OF USER CHARACTERISTIC BUFFER TO PROCESS;C; REGISTERS MODIFIED: NONE.C;-;LGSAENC:F- INC R1 ;SKIP PAST CHARACTERISTIC 00hnhf__DATADATADATADATAHIGH BYTE 4 SUB #2,I.PRM+4(R3) ;ASSUME WE WILL PROCESS 2 BYTES .IF DF T$$GMC&T$$SMCH? CMPB #SF.GMC,I.FCN(R3) ;IS THIS REQUEST TO GET CHARACTERISTICS # BEQ 1000$ ;IF EQ, YES...GET THEMC .ENDC ;T$$GMC&T$$SMC= .IF DF T$$SMC, TST U.ATT-U.TSTA(R5) ;IS TERMINAL ATTACHED?1 BEQ 900$ ;IF EQ, NO...CAN'T SET CHARACTERISTICR3 BIT #1,(R1) ;SPECIFYING ODD ADDRESS FOR AST/TEP?C BNE 800$ ;ERROR IF ODD8 MOV (R1)+,-(SP) ;GET REQUESTED AST ADDRESS/TEP POINTER. MOV R4,-(SP) ;SAVE OFFSET IN UCBX OF POINTER .IF DF T$$SPL% MOV #120000,R4 ;SET POINTER TO UCBX ' MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP UCBX .IFF ;T$$SPLT/ MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGG* MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX POINTER .IFTF ;T$$SPL0 ADD (SP)+,R4 ;POINT TO ACB/TEP POINTER IN UCBX' TST (SP) ;ENABLE THE CHARACTERISTIC?B BNE 100$ ;IF NE, YESO;A*; REQUEST IS TO DISABLE THE CHARACTERISTIC;* BIC R2,4(R5) ;DISABLE THE CHARACTERISTIC% CALL DEACB ;DEALLOCATE THE ACB/TEPF .IFF ;T$$SPLI. MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER .IFTF ;T$$SPL3 BIT #1,I.IOSB+4(R3) ;IS THIS AN INTERNAL REQUEST?T+ BEQ 10$ ;IF EQ, NO...THIS IS A USER TASKA/ TST (SP)+ ;CLEAN UP STACK TO SKIP CO-ROUTINER10$:/ CLR (SP)+ ;CLEAN STACK, CLEAR CC-V, SET CC-ZP. RETURN ;RETURN TO CO-ROUTINE OR DISPATCHER;T6; REQUEST IS TO ENABLE ASYNCHRONOUS EVENT NOTIFICATION; 100$:R2 MTPS #TTPRI ;LOCK OUT INTERRUPTS WHILE CHANGING* BIS R2,4(R5) ;;;MARK FUNCTION AS ENABLED .IF DF R$$IIC. BIT #1,I.IOSB+4(R3) ;;;INTERNAL I/O REQUEST?. BEQ 120$ ;;;IF EQ, NO...MUST BE FROM A TASK6 CMP (SP),(R4) ;;;INTERNAL REQUEST USING CURRENT TEP?/ BEQ 110$ ;;;IF EQ, YES...DON'T DEALLOCATE ITT2 CALL DEACB ;;;DEALLOCATE CURRENT TEP/ACB IF ONE110$:C) MOV (SP)+,(R4) ;;;STORE NEW TEP POINTERU TST (SP)+ ;;;CLEAN STACKU .IF NDF T$$SPLY. MOV I.PRM(R3),KISAR6 ;;;REMAP THE USER BUFFER .ENDC ;NDF T$$SPL* BR 150$ ;;;ENABLE INTERRUPTS AND RETURN120$:  .IFTF ;R$$IIC+ MOV R2,-(SP) ;;;SAVE FUNCTION ENABLE FLAGA% MOV (R4),R2 ;;;GET CURRENT TEP/ACBO .IFT ;R$$IIC , BEQ 130$ ;;;IF EQ, NONE...ALLOCATE AN ACB ASSUME A.CBL,E.VSIZ" TST A.CBL(R2) ;;;IS THIS AN ACB?3 BEQ 140$ ;;;IF EQ, YES...JUST CHANGE AST ADDRESSO5 CALL DEACB ;;;DEALLOCATE TEP BEFORE ACB ALLOCATION130$:P .IFF ;R$$IICC& BNE 140$ ;;;IF NE, USE EXISTING ONE .ENDC ;R$$IIC* MOV R1,-(SP) ;;;SAVE USER BUFFER POINTER. 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 BYTE140$:B0 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$$SPLD0 MOV I.PRM(R3),KISAR6 ;;;MAP BACK TO USER BUFFER .ENDC ;T$$SPL+ CALL @(SP)+ ;;;CALL CALLER AS CO-ROUTINE$150$: MTPS #0 ;ENABLE INTERRUPTSF RETURN ;BACK TO CALLER;Y"; ERROR PROCESSING FOR THE ROUTINE; 800$:L7 MOV #!,R0 ;ILLEGAL AST ADDRESSB BR 905$900$:S; MOV #!,R0 ;ERROR WHEN NOT ATTACHED4*905$: CMP (SP)+,(SP)+ ;CLEAN UP THE STACK JMP CHRFIN ;FINISH ERRORR920$:S" MTPS #0 ;;;RE-ENABLE INTERRUPTS. MOV #ERCUPN,R2 ;SET ERROR COMPLETION ROUTINE$ TST -(R1) ;BACK UP BUFFER POINTER- ADD #8.,SP ;CLEAN OFF ALL STACK PARAMETERSN, JMP (R2) ;PROCESS THE ERROR AND FINISH UP .ENDC ;T$$SMC .IF DF T$$GMC;C9; REQUEST IS TO RETURN CHARACTERISTIC SETTING TO THE USERI;41000$: .IF DF T$$SPL2 ADD #120000,R4 ;POINT TO ACB/TEP POINTER IN UCBX' MOV U.TAPR-U.TSTA(R5),KDSAR5 ;MAP UCBXS .IFF ;T$$SPL / MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING" MOV U.TUX-U.TSTA(R5),R2 ;GET UCBX3 BEQ 1010$ ;IF EQ, NONE...CHARACTERISTIC DISABLED-. 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$:. MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER00hnnibjbkb a a a .ENDC ;T$$SPL .IF DF R$$IIC8 BIT #1,I.IOSB+4(R3) ;WAS THIS AN INTERNAL I/O REQUEST?4 BEQ 1020$ ;IF EQ, NO...RETURN FULL CHARACTERISTIC4 MOV R2,(R1)+ ;STORE TEP/ACB ADDRESS IN USER BUFFER TST (SP)+ ;CLEAN STACKN RETURN ;ALL DONE1020$: .IFTF ;R$$IIC" TST R2 ;IS THERE AN ACB OR TEP?' BNE 1030$ ;IF NE, YES...CHECK IT OUTI0 CLR (R1)+ ;AST DISABLED, CLEAR CC-V, SET CC-Z# BR 1050$ ;SKIP TO FINISH REQUESTT1030$: .IFT ;R$$IICP ASSUME A.CBL,E.VSIZ- TST A.CBL(R2) ;IS THIS AN ACB? (CLEAR CC-C)I BEQ 1040$ ;IF EQ, YES0 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$$IIC7 MOV A.AST(R2),(R1)+ ;STORE AST ADDRESS IN USER BUFFER.1050$:- SEV ;SET CC-V TO INDICATE THIS WAS SF.GMCE. RETURN ;RETURN TO GET CHAR-DEPENDENT STUFF .ENDC ;T$$GMC# .ENDC ;T$$SCA!T$$MHU!T$$ICS!T$$OOB .PAGE > .SBTTL . MPCCOR - MAP DRIVER DATA AND CALL BACK AS CO-ROUTINE;C;+B; **-MPCCOR - MAP DRIVER DATA AREA AND CALL CALLER AS A CO-ROUTINE;RH; THIS ROUTINE WILL MAP THE DRIVER DATA AREA AND CALL BACK THE CALLER ASI; A CO-ROUTINE. WHEN THE CALLER EXECUTES A RETURN, THIS ROUTINE WILL MAPT%; BACK TO THE TASK BUFFER AND RETURN.B;E ; INPUTS:<; 2(SP) = RETURN ADDRESS AFTER RESTORING TASK BUFFER MAPPING; R3 => CURRENT I/O PACKET;F ; OUTPUTS:$; CC-C PRESERVED,; NO REGISTERS ARE MODIFIED BY THIS ROUTINE.;-;RMPCCOR:I2 MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESS ON STACK& MOV R3,2(SP) ;SAVE I/O PACKET ADDRESS/ MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGH/ CALL @(SP)+ ;CALL CALLER BACK AS A CO-ROUTINE ) MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSE. MOV I.PRM(R3),KISAR6 ;MAP BACK TO USER BUFFER% RETURN ;RETURN FROM THE CO-ROUTINE  .ENDC ;T$$SMC!T$$GMCT.PAGEI? .SBTTL . ALACB - ALLOCATE AND INITIALIZE AN AST CONTROL BLOCKS* .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB;Y;+'; **-ALACB - ALLOCATE AST CONTROL BLOCK(; D; THIS SUBROUTINE ALLOCATES AN AST CONTROL BLOCK AND INITIALIZES THED; FIXED DATA. DATA THAT IS CHARACTERISTIC-DEPENDENT (SUCH AS A.AST)(; MUST BE SET BY THE CALLER UPON RETURN.;P ; INPUTS::; R1 = SIZE IN BYTES OF ACB TO ALLOCATE (SAVED IN A.PRM+4); R3 => CURRENT I/O PACKET9; R4 => OFFSET IN UCBX WHERE ADDRESS OF ACB WILL BE SAVED; R5 => U.TSTA OF CURRENT UCB ;T ; OUTPUTS: 9; CC-C CLEAR IF SUCCESSFUL ALLOCATION; CC-C SET OTHERWISEB$; R0 => A.PRM+5 OF THE ALLOCATED ACB@; R2 => LINK WORD OF ALLOCATED ACB (ACB'S HAVE NEGATIVE OFFSETS)$; (R4) => LINK WORD OF ALLOCATED ACB;T,; THE ALLOCATED ACB IS FORMATTED AS FOLLOWS:;)); +-------------------------------------+7; | TTDRV KINAR5 BIAS | A.KSR5 (-4)S); |-------------------------------------|T7; | DEQUEUE SUBROUTINE ADDRESS (DQACB) | A.DQSR (-2)E); |-------------------------------------|O$; | THREAD WORD (0) | (0)); |-------------------------------------|R1; | LENGTH OF CONTROL BLOCK (0) | A.CBLC); |-------------------------------------|R1; | # BYTES TO ALLOC ON STACK (16.) | A.BYTE); |-------------------------------------|-.; | AST ADDRESS (0) | A.AST); |-------------------------------------|S0; | # AST PARAMETERS (1) | A.NPR); |-----------------+-------------------|Q1; | U.TTID | (0) | A.PRMO); |-----------------+-------------------|-'; | POINTER TO U.TSTA | A.PRM+2 ); |-----------------+-------------------|.3; | | ACB SIZE | A.PRM+4 ); |-----------------+-------------------+Y;; REGISTERS MODIFIED: R1;-;-ALACB: CALL $ALOCB ;ALLOCATE SPACE  BCS 10$ ;BR IF ERROR .IF DF T$$OVL .IF DF T$$SPL) MOV KISAR6,-(SP) ;SAVE APR6 DATA MAPPINGN* MOV $DALED,KISAR6 ;AND MAP TO DRIVER DATA .IFTF ;T$$SPL3 MOV ROTMAP,(R0)+ ;INSERT DRIVER MAIN APR 5 MAPPING- .IFT ;T$$SPL-8 MOV (SP)+,KISAR6 ;RESTORE EITHER TASK OR DRIVER MAPPING .ENDC ;T$$SPL .IFF ;T$$OVL 7 MOV KINAR5,(R00hnhf__DATADATADATADATA0)+ ;INSERT DRIVER APR 5 MAPPING (A.KSR5)- .ENDC ;T$$OVL9 MOV #DQACB,(R0)+ ;INSERT POINTER TO ROUTINE TO CALL WHENC# ;AST BLOCK IS DEQUEUED (A.DQSR)B' MOV R0,R2 ;SAVE ALLOCATED ACB ADDRESS' MOV R0,(R4) ;STORE POINTER TO THE ACB TST (R0)+ ;SKIP OVER LINK WORD1 CLR (R0)+ ;SET BLOCK LENGTH ZERO TO FORCE SYSXTM. ;TO CALL US WHEN BLOCK IS DEQUEUED (A.CBL); MOV #16.,(R0)+ ;ALLOCATE 16. BYTES ON TASK'S STACK (A.BYT)K* TST (R0)+ ;SKIP PAST AST ADDRESS (A.AST)! ;THIS WILL BE FILLED IN LATERS6 MOV #1,(R0)+ ;INSERT NUMBER OF AST PARAMETERS (A.NPR) .IF DF T$$SPL6 CLRB (R0)+ ;SKIP LOW BYTE OF FIRST PARAMETER (A.PRM)E MOVB 120000+U.TTID,(R0)+ ;SAVE USER DEFINED TERMINAL ID IN HIGH BYTE, .IFF ;T$$SPLT: CLR (R0)+ ;SKIP OVER FIRST PARAMETER UNTIL LATER (A.PRM) .IFTF ;T$$SPL1 MOV R5,(R0)+ ;INSERT POINTER TO U.TSTA (A.PRM+2)E/ MOVB R1,(R0)+ ;SAVE SIZE OF THIS ACB (A.PRM+4)E .IFF ;T$$SPL 4 MOV U.TUX-U.TSTA(R5),R1 ;GET POINTER TO TOP OF UCBXB MOVB U.TTID(R1),-4(R0) ;INSERT USER-DEFINED TERMINAL ID (A.PRM+1) .ENDC ;T$$SPL10$: RETURN ;ALL DONE * .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB.PAGE2& .SBTTL . QPEIO - EXTENDED I/O REQUEST;A;+*; **-QPEIO - EXTENDED I/O REQUEST (IO.EIO); M; THIS ROUTINE VALIDATES THE PARAMETERS OF AN EXTENDED WRITE OR READ REQUEST.)G; AN EXTENDED I/O REQUEST IS ONE WITH A FUNCTION CODE OF "IO.EIO" AND A K; SUBFUNCTION OF "TF.WLB" OR "TF.RLB". ALL MODIFIERS AND PARAMETERS OF THETK; REQUEST ARE SET UP IN AN ITEMLIST IN THE USER TASK SPACE INSTEAD OF BEING)K; PASSED FROM THE DPB VIA THE I/O PACKET. THIS MAKES IT POSSIBLE TO CREATEME; MORE COMPLEX TYPES OF READS AND WRITES THAN CAN BE DONE BY "OR'ING"AL; SUBFUNCTION BITS TOGETHER. FOR EXAMPLE, AN "IO.RPR" REQUEST CANNOT HAVE AL; TERMINATOR TABLE SPECIFIED WITH IT (IO.RTT) SINCE THERE IS NOT ENOUGH ROOMM; IN THE QIO PARAMETER LIST OR IN A NORMAL I/O PACKET FOR THE PROMPT VFC, THERM; TIMEOUT VALUE, AND THE ADDRESS/LENGTH OF THE DATA BUFFERS. AN EXTENDED I/OEH; REQUEST ELIMINATES THIS RESTRICTION BY SPECIFYING THE PARAMETERS IN ANH; ITEMLIST POINTED TO BY THE QIO PARAMETER LIST AND BY SAVING ADDITIONALN; INFORMATION IN AN I/O PACKET EXTENSION. THE USER'S ITEMLIST IS SPECIFIED BYI; "P1" AND "P2" OF THE QIO PARAMETER LIST. THIS BUFFER HAS BEEN ADDRESS-DL; CHECKED AND RELOCATED BY THE EXEC AND THE DOUBLEWORD ADDRESS AND LENGTH ISJ; STORED IN I.PRM THROUGH I.PRM+4. THE ITEMLIST HAS THE FOLLOWING FORMAT:;D; READ ITEM LIST:D; $; +-------------------------------+; | MODIFIER WORD 1 |S$; |-------------------------------|; | MODIFIER WORD 2 |O$; |-------------------------------|#; | ADDRESS OF READ DATA BUFFER |T$; |-------------------------------|#; | LENGTH OF READ DATA BUFFER |R$; |-------------------------------|; | TIME OUT VALUE |$; |-------------------------------|!; | ADDRESS OF PROMPT BUFFER | $; |-------------------------------|!; | LENGTH OF PROMPT BUFFER | $; |-------------------------------|; | PROMPT VFC |$; |-------------------------------|"; | TERMINATOR TABLE ADDRESS |$; |-------------------------------|#; | LENGTH OF TERMINATOR TABLE |F$; |-------------------------------|$; | DEFAULT INPUT BUFFER ADDRESS |$; |-------------------------------|$; |LENGTH OF DEFAULT INPUT BUFFER |$; +-------------------------------+;|;A; WRITE ITEM LIST:; $; +-------------------------------+; | MODIFIER WORD 1 |F$; |-------------------------------|; | MODIFIER WORD 2 |V$; |-------------------------------|!; | ADDRESS OF OUTPUT BUFFER |D$; |-------------------------------|"; | LENGTH OF OUTPUT BUFFER |$; |-------------------------------|; | VFC/CURSOR POSITION |F$; +-------------------------------+;-; *** NOTE ***GC; AT PRESENT, THERE ARE TOO FEW PARAMETERS THAT CAN BE SPECIFIED ON|B; EXTENDED WRITE REQUESTS TO JUSTIFY THE ALLOCATION OF AN IOPX FORE; THEM. THUS, AN "IO.EIO!TF.WLB" REQUEST PACKET IS CONVERTED TO LOOK E00hnnibjbkb a a a; LIKE A NORMAL "IO.WLB". NOTE THAT THIS REQUIRES ALL WRITE MODIFIERDE; BITS TO RESIDE IN THE LOW BYTE OF THE ITEMLIST MODIFIER WORD EXCEPT F; TF.FMT WHICH IS SPECIAL CASED. IT COMES TO US VIA THE USER MODIFIER#; WORD OR I.PRM+13 FOR INTERNAL I/O-;-9; THE FOLLOWING ACTIONS MAY BE PERFORMED BY THIS ROUTINE: 4; 1. VALIDATE THE SIZE OF THE USER-DEFINED ITEMLIST.I; 2. MAKE SURE NO SUBFUNCTIONS OTHER THAN TF.WLB OR TF.RLB ARE REQUESTED.MG; 3. CONVERT AN "IO.EIO!TF.WLB" REQUEST INTO A NORMAL "IO.WLB" REQUEST.AB; 4. ALLOCATE AN I/O PACKET EXTENSION (IOPX) FROM PRIMARY POOL FOR=; SAVING PARAMETERS FROM THE USER'S ITEMLIST. IF THE IO.EIOP:; IS AN INTERNAL I/O REQUEST, I.PRM MUST POINT TO AN IOPX$; ALLOCATED AND SET UP BY THE USER.E; 5. VALIDATE AND ADDRESS CHECK PARAMETERS IN THE USER'S ITEMLIST ANDU*; SAVE NECESSARY INFORMATION IN THE IOPX.5; 6. LINK THE IOPX INTO A LIST OF IOPX'S FOR THE UCB.T>; 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 TERMINAL7; I.PRM => PRE-ALLOCATED IOPX IF IO.EIO IS INTERNAL I/OR; ; OUTPUTS:I-; R3 => IO.WLB REQUEST PACKET PASSED TO QPWLBT8; R4 = U.TSTA+2 BITS FOR DE-QUEUE BLOCKING (IN "TSTRQ")%; IOPX LINKED INTO IOPX LIST (U.TIXL) ;E"; REGISTERS MODIFIED: R0, R1, R2;-;H .IF DF T$$EIO .IF DF T$$OVLQPEIO1:: .IFF ;T$$OVLHQPEIO::K .ENDC ;T$$OVL .IF DF R$$IIC7 MOV I.PRM(R3),R0 ;ASSUME THERE IS A PRE-ALLOCATED IOPXQ6 BIT #1,I.IOSB+4(R3) ;IS THIS AN INTERNAL I/O REQUEST? BEQ 5$ ;IF EQ, NO."; THIS IS AN INTERNAL I/O REQUEST.' BIT #TF.RLB,I.FCN(R3) ;IS THIS A READ?O+ BNE 15$ ;IF YES, IOPX IS ALREADY IN PLACE & MOV #IO.WLB,I.FCN(R3);MARK AS A WRITE6 MOVB I.PRM+12(R3),I.FCN(R3) ;AND SET THE SUBFUNCTIONS .IF DF T$$OVL JMP QPWTRA ;TRANSFER FOR QPWLB .IFF ;T$$OVLO! JMP QPWLB ;PROCESS IT AS IO.WLBI .ENDC ;T$$OVL5$:6 MOV R0,KISAR6 ;OTHERWISE, MAP TO USER ITEMLIST BUFFER .IFF ;R$$IICQ/ MOV I.PRM(R3),KISAR6 ;MAP USER ITEMLIST BUFFERU .ENDC ;R$$IIC* BIT #1,I.PRM+2(R3) ;IS IT WORD ALLIGNED? BNE 11$ ;IF ODD, BRANCH;; CMP I.PRM+4(R3),#8. ;IS THE SIZE SMALLER THAN THE MINIMUM?  BMI 11$ ;IF PL, YES)8 MOV #10.,R0 ;ASSUME CHECKING LENGTH OF TF.WLB ITEMLIST= MOV #^C,R1 ;INVERSE OF LEGAL WRITE FLAGS ARE INVALIDQ: BIT #TF.WLB,I.FCN(R3) ;IS THIS AN EXTENDED WRITE REQUEST?5 BNE 10$ ;IF NE, YES...ASSUMPTION WAS CORRECT - SKIPM9 MOV #24.,R0 ;SET LENGTH OF TF.RLB ITEMLIST TO CHECK FORR? MOV #^C,R1 ;INVERSE OF EXTENDED READ FLAGS ARE INVALID,10$:. CMP R0,I.PRM+4(R3) ;IS THE ITEMLIST TOO LARGE BPL 12$ ;IF PL, NO, CONTINUE11$: .IF DF T$$OVL# MOV #IE.BAD&377,R0 ;GET ERROR CODE) JMP 930$, .IFF ;T$$OVLI JMP EQPBAD ;ELSE, ERROR .ENDC ;T$$OVL12$:8 BIT R1,@I.PRM+2(R3) ;ARE ANY INVALID MODIFIER BITS SET?5 BNE 25$ ;IF NE, YES...REPORT INVALID FUNCTION ERROR : BIT #TF.WLB,I.FCN(R3) ;IS THIS AN EXTENDED WRITE REQUEST?4 BEQ 20$ ;IF EQ, NO...SKIP TO PROCESS EXTENDED READ;RJ; PROCESS AN EXTENDED WRITE REQUEST BY CONVERTING IT TO AN IO.WLB REQUEST.;H: MOV I.PRM+2(R3),R2 ;SET POINTER TO START OF USER ITEMLIST> MOV #IO.WLB,I.FCN(R3) ;CHANGE FUNCTION CODE OF OUR I/O PACKET5 MOVB (R2),I.FCN(R3) ;GET THE WRITE REQUEST MODIFIERS.9 CMP (R2)+,(R2)+ ;SKIP HIGH BYTE AND UNUSED MODIFIER WORDO3 MOV (R2)+,R0 ;GET VIRTUAL ADDRESS OF OUTPUT BUFFERL* MOV (R2)+,R1 ;GET LENGTH OF OUTPUT BUFFER$ MOV R3,R4 ;COPY I/O PACKET POINTER3 ADD #I.PRM+4,R4 ;POINT TO WHERE BUFFER LENGTH GOES5 MOV R1,(R4) ;COPY LENGTH OF SPECIFIED OUTPUT BUFFERT< MOV (R2),2(R4) ;COPY VFC/CURSOR POSITION INFO TO I/O PACKET7 CALL CKBFR ;CHECK FOR READ ACCESS AND RELOCATE BUFFERN- BCS 26$ ;IF CS, CHECK FAILED...RETURN ERROR)5 MOV R2,-(R4) ;SAVE SECOND WORD OF DOUBLEWORD ADDRESSP# MOV R1,-(R4) ;SAVE FIRST WORD ALSO/ MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGL .IF DF T$$OVL! CALLR QPWTRA ;TRANSFER TO QPWLB4 .IFF ;T$$OVLT00hnhf__DATADATADATADATA8 JMP QPWLB ;NOW PROCESS PACKET AS NORMAL IO.WLB REQUEST .ENDC ;DF T$$OVL15$: JMP 50$ ;BRANCH AIDB;TK; PROCESS AN EXTENDED READ REQUEST BY BUILDING AN IOPX TO HOLD INFO FOR US. ;H ASSUME I.XLNK,0 ASSUME I.XLNK+2,I.XIOPB ASSUME I.XIOP+2,I.XTCBL ASSUME I.XTCB+2,I.XMODV ASSUME I.XMOD+4,I.XRBFR ASSUME I.XRBF+4,I.XRBL ASSUME I.XRBL+2,I.XTMO  ASSUME I.XTMO+2,I.XPBF, ASSUME I.XPBF+4,I.XPBLT ASSUME I.XPBL+2,I.XPBVO ASSUME I.XPBV+2,I.XTTBN ASSUME I.XTTB+4,I.XTTLT ASSUME I.XTTL+2,I.XDBFW ASSUME I.XDBF+4,I.XDBL F20$: BIT #TF.RLB,I.FCN(R3) ;THIS ISN'T A WRITE, SO IT BETTER BE A READ( BNE 27$ ;IF EQ, INVALID FUNCTION ERROR25$: .IF DF T$$OVL# MOV #IE.IFC&377,R0 ;GET ERROR CODEA .IFF ;DF T$$OVL$ JMP EQPIFC ;ELSE, INVALID FUNCTION .ENDC ;DF T$$OVLM926$: JMP 930$ ;ALWAYS NEEDED AS BRANCH STRETCHER ANYWAY.227$:2 MOV I.PRM+4(R3),R1 ;GET SPECIFIED EIO BUFFER SIZE1 MOV @I.PRM+2(R3),R4 ;GET SPECIFIED FUNCTION MASKN' BIT #TF.RDI,R4 ;READ W/ DEFAULT INPUT?L BEQ 272$ ;BR IF NO RDI4 CMP R1,#24. ;IF RDI, MAKE SURE ALL 24. BYTES THERE BNE 11$ ;IF LESS, ERRORE BR 29$ ;ELSE, OK CONTINUE 272$:N* BIT #TF.RTT,R4 ;READ W/ TERMINATOR TABLE? BEQ 274$ ;BR IF NO RTT6 CMP R1,#20. ;IF RTT, CHECK MIN. REQUIRED BYTES THERE BMI 11$ ;IF LESS, ERROR BR 29$9274$:L .IF DF T$$RPR BIT #TF.RPR,R4 ;READ W/ PROMPT? BEQ 276$ ;BR IF NO RPR5 CMP R1,#14. ;CHECK MINIMUM REQUIRED BYTES SPECIFIEDF BMI 11$ ;IF LESS, ERRORF BR 29$R276$:D .ENDC ; DF T$$RPR! BIT #TF.TMO,R4 ;READ W/ TIMEOUT?I BEQ 29$ ;BR IF NOT( CMP R1,#10. ;CHECK ALL BYTES SPECIFIED BMI 11$ ;IF LESS, ERRORU29$:; MOV #I.XLEN,R1 ;SET SIZE OF AN I/O PACKET EXTENSION (IOPX);: CALL $ALOCB ;ALLOCATE IOPX FROM PRIMARY POOL (IOPX IN...- ; ...DRIVER POOL IS A MAPPING NIGHTMARE!)) BCS 910$ ;IF CS, NO FREE POOL...GIVE UPR MOV R0,R4 ;COPY IOPX ADDRESS7 MOV R3,-(SP) ;SAVE CURRENT I/O PACKET (IO.EIO) ADDRESSC$ MOV R0,-(SP) ;AND SAVE IOPX ADDRESS;92; INITIALIZE AN IOPX FOR AN EXTENDED READ REQUEST.; TST (R4)+ ;SKIP PAST LINK WORD4 MOV R3,(R4)+ ;FILL IN ASSOCIATED I/O PACKET ADDRESS. MOV I.TCB(R3),(R4)+ ;FILL IN TASK TCB ADDRESS: MOV I.PRM+2(R3),R3 ;USE R3 AS A POINTER INTO THE ITEMLIST1 MOV (R3)+,(R4)+ ;SAVE FUNCTION MODIFIERS IN IOPXE+ MOV (R3)+,(R4)+ ;MOVE UNUSED MODIFIER WORD;6 MOV (R3)+,R0 ;GET VIRTUAL ADDRESS OF READ DATA BUFFER MOV (R3),R1 ;GET BUFFER SIZE7 CALL CKBFB ;CHECK FOR READ ACCESS AND RELOCATE BUFFERO. BCS 920$ ;IF CS, CHECK FAILED...RETURN ERROR4 MOV R1,(R4)+ ;SAVE FIRST WORD OF ADDRESS DOUBLEWORD5 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$$RPR3 MOV (R3),R0 ;GET VIRTUAL ADDRESS OF PROMPT BUFFER(% MOV 2(R3),R1 ;GET PROMPT BUFFER SIZE6 BIT #TF.RPR,-14(R4) ;EXTENDED READ W/PROMPT FUNCTION? BEQ 30$ ;IF EQ, NO...SKIPE7 CALL CKBFR ;CHECK FOR READ ACCESS AND RELOCATE BUFFERO. BCS 920$ ;IF CS, CHECK FAILED...RETURN ERROR4 MOV R1,(R4)+ ;SAVE FIRST WORD OF ADDRESS DOUBLEWORD5 MOV R2,(R4)+ ;SAVE SECOND WORD OF ADDRESS DOUBLEWORD TST (R3)+ ;POINT TO THE LENGTH. MOV (R3)+,(R4)+ ;SAVE LENGTH OF PROMPT BUFFER) MOV (R3)+,(R4)+ ;SAVE PROMPT VFC IN IOPX  BR 33$L30$: .ENDC ;T$$RPR/ ADD #6.,R3 ;SKIP PAST UNUSED ITEMLIST OFFSETSF+ ADD #8.,R4 ;SKIP PAST UNUSED IOPX OFFSETS?33$:8 BIT #TF.RTT,-24(R4) ;READ W/TERMINATOR TABLE SPECIFIED? BEQ 35$ ;IF EQ, NO...SKIPB=; BIT #TF.PTT,-24(R4) ;WANT TO USE PREVIOUS TERMINATOR TABLE? ;; BNE 35$ ;IF NE, YES...DON'T BOTHER TO CHECK TABLE PARAM.W. MOV (R3)+,R0 ;GET ADDRESS OF TERMINATOR TABLE- MOV (R3),R1 ;GET LENGTH OF TERMINATOR TABLEP7 CALL CKBFR ;CHECK FOR READ ACCESS AND RELOCATE BUFFER2 BCS 920$ ;IF CS, CHECK FAILED...RETURN THE ERROR4 MOV R1,(R4)+ ;COPY FIRST WORD OF ADDRESS DOUBLEWORD3 MOV R2,(R4)+ ;COPY LAST WORD OF ADDRESS DOUBLEWORD;1 MOV (R3)+,(R4)+ ;COPY LENGTH OF TERMINATOR TABLEQ3 BR 37$ ;BRANCH SINCE POINTERS AR00honibjbkb a a aE ALREADY CORRECTE35$:3 CMP (R3)+,(R3)+ ;SKIP PAST UNUSED ITEMLIST OFFSETST* ADD #6,R4 ;SKIP PAST UNUSED IOPX OFFSETS37$:B 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 BUFFER. MOV (R3),R1 ;GET DEFAULT INPUT BUFFER LENGTH7 CALL CKBFR ;CHECK FOR READ ACCESS AND RELOCATE BUFFER . BCS 920$ ;IF CS, CHECK FAILED...RETURN ERROR4 MOV R1,(R4)+ ;SAVE FIRST WORD OF ADDRESS DOUBLEWORD5 MOV R2,(R4)+ ;SAVE SECOND WORD OF ADDRESS DOUBELWORD35 MOV (R3)+,(R4)+ ;SAVE LENGTH OF DEFAULT INPUT BUFFER4;S8; EXTENDED READ ITEMLIST PARAMETERS HAVE BEEN VALIDATED.;F40$:/ MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPING $ MOV (SP)+,R0 ;RETRIEVE IOPX POINTER, MOV (SP)+,R3 ;RESTORE IO.EIO PACKET POINTER;F>; LINK THE CURRENT IOPX INTO THE U.TIXL LIST FOR THE TERMINAL.; 50$:C MOV U.TIXL(R5),(R0) ;POINT THIS IOPX TO FIRST IOPX IN LIST, IF ANY,? MOV R0,U.TIXL(R5) ;THIS IOPX NOW BECOMES THE FIRST IN THE LIST 4 MOV #S2.IRQ,R4 ;READS MUST BLOCK IF INPUT IS ACTIVE .IF DF T$$RPR4 BIT #TF.RPR,I.XMOD(R0);WAS READ W/PROMPT SPECIFIED?- BEQ 60$ ;IF EQ, NO...ALL CHECKING COMPLETED,C MOV #S2.IRQ!S2.ORQ,R4 ;PROMPT MUST BLOCK IF ACTIVE INPUT OR OUTPUTP60$: .ENDC ;T$$RPR .IF DF T$$OVL JMP QUETRA ;TRANSFER TO QUEUEI .IFF ;DF T$$OVL JMP QUEUE ;QUEUE THE REQUEST .ENDC ;DF T$$OVL;N-; ERROR PROCESSING FOR EXTENDED I/O REQUESTS.V;,910$:)5 MOV #IE.NOD&377,R0 ;SET ERROR FOR NO NODES AVAILABLE21 BR 930$ ;RETURN ERROR (REMAP DRIVER ON THE WAY)F920$:R) MOV R0,R4 ;SAVE ERROR COMPLETION STATUSO$ MOV (SP)+,R0 ;RETREIVE IOPX ADDRESS! MOV #I.XLEN,R1 ;GET SIZE OF IOPXI" CALL $DEACB ;DEALLOCATE THE IOPX* MOV (SP)+,R3 ;RETRIEVE I/O PACKET ADDRESS& MOV R4,R0 ;RESTORE COMPLETION STATUS930$:T* .IF DF T$$OVL ;IF THE DRIVER IS OVERLAID/ MOV $DALED,KISAR6 ;RESTORE DRIVER DATA MAPPINGO CLR R1 ;INPUT TO $IOFIN CALLR $IOFIN ;FINISH REQUEST .IFF ;DF T$$OVL3 JMP EQPFIN ;FINISH THE I/O REQUEST WITH THE ERROR .IFT ;T$$OVLT.PAGE29 .SBTTL . BUFFER ADDRESS CHECKING AND RELOCATION ROUTINES+; ;+2; **-CKBFR - ADDRESS CHECK BUFFER FOR READ ACCESS8; **-CKBFB - ADDRESS CHECK BUFFER FOR READ/WRITE ACCESS;VI; THESE ROUTINES PERFORM THE DESCRIBED ADDRESS CHECKING ON A USER BUFFER.D;$G; NOTE: THIS CODE IS DUPLICATED FROM TTINI IN THE OVERLAID/EXTENDED I/OTG; DRIVER DUE TO MAPPING CONSIDERATIONS. THE CODE MUST RUN IN APR5 BUTD; CAN'T BE EASILY TRANSFERRED TO FROM THE OVERLAY SINCE DATA APR6 IS:; NOT MAPPED TO THE DRIVER'S DATA, BUT TO THE USER BUFFER.;K ; INPUTS:%; R0 => USER BUFFER (VIRTUAL ADDRESS) ; R1 = LENGTH OF USER BUFFERC;S ; OUTPUTS: *; 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 ADDRESS 5; R2 = DISPLACEMENT OF RELOCATED USER BUFFER ADDRESSK; ; REGISTERS MODIFIED: R0;-;U .IF DF A$$CHK .ENABL LSBSCKBFR: .IF DF R$$MPL5 MOV #$CKBFR,-(SP) ;SET UP CALL FOR READ-ACCESS CHECKI BR 10$ ;SKIP TO COMMON CODE  .IFTF ;R$$MPLCKBFB: .IFT ;R$$MPL6 MOV #$CKBFB,-(SP) ;SET UP CALL FOR WRITE-ACCESS CHECK10$: .IFTF ;R$$MPL TST R1 ;IS BUFFER SIZE VALID? 3 BEQ 900$ ;IF EQ, NO...RETURN INVALID BUFFER ERROR6 CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?5 BHI 920$ ;IF HI, YES...RETURN BAD BUFFER SIZE ERRORR .IFT ;R$$MPL: .IF DF X$$HDR; MOV (SP),-(SP) ;DUPLICATE MAPPING ROUTINE ADDRESS ON STACKV, MOV KISAR6,2(SP) ;SAVE CURRENT EXEC MAPPING+ MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADERF .IFTF ;X$$HDR3 CALL @(SP)+ ;CALL REQUESTED ADDRESS CHECK ROUTINEO .IFT ;X$$HDRE+ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGE .ENDC ;X$$HDR .IFF ;R$$MPLN) CALL $ACHKB ;DO NORMAL ADDRESS00h oi of__DATADATADATADATA CHECKING0 .ENDC ;R$$MPL+ BCS 910$ ;IF CS, IT FAILED...RETURN ERRORS .IFF ;A$$CHKFCKBFR:CKBFB: .IFTF ;A$$CHK9 CALL $RELOC ;RELOCATE ADDRESS AND CONVERT TO DOUBLEWORDA RETURN ;ALL DONEV .IFT ;A$$CHKV900$: 6 .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS910$:FA MOV #IE.SPC&377,R0 ;SET COMPLETION ERROR CODE FOR INVALID BUFFER BR 990$ ;SKIP920$:P6 .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS; MOV #IE.BAD&377,R0 ;SET COMPLETION ERROR CODE FOR BAD SIZE990$:; SEC ;RETURN WITH ERROR FLAG RETURN ;ALL DONES .DSABL LSBH .ENDC ;A$$CHK .ENDC ;T$$OVL .ENDC ;T$$EIO .END ADDRESS AND CONVERT TO DOUBLEWORDA RETURN ;ALL DONEV .IFT ;A$$CHKV900$: 6 .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS910$:FA MOV #IE.SPC&377,R0 ;SET COMPLETION ERROR CODE FOR INVALID BUFFER BR 990$ ;SKIP920$:P6 .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS; MOV #IE.BAD&377,R0 ;SET COMPLETION ERROR CODE .TITLE TTDATU .IDENT /06.11/.; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.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.;; ; 27-JAN-78 PETER WANNHEDEN ;i; PREVIOUSLY MODIFIED BY:r;e; P. WANNHEDEN ; C. F. SPITZo; D. R. DONCHIN ; T. LEKAS; J. KAUFFMAN ; S. C. ADAMS ; C. B. PETROVIC $; R. S. PHILPOTT , ; T. LEKAS n; B. S. MCCARTHY ; L. B. MCCULLEY D; L. M. KOGAN ;; MODIFICATIONS:;; ; L. KOGAN 02-DEC-85 06.01e:; LK706 -- CORRECT SPEED FOR 134.5 BAUD IN ABLOW FOR DH11;R; S. C. ADAMS 6-NOV-85 6.025; SA452 -- ADD SUPPORT FOR USER-WRITTEN PORT DRIVER H;E; L. KOGAN 18-JUN-86 6.032; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT;E ; S. R. CLOUTIER 20-JUN-86 6.043; ADD $LHGTD (LH GET TRANSMIT DATA) ENTRY TO TABLE ; ; S. C. ADAMS 6-AUG-86 6.055; SA464 -- ADD SUPPORT FOR LAT APPLICATION TERMINALS ; ; S. R. CLOUTIER 7-AUG-86 6.06%; ADD $LHTMO TIME-OUT ENTRY TO TABLEN;-; R. D. HANEY 13-AUG-86 6.07R ; RDH073 - ADD SUPPORT FOR LA75; #; S. R. CLOUTIER 12-SEPT-1986 6.082/; SRC CORRECT PPORG AND PPEIO IN PPDSP (PHEW!)R;R; R. D. HANEY 19-SEP-86 06.10&; RDH087 ADD SUPPORT FOR LA2XX SERIES;G!; S. R. CLOUTIER 27-OCT-86 06.11-; SRC FIX QPDSP FOR IO.ORGL;E;R;+I; THIS MODULE CONTAINS ALL DRIVER DATA, EXCEPT THE DRIVER DISPATCH TABLE. 5; IT ALSO CONTAINS THE DRIVER INITIALIZATION ROUTINE.U;R?; IN A SYSTEM THAT SUPPORTS SEPARATE KERNEL DATA SPACE MAPPING,.8; THIS MODULE MUST BE BUILT INTO THE TASK IMAGE "TTCOM".;-;;. .MCALL FILIO$, SPCIO$, TTSYM$; $ FILIO$ ;DEFINE I/O FUNCTION CODES SPCIO$ TTSYM$D .IF DF T$$OVL .MCALL PCBDF$ PCBDF$R .ENDC ;T$$OVL  .IF NDF R$$MPL2 C .MCALL HWDDF$ C HWDDF$ ;DEFINE KINAR5 R .ENDC ;NDF R$$MPL T;S;LA; MACRO TO GENERATE CHARACTER RECOGNITION TABLE AND CORRESPONDINGS; DISPATCH TABLE.I;I .MACRO CREC PREFIX,CHAR .IRP X, .PSECT CHRT .IIF NDF CHRT CHRT==.$ .IIF NDF 'PREFIX'CRT 'PREFIX'CRT==. .BYTE CH.'X'T .PSECT CHRD .IIF NDF CHRD CHRD==. .WORD 'PREFIX''X' .ENDR .PSECT MAP5 .ENDM CREC;C'CH.DEF = 0 ;DEFINE "DEFAULT" CHARACTERL ;FOR CHARACTER DISPATCHING;L; CHARACTER RECOGNITION TABLES.C9; EACH TABLE SHOULD BE ORDERED IN DESCENDING FREQUENCY OF$%; OCCURRENCE FOR MAXIMUM PERFORMANCE.H;C2; CHARACTERS THAT HAVE SPECIAL SIGNIFICANCE BEFORE0; STORING IN TYPE-AHEAD BUFFER - USED BY ICHAR1..; NOTE - ICHAR1 RECOGNIZES CTRL-X SEPARATELY. 6; ALL ENTRIES IN THE TABLE MUST BE NUMERICALLY SMALLER; OR EQUAL TO CTRL-X (30).; .PSECT MAP5;' .EVENI1CRT::  .BYTE CH.CTS, CH.CTQ, CH.CTO= .IIF DF T$$CTX, .BYTE CH.CTX .BYTE CH.CTCR2ASXOFF==I1CRT ;THIS LABEL MUST POINT TO AN XOFF  ;CHARACTER (CTRL-S)D1ASXON==I1CRT+1 ;THIS LABEL MUST POINT TO AN XONM ;CHARACTER (CTRL-Q);H;C1; CHARACTERS THAT HAVE SPECIAL SIGNIFICANCE AFTERN<; RETRIEVAL FROM00ionibjbkb a a a TYPE-AHEAD BUFFER (OR WHEN BUFFER BYPASSED)D; USED BY ICHAR2. NOTE - ESCAPE AND RUBOUT ARE RECOGNIZED SEPARATELY9; BY ICHAR2. ALL ENTRIES IN THE TABLE MUST BE NUMERICALLY; SMALLER THAN ESCAPE (33).C;T) CREC I2,E .IIF DF T$$CTX, CREC I2, CREC I2,; ;T .IIF DF T$$CTR, CREC ED, CREC ED,; ;HA; CHARACTERS THAT HAVE TO BE EXPANDED ON OUTPUT - USED BY EXPCHR. 5; CARRIAGE-RETURN IS RECOGNIZED SEPARATELY BY EXPCHR.RE; ALL ENTRIES IN THE TABLE MUST BE SMALLER THAN CARRIAGE-RETURN (15).2;O CREC EX,;E?; CHARACTERS THAT HAVE NON-STANDARD ECHO FORMATS AS TERMINATORSI;L CREC EK,C;;E6; RECOGNITION TABLE FOR VERTICAL FORMAT CONTROL BYTES.0; NOTE - THIS TABLE USES -1 AS TABLE TERMINATOR.;T/; THE WORD IN TABLE CHRD IS ENCODED AS FOLLOWS: ;H(; LOW BYTE DESCRIBES LEADING LF'S OR FF:; 0 = NO LEADING CHARACTERS ; CH.FF = LEADING FF; -N = N LEADING LF'SX;R"; HIGH BYTE DESCRIBES TRAILING CR:; 0 = NO TRAILING CR; S2.CR = TRAILING CRC; #; DEFINE SYMBOLS FOR ENCODED VALUESC;S5 .IIF LE S2.CR-200 .ERROR ;S2.CR MUST BE IN HIGH BYTELVFNUL = 0 ;NULL - NOTHING#VFZER = 376!S2.CR ;0 - 2 LF'S, 1 CRO#VFONE = CH.FF!S2.CR ;1 - 1 FF, 1 CRO%VFPLU = S2.CR ;+ - NO LF OR FF, 1 CRAVFDOL = 377 ;$ - 1 LF, NO CRH&VFDF = 377!S2.CR ;DEFAULT - 1 LF, 1 CR;D;R; DEFINE THE TABLE TERMINATOR ;L CH.DF = -1;R! CREC VF,L;I;L; SPECIAL ECHO STRINGS;I<ASHT:: .BYTE CH.SP,CH.SP,CH.SP,CH.SP,CH.SP,CH.SP,CH.SP,CH.SP) ;8 SPACES - USED TO SIMULATE HOR. TAB  .IF DF T$$CTR .ASCTR:: .ASCII /^R/ ;CTRL-R L .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$$CLIS .IF DF T$$SPC-ASCLC:: .BYTE 15,12 ;CLI CONTINUATION PROMPT .ASCII /->/ ;R .ENDC ;T$$SPC;,!; DON'T SEPARATE THE LINES BELOW!O;RASCTZ::.ASCII /^Z/ ;CTRL-ZC&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)T; !; DON'T SEPARATE THE LINES ABOVE! ;SASBELL::.BYTE 7 ;BELLASBSL:: .ASCII "\" ;BACKSLASH L .IF DF T$$RUB B<ASRBS:: .BYTE CH.BSP,CH.SP,CH.BSP ;BACKSPACE-SPACE-BACKSPACE ;(FOR SCOPE RUBOUT)A7ASBSP:: .BYTE CH.BSP,CH.BSP,CH.BSP,CH.BSP ;8 BACKSPACEST; .BYTE CH.BSP,CH.BSP,CH.BSP,CH.BSP ;TO RUBOUT HTAB ON SCOPE  ' .ENDC T;L. NLFF==4 ;NUMBER OF VERTICAL FILL CHARACTERS. .REPT 4 ;OUTPUT 4 LF'S IN PLACE OF FF AND VT .BYTE CH.LF ;FOR SCOPESF/ .REPT NLFF ;INSERT VERTICAL FILL IF NECESSARY  .BYTE 0 .ENDR .ENDR. .REPT 4 ;OUTPUT 4 LF'S IN PLACE OF FF AND VT .BYTE CH.LF ;FOR SCOPES$ .ENDRASLF:: .BYTE CH.LF ;LINE FEED .REPT NLFFE .BYTE 0 ;FILLERS .ENDR;P;U .IF DF T$$ESC T(; SYNTAX RULE TABLE FOR ESCAPE SEQUENCES; .ENABL LSB,7 .BYTE 'P,'P,40$-ESCST ;P - NEXT = 40$ (VT61 EXCEPTION)7 .BYTE 'Y,'Y,30$-ESCST ;Y - NEXT = 30$ (VT61 EXCEPTION).EESCST:: .BYTE '?,'?,40$-ESCST ;? - NEXT = 40$ (OLDER TERM. EXCEPTION)F< .BYTE 'O,'O,40$-ESCST ;O - NEXT = 40$ (ANSI SS3 INTRODUCER)1 .BYTE '[,'[,20$-ESCST ;[ - NEXT = 20$ (ANSI CSI)FB10$: .BYTE 40,57,10$-ESCST ;INTERMEDIATE CHAR. - NEXT = SAME (10$)' .BYTE 60,176,0 ;FINAL CHARACTER - DONEEB20$: .BYTE 40,77,20$-ESCST ;INTERMEDIATE CHAR. - NEXT = SAME (20$)( .BYTE 100,176,0 ;FINAL CHARACTER - DONE@30$: .BYTE 40,176,40$-ESCST ;FIRST COORD. (BIAS 40) - NEXT = 40$40$: .BYTE 60,71,20$-ESCST ; .BYTE 40,176,0 ; .DSABL LSB- S .ENDC ;01; TABLE OF HORIZONTAL FILL REQUIREMENT FOR LA30S.;3; INDEX = CURRENT HORIZONTAL POSITION DIVIDED BY 8.$;C ; NUMBER OF FILL CHAR.S HOR.POS.HORFT:: .BYTE 4. ;0-7.; .BYTE 8. ;8.-15. .BYTE 6. ;16.-23.. .BYTE 3. ;24.-31.C .BYTE 0. ;32.-39.: .BYTE 2. ;40.-47.T .BYTE 4. ;48.-55.- .BYTE 6. ;56.-63.. .BYTE 8. ;64.-71.  .BYTE 10. ;72. AND UPY;4;7 0.IIF DF T$$ONI, .PSECT MAP6  .IF DF D$$M00io of__DATADATADATADATA11&R$$MPL&T$$ONI#YMC12:: .BLKW 1 ;POINTER TO $YMCTBB .ENDC ;D$$M11&R$$MPL&T$$ONI* .IF DF T$$GMC!T$$SMC!D$$M11!D$$Z11!D$$V11 .SPHI == S.38.4 ;HIGHEST RECOGNIZED SPEED CODE  .IF DF D$$H11 L:; TABLE OF RECEIVE AND TRANSMIT SPEED PARAMETERS FOR DH11.>; THE TABLE IS INDEXED BY S.XXX-1, WHERE S.XXX IS THE SYMBOLIC1; NAME FOR THE DESIRED SPEED (DEFINED BY TTSYM$)..<; EACH ENTRY IS A BYTE CONTAINING THE PARAMETER TO LOAD INTO.; THE LINE PARAMETER REGISTER FOR SPEED S.XXX.>; IF S.XXX IS UNSUPPORTED, THE BYTE CONTAINS A NEGATIVE VALUE.;MSPDH:: .BYTE 0 ;S.0 .BYTE 1 ;S.50 .BYTE 2 ;S.75$ .BYTE -1 ;S.100 - UNSUPPORTEDI .BYTE 3 ;S.110 .BYTE 4 ;S.134 .BYTE 5 ;S.150 .BYTE 6 ;S.200 .BYTE 7 ;S.300 .BYTE 10 ;S.600A .BYTE 11 ;S.1200 .BYTE 12 ;S.1800 .BYTE -1 ;S.2000 - UNSUPPORTED .BYTE 13 ;S.2400 .BYTE -1 ;S.3600 - UNSUPPORTED .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 P .ENDC ;D$$H11  .IF DF D$$Z11 .:; TABLE OF RECEIVE AND TRANSMIT SPEED PARAMETERS FOR DZ11.9; THE TABLE FORMAT IS IDENTICAL TO THAT OF THE DH11 TABLE0; DESCRIBED ABOVE.;Y#SPDZ:: .BYTE -1 ;S.0 - UNSUPPORTED. .BYTE 0 ;S.50 .BYTE 1 ;S.750 .BYTE -1 ;S.100 - UNSUPPORTED0 .BYTE 2 ;S.110 .BYTE 3 ;S.134 .BYTE 4 ;S.150 .BYTE -1 ;S.200 - UNSUPPORTEDD .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 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. 9; THE TABLE FORMAT IS IDENTICAL TO THAT OF THE DH11 TABLE0; DESCRIBED ABOVE.;E$SPDHV:: .BYTE -1 ;S.0 - UNSUPPORTED .BYTE -1 ;S.50 - UNSUPPORTED .BYTE 1 ;S.750 .BYTE -1 ;S.100 - UNSUPPORTED; .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;M; MATCH TABLES FOR AUTO-BAUD SPEED DETECT. EACH ENTRY CONSISTS OF TWO BYTES, K; THE FIRST BYTE IS WHAT A CARRIAGE RETURN LOOKS LIKE WHEN WE ARE RECEIVING K; AT A KNOWN RATE AND THE CHARACTER WAS SENT AT THE BAUD SPEED SPECIFIED BY.J; THE SECOND RATE. THERE ARE TWO TABLES, ONE FOR DETECTING SPEEDS BETWEENL; 600 AND 9600 BAUD (WE SAMPLE AT 4800 BAUD), THE OTHER FOR DETECTING SPEEDS2; BETWEEN 50 AND 300 BAUD (WE SAMPLE AT 300 BAUD).;1;ABHIGH::.BYTE 200,S.600 ;CH.CR AT 600 BAUD ON DH11 AND DZ116 .BYTE 170,S.1200 ;CH.CR AT 1200 BAUD ON DH11 AND DZ116 .BYTE 214,S.1800 ;CH.CR AT 1800 BAUD ON DH11 AND DZ116 .BYTE 346,S.2400 ;CH.CR AT 2400 BAUD ON DH11 AND DZ11- .BYTE 362,S.9600 ;CH.CR AT 9600 BAUD ON DH11 - .BYTE 376,S.9600 ;CH.CR AT 9600 BAUD ON DZ11H .BYTE 0 ;ZERO TABLE TERMINATOR; 9ABLOW:: .BYTE 340,S.50 ;CH.CR AT 50 BAUD ON DH11 AND DZ11)2 .BYTE 170,S.75 ;CH.CR AT 75 BAUD ON DH11 AND DZ114 .BYTE 214,S.110 ;CH.CR AT 110 BAUD ON DH11 AND DZ11- .BYTE 316,S.134 ;CH.CR AT 134.5 BAUD ON DH11.- .BYTE 306,S.134 ;CH.CR AT 134.5 BAUD ON DZ11 4 .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 ;D; 7; TABLES OF IMPLICIT CHARACTERISTICS PER TERMINAL TYPE.0<; EACH TABLE IS INDEXED WITH TERMINAL TYPE (TC.XXX) MINUS 1.;; HIGHEST INDEX = TTPHI. EACH ENTRY IS A BYTE, WITH MEANING ; DESCRIBED BELOW.;E00i"onibjbkb a a a; TABLE BIT(-S) MEANINGB8; ------------------------------------------------------4; TTYP1 0-5 TO BE COPIED DIRECTLY INTO THE HIGH BYTE ; OF STATUS WORD 2 (U.TSTA+2).3; 6-7 CURSOR POSITIONING COMMAND TYPE (RANGE 0-3).N2; THIS VALUE IS USED AS INDEX INTO TABLE "CPOST"; (SEE BELOW).; TTYP2 0-7 PAGE WIDTH.M; TTYP3 0-6 PAGE LENGTH.; 7 1 = SCOPE.4; TTYP4 0-5 TO BE COPIED DIRECTLY INTO THE HIGH BYTE ; OF STATUS WORD 4 (U.TSTA+6).; ;RB; MACRO TO GENERATE AN ENTRY IN THE TABLES TTYP1, TTYP2 AMD TTYP3.;N;BP; NOTE: DEFAULT OF HSY IS A NO-OP. STATUS BITS MUST BE REARRANGED FOR IT TO WORK;DC .MACRO TERM TYPE,WID,LEN,HHT=0,HFF=0,HFL=0,VFL=0,SCP=0,CUP=0,HSY=0C .PSECT TTYP1N .IIF NDF TTYP1 TTYP1==. .=TTYP1+TYPE-1E6 X=!!! .BYTE X!HFL! .IF DF T$$GMC!T$$SMCT .PSECT TTYP2O .IIF NDF TTYP2 TTYP2==. .=TTYP2+TYPE-1O .BYTE WID .PSECT TTYP3U .IIF NDF TTYP3 TTYP3==. .=TTYP3+TYPE-1N .BYTE !LEN .ENDC .PSECT MAP5 .ENDM TERM;0; MACRO TO GENERATE AN ENTRY IN THE TABLE TTYP4.;E< .MACRO ETERM TYPE,ANI=0,AVO=0,BLK=0,DEC=0,EDT=0,RGS=0,SFC=0 .PSECT TTYP4F .IIF NDF TTYP4 TTYP4==. .=TTYP4+TYPE-1IC X=!!!!< X=X!! .BYTE X/400 .PSECT MAP5 .ENDM ETERM;S5TTPHI == T.L2XX ;HIGHEST TERMINAL TYPE WITH IMPLICIT ;CHARACTERISTICS;U" TERM T.AS33 WID=72.,LEN=66.,HFL=1" TERM T.KS33 WID=72.,LEN=66.,HFL=1" 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.E4 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=1. TERM T.VT52 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=2. TERM T.VT55 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=2. TERM T.VT61 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=2# TERM T.L180 WID=132.,LEN=66.,HFF=1I4 TERM T.V100 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=1# TERM T.L120 WID=132.,LEN=66.,HFF=16) TERM T.LA12 WID=132.,LEN=66.,HHT=1,HFF=11) TERM T.L100 WID=132.,LEN=66.,HHT=1,HFF=1 # TERM T.LA34 WID=132.,LEN=66.,HFF=1W# TERM T.LA38 WID=132.,LEN=66.,HFF=1.4 TERM T.V101 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=14 TERM T.V102 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=14 TERM T.V105 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=14 TERM T.V125 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=14 TERM T.V131 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=14 TERM T.V132 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=1( TERM T.LA50 WID=80.,LEN=66.,HHT=1,HFF=1) TERM T.LQP1 WID=132.,LEN=66.,HHT=1,HFF=11) TERM T.LQP2 WID=132.,LEN=66.,HHT=1,HFF=114 TERM T.BMP1 WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=14 TERM T.V2XX WID=80.,LEN=24.,HHT=1,SCP=1,CUP=3,HSY=1) TERM T.LN03 WID=132.,LEN=66.,HHT=1,HFF=11 TERM T.DTC1 WID=132.,LEN=66.8) TERM T.L210 WID=132.,LEN=66.,HHT=1,HFF=1.) TERM T.LQP3 WID=132.,LEN=66.,HHT=1,HFF=11( TERM T.LA75 WID=80.,LEN=66.,HHT=1,HFF=1( TERM T.L2XX WID=80.,LEN=66.,HHT=1,HFF=1 ETERM T.V100 ANI=1,DEC=1,AVO=1  ETERM T.V101 ANI=1,DEC=11% ETERM T.V102 ANI=1,DEC=1,AVO=1,EDT=1H ETERM T.V105 ANI=1,DEC=1D% ETERM T.V125 ANI=1,DEC=1,AVO=1,RGS=11+ ETERM T.V131 ANI=1,DEC=1,AVO=1,EDT=1,BLK=1R+ ETERM T.V132 ANI=1,DEC=1,AVO=1,EDT=1,BLK=1Y% ETERM T.BMP1 ANI=1,DEC=1,AVO=1,EDT=1,+ ETERM T.V2XX ANI=1,DEC=1,AVO=1,EDT=1,SFC=1  .ENDC ;T$$GMC!T$$SMC!T$$CUP .;T .EVEN;W;1>; TABLE OF POINTERS TO DISPATCH TABLES IN CONTROLLER-DEPENDENT4; MODULES. INDEX = CONTROLLER TYPE CODED AS FOLLOWS: ; 0 = DL-11E ; 2 = DZ-11E ; 4 = DH-11N ; 6 = DJ-11E; 10 = DM-11BB=!; 12 = CT VIDEO CONTROL TASK,; 14 = DHV-11; 16 = LAT Port; 20 = USER PORT STUB;,3 .IIF DF R$$CON CTBL:: .IRP X,= 4 .IIF NDF R$$CON CTBL:: .IRP X, .IF IDN X,LH  .IF DF T$$LTH N4 .IIF NDF R$$CON .ERROR ;LAT Support requires R$$CONN .IIF NDF T$$GMC .IIF NDF T$$SMC .ERROR ;LAT Support requires T$$GMC or T$$SMC .WORD $LHTBLC .PSECT CTBL!$LHTBL:.WORD LHSTAX ;START OUTPUT  .WORD LHABOX ;ABO00i*o of__DATADATADATADATART OUTPUT  .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 OFFLINEX .WORD LHUONL ;UNIT ONLINE .WORD LHUOFF ;UNIT OFFLINE& .WORD LHLPAR ;GET/SET LINE PARAMETERS .PSECT MAP5 .IFF ; L$$LTH .WORD 0 .ENDC ; L$$LTH  .ENDC ; IDN X,LHe .IF IDN X,USC .IF DF T$$USP .< .IIF NDF R$$CON .ERROR ;USER SUPPLIED PORTS REQUIRES R$$CON .WORD $USTBL .PSECT CTBL"$USTBL: .WORD USSTAX ;START OUTPUT .WORD USABOX ;ABORT OUTPUTT .WORD USRESX ;RESUME OUTPUT .WORD USSTOX ;STOP OUTPUT .WORD USMTIM ;MODEM TIMER" .WORD USCPUP ;CONTROLLER POWER-UP .WORD USUPUP ;UNIT POWER-UP .WORD USCONL ;CONTROLLER ONLINE! .WORD USCOFF ;CONTROLLER OFFLINET .WORD USUONL ;UNIT ONLINE .WORD USUOFF ;UNIT OFFLINE& .WORD USLPAR ;GET/SET LINE PARAMETERS .PSECT MAP5 .IFF ; T$$USP .WORD 0D .ENDC ; T$$USPU .ENDC ; IDN X,USR .IF DIF X,LH .IF DIF X,US. .IF DF D$$'X'11 .WORD $Y'X'TBLR .PSECT CTBL%$Y'X'TBL:.WORD Y'X'STAX ;START OUTPUT  .WORD Y'X'ABOX ;ABORT OUTPUTS .WORD Y'X'RESX ;RESUME OUTPUT .WORD Y'X'STOX ;STOP OUTPUT .IF NDF R$$COND .WORD Y'X'PWUP ;POWER-UPD .IFTF ;NDF R$$CON .WORD Y'X'MTIM ;MODEM TIMER .IFF ;NDF R$$CONN$ .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 OFFLINEU .WORD Y'X'UONL ;UNIT ONLINE .WORD Y'X'UOFF ;UNIT OFFLINEF .ENDC ;NDF R$$CON# .IF DF T$$GMC!T$$SMC!D$$M11!D$$ZMDY( .WORD Y'X'LPAR ;GET/SET LINE PARAMETERS# .ENDC ;T$$GMC!T$$SMC!D$$M11!D$$ZMDP .PSECT MAP5 .IFFO .WORD 0 .ENDC .ENDC ; DIF X,USD .ENDC ; DIF X,LHD;. .ENDR;$;N@; TABLE OF POINTERS TO FORK LEVEL ROUTINES. THE ORDER OF ENTRIESA; IN THIS TABLE MUST MATCH THE BIT POSITIONS OF THE CORRESPONDINGD2; BITS IN THE FORK REQUEST BYTE U.TFRQ IN THE UCB.;E)FRKTB:: .WORD FPIRD ;FR.IRD - INPUT DONE.# .WORD FPORD ;FR.ORD - OUTPUT DONEC2 .WORD FPSUI ;FR.SUI - START OF UNSOLICITED INPUT  .IF DF T$$CCA T1 .WORD FPAST ;FR.AST - CHARACTER THAT CAUSES AST1 $ .ENDC ;T$$CCA 5 .IF DF M$$PRO .WORD FPTIM ;FR.TIM - TIME-OUT D .ENDC ;M$$PRO N .IF DF T$$SPC/ .WORD FPKIL ;FR.KIL - SEND KILL PACKET TO CLIF .ENDC ;T$$SPC .IF DF T$$OOB7 .WORD FPOOB ;FR.OOB - CHECK FOR OUT-OF-BAND CHARACTER  .ENDC ;T$$OOB .IF DF T$$ICS. .WORD FPICS ;FR.ICS - SEND TSA EVENT PACKET  .ENDC ;T$$ICS .IF DF T$$SCA+ .WORD FPSCA ;FR.SCA - SEND AST TO TSA... L .ENDC ; T$$SCA5 .WORD FPGRQ ;FR.GRQ - GET REQUEST PACKET FROM QUEUET .IF DF T$$LTH+ .WORD FPLAT ;FR.LAT - LAT Port processingO .ENDC ; T$$LTH / .WORD FPPFP ;FR.PFP - POST-FORK PROCESSING OF! ;CHARACTER IN U.TECB (U.TECO) ;K;T$; I/O FUNCTION CODE DISPATCH TABLES.H; VERIFY THAT THE TABLE MATCHES THE NUMERIC VALUES OF I/O FUNCTION CODES; 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,11T .ENDC ASSUME IO.RTT/400,12. .IF DF B$$MAP) ASSUME IO.WSD/400,13 ;WRITE SPECIAL DATAF( ASSUME IO.RSD/400,14 ;READ SPECIAL DATA .ENDC ;B$$MAP .IF DF T$$LTH ASSUME IO.ORG/400,33T .ENDC ;T$$LTH .IF DF T$$EIO* ASSUME IO.EIO/400,37 ;EXTENDED READ/WRITE .ENDC ;T$$EIO;0?; DISPATCH TABLE FOR PROCESSING DIFFERENT FUNCTION CODES BEFORE0%; ENTERING A PACKET IN THE I/O QUEUE.C;0QPDSP::M .IF DF R$$IIC .WORD QPKIL ;IO.KIL. .ENDC ;R$$IIC .WORD QPWLB ;IO.WLB. .WORD QPRLB ;IO.RLB4 .WORD QPATT ;IO.ATTP .WORD QPDET ;IO.DET1 W .IF DF T$$GTS!T$$GMC!T$$SMC D! .WORD QPSPC ;SPECIAL FUNCTIONS:C ; IO.GTS ; SF.SMC ; SF.GMC .IFFT .WORD 0 L .ENDC F .WORD QPHNG ;IO.HNGO/ .WORD 0 ;RESERVED EXEC CLOSE-OUT-LUN FUNCTIONO- .WORD 0 ;RESERVED FOR USER MODE DIAGNOSTICSN .IF00i2onibjbkb a a a DF T$$RPR .WORD QPRPR ;IO.RPRE .IFFI .WORD 0 .ENDC .WORD QPRTT ;IO.RTT  .IF DF B$$MAP .WORD QPWSD ;IO.WSDO .WORD QPRSD ;IO.RSD  .ENDC ;B$$MAP .IF DF T$$LTH .IF NDF B$$MAPT .BLKW 2 .ENDC ;NDF B$$MAP" .BLKW --1 .WORD QPORG .ENDC ;T$$LTH .IF DF T$$EIO .IF NDF T$$LTHD .IF NDF B$$MAP .BLKW 2 .ENDC ;NDF B$$MAP .BLKW - .ENDC ;NDF T$$LTH" .BLKW --1 .WORD QPEIO ;IO.EIOR .ENDC ;T$$EIO;.;D>; DISPATCH TABLE FOR PROCESSING DIFFERENT FUNCTION CODES AFTER/; A PACKET HAS BEEN DEQUEUED FROM THE I/O QUEUEN;; .IF DF T$$OVLD; NOTE: THE ROUTINES THAT ARE IN TTEXT ARE REPRESENTED WITH THE HIGH ; BIT CLEAR.'PPDSP:: .WORD !100000 ;IO.WLB; .WORD !100000 ;IO.RLBN .WORD &77777 ;IO.ATT .WORD &77777 ;IO.DET .IF DF T$$SMC .WORD &77777 ;SF.SMCH .IFFW .WORD 0 .ENDC .WORD &77777 ;IO.HNG." .WORD 0 ;RESERVED EXEC FUNCTION! .WORD 0 ;USER MODE DIAGNOSTICSC .IF DF T$$RPR .WORD !100000 ;IO.RPRH .IFFU .WORD 0 .ENDC .WORD !100000 ;IO.RTTN E .IF DF B$$MAP  .WORD !100000 ;IO.WSD .WORD !100000 ;IO.RSD 0 .ENDC ;B$$MAP P / .IF DF T$$LTH .IF NDF B$$MAP> .BLKW 2 .ENDC ;NDF B$$MAP" .BLKW --1" .WORD &77777 ;ORIGINATE .ENDC ;T$$LTH .IF DF T$$EIO .IF NDF T$$LTH  .IF NDF B$$MAP  .BLKW 2 .ENDC ;NDF B$$MAP .BLKW - .ENDC ;NDF T$$LTH" .BLKW --1 .WORD !100000 ;IO.EIO  .ENDC ;T$$EIO .IF DF T$$LTH" .WORD &77777 ;ORIGINATE .ENDC ;T$$LTH C .IF DF T$$EIO /  .IF NDF B$$MAP  .BLKW 2 .  .ENDC ;NDF B$$MAP G .% .BLKW --1 O" .WORD !100000 ;IO.EIO   .ENDC ;T$$EIO .IFF ;T$$OVL$PPDSP:: .WORD PPWLB ;IO.WLB .WORD PPRLB ;IO.RLBG .WORD PPATT ;IO.ATT. .WORD PPDET ;IO.DETL < .IF DF T$$SMC / .WORD PPSPC ;SF.SMC/ .IFF  .WORD 0 N .ENDC .WORD PPHNG ;IO.HNG.! .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.RTT .IF DF B$$MAP .WORD PPWSD ;IO.WSD1 .WORD PPRSD ;IO.RSD1 .ENDC ;B$$MAP .IF DF T$$LTH .IF NDF B$$MAP$ .BLKW 2 .ENDC ;B$$MAP" .BLKW --1 .WORD PPORG ;ORIGINATET .ENDC ;T$$LTH .IF DF T$$EIO .IF NDF T$$LTHM .IF NDF B$$MAPO .BLKW 2 .ENDC ;NDF B$$MAP .BLKW - .ENDC ;T$$LTH" .BLKW --1 .WORD PPEIO ;IO.EIO. .ENDC ;T$$EIO D .ENDC ;T$$OVL;O; LH port dispatch table:D;$ .IF DF T$$LTH'LHDSP:: .WORD $LHSTS ; Start session0 .WORD $LHINP ; Receive data from LAT process+ .WORD $LHOUT ; Send data to LAT processO .WORD $LHSTP ; Stop sessionD$ .WORD $LHGTD ; GET TRANSMIT DATA$ .WORD $LHTMO ; SOLICIT TIMED OUT .ENDC ;T$$LTH;O;0; DISPATCH TABLE FOR INPUT CHARACTER PROCESSING.5; THIS TABLE IS CONSULTED EACH TIME ECHO DONE OCCURS.0@; THE TABLE CONTAINS POINTERS TO ROUTINES IN THE MODULE "ICHAR".F; INDEX = INPUT LOGIC STATE VARIABLE (U.TISV IN UCBX) MULTIPLIED BY 2.;:*ISDSP:: .WORD CFGRQ ;NOTHING MORE TO ECHO N .IF DF T$$CTR SV.CR1==<.-ISDSP>/2O' .WORD I2CTR1 ;USED FOR CTRL-R ECHOING' .WORD I2CTR2 ;USED FOR CTRL-R ECHOING$ .IF DF R$$MPL!A$$CLIA' .WORD I2CTR3 ;USED FOR CTRL-R ECHOING. .ENDC' .WORD I2CTR4 ;USED FOR CTRL-R ECHOINGA' .WORD I2CTR5 ;USED FOR CTRL-R ECHOINGE A .ENDC OSV.CU1==<.-ISDSP>/2 ' .WORD I2CTU1 ;USED FOR CTRL-U ECHOINGE' .WORD I2CTU2 ;USED FOR CTRL-U ECHOINGT .IF DF R$$MPL!A$$CLIC' .WORD I2CTU3 ;USED FOR CTRL-U EC00i:o of__DATADATADATADATAHOINGR .ENDC' .WORD I2CTU4 ;USED FOR CTRL-U ECHOINGC;=;I1; DISPATCH TABLE FOR OUTPUT CHARACTER PROCESSING.D; THIS TABLE IS CONSULTED EACH TIME AN OUTPUT CHARACTER IS EXPANDED.A; THE TABLE CONTAINS POINTERS TO ROUTINES IN THE MODULE "EXPCHR". ;; INDEX = BITS 8 AND 9 IN U.TSTA+2 IN UCBX MULTIPLIED BY 2.C; (BIT COMBINATION 11 UNUSED).;I"OSDSP:: .WORD EXPC0 ;DEFAULT CASE# .WORD EXPC1 ;USED FOR WRAP-AROUNDF# .WORD EXPC2 ;USED FOR WRAP-AROUNDA;L; . .IF NDF T$$ONIF,; NOTE THIS DATA IS DUPLICATED IN TTATT !!!!;D .IF DF T$$GMC!T$$SMC= I; @; TABLE OF CHARACTERISTIC CODES FOR GET MULTIPLE CHARACTERISTICSG; FUNCTION (SF.GMC) AND SET MULTIPLE CHARACTERISTICS FUNCTION (SF.SMC).S;I7; EACH RECOGNIZED CODE HAS A 1-WORD ENTRY IN THE TABLE.S*; 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 CHARACTERISTICO7; VALUE IN THE PROPER BYTE IN THE UCB. BITS ARE SET FOR ; RELEVANT BITS IN THE UCB BYTE.6; HIGH BYTE = OFFSET FROM START OF THE UCB TO THE BYTE+; THAT CONTAINS THE DESIRED CHARACTERISTIC.O;E; 2. IF BIT 15 = 1:S6; THE WORD IS THE ADDRESS OF A SUBROUTINE THAT HANDLES!; THIS PARTICULAR CHARACTERISTIC.R=; (ALL VIRTUAL ADDRESSES IN THE DRIVER ARE 120000 OR HIGHER).O;I; 3. IF THE WHOLE WORD = 0:<; THIS CHARACTERISTIC IS NOT RECOGNIZED BY SF.GMC OR SF.SMC.;T; (; DEFINE MACRO TO GENERATE TABLE ENTRIES;T .MACRO MCGEN NAME,OFS,BMB .IF LE NAME-MCHI  .=MCTAB+<2*>B .IF NB BM .IF LE BM-377 .BYTE BM,OFST .IFFT .BYTE BM/400,OFS+1N .ENDC .IFFE .WORD OFS .ENDC .IFF. .ERROR ;ILLEGAL CHARACTERISTICH .ENDC .ENDM MCGEN; 4MCHI == TC.MAX-1 ;HIGHEST RECOGNIZED CHARACTERISTIC;VMCTAB:: .REPT MCHI+ .WORD 0 ;INITIALIZE WHOLE TABLE TO ZEROSI .ENDR* MCGEN TC.WID,U.CW4,377 ;NUMBER OF COLUMNS2 MCGEN TC.LPP,U.TLPP,377 ;NUMBER OF LINES PER PAGE O .IF DF D$$H11!D$$Z11!D$$V11 .# MCGEN TC.RSP,MCRSP ;RECEIVE SPEEDE$ MCGEN TC.XSP,MCXSP ;TRANSMIT SPEED4 MCGEN TC.PAR,MCPAR ;PARITY GENERATION AND CHECKING" MCGEN TC.EPA,MCEPA ;PARITY SENSE, MCGEN TC.CLN,MCCLN ;7-BIT CHARACTER LENGTH .IF DF T$$MOD" MCGEN TC.ASP,MCASP ;ANSWER SPEED5 MCGEN TC.ABD,U.TSTA+6,S4.ABD ;AUTO-BAUD SPEED DETECTI .ENDC ;T$$MOD I .ENDC ;D$$H11!D$$Z11!D$$V11 0 MCGEN TC.ISL,U.UNIT,377 ;SUB-LINE ON CONTROLLER# MCGEN TC.TTP,MCTTP ;TERMINAL TYPEE! MCGEN TC.SCP,U.CW2,U2.CRT ;SCOPE$: MCGEN TC.HFL,U.TSTA+6,S4.HFL ;HORIZONTAL FILL REQUIREMENT8 MCGEN TC.VFL,U.TSTA+6,S4.VFL ;VERTICAL FILL REQUIREMENT1 MCGEN TC.HFF,U.TSTA+6,S4.HFF ;HARDWARE FORM-FEEDS+ MCGEN TC.HHT,U.TSTA+6,S4.HHT ;HARDWARE TABE< MCGEN TC.ACR,U.TSTA+4,S3.ACR ;AUTOMATIC CR-LF ON LONG LINES+ MCGEN TC.PPT,U.TSTA+4,S3.PPT ;PRINTER-PORTD3 MCGEN TC.SMR,U.CW2,U2.LWC ;LOWERCASE INPUT ENABLED! .IF DF T$$ESC7 MCGEN TC.ESQ,U.CW2,U2.ESC ;ESCAPE SEQUENCES RECOGNIZEDC  .ENDC ;T$$ESC .IF DF T$$MOD ," MCGEN TC.DLU,MCRMT ;DIAL-UP LINE S .ENDC Z, 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 TERMINALS/ MCGEN TC.PRI,U.CW2,U2.PRV ;PRIVILEGED TERMINALM* MCGEN TC.FDX,U.TSTA+4,S3.FDX ;FULL DUPLEX; MCGEN TC.PTH,U.TSTA+4,S3.PTH ;PASS-THROUGH MODE IS ENABLED# MCGEN TC.BIN,MCBIN ;READ-PASS-ALL > MCGEN TC.8BC,U.TSTA+4,S3.8BC ;8 BIT CHARACTERS PASSED ON READ4 MCGEN TC.TBF,MCTBF ;TYPE-AHEAD BUFFER ACTIVE COUNT& MCGEN TC.CTS,MCCTS ;CONTROL-S STATUS3 MCGEN TC.HSY,MCHSY ;HOST/TERMINAL SYNCHRONIZATIONH' MCGEN TC.ANI,U.TSTA+6,S4.ANI ;ANSI CRTA- MCGEN TC.AVO,U.TSTA+6,S4.AVO ;ADVANCED VIDEO;) MCGEN TC.BLK,U.TSTA+6,S4.BLK ;BLOCK MODEV& 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 ;REGIS. MCGEN TC.SFC,U.TSTA+6,S4.SFC ;SOFT CHARACTERS;G .IF DF R$$MPL!A$$CLIB .IF DF C$$CTC5 MCGEN TC.TLC,U.TSTA+4,S3.CTC ;CONTROL-C NOTIFICATIONE .ENDC ;C$$CTC' MCGEN TC.NBR,U.MUP,UM.NBR ;NOBROADCASTN .ENDC ;R$$MPL!A$$CLII .IF DF T$$ACD4 MCGEN TC.00iBonibjbkb a a aACD,MCACD ;ANCILLARY CONTROL DRIVER (ACD) .ENDC ;T$$ACD .IF DF T$$SPL% MCGEN TC.RAT,MCTYP ;READ-AHEAD TYPED+ MCGEN TC.TBS,MCTBS ;TYPEAHEAD BUFFER SIZEM .IFF ;T$$SPLA. MCGEN TC.RAT,U.TSTA+4,S3.TAB ;READ-AHEAD TYPE .ENDC ;T$$SPL .IF DF T$$SER? MCGEN TC.TBM,U.MUP,UM.SER ;TYPEAHEAD BUFFER MODE (TASK OR CLI) .ENDC ;T$$SER;4 .IF DF T$$OOB: MCGEN TC.OOB,MCOOB ;OUT-OF-BAND/HELLO/INCLUDE CHARACTERS .ENDC ;T$$OOB .IF DF T$$ICS1 MCGEN TC.ICS,MCICS ;NOTIFY OF CHANGE IN TABUF  ;(INPUT COUNT STATE)( .ENDC ;TT$ICS .IF DF T$$SCA/ MCGEN TC.SSC,MCSSC ;SPECIFY SWITCH CHARACTERS3 MCGEN TC.TMM,MCTMM ;EXIT TERMINAL MANAGEMENT MODE  .ENDC ;T$$SCA) MCGEN TC.TSY,MCTSY ;OUTPUT FLOW CONTROL& .IF DF T$$MHU ;MODEM HANG-UP NOTIFY8 MCGEN TC.MHU,MCMHU ;REQUEST MODEM HANG-UP NOTIFICATION .ENDC ;T$$MHU .IF DF T$$LTH&M$$NETMG MCGEN TC.QDP,MCQDP ;GET QUEUE DEPTH AND LAT CONNECT/DISCONNEDT STATUS) MCGEN TC.MAP,MCMAP ;SET UP LAT MAPPING F .ENDC ;T$$LTH&M$$NET .=MCTAB+<2*MCHI> ;END OF TABLE;;. D .ENDC ;T$$GMC!T$$SMC, S .ENDC ;NDF T$$ONI;A;R  .IF DF T$$MOD ;X5; DISPATCH TABLE FOR MODEM INTERRUPT SERVICE ROUTINE..4; INDEX = BITS 1 AND 2 IN U.STS (US.DSB AND US.CRW).;O5MDSP:: .WORD MODI4 ;ENABLED, NOT WAITING FOR CARRIER 0 .WORD MODI2 ;DISABLED, NOT WAITING FOR CARRIER+ .WORD MODI5 ;ENABLED, WAITING FOR CARRIERU, .WORD MODI3 ;DISABLED, WAITING FOR CARRIER N .ENDC ;T$$MOD; ;L; MISCELLANEOUS WORDS;;L .IF DF D$$V11!D$$H11<2YVXOFF::.WORD CH.CTS!100000 ;XOFF FOR DHU/DHV11/DH1YVXON:: .WORD CH.CTQ!100000 ;XON FOR DHU/DHV11/DH$ .ENDC ;D$$V11!D$$H11T .IF NDF T$$SPLR1$DALED::.BLKW 1 ;SAVED DRIVER MAPPING FOR KISAR6T .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 ROOTO8TTEXT: .RAD50 /TTEXT / ;NAME OF COMMON TO MAP AS OVERLAY .PSECT MAP5 .ENDC ;T$$OVL&FREEB:: .WORD 0 ;FREE BUFFER LISTHEAD2DCB0:: .BLKW 1 ;POINTER TO DCB FOR FIRST TERMINAL% ;SET UP BY INITIALIZATION ROUTINEN.OPTIMR::.WORD OPTIME ;OUTPUT TIMEOUT INTERVAL;F;F $ .IF DF D$$H11!D$$V11  .IF DF M$$EXT G?; SAVED SETTINGS FOR UMR(S) TO MAP DRIVER WITH 18-BIT ADDRESSESA; IDENTICAL TO 16 BIT ADDRESSESP; UMR5S:: .BLKW 2 ;UMR 5A .IF NDF T$$SPL1 .BLKW 2 ;UMR 6 V .ENDC ;NDF T$$SPL .IFF ;M$$EXTO .IF DF D$$H11 EF; RELOCATION CONSTANT TO TRANSFORM A VIRTUAL ADDRESS WITHIN THE DRIVERA; TO A PHYSICAL ADDRESS. THIS RELOCATION IS REQUIRED ONLY FOR DMASE; CONTROLLERS (SUCH AS THE DH-11), AND ONLY IF EXTENDED MEMORY IS NOT D; PRESENT. THE FORMAT OF THE DOUBLE-WORD RELOCATION CONSTANT IS SUCHG; THAT WHEN IT IS ADDED TO A VIRTUAL ADDRESS IN THE RANGE 120000-157777AA; (CARRY IS ADDED TO BIT 4 OF THE HIGH ORDER WORD), THE RESULT IS$A; THE 18-BIT PHYSICAL ADDRESS (2 HIGH BITS IN BITS 4-5 OF RELC+0,; 16 LOW BITS IN RELC+2).O;IG; THE RELOCATION CONSTANT IS CALCULATED AND STORED HERE BY THE POWER-UPI; CODE.S;TH; IF EXTENDED MEMORY IS PRESENT, THE POWER-UP CODE HAS MAPPED THE DRIVERA; IN UMR'S 5 AND 6, WHICH MEANS THAT DRIVER VIRTUAL ADDRESSES AREE&; IDENTICAL WITH THE 18-BIT ADDRESSES.; RELC:: .BLKW 2 .ENDC ;D$$H11 D .ENDC ;M$$EXT 2 .ENDC ;D$$H11!D$$V11I D .IF DF D$$V11L; DHV11 RELOCATION CONSTANT TO TRANSFORM A VIRTUAL ADDRESS WITHIN THE DRIVERK; TO A PHYSICAL ADDRESS. THE FORMAT OF THE DOUBLE-WORD RELOCATION CONSTANTNO; IS SUCH THAT WHEN IT IS ADDED TO A VIRTUAL ADDRESS IN THE RANGE 120000-157777 3; THE RESULT IS THE 18-BIT/22-BIT PHYSICAL ADDRESS.R;RRELCV:: .BLKW 2D .IF DF K$$DAS6 .BLKW 2 ;ANOTHER CONSTANT TO MAP D-SPACE POOL REGION .ENDC ;K$$DAS .ENDC ;D$$V11 . .IF DF T$$CUP .F; TABLE OF POINTERS TO ROUTINES TO EXPAND A CURSOR POSITIONING COMMAND<; INTO A CHARACTER STRING APPROPRIATE FOR THE TERMINAL TYPE.G; INDEX INTO THIS TABLE = 2*X-2, WHERE X = THE VALUE IN BITS 6-7 OF THEN2; TABLE "TTYP1" (SEE ABOVE) 00iJo of__DATADATADATADATAFOR THE TERMINAL TYPE.;L$CPOST:: .WORD CPOS1 ;1 - VT05 STYLE .WORD CPOS2 ;2 - VT52 STYLEI .WORD CPOS3 ;3 - VT100 STYLE;B; H; NOTE - THE LOCATIONS EXPCP, CP0, CP1, CP2 AND CP3 BELOW ARE READ/WRITE ; LOCATIONS!@; THIS IS SAFE SINCE THEY ARE ONLY USED BY THE SYSTEM STATE CODE3; IN MODULE "TTRW" - NEVER BY INTERRUPT LEVEL CODE.A;C; POINTER TO ROUTINE TO EXPAND 1 CHARACTER ON OUTPUT, OR TO ROUTINE *; THAT EXPANDS CURSOR POSITIONING COMMAND.; EXPCP:: .WORD EXPC3A; 7; TERMINAL-DEPENDENT CURSOR POSITIONING COMMAND STRINGSW; 2; TYPE 2 - VT52. MUST BE LOCATED ON WORD BOUNDARY!;CP2:: .BYTE CH.ESC,'H,CH.ESC,'JB .BYTE CH.ESC,'Y,0,0;O; TYPE 1 - VT051;P3CP1:: .BYTE 35,0,0,0,0 ;4 FILLERS AFTER HOME CURSORI/ .BYTE 37,0,0,0,0 ;4 FILLERS AFTER ERASE-TO-EOST3 .BYTE 16,0,0,0,0,0,0 ;4 FILLERS AFTER Y-COORDINATE ;E; TYPE 3 - VT100;RCP3:: .BYTE CH.ESC,'[,'2,'JO .BYTE CH.ESC,'[,0,0,0,';,0,0,0ECP3A:: .BYTE 'HI .EVEN M .ENDC ;T$$CUP W .IF DF D$$M11&R$$MPL&T$$COM E#YMCP1:: .BLKW 1 ;POINTER TO $YMCTBW  .ENDC ;D$$M11&R$$MPL&T$$COM D .IF NDF R$$MPL!  P; ;TABLE OF POINTERS TO UCB TABLES;.TTUCB:: .IRP X, .IF DF D$$'X'11 .WORD D'X'UCB .IFFF .WORD 0 .ENDC .ENDR ,;,; DL-11 DATABASESE;E - .IF DF D$$L11.DLUCB:: ;DL UCB POINTER TABLE POINTER TABLEN=03 .REPT D$$L11P .WORD DLUC0+NN=N+4' .ENDR'DLUC0: .BLKW D$$L11*2 ;DL UCB/CSR TABLEE I .ENDC ; DF D$$L11;C; DH-11 DATABASESM;R .IF DF D$$H11+DMUCB:: ;POINT DM11-BB UCB'S TO DH UCB'SN.DHUCB:: ;DH UCB POINTER TABLE POINTER TABLEN=0P .REPT D$$H11  .IF DF D$$M11+ .WORD DHUC0+N+2 ;POINTER TO DH11 UCB TABLEDN=N+38.1 .IFFD* .WORD DHUC0+N ;POINTER TO DH11 UCB TABLEN=N+36.1 .IFTF .ENDRDHUC0: ;DH UCB TABLES .REPT D$$H11T .IFTP .BLKW 1 ;DM11-BB CSR ADDRESS .ENDC .BLKW 1 ;DH11 CSR ADDRESS. .REPT 16.2 .WORD 0 ;ADDR OF UCB FOR LINE (PLUGGED AT TTPWF) .ENDR .WORD -1 ;END OF UCB LIST1 .ENDR .ENDC ; DF D$$H11 ';O; DZ-11 DATABASES ;; .IF DF D$$Z11.DZUCB:: ;DZ UCB POINTER TABLE POINTER TABLEN=01 .REPT D$$Z1106 .WORD DZUC0+N ;POINTER TO DZ11 UCB TABLE (INDEXED BY ; CONTROLLER NUMBER)N=N+20.T .ENDRDZUC0: ;REF LABEL .REPT D$$Z11D .BLKW 1 ;DZ CSR ADDRESST .REPT 8.% .WORD 0 ;UCB ADDRESS FOR EACH LINE N .ENDR .WORD -1 ;END OF UCB LIST. .ENDR . .ENDC ; DF D$$Z11 R;N; DJ-11 DATABASES);. .IF DF D$$J11.DJUCB:: ;DJ UCB POINTER TABLE POINTER TABLEN=0 .REPT D$$J11 * .WORD DJUC0+N ;POINTER TO DJ11 UCB TABLEN=N+36.T .ENDRDJUC0: ;REF LABEL .REPT D$$J11D .BLKW 1 ;DJ CSR ADDRESSU .REPT 16. .WORD 0 ;ADDRESS OF LINE'S UCB .ENDR .WORD -1 ;END OF UCB LISTL .ENDR .ENDC ; DF D$$J11 ; ; DHV-11 DATABASES; .IF DF D$$V11DVUCB:: ;REF LABEL.N=0 .REPT D$$V11 + .WORD DVUC0+N ;POINTER TO DHV11 UCB TABLEN=N+36.  .ENDRDVUC0: ;REF LABEL .REPT D$$V11  .BLKW 1 ;DHV CSR ADDRESS .REPT 16.$ .WORD 0 ;UCB ADDRESS FOR EACH LINE .ENDR .WORD -1 ;END OF UCB LISTT .ENDR .ENDC ; DF D$$V11 .ENDC ;NDF R$$MPL.PAGE1 .IF DF B$$MAP;E"; CT VIDEO TASK INTERFACE DATABASE;B&TFWPAR::.RAD50 /TFWCOM/ ;TFWCOM'S NAME*VT.NAM::.RAD50 /TFW.../ ;VIDEO TASK'S NAME-DTYPE:: .BLKW 1 ;TEMPORARY DATA TYPE STORAGE;8CTEX:: .RAD50 /C$CTEX/ ;TASK NAME OF THE CTEX DISPATCHER'IDOFLG::.WORD 0 ;FLAG FOR INTERRUPT-DO&STIMER::.WORD 1 ;SCREEN TIMER COUNTER;WJ; THIS IS THE TABLE OF ADDRESSES FOR THE SPECIAL DATA "TYPEAHEAD" BUFFERS.;K; BECAUSE OF THE WAY THAT THIS IS BEING DONE THERE CAN ONLY BE ONE TERMINALMH; THAT SUPPORTS IO.RSD. FOR THE PRO ENVIRONMENT THIS IS NOT A PROBLEM. ;>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;E!; TYPEAHEAD BUFFER FOR GIDIS DATA;;G"GIDIS: .BYTE 0 ;INSERTION POINTER .BYTE 0 ;RETRIEVAL00iRonibjbkb a a a POINTER .BYTE 0 ;ACTIVE COUNTE .BYTE T$$BFL-4 ;BUFFER LENGTH .BLKB T$$BFL-4 ;DATAEH; THIS PSECT IS USED TO FORCE ALIGNMENT OF TFWCOM ON A 32 WORD BOUNDARY.E; IT WILL COLLATE BEFORE $$$$$$ AND ITS SIZE IS SET IN THE BUILD FILE .PSECT $$$$$A4; THIS PSECT IS USED TO DEFINE THE LENGTH OF TFWCOM.; IT WILL COLLATE AFTER $$$$$$ .PSECT $$$$$.#TFWEND == . ;ADDRESS END OF TFWCOMO .ENDC ;B$$MAP .PSECT $$$$$$,OVR .IF DF B$$MAP+TFWCOM:: ;THIS IS THE START OF THE TFWCOMI" ;A PARTITION WILL OVERMAP THIS% ;SECTION OF DATA. THAT PARTITIONL* ;IS USED BY TFW... TO GET AT THIS DATA7VT.ADR::.WORD TFWCOM ;THE VIRTUAL ADDRESS OF THE STARTL& ;OF TFWCOM FROM THE DRIVER'S POINT ;OF VIEW0VT.APR::.BLKW 1 ;THE PHYSICAL ADDRESS OF TFWCOMLVT.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;D; FLAG WORD BIT DEFINITIONSI;HTF.INT == 1 ;INIT VIDEO TASKR"TF.ABO == 2 ;ABORT CURRENT OUTPUT$TF.SPN == 4 ;SUSPEND CURRENT OUTPUTTF.BTM == 10 ;BLINK TIMEOUTTF.CTM == 20 ;CURSOR TIMEOUTT#TF.STM == 40 ;SCREEN BLANK TIMEOUT ,TF.PRT == 400 ;PRINT SCREEN FLAG FOR TFW.../TF.SON == 1000 ;TURN SCREEN ON FLAG FOR TFW...C%CT$TIC == 1 ;TICK COUNT FOR CT TIMERL>I$MAX == T$$BFL-4 ;MAXIMUM NUMBER OF CHARS IN THE INPUT BUFFER;S;; INTERNAL BUFFER FORMAT - ALSO USED FOR TFW OUTPUT BUFFERSD; %OB.LNK == 0 ;LINK TO THE NEXT BUFFER=OB.LEN == 2 ;DATA LENGTH (=N)<OB.TYP == 3 ;DATA TYPE (SEE THE DATA PATH SPECIFIER VALUES)OB.DAT == 4 ;DATA (N BYTES);F ; INPUT BUFFER FORMAT (FROM TFW);=<IB.TYP == 0 ;DATA TYPE (SEE THE DATA PATH SPECIFIER VALUES)IB.LEN == 1 ;DATA LENGTH (=N)'IB.SPI == 2 ;TYPE SPECIFIC INFORMATION IB.DAT == 4 ;DATA (N BYTES); ; MORE INTERFACE DATA FOR TFWC;ST.BTMR::.WORD 0 ;BLINK TIMERET.CTMR::.WORD 0 ;CURSOR TIMER$T.STMR::.WORD 0 ;SCREEN BLANK TIMER$T.OPKP::.WORD 0 ;OUTPUT BUFFER LIST,T.OREM::.WORD 0 ;COUNT OF OUTPUT CHARACTERS@T.OPKC::.WORD 0 ;COUNT OF BYTES PROCESSED IN CURRENT OUTPUT PKT;; INPUT BUFFER (FROM TFW) ;O T.INBF::.BYTE 0 ;DATA STREAM ID .BYTE 0 ;DATA COUNTE$ .WORD 0 ;TYPE SPECIFIC INFORMATION$ .BLKW I$MAX/2 ;THEN COMES THE DATA;M&; INTERMEDIATE INPUT AND OUTPUT BUFFER;; BYTE CONTENTS -; ------------------------------------T@; 0-1 LINK TO NEXT BUFFER (0 IF THIS IS LAST).; 2 LOGICAL BUFFER LENGTH"; 3 DATA TYPE; 4-47 DATAS;OC; THE FOLLOWING BUFFER IS USED WHEN THE OUTPUT BUFFER IS NOT IN THEC; NORMAL BUFFER CHAIN FORMAT. THIS OCCURS WHEN ECHOING IS DONE ANDT>; WHEN THE TERMINAL DRIVER PUTS SOMETHING SPECIAL OUT, SUCH AS; PROMPT STRINGS.E;P2T.TBUF::.WORD 0 ;ZERO LINK WORD - ONLY ONE BUFFER .BLKB 1 ;BUFFER LENGTH .BYTE 0 ;DATA TYPE 0 = TEXT1 .BLKB T$$BFL-4 ;DATAX;F?; DEFINE OFFSETS FOR THE LOCATIONS IN TFWCOM FOR THE VIDEO TASKE;H9VT$ADR == VT.ADR-TFWCOM ;THE VIRTUAL ADDRESS OF THE START & ;OF TFWCOM FROM THE DRIVER'S POINT ;OF VIEW7VT$APR == VT.APR-TFWCOM ;THE PHYSICAL ADDRESS OF TFWCOM @VT$LEN == VT.LEN-TFWCOM ;LENGTH OF THE COMMON IN 32. WORD BLOCKS1T$FTCB == VT.TCB-TFWCOM ;VIDEO TASK'S TCB ADDRESSN1T$FLAG == T.FLAG-TFWCOM ;FLAG WORD FOR VIDEO TASK $T$BTMR == T.BTMR-TFWCOM ;BLINK TIMER%T$CTMR == T.CTMR-TFWCOM ;CURSOR TIMERT+T$STMR == T.STMR-TFWCOM ;SCREEN BLANK TIMERE+T$OPKP == T.OPKP-TFWCOM ;OUTPUT BUFFER LIST3T$OREM == T.OREM-TFWCOM ;COUNT OF OUTPUT CHARACTERS GT$OPKC == T.OPKC-TFWCOM ;COUNT OF BYTES PROCESSED IN CURRENT OUTPUT PKTT.T$INBF == T.INBF-TFWCOM ;CIRCULAR INPUT BUFFER .ENDC ;B$$MAP.PAGET;+ ; DRIVER INITIALIZATION ROUTINE.;B3; THIS CODE IS EXECUTED ONCE ONLY AT THE FIRST CALL=); TO THE DRIVER AFTER IT HAS BEEN LOADED.#; IT SERVES THE FOLLOWING PURPOSES:2; 1. ESTABLISH THE MAPPING OF THE DRIVER DATA AREA:; AND SAVE THE APR VALUES IN SAVE LOCATIONS SO THEY CAN5; BE 00iZo of__DATADATADATADATAQUICKLY LOADED WHENEVER THE DRIVER IS CALLED.U9; 2. SAVE KINAR5 IN THE TT-DRIVER FORK BLOCK (FORK BLOCKSR!; IF MULTI-PROCESSOR SYSTEM).N6; 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 DRIVERR:; VIRTUAL ADDRESS INTO A PHYSICAL ADDRESS (IF DH-11 BUT$; NOT EXTENDED MEMORY SUPPORTED).4; 5. INITIALIZE AND QUEUE THE TT-DRIVER CLOCK BLOCK.6; 6. SAVE A POINTER TO THE FIRST TT DCB IN THE SYSTEM.E; 7. CONSTRUCT THE LIST OF FREE BUFFERS IN THE TT-DRIVER BUFFER POOL. ; ?; IN A SYSTEM THAT SUPPORTS SEPARATE KERNEL DATA SPACE MAPPING,E2; THIS MODULE RESIDES IN THE COMMON BLOCK "TTCOM".9; WHEN "INIT" IS CALLED IN SUCH A SYSTEM, THE MAPPING IS:A!; INSTR. SPACE APR 5: DRIVER CODES<; INSTR. SPACE APR 6: DRIVER DATA AND INITIALIZATION ROUTINE; (FIRST 4 KW OF TTCOM); DATA SPACE APR 5: DRIVER CODEI; DATA SPACE APR 6: UNDEFINEDLD; ON RETURN FROM "INIT", THE MAPPING IS THE "NORMAL" DRIVER MAPPING, ; WHICH IS:T); INSTR. SPACE APR 5: DRIVER CODE (TTDRV)F); DATA SPACE APR 5-6: DRIVER DATA (TTCOM) ;AG; IN A SYSTEM THAT DOES NOT SUPPORT SEPARATE KERNEL DATA SPACE MAPPING,CG; THIS MODULE RESIDES TOGETHER WITH ALL OTHER CODE AND DATA IN "TTDRV". A; THE COMMON BLOCK "TTCOM" DOES NOT EXIST. IN SUCH A SYSTEM, WHEN #; "INIT" IS CALLED, THE MAPPING IS:S*; INSTR. AND DATA SPACE APR 5: DRIVER CODEB; ON RETURN, THE MAPPING IS THE "NORMAL" DRIVER MAPPING, WHICH IS:4; INSTR. SPACE APR 5-6: DRIVER CODE AND DATA (TTDRV); H; FROM THE DESCRIPTION ABOVE, IT FOLLOWS THAT THE INITIALIZATION ROUTINEF; MAY BE MAPPED EITHER IN APR 5 (NON-D-SPACE SYSTEM) OR APR 6 (D-SPACEK; SYSTEM) WHEN CALLED. IT MUST THEREFORE BE WRITTEN IN POSITION-INDEPENDENT ; CODE (PIC). ;-;M;B0TTPOOL::.BLKW 1 ;START OF DRIVER'S PRIVATE POOL; @; NOTE - THE ROUTINE BELOW MUST FIT INTO ONE FIXED LENGTH BUFFER7; (LENGTH = T$$BFL BYTES), OR IT WILL OVERWRITE ITSELF.ID; NOTE ALSO THAT THE ROUTINE MUST MAP ITSELF IN BOTH I- AND D-SPACE.;R; INPUT:; R0 START OF DRIVER POOL 2; R1 POINTER T$$BFL BYTES BELOW END OF DRIVER POOL;P1CPOOL: MOV R0,R2 ;COPY POINTER TO CURRENT BUFFERD% ADD #T$$BFL,R0 ;POINT TO NEXT BUFFERT MOV R0,@R2 ;LINK NEW TO OLD-+ CMP R0,#160000-T$$BFL ;WITHIN 4K BOUNDARY?T BHIS 10$ ;N - STOP HEREI CMP R0,R1 ;END OF POOL?O BLO CPOOL ;N - LOOPM/10$: CLR @R2 ;Y - CLEAR POINTER IN LAST BUFFER  RETURN ;ALL DONEW" .IIF GT .-, .ERROR;T;EINIT:: .IF DF R$$PRO, MOV #60,R0 ;MOVE THE DL INTERRUPT VECTORS* MOV #220,R1 ;TO THE PRINTER PORT VECTOR1 MOV (R0)+,(R1)+ ;LOCATIONS. THIS IS BEING DONEP8 MOV (R0)+,(R1)+ ;BECAUSE THE PRINTER PORT IS NOW USED./ MOV (R0)+,(R1)+ ;THE DL VECTOR IS USED ON THER MOV (R0),(R1) ;BRIDGE SYSTEM.A .ENDC ;R$$PRO* MOV @#KINAR5,R0 ;GET START OF DRIVER CODE .IF DF M$$PRO$ MOV #M$$PRO,R2 ;GET NUMBER OF CPU'S0 MOV #$TTFB+10,R1 ;GET POINTER TO KINAR6 WORD IN ;FORK BLOCK FOR CPU 0E+20$: MOV R0,@R1 ;SAVE KINAR5 IN FORK BLOCKM( ADD #TT$UQL,R1 ;POINT TO NEXT UCB QUEUE SOB R2,20$ ;LOOP .IFF ;M$$PRO(- MOV R0,@#$TTFB+10 ;SAVE KINAR5 IN FORK BLOCKV .ENDC ;M$$PRO .IF DF T$$COM + MOV @#$TTCOM,-(SP) ;SAVE TTCOM PCB ADDRESSR2 CLR @#$TTCOM ;INDICATE DRIVER INITIALIZATION DONE . .IF DF D$$M11 V' MOV @#YMCTBP,R1 ;GET POINTER TO $YMCTB F .IFTF ;D$$M11 #* MOV @#KINAR6,R0 ;GET START OF DRIVER DATA .IF DF T$$SPL4 MOV R0,@#KDSAR6 ;MAP TTCOM THROUGH DATA SPACE APR 6 MOV R0,@#$DALED ;SAVE MAPPING .IFF ;T$$SPLL MOV R0,@#PAR5S ;SAVE A COPY! MOV R0,@#KDSAR5 ;MAP DRIVER DATA .ENDC ;T$$SPL/ MOV @#KINAR5,@#PAR6I ;GET START OF DRIVER CODE3 ADD #200,@#PAR6I ;COMPUTE AND SAVE HIGH 4K MAPPINGC D .IFT ;D$$M11$ O' MOV R1,@#YMCP1 ;SAVE POINTER TO $YMCTB. . .ENDC ;D$$M11 M .ENDC ;T$$COM + MOV R0,R1 ;COPY REAL START OF DRIVER DATAM .IF NDF T$$SPL . ADD #200,R0 ;ADD THE EQUIVALENT OF 4 K WORDS$ MOV R0,@#KISAR6 ;MAP REST OF DRIVER$ MOV R0,@#$DALED ;SAVE DRIVER KISA00ibonibjbkb a a aR6 .IF DF D$$M11&R$$MPL&T$$ONI3 MOV YMCTBP,YMC12 ;MOVE A COPY TO APR6 FOR OVERLAY .ENDC ;D$$M11&R$$MPL&T$$ONI .ENDC ;NDF T$$SPL .IF DF T$$OVL4 MOV KINAR5,ROTMAP ;SET UP POINTER TO MAIN APR5 CODE' MOV #TTEXT,R3 ;POINT TO RAD50 OF TTEXTN' CALL $SRNAM ;GET ADDRESS OF PARTITION. BCC 25$ ;CC - GOT IT CRASH ;NO GOOD IF NOT LOADEDD425$: MOV P.REL(R2),EXTMAP ;SET UP POINTER TO OVERLAY .IF NDF T$$SPLS MOV KISAR5,-(SP) ;SAVE MAPPINGV' MOV P.REL(R2),KISAR5 ;MAP TO EXTENSION/ MOV KISAR6,@#120000 ;SAVE MAPPING TO APR6 CODE1" MOV (SP)+,KISAR5 ;RESTORE MAPPING .ENDC ;NDF T$$SPL .ENDC ;T$$OVL .IF DF D$$H11!D$$V11F;$9; CALCULATE MAPPING INFORMATION NECESSARY FOR DMA DEVICESE;M .IF DF D$$V11;RN; CALCULATE AND SAVE THE DOUBLE-WORD RELOCATION CONSTANT TO TRANSFORM A DRIVERH; VIRTUAL ADDRESS INTO AN 18-BIT/22-BIT ADDRESS FOR THE DHV11. A SECONDL; RELOCATION CONSTANT IS NECESSARY FOR I/D-SPACE SYSTEMS SINCE BUFFERS WHICHM; ARE IN PRIMARY POOL DON'T HAVE A VIRTUAL ADDRESS WHICH MATCHES THE PHYSICALC; ADDRESS IN THOSE SYSTEMS.O;M .IF DF M$$EXT!D$$H11S1 MOV R1,-(SP) ;SAVE START APR BIAS OF DRIVER DATA .IFTF ;M$$EXT!D$$H11M .IF DF R$$EIS$ CLR R0 ;PREPARE FOR COMBINED SHIFT% ASHC #6,R0 ;GET PHYS. START ADDRESSD .IFF ;R$$EISA. SWAB R1 ;USE NON-EIS EMULATION OF ASHC #6,R0 MOVB R1,R0 ; BIC #377,R1 ;H ROR R0 ; ROR R1 ; ROR R0 ; ROR R1 ; .ENDC ;R$$EIS .IF DF K$$DAS4 SUB #140000,R1 ;SUBTRACT TTCOM BASE VIRTUAL ADDRESS .IFF ;K$$DASS5 SUB #120000,R1 ;SUBTRACT DRIVER BASE VIRTUAL ADDRESSD .IFTF ;K$$DAS SBC R0 ;TAKE CARE OF CARRY6 BIC #^C<77>,R0 ;MAKE SURE ONLY 6 BITS MAXIMUM ARE SET# MOV R0,@#RELCV ;SAVE HIGH 2/6 BITSB: MOV R1,@#RELCV+2 ;SAVE LOW 16 BITS OF RELOCATION CONSTANT .IFT ;K$$DAS @ MOV @#KDSAR1,R1 ;GET START APR BIAS OF POOL IN I/D-SPACE SYSTEM$ CLR R0 ;PREPARE FOR COMBINED SHIFT< ASHC #6,R0 ;GET PHYS. START ADDRESS (I/D SYS REQUIRES EIS)2 SUB #20000,R1 ;SUBTRACT POOL BASE VIRTUAL ADDRESS SBC R0 ;TAKE CARE OF CARRY6 BIC #^C<77>,R0 ;MAKE SURE ONLY 6 BITS MAXIMUM ARE SET! MOV R0,@#RELCV+4 ;SAVE HIGH BITS MOV R1,@#RELCV+6 ;SAVE LOW BITS .ENDC ;K$$DAS .IFT ;M$$EXT!D$$H114 MOV (SP)+,R1 ;RESTORE START APR BIAS OF DRIVER DATA .ENDC ;M$$EXT!D$$H11. .ENDC ;D$$V11 .IF DF M$$EXT;RH; CALCULATE AND SAVE THE UMR VALUE(S) TO MAP ALL OF THE DRIVER DATA AREA; .IF DF R$$EIS& CLR R0 ;PREPARE FOR ASHC INSTRUCTION% ASHC #6,R0 ;GET PHYS. START ADDRESSR .IFF ;R$$EISC. SWAB R1 ;USE NON-EIS EMULATION OF ASHC #6,R0 MOVB R1,R0 ; BIC #377,R1 ;M 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 SETTINGA MOV R0,(R2)+ ;  .IF NDF T$$SPLE! ADD #20000,R1 ;ADVANCE 8 K BYTESD ADC R0 ;! MOV R1,(R2)+ ;SAVE UMR 6 SETTINGL MOV R0,(R2)+ ;O .ENDC ;NDF T$$SPL .IFF ;M$$EXT$ .IF DF D$$H11;RL; COMPUTE AND SAVE THE DOUBLE-WORD RELOCATION CONSTANT TO TRANSFORM A DRIVER); VIRTUAL ADDRESS INTO AN 18-BIT ADDRESS.S.; (SEE DETAILED DESCRIPTION AT LABEL "RELC:").; # SWAB R1 ;SHIFT KISAR5 6 BITS LEFT;1 MOVB R1,R0 ;GET ORIGINAL BITS 10-11 IN BITS 2-3D$ RORB R1 ;ORIGINAL BIT 8 INTO CARRY- ROR R1 ;BIT 8 INTO BIT 15, BIT 9 INTO CARRYA0 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 ;5 SUB #120000,R1 ;SUBTRACT DRIVER BASE VIRTUAL ADDRESS- BCC 30$ ;NO CARRY - JUMP* SUB #20,R0 ;SUBTRACT CARRY FROM R0 BIT 4+30$: BIC #^C<60>,R0 ;CLEAR ALL BUT BITS 4-5O( MOV R0,@#RELC ;SAVE RELOCATION CONSTANT MOV R1,@#RELC+2 .ENDC ;D$$H11 .ENDC ;M$$EXT 1 .ENDC ;D$$H11!D$$V111,; SETTUP THE CT VIDEO TASK TIMER CLOCK BLOCK .IF DF B$$MAP1 MOV #CTICK,@#$CTCB+C.SUB ;INITIALIZE CLOCK BLOCKL CALL CTQUEK ;QUEUE IT  .ENDC ;B$$MAP1 MOV #TTICK,@#$TTCB+C.SUB ;INITIALIZE CLOCK BLOCKB CALL @#CLINS ;QUEUE IT& MOV #$DEVHD,R0 ;GET START OF DCB LIST00ijojlof__DATADATADATADATA40$: MOV @R0,R0 ;GET NEXT DCB4 CMP D.NAM(R0),#"TT ;DOES IT HAVE GENERIC NAME "TT"? BNE 40$ ;N - LOOPV MOV D.UCB(R0),R1 ;GET FIRST UCB) BIT #DV.TTY,U.CW1(R1) ;IS IT A TERMINAL?. BEQ 40$ ;N - LOOPN2 MOV R0,@#DCB0 ;SAVE POINTER TO FIRST TERMINAL DCB R .IF DF T$$COM F MOV (SP)+,R1 ;GET TTCOM PCB + .IFF ;T$$COMZ L MOV D.PCB(R0),R1 ;GET TTDRV PCB  .ENDC ;T$$COM 9 MOV P.SIZE(R1),R1 ;GET PARTITION SIZE IN 32. WORD BLOCKS# .IF DF R$$EIS ASH #6,R1 ;CONVERT TO BYTES .IFF ;R$$EIS0 SWAB R1 ;CONVERT TO BYTESR RORB R1 ROR R1V ROR R1  .ENDC ;R$$EIS .IF DF T$$SPLB ADD #140000-T$$BFL,R1 ;GET POINTER T$$BFL BYTES BELOW END OF POOL .IFF ;T$$SPLN= ADD #120000-T$$BFL,R1 ;GET POINTER T$$BFL BYTES BELOW END OF ;DRIVER POOL .ENDC ;T$$SPL;C" MOV #TTPOOL,R0 ;GET START OF POOL+ MOV R0,@#FREEB ;POINT TO FIRST FREE BUFFERC BR CPOOL ;INITIALIZE POOLE;A;T .ENDE IN 32. WORD BLOCKS# .IF DF R$$EIS ASH #6,R1 ;CONVERT TO BYTES . .TITLE TTYZ .IDENT /06.01/E;T1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.$; 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.;S;L; 27-JAN-78 PETER WANNHEDEN;.; PREVIOUSLY MODIFIED BY:T;L; P. WANNHEDEN ; C. F. SPITZ,; D. R. DONCHIN ; S. C. ADAMSE ; T. LEKAS;;; MODIFICATION HISTORY:;N; L. KOGAN 18-JUN-86 6.01.2; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT;.;L .PSECT MAP5;.;+*; CONTROLLER-DEPENDENT ROUTINES FOR DZ-11.;-;S;$  .IF DF D$$Z11 ; EQUATED SYMBOLSF;R; DZ-11 REGISTER DEFINITIONS;D!CSR = 0 ;CONTROL AND STATUS REG.C+RBUF = 2 ;RECEIVER BUFFER REG. (READ-ONLY)*LPR = 2 ;LINE PARAMETER REG. (WRITE-ONLY)TCR = 4 ;TRANSMIT CONTROL REG.N'MSR = 6 ;MODEM STATUS REG. (READ-ONLY)/TBUF = 6 ;TRANSMITTER BUFFER REG. (WRITE-ONLY)S;Y; .ENABL LSB- - .IF DF T$$GMC!T$$SMC!D$$ZMD I;+#; YZLPAR - GET/SET LINE PARAMETERS.S; ; INPUT:; R0 BIT 15: 0 = SET SPEED; 1 = GET SPEED); BIT 13: 1 = SET 7-BIT CHARACTER LENGTHE4; BIT 12: 1 = CHECK IF 7-BIT CHARACTER IS SUPPORTED;; BIT 11: 1 = SET SPEED SELECTED BY AUTO-BAUD DETECT LOGICG); BIT 10: 1 = SET DEVICE DEPENDENT SPEEDG!; (USED FOR SETTING PARITY)C"; BIT 9: 1 = GET/SET ANSWER SPEED; IF SET SPEED:/; BITS 0-7: NEW SPEED PARAMETER (S.XXX SYMBOL)S;Y&; R1 Flow control status change flags.;T(; BIT 0: 1 = Enable input flow control.); BIT 1: 1 = Disable input flow control.:); BIT 2: 1 = Enable output flow control.1*; BIT 3: 1 = Disable output flow control.;1; BITS 4-15: Reserved; <; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;C ; OUTPUT: ; IF GET SPEED REQUESTED:E ; R4 POINTER TO DZ11 SPEED TABLE; CC-C 0;C; IF SET SPEED REQUESTED:W; CC-C 0 IF OK; 1 IF ILLEGAL SPEED SPECIFIEDD;RJ; NOTE THAT THIS ROUTINE CAN BE EXECUTED AT BOTH SYSTEM STATE (IN RESPONSEN; TO A SF.GMC OR SF.SMC QIO) AND FROM THE INPUT INTERRUPT SERVICE ROUTINE (FOR; AUTO-BAUD SPEED DETECT).;l;-;r;1YZLPAR:: .IF DF D$$ZMD!T$$GMC!T$$SMC) TST R1 ;Called for flow control change?R BEQ 5$ ;If EQ no - go on.E RETURN ;Not processed for DZ.5$: 0 BIT #20000,R0 ;CHECK IF WE VALIDATE 7-BIT CHAR. BEQ 7$ ;NO RETURN 7$:T BIT #10000,R0 ;CHECK SET 7-BITK BEQ 8$ ;NO. SET SPEED-PARITY0 BR SETLN1 ;SET 7-BIT AND OTHER LINE PARAMETERS8$:H. BIT #4000,R0 ;SET SPEED FOR AUTO-BAUD DETECT? BEQ 10$ ;N - JUMPU* BIT #2000,R0 ;SET DEVICE DEPENDENT SPEED? BEQ 20$ ;N - JUMP- BIC #^C<17>,R0 ;CLEAR ALL BUT NEW SPEED BITS$ BR 40$ ;SET NEW SPEEDf10$: ;REFERENCE LABEL .ENDC ;D$$ZMD!T$$GMC!T$$SMC  .IF DF T$$GMC&T$$SMC. $ TST R0 ;GET OR SET SPEED?F BPL 20$ ;SET - JUMP. B .ENDC ;T$$GMC&T$$SMC$  .IF DF T$$GMC C( MOV #SPDZ,R4 ;POINT TO DZ11 SPEED TABLE RETURN ;RETURN WITH CC-C = 0H L .ENDC ;T$$GMC H .IF DF T$$SMC!D$$ZMDT E&20$: MOV R0,R4 ;COPY SPEED PARA00jronibjbkb a a aMETERS! BIC #177400,R0 ;CLEAR UPPER BYTEE# MOVB SPDZ-1(R0),R0 ;GET SPEED BITS SEC ;ASSUME ERROR BMI 30$ ;ILLEGAL SPEED - JUMP BIT #1000,R4 ;SET ANSWER SPEED? BEQ 40$ ;N - JUMP$ .IF DF D$$ZMD4 BICB #17,U.CW3+1-U.TSTA(R5) ;CLEAR OLD ANSWER SPEED1 BISB R0,U.CW3+1-U.TSTA(R5) ;SET NEW ANSWER SPEEDC CLC ;SHOW SUCCESS .ENDC ;D$$ZMD 30$: RETURNT440$: MOVB R0,U.CW3-U.TSTA(R5) ;SET NEW RECEIVE SPEED .IF DF R$$EIS2 ASH #4,R0 ;SHIFT BITS TO TRANSMIT SPEED POSITION .IFF ;R$$EISS/ ASL R0 ;SHIFT BITS TO TRANSMIT SPEED POSITIONR ASL R0 ; ASL R0 ; ASL R0 ; .ENDC ;R$$EIS1 BISB R0,U.CW3-U.TSTA(R5) ;SET NEW TRANSMIT SPEEDP ? .ENDC ;T$$SMC!D$$ZMD . .ENDC ;T$$GMC!T$$SMC!D$$ZMD ->SETLN1: MOV U.CW3-U.TSTA(R5),R2 ;GET NEW SPEED AND PARITY BITS5SETLIN: BIC #^C<140017>,R2 ;CLEAR EXTRANEOUS NONSENSE;) CMPB R2,#2 ;IS SPEED 110 BAUD OR LOWER?U BGT 50$ ;N - JUMPC% BIS #20000,R2 ;Y - SET TWO STOP BITS,*50$: SWAB R2 ;PUT BITS IN PROPER POSITION9 BIS #10030,R2 ;SET 8 BIT CHARACTERS AND TURN RECEIVER ONP+ BISB U.UNIT-U.TSTA(R5),R2 ;SET LINE NUMBER8 BIT #S5.CLN,U.TST5-U.TSTA(R5) ;;;CHECK 7-BIT CHARACTERS BEQ 75$ ;;;NO LEAVE IT 8-BIT BIC #10,R2 ;;;SET 7-BITC/75$: MOV R2,LPR(R3) ;;;LOAD NEW LINE PARAMETERSR CLC ;SHOW SUCCESS RETURN;L; ;+; YZPWUP - POWER UP.;R; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.STS SET UP FOR LOCAL LINE: ; US.CRW 0B ; US.DSB 0A;-;P;B .IF DF R$$CONYZCONL::YZCPUP:: .IFF #YZPWUP::TST R2 ;IS THIS LINE ZERO?  BNE 70$ ;N - JUMP; .IFTF0 MOV #20,@R3 ;Y - CLEAR SILO, UARTS, CONTROLLER60$: BIT #20,@R3 ;DONE? BNE 60$ ;N - LOOPB& BIS #40140,@R3 ;Y - ENABLE INTERRUPTS .IFTL RETURNEYZUONL::YZUPUP:: .ENDC ;R$$CON70$: ;REFERENCE LABEL .IF DF D$$ZMD4 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 REGISTERZ .IFT ;D$$ZMD MOV (SP)+,R2 ;RESTORE R2N+ BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE?M BEQ 150$ ;N - RETURN< BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIER FLAG;L;B;+; YZMTIM - MODEM TIMER. ;E; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;-;R;R;E .IFTF ;D$$ZMDYZMTIM:: # .IFT ;D$$ZMD. A6 MOV $BTMSK(R2),R2 ;GET BIT CORRESPONDING TO THIS LINE! CALL LOCKI ;LOCK OUT INTERRUPTSI2 CALL HLMTIM ;;;CALL COMMON MODEM TIMEOUT ROUTINE' BEQ 80$ ;;;IF EQ Z-BIT SET - DROP DTRR BISB R2,TCR+1(R3) ;;;SET DTRU RETURN ;;;T&80$: BICB R2,TCR+1(R3) ;;;DEASSERT DTR RETURN.;-;S;+; YZPOLL - POLL MODEM STATUS.G;L; INPUT:; R5 POINTER TO U.TSTA;-; ;U(YZPOLL::MOV U.SCB-U.TSTA(R5),R3 ;GET SCB .IF DF R$$MPL MOV @S.KRB(R3),R3 ;GET CSR; .IFF ;R$$MPL: MOV S.CSR(R3),R3 ;GET CSR .ENDC ;R$$MPL4 MOVB U.UNIT-U.TSTA(R5),R2 ;GET PHYSICAL UNIT NUMBER ASL R2 ;MULTIPLY BY 2M6 MOV $BTMSK(R2),R2 ;GET BIT CORRESPONDING TO THIS LINE CLR R4 ;START OFF FRESHB 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?E BEQ 100$ ;N - JUMP& BIS #140,R4 ;Y - SET APPROPRIATE BIT7100$: MOV R2,-(SP) ;SAVE R2 DESTROYED BY MODISR ROUTINEL3 CALL MODISR ;DO COMMON MODEM INTERRUPT PROCESSING+ BVC 120$ ;NO SPECIAL ACTION NEEDED - JUMP BCS 110$ ;DROP DTR - JUMP;! BISB (SP)+,TCR+1(R3) ;ASSERT DTR; RETURNB(110$: BICB (SP)+,TCR+1(R3) ;DEASSERT DTR RETURNT4120$: MOV (SP)+,R2 ;POP STACK WITHOUT AFFECTING CC-C% BCS 150$ ;NO CALL ANSWERED - RETURN# ASSUME S4.ABD,100000R. TST 6(R5) ;;;AUTO-BAUD SPEED DETECT ENABLED?$ BPL 130$ ;;;IF NOT, DON'T SET BAUD( MOVB #14,R2 ;Y - SET LINE TO 4800 BAUD BR SETLIN ;O9130$: MOVB U.CW3+1-U.TSTA(R5),R0 ;GET REMOTE ANSWER SPEEDR2 BICB #^C<17>,R0 ;CLEAR ALL BUT ANSWER SPEED FIELD BR 40$ ;SET THAT SPEED D .ENDC ;D$$ZMD S 150$: RETURN S .DSABL LSBT B .IF DF R$$CONYZCOFF::, MOV #20,@R300jzok~of__DATADATADATADATA ;CLEAR SILO, UARTS, CONTROLLER10$: BIT #20,@R3 ;DONE? BNE 10$ ;N - LOOPC RETURNRYZUOFF::! CLR -(SP) ;GET A TEMPORARY WORDR> BISB U.UNIT-U.TSTA(R5),(SP) ;SET LINE NUMBER BUT RECEIVER OFF, MOV (SP)+,LPR(R3) ;LOAD NEW LINE PARAMETERS .IF DF D$$ZMD6 MOV $BTMSK(R2),R2 ;GET BIT CORRESPONDING TO THIS LINE BICB R2,TCR+1(R3) ;DROP DTR .ENDC ;D$$ZMD RETURND .ENDC ;R$$CON;E;;+"; INPUT INTERRUPT SERVICE ROUTINE.;-;B;S .ENABL LSBF;  C .IF DF R$$MPL V-$YZINP::TTSET$ YZ ;;;SAVE R2, R3 AND SET UP:B ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS O .IFF ;R$$MPL) G+$DZINP::TTSET$ DZ ;;;SAVE R2,R3 AND SET UP, ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST R .ENDC ;R$$MPL A, CALL MUXINP ;;;DO COMMON MULTIPLEXER INPUT ;;;CHARACTER PROCESSINGT3 ;;;MUXINP DISMISSES INTERRUPT IF NO OUTPUT WORKZ* BR 10$ ;;;XMIT READY - GO DO OUTPUT WORK;;N;+#; OUTPUT INTERRUPT SERVICE ROUTINE.S;-;B;S  .IF DF R$$MPL M-$YZOUT::TTSET$ YZ ;;;SAVE R2, R3 AND SET UP:E ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS E .IFF ;R$$MPLR P+$DZOUT::TTSET$ DZ ;;;SAVE R2,R3 AND SET UPS ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST I .ENDC ;R$$MPL M10$: MOV R3,-(SP) ;;;;% INC @SP ;;;POINT TO BYTE CONTAININGA/ ;;;INTERRUPTING LINE NUMBER (CSR HIGH BYTE)R. CALL JZOUT ;;;DO OUTPUT INTERRUPT PROCESSING# ;;;(COMMON FOR DJ-11 AND DZ-11)P TST (SP)+ ;;;CLEAN STACK;;;+; YZABOX - ABORT OUTPUT.;Y; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.TOC 0 ; U.TTOC 0;; YZSTOX - STOP OUTPUT.T;T; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S1.CTS 1T;-;.;CYZABOX::YZSTOX::RETURN ;;;RETURN;C .DSABL LSBT  .ENDC ;D$$Z11 ;;;T .ENDNG LINE NUMBER (CSR HIGH BYTE)R. CALL JZOUT ;;;DO OUTPUT INTERRUPT PROCESSING# ;;;(COMMON FOR DJ-11 AND DZ-11)P TST (SP)+ ;;;CLEAN STACK;;;+; YZABOX - ABORT OUTPUT.;Y; INPUT:0 .TITLE LPDRV - RSX-11M-PLUS LINE PRINTER DRIVER' .SBTTL LPDRV - DESCRIPTION AND HISTORY .IDENT /13.03/ ;P1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.C; All rights reservedT;.; <; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;E;C; B. S. MCCARTHY 13-AUG-81;;O6; BASED ON THE ORIGINAL NOVEL BY D. N. CUTLER, AND THE4; ORIGINAL KMC LP DRIVER FOR RSX11M, BY YOURS TRULY.;B;-+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ;-; J. W. BERZLE;E+; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:T; !; B. S. MCCARTHY 26-FEB-86 13.02 ; *; BM380 -- CONVERT TO USE EXEC VECTORING;s!; B. S. MCCARTHY 26-FEB-86 13.03 ;F); BM388 -- FIX REGISTER USAGE IN VECTOR ; TRANSLATE ROUTINED;E;T1; LP11/LS11/LA180 LINE PRINTER CONTROLLER DRIVERR; WITH KMC-11 DMA SUPPORT ;T .PAGE+ .SBTTL . - MACRO LIBRARY CALLS/DEFINITIONSL;L; MACRO LIBRARY CALLS;R& .MCALL ABODF$, HWDDF$, PKTDF$, UCBDF$ .MCALL SCBDF$# ABODF$ ; DEFINE TASK ABORT CODESD% HWDDF$ ; DEFINE HARDWARE REGISTERS% PKTDF$ ; DEFINE I/O PACKET OFFSETS UCBDF$ ; DEFINE UCB OFFSETS. SCBDF$ ,,SYSDEF ; DEFINE VARIABLE SCB OFFSETS;F; EQUATED SYMBOLS;S=; SOME OF THESE DEFINITIONS ARE INCLUDED FOR INFORMATION ONLY1&; AND ARE NOT REFERENCED IN THE DRIVER;H2; LINE PRINTER STATUS WORD BIT DEFINITIONS (U.CW2);R(LS11 = 100000 ; LS11 PRINTER (1=YES)7CRJT = 40000 ; CARRIAGE RETURN JUST OUTPUT (1=YES)..FORM = 20000 ; FORM FEED REQUIRED (1=YES)4CRTY = 10000 ; CARRIAGE RETURN REQUIRED (1=YES)1ABRT = 4000 ; ABORT REQUEST IF HUNG (1=YES)U5LFCT = 3000 ; UNPROCESSED LINE FEED COUNT FIELDE5LFBT = 1000 ; UNPROCESSED LINE FEED ADD/SUB BITI>BHLD = 400 ; BYTE HELD BACK FOR CARRIAGE RETURN (1=YES)+OFFL = 200 ; PRINTER OFFLINE (1=YES)U&LOWER = 100 ; LOWER CASE (1=YES)3PWRFLG = 40 ; POWER FAIL RECOVERY IN PROGRESS09RQINPR = 20 ; REQUEST IN PROGRES00konibjbkb a a aS WHEN POWER FAILED 3KNOWN = 10 ; PRINTER KNOWN TO KMC-11 (1=YES)A1BLCT = 7 ; UNPROCESSED BLANK COUNT FIELD 1BLBT = 1 ; UNPROCESSED BLANK ADD/SUB BIT ;C<; LINE PRINTER HORIZONAL POSITION AND HELD BACK BYTE (U.CW3);E!HORPS = 0 ; HORIZONAL POSITION HELDB = 1 ; BYTE HELD BACKE;=2; DEFINE TIMEOUT WITH NO ERROR BIT IN S.STS FOR LP;E%TMONO=200 ; 1=TIMEOUT WITH NO ERRORG; ; K.PRM STATUS BITSC;R+KMCLOA = 1 ; KMC-11 MICROCODE LOADEDP%KPKMC = 2 ; THIS IS A KMC KRB  .PAGE+ .SBTTL . - KMC11 SPECIFIC DATA DEFINITIONS $; KMC-11/COMM-IOP-LP BIT DEFINITIONS; KMC CSR WORD 0 (SEL0)S+RUN = 100000 ; RUN BIT (1=KMC RUNNING)R8MC = 40000 ; MASTER CLEAR (SET TO 1 TO CLEAR KMC)<RQI = 200 ; REQUEST INPUT (SET TO REQUEST KMC INPUT_;IEO = 20 ; OUTPUT INTERRUPT ENABLE (SET TO ENABLE):IEI = 1 ; INPUT INTERRUPT ENABLE (SET TO ENABLE); KMC CSR WORD 1 (SEL2) 'PRTNUM = 3400 ; PRINTER NUMBER MASK *RDYO = 200 ; READY OUTPUT (1=READY))RDYI = 20 ; READY INPUT (1=READY) $FNCBSI = 3 ; BASE IN FUNCTION'FNCCTI = 1 ; CONTROL IN FUNCTION0.FNCBAI = 0 ; BUFFER ADDRESS IN FUNCTION; KMC CSR WORD 2 (SEL4)T6POLCNT = 177400 ; POLLING COUNT FOR BASE IN FUNCTION; KMC CSR WORD 3 (SEL6) 9KOPKOE = 200 ; KILL ON ERROR OPTION (FOR CONTROL IN) ,KOPNXT = 40 ; DON'T EXPAND TABS OPTION+KOPVTL = 20 ; CONVERT VT TO LF OPTION30KOPDRN = 10 ; DISCARD RUBOUTS/NULLS OPTION:KOPDNP = 4 ; DISCARD NON-PRINTING CHARACTERS OPTION6KOPLUC = 2 ; CONVERT LOWER TO UPPER CASE OPTION5KOPFPR = 1 ; FAST PRINTER OPTIMIZATIONS OPTIONF8KMCABF = 10 ; KILL (ABORT) FINISHED ON CONTROL OUT<KMCNXM = 6 ; NON-EXISTENT MEMORY (WE CAN'T GET THIS?)1KMCONL = 4 ; PRINTER ERROR CONDITION CLEAR :KMCOFL = 2 ; PRINTER ERROR OCCURED (PAPER JAM,ETC.)9BEXT = 140000 ; BUS EXTENSION BITS FOR BUFF. ADDR. IND#KILASN = 20000 ; KILL ASSIGN BIT KILL = 10000 ; KILL BIT; BUFFER DESCRIPTOR BITS+LASTBF = 100000 ; LAST DESCRIPTOR IN LISTU;S@; DEFINE THE SYMBOL "L$$PRN" EITHER IN THE RSXMC.MAC CONDITIONAL@; ASSEMBLY FILE FOR YOUR SYSTEM OR REMOVE THE SEMICOLON (;) FROM?; THE LINE CONTAINING THE SYMBOL IN THE KMC LINE PRINTER DRIVER ; (LKDRV).;E*;L$$PRN=0 ; SYMBOL TO PASS RUBOUTS/NULLS;R!VC$LP = 0 ; VECTORED LP DRIVER.); ; LOCAL DATA; * .IF DF K$$MLP ; KMC LINE PRINTER SUPPORT+KMCCTB: .WORD 0 ; ADDRESS OF $KMCTB IN CTB0+UNITPF: .WORD 0 ; THIS IS A UNIT POWERFAIL .ENDC ; DF K$$MLP;D>; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER);T4CNTBL: .BLKW L$$P11 ; ADDRESS OF UNIT CONTROL BLOCK; EXECUTIVE VECTOR AREA;@EXEVEC: .WORD 0 ; VECTOR FLAG (<>0 -> VECTOR ALREADY TRANSLATED)KISA6:: .WORD KISAR6DVMSG:: .WORD $DVMSGFORK:: .WORD $FORKGTPKT:: .WORD $GTPKT .IF NDF LD$LPINTSV:: .WORD $INTSV .ENDC ; NDF LD$LPIODON:: .WORD $IODONMPUBM:: .WORD $MPUBMSCERR:: .WORD $SCERRSTMAP:: .WORD $STMAPULDRQ:: .WORD $ULDRQEXEVCL=<<<.-EXEVEC>/2>-1>;O6; DRIVER DISPATCH TABLE - DDT$ CAN'T GENERATE THIS ONE;+$LPTBL:: ; START OF DRIVER DISPATCH TABLEL/ .WORD LPINI ; D.VINI - INITIATION ENTRY POINT + .WORD LPCAN ; D.VCAN - CANCEL ENTRY POINTA, .WORD LPOUT ; D.VTIM - TIMEOUT ENTRY POINT1 .WORD LPPWF ; D.VPWF - POWERFAIL RECOVERY ENTRY. N .IF DF K$$MLP0 .WORD LPKRB ; D.VKRB - KRB STATUS CHANGE ENTRY0 .WORD LPUCB ; D.VUCB - UCB STATUS CHANGE ENTRY .IFFA3 .WORD LPPWF ; D.VPWF - NO KRB STATUS CHANGE ENTRYX3 .WORD LPPWF ; D.VPWF - NO UCB STATUS CHANGE ENTRYC .ENDC ; DF K$$MLP( ; D.VINT - START OF INTERRUPT VECTOR ; CONTROL INFORMATION.- .ASCII /LP/ ; FOR "LP" CONTROLLERS.1 .WORD $LPINT ; SINGLE INTERRUPT ENTRY POINT-& .WORD 0 ; VECTOR TABLE TERMINATOR2LPCTB: .WORD $LPCTB ; POINTER TO CTB KRB TABLE .IF DF K$$MLP' .ASCII /KM/ ; FOR "KM" CONTROLLERSL* .WO00ko~of__DATADATADATADATARD $LKINP ; TWO INTERRUPT VECTORS,' .WORD $LKOUT ; ONE UNUSED ($LKINP) & .WORD 0 ; VECTOR TABLE TERMINATOR2KMCTB: .WORD $KMCTB ; POINTER TO CTB KRB TABLE .ENDC ; DF K$$MLP+$LPTBE::.WORD 0 ; END OF DISPATCH TABLEO .PAGE1 .SBTTL LPINI - LINE PRINTER CONTROLLER INITIATOR;+6; **-LPINI-LP11/LS11 LINE PRINTER CONTROLLER INITIATOR; 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 ISBI; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER-O>; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.; ; INPUTS:1;S:; 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 LSB  A LPINI: GTPKT$ LP,L$$P11,,CNTBL,T;/1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:T; '; R1=ADDRESS OF THE I/O REQUEST PACKET.N-; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.E; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.E:; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;:); LINE PRINTER I/O REQUEST PACKET FORMAT:B; "; 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).'; WD. 05 -- I/O FUNCTION CODE (IO.WLB).T0; 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).E3; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. 3; WD. 12 -- RELOCATION BIAS OF I/O BUFFER. (I.PRM) +; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER.K-; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED.E"; WD. 15 -- CARRIAGE CONTROL BYTE.; WD. 16 -- NOT USED. ; WD. 17 -- NOT USED.H; WD. 20 -- NOT USED.-;/ .IF DF K$$MLP0 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 KMC1> BIT #KMCLOA,K.PRM(R0) ; IS THE MICROCODE LOADED FOR THE KMC ?( BNE LKINI ; IF NE, MICROCODE IS LOADED .ENDC ; DF K$$MLP95$: MOV R5,R3 ; CALCULATE ADDRESS OF PRINTER STATUS WORDE ADD #U.CW2,R3 ;< BIC #FORM!CRTY!ABRT!LFCT!BHLD!BLCT,(R3) ; CLEAR STATUS BITS1 MOVB I.PRM+6(R1),R0 ; GET CARRIAGE CONTROL BYTE/( BEQ LPIN1 ; IF EQ, NO CARRIAGE CONTROL/ CMPB #'$,R0 ; CARRIAGE RETURN AT END OF LINE?T BEQ 10$ ; IF EQ, NO 8 BIS #CRTY,(R3) ; SET FOR CARRIAGE RETURN AT AND OF LINE310$: CMPB #'+,R0 ; LINE FEED AT BEGINNING OF LINE?R BEQ LPIN1 ; IF EQ, NO?/ CMPB #'1,R0 ; FORM FEED AT BEGINNING OF LINE?N BNE 20$ ; IF NE, NOO< 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?V BNE LPIN1 ; IF NE, NOA& ADD #LFBT,(R3) ; ADD IN ONE LINE FEED-LPIN1: CALL LPRNT ; FILL LINE PRINTER BUFFERE' BCS 35$ ; IF CS, REQUEST NOT FINISHEDE- MOV S.PKT(R4),R1 ; GET ADDRESS OF I/O PACKETR3 MOV I.PRM+4(R1),R1 ; GET NUMBER OF BYTES PROCESSEDG+ MOV #IS.SUC&377,R0 ; SET SUCCESSFUL STATUSC$ CALL @IODON ; FINISH I/O OPERATION BR LPINI ;635$: BITB #TMONO,S.STS(R4) ; TIMEOUT NO ERROR BIT SET? BEQ 40$ ; IF EQ, NOE: 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(41$: MOV @S.KRB(R4),R4 ; GET CSR ADDRESS* BISB #100,(R4) ; ENABLE PRINTER INTERRUPT RETURN .DSABL LSB) .PAGE8 .SBTTL LKINI - KMC11 PRINTER INITIALIZATION ENTRY POINT;+B; **-LKINI-LP11/LS11 WITH KMC-11 LINE PRINTER CONTROLLER INITIATOR;- .00konibjbkb a a aIF DF K$$MLP5LKINI: MOV R5,CNTBL(R3) ; SAVE ADDRESS OF REQUEST UCBM, BIC #ABRT,U.CW2(R5) ; CLEAR REQUEST ABORTED;M(; CONVERSION OF ADDRESS FOR A NPR DEVICE; ; ON AN 18-BIT MACHINE, THEN @; U.BUF = HIGH ORDER 2 BITS OF PHYSICAL ADDRESS IN BITS 4 AND 53; U.BUF+2 = LOW ORDER 16 BITS OF PHYSICAL ADDRESS.E; ON AN 11/70, THEN ?; U.BUF = HIGH ORDER 6 BITS OF PHYSICAL ADDRESS IN HIGH BYTE. I5; U.BUF+2 = LOW ORDER 16 BITS OF PHYSICAL ADDRESS. 1 MOV R1,-(SP) ; SAVE R1I MOV R2,-(SP) ; AND R2# MOV U.BUF(R5),R1 ; RELOCATION BIASE* MOV U.BUF+2(R5),R2 ; DISPLACEMENT ADDRESS- ASL R2 ; REMOVE APR6 BIAS FROM DISPLACEMENT ASL R2 ;& CLC ; GET 2 BITS OF RELOCATION BIAS ROR R1 ;/ RORB R2 ; TO FILL 8 LOW ORDER BITS OF ADDRESSS ASR R1 ; RORB R2 ;F' SWAB R2 ; SWAP TO COLLECT 8 MORE BITSS- BISB R1,R2 ; INSERT UPPER 8 BITS OF ADDRESSE% SWAB R2 ; SWAP BACK TO REAL ADDRESST( CLRB R1 ; CLEAR LOW BYTE OF UPPER BITS .IF NDF M$$EXT/ ASH #-4,R1 ; PUT BITS <17:18> OF ADDRESS INTO ; BITS <4:5> .ENDC# MOV R1,U.BUF(R5) ; HIGH ORDER BITSE8 MOV R2,U.BUF+2(R5) ; LOW ORDER 16 BITS OF PHYS. ADDRESS MOV (SP)+,R2 ; RESTORE R2 MOV (SP)+,R1 ; AND R1 .IF DF M$$MGE&M$$EXT CALL @STMAP ; SETUP UNIBUS MAP .ENDC ; M$$MGE&M$$EXT.; TEST TO SEE IF KMC KNOW'S ABOUT THIS PRINTER ; AND ISSUE BASE IN IF NECESSARY-LKIN1: BIT #KNOWN,U.CW2(R5) ; PRINTER KNOWN ?R BNE 10$ ; IF NE, YES! CALL WTKMC ; WAIT FOR KMC READY* MOV @S.KRB(R4),6(R0); FILL IN CSR ADDRESS. MOV #L$$KPC*256.,4(R0) ; SET UP POLLING COUNT$ CLR R4 ; SCRATCH FOR UNIT/FUNCTION% BISB U.UNIT(R5),R4 ; SET UNIT NUMBERD SWAB R4 ; PUT IT IN HIGH BYTE& BIS #FNCBSI,R4 ; SET BASE IN FUNCTION" MOV R4,2(R0) ; AND ISSUE FUNCTION' MOV U.SCB(R5),R4 ; RESTORE SCB ADDRESS) BIS #KNOWN,U.CW2(R5) ; SET PRINTER KNOWNT?; TEST TO SEE IF PRINTER HAS BEEN INITIALIZED FOR CORRECT WIDTH ; (CURRENT SET WIDTH IN U.CW3)810$: CMPB U.CW4(R5),U.CW3(R5) ; BUF SIZE CURRENT WIDTH ?- BEQ 20$ ; IF EQ, YES, CONTROL IN WAS ISSUED6! CALL WTKMC ; WAIT FOR KMC READYR .IF NDF L$$PRNI7 MOV #KOPDRN,R4 ; SET FUNCTION TO DISCARD RUBOUTS/NULLS4 .IFFT- CLR R4 ; SET FUNCTION TO PASS RUBOUTS/NULLSC .ENDC* BIT #LOWER,U.CW2(R5) ; LOWER CASE PRINTER% BNE 11$ ; IF NE, LOWER CASE PRINTER.1 BIS #KOPLUC,R4 ; SET LOWER TO UPPER CASE SUPPORTI11$: ; REF LABELI .IF DF L$$11R% BIT #LS11,U.CW2(R5) ; FAST PRINTER ? BNE 12$ ; IF NE, NO.0 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/FUNCTION4( BISB U.UNIT(R5),R4 ; SET IN UNIT NUMBER SWAB R4 ; PUT IT IN HIGH BYTE) BIS #FNCCTI,R4 ; SET CONTROL IN FUNCTION MOV R4,2(R0) ; ISSUE FUNCTION' MOV U.SCB(R5),R4 ; RESTORE SCB ADDRESSP0 MOVB U.CW4(R5),U.CW3(R5) ; SET PRINTER SIZE SET6; BUILD ADDRESS BUFFER IN I/O PACKET AND ISSUE REQUEST20$: ; REFERENCE LABELT .IF DF M$$MGE & M$$EXTN' MOV R1,-(SP) ; SAVE I/O PACKET ADDRESS $ CALL @MPUBM ; MAP UNIBUS TO MEMORY* MOV (SP)+,R1 ; RESTORE I/O PACKET ADDRESS .ENDC ; M$$MGE & M$$EXT! CALL WTKMC ; WAIT FOR KMC READY < MOV U.BUF+2(R5),I.PRM+10(R1) ; SET LOW PART OF BUFFER ADDR.2 MOV U.CNT(R5),I.PRM+12(R1) ; AND LENGTH OF BUFFER. 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 FUNCTIONE& BISB I.PRM+6(R1),R0 ; SET VFC BITS IN1 MOV R0,I.PRM+14(R1) ; STORE INTO BUFF ADDR DESC.M6; BUFFER DESCRIPTOR BUILT IN WORDS 4,5,6 OF PARAM LIST' MOV @S.KTB+2(R4),R0 ; POINT TO KMC CSRT! CLR 6(R0) ; CLEAR OUT KILL BITSD! MOV R1,R4 ; COPY PACKET ADDRESS . 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 BYTER" MOV R4,2(R0) ; AND START TRANSFER 25$: RETURN ; EXIT FROM DRIVER .ENDC ; DF 00ko~of__DATADATADATADATAK$$MLP .PAGE2 .SBTTL LPPWF - LINE PRINTER POWERFAIL ENRTY POINT;OK; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUSESSK; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDITIONA2; THAT COUND EXIST IN RESTARTING THE I/O OPERATION;(LPPWF: .IF DF K$$MLP% BCC 5$ ; BR IF CONTROLLER POWERFAIL& INC UNITPF ; INDICATE UNIT POWERFAIL35$: BIT #KP.OFL,S.KTB+2(R4) ; VERIFY PORT IS ONLINEN 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?U' BEQ 10$ ; IF EQ, MICROCODE NOT LOADEDM! JMP LKPWF ; DO POWERFAIL FOR LKS-10$: MOV #0,UNITPF ; ZERO UNIT POWERFAIL FLAGE .IFF ; DF K$$MLPE0 CALL LPKRB ; TRANSLATE EXEC ENTRY POINT VECTOR .ENDC ; DF K$$MLP RETURN ;C .PAGE3 .SBTTL LKPWF - KMC11 PRINTER POWERFAIL ENTRY POINT4; D; UNIT POWERFAIL PROCESSING MARKS A DEVICE AS UNKNOWN AND OF UNKNOWNE; WIDTH. FOR CONTROLLER POWERFAIL CALLS, THE MICROCODE IS MARKED AS KF; NOT LOADED. THE MICROCODE LOADER (MCL...) IS REQUESTED. IF MCL... H; IS NOT INSTALLED AN ERROR MESSAGE IS ISSUED. IF THERE IS NO POOL, A 7; RETURN IS EXECUTED AND LPDRV WILL NOT USE THE KMC. ;K .IF DF K$$MLP .ENABL LSBA.LKPWF: TST UNITPF ; IS THIS A UNIT POWERFAIL?* BEQ LKPWF0 ; IF EQ, CONTROLLER POWERFAIL DEC UNITPF ; SET BACK TO ZERO42 BIS #PWRFLG,U.CW2(R5) ; SET POWERFAIL IN PROGRESS$ TST CNTBL(R3) ; REQUEST IN PROGRESS BEQ 10$ ; IF EQ, NOL5 BIS #RQINPR,U.CW2(R5) ; SET REQUEST IN PROGRESS FLAGC/10$: BIC #KNOWN,U.CW2(R5) ; SET PRINTER UNKNOWN+ CLRB U.CW3(R5) ; AND SET THE WIDTH TO ZEROD RETURN ; EXIT FROM DRIVERLKPWF0: ; CTB IS IN R3  MOV R2,R4 ; PUT KRB INTO R4.& MOV #0,R5 ; MICROCODE FILENAME INDEX6 BIC #KMCLOA,K.PRM(R4) ; INDICATE MICROCODE NOT LOADED"13$: CALL @ULDRQ ; REQUEST LOADER BCC 15$ ; BR IF OK, BEQ 20$ ; IF EQ, TASK MCL... NOT INSTALLED BNE 40$ ; IF NE, NO POOL I(15$: MOV #MC,@(R4) ; MASTER CLEAR KMC-11 BR 40$ ; RETURNT<20$: MOV #T.NKLF,R0 ; MESSAGE NUM "MICROCODE LOADER NOT ..."' CALLR @DVMSG ; PRINT MESSAGE AND EXITH 40$: RETURND .ENDC ; DF K$$MLP .DSABL LSBW .PAGE6 .SBTTL $LPINT - LINE PRINTER INTERRUPT HANDLING ENTRY;+7; **-$LPINT-LP11/LS11 LINE PRINTER CONTROLLER INTERUPTST;-$LPINT:: ;;; REF LABEL> INTSV$ LP,PR4,L$$P11,,CNTBL ;;; GENERATE INTERRUPT SAVE CODE 9 MOV U.SCB(R5),R4 ;;; GET ADDRESS OF STATUS CONTROL BLOCKL& MOV @S.KRB(R4),R4 ;;; GET CSR ADDRESS+ CLRB (R4) ;;; DISABLE PRINTER INTERRUPTS K( CALL @FORK ;;; CREATE A SYSTEM PROCESS MOV U.SCB(R5),R4 ; GET SCBM$ MOV @S.KRB(R4),R3 ; GET CSR ADDRESS TST (R3) ; PRINTER READY?S BMI LPOUT1 ; IF MI, NO6 MOV R5,R3 ; CALCULATE ADDRESS OF PRINTER STATUS WORD ADD #U.CW2,R3 ;' CALL LPRNT ; FILL LINE PRINTER BUFFERI( BCC LPINT1 ; IF CC, OPERATION FINISHED6 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 RETURNR4LPINT1: MOV S.PKT(R4),R1 ; GET ADDRESS OF I/O PACKET3 MOV I.PRM+4(R1),R1 ; GET NUMBER OF BYTES PROCESSED + MOV #IS.SUC&377,R0 ; SET SUCCESSFUL STATUST(60$: CALL @IODON ; FINISH I/O OPERATION JMP LPINI ;V .PAGE4 .SBTTL $LKINT - KMC11 PRINTER INTERRUPT ENTRY POINT;+7; **-$LPINT-LP11/LS11 LINE PRINTER CONTROLLER INTERUPTSI.; (INTERRRUPTS ARE FROM COMM IOP, NOT PRINTER); 6; INPUT INTERRUPTS SHOULD NOT OCCUR, AND ARE THEREFORE; DISMISSED IMMEDIATELY.; ); OUTPUT INTERRUPTS ARE CAUSED FOUR WAYS: ; ;; 1) - BUFFER ADDRESS OUT - INDICATES SUCCESSFUL COMPLETION ; OF AN OUTPUT OPERATION 9; 2) - CONTROL OUT - KMCABF SET IN KCS3 - ABORT COMPLETEDI@; 3) - CONTROL OUT - KMCONL SET IN KCS3 - PREVIOUS ERROR CLEARED7; 4) - CONTROL OUT - OTHER - ERROR CONDITION ON PRINTERP;- .IF DF K$$MLP$$LKINP:: ; IGNORE INPUT INTERRUPTS+ ; ($LPINP IS NEEDED TO MAKE DRIVER LOAD  ; CORRECTLY) .IF NDF L$$DRV ! M$$MGE ! LD$LP RTI .IFFI RETURN00konibjbkb a a a .ENDC .PAGE .ENABL LSBF$LKOUT:: ;;; REF LABEL .IF NDF L$$DRV ! M$$MGE ! LD$LP0 JSR R5,@INTSV ;;; SINCE THERE'S ONE KMC VECTOR,4 .WORD ^C&PR7 ;;; NORMAL UCB CALC. DOESN'T WORK .ENDC" ADD KMCCTB,R4 ;;; POINT INTO KRB . ADD #10,R4 ;;; ADD DISPLACEMENT TO CTB TABLE! MOV (R4),R4 ;;; GET KRB ADDRESS." MOV R4,-(SP) ;;; SAVE KRB ADDRESS! MOV (R4),R4 ;;; GET CSR ADDRESSE- MOV 2(R4),R5 ;;; GET PRINTER NUMBER FROM KMC.& BIC #^C,R5 ;;; STRIP OFF JUNK" SWAB R5 ;;; INTO LOW HALF OF REG" ASL R5 ;;; AND CREATE WORD INDEX" MOV (SP)+,R4 ;;; GET KRB ADDRESS - ADD K.OFF(R4),R5 ;;; ADD OFFSET TO KRB TABLEK ADD R4,R5 ;;; ADD KRB ADDRESS;! MOV (R5),R5 ;;; GET UCB ADDRESS./ BEQ 90$ ;;; IF EQ, DISMISS SPURIOUS INTERRUPT# MOV (R4),R4 ;;; GET KMC CSRC" MOV R5,-(SP) ;;; SAVE UCB ADDRESS6 MOV 6(R4),R5 ;;; GET PRINTER ERROR CODE 2 SWAB R5 ;;; PUT INTO HIGH BYTE 2 CLRB R5 ;;; CLEAR OUT LOW BYTE 7 BISB 2(R4),R5 ;;; AND MERGE IN INTERRUPT CAUSE ;) BIC #IEO,(R4) ;;; DISABLE KMC INTERRUPTSE9 BIC #RDYO,2(R4) ;;; RELEASE KMC L* MOV R5,R4 ;;; INTERRUPT CAUSE/ERROR BYTE% MOV (SP)+,R5 ;;; RESTORE UCB POINTER , CALL @FORK ;;; CREATE A SYSTEM PROCESS  MOV U.SCB(R5),R0 ; GET SCBV" MOV @S.KTB+2(R0),R0 ; GET KMC CSR) BIS #IEO,(R0) ; RE-ENABLE KMC INTERRUPTS 4 MOV R4,R0 ; COPY INTERRUPT CAUSE 4 MOV R4,R1 ; COPY POSSIBLE ERROR BYTE 2 SWAB R1 ; AND MOVE IT TO LOW BYTE : MOV U.SCB(R5),R4 ; GET SCB $ BIT #1,R0 ; WAS IT A CONTROL OUT ? BNE 70$ ; IF NE, YES$ MOV #IS.SUC,R0 ; SET SUCCESS STATUS.60$: MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS. MOV I.PRM+4(R1),R1 ; GET REQUESTED BYTE COUNT$ CALL @IODON ; FINISH I/O OPERATION MOV U.SCB(R5),R4 ; GET SCB;! MOV S.KTB+2(R4),R4 ; GET KMC KRB,) MOVB K.CON(R4),R4 ; GET CONTROLLER INDEX ' CLR CNTBL(R4) ; CLEAR CONTROLLER TABLE $ JMP LPINI ; AND START DRIVER AGAIN'70$: CMPB #KMCABF,R1 ; ABORT FINISHED ?R! BNE 80$ ; IF NE, YES ABORT DONE )LKOUT1: MOV #IE.ABO,R0 ; SET ABORT STATUS? BR 60$ ; AND OUT NORMALLYM)80$: CMPB #KMCONL,R1 ; PRINTER BACK NOW ?S& BNE LKOUT ; IF NE, NO, MUST BE ERROR" RETURN ; ELSE YES, THAT'S NICE.90$: MOV (R4),R4 ; GET CSRH BIC #RDYO,2(R4) ; RELEASE KMC RETURN ; AND EXIT FROM DRIVER .DSABL LSB, .ENDC ; DF K$$MLP .PAGE0 .SBTTL LPOUT - LINE PRINTER TIMEOUT ENTRY POINT;?; DEVICE TIMEOUT RESULTS IN A NOT READY MESSAGE BEING OUTPUT ATOC; A SYSGEN SPECIFIED INTERVAL. TIMEOUTS ARE CAUSED BY POWERFAILUREB; AND PRINTER FAULT CONDITIONS. ;A .ENABL LSBLLPOUT: : .IF DF K$$MLP2 BIT #KP.OFL,S.KTB+2(R4) ;;; VERIFY PORT IS ONLINE! BNE 10$ ;;; IF NE, IT'S OFFLINET, 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?B BEQ 10$ ;;; IF EQ, NOT! JMP LKOUT ;;; DO TIMEOUT FOR LKT .ENDC ; DF K$$MLP"10$: MOV @S.KRB(R4),R3 ;;; GET CSR) CLRB (R3) ;;; DISABLE PRINTER INTERRUPTU MTPS #0 ;;; ALLOW INTERRUPTS&LPOUT1: MOV R5,R3 ; CALCULATE ADDRESS5 MOV #IE.ABO&377,R0 ; ASSUME REQUEST IS TO BE ABORTED;. ADD #U.CW2,R3 ; ADJUST TO PRINTER STATUS WORD BIT #ABRT,(R3) ; ABORT REQUEST? BEQ 70$ ; IF EQ, NO1$ CALL @IODON ; FINISH I/O OPERATION JMP LPINI ;#(70$: MOV @S.KRB(R4),R2 ; GET CSR ADDRESS TST (R2) ; PRINTER READY?;- BMI DEVNR ; DEVICE NOT READY(ERROR BIT SET)T7 BITB #TMONO,S.STS(R4) ; WAS TIMEOUT WITH NO ERROR BIT?C BNE 71$ ; IF NE, YES L= BISB #TMONO,S.STS(R4) ; NO, SET THE BIT(TO CLEAR WHEN IODON)O& JMP LPIN1 ; GO BACK AND PRINT BUFFER>71$: BICB #TMONO,S.STS(R4) ; 2 TIMEOUTS WITH NO ERROR => ERROR BR DEVNR ; DEVICE NOT READYT .DSABL LSB  .PAGE6 .SBTTL LKOUT - KMC11 LINE PRINTER TIMEOUT ENTRY POINT;E8; TIMEOUT PROCESSING IS ENTERED FOR ANY OF THE FOLLOWING;E9; 1. FOLLOWING AN IO.KIL, IF THE REQUEST IS NOT COMPLETEDR<; NORMALLY BEFORE THE NEXT TIMEOUT CHECK, THE00ko~of__DATADATADATADATAN A HARDWARE; ABORT IS ISSUED HERE.;F<; 2. AFTER A DEVICE ERROR, THE TIMEOUT SECTION TAKES CARE OF ; ISSUING NOT READY MESSAGES.;N .IF DF K$$MLP$LKOUT: MTPS #0 ;;; ALLOW INTERRUPTS9 BIT #PWRFLG,U.CW2(R5) ; POWERFAIL RECOVERY IN PROGRESS ?S BEQ 99$ ; IF EQ, NOT- BIC #PWRFLG,U.CW2(R5) ; CLEAR POWERFAIL FLAGT( BIT #ABRT,U.CW2(R5) ; ABORT REQUESTED ?1 BNE LKOUT1 ; IF NE, YES, BUT REQUEST IS ALREADYL* ; ABORTED (AND HOW) DUE TO KMC FAILURE@ BIT #RQINPR,U.CW2(R5) ; REQUEST IN PROGRESS WHEN WE WENT DOWN ? BEQ 96$ ; IF EQ, NO.2 BIC #RQINPR,U.CW2(R5) ; CLEAR REQUEST IN PROGRESS. MOV S.PKT(R4),R1 ; RESTORE I/O PACKET ADDRESS! JMP LKIN1 ; AND RESTART REQUEST 096$: CLRB S.STS(R4) ; CLEAR FAKE CONTROLLER BUSY/ BICB #US.BSY,U.STS(R5) ; AND DECLARE UNIT IDLET( JMP LPINI ; TRY TO ACTIVATE CONTROLLER,99$: BIT #ABRT,U.CW2(R5) ; ABORT REQUESTED ? BEQ DEVNR ; IF EQ, NO # CALL WTKMC ; WAIT TILL IT'S READYR$ MOV #KILL,6(R0) ; SET KILL FUNCTION CLR 4(R0) ; NO BUFF ADDR% CLR R1 ; SCRATCH FOR PRINTER NUMBER9( BISB U.UNIT(R5),R1 ; SET IN UNIT NUMBER SWAB R1 ; PUT IT IN HIGH BYTES5 MOV R1,2(R0) ; FILL IN PRINTER NUMBER AND START KILL " RETURN ; WAIT TIL IT'S ALL OVER 4 .ENDC ; DF K$$MLP E .PAGE. .SBTTL . - DEVICE NOT READY MESSAGE PROCESSOR#; PROCESS DEVICE NOT READY MESSAGESLDEVNR: ; REF LABELR .IF DF T$$KMG2 MOV #T.NDNR,R0 ; SET FOR DEVICE NOT READY MESSAGE .IFTF ; DF T$$KMG- MOVB #1,S.CTM(R4) ; SET TIMEOUT FOR 1 SECONDO .IFT ; DF T$$KMGS* DECB S.STS(R4) ; TIME TO OUTPUT MESSAGE ? BNE 120$ ; IF NE, NO .IF NDF L$$PTOI4 MOVB #15.,S.STS(R4) ; SET TO OUTPUT NEXT MESSAGE IN ; 15. SECONDSR .IFF ; NDF L$$PTO7 MOVB #L$$PTO,S.STS(R4) ; SET TO OUTPUT NEXT MESSAGE INE ; L$$PTO SECONDS1 BNE 110$ ; IF NE, LP NOT READY MESSAGES ENABLEDN5 INCB S.STS(R4) ; LP NOT READY MESSAGE NOT WANTED, SO  BR 120$ ; RE-BUSY CONTROLLER .ENDC ; NDF L$$PTO$110$: CALLR @DVMSG ; OUTPUT MESSAGE .ENDC ; DF T$$KMG120$: RETURN ; OUT ! .DSABL LSBP .PAGE/ .SBTTL LPCAN - LINE PRINTER CANCEL ENTRY POINT;VC; CANCEL I/O OPERATION-FORCE I/O TO COMPLETE IF DEVICE IS NOT READY;.5LPCAN: CMP R1,I.TCB(R0) ;;; REQUEST FOR CURRENT TASK?T BNE 10$ ;;; IF NE, NO : BIS #ABRT,U.CW2(R5) ;;; SET FOR ABORT IF DEVICE NOT READY N .IF DF K$$MLP2 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?R BEQ 10$ ;;; IF EQ, NOV: MOVB #1,S.CTM(R4) ;;; FORCE TIMEOUT IN 1 SECOND (OR LESS)  .ENDC ; DF K$$MLP10$: RETURN ;;;  .PAGE- .SBTTL LPKRB - KRB STATUS CHANGE ENTRY POINTS ; ON ENTRY:);;(; R3 = CTB ADDRESS FOR THE CONTROLLER(; R2 = KRB ADDRESS FOR THE CONTROLLER'; 0(SP) = RETURN ADDRESS FOR COMPLETIONF7; 2(SP) = RETURN ADDRESS FOR CALLER OF THE EXEC ROUTINEF;C0; C = 0 IF THE CALL IS FOR CONTROLLER ONLINE1; C = 1 IF THE CALL IS FOR CONTROLLER OFFLINEF;T; $SCERR IS PRESET TO 1F;,0LPKRB: ; CONTROLLER STATUS CHANGE ENTRY POINT' ; AND EXEC VECTOR TRANSLATE ROUTINE0 .IF DF K$$MLP$ BCS 25$ ; BR IF CONTROLLER OFFLINE .IFTF ; DF K$$MLP3; FILL IN EXEC VECTOR IF WE HAVEN'T DONE SO ALREADYR' TST EXEVEC ; EXEC VECTOR TRANSLATED ?& BNE 15$ ; IF NE, YES - DON'T REPEAT. MOV R3,-(SP) ; SAVE A REGISTERL MOV R2,-(SP) ; OR TWO% MOV @#112,R0 ; R0 > TABLE OF ENTRIESR2 MOV (R0),R0 ; AND APR BIAS (1ST WORD OF TABLE).) MOV KINAR6,-(SP) ; SAVE I-SPACE MAPPING.3 MOV (R0),KINAR6 ; MAP COMMON THROUGH I-SPACE APR6.T& MOV #EXEVEC,R3 ; R3 > EXEC VECTOR AND. MOV #EXEVCL,R2 ; R2 = LENGTH OF VECTOR AREA.' CALL @#140004 ; TRANSLATE THE VECTORS.I, MOV (SP)+,KINAR6 ; RESTORE I-SPACE MAPPING. MOV (SP)+,R2 ; RESTORE  MOV (SP)+,R3 ; REGISTERS15$: ; REFERENCE LABELP .IFT ; DF K$$MLP ) BIT #KPKMC,K.PRM(R2); IS THIS A KMC KRB?V" BEQ 40$ ; IF EQ, NO, JUST 00konibjbkb a a aRETURN% MOV R3,KMCCTB ; SAVE LOCATION OF CTB  MOV R2,R4 ; PUT KRB INTO R4 & MOV #0,R5 ; MICROCODE FILENAME INDEX, CALL @ULDRQ ; REQUEST THE MICROCODE LOADER BCC 40$ ; BR IF SUCCESSFUL4 BNE 30$ ; IF NE, NO POOL, REJECT ONLINE TRANSITION #920$: MOVB #IE.NST,@SCERR ; MICROCODE LOADER NOT INSTALLEDR BR 40$ ; AND RETURNV-25$: BIT #KPKMC,K.PRM(R2) ; IS THIS A KMC KRB" BEQ 40$ ; IF EQ, NO, JUST RETURN3 BIC #KMCLOA,K.PRM(R2) ; CLEAR MICROCODE LOADED BITC% MOV #MC,@(R2) ; MASTER CLEAR KMC-11 U BR 40$ ; M+30$: MOVB #IE.NOD,@SCERR ; INDICATE NO POOL  .IFTF ; DF K$$MLP 40$: RETURN  .IFT ; DF K$$MLP  .PAGE- .SBTTL LPUCB - UCB STATUS CHANGE ENTRY POINTU ; ON ENTRY:3; /; R5 = ADDRESS OF UCB OR UNIT CHANGIN STATUS0 ; R4 = ADDRESS OF SCB OF UNIT1; R3 = CONTROLLER INDEX (UNDEFINED IF S.KRB=0)5'; 0(SP) = RETURN ADDRESS FOR COMPLETIONR7; 2(SP) = RETURN ADDRESS FOR CALLER OF THE EXEC ROUTINEM;)0; C = 0 IF THE CALL IS FOR CONTROLLER ONLINE1; C = 1 IF THE CALL IS FOR CONTROLLER OFFLINE.;,; $SCERR IS PRESET TO 1 LPUCB: BCS 10$ ; BR IF OFFLINE* BIT #1,S.KTB(R4) ; IS THE LP PORT ONLINE BEQ 10$ ; IF EQ, YES, ITS OKR) MOVB #IE.CNR,@SCERR ; REJECT TRANSITIONR/10$: BIC #KNOWN,U.CW2(R5) ; SET PRINTER UNKNOWNS RETURNO N .ENDC ; DF K$$MLP .PAGE .SBTTL . SUBROUTINES;P(; SUBROUTINE TO FILL LINE PRINTER BUFFER; *LPRNT: MOV @S.KRB(R4),R1 ; GET CSR ADDRESS0 MOV U.BUF+2(R5),R0 ; GET ADDRESS OF USER BUFFER .IF DF M$$MGE* MOV U.BUF(R5),@KISA6 ; MAP TO USER BUFFER .IFTF5$: MOV #5,R2 ; SET LOOP COUNT 10$: TST (R1) ; TEST ERROR  BPL 20$ ; BRANCH IF NO ERROR2 MOV R5,R3 ; CALCULATE ADDRESS OF RELOCATION BIAS ADD #U.BUF,R3 ;- MOV S.PKT(R4),R1 ; GET ADDRESS OF I/O PACKETN) ADD #I.PRM,R1 ; POINT TO RELOCATION BIAS.( MOV (R1)+,(R3)+ ; RESET RELOCATION BIAS' MOV (R1)+,(R3)+ ; RESET BUFFER ADDRESS! MOV (R1),(R3) ; RESET BYTE COUNTR SEC ; RETURN ;R 20$: TSTB (R1) ; TEST BIT READY BMI 40$ ;$ DEC R2 ; BNE 10$ ; LOOP AGAIN SEC ; SET BIT CARRYB30$: MOV R0,U.BUF+2(R5) ; SAVE ADDRESS OF NEXT BYTE IN USER BUFFER .IFT 0 MOV @KISA6,U.BUF(R5) ; SAVE MAPPING INFORMATION .ENDC RETURN ;D/35$: TST -(R3) ; ADJUST TO PRINTER STATUS WORDII40$: BIT #FORM!LFCT!BHLD!BLCT,(R3) ; FORM, LINE FEED, BYTE HELD, OR BLANKR BEQ 50$ ; IF EQ, NOM* BIT #BLCT,(R3) ; ANY BLANKS TO BE OUTPUT? BNE 80$ ; IF NE, YES5 BIT #BHLD,(R3) ; BYTE HELD BACK FOR CARRIAGE RETURN?B BNE 65$ ; IF NE, YES) BIT #FORM,(R3) ; FORM FEED TO BE OUTPUT?; BNE 60$ ; IF NE, YES) SUB #LFBT,(R3)+ ; REDUCE LINE FEED COUNT ) MOVB #12,R2 ; SET TO OUTPUT A LINE FEEDU BR 100$ ;M.50$: TST U.CNT(R5) ; ANY MORE BYTES TO OUTPUT? BNE 70$ ; IF NE, YES0 BIT #CRTY,(R3) ; CARIAGE RETURN AT END OF LINE? BEQ 30$ ; IF EQ, NOE, BIC #CRTY,(R3)+ ; CLEAR CARRIAGE RETURN BIT/ MOVB #15,R2 ; SET TO OUTPUT A CARRIAGE RETURNB BR 100$ ;N*60$: BIC #FORM,(R3)+ ; CLEAR FORM FEED BIT) MOVB #14,R2 ; SET TO OUTPUT A FORM FEED BR 100$ ;3965$: BIC #BHLD,(R3) ; CLEAR BYTE HELD FOR CARRIAGE RETURN## MOVB 3(R3),R2 ; RETRIEVE HELD BYTE BR 150$ ; 370$: MOVB (R0)+,R2 ; GET NEXT BYTE FROM USER BUFFERU .IF DF M$$MGE% BIT #20000,R0 ; OVERFLOW 4K BOUNDRY?S BEQ 75$ ; IF EQ, NOI# BIC #20000,R0 ; CLEAR OVERFLOW BIT ) ADD #200,@KISA6 ; UPDATE RELOCATION BIASI .ENDC)75$: DEC U.CNT(R5) ; DECREMENT BYTE COUNTE CMPB #177,R2 ; RUBOUT? BEQ 50$ ; IF EQ, YES* TST (R3)+ ; ADJUST TO HORIZONAL POSITION CMPB #11,R2 ; HORIZONAL TAB? BNE 90$ ; IF NE, NOL1 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 BLANK;#90$: BHI 110$ ; IF HI, OUTPUT BYTE6" CMPB #15,R2 ; LF, CR, VT, OR FF? BLO 110$ ; IF LO, NO CMPB #13,R2 ; VERTICLE TAB?1 BEQ 110$ ; IF EQ, YES$+100$: CLRB (R3) ; CLEAR HORIZONAL POSITIONO BR 120$ ; .110$: CMPB (R300kolof__DATADATADATADATA),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, YEST CMPB R2,#14 ; FORM FEED? BEQ 140$ ; IF EQ, YESC CMPB R2,#12 ; LINE FEED? BEQ 140$ ; IF EQ, YES 3130$: BIT #CRJT,(R3) ; CARRIAGE RETURN JUST OUTPUT?Q BEQ 150$ ; IF EQ, NO8 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 RETURNO8140$: BIC #CRJT,(R3) ; CLEAR CARRIAGE RETURN JUST OUTPUT .IFTF; ); TEST THE PRINTER CASE INDICATION IN CW2A%; IF IT DOES NOT INDICATE LOWER CASE +; FORCE LOWER CASE CHARACTERS TO UPPER CASEM;E150$:Q+ BIT #LOWER,U.CW2(R5) ; LOWER CASE PRINTER?E% BNE 155$ ; IF NE, YES, SKIP CONVERT  CMPB #141,R2 ; 'a' OR ABOVES 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 AGAINT .IFT$6160$: BIS #CRJT,(R3) ; SET CARRIAGE RETURN JUST OUTPUT JMP 5$ ; .ENDC;T,; SUBROUTINE TO WAIT FOR THE KMC TO BE READY;C ; INPUTS:A;"; R5 = UCB ADDRESS OF THE PRINTER"; R4 = SCB ADDRESS OF THE PRINTER;W ; OUTPUTS:;A; R0 = KMC CSR ADDRESS; .IF DF K$$MLP0WTKMC: MOV @S.KTB+2(R4),R0 ; GET KMC CSR ADDRESS" BIS #RQI,(R0) ; REQUEST KMC INPUT(10$: TST (R0) ; IS THE KMC-11 RUNNING ?. BPL 20$ ; IF PL, KMC NOT RUNNING - POWERFAIL" BIT #RDYI,2(R0) ; READY BIT SET ?% BEQ 10$ ; IF EQ, NO, WAIT SOME MORET$ BIC #RQI,(R0) ; CLEAR REQUEST INPUT RETURN ; YES, BO BACK;IE; WE WERE WAITING FOR THE KMC BUT THE KMC IS NOT RUNNING. THEREFORE,RJ; WE WILL GO TO THE POWERFAIL CODE WHICH WILL REQUEST THE MICROCODE LOADERH; TO RELOAD THE MICROCODE TO THE KMC. IF UNSUCCESSFUL, WE WILL CONTINUE; PRINTING WITHOUT THE KMC. ,;)=20$: BIS #PWRFLG!RQINPR,U.CW2(R5) ; SET POWERFAIL IN PROGRESSB- TST (SP)+ ; WE WON'T BE RETURNING TO CALLERB& 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 .END; WE WERE WAITING FOR THE KMC BUT THE KMC IS NOT RUNNING. THEREFORE,RJ; WE WILL GO TO THE POWERFAIL CODE WHICH WILL REQUEST THE MICROCODE LOADERH; TO RELOAD THE MICROCODE TO THE KMC. IF UNSUCCESSFUL, WE WILL CONTINUE; PRINTING WITHOUT THE KMC. ,;)=20$: BIS #PWRFLG!RQINPR,U.CW2(R5) ; SET POWERFAIL IN PROGRES.NLIST .IDENT /06.01/T); TTMAC - ASSEMBLY PREFIX FILE FOR TTDRV.R1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.E; All rights reservedS;N; 13-FEB-78 PETER WANNHEDENM;; PREVIOUSLY MODIFIED BY:O;H; P. WANNHEDEN ; C. F. SPITZG; D. R. DONCHIN ; S. ADAMS ; B. MCCARTHY ; R. PHILPOTT ;U%; MODIFIED FOR RSX-11M-PLUS V4.0 BY:H;I;C; L. KOGAN 20-FEB-87:; LK720 -- SUPPORT DIRECT TRANSFER FOR "PURE" IO.WAL ONLY;);;:;S; S. C. ADAMS 2-APR-87;; SA470 - - THIS SPACE IS INTENTIONALLY LEFT BLANK TO MAKEA+; LINES MATCH UP TO LINES IN M-PLUS TTMACi"; FOR EASE OF FUTURE MAINTENANCE;A;;l .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$$PRO+; 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.I00lonibjbkb a a aIF 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 :== LEGAL 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 UC00loof__DATADATADATADATAB 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 ;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 PRO00lomoibjbkb a a aCESSING. 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 .TITLE TTCAN .IDENT /07.00/C;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reservedT;T;N<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;M;M; 06-FEB-78 PETER WANNHEDEN;=; PREVIOUSLY MODIFIED BY:E;O; P. WANNHEDEN ; C. F. SPITZU; D. R. DONCHIN=; M. S. HARVEY ; S. C. ADAMSN; B. S. MCCARTHY;F; MODIFIED BY:;F; S. C. ADAMS 4-AUGUST-87 07.00I9; SA475 -- CORRECT HANDLING OF SELECTIVE READ/WRITE KILLS0;0;;+>; THIS MODULE CONTAINS ENTRY POINTS FOR THE FOLLOWING ROUTINES; CALLED BY THE EXECUTIVE:;W; TTCAN - CANCEL IOR; TTPWUP - POWER-UP ;-; ;C .MCALL DCBDF$,HWDDF$E;T DCBDF$ ;DEFINE DCB SYMBOLSM" HWDDF$ ;DEFINE HARDWARE SYMBOLS .IF DF T$$EIO .MCALL PKTDF$ PKTDF$H .ENDC ;T$$EIO  .IF DF R$$MPL  .MCALL KRBDF$ C KRBDF$ ;DEFINE KRB SYMBOLS O .IFF ;R$$MPL . .MCALL SCBDF$ 8 SCBDF$ ;DEFINE SCB SYMBOLSN N .ENDC ;R$$MPL .PSECT MAP5;0;;+.SBTTL TTCAN - CANCEL I/OT;P;+%; TTCAN - CANCEL CURRENT IO REQUESTS.B<; THIS ROUTINE IS CALLED FROM THE EXECUTIVE TO CANCEL (KILL)+; CURRENT IO REQUESTS FOR A TASK ON A LINE.D<; THE UC.KIL BIT IN U.CTL IN THE UCB IS SET FOR ALL TERMINAL3; UNITS TO FORCE THE EXECUTIVE TO CALL THIS ROUTINE.*; EVEN THOUGH THE UNIT IS NOT MARKED BUSY.;-;$;C?; TTCN1 IS CALLED FROM TTINI TO KILL READS OR WRITES (OR BOTH) =; AS REQUESTED FROM AN INTERNAL I/O KILL PACKTET. SELECTION B; IS BASED ON THE SUBFUNCTION BIT IN THE INTERNAL I/O KILL PACKET.;- ; INPUT: R ; R1=>TCB FOR WHICH TO KILL I/O ; R5=>UCB FOR WHICH TO KILL I/O.; R3=>FUNCTION(S) TO KILL (IF ENTRY AT TTCN1); ;E .ENABL LSBK;BTTCAN::T .IF DF R$$IIC8 MOV #,R3 ;IF CALLED AT TTCAN, BOTH READS ; AND WRITES WILL BE KILLED TTCN1::O .ENDC ;R$$IIC MTPS #0 ;;;ALLOW INTERRUPTSO CALL MAPD ;MAP DATA AREA .IF DF T$$EIO$ MOV R5,R0 ;GET COPY OF UCB POINTER7 ADD #U.TIXL,R0 ;MAKE POINTER TO U.TIXL (IOPX LISTHEAD)N83$: MOV R0,R4 ;CURRENT IOPX POINTER BECOMES BACKPOINTER ASSUME I.XLNK,0#5$: MOV @R4,R0 ;POINT TO NEXT IOPXR BEQ 7$ ;NONE - JUMP(' CMP I.XTCB(R0),R1 ;DO TASK TCBS MATCH? BNE 3$ ;N - JUMP .IF DF R$$IIC7 BIT #TF.RLB,R3 ;ARE WE KILLING READS? IF SO, THIS MUST . ;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 REGIST00moof__DATADATADATADATAERS. MOV R3,-(SP)O! MOV #I.XLEN,R1 ;GET SIZE OF IOPX$ CALL $DEACB ;DEALLOCATE IOPX MOV (SP)+,R3 ;RESTORE REGISTERS MOV (SP)+,R1$ BR 5$ ;LOOPP7$: ;REFERENCE LABEL7 .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$$SPLN ADD #U.TUX,R5 ;POINT TO U.TUX ASSUME U.TSTA,U.TUX+2+ MOV (R5)+,R4 ;GET UCBX AND POINT TO U.TSTA0! BEQ 40$ ;NONE - LINE IDLE- JUMPR .ENDC ;T$$SPL ASSUME U.TCI,0P& 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?. BNE 10$ ;N - JUMPD .IF DF R$$IIC* BIT #TF.RLB,R3 ;DO WE WANT TO KILL READS? BEQ 10$ ;BR IF NOA C .IFTF ;R$$IIC' MOV #IE.ABO&377,(R0) ;SET ABORT STATUSA/ MOV R3,-(SP) ;SAVE FLAG FOR KILL READ OR WRITEX MOV R1,-(SP) ;SAVE TCB ADDRESSO CALL KILLI ;KILL INPUT" MOV (SP)+,R1 ;RESTORE TCB ADDRESS MOV (SP)+,R3 ;RESTORE FLAGM010$: MOV U.TCO(R4),R0 ;GET CURRENT OUTPUT PACKET BEQ 40$ ;NONE - JUMP' CMP I.TCB(R0),R1 ;FROM THE RIGHT TASK?I BNE 40$ ;N - JUMP) .IFT ;R$$IICH+ BIT #TF.WLB,R3 ;DO WE WANT TO KILL WRITES?C BEQ 40$ ;BR IF NOD E .ENDC ;R$$IIC' MOV #IE.ABO&377,(R0) ;SET ABORT STATUSI BR KILLO ;KILL OUTPUT0;S;A6.SBTTL KILLO1 - KILL OUTPUT WITH STATUS SUPPLIED IN R0;+); KILLO1 - KILL OUTPUT WITH STATUS IE.DNR %; USED FOR TIME-OUT OR MODEM HUNG UP.O;T; INPUT:"; R0 - STATUS (IO.DNR IN LO BYTE); R4 POINTER TO UCBX; R5 POINTER TO U.TSTA;Q ; REGISTERS ALTERED: R0,R1,R2,R3;-;O;H3KILLO1::MOV U.TCO(R4),R3 ;GET CURRENT OUTPUT PACKETH BNE 20$ ;THERE IS ONE - JUMP# BIT #S1.OBY,@R5 ;ECHO IN PROGRESS?D BEQ 40$ ;NO - JUMP- CALL SETDSI ;YES - DISABLE INPUT PROCESSING ; BISB #US.OIU,U.STS-U.TSTA(R5) ;INTERRUPTS NOT EXPECTED NOWH! BIC #S1.OBY,@R5 ;SET OUTPUT FREE1 RETURNU"20$: MOV R0,@R3 ;OK - LOAD STATUS ;FALL THRU TO "KILLO"O;T; -.SBTTL KILLO - KILL OUTPUT WITH STATUS IE.ABO4;I;+); KILLO - KILL OUTPUT WITH STATUS IE.ABO.I;R; INPUT:; R4 POINTER TO UCBX; R5 POINTER TO U.TSTA8; I.LNK IN CURRENT OUTPUT REQUEST PACKET CONTAINS STATUS; TO RETURN TO TASK;;%; NOTE - MUST EXECUTE ON CORRECT CPU!P;C ; REGISTERS ALTERED: R0,R1,R2,R3;-;N;KILLO:: SAVNR ;SAVE R4,R5)' CALL SETDSI ;DISABLE INPUT PROCESSINGO- BIC #S2.WRA,2(R5) ;CLEAR WRAP-AROUND CONTEXT,5 CALL ABOXL ;ABORT OUTPUT WITH INTERRUPTS LOCKED OUT= BISB #US.OIU,U.STS-U.TSTA(R5) ;DISABLE RECOGNITION OF OUTPUTI ;INTERRUPTSI2 FRKBIT BIC,#FR.ORD ;PREVENT MULTIPLE COMPLETIONS CALLR FPORD ;SAY OUTPUT DONE; ;C,.SBTTL KILLI1 - KILL INPUT WITH STATUS IN R0;+A; KILLI1 - KILL SOLICITED OR UNSOLICITED INPUT WITH STATUS IN R0. :; USED TO KILL INPUT BECAUSE OF TIME-OUT OR MODEM HUNG UP.;V; INPUT:; R0 STATUS (IS.TMO OR IE.DNR); R4 POINTER TO UCBX; R5 POINTER TO U.TSTA;O ; REGISTERS ALTERED: R0,R1,R2,R3;-;N;R ASSUME U.TCI,0'KILLI1::MOV @R4,R3 ;GET CURRENT PACKETE BEQ 40$ ;NONE - RETURN MOV R0,@R3 ;OK - STORE STATUSR ;FALL THRU TO "KILLI"T;S;C,.SBTTL KILLI - KILL INPUT WITH STATUS IE.ABO;I;+(; KILLI - KILL INPUT WITH STATUS IE.ABO.;K; INPUT:; R4 POINTER TO UCBX; R5 POINTER TO U.TSTA7; I.LNK IN CURRENT INPUT REQUEST PACKET CONTAINS STATUS.; TO RETURN TO TASK;U%; NOTE - MUST EXECUTE ON CORRECT CPU!C; ; REGISTERS ALTERED: R0,R1,R2,R3;-;L;EKILLI:: SAVNR ;SAVE R4,R5A' CALL SETDSI ;DISABLE INPUT PROCESSINGC" TST U.TCO(R4) ;DOING TASK OUTPUT? BNE 30$ ;Y - JUMPK;SB; IF WE ARE KILLING A READ WITH ECHO, IT IS POSSIBLE THAT THE ECHO@; HAS NOT YET COMPLETED. IF SO, WE MUST LOGICALLY KILL THE ECHO.;I? BISB #US.OIU,U.STS-U.TSTA(R5) ;SET OUTPUT INTERRUPT UNEXPECTEDA! BIC #S1.OBY,@R5 ;SET OUTPUT FREEP630$: FRKBIT BIC,#FR.IRD ;PREVENT MULTIPLE COMPLETIONS BIC #S1.ESC!S1.DEC!S1.DPR,@R5$ ;GET OUT OF ESCAPE SEQUENCE MODE ;CLEAR DEFERRED ECHO FLAGS# ;CLEAR DEFERRED PROCESSING FLAGP00mooibjbkb a a a, CLRB U.TISV(R4) ;CLEAR INPUT STATE VARIABLE CALLR FPIRD ;SAY INPUT DONE40$: RETURN ;RETURNE;W;  O .IF DF M$$PRO A*.SBTTL FPTIM - FORK LEVEL TIME-OUT ROUTINE;MA; THIS ROUTINE IS ENTERED FROM THE FORK DISPATCHER AFTER A SWITCHE*; TO THE CORRECT CPU TO HANDLE A TIME-OUT.;5 .IF DF T$$SPL/FPTIM:: CALL 70$ ;HANDLE TIME-OUT ON THIS UNITT .IFF ;T$$SPLC ASSUME U.TUX,U.TSTA-2"FPTIM:: TST -(R5) ;POINT TO U.TUX( CALL 70$ ;HANDLE TIME-OUT ON THIS UNIT .ENDC ;T$$SPL1 TST (SP)+ ;ROUTINE RETURNS AS A COROUTINE - POPC ;RETURN ADDRESST$ RETURN ;RETURN TO FORK DISPATCHER O .ENDC ;M$$PRO A;S;L&.SBTTL TIME - TIME-OUT (DRIVER TIMER).; ;S!TTICK:: CALL MAPD ;MAP DATA AREAI+ MOV #DCB0,R3 ;POINT TO POINTER TO TT0: DCBU< MOV #$SCDV1,-(SP) ;GET ADDRESS OF DEVICE TABLE SCAN ROUTINE  .IF NDF T$$MODO H80$:  .ENDC ;NOT T$$MOD S$60$: CALL @(SP)+ ;GET NEXT TERMINAL BCS CLINS ;ALL DONE - JUMP) CMP D.NAM(R3),#"TT ;IS DEVICE NAME "TT"?S BNE 100$ ;N - ABORT SCAN) BIT #DV.TTY,U.CW1(R5) ;IS IT A TERMINAL?D BEQ 100$ ;N - ABORT SCAN .IF DF R$$CON) BITB #US.OFL,U.ST2(R5) ;IS UNIT OFFLINE? ! BNE 60$ ;Y - GO ON TO NEXT UNITT .ENDC ;R$$CON;A!; FOUND A TERMINAL. CHECK TIMERS.O;E .IF DF T$$SPL ADD #U.TSTA,R5 ;POINT TO U.TSTA070$: MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX) MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;MAP UCBX .IFF ;T$$SPL  ADD #U.TUX,R5 ;POINT TO U.TUX ASSUME U.TSTA,U.TUX+2/70$: MOV (R5)+,R4 ;GET UCBX AND POINT TO U.TSTAC .ENDC ;T$$SPL BEQ 80$ ;NONE - JUMP MOV R4,R1 ;;% ADD #U.TITI,R1 ;POINT TO INPUT TIMERT. 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$$SPL6 MOV #120000,R4 ;RESTORE CLOBBERED R4 TO POINT TO UCBX MOV R4,R1 ;, .IFF ;T$$SPLX MOV -2(R5),R1 ;GET UCBX .ENDC ;T$$SPL& ADD #U.TOTI,R1 ;POINT TO OUTPUT TIMER1 MOV #IE.DNR&377,R0 ;MOVE STATUS TO R0 FOR KILLO1D- MOV #KILLO1,R2 ;POINT TO KILL OUTPUT ROUTINEO CALL 110$ ;CHECK OUTPUT TIMERT M .IF DF T$$MOD T80$: .IF NDF R$$CONC0 BITB #US.OFL,U.ST2-U.TSTA(R5) ;IS UNIT OFFLINE? BEQ 90$ ;N - JUMPU; CLRB U.TMTI-U.TSTA(R5) ;Y - RESET TIMER TO PREVENT TIMEOUT. BR 60$ ;GO ON TO NEXT UNIT .ENDC ;NDF R$$CON90$: MOV R5,R1 ;M, ADD #U.TMTI-U.TSTA,R1 ;POINT TO MODEM TIMER. MOV #MTIM,R2 ;POINT TO MODEM TIME-OUT ROUTINE CALL 110$ ;CHECK MODEM TIMER D .IF DF D$$ZMD- MOV #U2.DZ1!U2.RMT,-(SP) ;PUSH BITS TO CHECKTC BIC U.CW2-U.TSTA(R5),(SP)+ ;IS LINE SERVICED BY A DZ11 AND REMOTE?  BNE 60$ ;N - JUMP. .IF DF M$$PRO7 MOV #FR.TIM,R3 ;GET FORK REQUEST BIT FOR MODEM TIMEOUT ? MOV #60$,-(SP) ;GO ON TO NEXT LINE IF THIS ONE NOT ON THIS CPUI4 CALL SWCPU ;SWITCH TO THE CORRECT CPU IF NECESSARY7 CALLR YZPOLL ;POLL THE DZ11 FOR MODEM STATUS SINCE IT 2 ;DOESN'T INTERRUPT ON MODEM STATUS TRANSITIONS .IFF ;M$$PRO 6 CALL YZPOLL ;POLL THE DZ11 FOR MODEM STATUS SINCE IT2 ;DOESN'T INTERRUPT ON MODEM STATUS TRANSITIONS .ENDC ;M$$PRO .ENDC ;D$$ZMD .ENDC ;T$$MOD B BR 60$ ;LOOP;3; FOUND A DEVICE OTHER THAN A TERMINAL - ABORT SCAN ; !100$: ADD #S$$SPA,SP ;FLUSH STACK ; ; ALL DONE - REQUEUE CLOCK BLOCK;I&CLINS:: MOV #$TTCB,R0 ;GET CLOCK BLOCK% CLR R1 ;CLEAR HIGH ORDER DELTA TIMEO# MOV $TKPS,R2 ;LOW ORDER = 1 SECOND ) MOV #C.SYST,R4 ;TYPE = SYSTEM SUBROUTINEA0 CALLR $CLINS ;INSERT IN CLOCK QUEUE AND RETURN; ;1110$: TSTB @R1 ;TIMER ACTIVE? BEQ 120$ ;N - RETURN DECB @R1 ;Y - UPDATE TIMER BEQ 130$ ;TIMER EXPIRED - JUMP120$: RETURN ;RETURN130$:P  .IF DF M$$PRO OE; WE JUST DECREMENTED THE TIMER TO 0, BUT WE MAY BE ON THE WRONG CPU.C5; SET TIMER BACK TO +1 AND SWITCH TO THE CORRECT CPU.O;$ INCB @R1 ;SET TIMER TO +1R% MOV #FR.TIM,R3 ;GET FORK REQUEST BITV# CALL SWCPU ;SWITCH TO CORRECT CPUV;.:; IF WE FALL THRU HERE, WE ARE ALREADY O00moof__DATADATADATADATAN THE CORRECT CPU.;L& CLRB @R1 ;FINALLY SET THE TIMER TO 0 .IF DF T$$SPL% MOV #120000,R4 ;RESTORE UCBX POINTER .IFF ;T$$SPLB. MOV U.TUX-U.TSTA(R5),R4 ;RESTORE UCBX POINTER .ENDC ;T$$SPL D .ENDC ;M$$PRO J .IF DF T$$CON ! MOV U.SCB-U.TSTA(R5),R3 ;GET SCBO C .IF DF R$$MPL A 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 ADDRESSW .IFF ;R$$MPLR  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?E BNE 120$ ;Y - IGNORE TIME-OUT M .ENDC ;T$$CON ,140$: JMP @R2 ;HANDLE TIME-OUTC;$ .DSABL LSB.;C $ .ENABL LSBF  .IF DF T$$MOD S;U; HANDLE MODEM TIME-OUTC;.9MTIM: MOV #CT.TIM,R2 ;SET INDEX FOR MODEM TIMEOUT ROUTINE3+ CALLR CTRD ;DO CONTROLLER-DEPENDENT STUFF,  .ENDC ;T$$MOD;S;D.SBTTL TTPWUP - POWER-UP.;;+; TTPWUP - POWER-UP.;-;B;1 .IF DF R$$CONTTINIT:: .IFFCTTPWUP:: .ENDC $ .IF DF T$$COM 4% MOV $TTCOM,R0 ;GET TTCOM PCB ADDRESS1 .IF NDF R$$CONM% BEQ 20$ ;NOT A VIRGIN SYSTEM - JUMP  .ENDC ;NDF R$$CON4 BIS #PS.NSF,P.STAT(R0) ;MARK TTCOM AS NONSHUFFLABLE7 MOV P.REL(R0),KINAR6 ;MAP INITIALIZATION CODE IN APR 6. .IF DF T$$SPL% CALL INIT ;DO VIRGIN INITIALIZATION; .IFF ;T$$SPLE* CALL INIT+20000 ;DO VIRGIN INITIALIZATION* ;THE INIT ROUTINE IS BUILT FOR MAPPING( ;IN APR5, BUT IS NOW MAPPED IN APR 6 .ENDC ;T$$SPL%20$: CALL MAPD ;MAP DRIVER DATA AREAM 4 .IFF ;T$$COM0 E CALL MAPD ;MAP DATA AREA .IF NDF R$$CONQ% BNE 30$ ;NOT A VIRGIN SYSTEM - JUMPN .ENDC ;NDF R$$CON N .IF NDF R$$MPLR T MOV R3,-(SP) ;SAVE R3 MOV R4,-(SP) ;SAVE R4 I .IFTF 0 MOV @#KISAR5,R0 ;COPY REAL START OF DRIVER DATA. ADD #200,R0 ;ADD THE EQUIVALENT OF 4 K WORDS$ MOV R0,@#KISAR6 ;MAP REST OF DRIVER .IF NDF T$$SPLO$ MOV R0,@#$DALED ;SAVE DRIVER KISAR6 .ENDC ;NDF T$$SPL% CALL INIT ;DO VIRGIN INITIALIZATIOND  .IFTE A MOV (SP)+,R4 ;RESTORE R40 MOV (SP)+,R3 ;RESTORE R3  A .ENDC ;NDF R$$MPL  .ENDC ;T$$COM R30$: ;REFERENCE LABEL ; .IF NDF R$$MPL F .IF DF T$$ACD/ TST U.ACB(R5) ;DOES THIS TERMINAL HAVE AN ACD?I BEQ 40$ ;N - JUMPK ADD #U.TSTA,R5 ;POINT TO U.TSTA* MOV #A.POWE,R0 ;SET POWERFAIL ENTRY POINT CALL $SWACD ;CALL ACDA* SUB #U.TSTA,R5 ;RESTORE R5 TO UCB ADDRESS .ENDC ;T$$ACD%; SET UP DATABASES OF UCB'S AND CSR'SL; L,40$: MOVB U.CTYP(R5),R2 ;GET CONTROLLER TYPE# MOV TTUCB(R2),R1 ;POINT TO D'X'UCBV7 ADD R3,R1 ;POINT TO TABLE POINTER FOR THIS CONTROLLERC% MOV (R1),R1 ;POINT TO UCB/CSR TABLE .IF DF D$$M11 CMP #TTTDH,R2 ;IS IT A DH11?A BNE 50$ ;N - JUMPM+ MOV S.DMCS(R4),-2(R1) ;FILL IN DM11-BB CSRD .ENDC ;D$$M11050$: 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 M .ENDC ;NDF R$$MPL C .IF DF M$$EXT .IF DF D$$H11!D$$V11T ' .IF DF R$$MPL& BIT #HF.UBM,$HFMSK ;UNIBUS MAP EXIST?" BEQ 60$ ;N - SKIP INITIALIZATION .IFF ;R$$MPLF TST $UMRPT ;UNIBUS MAP EXISTS?( BEQ 60$ ;IF EQ NO, SKIP INITIALIZATION .ENDC?; LOAD THE UMR(S) TO MAP DRIVER WITH 18-BIT ADDRESSES IDENTICAL1; TO 16-BIT ADDRESSESC; .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$$SPLC" MOV (R1)+,(R2)+ ;INITIALIZE UMR 6 MOV (R1)+,(R2)+ M .ENDC ;NDF T$$SPL .ENDC ; DF T$$UMR60$: ;REFERENCE LABEL .ENDC ;D$$H11!D$$V11F .ENDC ;M$$EXT B .IF DF R$$CON RETURNI .IFFS ADD #U.TSTA,R5 ;POINT TO U.TSTA4 CALL CKTAB ;CHECK WHETHER TYPE-AHEAD BUFFER SHOULD ;BE ALLOCATED OR DEALLOCATED  .IF DF T$$MOD M% BICB #US.CRW!US.DSB,U.STS-U.TSTA(R5)V ;ASSUME LOCAL LINE U .ENDC (/ MOV #CT.PWR,R2 ;S00monoibjbkb a a aET ROUTINE INDEX FOR POWER-UP/ CALLR CTRD ;CALL CONTROLLER DEPENDENT ROUTINEU ;AND RETURN( .ENDC ;R$$CON .DSABL LSBN;;;  .END60$: ;REFERENCE LABEL .ENDC ;D$$H11!D$$V11F .ENDC ;M$$EXT B .IF DF R$$CON RETURNI .IFFS ADD #U.TSTA,R5 ;POINT TO U.TSTA4 CALL CKTAB ;CHECK WHETHER TYPE-AHEAD BUFFER SHOULD ;BE ALLOCATED OR DEALLOCATED  .IF DF T$$MOD M% BICB #US.CRW!US.DSB,U.STS-U.TSTA(R5)V ;ASSUME LOCAL LINE U .ENDC (/ MOV #CT.PWR,R2 ;S .TITLE XEDRV - QIO UNA driver .IDENT /03.10/ .ENABL LC;G1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.M; All rights reserved ;A>; 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. ;M?; 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 OF9; ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.I; ; MODULE DESCRIPTION;A8; UNA QIO Driver. This driver attempts to simulate theA; the DECnet Direct Line Access (DLX) functionality for the UNA.D;N;H); DISTIBUTED SYSTEMS SOFTWARE ENGINEERINGA;; Previously modified by:M;O ; A. Kojnok ; L. Kogan; $; Modified for RSX-11M-PLUS V4.6 by:;O; D. Carroll 02-Dec-1998 03.104; DC533 - Include error logging changes provided by; J. Billquist;O H< .SBTTL ****************************************************< .SBTTL * UNA Driver Data Structures And Offset Definitions*< .SBTTL ****************************************************.IF NDF L$LIST .IIF NDF L$$IST,.NLISTr .IIF NDF L$$IST,.DSABL CRFT.ENDCE .SBTTL Register Conventions;v0; **********************************************0; * Register Conventions used by this driver *0; **********************************************;r;g4; R5 = Almost always points to the Port State Table:; R4 = Almost always points to the Controller State Table; R3 = I/O packet; R2 = Work registerf9; R1 = Ring routines use it to return ring entry address*; R0 = Work registerI;D I .SBTTL Local Macros;S; INTERNAL MACRO DEFINITIONS;.MACRO .DSECT START,CREF.IIF B , .DSABL CRF*.IIF DF L$$IST, .DSABL CRF.ASECT. = 0 .IIF DF L$$IST, .ENABL CRF.IIF B , .ENABL CRF*.IF NB . = START*.ENDC* .ENDM .DSECT.MACRO .BSECT START,CREF.IIF B , .DSABL CRFR.IIF DF L$$IST, .DSABL CRF.ASECT. = 1S.IF IDN ,. = 400 .ENDCo.IIF DF L$$IST, .ENABL CRF.IIF B , .ENABL CRFn .ENDM .BSECT.MACRO .ASSUME ARG1,COND,ARG2.IF COND -.IFF.ERROR ARG1 ;"COND ARG2" fails.ENDCO .ENDM .ASSUMER.MACRO APR5PC SUBNAMPC$$$$=.-IMPUR.IF GT 20000-PC$$$$A.IFF7.ERROR ; Subroutine "SUBNAM" out of APR5 address space .ENDCI .ENDM APR5PC .MACRO $QPKT,QUEUED JSR R0,QPAKTC .WORD QUEUE, .ENDM $QPKT .MACRO $DQPKT,QUEUE JSR R0,DQPAKA .WORD QUEUE .ENDM $DQPKT  T .SBTTL UNA conditionals;I; UNA conditionals;F4KISAR5 = 172352 ; Kernel instruction PAR 5 address4KISAR6 = 172354 ; Kernel instruction PAR 6 address-KDSAR5 = 172372 ; Kernel data PAR 5 addressS-KDSAR6 = 172374 ; Kernel data PAR 6 addressI; .IIF NDF U$$NCT .ERROR ; Number of controllers not definedAD .IIF NDF U$$NPC .ERROR ; Number of ports per controller not defined7 .IIF NDF U$$NRS .ERROR ; Receive ring size not definedT8 .IIF NDF U$$NTS .ERROR ; Transmit ring size not defined9 .ASSUME U$$NCT GE 1 ; Number of controllers must be GE 1A> .ASSUME U$$NPC GE 1 ; Number of ports/controller must be GE 15 .ASSUME U$$NR00noof__DATADATADATADATAS GE 1 ; Receive ring size must be GE 176 .ASSUME U$$NTS GE 1 ; Transmit ring size must be GE 1 d .SBTTL System macros.* .MCALL PKTDF$,UCBDF$,DLXDF$,CHRDF$,EPMDF$# .MCALL TCBDF$,SCBDF$,PCBDF$,HDRDF$  .IF DF R$$MPL ; If RSX-11M+ .MCALL KRBDF$,CTBDF$N% CTBDF$ ; Controller Table OffsetsT KRBDF$ ; Define KRB offsetsm .ENDC& PKTDF$ ; Define I/O packet offsets UCBDF$ ; Define UCB offsetsA DLXDF$ ; Define DLX offsetsf% CHRDF$ ; Define other DLX offsetsE* EPMDF$ ; Ethernet protocol module defs TCBDF$ ; Define TCB offsetsi& SCBDF$ ,,SYSDEF ; Define SCB offsets PCBDF$ ; Define PCB offsetsU' HDRDF$ ; Define Task Header offsets$ F .SBTTL Controller State Table;-H; Controller state table offsets. The controller state table resides atD; the beginning of the driver for APR5 mapping reasons. Some of theK; controller state table buffers reside in the permanently mapped with UMRs G; region at the end of the driver. Each of these buffers have pointerse; to them in the table.T;+ .DSECTf!C.FLAG: .BLKW 1 ; UNA flags byte / ; UNA software flag bits (used in C.FLAG)s+ CS.PWF = 2 ; Power fail processing flag$/ CS.SER = 10 ; Status error encounteredo' CS.INT = 40 ; Interrupt pendingl4 CS.ENP = 100 ; Receive end packet encountered/ CS.POL = 200 ; UNA poll function neededt% CS.GST = 400 ; Get status nexte; CS.INI = 1000 ; Controller initialization in progressi$ CS.STP = 2000 ; Device stopped) CS.OFL = 100000 ; Controller offlinef0C.OPRT: .BLKW 1 ; Count of number of ports open&C.PORT: .BLKW 1 ; Port list ROOT word*C.PROL: .BLKW 2 ; Protocol list root word1C.PCBP: .BLKW 1 ; UNA Port Control Block pointer.0C.UDBP: .BLKW 1 ; UNA Unibus Data Block pointer7C.INIW: .BLKW 1 ; Controller init completed wait queue2+C.RTRY: .BLKW 1 ; Initialize retry counter #C.INDX: .BLKW 1 ; Controller index ;0H; These pointers are used by the diagnostic non-DLX function processors.;o+C.KIR6: .BLKW 1 ; Non-DLX KISAR6 save arean,C.DGBP: .BLKW 1 ; Diagnostic buffer pointer0C.DGBE: .BLKW 1 ; Diagnostic buffer end pointer5C.DGBS: .BLKW 1 ; Start address of diagnostic bufferK;;=; These pointers are used by the function processing routines ;a6C.CFNC: .BLKW 1 ; Address of I/O packet for which the- ; ... current function is being performed ?C.FUNS: .BLKW 1 ; Current primary/secondary function save areas1C.PFNC: .BLKW 1 ; Pending control function queuei)C.CTMR: .BLKW 1 ; Control function timerD;S+; RECEIVE PROCESSING POINTERS AND WORK AREA ;f(C.RCVB: .BLKW 1 ; RCV ring base address-C.RCVF: .BLKW 1 ; RCV ring next free addressd1C.RCVC: .BLKW 1 ; RCV ring current entry addressa&C.RSEQ: .BLKW 1 ; RCV sequence number!C.RCVW: .BLKW 1 ; RCV wait queueo)C.RCVD: .BLKW 1 ; RCV pending completionn*C.RBFL: .BLKW 1 ; RCV receive buffer list3C.RML: .BLKW 1 ; RCV received message length.C.POVH: .BLKW 1 ; RCV protocol overhead7C.STRT: .BLKW 1 ; RCV Start buffer addr of current rcvE; -; TRANSMIT PROCESSING POINTERS AND WORK AREAS ;K(C.XMTB: .BLKW 1 ; XMT ring base address3C.XMTF: .BLKW 1 ; XMT ring next free entry address;1C.XMTC: .BLKW 1 ; XMT ring current entry address;2C.XSEQ: .BLKW 1 ; XMT ring entry sequence numbersC.XMTT: .BLKW 1 ; XMT timer1C.XMWQ: .BLKW 1 ; XMT FIFO I/O packet wait queueb/C.XMTP: .BLKW 1 ; XMT pending completion queuem<C.XHDR: .BLKW 1 ; XMT dest-source-protocol-byte.count) ; buffers list (Transmit Headers) ;r; CONTROLLER INTERNAL SAVE AREAS; ( ; Controller internal info save area1C.LOAD: .BLKW 1 ; Work area during load + C.PADDT/C.PADD: .BLKW 3 ; Node address (SEE C.LOAD!!!);+C.MODE: .BLKW 1 ; UNA default MODE (14001)K, ; UNA will pad short transmit messages# ; Enable H4000 collision testK ; Enable Half Duplex modeu%C.MCDV: .BLKW 1 ; Micro code versionm2C.MLT: .BLKW 1 ; # of multicast addresses enabled,C.PSTA: ; Last read port stat00npoibjbkb a a aus save area,C.RREV: .BLKW 1 ; Microcode revision number-C.MMAX: .BLKW 1 ; Max number of mulicast IDsn3C.MXCT: .BLKW 1 ; Max length of counter data blockd$C.WRKP: .BLKW 1 ; Work area pointer .IF DF R$$MPL ; If RSX-11M+0C.CTB: .BLKW 1 ; CTB - Controller Table for KRB0C.KRB: .BLKW 1 ; KRB - Controller Request Block .ENDC*C.UCB: .BLKW 1 ; UCB - Unit Control Block,C.SCB: .BLKW 1 ; SCB - Status Control Block4C.DCB: .BLKW 1 ; DCB - Device Control Block Address)C.CSR: .BLKW 1 ; CSR for this controllerB-C.LOG: .BLKW 12. ; Error log packet ;DC533K0C.LEN =. ; Controller DState Table size ;**-1 M .SBTTL Port State Table Offsets;.; Port State Table Offsets;t .DSECTF&P.NXTP: .BLKW 1 ; Next port link word!P.FLAG: .BLKW 1 ; Port flag wordK# PS.OPN = 1 ; Port open flag bitr< PS.DER = 2 ; Delayed error - Dropped a received message6 PS.XIN = 4 ; Line requires init function (IO.XIN) PS.ADR = 10 ; Address found! PS.PRO = 20 ; Protocol found ) PS.MLC = 40 ; Multicast list changed.%P.PTCB: .BLKW 1 ; Owning TCB address.P.LUN: .BLKW 1 ; Owning LUN%P.MCST: .BLKW 2 ; Multicast listheadb;OI; Used by Auxilliary buffer processor to save addr info for driver duringx; transmit processing.;B:P.XDAD: .BLKW 3 ; Holds Ethernet address for transmission;P.XPRO: .BLKW 1 ; Holds Ethernet protocol for transmissiona;I; Used by Auxilliary buffer processor to save addr info for driver duringA; receive processing.=; >P.RDAD: .BLKW 3 ; Holds Ethernet destination addr for receive>P.RSAD: .BLKW 3 ; Holds Ethernet destination addr for receive6P.RPRO: .BLKW 1 ; Holds Ethernet protocol for receive%P.RCVT: .BLKW 1 ; Receive timer save 1P.CTBL: .BLKW 1 ; Controller state table pointer.$P.WORK: .BLKW 4 ; General work area%P.LENG: ; Port data structure sizeK .SBTTL Protocol entry offsets;s; Define protocol list entries;b .DSECTcPL.LNK: .BLKW 1 ; Link word!PL.FLG: .BLKB 1 ; Protocol flags=- LF.EXC = LF$EXC ; Exclusive access protocolt( LF.DEF = LF$DEF ; Default user defined- LF.PAD = LF$PAD ; Protocol requires paddingPPL.USE: .BLKB 1 ; Use countPL.PRO: .BLKW 1 ; ProtocolT$PL.DEF: ; Pointer to default port,PL.EXC: .BLKW 1 ; Pointer to exclusive port)PL.ADD: .BLKW 2 ; Address chain listheadE*PL.LEN: ; Length of protocol list entry# .SBTTL Address chain entry offsetsp;o; Address chain entriesS;c .DSECT AD.LNK: .BLKW 1 ; Link word#AD.ADD: .BLKW 3 ; Ethernet address )AD.PRT: .BLKW 1 ; Address of owning portE'AD.LEN: ; Address chain entry lengthA% .SBTTL Multicast address chain entryL; !; Multicast address chain entries ;; .DSECTTML.LNK: .BLKW 1 ; Link pointer $ML.ADD: .BLKW 3 ; Multicast address1ML.LEN: ; Multicast address chain entry lengthh* .SBTTL UNA hardware interface definitions;0; UNA CSR/Data Structure Offsets and Definitions; ; CSR offsets; .DSECTPCSR0: .BLKW ; Primary CSR(PCSR1: .BLKW ; State and self-test CSR#PCSR2: .BLKW ; Buffer address CSRE.PCSR3: .BLKW ; Buffer address (extended) CSR;B; PCSR0 bit definitionsi;n*R0.SEI = 100000 ; Status Error Interrupt+R0.CEI = 40000 ; Command Error Interruptn*R0.RXI = 20000 ; Receive Ring Interrupt+R0.TXI = 10000 ; Transmit Ring Interruptn-R0.CSI = 4000 ; Command Success Interruptt8R0.RUI = 2000 ; Receive Buffer Unavailable InterruptR0.RSV = 1000 ; RESERVED)R0.FEI = 400 ; Fatal Error Interrupt.)R0.INT = 200 ; Interrupt Summary BitL(R0.IE = 100 ; Interrupt Enable Bit!R0.RST = 40 ; UNA Reset BitB*R0.RMT = 20 ; UNA Remote Console Bit$R0.PCM = 17 ; UNA Command Bits; !; UNA primary command definitions;RCM.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/ReceiveuCM.BOO = 5 ; Boot CommandDCM.PDM = 10 ; Polling Demand CM.TMO = 11 ; Sanity Timer On!CM.TMF = 12 00n pof__DATADATADATADATA ; Sanity Timer Off0#CM.TMR = 13 ; Sanity Timer Reset #CM.STP = 17 ; Stop UNA Operation ! .SBTTL CSR1 register definitions=; ; PCSR1 bit definitions;,R1.PWR = 100000 ; Transceiver Power Status ; 0 = failure, 1 = OK1"R1.CAB = 40000 ; Cabling Status ; 0 = failure, 1 = OKo/R1.SLF = 37400 ; Self-test Return Code FieldM%R1.CER = 200 ; Command Error Bit#R1.STA = 7 ; UNA State FieldM;0); UNA hardware state bits (Used in C.STA)t;iST.RST = 0 ; Reset State#ST.PRI = 1 ; Primary Load State ST.RDY = 2 ; Ready StateST.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;o .DSECT CB.CMD: .BLKB 1 ; Function Byte$CB.MBZ: .BLKB 1 ; Must Be Zero Byte'CB.ADD: ; Physical Address(1st word)i,CB.UDB: .BLKW 1 ; UNIBUS Data Block Address2CB.MAX: ; Max multicast addr allowed for device1CB.UD2: ; UNIBUS Data Block Address (Extended)y-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)r$CB.SIZ: ; Port Control Block Size .SBTTL Ring Descriptor Block ; :; Ring Descriptor Block (Used for codes FN.RRG and FN.WRG);D .DSECTy-RD.XMB: .BLKW 1 ; Transmit Ring Base AddressI0RD.XME: .BLKB 1 ; Transmit Ring Base (Extended)-RD.XML: .BLKB 1 ; Transmit Ring Entry Lengtha2RD.XMN: .BLKW 1 ; Transmit Ring Number of Entries,RD.RCB: .BLKW 1 ; Receive Ring Base Address7RD.RCE: .BLKB 1 ; Receive Ring Base Address (Extended)t,RD.RCL: .BLKB 1 ; Receive Ring Entry Length1RD.RCN: .BLKW 1 ; Receive Ring Number of Entries'RD.SIZ: ; Ring Discriptor Block Size  .SBTTL Line status bits;e5; Line status bits (Used for codes FN.RLS and FN.CLS)T;s-LS.ERR = 100000 ; Logical OR of Status Bitss'LS.MER = 40000 ; Multiple Errors Bit +LS.CDF = 20000 ; Collision Detect Failed LS.RSV = 10000 ; Reserved Bit!LS.TME = 4000 ; Timeout Error 'LS.RRE = 1000 ; Receiver Ring ErrorR'LS.XRE = 400 ; Transmit Ring ErrorK#LS.RAM = 100 ; RAM operationalR!LS.REV = 77 ; ROM REV Levelo .SBTTL Ring entry offsets;t; Ring entry offsets;T .DSECTa!RG.LEN: .BLKW 1 ; Segment Length("RG.ADD: .BLKW 1 ; Segment Address-RG.AD2: .BLKB 1 ; Segment Address (Extended)tRG.FLG: .BLKB 1 ; Flags Bytee*RG.RLN: .BLKB 1 ; Received Message Length/RG.ERR: .BLKB 1 ; Error Word (and TDR or MLEN).RG.ACT: .BLKB 1 ; Ring Entry Active Flag Byte-RG.SEQ: .BLKB 1 ; Ring Entry Sequence Number 9RG.UMR: .BLKW 1 ; UMR assignment block save during xmitsR4RG.VAD: .BLKW 1 ; Virtual Address of receive buffer'RG.LNK: .BLKW 1 ; Ring Entry Link WordsRG.SIZ: ; Ring Entry Size;S ; Ring flag byte bit definitions;g#RF.OWN = 200 ; UNA Ownership Bite' ; 0=Owned by driver, 1=Owned by UNA;$RF.ERR = 100 ; Combined Error Bit'RF.FRM = 40 ; Receive Framing Errorr(RF.OFL = 20 ; Receive Overflow Error2RF.MOR = 20 ; Transmit Multiple Retries Needed#RF.CRC = 10 ; Receive CRC Error +RF.ONE = 10 ; Transmit One Retry Neededm;RF.MLT = 4 ; Receive No Multicast Error(Set by driver)G*RF.DEF = 4 ; Transmit Packet Deferred!RF.STP = 2 ; Start of PacketiRF.ENP = 1 ; End of Packet9RF.OPN = 200 ; Open circuit(Set by driver in low byte)e:RF.SHT = 100 ; Short circuit(Set by driver in low byte);M!; Ring error word bit definitions;O'RE.BFL = 100000 ; Buffer Length ErrorM(RE.UTO = 40000 ; UNIBUS Timeout Error1RE.NCH = 20000 ; No Data Chaining Enabled(RCV) -RE.LCL = 10000 ; Late Collision Error(XMT) .RE.LCR = 4000 ; Loss of Carrier Error(XMT)0RE.RTY = 2000 ; Retries Execeeded Error(XMT)7RE.CIR = 14000 ; Short or Open Circuit (w/TDR value)f RE.TDR = 1777 ; TDR Bit Mask4RE.MLN = 7777 ; Received Message Length Bit Mask .SB00npoibjbkb a a aTTL UNA MODE bit definitions;M; UNA MODE bit definitionsi;n7MD.PRM = 100000 ; UNA will accept all incoming frames 8MD.ENL = 40000 ; UNA will accept all multicast frames1MD.DRC = 20000 ; Disable receive data chaininge8MD.TPD = 10000 ; UNA will pad short transmit messages/MD.ECT = 4000 ; Enable H4000 collision teste8MD.DMT = 1000 ; Disable maintainence messages (loop,* ; boot, request ID, memory load)(MD.DTC = 10 ; Disable transmit CRC.MD.LOO = 4 ; Enable controller loopback+MD.HDX = 1 ; Enable Half Duplex mode0 .SBTTL DIAGNOSTIC (non DLX functions) FUNCTIONS;D*; DIAGNOSTIC (non DLX functions) FUNCTIONS; D; The following diagnostic functions will have the following format:;0; C.TYP = Function codea; C.DATI = Not Used-; C.DATO = Size of buffer starting at C.CHRLD$; C.STAT = Status Code (See CHRDF$)'; C.CHRL = Start of Input/Ouput Buffer ; ; OCTAL WORDS ; BUFFER SIZE"; FUNCTION REQUIRED;o;a; CONTROL BLOCK FUNCTIONSb;H%FN.NOP = 0 ; NOP Function 33C2FN.LSM = 1 ; Load and Start Microaddress 14FN.RDA = 2 ; Read Default Physical Address 3-FN.RPA = 4 ; Read Physical Address 3:-FN.WPA = 5 ; Write Physical Address 3o4FN.RML = 6 ; Read Multicast List From UNA 366FN.WML = 7 ; Write Multicast List To UNA (illegal)5FN.RRG = 10 ; Read Ring Format (illegal) 5FN.WRG = 11 ; Write Ring Format (illegal) &FN.RCN = 12 ; Read Counters 40.FN.CCN = 13 ; Read and Clear Counters 40&FN.RMD = 14 ; Read UNA Mode 1&FN.WMD = 15 ; Write UNA Mode 1(FN.RLS = 16 ; Read Line Status 104FN.CLS = 17 ; Read and Clear Line Status 10"FN.DMP = 20 ; Dump Internal RAM"FN.LOA = 21 ; Load Internal RAM-FN.RSY = 22 ; Read System ID Max 144 .FN.WSY = 23 ; Write System ID Max 144/FN.RSA = 24 ; Read Load Server Address 3R4FN.WSA = 25 ; Write Load Server Address 3; Software functions%FN.DIG = 26 ; Get Diagnostic Data., ; This function code is used to dispatch/ ; ... to the diagnostic functions processor;0FN.UML = 27 ; UNA microcode support task wait.' ; This function is used to time out0+ ; ... a response from the support task. ) .SBTTL Receive Buffer Offset Definitions ; #; Receive Buffer Offset Definitionse;D .DSECTxM.LNK: .BLKW 1 ; Link wordo$M.ERR: .BLKW 1 ; Error status bytes+ ; Low byte = RDRB+5, High byte = RDRB+7 1 ; (RDRB means Receive Descriptor Ring Buffer)i*M.MLEN: .BLKW 1 ; Lenth of data in buffer&M.DADD: .BLKW 3 ; Destination address!M.SADD: .BLKW 3 ; Source address M.PRO: .BLKW 1 ; Protocol-M.DATA: .BLKW 1 ; Start of data (No padding)0'M.PDTA: .BLKW 1 ; Start of padded dataa .BLKW 255. ; Data buffer .BLKW 2 ; Room for CRC2M.DBSZ = .-M.DATA ; Receive data buffer area size M.SIZE: ; Receive buffer size% .SBTTL Other offsets and definitions ;y; Timer values;y0RSTIM = 10 ; Timeout value for reset command,SLFTIM = 16 ; Timeout value for self-test3CNTTIM = 2 ; Timeout value for control functions,XMTTIM = 30 ; Timeout value for transmits5UMLTIM = 180. ; UNA microcode support task responsep ; ... timeout value.0RETRYC = 3 ; Controller initialize retry count" .IF NDF R$$MPL ; If NOT RSX-11M+4U.UCBX = U.CNT ; Define U.UCBX for none M+ systems .ENDC ; R$$MPL+SENDBK = 8. ; Send and request block size'FCOPN = 33 ; Open function code valuem;v; Maximum trasmit buffer size ;65; 1518.-u;a:XMTBSZ = 1518.-<6+6+2+2+4> ; Maximum transmit buffer size0UMRWBS = 20. ; UMR wait block size 10. words; ; DEFINE BITS; BIT0 = 1uBIT1 = 2;BIT2 = 4aBIT3 = 10BIT4 = 20 BIT5 = 40+BIT6 = 100TBIT7 = 200XBIT8 = 400eBIT9 = 1000RBIT10 = 2000BIT11 = 4000BIT12 = 100npof__DATADATADATADATA0000BIT13 = 20000BIT14 = 40000BIT15 = 100000) .SBTTL Error Log Definitions and Offsetsd;S; Error log typesB;C$ER.SER = 1 ; Status Error Interrupt%ER.STC = 2 ; Status Change InterruptMER.RCV = 3 ; Receive ErrorcER.XMT = 4 ; Transmit Error2ER.RBU = 5 ; Receive Buffer Unavailable Interrupt)ER.FCI = 6 ; Fatal controller initialize ; ; Error log offsetsI;  .DSECTT&E.LENG: .BLKW 1 ; Error packet lengthE.TYPE: .BLKB 1 ; Error type0$E.TMO: .BLKB 1 ; Time out flag byteE.CSR0: .BLKW 1 ; PCSR0E.CSR1: .BLKW 1 ; PCSR1$E.PCB: .BLKW 4 ; Port control block9E.FLG: .BLKW 1 ; Flag word of xmt/rcb ring entry ;DC533s:E.ERR: .BLKW 1 ; Error word of xmt/rcv ring entry ;DC533&E.MODE: .BLKW 1 ; Mode bits ;**-2!E.SIZE: ; Size of error packete f( .SBTTL UMR mapped communications region; H; This area consists of various buffers that must reside in a UMR mappedI; region. Therefore, these buffers will be a part of the permanently UMR1F; mapped region after the driver code. The controller state table has/; pointers that point to each of these buffers..;W*C.WKSZ = 140. ; Controler work area size .DSECT:;C.PCB: .BLKB CB.SIZ ; UNA Port Control Block Buffer (PCBB) ;C.UDB: .BLKB RD.SIZ ; UNA Unibus Data Block Buffer (UDBB)c+C.RRNG: .BLKB U$$NRS*RG.SIZ ; RCV ring areanLC.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.count  ; ... bufferse .ENDR .BLKW C.WKSZ ; Work buffer)C.BASZ: ; UMR mapped buffers area size  o" .SBTTL I/O Packet Usage By Driver;L; I/O Packet extension offsets; .IP.EXT = I.PRM ; I/O packet extension pointer .DSECTk/IX.ADR: .BLKW 1 ; I/O buffer addr (high order)C:IX.AUX: .BLKW 1 ; APR6 bias of Aux.characteristics buffer:IX.DIG: .BLKW 1 ; APR6 bias of optional diagnostic buffer-IX.FCN: .BLKW 1 ; Non-DLX function save area6&IXSIZE: ; I/O packet extension size;n;; I/P Packet Parameter Area.K; +-----------------------------------------------------------------------+oK; |Extn Ptr| P1 | Size | P2 | Size | P3 | Size |Not used|K; +-----------------------------------------------------------------------+;; I.PRM |9; | +- Low 16 bits of buffers physical addressi; |f ; | I/O Packet Extension0; | +-----------------------------------+0; +--> |P1 Bias |P2 Bias |P3 Bias |Scratch |+; +-------------------------------------+m ; | V,; | +- High bits of P1 physical address; |-; V- ; IX.PRM;; I/O Packet Use For RECEIVES ; =========================== ;o; While in receive wait queue-; ----------------------------;-; I.FCN - Receive wait timer D; I.PRM - This word will be pointing to the I/O packet extension.7; 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; ----------------------------;+D; 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; ------------------------;i; I.FCN - Retry countD; I.PRM - This word will be pointing to the I/O packet extension.9; I.PRM+2 - I/O status save when transmit has completed.b$; I.PRM+4 - Transmitted byte count.C; IX.FCN - Holds protocol flag bits while in transmit wait queue.-A; IX.FCN - Holds the following while in transmit pending queue:O2; Low byte = flag byte of transmit ring entry4; High byte = error byte of transmit ring entry;=; While in Function Queues; ------------------------;-; I.FCN - Retry counterI; I.PRM - This word will be pointing to the I/O packet extension. TheoC; I/O packet extension will be used to store the relocationR1; bias for each buffer in the I/O 00n"poibjbkb a a apacket.p; IX.FCN - Function code.a;i,; I/O Packet Use For SET/GET CHARACTERISTICS,; ==========================================;bI; I.PRM - This word will be pointing to the I/O packet extension. TheaA; I/O packet extension will be used to store the relocation-/; bias for each buffer in the I/O packet. :; IX.FCN - Function code. (when setting multi cast addr);h7; I/O Packet Use For CONTROL FUNCTION (Micro code load)t7; ===================================================== ;k!; I.PRM - I/O packet extension&; I.PRM+2 - Virtual address of buffer; I.PRM+4 - Buffer size%; I.PRM+6 - End of buffer +1 pointerR; ; IX.FCN - Functioni;n.IF NDF L$LIST .IIF NDF L$$IST,.LIST .IIF NDF L$$IST,.ENABL CRFe.ENDCo< .SBTTL ****************************************************< .SBTTL * UNA QIO Processing Routines *< .SBTTL **************************************************** .PSECT ; UNA driver PSECT=L$LIST = 0 ; List prefix filek%UNAST: ; UNA driver start address  ; *** NOTE ***d$ ; This module must be the first# ; ... module in the task buildn  .SBTTL Driver Impure Area;+; Driver Impure Area;-IMPUR:6 .REPT U$$NCT ; Make room for controller state tables8 .BLKB C.LEN+ ; ... and port state tables .ENDRIMPRE: ; End of impure area@RELCT: .WORD -1,-1 ; Relocation constant used to compute Unibus1 ; ... address within the UMR mapped region ofT/ ; ... the driver. Initially -1 to indicatee) ; ... driver needs to be initialized. & .IF NDF R$$MPL ; If NOT RSX-11M-PLUS;CNTBL: .BLKW U$$NCT ; UCB save table for interrupt service .ENDC ; R$$MPL >CTABL: .BLKW U$$NCT ; Controller Table Pointers. Indexed via ; ... controller index.P*ENDCTB: .WORD 0 ; End of controller table"DAPR6: .BLKW 1 ; Driver APR6 save+UABKS: .WORD 0 ; UMR assignment block savet+MLTCB: .WORD 0 ; Microcode loader TCB savee>CVIRA: .WORD CBASE ; Virtual address of CBASE. used by UNAIN.9CACUM: .WORD 0 ; Time accumulator, used by CLOCK routineN'CLKBK: .WORD 0 ; Clock Block save area:=CTPTR: .WORD 0 ; Current controller pointer. Used by CLOCK.C$CLKFG: .BYTE 0 ; Clock running flag .EVEN .IF DF R$$MPL:CSCRET: .BLKW 1 ; Controller Status Change return address .ENDC t& .SBTTL $XETBL - Driver dispatch table&$XETBL::.WORD XEINI ; Initialization .WORD XECAN ; Cancel I/O  .WORD XETMO ; Timeout .WORD XEPWF ; Powerfail .IF DF R$$MPL) .WORD XECSC ; Controller status changee0 .WORD XETMO ; Unit status change (do nothing)$ .ASCII /XE/ ; Generic device name' .WORD $XEINT ; Interrupt entry pointe# .WORD 0 ; End of interrupt entry .XECTB: .WORD 0 ; Pointer to KRB table in CTB $XETBE::.WORD 0 ; End of table .ENDC;+G; QIO$ validation table. Each entry consistes of two words as follows: ;N; .BYTE SUB FUNCTION MASKDD; .BYTE BIT 200 SET --> FUNCTION INVALID IF LUN NOT ALREADY IN USE; (NO OPEN HAS BEEN ISSUED)%; .WORD ADDRESS OF FUNCTION PROCESSOR;-3QIOTBL: .WORD 100370,XECLN ; Close LUN (FC = 7)X1 .WORD 100370,XEXMT ; Write (FC = 31, IO.XTM)r0 .WORD 100370,XERCV ; Read (FC = 32, IO.XRC)0 .WORD 000370,XEOPN ; Open (FC = 33, IO.XOP)1 .WORD 100160,XETRM ; Close (FC = 34, IO.XTR)+5 .WORD 100370,XEINL ; Initialise (FC = 35, IO.XIN) 2 .WORD 000200,XECTL ; Control (FC = 36, IO.XTL)8 .WORD 100360,XECHR ; Characteristics (FC = 37, IO.XCH) N' .SBTTL XEINI - I/O request initiationW;+!; **-XEINI-I/O request initiation;IG; This routine is entered from the EXEC when an I/O packet is available;E; for processing. The request parameters must be validated within theI; context of the calling task.; ; NOTEB; UC.QUE bit is set in U.CTL of the UCB. Therefore, the EXEC doesC; not queue requests for the driver. The driver itself keeps trackEA; of the it's I/O packets. Thus the driver does not call $GTPKT.r;- ; Inputs:, ; R1 = Address of the I/O packet&; R4 =00n*pof__DATADATADATADATA Address of status control block$; R5 = Address of unit control block;e'; Outputs: (to QIO processing routines)k*; 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) /; R5 = Address of Port State Table (if present)e;s!XEINI: NOP ; Word for patchingl .IF DF DEBUG  BPT .ENDC' .IF NDF R$$MPL ; If NOT RSX-11M-PLUSG MOV U.SCB(R5),R3 ; R3 = SCBd* MOV S.CON(R3),R3 ; R3 = Controller index; MOV R5,CNTBL(R3) ; Save UCB pointer for interrupt routine .ENDC ; R$$MPL% CMP RELCT,#-1 ; Driver initialized?h BEQ IEABO ; Nod) MOV R1,R3 ; Copy address of I/O packets1 MOV #IXSIZE,R1 ; Get I/O packet extension blockm CALL $ALOCB ; ...) BCS 70$ ; Resource allocation failure.e? MOV I.PRM(R3),IX.ADR(R0) ; Save high address word in extension/ MOV R0,IP.EXT(R3) ; Save I/O packet extensionM& CLR IX.FCN(R0) ; Clear function word# CALL MPTHDR ; Map to task headeri( ; On return, R0=Task Header address) MOV I.LN2(R3),R2 ; Compute LUN on whichM" SUB #H.LUN-2,R2 ; this request SUB R0,R2 ; was issued& ASR R2 ; Each entry is 4 bytes long ASR R2 ; ...E- MOVB I.FCN+1(R3),R1 ; Get I/O function codeO. BIC #^C<177>,R1 ; Isolate real function code- SUB #7,R1 ; Is this a 'close LUN' request?d BEQ 20$ ; If EQ, yes+ SUB #21,R1 ; Normalise to dispatch tableM 20$: ASL R1 ; Form table index ASL R1 ; ...P4 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, yese1 TSTB (R1)+ ; Should the LUN already be in use?+ BMI 40$ ; If MI, yesi0 MOV #IE.ALN&377,R0 ; Assume LUN already in use% TST @I.LN2(R3) ; Is the LUN in use?U BEQ 60$ ; If EQ, no.30$: CALLR RQALT ; Complete request in error040$: MOV #IE.IFC&377,R0 ; Assume LUN not in use5 MOV @I.LN2(R3),R5 ; Get address of Port State Tablep# BIC #1,R5 ; Remove LUN interlockA" BEQ 30$ ; If EQ, LUN not in use4 CMP I.TCB(R3),P.PTCB(R5) ; Port owned by same task?6 BNE NOTIF ; If NE, user abort notification required1 CMPB R2,P.LUN(R5) ; Still accessed on same LUN?i BNE NOTIF ; If NE, no550$: MOV P.CTBL(R5),R4 ; R4 = Controller State Table / MOV #IE.DNR&377,R0 ; Assume device is stoppedT) BIT #CS.STP,C.FLAG(R4) ; Device stopped?#) BNE 30$ ; Yes, return device not readyV60$:( CALL MAPDRV ; Map to 2nd 4K of driver0 CALLR @(R1)+ ; Dispatch to processing routineD70$: MOV #+,R0 ; Resource allocation failure CLR R1 ; ...N! CALLR $IOFIN ; Post completiont7 APR5PC XEINI ; Make sure XEINI is in APR5 addr spaceL B0 .SBTTL NOTIF - Deliver user abort notification;+*; **-NOTIF-Deliver user abort notification;R@; The physical link in use by this user has been taken over by a?; previleged task. Complete this I/O request in error and stop *; further operation on this physical link.;- ; Inputs:t; R3 = Address of I/O packet;M9NOTIF: CLR @I.LN2(R3) ; No further activity on this linku;+1; **-IEABO-Complete I/O request with abort status;A0; Complete the I/O request with an abort status.;- ; Inputs:.; R3 = Address of I/O packet; 0IEABO: MOV #IE.ABO&377,R0 ; Set up abort status BR RQALT;+,; **-ISSUC-Complete I/O request successfully; **-RQALT-Alternate entry;t; Complete the I/O request.s;- ; Inputs:s; R3 = Address of I/O packet; 2ISSUC: MOV #IS.SUC&377,R0 ; Set up success status&RQALT: CLR R1 ; No additional status;+!; **-RQDON-Perform I/O completion ;I!; Perform general I/O completion.t;- ; Inputs: ; R0 = First word of I/O statusa ; R1 = Second word of I/O status; R3 = Address of I/O packet;BRQDON: MOV R4,-(SP) ; Save R41 MOV IP.EXT(R3),-(SP) ; Save I/O packet extension > BIS #,R0 ; Tell user, this is a broadcast channel CALL $IOFIN ; Post completion5 MOV (SP)+,R0 ;00n2poibjbkb a a a R0 = Address of I/O packet extensionS1 MOV #IXSIZE,R1 ; R1 = I/O packet extension size + CALL $DEACB ; Deallocate extension blocko MOV (SP)+,R4 ; Restore R4f RETURN ; Return to caller- u4 .SBTTL XEOPN - Establish access to a physical link;+.; **-XEOPN-Establish access to a physical link;QE; This function is called to gain access to a specific physical link.x;- ; Inputs:#*; R2 = LUN on which the request was issued; R3 = Address of I/O packet; R4 = Controller State Table *; I.PRM+1 - High byte of physical address,; I.PRM+2 - Low 16 bits of physical address'; I.PRM+4 - Length of string ; I.PRM+6 - Initial timeout; I.PRM+7 - Mode: (Ignored);l .ENABL LSBXEOPN: .IF DF DEBUGi BPT .ENDC4 CALL MAPBF ; Convert data buffer physical address& ; ... to bias and virtual address( CALL GTPRT ; Find and allocate a port BCS RQALT ; If CS, errorL;o<; R5 = Port Control Block, R4 = controller state table base;4& MOV #IE.NSF,R0 ; Assume line stopped- BIT #CS.STP,C.FLAG(R4) ; Controller stopped?w BNE RQALT ; Yes# CALL MPTHDR ; Map to task headeri- MOV R5,@I.LN2(R3) ; Mark this LUN as activeP' CALL MAPDRV ; Restore driver mapping7 MOV I.TCB(R3),P.PTCB(R5) ; Save TCB in port save areav/ MOVB R2,P.LUN(R5) ; Set up owning TCB and LUNi8 MOVB I.PRM+6(R3),P.RCVT(R5) ; Save receive timer valueA MOV #PS.XIN!PS.OPN,P.FLAG(R5); Pretend link needs initialization * INC C.OPRT(R4) ; INC count of open ports9 MOVB I.PRM+6(R3),P.RCVT(R5) ; Save receive timeout counto/ BIS #PS.OPN,P.FLAG(R5) ; Indicate port is openP- BIT #CS.OFL,C.FLAG(R4) ; Controller offline?)& BNE 50$ ; Yes, try to initialize it BR 20$ ; return success7 APR5PC XEOPN ; Make sure XEOPN is in APR5 addr spacee M;+; **-XEINL-Initialise channelC;nA; This function is called to restart operation of a physical link; following an error.L;- ; Inputs: ; R3 = Address of I/O packet; I.PRM - Initial timeout; I.PRM+1 - Mode:; R4 = Controller State Table 8; R5 = Address of Port Status physical link access block;rXEINL::P .IF DF DEBUGC BPT .ENDC8 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 receivese4 BIT #CS.OFL,C.FLAG(R4) ; Is the link state offline? BNE 40$ ; If NE, yesa3 BIC #PS.XIN,P.FLAG(R5) ; Indicate line initializedL.20$: CALLR ISSUC ; Otherwise, return success/30$: CALLR IEABO ; Abort the function request4>40$: MOVB @IP.EXT(R3),P.RCVT(R5) ; Save receive timeout value;50$: $QPKT C.INIW ; Queue packet to initialize wait queue760$: CALLR CTINI ; Initialize controller. Initialize) ; .. will test if init already underC+ ; .. way. If so, no action is taken.B' ; .. Init complete will return I/O  ; .. done on this item.7 APR5PC XEINL ; Make sure XEINL is in APR5 addr spaceL .DSABL LSBS O" .SBTTL XETRM - Terminate channel .SBTTL XECLN - Close LUN;+; **-XETRM-Terminate channel; **-XECLN-Close LUN;c2; This routine is called to close an open channel.;- ; Inputs:i ; R3 = Address of the I/O packet; R4 = Controller State Tablei"; R5 = Address of Port State Table;lXECLN: .IF DF DEBUG. BPT .ENDCXETRM: .IF DF DEBUG. BPT .ENDC) CLR P.FLAG(R5) ; Indicate port not opene, DEC C.OPRT(R4) ; Decrement open port count4 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;L#; Return I/O requests for this portl; * MOV R3,-(SP) ; Save I/O packet for close' MOV R4,R2 ; Point to xmit wait queue  ADD #C.XMWQ,R2 ; .... CALL 20$ ; Remove I/O packets for this port* MOV R4,R2 ; Point to receive wait queue ADD #C.RCVW,R2 ; .... CALL 20$ ; Remove I/O packets for this port+ MOV R4,R2 ; Point to function wait queue  ADD #C.PFNC,R2 ; .... CALL 20$ ; Remove I/O packets for this port' MOV R4,R2 ; Point to init wait queuee00n:pof__DATADATADATADATA ADD #C.INIW,R2 ; .... CALL 20$ ; Remove I/O packets for this port- MOV (SP)+,R3 ; Restore I/O packet for closeo% CALL MPTHDR ; Map to task's headeru2 CLR @I.LN2(R3) ; Ensure no more I/O on this link- BIT #CS.OFL,C.FLAG(R4) ; Controller offline?e BNE 10$ ; yes4 MOV #IS.SUC,I.PRM+2(R3) ; Save I/O status in packet CLR I.PRM+4(R3) ; ...,4 CALLR STMLT ; Write Multicast addresses to device10$: CALLR ISSUC ; Return successs(20$: MOV (R2),R3 ; Get next I/O packet BEQ 40$ ; No more% CALL MPTHDR ; Map to task's headerO/ CMP @I.LN2(R3),R5 ; I/O packet owned by port?I BNE 30$ ; Nos MOV (R3),(R2) ; Dequeue packet MOV R2,-(SP) ; Save R2! CALL IEABO ; Abort the requestk% MOV (SP)+,R2 ; Restore list pointerr BR 20$ ; Look at next itemM)30$: MOV R3,R2 ; R2 points to next itema! BR 20$ ; Continue to next itemL"40$: RETURN ; Return after call7 APR5PC XECLN ; Make sure XECLN is in APR5 addr spaceM , .SBTTL XEXMT - Transmit data;+; **-XEXMT-Transmit data;;B; This function is called to transmit data from the physical link.;- ; Inputs: ; R3 = Address of the I/O packet9; I.PRM+1 - High byte of physical address of data buffer ;; I.PRM+2 - Low 16 bits of physical address of data buffer "; I.PRM+4 - Length of data buffer?; I.PRM+6 - Virtual address of optional characteristics buffer6; I.PRM+10- Length of optional characteristics buffer:; I.PRM+12- Virtual address of optional diagnostic buffer1; I.PRM+14- Length of optional diagnostic buffer; R4 = Controller State Tableo; R5 = Address Port State Tablel;.9; I.PRM+1 - High byte of physical address of data bufferM;; I.PRM+2 - Low 16 bits of physical address of data buffer2;LXEXMT: .IF DF DEBUGa BPT .ENDC1 CALL BFCHK ; Validate optional characteristicsM ; .. buffer BCS 70$ ; If CS, invalids- TST I.PRM+6(R3) ; Do we have an AUX buffer?e BEQ 50$ ; If EQ, none present0 CALL XMTCH ; Process transmit characteristics% BCS 20$ ; Error in characteristics* MOV P.FLAG(R5),-(SP) ; Get port flag word2 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 suppliedL0 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$ ; NoS/ MOV IP.EXT(R3),R1 ; R1 = I/O packet extension(B MOV PL.FLG(R0),IX.FCN(R1) ; Temp save protocol flags in extension1 MOV #IE.SPC&377,R0 ; Assume buffer is too largev/ CMP I.PRM+4(R3),#XMTBSZ ; Is buffer too large?e' BHI 60$ ; If HI, buffer is too largen, BIT #CS.OFL,C.FLAG(R4) ; Controller online?1 BEQ 40$ ; If EQ, yes ... initiate transmission(. MOV #IE.DNR&377,R0 ; Assume device not ready= BIT #PS.XIN,P.FLAG(R5) ; Line requires initialize function?c. 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 initialized20$: CLR R1 ; CALLR RQDON ; Post completion30$: RETURN ;440$: $QPKT C.XMWQ ; Queue packet to transmit queue# BR INIXM ; Initiate transmissiont850$: MOV #IE.BAD&377,R0 ; Return bad parameter(s) error60$: CALLR RQALT ;"70$: CLR R1 ; Zero status word 2, BR XMTDN ; Do xmit done, maybe user wants ; ... diagnostic info t& .SBTTL INIXM - Initiate transmission;+ ; **-INIXM-Initiate transmission;t@; Initiate transmission of the next available I/O packets on the; physical link.;- ; Inputs:P"; R5 = Address of port state table(; R4 = Address of controller state table;t; Registers modified:n; R0, R1, R2, R3, R4, R5;M*INIXM:: CLR -(SP) ; Set transmit counter;rP; NOTE, we must not set up transmits until the current transmits have completed.O; Setting up the transmit ring and polling the UNA during a transmit will caus00nBpoibjbkb a a aeI; the UNA to get out of sunc!!!I;I CALL MAPDRV ; Map to driver5 MOV C.XMTC(R4),R1 ; Get current transmit ring entryt+ TSTB RG.ACT(R1) ; Transmission under way?A3 BNE 30$ ; Yes, wait for interrupt to startl ; ... next transmit!t;10$: MOV C.XMWQ(R4),R3 ; Any transmit I/O packets waiting?  BEQ 30$ ; If EQ, no6 CALL GTPST ; Load R5 with Port Status Table address0 CALL XMTCH ; Process transmit characteristics& CALL GTXMH ; Get xmit header buffer. BCS 30$ ; None available, wait for xmits to ; ... completeV/ MOV C.XMWQ(R4),R3 ; Get next transmit requestr7 MOV P.XDAD(R5),(R0)+ ; Put destination address intod5 MOV P.XDAD+2(R5),(R0)+ ; ... transmit buffer header  MOV P.XDAD+4(R5),(R0)+ ;2 MOV C.PADD(R4),(R0)+ ; Put source address into5 MOV C.PADD+2(R4),(R0)+ ; ... Transmit buffer headerS MOV C.PADD+4(R4),(R0)+ ;? MOV P.XPRO(R5),(R0)+ ; Put protocol into xmit buffer headeri< MOV I.PRM+4(R3),(R0) ; Assume padding. Set byte count in ; ... transmit header2 SUB #14.,R0 ; R0 -> begin of transmit header* CALL GFXRE ; Get a transmit ring packet? MOV #14.,RG.LEN(R1) ; Put transmit buffer length in packet.;aF; NOTE - We cannot move the relocation value into the ring as this mayL; set the ownership bit and we are not ready for the UNA to take this entry.;e6 MOV RELCT+2,-(SP) ; Put relocation constant on stack MOV RELCT,-(SP) ; ... * ADD R0,(SP) ; Convert packet address to" ADC 2(SP) ; ... Unibus address.6 MOV (SP)+,RG.ADD(R1) ; Put unibus address of segment$ MOVB (SP)+,RG.AD2(R1) ; ... segment2 BIC #374,RG.AD2(R1) ; Make sure MBZ bits are off4 MOV R0,RG.VAD(R1) ; Save virtual address of header/ MOV IP.EXT(R3),R2 ; R2 = I/O packet extensioni9 BIT #LF.PAD,IX.FCN(R2) ; Protocol uses padded messages?y BEQ 20$- ADD #2,RG.LEN(R1) ; Account for byte count 20$:/ MOV R1,-(SP) ; Save header ring entry address ) CALL UMRMP ; Map user buffer with UMRss. MOV (SP)+,R0 ; Get header ring entry into r0@ MOVB #RF.STP!RF.OWN,RG.FLG(R0) ; Set start of chain and UNA own5 $DQPKT C.XMWQ ; Dequeue I/O packet from wait queueB/ MOV IP.EXT(R3),R0 ; R0 = I/O packet extensiona1 CLR IX.FCN(R0) ; Clear tranmit status save wordp' MOVB #3,I.FCN(R3) ; Set retry counter - $QPKT C.XMTP ; Queue to xmit pending queueA$ INC (SP) ; Indicate poll required BR 10$ ; Go, do next transmit30$:( TST (SP)+ ; Did we transmit anything? BNE 40$ ; Yes RETURN ; No, just return40$:+ CALL POLRG ; Do Poll Ring command to UNA(, MOV #XMTTIM,C.XMTT(R4) ; Set transmit timer CALLR CLOCK ; Start clock;m*; We get here from transmit done interrupt;p:XMTDN: TST I.PRM+12(R3) ; Do we have a diagnostic buffer? BEQ 10$ ; No3+ MOV R0,I.PRM+2(R3) ; Save I/O status codeT2 MOV R1,I.PRM+4(R3) ; Save byte count of transmit4 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 function10$: ; R0 = Status CALLR RQDON ; Do I/O done;L@; We get here from the non-DLX module after it has processed the6; function requests in the optional diagnostic buffer.;o3XDIDN: MOV I.PRM+2(R3),R0 ; R0 = Saved status code;0 MOV I.PRM+4(R3),R1 ; R1 = Characters processed CALLR RQDON ; Do I/O done .DSABL LSB0 = .SBTTL XERCV - Receive dataV;+; **-XERCV-Receive dataa;sA; This function is called to receive data from the physical link.C;- ; Inputs: ; R3 = Address of the I/O packet9; I.PRM+1 - High byte of physical address of data buffer ;; I.PRM+2 - Low 16 bits of physical address of data buffern"; I.PRM+4 - Length of data buffer?; I.PRM+6 - Virtual address of optional characteristics buffer;6; I.PRM+10- Length of optional characteristics buffer:; I.PRM+12- Virtual address of optional diagnostic buffer1; I.PRM+14- Length of optional diagnostic buffer; R4 = Controller State Tableo#; R5 = Address of port status ta00nJpof__DATADATADATADATAbleC;- .ENABL LSBXERCV: .IF DF DEBUG  BPT .ENDC4 CALL MAPBF ; Convert data buffer physical address& ; ... to bias and virtual address1 CALL BFCHK ; Validate optional characteristicsf ; .. buffer BCS 50$ ; If CS, invalida1 MOV #IE.SPC&377,R0 ; Assume buffer is too large ! CMP I.PRM+4(R3),#XMTBSZ ; Is it?-* BHI BUFERR ; If HI, buffer is too large. BIT #CS.OFL,C.FLAG(R4) ; Is the link online? BNE 10$ ; If NE, yest8 MOV #IE.VER&377,R0 ; Assume we have a delayed error to ; .. report) BIT #PS.DER,P.FLAG(R5) ; Delayed error?  BEQ 40$ ; Nob2 BIC #PS.DER,P.FLAG(R5) ; Clear delayed error bit, BR 20$ ; Return packet with delayed error910$: MOV #IE.ABO&377,R0 ; Assume fatal error in progressi2 BIS #PS.XIN,P.FLAG(R5) ; Port must be initialized20$: CLR R1 ; ...)- CALLR RQDON ; Complete the receive requeste 30$: RETURNe840$: MOVB P.RCVT(R5),I.FCN(R3) ; Set timer in I/O packet/ MOV IP.EXT(R3),R0 ; R0 = I/O packet extension ' MOV R5,IX.FCN(R0) ; Save port addresso. $QPKT C.RCVW ; Queue the receive I/O packet CALL CLOCK ; Start the clockF BR 30$ ; Return,50$: MOV R0,I.PRM+2(R3) ; Save status codes CLR I.PRM+4(R3) ; ...#;O+; We get here after the receive is completeB;#:RCVDN: TST I.PRM+12(R3) ; Do we have a diagnostic buffer? BEQ RDIDN ; No, that's it!t6 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 complete4 $QPKT C.PFNC ; Queue packet to pending function Q) CALLR FNINI ; Try to initiate function 0BUFERR: CALLR RQALT ; Return with buffer error;VD; We get here after the non-DLX functions in the optional diagnostic; buffer have been processed. ;c,RDIDN: MOV I.PRM+2(R3),R0 ; R0 = I/O status! MOV I.PRM+4(R3),R1 ; Byte countI CALLR RQDON ; Return I/O done .DSABL LSB  k( .SBTTL XECHR - Set/Get characteristics;+"; **-XECHR-Set/Get characteristics; H; This routine is called to set/get multiple characteristics to/from the,; DLC associated with this physical channel.;- ; Inputs:A ; R3 = Address of the I/O packet=; I.PRM+1 - High byte of physical address of characteristicst ; buffer?; I.PRM+2 - Low 16 bits of physical address of characteristics ; buffer-; I.PRM+4 - Length of characteristics bufferR; R4 = Controller State Table.,; R4 = Address of physical link access block;aXECHR: .IF DF DEBUGC BPT .ENDC- BIT #CS.OFL,C.FLAG(R4) ; Controller offline?/ BEQ 10$ ; Noa' CALLR IEABO ; Return with abort codew10$:4 CALL MAPBF ; Convert data buffer physical address& ; ... to bias and virtual address6 MOV #IE.ONP&377,R0 ; Assume illegal subfunction code. MOVB I.FCN(R3),R1 ; Get the subfunction code ASR R1 ; Form word indexr ASR R1 ; ...n BIT #1,R1 ; Is it odd BNE XRQALT ; Yes, no good!a0 CMP #CHMAX,R1 ; Is the subfunction code valid? BLOS XRQALT ; If LOS, no% CALLR @CHFNC(R1) ; Perform function 5XRQALT: CALLR RQALT ; Complete the request in error;;+(; Set/Get characteristics function table;-*CHFNC: .WORD STCHR ; Set characteristics$ .WORD GTCHR ; Get characteristicsCHMAX= .-CHFNC e& .SBTTL XECTL - Control QIO processor;+ ; **-XECTL-Control QIO processor; :; Controll functions are only valid during Microcode load.@; The control function is used to pass a buffer of ECO Microcode?; segments to this driver. Therefore, the driver must validate ; the following:;-$; 1. The calling task is privileged.; 2. It's name is UML...2; 3. The controller must be in initialization mode;. ; Inputs: ; R3 = Address of I/O packet&; I.PRM+2 = Micro code segment buffer; I.PRM+4 = Buffer size; R4 = Controller State Table+XECTL: .IF DF DEBUGO BPT .ENDC. CALL MAPBF ; map physical address of buffer, MOV #IE.SPC&377,R0 ; Assume buffer too big- CMP I.PRM+4(R3),#8192.-64. ; Is it too larges! BHIS 20$ ; Buffer is too larget1 MOV #IE.PRI&377,R0 ; Assume privilege violatio00nRpoibjbkb a a ans, MOV I.TCB(R3),R1 ; R1 = Task Control Block, BIT #T3.PRV,T.ST3(R1) ; Is task privileged? BEQ 20$ ; No , MOV #IE.BAD&377,R0 ; Assume bad parameters* MOV I.PRM+6(R3),R2 ; Get controller info4 CMP R2,#ENDCTB-CTABL ; Controller index reasonable? BHIS 20$ ; No, bad parameterB BIT #1,R2 ; Is it even? BNE 20$ ; No, bad parameter4 MOV CTABL(R2),R4 ; Get Controller State Table ptr.. MOV #IE.IFC&377,R0 ; Assume invalid function& CMP MLTCB,R1 ; Is tasks name MLT...?. BNE 20$ ; Invalid function for anyone else.> BIT #CS.INI,C.FLAG(R4) ; Are we initializing this controller?. BEQ 20$ ; No, then this function is invalid+ MOVB I.FCN(R3),R2 ; R2 = Load subfunctionr$ BMI 20$ ; Minus, invalid function ASL R2 ; Make it word index* CMP R2,#LOADND-LOADTB ; Valid subfunction BHIS 20$ ; No? CMP C.FUNS(R4),#FN.UML ; Is this 1st response by support task?  BNE 10$ ; NoV) CLR C.CTMR(R4) ; Clear controller timer( CLR C.CFNC(R4) ; No function is active+ CLR C.FUNS(R4) ; Clear function save word10$:$ CALLR @LOADTB(R2) ; Go to function!20$: CALLR RQALT ; Return error,*LOADTB: .WORD LODUM ; load UNA microcode .WORD ENDLOD ; End of loadr .WORD ABRTLD ; Abort loadLOADND=. ; End of table1ENDLOD: MOV #IS.SUC,R0 ; R0 = I/O success statusc CALLR RQALT ; Return(ABRTLD: CALL FTL ; Do fatal processing BR ENDLOD ; End of load 5 .SBTTL XECSC - Controller Status Change entry pointR;+/; **-XECSC-Controller status change entry point;;eA; This routine is entered from the executive when the status of aF; controller must be changed (online => offline or offline => online).;- ; Inputs:O1; R2 = KRB address for controller changing status $; R3 = CTB address for the above KRB(; (SP) = Return address for completion5; 2(SP) = Return address for intermediate completion;*; 'C' Clear = Offline => online transition*; 'C' Set = Online => offline transition;a ; Outputs:; On return through (SP):r; $SCERR = 1 if successful; $SCERR = Error code if not;e; Registers modified:e; R0, R1, R2, R3, R4, R5;l .IF DF R$$MPL ; RSX-11M-PLUSl"XECSC:: NOP ; Word for patching( MOV (SP)+,CSCRET ; Save return address ROL R1 ; Save "C" bit- CMP RELCT,#-1 ; Was controller initialized?  BNE 5$ ; Yes  MOV L.DCB(R3),R5 ; R5=DCBe MOV D.UCB(R5),R5 ; R5=UCBl MOV U.SCB(R5),R4 ; R4=SCBi) MOVB K.IOC(R2),R3 ; R3=Controller indexi CALL XELOA ; Init controllerh BCS 60$ ; Init failed, exit!c5$:l( CALL MAPDRV ; Map to 2nd 4K of driver' MOV #CTABL,R0 ; R0 = Controller table10$:% MOV (R0)+,R4 ; R4 = Next controller: BEQ 40$ ; No more, just exitM5 CMP C.KRB(R4),R2 ; Do we have the right controller?a$ BNE 10$ ; No, get next controller0 MOV R3,C.CTB(R4) ; Save CTB address for driver1 ROR R1 ; Is this offline => online transition? BCC 50$ ; Yes4 BIS #KS.OFL,K.STS(R2) ; Indicate controller offline! CALL FTL ; Do fatal processingB5 BIS #CS.STP,C.FLAG(R4) ; Indicate controller stoppedM;tA; Now, check if all controllers have stopped. If so, then return:; static UMR to system.e;c' MOV #CTABL,R0 ; R0 = controller tablei( MOV #U$$NCT,R1 ; R1 = # of controllers20$:0 MOV (R0)+,R4 ; Get next controller state table BEQ 30$ ; No more- BIT #CS.STP,C.FLAG(R4) ; Controller stopped?i BNE 20$ ; Yes' BR 40$ ; At least one still running!#;O<; All controllers have stopped. Return static UMR to system;t30$:0 .IF DF M$$EXT ; If extended memory supported?3 MOV UABKS,R2 ; Now, point to UMR assignment blocke BEQ 40$ ; No assignment block, 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 initiator850$: BIC #KS.OFL,K.STS(R2) ; Turn off offline bit in KRB. BIC #CS.STP,C.FLAG(R4) ; Turn off stop switch> MOV K.CSR(R2),C.CSR(R4) ; Save CSR in Controller Status Table0 .IF DF M$$EXT ; If ex00nZpof__DATADATADATADATAtended memory supported?+ TST UABKS ; Static UMR already assigned?Q BNE 40$ ; Already allocated CALL GSUMR ; Get static UMR .ENDC ; M$$EXT BR 40$ ; All is wellc<60$: MOV #IE.ABO,$SCERR ; Abort, driver did not have enough BR 40$ ; ... buffer space7 APR5PC XECSC ; Make sure XECSC is in APR5 addr spaceR .ENDC ; RSX-11M-PLUS B* .SBTTL FNINI - Function Initiate Routine;+:; This routine initiates a function in the function queue.;@; All non-DLX functions request in the user buffer are processedG; before control is given to the next I/O packet in the function queue.S;-FNINI: .IF DF DEBUGN BPT .ENDC# MOV #1,R3 ; Assume poll requiredV. TST C.CFNC(R4) ; Function processing active?+ BNE 40$ ; Yes, interrupt will start next  ; ... functionE7 BIT #CS.POL,C.FLAG(R4) ; Need to issue a poll command?B BEQ 10$ ; No-6 BIC #CS.POL,C.FLAG(R4) ; Indicate poll command issued) MOV #CM.PDM,R0 ; Set up primary command  CALL LODCM ; Do Poll Ringsn BR 40$ ; Set timero110$: BIT #CS.GST,C.FLAG(R4) ; Need to get status?k BEQ 20$ ; Yes" MOV #FN.RLS,R1 ; Read UNA status CALLR LODFN ; ... BR 40$ ; Set timerl20$:& $DQPKT C.PFNC ; Get next I/O packet BCS 40$ ; Nothing to do!s CLR R1 ; Clear high byte / MOV IP.EXT(R3),R0 ; R0 = I/O packet extensiond( MOVB IX.FCN(R0),R1 ; get function code BEQ 50$ ; Zero is a NOP) BMI ABORT ; No negative function codesM1 CMP R1,#FN.WML ; Write multicast list function?l BNE 30$ ; No 3 MOV R3,C.CFNC(R4) ; Save packet as current activet ; ... function flag( CALLR STMLT ; Do write multicast list(30$: CMP R1,#FN.DIG ; Non-DLX functions+ BNE ABORT ; Something must be very wrongk3 MOV R3,C.CFNC(R4) ; Save packet as current active  ; ... function flag% CALLR NDLXD ; Do non-DLX functionsV40$: RETURN ;f.50$: MOV I.PRM+2(R3),R0 ; Recover status code! MOV I.PRM+4(R3),R1 ; Byte count! CALL RQDON ; Return I/O packett& BR FNINI ; Try to get next functionABORT: .IF DF DEBUG ; If debugging BPT ; Breakf BR ABORT ; Loop on break; .IFF $ CRASH ; Some thing is very wrong .ENDC ; DEBUGB T! .SBTTL XEPWF - Device powerfail;+; **-XEPWF-Device powerfail ;cE; This routine is entered from the EXEC at powerfail recovery, systemu#; boot and device driver load time.0;- ; Inputs:R;R; For RSX-11M+;e; R3 = Controller Table (CTB)o%; R2 = Kontroller Request Block (KRB)t;B; For RSX-11Mg;n; R3 = Controller index.,; R4 = Address of Status Control Block (SCB)$; R5 = Address of Unit Control Block; ; Registers modified:i; R0, R1, R2, R3, R4, R5; XEPWF: .IF DF DEBUGT BPT .ENDC# .IF NDF R$$MPL ; If not RSX-11M+o1 CMP RELCT,#-1 ; Controller already initialized?  BNE 10$ ; Yes BR XELOA ; No, initialize itr10$: .IFF0) CMP RELCT,#-1 ; Controller initialized? BEQ XETMO ; No, just return .ENDC ; R$$MPL' MOV #CTABL,R0 ; R0 = Controller tablen( CALL MAPDRV ; Map to 2nd 4K of driver120$: MOV (R0)+,R4 ; R4 = Controller status tableC BEQ 30$ ; That is it!' CALL FTL ; Do fatal error processing BR 20$ ; Do all of them30$:- .IF DF M$$EXT ; Extended memory supported?2 CALL $MPUBM ; Reload UMR map register to 2nd 4K .ENDC ; M$$EXT;+; **-XECAN-Cancel I/O requests; **-XETMO-Device timeouto;o&; These routines perform no operation.;-#XECAN: ;;; Should this be a NOP##XETMO: RETURN ;;; Return to exec7 APR5PC XEPWF ; Make sure XEPWF is in APR5 addr spaceR R/ .SBTTL $XELOA - Initialize driver at load times;+*; **-$XELOA-Initialize driver at load time; =; This code is called at the time when the driver is loaded.o<; This code initializes the driver data structures and saves ; pointers to system data bases.;- ; Inputs:n; R3 = Controller indexT,; R4 = Address of Status Control Block (SCB)$; R5 = Address of Unit Control Block;l ; Outputs:'; Driver data structur00nbpoibjbkb a a as are initialized;!XELOA: NOP ; Room for patchingi CALL SALL ; Save registers .IF DF DEBUGz BPT .ENDC .IF DF M$$MGE;EB; Compute APR6 value. We must do this here as the initialize code; may live in the APR6 region.;5 MOV @#KISAR5,DAPR6 ; DAPR6 = Driver start addr biass" BIT #40000,#DREND ; Driver GT 4K BEQ 10$ ; Non5 ADD #200,DAPR6 ; Yes, account for 4K mapped by APR5n BR 20$ ;C10$:4 MOV #CBASE,-(SP) ; Get base of communications area# BIC #160000,(SP) ; Clear APR bits* ADD #77,(SP) ; Point past current sliver0 ASR (SP) ; Compute offset in slivers to CBASE ASR (SP) ; .... ASR (SP) ; ...  ASR (SP) ; ...  ASR (SP) ; ...r ASR (SP) ; ... $ ADD (SP)+,DAPR6 ; Add to APR5 bias;&; Compute new vertual address of CBASE; 0 MOV #CBASE,R0 ; R0 = Old virtual addr of CBASE3 BIC #177700,R0 ; R0 = Offset into 1st APR6 sliverK- BIS #140000,R0 ; R0 = Virtual addr of CBASES/ MOV R0,CVIRA ; Save new virtual addr of CBASE#,20$: CALL MAPDRV ; Map to 2nd 4K of driver .ENDC ; M$$MGE. CALL UNAIN ; Initialize UNA data structures! BCS 30$ ; Failed to initialize ) .IF NDF R$$MPL ; If "NOT" RSX-11M-PLUS.1 MOV CTABL(R3),R4 ; R4 = Controller Status TableR+ CALL GSUMR ; Assign static UMR to driverC .IFF* CLR RELCT ; Indicate driver initialized7 CLR RELCT+2 ; ... "XECSC" will init relocation value .ENDC ; R$$MPL30$: RETURN ; Return to execV9 APR5PC $XELOA ; Make sure $XELOA is in APR5 addr space; t? .SBTTL QPAKT - Queue I/O packet to specified controller queuea;+.; **-QPAKT-Queue I/O packet to specified queue;l?; Queue an I/O packet to the end of specified controller queue.R;-; Calling sequence:S; JSR R0,QPKT; .WORD ;d ; Inputs:. ; R3 = Address of the I/O packet-; R4 = Address of the controller state tablew; ; Registers modified:; None; 6QPAKT:: MOV R3,-(SP) ; Save address of the I/O packet MOV R2,-(SP) ; Save R25 MOV R4,R2 ; Copy address of Controller State TableI0 ADD (R0)+,R2 ; Compute address of the listhead*10$: MOV R2,R3 ; Save address of current$ MOV (R2),R2 ; Get address of next3 BNE 10$ ; Loop till we find the end of the queueS# MOV 2(SP),(R3) ; Link new to lasto4 CLR @2(SP) ; Clear link pointer in new I/O packet# MOV (SP)+,R2 ; Restore I/O packetl MOV (SP)+,R3 ; Restoe R2 RTS R0 ; Return 8 .SBTTL DQPAK - Dequeue I/O packet from specified queue;+?; **-DQPAK-Dequeue I/O packet from one of the controller queues ;t9; Dequeue an I/O packet from one of the I/O queues on the; controller state table.d;-; Calling sequence:2; JSR R0,DQPKTe; .WORD ;w ; Inputs:e,; R4 = Address of the controller state table;l ; Outputs: ; R3 = Address of the I/O packet"; 'C' Clear - I/O packet available+; 'C' Set - No more I/O packets availableR;R; Registers modified:B; R3; DQPAK: MOV R2,-(SP) ; Save R2. MOV R4,R2 ; Compute address of the listhead ADD (R0)+,R2 ; ...) SEC ; Assume no I/O packets availablem, MOV (R2),R3 ; Get next entry on the queue BEQ 10$ ; If EQ, none. MOV (R3),(R2) ; Unlink I/O packet from queue/ CLR (R3) ; Clear link pointer (clears C-bit) 10$: MOV (SP)+,R2 ; Restore R2  RTS R0 ; Return o. .SBTTL MPTHDR - Map to Task Header Subroutine;+); **-MPTHDR-Map to Task Header Subroutinel;; Maps APR6 to Task Header;3 ; Inputs::; R3 = I/O packet addressM;R ; Outputs:; R0 = Task Header address;A; Registers R0 changed;-MPTHDR:n+ MOV I.TCB(R3),R0 ; Get task's TCB addresst; MOV T.PCB(R0),R0 ; then PCB address for task's window 0,& ; (PCB=Partition Control Block)4 MOV P.HDR(R0),-(SP) ; Task header in primary pool?! .IF DF R$$MPL ; If RSX11M-PLUS / .IF DF M$$MGE ; Memory management supported? - BNE 10$ ; If NE, header is in primary poolb0 MOV P.REL(R0),@#KISAR6 ; Map to the task header/ .IF DF K$$DAS ; Kernel data spcae supported?4 MOV @#KISAR6,@#KDSAR6 ;00njpof__DATADATADATADATA Data space overmaps I space .ENDC ; K$$DAS4 MOV #140000,(SP) ; Task header is at offset 14000010$: .ENDC ; M$$MGE .ENDC ; R$$MPL) MOV (SP)+,R0 ; R0 = Task Header addressM RETURN ;9 APR5PC MPTHDR ; Make sure MPTHDR is in APR5 addr spaceI M- .SBTTL MAPDRV - Map APR6 to 2nd 4K of driverp;+(; **-MAPDRV-Map APR6 to 2nd 4K of driver;a; Maps 2nd 4K of driver to APR6 ;a ; Inputs:s; DAPR6;. ; Ouputs:S; None; ; Registers undisturbedM;-MAPDRV:#/ .IF DF M$$MGE ; Memory menagement supported? . MOV DAPR6,@#KISAR6 ; Map to 2nd 4K of driver/ .IF DF K$$DAS ; Kernel data space supported?$4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE RETURN ; Return to caller9 APR5PC MAPDRV ; Make sure MAPDRV is in APR5 addr spaceM a< .SBTTL ****************************************************< .SBTTL * Interrupt Handling Routines *< .SBTTL ****************************************************) .SBTTL INTTB - Interrupt Dispatch Table ;p#; INTERRUPT TRANSFER DISPATCH TABLES;;INTTB:' .WORD RCVINT ; Receive Ring Interrupt#( .WORD XMTINT ; Transmit Ring Interrupt* .WORD CMSINT ; Command Success Interrupt5 .WORD RBUINT ; Receive Buffer Unavailable Interruptu' .WORD CMINT ; Command Error Interrupt' .WORD SERINT ; Status Error Interrupt*' .WORD STCINT ; State Change InterruptnINTMSK:d% .WORD BIT13 ; Receive interrupt bit*& .WORD BIT12 ; Transmit interrupt bit% .WORD BIT11 ; Command interrupt bitD8 .WORD BIT10 ; Receive buffer unavailable interrupt bit+ .WORD BIT14 ; Command error interrupt bitn* .WORD BIT15 ; Status error interrupt bit) .WORD BIT8 ; State change interrupt bitt;u*; PRIMARY COMMAND INTERRUPT DISPATCH TABLE ; CODE .WORD RSTDN ; Reset Done -4n! .WORD SLFDN ; Self-test Done -2rCMDDTB: .WORD INTEXT ; NOP 0S# .WORD GPBDN ; Get Control Block 1.$ .WORD GCMDON ; Secondary Command 2 .WORD INTEXT ; Not used 3 .WORD STRDN ; Start 4o .WORD INTEXT ; Boot 5D .WORD INTEXT ; Not used 6 .WORD INTEXT ; Not used 7 .WORD PDMDON ; Poll Demand 10# .WORD INTEXT ; Sanity Timer On 11r$ .WORD INTEXT ; Sanity Timer Off 12& .WORD INTEXT ; Sanity Timer Reset 13 .WORD INTEXT ; Not used 14  .WORD INTEXT ; Not used 15e .WORD INTEXT ; Not used 16s .WORD INTEXT ; Stop 17 T; &; SECONDARY COMMAND INTERRUPT DISPATCH ; CODEGCM2DTB:S .WORD INTEXT ; Nop 0I- .WORD LSMDN ; Load and Start Microaddress 1o/ .WORD RDADN ; Read Default Physical Address 2t .WORD INTEXT ; Nop 3N) .WORD INTEXT ; Read Physical Address 40) .WORD ILLINT ; Write Physical Address 5O' .WORD ILLINT ; Read Multicast List 6I' .WORD WMLDN ; Write Multicast List 7T) .WORD ILLINT ; Read Ring Descriptor 10u) .WORD WRGDN ; Write Ring Descriptor 11.# .WORD ILLINT ; Read Counters 12E+ .WORD ILLINT ; Read and Clear Counters 13C .WORD ILLINT ; Read Mode 14N .WORD WMEDN ; Write Mode 15d% .WORD RLSDON ; Read Line Status 16 . .WORD ILLINT ; Read and Clear Line Status 17) .WORD ILLINT ; Dump Internal Memory 20l( .WORD LOADN ; Load Internal Memory 21# .WORD ILLINT ; Read System ID 22 $ .WORD ILLINT ; Write System ID 23% .WORD ILLINT ; Read Load Server 24;& .WORD ILLINT ; Write Load Server 25( .WORD ILLINT ; Diagnostic function 260 .WORD MLTMO ; No response from microcode ldr27 a;o;; Secondary command interrupt dispatch table for diagnostic >; functions interrupt service dispatch. The driver determines@; to use this table by looking at the subfunction byte in C.FUNS?; If the sign bit is set, the function is a diagnostic functionO); and this table is used for dispatching.L ; CODEsCM2NDT:3 .WORD INTEXT ; Nop 0d. .WORD ILLINT ; Load and Start Microaddress 1/ .WORD DRADN ; Read Default Physical Address 2. .WORD INTEXT ; Nop 3r( .WORD DRPDN ; Read Physical Address 4( .WORD DWADN ; Write Physical Address 5& .WORD DMLDN00nrpoibjbkb a a a ; Read Multicast List 6( .WORD ILLINT ; Write Multicast List 7) .WORD ILLINT ; Read Ring Descriptor 10y* .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 15N$ .WORD DRSTD ; Read Line Status 16- .WORD DRCSD ; Read and Clear Line Status 17) .WORD ILLINT ; Dump Internal Memory 20 ) .WORD ILLINT ; Load Internal Memory 21r" .WORD DRSID ; Read System ID 22# .WORD DWSID ; Write System ID 23L$ .WORD DRSDN ; Read Load Server 24% .WORD DWSAD ; Write Load Server 25. I& .SBTTL UNAI - UNA Interrupt Routine;+; #; **- UNAI - UNA INTERRUPT HANDLING ;dH; The conditions that can cause an interrupt are checked, and a dispatchK; made to handle each interrupt present. The order of interrupt handling isd; shown below:; Receive Ring Interruptm; Transmit Ring Interrupt; Command Success Interrupt'; Receive Buffer Unavailable Interrupt ; Command Error Interrupt; Software Error Interrupt ; State Change interruptD;SJ; The interrupt service entry will set CS.INT in the controller flag word.M; This bit indicates that an interrupt has taken place and enables the driveraD; to service all interrupts before it processes the receive buffers.;r; INPUT:; PCSR0 Interrupt Bits Set;i; OUTPUT TO INTERRUPT ROUTINES:e; R4 = Controller State Tablei; All registers availablec;s;-UNAI:;R ; Do some interrupt housekeeping;- INTSE$ XE,PR5,U$$NCT ;;; Dev.name, priorityn) .IF NDF R$$MPL ;;; If NOT RSX-11M-PLUSh MOV U.SCB(R5),R4 ;;; R4 = SCBC, MOV S.CON(R4),R4 ;;; R4 = Controller index .ENDC ;;; R$$MPL MOV R4,-(SP) ;;; Save R47 MOV CTABL(R4),R4 ;;; R4 = Controller State Table Addrs6 BIS #CS.INT,C.FLAG(R4) ;;; Indicate interrupt occured7 MOV U.SCB(R5),R4 ;;; Point to Controller Status Blockn$ CLRB S.CTM(R4) ;;; Disable timeout0 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 R41" RETURN ;;; Exit from interrupt310$: MOV (SP)+,(R4) ;;; Put saved R4 in Fork Blockx* CALL $FORK1 ;;; Create a system process MOV U.SCB(R5),R0 ; R0 = SCB;: CLR S.FRK+2(R0) ; Free fork block for further interrupts .IF DF DEBUGt BPT .ENDC8 MOV CTABL(R4),R4 ; R4 = Controller State Table Address7 BIC #CS.INT,C.FLAG(R4) ; Clear interrupt seen flag bit ( CALL MAPDRV ; Map to 2nd 4K of driver3 MOV R0,-(SP) ; Save registers not saved by INTSX$n MOV R1,-(SP) ; ... MOV R2,-(SP) ; ... MOV R3,-(SP) ; ...& MOV C.CSR(R4),R0 ; Get PCSR0 address. MOV (R0),-(SP) ; Get PCSR0 contents on stack; MOVB 1(SP),1(R0) ; Clear all interrupt bits that were set2; '; Cycle through the possible interrupts;.+ CLRB (SP) ; Just keep the interrupt bitsR% CLR R0 ; Initialize index registers20$:< BIT INTMSK(R0),(SP) ; Is this the reason for the interrupt BEQ 30$ ; If EQ, No...  MOV R0,-(SP) ; Save R0* CALL @INTTB(R0) ; Call interrupt routine MOV (SP)+,R0 ; Restore R0 .30$: TST (R0)+ ; Bump pointer to next reason- BIC INTMSK-2(R0),(SP) ; Clear out old reason0' BNE 20$ ; If NE, Still more bits setC;a,; All interrupts handled - dismiss interrupt;hL; At this point the driver tests if there are some received messages waiting; to be processed.;i"; o If not, the driver just exitsK; o Otherwise, the driver tests if another interrupt has taken place while %; servicing the current interrupt.B;)F; o If yes, just exit current interrupt. Next interrupt will process!; the received messages.C; o If their had not been an interrupt while servicing the currenttH; interrupt, the driver will finish processing the received messages.; : BIT #CS.ENP,C.FLAG(R4) ; Did we see a receive end packet? BEQ 40$ ; Noo, BIT #CS.INT,C.FLAG(R4) ; Interrupt pending?0 BNE 40$ ; Yes, let next interrupt process the ; ... received messages.h) CALL RCCMP 00nzpof__DATADATADATADATA ; process received messagesB6 CALL GTRBF ; Make sure all entries have rcv buffers,40$: TST (SP)+ ; Restore the stack pointer" MOV (SP)+,R3 ; Restore registers MOV (SP)+,R2 ; ... MOV (SP)+,R1 ; ... MOV (SP)+,R0 ; ...& RETURN ; Exit interrupt processing9 APR5PC $XEINT ; Make sure $XEINT is in APR5 addr spacee c/ .SBTTL RCVINT - Receive Ring Interrupt Handler ;+; -; **- RCVINT - RECEIVE RING INTERRUPT HANDLERp;e?; This routine is called when a receive ring interrupt has beeneH; detected. The ring is checked for the next current ring entry. If none; exist the routine exits.;tE; If a buffer has been received, the ring info is saved in the buffer.C; header and the buffer is queued for receive done processing. Ande1; the ring is scanned for another receive packet.E; C; The ring is emptied. All interrupts serviced before the receivedp; messages are completed. ;I ; INPUTS:E%; R4 = Controller State Table addressu;e;-RCVINT:e; $; Loop to retreive the receive chain;t010$: CALL GCRRE ; Get receive done ring packet& BEQ 50$ ; No more completed entries BCC 20$ ; No errors. CALL CHKERR ; Check if we have a real error BCC 20$ ; All is well) MOV R4,R2 ; Generate error packet addrn ADD #C.LOG,R2 ; ...e2 MOV #ER.RCV,E.TYPE(R2) ; Put error code in packetA MOV RG.AD2(R1),E.FLG(R2) ; Put Ring's flag word in packet ;DC533e< MOV RG.RLN(R1),E.ERR(R2) ; Put error word in packet ;DC533& MOV C.CSR(R4),R0 ; Get CSR ;DC5339 MOV (R0),E.CSR0(R2) ; Put PCSR0 in error packet ;DC533e9 MOV 2(R0),E.CSR1(R2) ; Put PCSR1 in error packet ;DC533s+ CLR R3 ; No associated I/O packet ;**-2C% CALL ERLOG ; Log the receive error 20$:7 MOV RG.VAD(R1),R3 ; R3 = Virtual address of rec.buff.A5 MOVB RG.FLG(R1),M.ERR(R3) ; Save error word of entryo6 MOVB RG.ERR(R1),M.ERR+1(R3) ; Save ring error by also< MOV RG.RLN(R1),M.MLEN(R3) ; Save length of received message5 $QPKT C.RCVD ; Queue buffer for receive completionR4 BITB #RF.ENP,RG.FLG(R1) ; Did we get an end packet? BEQ 30$ ; NoM> BIS #CS.ENP,C.FLAG(R4) ; Indicate, we have seen an end packet30$:" CALL RLPKT ; Release ring entry BR 10$ ; Get the rest450$: CALLR GTRBF ; Refresh the receive buffer ring o( .SBTTL CHKERR - Check out receive error;+$; **-CHKERR- Check out receive error;MF; This routine makes sure that, in fact, there is an error. There are9; two conditions under which a CRC error is not an error:r;r; 1. Loop back mode>; 2. The transmitting controller is the receiving controller.;;E; In the above cases, the controller is merely saying that no CRC was0 ; generated.; ; Inputs:i; R1 = Receive ring entryh;e ; Outputs:!; C-bit set on real error presentb; C-bit clear for no error;R; Registers not disturbed;->CHKERR: BITB #RF.ENP,RG.FLG(R1) ; Is this an end ring entry?0 BEQ 10$ ; Only end entry has correct statusD BITB #RF.FRM!RF.OFL,RG.FLG(R1) ; Frame Error or Message overflow?& BNE 30$ ; Yes, that is real errorG BITB #/400,RG.ERR(R1) ; Buffer length error or Unibust2 BNE 30$ ; ... time out error. That is error!4 BIT #MD.LOO,C.MODE(R4) ; Are we in loopback mode?+ BNE 10$ ; Yes, we always get CRC error  ; ... in loopback mode.9 MOV C.STRT(R4),R0 ; Get 1st buffer of current receive1' BEQ 30$ ; None found, assume error$; E; It is possible that C.STRT(R4) does not contain the starting buffer K; for the currently received message. If there was no start entry receivedBG; for this message, then the message will be dicarded by RCCMP routine.B;3C CMP C.PADD(R4),M.SADD(R0) ; Was message transmitted by this UNA?4 BNE 30$ ; Nop& CMP C.PADD+2(R4),M.SADD+2(R0) ; Well? BNE 30$ ; No 0 CMP C.PADD+4(R4),M.SADD+4(R0) ; Well? ;DC533 BNE 30$ ; No ;**-1 710$: BICB #RF.ERR!RF.CRC,RG.FLG(R1) ; Clear error bits CLC ; Indicate good return20$: RETURN ;%30$: SEC ; Indicate error returnv BR 20$ ; Return o0 .SB00npoibjbkb a a aTTL XMTINT - Transmit Ring Interrupt Handler;+;e.; **- XMTINT - TRANSMIT RING INTERRUPT HANDLER;D@; This routine is called when a transmit ring interrupt has beenF; generated. The ring is checked for the next completed entry. If none; exists the routine exits.R;;C; If an entry is found the entry is checked for any errors. ErrorsCF; are logged by the driver. If the transmit was error free the statusG; code is saved in the I/O packet at I.PRM and processing of the packet ; continues.;B ; INPUTS:-; R4 = Controller State Tabler;;-XMTINT: ;I2; Loop to retreive the next transmit chain on ring;e610$: CALL GCXRE ; Get next completed xmit ring entry& BEQ 70$ ; No more completed entries% MOV C.XMTP(R4),R3 ; R3 = I/O packete BCC 20$ ; Successful transmit3 MOV R4,R2 ; Generate pointer to error log packetC ADD #C.LOG,R2 ; ...r2 MOV #ER.XMT,E.TYPE(R2) ; Put error code in packetA MOV RG.AD2(R1),E.FLG(R2) ; Put Ring's word byte in packet ;DC533e< MOV RG.RLN(R1),E.ERR(R2) ; Put error word in packet ;DC533& MOV C.CSR(R4),R0 ; Get CSR ;DC5339 MOV (R0),E.CSR0(R2) ; Put PCSR0 in error packet ;DC533 9 MOV 2(R0),E.CSR1(R2) ; Put PCSR1 in error packet ;DC533c* CALL ERLOG ; Log transmit error ;**-2320$: MOV IP.EXT(R3),R2 ; R2 = I/O packet extensionR6 BISB RG.ERR(R1),IX.FCN+1(R2) ; Save error status bits! BISB RG.FLG(R1),IX.FCN(R2) ; ...(" CALL RLPKT ; Release ring entry/ BITB #RF.STP,RG.FLG(R1) ; Was this start entryt 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?  BEQ 10$ ; Noc@ MOV #XMTTIM,C.XMTT(R4) ; Assume xmit not active, restart timer.= MOV (R3),C.XMTP(R4) ; Remove I/O packet from xmit pending Q. BNE 40$ ; More in ring?' CLR C.XMTT(R4) ; Clear transmit timer(40$:0 .IF DF M$$EXT ; If extended memory supported?) MOV RG.UMR(R1),R2 ; R2 = UMR wait block ) ADD #10,R2 ; R2 = UMR assignment blockr MOV R3,-(SP) ; Save R3 CALL $DEUMR ; Deassign UMR. MOV (SP)+,R3 ; Restore R3i MOV C.UCB(R4),R0 ; R0 = UCBG5 MOV U.UCBX+6(R0),@RG.UMR(R1); Free up UMR wait blockT" MOV RG.UMR(R1),U.UCBX+6(R0) ; ... .ENDC ; M$$EXT;3; Got the whole transmit chain;r4 MOV R4,-(SP) ; Save controller state table pointer+ ; ... we have to do this in case GTPSTF ; ... distroys it1 CALL GTPST ; Restore Port Status Table pointerU7 MOV (SP)+,R4 ; Restore controller state table pointerr TST R5 ; Port closed? BNE 45$ ; NoD& CALL IEABO ; Yes, abort the request BR 10$ ; Complete next item45$:! MOV #IS.SUC,R0 ; Assume success ! MOV I.PRM+4(R3),R1 ; Byte count,/ MOV IP.EXT(R3),R2 ; R2 = I/O packet extensiono BIT #RF.ERR,IX.FCN(R2) ; Error? BEQ 60$ ; Nov1 BIT #RE.RTY,IX.FCN(R2) ; Retry due to collisionse BEQ 50$ ; Nos) DECB I.FCN(R3) ; Should we try it againS BEQ 50$ ; Not: MOV C.XMWQ(R4),(R3) ; Yes, insert at front of wait queue MOV R3,C.XMWQ(R4) ; ...T BR 10$ ; Go, do nextE*50$: MOV #IE.ABO&377,R0 ; R0 = Abort code CLR R1 ; R1 = 0 byte countx/60$: CALL XMTDN ; Do transmit done processing BR 10$ ; Do next if any.70$: CALLR INIXM ; Try to start up transmits o2 .SBTTL CMSINT - Command Success Interrupt Handler0 .SBTTL CMEINT - Command Error Interrupt Handler;+;Q0; **- CMSINT - Command Success Interrupt Handler.; **- CMEINT - Command Error Interrupt Handler;eB; These routines are called when a command done interrupt has beenK; detected. If the command completes with success the C-Bit is cleared upon I; entry to the command done routines. If the command completes with error0;; the C-Bit is set when entering the command done routines.t;sF; The command function (C.FUNS=Primary/secondary func code) is used toF; dispatch to the command done routine. If the sign bit is set in theH; function code indicates the command was issued by the non-DLX functionG; processor and CM2NDT table00npof__DATADATADATADATA is used to dispatch to the done processor.n; ; INPUTS:f; R4 = Controller State Tablec5; C.CFNC = Address of I/O packet for current functiond+; C.FUNS = Primary/Secondary function codesr;- .ENABL LSB CMSINT: ;e; Command success interrupts;* CLR R0 ; Set up "ROL R0" for zero C-bit BR 10$ ; Join common code;i(; Command error interrupt (also timeout);iCMINT:5 MOV #100000,R0 ; Set up "ROL R0" for non-zero C-bit 10$:+ CLRB C.CTMR(R4) ; Clear any pending timerN, MOV C.CFNC(R4),R3 ; Get I/O packet address- CLR C.CFNC(R4) ; Clear I/O packet save word 0 MOVB C.FUNS(R4),R1 ; Get primary function code, BIC #100000,R1 ; Make sure sign bit is off ASL R1 ; Make it word index ROL R0 ; Set/Clear C-bitc) CALLR @CMDDTB(R1) ; Dispatch to routine *INTEXT: RETURN ; Used for commands with ; ... no completion routine;s; Secondary command dispatch;0GCMDON: ROR R0 ; Save C-bitn1 CALL GTPST ; Restore Port Status Table pointere* MOVB C.FUNS+1(R4),R1 ; Get function byte( BMI 20$ ; Must be diagnostic function ASL R1 ; Make it word index ROL R0 ; Set/Clear C-bito' JMP @CM2DTB(R1) ; Dispatch to routine &20$: BIC #177600,R1 ; Clear sign bits ASL R1 ; Make it word index/ .IF DF M$$MGE ; Memory management supported?T3 MOV C.KIR6(R4),@#KISAR6 ; Map to diagnostic bufferp/ .IF DF K$$DAS ; Kernel data space supported?4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE ROL R0 ; Set/Clear C-bity, MOV C.DGBP(R4),R0 ; Restore buffer pointer( JMP @CM2NDT(R1) ; Go to done processor9 APR5PC GCMDON ; Make sure GCMDON is in APR5 addr space .DSABL LSB7;+; **-PDMDON- Poll Demand Done ;eD; This routine clears the C.CFNC flag and the CS.POL flag bit in theB; controller flag word (C.FLAG) and passes control to the function; processor (FNINI).;s ; INPUTS:; R4 = Controller State Tablep; PDMDON:I BCS 10$ ; Fatal1 CALLR FNINI ; Try to initiate another functiona10$: CALLR FTL ; Fatal error u5 .SBTTL RBUINT - Receive Buffer Unavailable Interrupt;+; 3; **- RBUINT - Receive Buffer Unavailable Interrupt;SE; This routine is called when a buffer unavailable interrupt has beene7; generated. The event is logged via the error logger.t;l ; INPUTS:d; R4 = Controller State Table ; ; REGISTERS MODIFIED:F ; R0,R1,R2;N;-7RBUINT: MOV R4,R2 ; Generate error log packet pointer$ ADD #C.LOG,R2 ; ...I2 MOV #ER.RBU,E.TYPE(R2) ; Put error code in packet& MOV C.CSR(R4),R0 ; Get CSR ;DC5339 MOV (R0),E.CSR0(R2) ; Put PCSR0 in error packet ;DC533*9 MOV 2(R0),E.CSR1(R2) ; Put PCSR1 in error packet ;DC533s# CLR R3 ; No I/O packet ;DC533a* CALL ERLOG ; Log the error %%% ;DC533 ;**-2 + CALL GTRBF ; Refresh receive buffer ring=" BNE 10$ ; We added some buffers6 RETURN ; No receive buffs, return from int service410$: CALLR POLRG ; Tell UNA to get receive buffers I/ .SBTTL SERINT - Status Error Interrupt Handlerk/ .SBTTL STCINT - State Change Interrupt Handler(* .SBTTL ILLINT - Illegal Interrupt Handler;+;*-; **- SERINT - Status Error Interrupt Handlerc-; **- STCINT - State Change Interrupt Handler3(; **- ILLINT - Illegal Interrupt Handler;3G; These routines are called as a result of the corresponding interrupts$J; being generated. The error is logged. These error are considered fatal.;i ; INPUTS:C; R4 = Controller State Tabler;i; REGISTERS MODIFIED:T ; R0,R1,R3;u;-SERINT:p;a0; Queue up a control request to read line status;e7 BIS #CS.GST,C.FLAG(R4) ; Indicate get status in C.FLAG ) CALLR FNINI ; Try to do the Get Statusc; -; We get here after the Read Status interrupt ; 2RLSDON: BIT #1,R3 ; Is this driver's get status?' BEQ 10$ ; Go to normal service entryp/ BIC #CS.GST,C.FLAG(R4) ; Clear Get Status flagi/ MOV R4,R2 ; Generate eror log packet pointer ADD #C.LOG,R2 ; ...r; MOV #ER.SER,E.TYPE(R2) ; Put status error code into packetu00npoibjbkb a a a5 MOV C.PCBP(R4),R0 ; R0 = Port Control Block pointere1 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 CSR1 MOV (R0),E.CSR0(R2) ; Put PCSR0 in error packeta1 MOV 2(R0),E.CSR1(R2) ; Put PCSR1 in error packetC CLR R3 ; No I/O packet  CALL ERLOG ; Log the error;& CALLR FTL ; Do UNA fatal processing810$: CALLR RLSDN ; Go to Read Status interrupt serviceSTCINT:oILLINT:/ BIT #CS.OFL,C.FLAG(R4) ; Is controller online?n BEQ 10$ ; Yes RETURN ; 10$: MOV C.CSR(R4),R0 ; Get CSR, MOV R4,R2 ; Generate error packet pointer ADD #C.LOG,R2 ; ...R2 MOV #ER.STC,E.TYPE(R2) ; Put error type in packet/ MOV (R0),E.CSR0(R2) ; PCSR0 into error packet)/ 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 R .SBTTL CLOCK - Clock Routine;+; **-CLOCK-Clock Routine;C?; This routine performs all the timing services for the driver.;;-;: ; Inputs:R; R4 = Controller State Table;:; C.CTMR = Controller Timer. Times out command functions.!; C.XMTT = Transmit timeout timere+; C.RCVW = I/O packet in receive wait queueo; I.FCN holds timeout valueR;2 ; Outputs:A; None zero timers are decremented. Each timer that goes to zero ?; will cause a specific timeout service routine to be executed.;RA; If the wait time of receive I/O packets has expired, the packet@; is removed from the receive wait list and I/O done with IE.TMO!; status is returned to the user.e;t; (CLOCK:: TSTB CLKFG ; Is clock running? BNE 30$ ; Yes, just exit.( TST CLKBK ; Do we have a clock block? BNE 20$ ; Yes110$: MOV #C.LGTH,R1 ; R1 = Length of clock block ' CALL $ALOCB ; Allocate a clock blockt BCS 10$ ; Not available, MOV R0,CLKBK ; Save address of clock block20$:) INCB CLKFG ; Indicate clock is runninge! MOV CLKBK,R0 ; R0 = Clock Block,2 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 R54 MOV R4,R5 ; R5 = Identifier (Contr.State Tbl.Ptr)) MOV #C.SYST,R4 ; Declare system routine;3 CALL $CLINS ; Request insertion into clock queuet MOV (SP)+,R5 ; Restore R5; MOV (SP)+,R4 ; Restore R4 !30$: RETURN ; Return to caller:;C'; We get here after clock queue timeoutM;CCLKTMO:;( CALL MAPDRV ; Map to 2nd 4K of driver2 MOV #CTABL,CTPTR ; Save controller table pointer1 MOV @CTPTR,R4 ; Get next contr. state table ptro0 CLR CACUM ; Clear controller time accumulator10$:# TSTB CLKFG ; Clock been stopped?. BEQ 80$ ; Yes, just exit., MOV C.UCB(R4),R0 ; R0 = Unit Control Block. MOV U.DCB(R0),R0 ; R0 = Device Control Block# TST D.DSP(R0) ; Driver in memory?s BEQ 80$ ; No, just exit.t% TST C.CTMR(R4) ; Command timer set?  BEQ 30$ ; Nou$ DEC C.CTMR(R4) ; Dec command timer BNE 20$ ; No timeout yet#, CALL CMINT ; Execute timeout for commands:20$: BIS C.CTMR(R4),CACUM ; Accum.time for clock insertion*30$: TST C.XMTT(R4) ; Transmit timer set? BEQ 50$ ; No ! DEC C.XMTT(R4) ; Dec xmit timerY BNE 40$ ; No timeout yetR' CALL FTL ; Do fatal error processingD% CLR CACUM ; Clear time accumulator BR 80$ ; Do next controller:40$: BIS C.XMTT(R4),CACUM ; Accum.time for clock insertion550$: MOV R4,R3 ; Generate pointer to receive wait Qc ADD #C.RCVW,R3 ; ...60$:/ MOV R3,R2 ; Save privious I/O packet pointero, MOV (R3),R3 ; Get next I/O packet in list BEQ 80$ ; No more* TSTB I.FCN(R3) ; I/O packet's timer set? BEQ 60$ ; No, don't bother it! DECB I.FCN(R3) ; Dec timer byteN BEQ 70$ ; not yet timed out7 BISB I.FCN(R3),CACUM ; Accum.time for clock insertionu# BR 60$ ; Process next I/O packetr.70$: MOV (R3),(R2) ; Dequeue packet from list- MOV R2,-(SP) ; Save privious packet pointer ! MOV #IE.TMO,R0 ;00npof__DATADATADATADATA Timeout status  CLR R1 ; ...V' CALL RQDON ; Return timeout I/O donee( MOV (SP)+,R2 ; Restore privious packet$ MOV R2,R3 ; Make privious current& BR 60$ ; Do next I/O packet in list80$:* ADD #2,CTPTR ; Point to next controller4 MOV @CTPTR,R4 ; R4 = Next controller's state table, BNE 10$ ; Process next controllers timers3 CLRB CLKFG ; Assume timers done for this contrl.M" TST CACUM ; Any more timers set# BEQ 90$ ; Yes, restart the clocks CALL CLOCK ; Restart clockR90$: RETURN ; Return to exec.9 APR5PC CLKTMO ; Make sure CLKTMO is in APR5 addr space; e. .IF DF E$$DVC ; Device error log supported? .SBTTL ERLOG - Error Loggerk;+; **-ERLOG-Error loggerT; ; Interface to $LOGERl; ; Inputs:,7; R3 = Address of I/O packet (or zero if no I/O packet)o; R4 = Controller State TableC; ; Outputs:; None; ; All registers preservedT;C'ERLOG: CALL SALL ; Save all registersY, MOV C.UCB(R4),R5 ; R5 = Unit Control Block. MOV U.SCB(R5),R4 ; R4 = Status Control Block7 CLRB S.ROFF(R4) ; 0 offset to 1st reg of err.log.pkt.;@ MOV #/2,S.RCNT(R4) ; Save # of reg. to copy for err.log- MOV #E.SIZE,R1 ; R1 = Error log packet sizer1 MOV R3,S.PKT(R4) ; Save I/O packet for err.log.s% BNE 10$ ; We do have an I/O packetr" CLR R4 ; No I/O packet, no SCB.;t&; R1 = Error log packet size in bytes/; R3 = I/O packet address (0 if no I/O packet) ; R4 = SCB (0 if no I/O packetB ; R5 = UCB ;n.10$: CALL $LOGER ; Attempt to log err packet' BCS 40$ ; Unable to log error packetf MOV U.SCB(R5),R4 ; R5 = SCB; CLR R2 ; Get ready for BISB. BISB S.RCNT(R4),R2 ; R2 = Word count to copy. MOV 2(SP),R0 ; Generate error packet pointer ADD #C.LOG,R0 ; ...t> MOV C.MODE-C.LOG(R0),E.MODE(R0) ; Save current mode in packet520$: MOV (R0)+,(R1)+ ; Copy data to error log packetk DEC R2 ; ... 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 log540$: MOV 2(SP),R2 ; Generate pointer to error packet  ADD #C.LOG,R2 ; ... 1 MOV #/2,R3 ; Error packet size in wordsu50$: CLR (R2)+ ; Zero packet DEC R3 ; ...t BNE 50$ ; ...4 CALL MAPDRV ; Make sure we are mapped to driver's, RETURN ; ... APR6 space before returning7 APR5PC ERLOG ; Make sure ERLOG is in APR5 addr space2 .IFF..ERLOG: RETURN ; NOP if no error log support .ENDC ; E$$DVC I! .SBTTL RCCMP - Receive completeL;+; **-RCCMP-Receive completeM;2K; This routine is called after all the interrupts have been serviced. ThisEJ; routine scans the receive complete pending queue for a complete message.H; Upon finding a complete message, the destination is found and the data ; transfered to the user buffer.;- ; Inputs:e; R4 = Controller State Table ;e; Registers modified:a; R0, R1, R2, R3;.RCCMP: CALL MAPDRV ; Map to 2nd 4K of driver CLR R1 ; Init error status.9 MOV #-<6+6+2>,C.RML(R4) ; Assume normal receive overheadm10$:9 MOV C.RCVD(R4),R5 ; Get first item of received messagese BEQ 60$ ; No more, Just exit.+ BITB #RF.STP,M.ERR(R5) ; Start of message?a BNE 30$ ; YesC MOV (R5),C.RCVD(R4) ; No, deque receive buffer from received list < MOV C.RBFL(R4),(R5) ; Insert buffer in free receive buffer MOV R5,C.RBFL(R4) ; ... list! BR 10$ ; Find start of message 20$:' MOV (R5),R5 ; Get next message block - BEQ 60$ ; No more, wait for rest to arrive#30$:9 BITB #RF.ENP,M.ERR(R5) ; Is this the end of the message?C BEQ 20$ ; Noe/ BIC #170000,M.MLEN(R5) ; Clear high order bits / 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?F) BNE 50$ ; Discard messages with errors 6 MOV C.RCVD(R4),R5 ; Get buffer with protocol/address) MOV R4,R1 ; Point to protocol listheadt ADD #C.PROL,R1 ; ...940$: MOV (R1),R1 ; Get addr of next protocol list entryR00npoibjbkb a a a BNE 70$ ; If NE, we have one $50$: CALLR 210$ ; ... else no more60$: CALLR 200$ ; Just returni70$: CMP PL.PRO(R1),M.PRO(R5). BNE 40$ ; If NE, keep looking* MOVB PL.FLG(R1),R0 ; Save protocol flagsE MOV PL.EXC(R1),R3 ; Assume this is an exclusive or default protocol  BIT #LF.EXC,R0 ; Is it?r BNE 100$ ; If NE, it is2 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?C* BEQ 50$ ; If EQ, no ... toss the packet- BR 100$ ; Process packet for default ownerRF90$: 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$ ;0 MOV AD.PRT(R1),R3 ; Get address of owning port5100$: BIT #1,M.DADD(R5) ; Was this message sent to ae ; ... multicast address?e BEQ 120$ ; If EQ, noF' MOV R3,R1 ; Get pointer to multicast5- ADD #P.MCST,R1 ; ... address chain listhead 5110$: MOV (R1),R1 ; Get pointer to next multicast5 ; ... address block BEQ 50$ ; If EQ, no more8@ CMP M.DADD(R5),ML.ADD(R1) ; Compare message multicast address. BNE 110$ ; ... to the multicast addresses- CMP M.DADD+2(R5),ML.ADD+2(R1) ; ... enabled.  BNE 110$ ;n CMP M.DADD+4(R5),ML.ADD+4(R1) ; BNE 110$i120$:g2 BIT #LF.PAD,R0 ; Does this protocol use padding? BEQ 130$ ; If EQ, noR9 MOV M.DATA(R5),C.RML(R4) ; yes, first word is byte counta8 MOV #2,C.POVH(R4) ; Account for byte count in 1st word ; ... of message; H; At this point we have found the destination port. Now we have to find+; the I/O packet associated with that port.s;B130$: % MOV R3,R5 ; Put port address in R5C* MOV R4,R3 ; Generate receive wait Q ptr ADD #C.RCVW,R3 ; ...140$:+/ MOV R3,R2 ; Save privious I/O packet pointerF$ MOV (R3),R3 ; Get next I/O packet, BEQ 50$ ; None there, discard the message/ MOV IP.EXT(R3),R1 ; R1 = I/O packet extensionV4 CMP IX.FCN(R1),R5 ; I/O packet owned by this port? BNE 140$ ; Loop till foundt$ MOV (R3),(R2) ; Dequeue I/O packet;oF; We found the owner of the message. Now we must transfer the message; to the user buffer. ;P2 MOV #IE.DAO&377,-(SP) ; Assume data overrun error0 MOV I.PRM+4(R3),R1 ; Get size of user's buffer8 CMP C.RML(R4),R1 ; Is data block > than user's buffer? BHI 150$ ; If HI, yes MOV C.RML(R4),R1 ; get count. MOV #IS.SUC&377,(SP) ; ... and return success8150$: MOV R1,C.RML(R4) ; Save byte count for completion- MOV R1,-(SP) ; Save byte count for I/O doneV/160$: MOV R3,-(SP) ; Save registers R3, R4, R5t MOV R4,-(SP) ; ..g MOV R5,-(SP) ; ..f$ MOV C.RCVD(R4),R0 ; Get 1st buffer2 ADD #M.DADD,R0 ; Point to destination addr field5 MOV (R0)+,P.RDAD(R5) ; Save destination addr in port MOV (R0)+,P.RDAD+2(R5) ; ...o MOV (R0)+,P.RDAD+4(R5) ; ...10 MOV (R0)+,P.RSAD(R5) ; Save source addr in port MOV (R0)+,P.RSAD+2(R5) ; ...n MOV (R0)+,P.RSAD+4(R5) ; ...C2 MOV (R0)+,P.RPRO(R5) ; Save protocol addr in port* MOV R4,R5 ; R5 = Controller State Table170$:3( CALL MAPDRV ; Map to 2nd 4K of driver5 MOV #M.DBSZ,R0 ; R0 = Byte count (assume full buff), SUB C.POVH(R5),R0 ; ...#3 CMP R0,C.RML(R5) ; Less than full receive buffer?+ BLO 180$ ; No1 MOV C.RML(R5),R0 ; Yes, use byte count in C.RML 3180$: SUB R0,C.RML(R5) ; Account for current blockR! MOV DAPR6,R1 ; Source APR5 biasM) MOV C.RCVD(R5),R2 ; Source displacementA6 MOVB M.ERR(R2),-(SP) ; Save START/STOP bits on stack/ ADD #M.DATA,R2 ; Point to data area of buffere4 BITB #RF.STP,(SP)+ ; Is this 1st buffer of message BNE 185$ ; YesR= SUB #M.DATA-M.DADD,R2 ; No, so data starts where destination = ADD #M.DATA-M.DADD,R0 ; Account for added data in this blockBA SUB #M.DATA-M.DADD,C.RML(R5); Subtract added data from remainder0 BGE 185$ ; We have not exceeded the remainder4 ADD C.RML(R5),R00npof__DATADATADATADATA0 ; Adjust byte count of this block+ CLR C.RML(R5) ; Indicate this block is it(.185$: ; ... address is in the first buffer MOV R0,-(SP) ; Save byte count3 ADD C.POVH(R5),R2 ; Add padding overhead, if any.f! SUB #20000,R2 ; Biased for APR5#6 CLR C.POVH(R5) ; Padding overhead only for 1st block/ MOV I.PRM+2(R3),R4 ; Destination displacementn& MOV @I.PRM(R3),R3 ; Destination APR6 CALL $BLXIO ; Copy the data MOV (SP)+,R0 ; Get byte countx' MOV 4(SP),R3 ; Get I/O packet address;/ ADD R0,I.PRM+2(R3) ; Increment buffer pointer 8 MOV C.RCVD(R5),R0 ; Dequeue buffer From receive done Q' BEQ 230$ ; Something is wrong, stop!y9 MOV (R0),C.RCVD(R5) ; Dequeue buffer from received lista2 MOV C.RBFL(R5),(R0) ; Insert buffer in free list MOV R0,C.RBFL(R5) ; ...y. BIT #RF.ENP,M.ERR(R0) ; Was it an END buffer? BEQ 187$ ; No% TST C.RML(R5) ; Is char count zero? BNE 230$X#187$: TST C.RML(R5) ; Are we done?; BNE 170$ ; No, get next block- MOV (SP)+,R5 ; Restore registers R5, R4, R3I MOV (SP)+,R4 ; ... MOV (SP)+,R3 ; ...3 TST I.PRM+6(R3) ; Auxilliary char. buffer exists? ! BEQ 190$ ; If EQ, none present05 CALL RCVCH ; Process received msg. characteristicsM190$:(; MOV (SP)+,I.PRM+4(R3) ; Save byte count and I/O completion 1 MOV (SP)+,I.PRM+2(R3) ; ... status in I/O packete1 CALL RCVDN ; Post completion on the I/O packetn BR 220$ ; Continue9200$: BIC #CS.ENP,C.FLAG(R4) ; Clear end packet seen flage1 CALLR GTRBF ; Add some buffers to receive ringR>210$: MOV C.RCVD(R4),R5 ; Get first item of received messages BEQ 200$ ; We must be done 0 MOV (R5),C.RCVD(R4) ; Deque from received list5 MOV C.RBFL(R4),(R5) ; Insert into receive free list9 MOV R5,C.RBFL(R4) ; ...)% BITB #RF.ENP,M.ERR(R5) ; Last block? BEQ 210$ ; No7220$: CALLR RCCMP ; look for another received messagem2230$: 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 stack2 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 receiveF R< .SBTTL ****************************************************< .SBTTL * QIO UNA characteristics processing routines *< .SBTTL ****************************************************; .SBTTL RCVCH - Process receive auxilliary characteristics ;+5; **-RCVCH-Process receive auxilliary characteristics ;eG; Process the characteristics present in the auxilliary characteristicst ; buffer on the receive request.;- ; Inputs:C ; R3 = Address of the I/O packet:; I.PRM+6 - Virtual address of the characteristics buffer1; I.PRM+10- Length of the characteristics buffer ; R4 = Controller State Tablec; R5 = Port State tableB; ; Registers modified:* ; R0, R1, R2;*5RCVCH: MOV IP.EXT(R3),R0 ; R0 = I/O packet extensionr/ .IF DF M$$MGE ; Memory management supported?a, MOV IX.AUX(R0),@#KISAR6 ; Map to AUX buffer/ .IF DF K$$DAS ; Kernel data space supported?t4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I spcae .ENDC ; K$$DAS .ENDC ; M$$MGE? MOV I.PRM+6(R3),R0 ; Point to start of characteristics bufferL/ MOV R0,P.WORK(R5) ; Create end of user bufferr7 ADD I.PRM+10(R3),P.WORK(R5) ; P.WORK = End user buffert<10$: MOV #CS.IGN,R1 ; Assume characteristic will be ignored3 MOV (R0),R2 ; Get next characteristics type code . SUB #CC.ADR,R2 ; Normalise for DLX functions2 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 availableM3 CALL @RCVTBL(R2) ; Dispatch to processing routineL>20$: MOV R1,C.STAT(R0) ; Return status of this characteristic2 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 RETURNr;+(; Receive charac00npoibjbkb a a ateristics dispatch table;-RCVTBL:s8 .WORD RCVDAD ; Get source field from received message7 .WORD RCVPRO ; Get protocol field from received msg.m4 .WORD RCVADR ; Get dest. field from received msg.RCMAX =.-RCVTBLn7 APR5PC RCVCH ; Make sure RCVCH is in APR5 addr spacec c9 .SBTTL RCVADR - Get destination field from received msg.#;+4; **-RCVADR-Get destination field from received msg.;O.; Get destination field from received message.;- ; Inputs:'; R0 = Address of characteristics block 7; R1 = Default status (CS.IGN = Characteristic ignored)e ; R3 = Address of the I/O packet.; R5 = Port State table (contains source addr);m ; Outputs:*; R1 = Status to return for characteristic;ABRCVADR: CMP C.DATI(R0),#6 ; Are there at least 6 bytes available? BLO 10$ ; If LO, no MOV P.RDAD(R5),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 size/ MOV #CS.SUC,R1 ; Return successful completiont 10$: RETURN19 APR5PC RCVADR ; Make sure RCVADR is in APR5 addr spaceA s6 .SBTTL RCVPRO - Get protocol field from received msg.;+4; **-RCVPRO-Get protocol field from received message;c+; Get protocol field from received message.e;- ; Inputs: '; R0 = Address of characteristics blocko7; R1 = Default status (CS.IGN = Characteristic ignored)2 ; R3 = Address of the I/O packet"; R5 = Address of Port State Table;n ; Outputs:*; R1 = Status to return for characteristic;fBRCVPRO: 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 sizef/ MOV #CS.SUC,R1 ; Return successful completione 10$: RETURNd9 APR5PC RCVPRO ; Make sure RCVPRO is in APR5 addr space  o7 .SBTTL RCVDAD - Get source field from received message2;+2; **-RCVDAD-Get source field from received message;S(; Get source field from received message;- ; Inputs:h'; R0 = Address of characteristics block#7; R1 = Default status (CS.IGN = Characteristic ignored)I ; R3 = Address of the I/O packet; R5 = Port State Table ;i ; Outputs:*; R1 = Status to return for characteristic;RBRCVDAD: CMP C.DATI(R0),#6 ; Are there at least 6 bytes available? BLO 10$ ; If LO, no4 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 size/ MOV #CS.SUC,R1 ; Return successful completionG 10$: RETURNt9 APR5PC RCVDAD ; Make sure RCVDAD is in APR5 addr spacet a< .SBTTL XMCHR - Process transmit auxilliary characteristics;+6; **-XMCHR-Process transmit auxilliary characteristics; G; Process the characteristics present in the auxilliary characteristicsS!; buffer on the transmit request.,;- ; Inputs:. ; R3 = Address of the I/O packet:; I.PRM+6 - Virtual address of the characteristics buffer1; I.PRM+10- Length of the characteristics buffer;; R4 = Port Status Table,; R5 = Address of the Controller State Table;u; Registers modified:d ; R0, R1, R2;.5XMTCH: MOV IP.EXT(R3),R0 ; R0 = I/O packet extensioni/ .IF DF M$$MGE ; Memory management supported?a, MOV IX.AUX(R0),@#KISAR6 ; Map to AUX buffer/ .IF DF K$$DAS ; Kernel data space supported?o4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGED BIC #PS.ADR!PS.PRO,P.FLAG(R5) ; Clear addr/protocol found flag bits? MOV I.PRM+6(R3),R0 ; Point to start of characteristics buffer 0 MOV R0,P.WORK(R5) ; Compute end of user buffer: ADD I.PRM+10(R3),P.WORK(R5) ; P.WORK = End of user buffer<10$: MOV #CS.IGN,R1 ; Assume characteristic will be ignored3 MOV (R0),R2 ; Get next characteristics type code.. SUB #CC.ADR,R2 ; Normalise for DLX functions2 BLT 20$ ; If LT, not one of our characteristics ASL R2 ; Form word offset CMP R2,#XMMAX ; In range?P BHIS 20$ ; If HIS, no3 CALL @XMTTBL(R2) ; Dispatch to00npof__DATADATADATADATA processing routine;>20$: MOV R1,C.STAT(R0) ; Return status of this characteristic2 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 RETURNc;+); Transmit characteristics dispatch tableX;-=XMTTBL: .WORD XMTADR ; Define Ethernet address for transmitL7 .WORD XMTPRO ; Define Ethernet protocol for transmitBXMMAX =.-XMTTBLS7 APR5PC XMTCH ; Make sure XMTCH is in APR5 addr space :5 .SBTTL XMTADR - Define Ethernet address for transmitt;+0; **-XMTADR-Define Ethernet address for transmit;AG; Define the Ethernet address to be used for this message transmission.;;- ; Inputs:C'; R0 = Address of characteristics blockR7; R1 = Default status (CS.IGN = Characteristic ignored) ; R3 = Address of the I/O packet,; R5 = Address of the Controller State Table; ; Outputs:*; R1 = Status to return for characteristic;CXMTADR: CMP C.DATI(R0),#6 ; Are there at least 6 bytes of address?B BLO 10$ ; If LO, no8 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 seenr1 MOV #CS.SUC,R1 ; Return successful completion 10$: RETURNi9 APR5PC XMTADR ; Make sure XMTADR is in APR5 addr space  o6 .SBTTL XMTPRO - Define Ethernet protocol for transmit;+1; **-XMTPRO-Define Ethernet protocol for transmit ;AH; Define the Ethernet protocol to be used for this message transmission.;- ; Inputs:R'; R0 = Address of characteristics blockC7; R1 = Default status (CS.IGN = Characteristic ignored)R ; R3 = Address of the I/O packet0; R5 = Address of the physical link access block; ; Outputs:*; R1 = Status to return for characteristic;PDXMTPRO: CMP C.DATI(R0),#2 ; Are there at least 2 bytes of protocol? BLO 10$ ; If LO, no7 MOV C.CHRL(R0),P.XPRO(R5) ; Fill in Ethernet protocolc= BIS #PS.PRO,P.FLAG(R5) ; Indicate Ethernet protocol seen 5 MOV #CS.SUC,R1 ; Return successful completionA 10$: RETURNc9 APR5PC XMTPRO ; Make sure XMTPRO is in APR5 addr spacet n+ .SBTTL GTCHR - Get device characteristics5;+%; **-GTCHR-Get device characteristicsk; C; The get characteristics function is used to read device dependent *; characteristics for Ethernet interfaces.;- ; Inputs:?; R3 = Address of I/O packet; R4 = Contoller State Table; r5 = Port State Table;S; Registers modified: ; R0, R1, R2;e .ENABL LSBeGTCHR: MOV R3,-(SP) ; Save R3/ .IF DF M$$MGE ; Memory management supported? 9 MOV @IP.EXT(R3),@#KISAR6 ; Map to characteristics bufferB/ .IF DF K$$DAS ; Kernel data space supported?G4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE7 MOV I.PRM+2(R3),R0 ; R0 = Virtual addr of user buffer@ MOV R0,P.WORK+4(R5) ; Save start addr for later. We will need/ ; ... it to compute how much of the buffero# ; ... we were able to process.S2 MOV R0,-(SP) ; Compute address past end of block ADD I.PRM+4(R3),(SP) ; ...o? MOV C.PROL(R4),P.WORK(R5) ; Save protocol and multicast listB8 MOV P.MCST(R5),P.WORK+2(R5) ; ... pointer in work area.210$: MOV (R0),R2 ; Get next characteristics type BEQ 40$ ; No more0 SUB #CC.DST,R2 ; Normalise for driver dispatch2 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 smallR3 CALL @GETTBL(R2) ; Dispatch to processing routineM BR 20$ ; )15$: MOV #CE.UDF,R1 ; Undefined functionr CLR R2 ; Nothing processedV720$: MOV R1,C.STAT(R0) ; Return status of this request:; MOV R2,C.DATO(R0) ; Return length of returned informationN=30$: ADD C.DATI(R0),R0 ; Point to next characteristics blockT ADD #C.CHRL,R0 ; ...! CMP R0,(SP) ; Are we done yet?  BLO 10$ ; If LO, no40$:! TST (SP)+ ; Clean up the stackH+ MOV (00npoibjbkb a a aSP)+,R3 ; Restore I/O packet address ( CALL MAPDRV ; Map to 2nd 4K of driver< MOV P.CTBL(R5),R4 ; Restore Controller State Table pointer6 MOV R0,R1 ; Indicate we processed all of the buffer? SUB P.WORK+4(R5),R1 ; Compute number of characteristics proc.O# MOV #CS.SUC,R0 ; Indicate successo CALLR RQDON ; Post completion .DSABL LSB ;+$; Get characteristics dispatch table;-:GETTBL: .WORD GETDST ; Get remote address/protocol pairs) .WORD GETMCT ; Get a multicast addressGETMAX =.-GETTBL7 APR5PC GTCHR ; Make sure GTCHR is in APR5 addr spaceK r2 .SBTTL GETDST - Get remote address/protocol pairs;+-; **-GETDST-Get remote address/protocol pairss;aG; Get the next protocol and associated addresses enabled for this port.c;- ; Inputs:#'; R0 = Address of characteristics blockD2; R1 = Default status (CE.RTS = Request too small); R3 = Address of I/O packet; R4 = Controller State Tablet; R5 = Port State Tablep;s ; Outputs:*; R1 = Status to return for characteristic); R2 = # of bytes of returned information ;i; Registers modified:r ; R1, R2, R4;-2GETDST: CLR R2 ; Assume no output data available8 CMP C.DATI(R0),#4 ; Enough space for a protocol entry? BLO 100$ ; If LO, noe$ CLR -(SP) ; Reserve cell on stack310$: MOV #CS.SUC,R1 ; Assume successful completion=/ MOV R0,R2 ; Compute address of output buffer3 ADD #C.CHRL,R2 ; ...2 MOV P.WORK(R5),R4 ; Get next protocol list entry BEQ 50$ ; If EQ, no more=6 MOV (R4),P.WORK(R5) ; Move on down the protocol list3 MOV C.DATI(R0),(SP) ; Set up remaining byte count0 SUB #4,(SP) ; ... for building characteristic CLR -(SP) ; Initialise flag8 MOV PL.PRO(R4),(R2)+ ; Assume we will use this protocolA MOV PL.FLG(R4),(R2)+ ; Set up flags and usage count for protocolC2 ADD #PL.ADD,R4 ; Point to address chain listhead120$: MOV (R4),R4 ; Get next address chain entry; BEQ 40$ ; If EQ, no moree* CMP AD.PRT(R4),R5 ; Is it for this port?' BNE 20$ ; If NE, no ... keep lookinge+ INC (SP) ; Indicate valid protocol foundS0 SUB #6,2(SP) ; Reduce count of remaining bytes+ BLT 30$ ; If LT, insufficient space left)7 MOV AD.ADD(R4),(R2)+ ; Copy address into output buffer  MOV AD.ADD+2(R4),(R2)+ ; .... MOV AD.ADD+4(R4),(R2)+ ; ...d BR 20$ ; Keep looking#30$: MOV #CS.DAO,R1 ; Data overrunh040$: TST (SP)+ ; Was this protocol acceptable? BEQ 10$ ; If EQ, no%50$: TST (SP)+ ; Clean up the stack5, SUB R0,R2 ; Compute length of output data SUB #C.CHRL,R2 ; ... 100$: RETURN9 APR5PC GETDST ; Make sure GETDST is in APR5 addr spacef i( .SBTTL GETMCT - Get a multicast address;+#; **-GETMCT-Get a multicast addresso;a7; Get the next multicast address enabled for this port..;- ; Inputs:('; R0 = Address of characteristics blockg2; R1 = Default status (CE.RTS = Request too small); R3 = Address of I/O packet; R4 = Controller State Tableo; R5 = Port State Tablee;u ; Outputs:*; R1 = Status to return for characteristic); R2 = # of bytes of returned information;R; Registers modified:e; R4;s6GETMCT: MOV R0,R2 ; Compute address of output buffer ADD #C.CHRL,R2 ; ...; CMP C.DATI(R0),#6 ; Enough space for a multicast address?a BLO 20$ ; If LO, no8 MOV P.WORK+2(R5),R4 ; Get next multicast address entry BEQ 10$ ; If EQ, no moreC MOV (R4),P.WORK+2(R5)? MOV ML.ADD(R4),(R2)+ ; Copy multicast address to output buffer MOV ML.ADD+2(R4),(R2)+ ; ...  MOV ML.ADD+4(R4),(R2)+ ; ...r,10$: MOV #CS.SUC,R1 ; Return success status020$: SUB R0,R2 ; Compute length of output data SUB #C.CHRL,R2 ; ... RETURNt7 APR5PC GTMCT ; Make sure GTMCT is in APR5 addr spaceD 0+ .SBTTL STCHR - Set device characteristicsa;+%; **-STCHR-Set device characteristics5;4E; The set characteristics function is used to set up device dependentVF; functions for the Ethernet interfaces (e.g. Protocol/address pairs).;- ; Inputs:M; R3 = Address of I/O packet; R4 = Controller State Table; R5 = Port State TableR;r; Regist00npof__DATADATADATADATAers modified:S; R0, R1, R2, R3, R4;t .ENABL LSBa&STCHR: MOV R3,-(SP) ; Save I/O packet/ .IF DF M$$MGE ; Memory management supported?c9 MOV @IP.EXT(R3),@#KISAR6 ; Map to characteristics buffer / .IF DF K$$DAS ; Kernel data space supported? 4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE: MOV I.PRM+2(R3),R0 ; R0 = Characteristics buffer pointer9 MOV R0,P.WORK(R5) ; Save start addr of buffer. We willP) ; ... need it to compute how much ofS, ; ... the buffer we were able to procss: MOV R0,P.WORK+2(R5) ; Initialize how far we got pointer.2 MOV R0,-(SP) ; Compute address past end of block ADD I.PRM+4(R3),(SP) ; ...b210$: 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 indexV2 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 small  MOV R0,-(SP) ; Save R03 CALL @SETTBL(R2) ; Dispatch to processing routine. MOV (SP)+,R0 ; Restore R0a# BCS 40$ ; If CS, stop processing4 ; ... characteristics720$: MOV R1,C.STAT(R0) ; Return status of this requestN9 ADD C.DATI(R0),R0 ; Point to next characteristics blockB ADD #C.CHRL,R0 ; ...< MOV R0,P.WORK+2(R5) ; Indicate how far we got successfully! CMP R0,(SP) ; Are we done yet?R BLO 10$ ; If LO, no/30$: MOV #CS.SUC,R1 ; Indicate, processed all  ; ... characteristics%40$: TST (SP)+ ; Clean up the stack;+ MOV (SP)+,R3 ; Restore I/O packet addressR4 MOV P.CTBL(R5),R4 ; Restore Controller State Table( CALL MAPDRV ; Map to 2nd 4K of driverC SUB P.WORK(R5),P.WORK+2(R5) ; Compute how much we have processedn6 MOV P.WORK+2(R5),I.PRM+4(R3) ; Save it in I/O packet7 MOV R1,I.PRM+2(R3) ; Save status code in I/O packetf3 BIT #PS.MLC,P.FLAG(R5) ; Multicast list changed?; BEQ 50$ ; NoM1 MOV IP.EXT(R3),R0 ; R0 = I/O packet extension.@ MOV #FN.WML,IX.FCN(R0) ; Write Multicast List to UNA function6 $QPKT C.PFNC ; Queue packet to function pending Q- CALLR FNINI ; Try to initiate a functionD&50$: MOV I.PRM+2(R3),R0 ; R0 = Status+ MOV I.PRM+4(R2),R1 ; R1 = Bytes processedh& CALLR RQDON ; Return status to user .DSABL LSBi;+$; Set characteristics dispatch table;-=SETTBL: .WORD SETDST ; Define remote address/protocol pairsi) .WORD SETMCT ; Set a multicast addressXSETMAX =.-SETTBL7 APR5PC STCHR ; Make sure STCHR is in APR5 addr spaceu s5 .SBTTL SETDST - Define remote address/protocol pairst;+0; **-SETDST-Define remote address/protocol pairs;eC; Define a number of address/protocol pairs for the specified port.R;- ; Inputs:y+; R0 = Address of the characteristics blocks2; R1 = Default status (CE.RTS = Request too small); R3 = Address of I/O packet; R4 = Controller State tablee; R5 = Port State Table;O ; Outputs:*; R1 = Status to return for characteristic;; 'C' Clear - Address/protocol entries successfully created7; 'C' Set - failed to create address/protocol entriesr;; Registers modified:r ; R0, R2, R4;t;SETDST: MOV R0,R4 ; Copy address of characteristics blocko6 CLR P.WORK+4(R5) ; Show no allocations performed yet CLR P.WORK+6(R5) ; ...9 MOV C.DATI(R4),R2 ; Get length of characteristics block=) SUB #4,R2 ; Remove protocol descriptort- BEQ 15$ ; Br if no addresses - only headerp& BLT 200$ ; If LT, request too small210$: SUB #6,R2 ; Remove another Ethernet address BGT 10$ ; If GT, more to go& BMI 200$ ; If MI, request too small515$: MOV #CE.PCN,R1 ; Assume protocol usage conflictT?20$: MOV P.CTBL(R5),R2 ; Get address of protocol list listheadR ADD #C.PROL,R2 ; ...730$: MOV (R2),R2 ; Get address of next protocol blockT BEQ 50$ ; If EQ, no morer6 CMP PL.PRO(R2),C.CHRL(R4) ; Protocol already in list?% BNE 30$ ; If NE, not this protocol 1 MOVB PL.FLG(R2),R0 ; Get current protocol flagsl00npoibjbkb a a a9 BISB C.CHRL+2(R4),R0 ; ... or'd with new protocol flags17 BIT #LF.EXC,R0 ; Did either request exclusive access?o. BNE 200$ ; If NE, yes ... protocol conflict+ BITB #LF.DEF,C.CHRL+2(R4) ; Default owner? 7 BEQ 40$ ; If EQ, we are not enabling a default owner., BITB #LF.DEF,PL.FLG(R2) ; Can we enable it?2 BNE 200$ ; If NE, default owner already enabledA40$: MOVB PL.FLG(R2),-(SP) ; Check for consistent padding request  BIC #^C,(SP) ; ...L MOVB C.CHRL+2(R4),R0 ; ... BIC #^C,R0 ; ...0 CMP R0,(SP)+ ; Did they both request the same? BNE 200$ ; If NE, no & BR 60$ ; Use current protocol block850$: MOV #PL.LEN,R1 ; Get length of protocol list entry# CALL $ALOCB ; Allocate the blockI5 MOV #CE.RES,R1 ; Assume resource allocation failure,' BCS 200$ ; If CS, allocation failure 1 MOV R0,R2 ; Copy address of the protocol block " CLR (R0)+ ; Clear the link word. MOVB C.CHRL+2(R4),(R0)+ ; Copy protocol flags CLRB (R0)+ ; Zero usage count1 MOV C.CHRL(R4),(R0)+ ; Fill in the protocol typee2 CLR (R0)+ ; Assume no default or exclusive user* CLR (R0) ; Build address chain listhead MOV R0,2(R0) ; ... MOV R4,-(SP) ; Temp save R41 MOV P.CTBL(R5),R4 ; R4 = Controller state tableS- MOV R2,@C.PROL+2(R4) ; Add protocol entry toS. MOV R2,C.PROL+2(R4) ; ... end of master list MOV (SP)+,R4 ; Restore R4o=60$: BITB #LF.EXC!LF.DEF,C.CHRL+2(R4) ; Exclusive or default?R2 BEQ 70$ ; If EQ, not exculsive or default owner7 MOV R5,PL.DEF(R2) ; Set up default or exclusive ownerl>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 overhead. BEQ 75$ ; If EQ, no addresses to be enabled# CALL BLDADR ; Build address listc BCS 200$ ; If CS, failure>75$: MOV P.WORK+4(R5),R2 ; Get address of protocol list entry780$: MOV P.WORK+6(R5),R0 ; Get next address list entryt BEQ 90$ ; If EQ, no morex* MOV (R0),P.WORK+6(R5) ; Save next address% CLR (R0) ; Clear out the link word0 MOV R0,@PL.ADD+2(R2) ; Add address entry to theA MOV R0,PL.ADD+2(R2) ; ... end of the list on the protocol blockc& INCB PL.USE(R2) ; Update usage count BR 80$ ; ... and loop%90$: BITB #LF.EXC!LF.DEF,C.CHRL+2(R4)B9 BEQ 100$ ; If EQ, not an exclusive or default protocolV# INCB PL.USE(R2) ; Inc usage counto*100$: MOV #CS.SUC,R1 ; Set success status CLC ; Indicate success RETURN9;+M; We are unable to build the protocol block and/or the address blocks becauseaN; of an address or protocol conflict or a resource allocation failure. Release<; the data structures we have allocated and return an error.;-)200$: MOV R1,-(SP) ; Save the error code >210$: MOV P.WORK+6(R5),R0 ; Get next address block to release BEQ 220$ ; If EQ, nonev5 MOV (R0),P.WORK+6(R5) ; Save addr of next addr blocko1 MOV #AD.LEN,R1 ; Set length of an address blockC% CALL $DEACB ; Deallocate the block+ BR 210$ ; ... and loopt6220$: CALL SCNPR ; Scan for inactive protocol blocks' MOV (SP)+,R1 ; Recover the error codeo SEC ; Indicate failure RETURNh9 APR5PC SETDST ; Make sure SETDST is in APR5 addr space $6 .SBTTL SCNPR - Scan protocol list for unused entries;+0; **-SCNPR-Scan protocol list for unused entries; F; Scan the protocol list for entries which have a zero usage count and; return them to the pool.;- ; Inputs:s"; R5 = Address of Port State table;h; Registers modified:.; R0, R1, R2, R4; <SCNPR: MOV P.CTBL(R5),R2 ; Get address of protocol listhead ADD #C.PROL,R2 ; ...110$: MOV (R2),R0 ; Get next protocol list entryP BEQ 40$ ; If EQ, no more / TSTB PL.USE(R0) ; Is this block still in use?  BEQ 20$ ; If EQ, no$ MOV R0,R2 ; Move on down the list BR 10$ ; ...e520$: MOV (R0),(R2) ; Unlink protocol entry from listv% BNE 30$ ; If NE, not last in chain ? MOV P.CTBL(R5),R4 ; Make sure we have Controller State Tabble+ MOV R2,C.PROL+2(R4) ; Fix up tail pointer830$: MOV #PL.LEN,R1 ; G00npof__DATADATADATADATAet length of protocol list entry" MOV R2,-(SP) ; Save list pointer% CALL $DEACB ; Deallocate the block % MOV (SP)+,R2 ; Restore list pointer BR 10$ ; ... and loop 40$: RETURNn + .SBTTL BLDADR - Build address list entriesn;+&; **-BLDADR-Build address list entries;0+; Build the specified address list entries.B;- ; Inputs:E8; R2 = # of bytes remaining in the characteristics block+; R4 = Pointer to the characteristics block2"; R5 = Address of port state table;# ; Outputs:!; R1 = Error code (if applicable)9; 'C' Clear - Address list entries successfully allocatedc5; 'C' Set - Failed to allocate address list entries; ; Registers modified:; R0, R2;+BLDADR: MOV R4,-(SP) ; Get a free registern4 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?s BNE 100$ ; If NE, yes5 MOV P.WORK+4(R5),R0 ; Get pointer to protocol entryt ADD #PL.ADD,R0 ; ...+ CALL CHKADD ; Check for address conflict 1 MOV #CE.PCN,R1 ; Assume protocol usage conflictC+ BCS 100$ ; If CS, address already in user2 MOV R5,R0 ; Get pointer to list of address list/ ADD #P.WORK+6,R0 ; ... entries just allocatedH+ CALL CHKADD ; Check for address conflict* MOV #CE.MCE,R1 ; Assume address conflict+ BCS 100$ ; If CS, address already in usea MOV R2,-(SP) ; Save byte count6 MOV #AD.LEN,R1 ; Get length of an address list entry# CALL $ALOCB ; Allocate the block# MOV (SP)+,R2 ; Restore byte countn5 MOV #CE.RES,R1 ; Assume resource allocation failurec' BCS 100$ ; If CS, allocation failurei MOV P.WORK+6(R5),(R0)5 MOV R0,P.WORK+6(R5) ; Link block onto pending chain;" TST (R0)+ ; Skip over link word .REPT 3, MOV (R4)+,(R0)+ ; Fill in Ethernet address .ENDR. MOV R5,(R0)+ ; Set up address of owning port9 SUB #6,R2 ; Remove another ethernet address from countL BNE 10$ ; If NE, loop# MOV #CS.SUC,R1 ; Indicate successl TST (PC)+ ; ...100$: SEC ; Indicate failure! MOV (SP)+,R4 ; Recover registera RETURN  l( .SBTTL CHKADD - Check for address match;+#; **-CHKADD-Check for address match.;KC; Scan an address list for a match on a specified Ethernet address.n;- ; Inputs:T(; R0 = Address of listhead to be scanned); R4 = Address of 3 word Ethernet addressd;s ; Outputs:!; R1 = Error code (if applicable) /; 'C' Clear - No match on any entry in the list 1; 'C' Set - Match on an entry in the list found(;+; Registers modified: ; R0;t@CHKADD: MOV #CE.ACN,R1 ; Assume possible address usage conflict$10$: CLC ; Assume no more entries2 MOV (R0),R0 ; Get address of next entry in list BEQ 20$ ; If EQ, no more 2 CMP AD.ADD(R0),(R4) ; Check for matching address BNE 10$ ; If NE, no match CMP AD.ADD+2(R0),2(R4) ; ...d BNE 10$ ; ... CMP AD.ADD+4(R0),4(R4) ; ...c BNE 10$ ; ...) SEC ; Indicate a match has been founde20$: RETURN ; Returnc n4 .SBTTL SETMCT - Enable a multicast address for port;+&; **-SETMCT-Enable a multicast address;p8; Enable a new multicast address for the specified port.;- ; Inputs:M+; R0 = Address of the characteristics blocki2; R1 = Default status (CE.RTS = Request too small)(; R4 = Address of controller state table"; R5 = Address of port state table;, ; Outputs:*; R1 = Status to return for characteristic:; 'C' Clear - Multicast address entry successfully created6; 'C' Set - Failed to create multicast address entry;E; Registers modified:s; R0, R2;+BSETMCT: CMP C.DATI(R0),#6 ; Do we have a valid multicast address?% BLO 100$ ; If LO, no ... too small! BEQ 10$ ; If EQ, exactly righth$ MOV #CE.RTL,R1 ; Request too large BR 100$ ; ... and exit 510$: MOV #CE.NMA,R1 ; Assume not a multicast addressA0 BIT #1,C.CHRL(R0) ; Is it a multicast address? BEQ 100$ ; If EQ, nor- MOV R5,R2 ; Get multicast address listhead  ADD #P.MCST,R2 ; ...@20$: MOV (R2),R2 ; Get address of next multicast address entry00npoibjbkb a a a BEQ 30$ ; If EQ, no moreE 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$4 MOV #CE.MCE,R1 ; Multicast address already enabled BR 100$:30$: MOV R0,-(SP) ; Save address of characteristics block? MOV #ML.LEN,R1 ; Get length of a multicast address list entryn% CALL $ALOCB ; Allocate a new blocke3 MOV (SP)+,R2 ; R2 = Addr of characteristics block,! BCS 100$ ; If CS, no resourcest 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)3 CLR (R0) ; Link to end of multicast address list$ MOV R0,@P.MCST+2(R5) ; ...R MOV R0,P.MCST+2(R5) ; ... 9 BIS #PS.MLC,P.FLAG(R5) ; Indicate multicast list changedR1 MOV #CS.SUC,R1 ; Indicate successful completionV TST (PC)+ ; Indicate successl100$: SEC ; Indicate failure  RETURN;9 APR5PC SETMCT ; Make sure SETMCT is in APR5 addr spacee c+ .SBTTL STMLT - Enable multicast addresses;+%; **-STMLT-Enable multicast addresses(;,<; The following function will inform the UNA which multicast; addresses have been enabled.;-; Input:; R5 = Port status table; R4 = Controller state table#; R3 = Address of I/O packet!; I.PRM+2 = Caller's I/O statusS$; I.PRM+4 = Caller's R1 I/O status; ; Output: '; Multicast list is written to the UNA.c; 'C' bit set on error%; 'C' bit cleared for good I/O statuss&; I/O DONE IS RETURNED FOR THE REQUEST;- .ENABL LSBc#STMLT: CALL SALL ; Save registersu$ CALL BLDML ; Build multicast list1 TSTB C.MLT(R4) ; Do we have multicast addressesr/ BEQ 20$ ; No, just return I/O status to userr0 MOV C.PCBP(R4),R2 ; R2 = Port Control Block% CLR (R2)+ ; Clear function word 1 CMPB C.MLT(R4),C.MMAX(R4) ; Max number exceeded?t3 BHI 10$ ; Yes, put UNA in all multicast modet2 MOV RELCT,(R2) ; Put unibus relocation in PCB MOV RELCT+2,2(R2) ; ...< ADD C.WRKP(R4),(R2)+ ; Add offset into UMR mapped region ADC (R2)+ ; ...u8 MOVB C.MLT(R4),-(R2) ; Put # of milticast addr in PCBB/ MOV #FN.WML,R1 ; R1 = Write multicast listN( CALLR LODFN ; Execute the function;B ; Enable all multicast addresses;k?10$: BIS #MD.ENL,C.MODE(R4) ; Enable all multicast addressesX: MOV C.MODE(R4),(R2) ; Put it in Port Control Block (PCB)) MOV #FN.WMD,R1 ; Write mode function ( CALLR LODFN ; Execute the function;2'; Write Multicast Address list complete;;dWMLDN: BCS 40$ ; Error?i+20$: MOV I.PRM+2(R3),R0 ; R0 = Status code(:30$: MOV I.PRM+4(R3),R1 ; R1 = Length of buffer processed CALLR RQDON ; Report I/O doneD40$: CMPB #IO.XCH/400,I.FCN+1(R3) ; Are we processing char.function?% BNE 20$ ; No, keep caller's status * MOV #IE.ABO&377,R0 ; Set up abort status BR 20$ ; Return abort statusn .DSABL LSB) M0 .SBTTL BLDML - Build multicast addresses table;+*; **-BLDML-Build multicast addresses table;t9; Build the multicast address table for the set multicasti ; function.P;- ; Inputs:R!; R5 = Points to Port State TableR;R ; Outputs:5; 'C' Clear - Control function processing may proceedo1; 'C' Set - Control function processing delayedo;s; Registers modified:E; R0, R1;k8BLDML: CLR C.MLT(R4) ; Zero multicast addresses counter, MOV R4,R1 ; Compute address of port table ADD #C.PORT,R1 ; ... listheadB310$: MOV (R1),R1 ; Get address of next port tablem BEQ 80$ ; If EQ, no more+ MOV R1,R0 ; Compute address of multicast ' ADD #P.MCST,R0 ; ... address listhead520$: MOV (R0),R0 ; Get next multicast address entryC BEQ 10$ ; If EQ, no moreo MOV R1,-(SP) ; Save R1, R2 MOV R2,-(SP) ; ...0 MOV C.WRKP(R4),R1 ; Get pointer to work buffer CLR R2 ; Clear high byte)1 MOVB C.MLT(R4),R2 ; Get # of addresses to check;! BEQ 50$ ; If EQ, none to checkD@30$: CMP ML.ADD(R0),(R1) ; Check for matching multicast address BNE 40$ ; If NE, no match CMP ML.ADD+2(R0),2(R1), BNE 40$ CMP ML.ADD+4(R0),4(R1) 7 BEQ 60$ ; If EQ, 00npof__DATADATADATADATAmulticast address already in buffer,'40$: ADD #6,R1 ; Skip over this entryB! SOB R2,30$ ; Check all entriesR:50$: MOV ML.ADD(R0),(R1)+ ; Fill in this multicast address MOV ML.ADD+2(R0),(R1)+r MOV ML.ADD+4(R0),(R1)+a6 INCB C.MLT(R4) ; Update count of multicast addresses&60$: MOV (SP)+,R2 ; Restore registers MOV (SP)+,R1 ; ...A CMPB C.MLT(R4),C.MMAX(R4) ; Have we reached max multicast addr. ; BLOS 20$ ; Loop for next address to enable for this port070$: SEC ; ...; BR 90$ ;c"80$: CLC ; Indicate good return90$: RETURN ; r< .SBTTL ****************************************************< .SBTTL * Non-DLX Function Processors *< .SBTTL ****************************************************5 .SBTTL NDLXF - Dispatch table for non-DLX functionsR;+'; Dispatch table for non-DLX functions. ;L ; Format:X-; .WORD ADDR ; Address of function processorB'; .BYTE FLAGS ; Flag bits, if set TRUEl=; .BYTE SIZE ; Max size of input/output data buffer requiredC; ; Flag bit definitions:0;-'F.PRIV = 1 ; Read privelege flag bit*/F.LESS = 2 ; Buffer may be less than maximum "F.READ = 4 ; Function is a readNDLXF:! .WORD INVFUN ; 00 NOP function* .BYTE 0 ; Filler byte .BYTE 0 ; Filler byte 5 .WORD INVFUN ; 01 Load and Start Microcode AddressD$ .BYTE 0 ; Must be priveleged# .BYTE 0 ; One word of inputo) .WORD REDDAD ; 02 Read Default Addressl3 .BYTE F.READ ; Anyone can use this functionr1 .BYTE 3*2 ; Requires 3 word output bufferV! .WORD INVFUN ; 03 NOP function .BYTE 0 ; Filler bytee .BYTE 0 ; Filler byte * .WORD REDADD ; 04 Read Physical Address3 .BYTE F.READ ; Anyone can use this function1 .BYTE 3*2 ; Requires 3 word output buffer0+ .WORD WRTADD ; 05 Write Physical Address0) .BYTE F.PRIV ; Must be privilaged + .BYTE 3*2 ; Requires 3 word input addressR0 .WORD REDMLT ; 06 Read Multicast Address List/ .BYTE F.LESS!F.READ ; Must be privilagedu- .BYTE 6*10. ; Requires max of 10. addresses 1 .WORD INVFUN ; 07 Write Multicast Address ListY .BYTE 0 ; Filler byteO .BYTE 0 ; Filler byteA% .WORD INVFUN ; 10 Read Ring Formata .BYTE 0 ; Filler byte2 .BYTE 0 ; Filler bytet& .WORD INVFUN ; 11 Write Ring Format .BYTE 0 ; Filler byte; .BYTE 0 ; Filler byteY" .WORD READCT ; 12 Read Counters9 .BYTE F.LESS!F.READ ; Anyone can use this functionY+ .BYTE 32.*2 ; Output buffer > 0 and < 32., .WORD READCC ; 13 Read And Clear CountersA .BYTE F.PRIV!F.LESS!F.READ; Must be priveleged, BUF can be < max + .BYTE 32.*2 ; Output buffer > 0 and < 32.t .WORD REDMOD ; 14 Read Mode- .BYTE F.READ ; Anyone can use this functionY( .BYTE 1*2 ; Requires a one word buffer .WORD WRTMOD ; 15 Write Mode0( .BYTE F.PRIV ; Must be priveleged user) .BYTE 1*2 ; Requires a one word buffern% .WORD REDSTA ; 16 Read Port Statusn- .BYTE F.READ ; Anyone can use this functiont. .BYTE 4*2 ; Four word output buffer required/ .WORD REDCST ; 17 Read And Clear Port Status;. .BYTE F.PRIV!F.READ ; Must be priveleged user. .BYTE 4*2 ; Four word output buffer required) .WORD INVFUN ; 20 Dump Internal Memoryn# .BYTE 0 ; Must be priveleged user + .BYTE 0 ; Buff size is tested by function;) .WORD INVFUN ; 21 Load Internal Memoryp# .BYTE 0 ; Must be priveleged users+ .BYTE 0 ; Buff size is tested by functiona# .WORD REDSID ; 22 Read System IDn: .BYTE F.LESS!F.READ ; Not priveleged, buffer can be < 1400 .BYTE 200. ; Up to 200. bytes of buffer needed$ .WORD WRTSID ; 23 Write System ID9 .BYTE F.PRIV!F.LESS ; Priveleged user, buff can be < 140e0 .BYTE 200. ; Up to 200. bytes of buffer needed- .WORD REDLOA ; 24 Read Load Server AddressY# .BYTE F.READ ; Anyone can read ito$ .BYTE 3*2 ; 3 word buffer required- .WORD WRTLOA ; 25 Write Load Server Address( .BYTE F.PRIV ; Must be priveleged user$ .BYTE 3*2 ; 3 word buffer requiredCHRMAX = .00npnpibjbkb a a a-NDLXF D, .SBTTL NDLXD - Non-DLX function dispatcher;+&; **-NDLXD-Non-DLX function dispatcher;OE; This routine is called to process the non-DLX function(s) specifiedrJ; in the user buffer pointed to by the optional diagnostic buffer pointer.;RH; If the optional diagnostic buffer is specified, this routine is calledL; before and after the receive or transmit is completed. On the first pass,M; the function requests with sign bit set are processed. On the second pass,e.; the positive function request are processed.;-J; Each function is handled individually. The request function code is usedH; as dispatch table index and a dispatch made to the individual handler.F; Each handler performs the required action and then returns to FUNSUC<; or FUNUNS and the next requset is processed in the buffer.;uH; If an individual request fails the request is left uncompleted and theG; next request in the buffer is processed. An invalid function requesteH; will terminate processing of the diagnostic buffer as it does not know+; how to step to the next request function.T;rN; This procedure is followed until the end-of-buffer is reached, at which time#; the control request is completed.r;r4; A Characteristics buffer has the following format:;r; Function Codee; Byte Count Inc; Byte Count Out; Status; Data;i; Next Function Code or 0e; ...e;u ; INPUTS:a; R5 -> Port State Table; R4 -> Controller State Table; R3 = Address of I/O packett7; I.PRM+12(R3) = Virtual address of diagnostic buffero7; I.PRM+14(R3) = Length of optional diagnostic buffer'; I.PRM(R3) = I/O packet extensiond;- ; OUTPUTS:=; Function requests in the diagnostic buffer processed before0; control is returned to the function processor.;;- .ENABL LSBdNDLXD: .IF DF M$$MGE/ MOV IP.EXT(R3),R0 ; R0 = I/O packet extensiono3 MOV IX.DIG(R0),@#KISAR6 ; Map to diagnostic buffera/ .IF DF K$$DAS ; Kernel data space supported?d4 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 buffere) MOV R0,C.DGBP(R4) ; Save buffer pointero+ MOV R0,C.DGBE(R4) ; Compute end of buffer" ADD I.PRM+14(R3),C.DGBE(R4) ; ...10$:( MOV (R0),R1 ; Get next function value BLE INVFUN ; Invalid function0 BIC #177600,R1 ; Generate dispatch table index ASL R1 ; ...s ASL R1 ; ...@" CMP R1,#CHRMAX ; Valid function? BHIS INVFUN ; No / ADD #NDLXF,R1 ; Point to dispatch table entry , CMP (R1),#INVFUN ; Is it a valid function?+ BEQ INVFUN ; Mark it as invalid functiono9 BIT #F.PRIV,2(R1) ; Function for priveleged tasks only?M BEQ 40$ ; No 0 MOV I.TCB(R3),R2 ; R2 = TCB of requesting task3 BIT #T3.PRV,T.ST3(R2) ; Is this a priveleged task?l" BEQ INVFUN ; No, ignore request40$:2 CMPB #-1,3(R1) ; Function tests the buffer size?$ BEQ 60$ ; Skip buffer size check.& MOV C.DATI(R0),R2 ; R2 = Buffer size' CMPB R2,3(R1) ; Is buffer big enough?a BEQ 60$ ; yes" BGT 70$ ; It can't be > maximum- BIT #F.LESS,2(R1) ; Is it ok if it is less?n BEQ 80$ ; No, buffer error 60$:' ADD #C.CHRL,R0 ; Point to data buffer 5 MOV R0,C.DGBP(R4) ; Save curent pointer into buffera .IF DF M$$MGE CALL MAPDRV ; Map to driver .ENDC ; M$$MGE % CALLR @(R1) ; Dispatch to function1;F; Request too largef;s.70$: MOV #CE.RTL,C.STAT(R0) ; Buffer too large! BR 100$ ; Process next requeste;C; Request too smallf; /80$: MOV #CE.RTS,C.STAT(R0) ; Request too smalla! BR 100$ ; Process next request);s'; Privelege violation, invalid functionb;eINVFUN:* MOV #CE.INV,C.STAT(R0) ; Invalid function BR 130$ ; Return)100$:e% ADD #C.CHRL,R0 ; Point to data area 6BUMP: ADD C.DATI-C.CHRL(R0),R0 ; Point to next request- CMP R0,C.DGBE(R4) ; Are we at end of buffer% BLO 10$ ; Go, process next request#-130$: CALL MAPDRV ; Map to 2nd 4K of driver;7 CMPB I.FCN+1(R3),00npof__DATADATADATADATA#IO.XRC ; Is this a receive function?0 BNE 140$ ; No1 CALL RDIDN ; Return to receive diagnostic donen# BR 150$ ; Initiate next functiont3140$: CALL XDIDN ; Return to xmit diagnostic doneS,150$: CALLR FNINI ; Initiate next function7 APR5PC NDLXD ; Make sure NDLXD is in APR5 addr space KFUNSUC: MOV #CS.SUC,C.STAT-C.CHRL(R0); Indicate function request successfula BR BUMP ; Do next request7FUNUNS: MOV #CE.DNF,C.STAT-C.CHRL(R0); Indicate failure2 BR BUMP ; Do next request .DSABL LSB  i% .SBTTL REDDAD - Read Default Addresso& .SBTTL REDADD - Read Physical Address) .SBTTL REDLOA - Read Load Server Addressn;+;#; **- REDDAD - Read Default Addressi$; **- REDADD - Read Physical Address'; **- REDLOA - Read Load Server Address ;aB; These three routines are called to retreive the address desired.H; The UNA command is set up and the data returned is moved to the user'sG; buffer. If the user's buffer is too small a data overrun condition isP; given.;r ; INPUTS:.; R5 = Port State Table ; R4 = Controller State Table"; R3 = Address of I/O status block(; R0 = Pointer to user diagnostic buffer;n;- .ENABL LSBE3REDDAD: MOV #FN.RDA+200,R1 ; Move in function codes BR 10$e3REDADD: MOV #FN.RPA+200,R1 ; Move in function codes BR 10$o3REDLOA: MOV #FN.RSA+200,R1 ; Move in function codeh10$:# CALLR LODFN ; Load port functione .DSABL LSBh)DRADN: ; Entry for interrupt dispatcho)DRPDN: ; Entry for interrupt dispatche)DRSDN: ; Entry for interrupt dispatch 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 ; ...0) MOV -(R1),-(SP) ; Save address on stack MOV -(R1),-(SP) ; ...1 MOV -(R1),-(SP) ; ...s3 MOV C.KIR6(R4),@#KISAR6 ; Map to diagnostic bufferc* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS/ MOV (SP)+,(R0) ; Store address in user buffer  MOV (SP)+,2(R0) ; ...s MOV (SP)+,4(R0) ; ...a9 MOV #6,C.DATO-C.CHRL(R0) ; Save number of bytes returned  .IFF . MOV C.PCBP(R4),R1 ; Point to 2nd word of PCB TST (R1)+ ; .../ MOV (R1)+,(R0) ; Store address in user bufferR MOV (R1)+,2(R0) ; ...R MOV (R1)+,4(R0) ; ...C9 MOV #6,C.DATO-C.CHRL(R0) ; Save number of bytes returned$ .ENDC ;M$$MGE" CALLR FUNSUC ; Complete request10$: CALLR FUNUNS ; Request failed9 APR5PC REDDAD ; Make sure REDDAD is in APR5 addr space  V' .SBTTL WRTADD - Write physical address * .SBTTL WRTLOA - Write load server address;+;t%; **- WRTADD - Write Physical Address4(; **- WRTLOA - Write Load Server Address; G; This routine sets the load server or physical address of the UNA. The)F; address in the diagnostic buffer is given to the UNA using the Write7; Physical Adress or Write Load Server Address command. ; ; INPUTS:q; R5 = Port State Table ; R4 = Controller State TableE; R3 = Address of I/O packet; R0 = Request function header;R;D;- .ENABL LSB WRTADD:+ MOV #FN.WPA+200,R1 ; Set up function code+ BR 10$*WRTLOA:-+ MOV #FN.WSA+200,R1 ; Set up function codee10$: .IF DF M$$MGE3 MOV C.KIR6(R4),@#KISAR6 ; Map to diagnostic buffers* .IF DF K$$DAS ; If data space supported4 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 stackl MOV -(R0),-(SP) ; ...A MOV -(R0),-(SP) ; ...0( CALL MAPDRV ; Map to 2nd 4K of driver% MOV C.PCBP(R4),R2 ; Get PCB addressR CLR (R2)+ ; ... MOV (SP)+,(R2)+ ; Set up PCB MOV (SP)+,(R2)+ ; ...  MOV (SP)+,(R2)+ ; .... .IFFM, MOV C.PCBP(R4),R2 ; Get port control block CLR (R2)+ ; Skip command word MOV (R0),(R2)+ ; Set up PCBK MOV 2(R0),(R2)+ ; ...c MOV 4(R0),(R2)+ ; ...C .ENDC ;M$$$MGED7 CMP R1,#FN.WPA+200 ; Are we writing physical address?e BNE 20$ ; Nol; MOV -(R2),C.PADD+4(R4) ; Save physical addr as source addrA MOV -00nqpibjbkb a a a(R2),C.PADD+2(R4) ; ...r MOV -(R2),C.PADD(R4) ; ...C'20$: CALLR LODFN ; Load port function( .DSABL LSBP)DWADN: ; Entry for interrupt dispatch+)DWSAD: ; Entry for interrupt dispatch ! BCS 10$ ; If carry set, error. ) CALLR FUNSUC ; Return function successt10$:% CALLR FUNUNS ; Return unsuccessful)9 APR5PC WRTADD ; Make sure WRTADD is in APR5 addr spaceA $ .SBTTL REDMLT - Read Multicast List;+;M"; **- REDMLT - Read Multicast List;d; DESCRIPTION:; ; INPUTS:C; R5 = Port State Table-; R4 = Controller State TableC; R3 = Address of I/O packet; R0 = Address of user buffer ;;;- .ENABL LSBuREDMLT:c% MOV C.PCBP(R4),R1 ; Get PCB addresss TST (R1)+ ;3 MOV RELCT,(R1) ; Put unibus relocator addr in PCBf MOV RELCT+2,2(R1) ; ...L. ADD C.WRKP(R4),(R1)+ ; Compute unibus address ADC (R1) ; ...W- MOVB #10.,1(R1) ; Ask for all ten addressesT3 MOV #FN.RML+200,R1 ; Read Multicast list function CALLR LODFNDMLDN: BCS 30$1 MOV C.DATI-C.CHRL(R0),R2 ; Get users buffer sizeC CMP #60.,R2 ; Is it > max BHIS 10$ ; No MOV #60.,R2 ; Make it max10$:9 MOV R2,C.DATO-C.CHRL(R0) ; Save number of bytes returned * MOV C.WRKP(R4),R1 ; Point to work buffer$ MOV R0,-(SP) ; Save buffer address ASR R2 ; Make count words .IF DF M$$MGE20$:( 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 supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS' MOV (SP)+,(R0)+ ; Move the parameters DEC R2 ; Dec.counterm BNE 20$ ; Loop till doneR MOV (SP)+,R0 ; Restore R0r .IFF:20$: MOV (R1)+,(R0)+ ; Copy multicast list to user buffer DEC R2 ; Dec.counterR BNE 20$ ; Loop till doneF MOV (SP)+,R0 ; Restore R0V .ENDC ;M$$MGE CALLR FUNSUC ; Return success30$:" CALLR FUNUNS ; Complete request .DSABL LSBF9 APR5PC REDMLT ; Make sure REDMLT is in APR5 addr space6 t .SBTTL READCT - Read Counters( .SBTTL READCC - Read And Clear Counters;+;t; **- READCT - Read Counters&; **- READCC - Read And Clear Counters;RH; This routine is called to retreive the counters maintained by the UNA.;u ; INPUTS:; R5 = Port State Table; R4 = Controller State TableM; R3 = Address of I/O packet%; R0 = User diagnostic buffer pointeru;s;- .ENABL LSBLREADCT: READCC:e) MOV C.PCBP(R4),R1 ; Get the PCB addressT TST (R1)+ ; Point at PCBB+23 MOV RELCT,(R1) ; Put unibus relocator addr in PCB. MOV RELCT+2,2(R1) ; ...a. ADD C.WRKP(R4),(R1)+ ; Compute unibus address ADC (R1)+ ; ... MOV #64.,(R1) ; Set byte+ MOV #FN.RCN+200,R1 ; Assume Read Countersr .IF DF M$$MGE3 MOV C.KIR6(R4),@#KISAR6 ; Map to diagnostic buffer=* .IF DF K$$DAS ; If data space supported4 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$ ; Yes8 MOV #FN.CCN+200,R1 ; No, it is Read and Clear Counters10$: .IF DF M$$MGE CALL MAPDRV ; Map to driver .ENDC ; M$$MGE% CALLR LODFN ; Execute the functionM)DRCDN: ; Entry for interrupt dispatch)DRCCD: ; Entry for interrupt dispatch; BCS 40$ ; Success3 MOV C.DATI-C.CHRL(R0),-(SP) ; Get user buffer sizeM ASR (SP) ; Make it word count/ .IF DF M$$MGE ; If memory management wupport ( CALL MAPDRV ; Map to 2nd 4K of driver .IFTF ;M$$MGE. MOV @C.WRKP(R4),R2 ; Get counters word count3 CMP R2,(SP) ; Can user buffer hold all counters?E BLOS 20$ ; YesM. MOV (SP),R2 ; Use word count of user buffer20$:& MOV C.KIR6(R4),@#KISAR6 ; Map to user* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS9 MOV R2,C.DATO-C.CHRL(R0) ; Save number of bytes returned ASL C.DATO-C.CHRL(R0) ; ..., MOV C.WRKP(R4),R1 ; Point to data returned, TST (R1)+ ; Skip count of words in buffer( MOV R000n qof__DATADATADATADATA,(SP) ; Save R0 on stack .IFT ;M$$MGEn30$:( 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 supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS' MOV (SP)+,(R0)+ ; Move the parametersR DEC R2 ; Dec.countert BNE 30$ ; Loop till doneH .IFF ;M$$MGEM030$: MOV (R1)+,(R0)+ ; Copy data to user buffer DEC R2 ; Dec.counters BNE 30$ ; Loop till doneP .ENDC ;M$$MGE MOV (SP)+,R0 ; Restore R0 CALLR FUNSUC ; Return success40$: CALLR FUNUNS ; Request failed .DSABL LSB(9 APR5PC READCT ; Make sure READCT is in APR5 addr spacee o .SBTTL REDMOD - Read Mode;+;p; **- REDMOD - Read Mode; 4; This function reads the current mode from the UNA.;D ; INPUTS:e; R5 = Port State TableL; R4 = Controller State TableM; R3 = Address of I/O packet; R0 = Address of user buffer ; ;- .ENABL LSBEREDMOD:L( 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 address) MOV 2(R1),C.MODE(R4) ; Save current modes .IF DF M$$MGE- MOV C.KIR6(R4),@#KISAR6 ; Map to user buffer5* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ;M$$MGE0 MOV C.MODE(R4),(R0) ; Save Mode in user buffer9 MOV #2,C.DATO-C.CHRL(R0) ; Save number of bytes returned " CALLR FUNSUC ; Complete request10$: CALLR FUNUNS ; Request failed9 APR5PC REDMOD ; Make sure REDMOD is in APR5 addr space  d .SBTTL WRTMOD - Write Mode ;+;c; **- WRTMOD - Write modeM;B; This routine is used to set the mode word in the UNA. To useE; this function, the user should first do a Get Mode to get a copy ofsG; the current UNA mode and set all bits currently set to avoid changing E; a request from other users. A copy of this requested mode is savedtG; in case an enable all multicast must be done. The interrupt entry is E; shared with the set multicast if enable all multicast must be done.p; ; INPUTS:B; R5 = Port State Table; R4 = Controller State Tabled; R3 = Address of I/O packet"; R0 = Pointer to user data buffer;o;- .ENABL LSBtWRTMOD:u .IF DF M$$MGE6 MOV C.KIR6(R4),@#KISAR6 ; Restore user buffer mapping* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .IFTF ;M$$MGE$ MOV (R0),-(SP) ; Get new mode bits .IFTt( CALL MAPDRV ; Map to 2nd 4K of driver .ENDC ;M$$MGE) MOV C.PCBP(R4),R2 ; Get the PCB address % CLR (R2)+ ; Clear out old functiona# MOV (SP)+,(R2) ; Fill in new mode ; BIS #MD.TPD,(R2)+ ; Make sure transmit padding is enabledD* MOV #FN.WMD+200,R1 ; Write mode function# CALLR LODFN ; Load port functionFDWMDN: BCS 10$ ; If CS, errord .IF DF M$$MGE( CALL MAPDRV ; Map to 2nd 4K of driver .ENDC ;M$$MGE% MOV C.PCBP(R4),R1 ; Get PCB addressw, MOV 2(R1),C.MODE(R4) ; Save as current mode .IF DF M$$MGE& MOV C.KIR6(R4),@#KISAR6 ; Map to user* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ;M$$MGE CALLR FUNSUC ; Return success10$: CALLR FUNUNS ; Request failed9 APR5PC WRTMOD ; Make sure WRTMOD is in APR5 addr spaceS o! .SBTTL REDSTA - Read Port StatusV+ .SBTTL REDCST - Read And Clear Port StatusE;+;C; **- REDSTA - Read Port Status); **- REDCST - Read And Clear Port Statuse;I; This function is called to implement the Read Port Status command. The N; channel status is put in the first three words of the user's buffer followedN; by the value of the last self-test performed (and power/cable bits). (PCSR1)B; If the user's buffer is not long enough, the request is returned; "unsupported"a; ; IN00nqpibjbkb a a aPUTS:o; R5 = Port State Tableo; R4 = Controller State Tablea; R3 = Address of I/O packet; R0 = Address of user bufferS;u;- .ENABL LSB-REDSTA: REDCST:t .IF DF M$$MGE8 MOV C.KIR6(R4),@#KISAR6 ; Map to user diagnostic buffer* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .IFTF ;M$$MGE1 MOV #FN.RLS+200,R1 ; Assume Read Status Commandu; CMP C.TYP-C.CHRL(R0),#FN.RLS; Is this Read Status functiont BEQ 10$ ; Yes+ MOV #FN.CLS+200,R1 ; It is Read And Cleare10$: .IFT ;M$$MGE=( CALL MAPDRV ; Map to 2nd 4K of driver .ENDC ; M$$MGE% CALLR LODFN ; Execute the function$DRSTD:DRCSD: BCS 20$ ; IF CS, errorr .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 stacks MOV (R1)+,-(SP) ; ... MOV (R1)+,-(SP) ; ....8 MOV C.KIR6(R4),@#KISAR6 ; Map to user diagnostic buffer* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS4 MOV (SP)+,(R0)+ ; Store status info in user buffer MOV (SP)+,(R0)+ ; ...I MOV (SP)+,(R0)+ ; ...$ .IFF ;M$$MGED, MOV C.PCBP(R4),R1 ; Get address of the PCB TST (R1)+ ; Point to PCB+2T3 MOV (R1)+,(R0)+ ; Copy Status info to user buffers MOV (R1)+,(R0)+ ; ...V MOV (R1)+,(R0)+ ; ...V .ENDC ;M$$MGE$ 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 request20$: CALLR FUNUNS ; Request failed .DSABL LSBt9 APR5PC REDSTA ; Make sure REDSTA is in APR5 addr spaceV + .SBTTL REDSID - Read System ID;+;P; **- REDSID - Read System IDe;B@; This routine is called to retreive the system ID from the UNA.;o ; INPUTS:f; R5 = Port State Table ; R4 = Controller State Table; R3 = Address of I/O packet%; R0 = User diagnostic buffer pointer);0;- .ENABL LSBnREDSID:f) MOV C.PCBP(R4),R1 ; Get the PCB addressU TST (R1)+ ; Point at PCBB+23 MOV RELCT,(R1) ; Put unibus relocator addr in PCBR MOV RELCT+2,2(R1) ; ...D. ADD C.WRKP(R4),(R1)+ ; Compute unibus address ADC (R1)+ ; ...* MOV #100.,(R1) ; Store word count in PCB. MOV #FN.RSY+200,R1 ; Read system ID function% CALLR LODFN ; Execute the function5)DRSID: ; Entry for interrupt dispatch  BCS 20$ ; Success= MOV C.DATI-C.CHRL(R0),R2 ; R2 = # of bytes requested by user.9 MOV R2,C.DATO-C.CHRL(R0) ; Save number of bytes returnedr 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$$MGE10$:( CALL MAPDRV ; Map to 2nd 4K of driver! MOV (R1)+,-(SP) ; Get next byteo& MOV C.KIR6(R4),@#KISAR6 ; Map to user* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS' MOV (SP)+,(R0)+ ; Move the parameters# DEC R2 ; Dec.countere BNE 10$ ; Loop till done  MOV (SP)+,R0 ; Restore R0e .IFFR410$: MOV (R1)+,(R0)+ ; Move parameters to user area DEC R2 ; Dec.counter, BNE 10$ ; Loop till done MOV (SP)+,R0 ; Restore R0  .ENDC ; M$$MGE CALLR FUNSUC ; Return success20$: CALLR FUNUNS ; Request failed .DSABL LSB9 APR5PC REDSID ; Make sure REDSID is in APR5 addr spaceD ; .SBTTL WRTSID - Write system ID;+;$; **- WRTSID - Write system ID;eD; This routine is called to set the system ID parameters in the UNA.K; To use this command the user should first execute a Get System ID commandtG; so that default parameter values may be obtained. The user will thenJ; change the fields desired and issue this command to write the parameters; back to the UNA.;R ; INPUTS: ; R5 = Port State Table ; R4 = Controller State Table ; R3 = Address of I/O packet#; R0 = Request function data buffers; ;- .ENABL LSB*WRTSID:- .IF DF M$$MGE& MOV C.KIR6(R4),@#KISAR600nqof__DATADATADATADATA ; Map to user* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ;M$$MGE8 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 stackh& 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 supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS! MOV (R0)+,-(SP) ; Get next byteM( CALL MAPDRV ; Map to 2nd 4K of driver' MOV (SP)+,(R2)+ ; Move the parameters$ DEC R1 ; Dec.counterR BNE 10$ ; Loop till dones .IFFA* MOV (R0)+,(R2)+ ; Move ID to work buffer DEC R1 ; Dec.counterh BNE 10$ ; Loop till doneW .ENDC ; M$$MGE$ MOV (SP)+,R0 ; Restore R0 at entry' MOV C.PCBP(R4),R1 ; Get PCB+2 address. TST (R1)+ ; ...1 MOV RELCT,(R1) ; Generate unibus address in PCB  MOV RELCT+2,2(R1) ; ...N ADD C.WRKP(R4),(R1)+ ; ...- ADC (R1)+ ; ...* MOV (SP)+,(R1) ; Store word count in PCB+ MOV #FN.WSY+200,R1 ; Set up function code# CALLR LODFN ; Load port function;)DWSID: ; Entry for interrupt dispatch+ BCS 20$ ; Function failed CALLR FUNSUC ; Return success20$: CALLR FUNUNS ; Request failed .DSABL LSBR9 APR5PC WRTSID ; Make sure WRTSID is in APR5 addr spaced .< .SBTTL ****************************************************< .SBTTL * UNA QIO Driver Subroutines *< .SBTTL ***************************************************** .SBTTL SALL - Save Registers Co-routine;+$; **-SALL- Save Registers Co-routine;; Saves registers R0 - R5.;u; Input:; None;$;-$SALL: MOV R0,-(SP) ; Save registers MOV R1,-(SP) ; ... MOV R2,-(SP) ; ... MOV R3,-(SP) ; ... MOV R4,-(SP) ; ...' MOV 12(SP),-(SP) ; Get return addressd- MOV R5,14(SP) ; Replace return addr with R5*! CALL @(SP)+ ; Return to caller " MOV (SP)+,R4 ; Restore registers MOV (SP)+,R3 ; ... MOV (SP)+,R2 ; ... MOV (SP)+,R1 ; ... MOV (SP)+,R0 ; ... MOV (SP)+,R5 ; ... RETURN ;5 APR5PC SALL ; Make sure SALL is in APR5 addr spacet 09 .SBTTL BFCHK - Validate optional characteristics buffer ;+3; **-BFCHK-Validate optional characteristics buffer.;MD; Check the optional characteristics buffer supplied on transmit and; receive functions.;- ; Inputs:c; R3 = Address of I/O packet; R5 = Port State Table addressV?; I.PRM+6 - Virtual address of optional characteristics bufferR6; I.PRM+10- Length of optional characteristics buffer:; I.PRM+12- Virtual address of optional diagnostic buffer1; I.PRM+14- Length of optional diagnostic buffer ;V ; Outputs:5; I/O packet extension is set up with relocation biasp; for P2 and P3s&; R0 = Error code if buffer is invalid-; 'C' Clear - Buffer is valid or not suppliede; 'C' Set - Buffer is invalid;3; Registers modified:t ; R0, R1, R2;tBFCHK: MOV R4,-(SP) ; Save R4" CLR -(SP) ; Get a work register/ MOV IP.EXT(R3),R4 ; R4 = I/O packet extensionr5 MOV I.PRM+6(R3),R0 ; Get address of optional buffern/ BEQ 50$ ; No optional characteristics buffero) MOV I.PRM+10(R3),R1 ; Get buffer length/ BEQ 40$ ; If EQ, illegalw# CMP R1,#XMTBSZ ; Is it too large?d BHI 40$ ; If HI, yesf% CALL MPTHDR ; Map to task's headeri5 MOV I.PRM+6(R3),R0 ; Get address of optional bufferi ; ... "MPTHDR" distroyed it .IF DF R$$MPL ; If RSX-11M+) CALL $CKBFB ; Address check the buffert .IFFV) CALL $ACHKB ; Address check the buffer .ENDC ; R$$MPL" BCS 40$ ; If CS, illegal buffer( CALL $RELOC ; Relocate buffer address% MOV R1,2(R4) ; Store bias of bufferr3 MOV R2,I.PRM+6(R3) ; ... and it's virtual addressS1 .IF DF M$$MGE ; If memory management supportedC1 MOV R1,@#KISAR6 ; Map to characteristics buffer)* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .EN00n"qpibjbkb a a aDC ; K$$DAS .ENDC ; M$$MGE/ MOV #I.PRM+6,R0 ; R0 = Offset into I/O packete/ CALL CKCHR ; Validate characteristics buffer , 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 lengthe BEQ 60$ ; If EQ, illegal# CMP R1,#XMTBSZ ; Is it too large?s BHI 60$ ; If HI, yes$% CALL MPTHDR ; Map to task's headerK6 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 buffera .IFFs) CALL $ACHKB ; Address check the bufferc .ENDC ; R$$MPL" BCS 60$ ; If CS, illegal buffer( CALL $RELOC ; Relocate buffer address% MOV R1,4(R4) ; Store bias of bufferr4 MOV R2,I.PRM+12(R3) ; ... and it's virtual address1 .IF DF M$$MGE ; If memory management supportedC1 MOV R1,@#KISAR6 ; Map to characteristics buffer3* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE0 MOV #I.PRM+12,R0 ; R0 = Offset into I/O packet/ CALL CKCHR ; Validate characteristics buffer  BCC 30$ ; Buffer is OKC& BR 60$ ; Clr diag buffer parameters'30$: CLC ; Assume there was no errorV MOV (SP)+,R0 ; Get statust BEQ 35$ ; All was wellD SEC ; Indicate error return 35$: MOV (SP)+,R4 ; Restore R4a( CALL MAPDRV ; Map to 2nd 4K of driver RETURN ; Return to callerd<40$: MOV #IE.SPC&377,(SP) ; Set up illegal buffer error code.50$: CLR I.PRM+6(R3) ; Indicate no AUX buffer7 CLR I.PRM+10(R3) ; No optional characteristics buffera BR 10$ ; Return<60$: MOV #IE.SPC&377,(SP) ; Set up illegal buffer error code670$: CLR I.PRM+12(R3) ; Indicate no diagnostic buffer CLR I.PRM+14(R3) ; ... BR 30$ ; Done7 APR5PC BFCHK ; Make sure BFCHK is in APR5 addr space+ ;0 .SBTTL CKCHR - Validate characteristics buffer;+*; **-CKCHR-Validate characteristics buffer;ED; Validate that the characteristics buffer is in the correct format.;- ; Inputs:n5; R0 = Offset in I/O packet to characteristics bufferr ; R3 = Address of the I/O packet; APR6 is mapped to buffer; ; Outputs:4; 'C' Clear - Characteristics buffer format is valid6; 'C' Set - Characteristics buffer format is invalid; )CKCHR: MOV R1,-(SP) ; Get some registersF MOV R2,-(SP) ; ...3 ADD R3,R0 ; Compute address of buffer descriptoru2 MOV (R0)+,R1 ; Get virtual address of the buffer- MOV (R0),R0 ; Get # of bytes in the bufferi210$: TST R0 ; Any more bytes left in the buffer?* BEQ 40$ ; If EQ, no ... buffer is valid BLT 30$ ; Buffer is invalid7 CMP R0,#C.CHRL ; Enough space for a char. descriptor?  BLO 30$ ; If LO, no6 BIT #1,C.DATI(R1) ; Next charac. block word aligned? BNE 30$ ; If NE, no8 BIT #1,C.DATO(R1) ; Just in case it is an output buff. BNE 30$ ; If NE, no/ CLR C.STAT(R1) ; Clear characteristics status : SUB C.DATI(R1),R0 ; Remove space for this characteristic SUB #C.CHRL,R0 ; ...= ADD C.DATI(R1),R1 ; Point to next characteristic descriptor  ADD #C.CHRL,R1 ; ... BR 10$ ; and loop30$: SEC ; Indicate error&40$: MOV (SP)+,R2 ; Restore registers MOV (SP)+,R1 ; ... RETURN ;7 APR5PC CKCHR ; Make sure CKCHR is in APR5 addr space$ I+ .SBTTL GTPRT - Assign a port to requestori;+%; **-GTPRT-Assign a port to requestoro;D; Parse the string, search the controller ports for a free; port.s;- ; Inputs:h; R3 = Address of I/O packet#; I.PRM - Bias of string 0; I.PRM+2 - Virtual address of string'; I.PRM+4 - Length of stringC; ; Outputs:!; R0 = Error code (if applicable)r'; IE.NSF - No such in system #; R5 = Address of Port Status BlockH-; 'C' Clear - successfully assigned-; 'C' Set - Assignment error; ; Registers modified:t; R0, R1, R2, R4, R5; GTPRT:( MOV R3,-(SP) ; Save I/O packet add00n*qof__DATADATADATADATAress8 MOV I.PRM+2(R3),R0 ; Get virtual address of the string> MOV I.PRM+4(R3),R4 ; Compute address of the end of string +11 .IF DF M$$MGE ; If memory management supported / MOV @IP.EXT(R3),@#KISAR6 ; Map to input stringc* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE' CMPB #'L,(R0) ; Check for DELUA first BNE 5$ ; No, must be DEUNA!+ TSTB (R0)+ ; Skip over the "l" characterv CMPB #'U,(R0)+ ; Is it LUA?M BNE 20$ ; No, error BR 7$ ; DELUA so far!*5$: CMPB #'U,(R0)+ ; Check for UNA device BNE 20$ ; ... CMPB #'N,(R0)+ ; ... BNE 20$ ; ...7$: CMPB #'A,(R0)+ ; ...) BNE 20$ ; ... CMPB #'-,(R0)+ ; Check for "-" BNE 20$ ; Syntax error' MOVB (R0),R1 ; Get controller numbers CMPB R1,#'0 ; Below ASCII 0?. BLT 20$ ; Yes, error CMPB (R0),R1 ; Above ASCII 7? BGT 20$ ; Yes, error & BIC #177770,R1 ; Clear unwanted bits0 CMP R1,#U$$NCT-1 ; Is controller number valid?& BHI 20$ ; Invalid controller number) ASL R1 ; Covert it to controller indexi. MOV CTABL(R1),R4 ; R5=Controller State Table' MOV R4,R5 ; Gen pointer to port list/ ADD #C.PORT,R5 ; Point to port list root word"*10$: MOV (R5)+,R5 ; Get next port address BEQ 20$ ; End of list* BIT #PS.OPN,P.FLAG(R5) ; This port open? BNE 10$ ; No! CLC ; Indicate good returnB BR 30$ ; Return+20$: MOV #IE.NSF,R0 ; Say, no such lineP' SEC ; Indicate no available porti30$:( CALL MAPDRV ; Map to 2nd 4K of driver MOV (SP)+,R3 ; Restore R3l RETURN ;7 APR5PC GTPRT ; Make sure GTPRT is in APR5 addr space  n .SBTTL MAPBF - Map to buffer;+; **-MAPBF-Map to buffer;t?; This routine takes the physical address in I.PRM+2 and IX.ADRE9; and computes APR5 bias and displacement for I/O buffer.E;- ; Inputs:; R3 = I/O packet addressr'; I.PRM+2 = Low order physical address#(; I.PRM+1 = High order physical address; ; Output: ; KISAR6 mapped with biasC; R2 = Displacement ; ; Registers R1 changed; MAPBF: MOV R0,-(SP) ; Save R04 MOV I.PRM+2(R3),R1 ; R1 = Low order buffer address8 MOV @IP.EXT(R3),R0 ; R0 = High order bits in high byte; G; For 18 bit systems the high bits are in bits 4 and 5. Otherwise, theD2; high byte contains the high bits of the address.;u- .IF DF M$$EXT ; Extended memory supported?s( SWAB R0 ; High order bits in low byte .IFF ; If 18 bit systemc- ASR R0 ; Move bits 4 and 5 to bits 0 and 1b ASR R0 ; ...l ASR R0 ; ...e ASR R0 ; ...d0 BIC #177774,R0 ; Make sure high bits are clear .ENDC ; M$$EXT/ .IF DF M$$EIS ; If extended instrucation seth$ ASHC #-6.,R0 ; Calculate APR bias .IFFe .REPT 6 ROR R0 ; Divide by octal 100i ROR R1 ; ...b .ENDR .ENDC ; M$$EIS MOV R1,@I.PRM(R3) ; Save bias;9 BIC #177700,I.PRM+2(R3) ; R2 = Offset into 1st 100 bytess9 BIS #140000,I.PRM+2(R3) ; R2 = Virtual address of buffer MOV (SP)+,R0 ; R0 = Restore R0 RETURN ; Return to caller 7 APR5PC MAPBF ; Make sure MAPBF is in APR5 addr spacei e- .SBTTL GTXMH - Get a transmit header packet ;+'; **-GTXMH-Get a transmit header packet.; 6; This routine will allocate a transmit header packet.;- ; Inputs:a); Transmit header list (C.XBUF root word) ; ; Output:M; R0 points to transmit header*; 'C' Clear - Transmit header packet found.; 'C' Set - Transmit packet header NOT found;t; Registers R1 changed;V%GTXMH: MOV R2,-(SP) ; Save R2 and R3  MOV R3,-(SP) ;( $DQPKT C.XHDR ; Get a transmit packet/ MOV R3,R0 ; Put transmit packet header in R1a" MOV (SP)+,R3 ; Restore R3 and R2 MOV (SP)+,R2 ; RETURN ; 0 .SBTTL GTPST - Get address of Port State Table;+*; **-GTPST-Get address of Port State Table;rA; This routine gets the address of the port control block via thel ; I/O packet.h;e ; Inputs:u; R3 = Address of I/O packet; ; Outputs:"; R5 = Address of Port State Table00n2qpibjbkb a a a(; R4 = Address of Controller State Table;V; Registers Changed ; R4, R5;-4GTPST: BIT #CS.INI,C.FLAG(R4) ; Are we initializing?+ BNE 20$ ; Yes, init does not use a port. , BIT #1,R3 ; Do we have a real I/O packet? BNE 20$ ; No, just return.t+ MOV I.TCB(R3),R5 ; Get task's TCB addresso8 MOV T.PCB(R5),R5 ; .. then PCB addr of task's window 0' ; .. (PCB=Partition Control Block)t- TST P.HDR(R5) ; Task Header in primary poolt .IF DF R$$MPL .IF DF M$$MGE- BNE 10$ ; If NE, header is in primary poolS, MOV P.REL(R5),@#KISAR6 ; Map to task header* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS10$: .ENDC ;M$$MGE .ENDC ;R$$MPL* MOV @I.LN2(R3),R5 ; Get port state table& BIC #1,R5 ; Clear LUN interlock bit0 MOV P.CTBL(R5),R4 ; Get Controller State Table( CALL MAPDRV ; Map to 2nd 4K of driver!20$: RETURN ; Return to calleri7 APR5PC GTPST ; Make sure GTPST is in APR5 addr space; E) .SBTTL LODFN - Load Secondary Functoion)& .SBTTL LODCM - Load Primary Function;+; %; **- LODFN - Load Secondary FunctionR#; **- LODCM - Load Primary Functiona;D; These simple routines load the requested commands into the UNA and; intitiate the request.;b ; Inputs:,; R4 = Controller State Table; R3 = Address of I/O packet&; R1 = Secondary Function (LODFN only)(; R0 = Primary Function (only for LODCM); ; Registers Modified:T; R0,R1a;s;- .ENABL LSBPLODFN:! MOV #CM.GCM,R0 ; Set up command , MOVB R0,C.FUNS(R4) ; Save Primary Function5 MOVB R1,C.FUNS+1(R4) ; Save secondary function codeF- BIC #177740,R1 ; Make sure its a legal code/ MOV R1,@C.PCBP(R4) ; Set up secondary commandm BR 10$oLODCM:' CLRB C.FUNS+1(R4) ; No function values110$: MOV R3,C.CFNC(R4) ; Save addr of I/O packet 1 MOVB @C.CSR(R4),-(SP) ; Get current CSR contents3 BICB #R0.PCM,(SP) ; Clear out any command presentt2 BIC #^C,R0 ; Make sure we save only code BISB R0,(SP) ; Set command in. MOVB (SP)+,@C.CSR(R4) ; Issue primary command4 MOVB R0,C.FUNS(R4) ; Save current primary function$ MOVB #CNTTIM,C.CTMR(R4) ; Set timer CALL CLOCK ; Start timer RETURN ; .DSABL LSBB o% .SBTTL POLRG - Poll Ring Subroutinen;+;u ; **-POLRG-Poll Rings Subroutine;aF; This routine is called when a transmit request or requests have beenL; added to the transmit chain or when a receive buffer has been added to theI; receive chain. If the poll request flag already set, the routine exits.CJ; Otherwise CS.POL is set in the controller flag and controll is passed to; the function initiator.I;.;R ; INPUTS:t; R4 = Controller State Tablei; ; REGISTERS MODIFIED:S; None;;- .ENABL LSB 6POLRG: BIT #CS.POL,C.FLAG(R4) ; Poll flag already set? BNE 10$ ; Yes, just returne5 BIS #CS.POL,C.FLAG(R4) ; Request a poll of the ringsn- CALLR FNINI ; Try to initiate the functionv!10$: RETURN ; Return to callere .SBTTL LODUM - Load UNA memory;+;e; **-LODUM-Load UNA memory;w ; Inputs:i; R3 - Address of I/O packet; R4 - Controller State Table ;c ; Outputs:; IS.SUC - Sucessful Load ?; IS.ABO - Time out or fatal controller error, load is aborted.;;- .ENABLE LSBLODUM:, MOV I.PRM+2(R3),R0 ; R0 = Microcode buffer5 MOV R0,C.LOAD+2(R4) ; Compute end of buffer pointer " ADD I.PRM+4(R3),C.LOAD+2(R4); ...5 MOV R0,C.LOAD+4(R4) ; Save it again as work pointer 3 MOV C.RBFL(R4),C.LOAD+6(R4) ; Get a receive bufferN5 MOV @C.LOAD+6(R4),C.RBFL(R4); Dequeue receive bufferu10$:- MOV R3,C.CFNC(R4) ; Save I/O packet address 1 .IF DF M$$MGE ; If memory management supporteda3 MOV @IP.EXT(R3),@#KISAR6 ; Map to microcode buffer * .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS) MOV @#KISAR6,C.LOAD(R4) ; Save APR6 biasC .ENDC ; M$$MGE2 MOV (R0)+,-(SP) ; Save byte count of this record2 MOV (R0)+,-(SP) ; Save UNA internal load add00n:qof__DATADATADATADATAress( CALL MAPDRV ; Map to 2nd 4K of driver8 MOV C.WRKP(R4),R1 ; Get pointer to scratch area (UDBB)- MOV 2(SP),(R1) ; Set byte count of transfer 6 BEQ 40$ ; If EQ, End of load sections in this block2 BMI 70$ ; Branch to load start address function- MOV (SP)+,6(R1) ; Copy the WCS load addressa2 CLR 10(R1) ; Clear high order byte of load addr5 CMP (SP),#512.-4. ; Is byte count GT a disk buffer?0 BHI 35$ ; Yes, abort load6 ADD #4,C.LOAD+4(R4) ; Point to next record in buffer ADD (SP),C.LOAD+4(R4) ; .../ MOV RELCT,2(R1) ; Set relocation bias in UDBBo MOV RELCT+2,4(R1) ; ...)+ MOV C.LOAD+6(R4),R3 ; Use receive buffer.e1 ADD R3,2(R1) ; Compute Unibus address of buffers ADC 4(R1) ; ...20$:/ .IF DF M$$MGE ; If memory management support)- MOV C.LOAD(R4),@#KISAR6 ; Map to user bufferl* .IF DF K$$DAS ; If data space supported4 MOV @#KISAR6,@#KDSAR6 ; Data space overmaps I space .ENDC ; K$$DAS .ENDC ; M$$MGE/ MOVB (R0)+,-(SP) ; Copy data from user bufferO( CALL MAPDRV ; Map to 2nd 4K of driver( MOVB (SP)+,(R3)+ ; Copy to load buffer" DEC (SP) ; Decrement byte count BNE 20$ ; Loop till done, TST (SP)+ ; Tidy stackr7 MOV C.PCBP(R4),R3 ; Get pointer to Port Control Block;/ MOV RELCT,2(R3) ; Set relocation bias in UDBB, MOV RELCT+2,4(R3) ; ...e' ADD R1,2(R3) ; Compute Unibus addressp ADC 4(R3) ; ...- MOV C.CFNC(R4),R3 ; Restore R3 for "LODFN". * MOV #FN.LOA,R1 ; Microcode load function% CALLR LODFN ; Execute the functionO;L!; We get here after the interruptr;M#LOADN: BCS 30$ ; Errors are fatalr* MOV C.LOAD+4(R4),R0 ; Get buffer pointer6 CMP R0,C.LOAD+2(R4) ; Have we reached end of buffer?# BLO 10$ ; No, continue with loadr BEQ 50$ ; Yes, end of buffer)30$:! CALL IEABO ; Abort the requestL2 CALL MAPDRV ; Make sure we are mapped to driver! CALL FTL ; Do fatal processingV" BR 60$ ; Free up receive buffer/35$: TST (SP)+ ; Remove byte count from stack BR 30$ ; Abort load;f; End of buffer ;g40$: CMP (SP)+,(SP)+ ; Tidy stack50$:7 MOV #IS.SUC&377,R0 ; Successful load of load sectionsu4 MOV C.LOAD+4(R4),R1 ; Compute number of characters$ SUB I.PRM+2(R3),R1 ; ... processed CALL RQDON ; Return I/O done 960$: MOV C.RBFL(R4),@C.LOAD+6(R4); Free up receive bufferL" MOV C.LOAD+6(R4),C.RBFL(R4) ; ... RETURN ;;T ; End of loadp;e70$:) MOV C.PCBP(R4),R1 ; Get the PCB address:- MOV (SP)+,2(R1) ; Move in the start addressB5 CLR 4(R1) ; Clear high order addr (DELUA specific) TST (SP)+ ; Get rid of -13 MOV #FN.LSM,R1 ; Load and start microcode addressd5 CALL LODFN ; Issue the command, the interrupt willh' ; return control to LSMDN in CTINIe! BR 50$ ; Return I/O completionn .DSABL LSBC7 APR5PC LODUM ; Make sure LODUM is in APR5 addr spaceA 41 .SBTTL FTL - Fatal controller error processora;+; **-FTL-FATAL controller errore;h7; This subroutine performs fatal controller processing.r;-;C ; Inputs:;; R4 = Controller State Tablep;f ; Outputs:;+; 1. The controller is reset/; 2. If controller initializing, retry 3 times. .; 3. Port related data structures are released9; 4. All I/O packets are returned to the requesting tasksu; with IE.ABO status code.S8; 5. All ports belonging to the controller are marked as4; requiring initialization (IO.XIN QIO function).7; This is required to simulate DECnet functionality.s;b .ENABL LSBr%FTL: CALL SALL ; Save all registers# TST C.CSR(R4) ; Do we have a CSR?a BEQ 10$ ; Not6 MOVB #R0.RST,@C.CSR(R4) ; Reset the UNA so that it is( ; ... put in a known state. Do not ; ... enable interrupts.e-10$: CLR C.CTMR(R4) ; Clear controller timerr' CLR C.XMTT(R4) ; Clear transmit timer * BIS #CS.OFL,C.FLAG(R4) ; Indicate offline. BIT #CS.INI,C.FLAG(R4) ; Are we initializing? BEQ 20$ ; noc) DECB C.RTRY(R4) ; Decrement retry countE& BLE 20$ ; We have tried three times;T=; we will try to initialize the controller up to00nBqpibjbkb a a a three times.a;a6 MOV #-2,C.FUNS(R4) ; Set up current command dispatch; MOVB #RSTIM,C.CTMR(R4) ; Set up timer for possible failureo: MOVB #R0.IE,@C.CSR(R4) ; Re-enable interrupts, cleared by ; ... reset7 MOV C.INIW(R4),C.CFNC(R4) ; Get 1st waiting I/O packetS BR 95$ ; Return;a&; Release port related data structures; 420$: 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!s, CALL RLPRT ; Release port data structures4 BIS #PS.XIN,P.FLAG(R5) ; Set requirs initialization! MOV R5,R0 ; Point to next port. BR 30$ ; Go, get next portr;s,; Return I/O packets with IE.ABO status code;.+40$: MOV R4,R5 ; Point to xmit wait queue5 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$:1 MOV (R5),R3 ; R3 = Transmit pending I/O packets BEQ 60$ ; No more2 MOV C.XMTC(R4),R2 ; Get next item from xmit ring? MOV RG.LNK(R2),C.XMTC(R4) ; Move current pointer to next entryO= MOV C.XHDR(R4),@RG.VAD(R2) ; Insert xmit header in free list MOV RG.VAD(R2),C.XHDR(R4) ; ...0 .IF DF M$$EXT ; If extended memory supported?3 MOV C.XMTC(R4),R2 ; Get xmit data entry from ring.) MOV RG.UMR(R2),R2 ; R2 = UMR wait blockV- ADD #10,R2 ; Point to UMR assignment blockM CALL $DEUMR ; Deassign UMR3 MOV C.UCB(R4),R1 ; R1 = UCBc .IFTF ; M$$EXT- MOV C.XMTC(R4),R2 ; R2 = Current ring entryi .IFT ; M$$EXT2E MOV U.UCBX+6(R1),@RG.UMR(R2); Insert wait block into wait block list." MOV RG.UMR(R2),U.UCBX+6(R1) ; ... .ENDC ; M$$EXT? MOV RG.LNK(R2),C.XMTC(R4) ; Move current pointer to next entrye MOV (R5),R3 ; R3 = I/O packet! MOV (R3),(R5) ; Deque from list(( CALL IEABO ; Return with abort status BR 50$ ; Loop till all done60$:. MOV R4,R5 ; Point to pending function queue ADD #C.PFNC,R5 ; ..." CALL 100$ ; Abort queue entries' MOV R4,R5 ; Point to init wait queue; ADD #C.INIW,R5 ; ..." CALL 100$ ; Abort queue entries) MOV R4,R5 ; Point received buffer listX ADD #C.RCVD,R5 ; ...70$:( MOV (R5),R0 ; Get next receive buffer BEQ 90$ ; We are done1 MOV (R0),(R5) ; Deque buffer from received list,2 MOV C.RBFL(R4),(R0) ; Insert buffer in free list MOV R0,C.RBFL(R4) ; ... BR 70$ ; 390$: CLR C.CFNC(R4) ; There is no current functione CLR C.FUNS(R4) ; .../95$: BR FRERCV ; Free up receive ring buffers,+100$: MOV (R5),R3 ; Get next item in listR BEQ 120$ ; Done MOV (R3),(R5) ; Dequeue item;+E; We must check if the request is an open request. If it is, we have(F; to free up the port assigned to it and clear the 2nd word of the lun; entry in the task header.e;-4 MOVB I.FCN+1(R3),-(SP) ; Get function code for this) BIC #^C<177>,(SP) ; Clear unwanted bits . CMP (SP)+,#FCOPN ; Is this an open function? BNE 110$ ; No, just abort it.% CALL MPTHDR ; Map to task's headern+ MOV @I.LN2(R3),R0 ; R0 = Port State Tablei+ BIC #1,R0 ; Clear possible interlock bitR% CLR P.FLAG(R0) ; Show port not open 9 CLR @I.LN2(R3) ; Show not open in 2nd word of LUN entryo( CALL MAPDRV ; Map to 2nd 4K of driver&110$: CALL IEABO ; Abort the request BR 100$ ; Do next itemC"120$: RETURN ; Return to caller6 APR5PC FTL ; Make sure FTL is in APR5 address space .DSABL LSB  a( .SBTTL FRERCV - Free up receive buffers;+ ; **-FRERCV-Free receive buffers;h>; This routine deallocates the buffers assigned to the receive; ring entries.l;n ; Inputs:R; Receive ring entries;o ; Outputs:/; Receive buffers are returned to the free list ; ; Registers modified:;; R0;-3FRERCV: MOV C.RCVB(R4),R0 ; R0 = Receive ring basee-10$: TSTB RG.ACT(R0) ; Is this entry active?  BEQ 20$ ; Nol< CLRB RG.ACT(R0) ; Deactivate it. So we don't do this again/ MOV RG.VA00nJqof__DATADATADATADATAD(R0),R1 ; Get Unibus addr of bufferc+ MOV C.RBFL(R4),(R1) ; Insert in free listf MOV R1,C.RBFL(R4) ; ...a(20$: MOV RG.LNK(R0),R0 ; Get next entry' BEQ 30$ ; Not yet initialized, skip.e2 CMP R0,C.RCVB(R4) ; Have we scanned all entries? BNE 10$ ; No !30$: RETURN ; Return to calleri ;& .SBTTL CTINI - Initialize Controller;+;e ; **-CTINI-Initialize Controller;)C; This routine is called to start up the UNA hardware. This processcO; involves several commands to the UNA hardware and for this reason the routinefI; is actually a series of smaller routines executed after a Commmand Done. ; Interrupt.E; If this is the first time the device has been used since the drivereK; has been loaded, then a self-test will be run on the UNA. After a timeoutRH; has expired, the UNA will be checked for a "READY" state. If "READY",F; then the Port Control Block is given to the UNA and Read Port StatusM; command is executed to obtain the microcode revision number. The microcodee=; load support task is run passing to it the revision number. F; After the hardware operation has been verified the rings are set up.J; The UNA control command block is given to the UNA and this block is usedF; to issue the Read Ring Descriptor and Read Mode commands to the UNA.B; If at any time a control request fails or times out the start upH; procedure is aborted and all outstanding request will be returned with; IE.ABO I/O status code.e;o; BEGIN:; ENABLE INTERRUPTSn ; RESET UNAi; SELFTEST UNA; IF READY STATE$; IFF REPORT ERROR - ABORT ; IFT GIVE PCB TO CONTROLLERE; READ PORT STATUS TO OBTAIN MICROCODE REVISION NUMBER NEEDED ; BY MICROCODE SUPPORT TASKB; RUN MICRO CODE SUPPORT TASK AND PASS TO IT THE MICROCODE7; REVISION #, CSR OF CONTROLLER AND CONTROLLER INDEXo; LOAD MICROCODE; SET UP RINGSo; WRITE DEFAULT MODEg; INITIALIZE RINGS ; START UNA; ENDIFo;e ; INPUTS:I; R4 = Controller State TableE;- .ENABL LSBCTINI::S- BIT #CS.INI,C.FLAG(R4) ; Are we initializing  BEQ 10$ ; yes RETURN ; No, return.; ; Perform a reset on deviceV;O310$: CALL FRERCV ; Free up receive buffers from a  ; ... privious initialize4 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 packetI6 MOV #-2,C.FUNS(R4) ; Set up current command dispatch< MOVB #SLFTIM,C.CTMR(R4) ; Set up timer for possible failure6 MOVB #R0.RST,@C.CSR(R4) ; Reset the UNA so that it is ; ... put in a known stateQ: MOVB #R0.IE,@C.CSR(R4) ; Re-enable interrupts, cleared by ; ... reset BR 20$ ; Start clockeRSTDN:& BCS 30$ ; Timeout error with device;t#; Perform a self-test on the device ;t% MOV R3,C.CFNC(R4) ; Save I/O packetY- MOV #-1,C.FUNS(R4) ; Set up current command < MOVB #SLFTIM,C.CTMR(R4) ; Set up timer for possible failure9 MOVB #CM.SLF!R0.IE,@C.CSR(R4); Issue a self-test commands20$: CALLR CLOCK ; Start clock;;; Self-test done entry;s)SLFDN: ; Entry for interrupt dispatchR' BCS 30$ ; UNA hard error, go log it.l$ MOV C.CSR(R4),R2 ; Get CSR address' MOV PCSR1(R2),R2 ; Get PCSR1 contentsm% BIC #177760,R2 ; Extract state bits 7 CMP #ST.RDY,R2 ; Ready? (This also checks transceiverI ; and cable bits)% BNE 30$ ; Nope - something's wrongV I;.6; Set up and execute Get Control Block address command;!$ MOV C.CSR(R4),R2 ; Get CSR address3 MOV RELCT,PCSR2(R2) ; Put relocation bias in UDBBf& MOV RELCT+2,PCSR3(R2) ; ... High bits. ADD C.PCBP(R4),PCSR2(R2) ; Set up PCB address ADC PCSR3(R2) ;) MOV #CM.GPB,R0 ; Set up primary commandP CALLR LODCM ; Load commandt;/; Get Control Block Address function completionR;R)GPBDN: ; Entry for interrupt dispatch BCS 30$ ; Function failed; 9; Read Controller Status to get microcode revision numberu;G, MOV #FN.RLS,R1 ; R1 = Read Status function# CALLR LODFN ; Load port functionL6UMLNAM: .RAD50 /UML.../ ; Mic00nRqpibjbkb a a aro code loader task nameRLSDN: BCS 30$ ; Read status failed,5 MOV C.PCBP(R4),R1 ; R1 = Port Control Block addressV! TST (R1)+ ; Skip function wordn6 MOV (R1)+,C.RREV(R4) ; Save microcode revision number= MOV (R1)+,C.MMAX(R4) ; Save max # of multicast addr possiblet/ MOV (R1)+,C.MXCT(R4) ; Save counter block size ( MOV R3,-(SP) ; Save I/O packet address, MOV #UMLNAM,R3 ; Point to loader task name+ CALL $SRSTD ; See if loader is installed * MOV R0,MLTCB ; Save microcode loader TCB BCC 25$ ; Fatal if not thereL .IF DF R$$MPL ; If RSX-11M+9 MOV #T.NKLF,R0 ; "Microcode loader not present" message CALL $DVMSG ; Print message+ MOV (SP)+,R3 ; Restore I/O packet addressv+ BR LSMDN1 ; Continue with initializationx .IFF ;+ MOV (SP)+,R3 ; Restore I/O packet addressc- BR 30$ ; This is fatal if loader not therea .ENDC ; R$$MPL/25$: MOV (SP)+,R3 ; Restore I/O packet address - MOV #SENDBK,R1 ; Set length of block needed;$ CALL $ALOCB ; Allocate core block" BCS 25$ ; Loop until you get it! MOV R0,R1 ; Copy block addressR# CLR (R0)+ ; Skip over first worde5 MOV C.INDX(R4),(R0)+ ; Put controller index in block; MOV C.DCB(R4),R2 ; R2 = DCBB4 MOV D.NAM(R2),(R0)+ ; Put controller name in block4 MOV C.PCBP(R4),R2 ; Get Port Control Block address- BIC #177700,2(R2) ; Isolate revision number0 MOV 2(R2),(R0) ; Save revision number in block+ CLRB 1(R0) ; Clear DELUA/DEUNA flag byten" MOV C.CSR(R4),R2 ; R2 = CSR addr2 BIT #20,PCSR1(R2) ; Is controller DEUNA or DELUA BEQ 27$ ; DEUNA INCB 1(R0) ; DELUAR27$:9 MOV R3,C.CFNC(R4) ; Save I/O packet of current functionuI MOV #+CM.GCM,C.FUNS(R4) ; Set wait for microcode loader task)( MOV MLTCB,R0 ; R0 = Task Control Block$ ; R1 = Address of message block0 CALL $EXRQF ; Request microcode loader to run) MOV #UMLTIM,C.CTMR(R4) ; Set timer valuem CALLR CLOCK ; Start clock;aB; We get here if the Microcode Loader Task does not respond within; the time out value specified.N;rMLTMO:;2F; We get here on a time out or controller error. This code will force; fatal initialization.t;u430$: MOV R4,R2 ; Generate error log packet pointer ADD #C.LOG,R2 ; .../ MOV #ER.FCI,E.TYPE(R2) ; Fatal controller init; MOV C.CSR(R4),R0 ; Get CSR/ MOV (R0)+,E.CSR0(R2) ; PCSR0 into error packetn/ MOV (R0)+,E.CSR1(R2) ; PCSR1 into error packetC% MOV C.PCBP(R4),R0 ; Get PCB pointerg3 ADD #E.PCB,R2 ; Point to PCB save in error packet , MOV (R0)+,(R2)+ ; Save PCB in error packet MOV (R0)+,(R2)+ ; ...r MOV (R0)+,(R2)+ ; ...l MOV (R0)+,(R2)+ ; ...l+ MOV R3,-(SP) ; Save address of I/O packetV$ CLR R3 ; No associated I/O packet CALL ERLOG ; Log the error# MOV (SP)+,R3 ; Restore I/O packeto" CALLR FTL ; Do fatal processing;ME; We will come here after the micro code has been successfully loaded ;RLSMDN:. BCS 30$ ; If CS, error - abort the function;g+; Set up Get Ring Descriptor Command in PCBr;c6LSMDN1: MOV C.PCBP(R4),R2 ; Get Command Block Address) TST (R2)+ ; Skip to second word in PCB.. MOV RELCT,(R2) ; Put relocation bias in UDBB# MOV RELCT+2,2(R2) ; ... High bits 5 ADD C.WRKP(R4),(R2)+ ; Move in scratch block addresso ADC (R2)+ ; ...;s; Set up the ring descriptor;;1 MOV C.WRKP(R4),R2 ; Retrieve descriptor addresse. MOV RELCT,(R2) ; Put relocation bias in UDBB# MOV RELCT+2,2(R2) ; ... High bits 1 ADD C.XMTB(R4),(R2)+ ; Compute unibus address oft ADC (R2) ; ... transmit ringO& TSTB (R2)+ ; Skip high address byte7 MOVB #,(R2)+ ; Fill in entry size (in words)L1 MOV #U$$NTS*2,(R2)+ ; Fill in number of entries2. MOV RELCT,(R2) ; Put relocation bias in UDBB# MOV RELCT+2,2(R2) ; ... High bits(1 ADD C.RCVB(R4),(R2)+ ; Compute unibus address of ADC (R2) ; ... receive ring& TSTB (R2)+ ; Skip high address byte7 MOVB #,(R2)+ ; Fill in entry size (in words)h/ MOV #U$$NRS,(R2)+ ; Fill in number of entriesd;s; Load the write ring requestt;n$ MOV00nZqof__DATADATADATADATA #FN.WRG,R1 ; Secondary command CALLR LODFN ; Execute command; "; Write Ring Descriptor completion;(WRGDN: BCS 30$ ; Function Failed;V0; Set up the operating mode (padding, CRC, etc.);T% 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 completioni;n)WMEDN: ; Entry for interrupt dispatch  BCS 30$ ; Function failed; ; Initialize the rings;t( MOV R3,-(SP) ; Save current I/O packet CALL INIRG ; Initialize rings1 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 completee;lRDADN: 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) ; ...  MOV (R0)+,C.PADD+4(R4) ; ...R;(; Issue the Start requestk;) MOV #CM.STR,R0 ; Set up primary commandT" CALLR LODCM ; Issue the command;n; Start request completion;O*STRDN: ; Entry from interrupt dispatch! BCS 30$ ; Something went wrongt640$: $DQPKT C.INIW ; Deque item from init wait queue BCS 50$ ; No more' CALL ISSUC ; Return success I/O doneP BR 40$ ; Loop till no more 50$:- CLR C.FLAG(R4) ; Indicate controller onlinet( CALLR POLRG ; Request controller poll .DSABL LSBD 42 .SBTTL UMRMP - Map transmit I/O buffer with UMRs;+$; **-UMRMP- Map I/O buffer with UMRs;LF; This routine gets a trasmit ring packet, UMR maps the I/O buffer andF; sets up the transmit ring entry. This routine does not set the end!; packet flag in the ring entry. ;m ; Inputs:q; R3 = Address of I/O packet; R4 = Controller State TableO;n ; Output: %; R1 = Pointer to transmit ring entryA;4;-#UMRMP: CALL SALL ; Save registersP;GC; NOTE - For each transmit header buffer there is a UMR wait block.ML; This routine is called by the INIXM routine. A header buffer is allocatedJ; before this routine is called. Therefore, there must be a free transmit ; ring entry.a;i* 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 = UCBt MOV C.SCB(R4),R4 ; R4 = SCBL/ MOV IP.EXT(R3),R0 ; R0 = I/O packet extension , MOV I.PRM+4(R3),RG.LEN(R1) ; Segment length ; Assume 22 bit systemb> MOV I.PRM+2(R3),RG.ADD(R1) ; Low order 16 bits of buffer addr/ .IF DF M$$EXT ; If extended memory supportede0 MOVB 1(R0),RG.AD2(R1) ; High order address bits .IFF ; If 18 bit system$; 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 ; ...U ASR R0 ; ...  ASR R0 ; ...R0 BIC #177774,R0 ; Make sure high bits are clear. MOVB R0,RG.AD2(R1) ; High order address bits .IFTF ; M$$EXTD MOVB #RF.ENP!RF.OWN,RG.FLG(R1) ; Set END of chain and UNA owner bit .IFT ; M$$EXT. .IF DF R$$MPL ; If RSX-11M+/ BIT #FE.EXT,$FMASK ; Is this a 22-bit system?  BEQ 10$ ; If EQ no 5 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+3 BIT #DV.EXT,U.CW1(R5) ; Extended memory supported?a BNE 10$ ; Yes& TST @#$UMRPT ; Unibus map available? BEQ 10$ ; No$ .ENDC ; R$$MPL* MOV U.UCBX+6(R5),R0 ; Get UMR wait block& BEQ 20$ ; Crash, something is wrong5 MOV (R0),U.UCBX+6(R5) ; Dequeue the assignment blockh; MOV R0,RG.UMR(R1) ; Save UMR wait block PTR in ring entryS/ MOV IP.EXT(R3),R2 ; R2 = I/O packet extension;9 MOV I.PRM+2(R3),U.BUF+2(R5) ; Set low 16 bits of addressQ4 MOVB 1(R2),U.BUF+1(R5) ; Set high 6 bits of address3 MOV I.PRM+4(R3),U.CNT(R5) ; Byte count of transfer$ MOV R1,R3 ; Save R1 in R3& CALL $STMP1 ; Set u00nbqpibjbkb a a ap the Unibus map) MOV RG.UMR(R3),R0 ; R0 = UMR wait block ) ADD #10,R0 ; R0 = UMR assignment blocke' CALL $MPUB1 ; Map Unibus to transferD) MOV RG.UMR(R3),R0 ; R0 = UMR wait blockR) ADD #10,R0 ; R0 = UMR assignment blockS< MOV M.UMVL(R0),RG.ADD(R3) ; Set low 16 bits of virtual addr" CLR -(SP) ; Get a work register. MOVB M.UMVH(R0),(SP) ; Get high virtual addr/ ASR (SP) ; Get ext.bits 4 & 5 into bit 0 & 1; ASR (SP) ; ...s ASR (SP) ; ...  ASR (SP) ; ...C" BIC #^C<3>,(SP) ; Clear high bit9 MOVB (SP)+,RG.AD2(R3) ; Put extension bits in ring entry  MOV R3,R1 ; R1 = Ring entry .ENDC ; M$$EXT710$: BITB #374,RG.AD2(R1) ; Must not have high bits onc BNE 20$ ; This is very bads RETURN ;20$: .IF DF DEBUG ; If debugging BPT ; Breakd BR 20$ ; Loop on break pointi .IFFV CRASH ; Something is wrong .ENDC ; DEBUG  * .SBTTL GSUMR - Get Static UMR for driver;+@; **-GSUMR-Get static UMR and compute Unibus relocation constant; B; This routine maps the device communications area and the receive>; buffers with a UMR. In addition, it computes the relocationC; constant for virtual memory address to Unibus address conversion. ;v ; Inputs:R; R4 = Controller State TableU; ; OUTPUTS:,; 1. Upper 4K of driver is mapped with a UMR6; (starting at 1st 64 byte boundry following CBASE)1; 2. Relocation constant computed (RELCT,RELCT+2)a; ;-#GSUMR: CALL SALL ; Save registersM .IF DF R$$MPL ; If RSX-11M+ MOV C.KRB(R4),R2 ; R2 = KRBh .ENDC ; R$$MPL MOV C.UCB(R4),R5 ; R5 = UCB  CLR R0 ; Clear R0 & R1c CLR R1 ;e( CLR RELCT ; Make relocation bias zero CLR RELCT+2 ; ...' CMP #120000,#UNAST ; Loadable driver?n BNE 60$ ; If not EQ no 7 MOV @#KISAR5,R1 ; Yes, copy real start of driver area / .IF DF M$$EIS ; If extended instrucation set)+ ASHC #6.,R0 ; Calculate physical addressT .IFF" MOV R1,R0 ; Get start of driver2 SWAB R0 ; Do non-EIS emulation of "ASHC #6.,R0"4 BIC #177400,R0 ; ... To calculate physical address SWAB R1 ; ... BIC #377,R1 ; ... ROR R0 ; ...R ROR R1 ; ...L ROR R0 ; ...a ROR R1 ; ...C .ENDC ; M$$EIS- .IF DF M$$EXT ; Extended memory supported? 8 MOV #CBASE,-(SP) ; Get communication area base address) SUB #120000,(SP) ; Subtract driver basee3 BIC #77,(SP) ; We are dealing with 64 byte blocksp, ADD (SP)+,R1 ; Compute physical address of# ADC R0 ; ... communications areao;ID; Set up selected UMR to map all of the driver's receive buffers andE; device communications areas and save relocation constant for Unibus; address computation.;  .IF DF R$$MPL ; If RSX-11M+/ BIT #FE.EXT,$FMASK ; Is this a 22-bit system?s BEQ 50$ ; If EQ noS5 BIT #KS.EXT,K.STS(R2) ; Extended memory supported?2 BNE 50$ ; If NE yes( TST @#$UMRHD+2 ; Unibus map available? BEQ 50$ ; Noo' MOV R2,R4 ; Copy KRB address into R4r2 ADD K.OFF(R2),R4 ; Point to UMR assignment block SUB #M.LGTH,R4 ; ... .IFF 3 BIT #DV.EXT,U.CW1(R5) ; Extended memory supported?n 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 ; ... .ENDC ; R$$MPL- TST M.UMRN(R4) ; Static UMR already set up?o BNE 70$ ; If NE yes2 MOV R1,M.BFVL(R4) ; Set up LO 16-Bits of address2 MOVB R0,M.BFVH(R4) ; Set up HI 6-bits of address, MOV #4,M.UMRN(R4) ; Set up count for 1 UMR520$: MOV R4,R0 ; Copy UMR work area pointer into R0# CALL $ASUMR ; Go assign UMR's BCS 20$ ; If CS, try again* MOV R4,UABKS ; Save UMR assignment block;$G; Load selected UMR to map receive buffers 18-bit addresses transformed ; from 16-bit virtual addresses.; 1 MOV R4,R3 ; Copy UMR work area pointer into R3 ) MOV U.SCB(R5),R4 ; Retrieve SCB addressL CALL $MPUB1 ; Map the Unibuse1 MOV R3,R0 ; Copy UMR work area pointer into R0e BR 40$ ; and continue530$: MOV R4,R0 ; Copy UMR work area poin00njqof__DATADATADATADATAter into r0a) MOV U.SCB(R5),R4 ; Retrieve SCB addresss;40$: MOV M.UMVL(R0),R1 ; Get LO 16-bits of virtual addressS7 MOVB M.UMVH(R0),R0 ; Get HI 2-bits of virtual addressr- .IF DF M$$EIS ; If extended insruction setr1 ASH #-4,R0 ; Shift bits <4:5> right into <0:1>  .IFFa- ASR R0 ; Shift bits <4:5> right into <0:1>v ASR R0 ; ...C ASR R0 ; ...p ASR R0 ; ...V .ENDC ; M$$EIS;aE; Compute and save the double word relocation constant to transform apL; a virtual address within the UMR mapped communications area into an 18-bit ; address.;(;50$: MOV CVIRA,-(SP) ; (SP) = Communications area vir.addr)" BIC #77,(SP) ; Clear offset bits3 SUB (SP)+,R1 ; Subtract UMR mapped communicationsr$ SBC R0 ; ... base virtual address60$:6 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 machinea SBC R0 ; ...p+ MOV R0,RELCT+2 ; Save relocation bias foro' MOV R1,RELCT ; ... for PCB, UDB, etc.s60$:6 .IFTF ; In either case for extended memory support RETURN ; Return to callerf* .IFT ; If extended memory is supported:70$: MOV R4,-(SP) ; Save mapping assignment block pointer MOV U.SCB(R5),R4 ; R4 = SCBi/ CALL $MPUBM ; Reload Unibus mapping registero1 MOV (SP)+,R4 ; Restore assignment block pointere( BR 30$ ; Go, compute relocation value .ENDC ; M$$EXT 5 .SBTTL RLPRT - Release port related data structuresa;+/; **-RLPRT-Release port related data structures:;.H; Return all port related data structures to DSR. The multicast addressD; list is released and the protocol list is scanned for address list?; entries which are owned by this port which are then released.);- ; Inputs:i"; R5 = Address of Port State Table;g; Registers PreservedR;;#RLPRT: CALL SALL ; Save registersB1 MOV R5,R2 ; Generate pointer to multicast list  ADD #P.MCST,R2 ; ... root 510$: MOV (R2),R0 ; R0 = Next mulicast address blockR BEQ 15$ ; That is it!% MOV #ML.LEN,R1 ; Size of this blocke MOV (R0),(R2) ; Dequeue it MOV R2,-(SP) ; Save R24 CALL $DEACB ; Deallocate the multicast addr block MOV (SP)+,R2 ; restore R2  BR 10$ ; Do nexti15$:3 CLR P.MCST(R5) ; Reset multicast address listheado MOV R5,P.MCST+2(R5) ; ...r ADD #P.MCST,P.MCST+2(R5) ; ...L/20$: MOV P.CTBL(R5),R4 ; Compute protocol liste' ADD #C.PROL,R4 ; ... listhead address.930$: MOV (R4),R4 ; Get addr of next protocol list entry  BEQ 80$ ; If EQ, no morei> BITB #LF.EXC!LF.DEF,PL.FLG(R4); Exclusive or default protocol) BEQ 40$ ; If EQ, not an exclusive portD5 CMP R5,PL.EXC(R4) ; Is protocol owned by this port?+ BNE 40$ ; If NE, no/ DECB PL.USE(R4) ; Reduce protocol usage countm"40$: MOV R4,R2 ; Compute address% ADD #PL.ADD,R2 ; ... chain listhead+950$: MOV (R2),R0 ; Get pointer to next addr chain entrys BEQ 30$ ; If EQ, no mores; CMP R5,AD.PRT(R0) ; Is this protocol in use by this port?l BEQ 60$ ; If EQ, yes;% MOV R0,R2 ; Move on down the chainP BR 50$;560$: MOV (R0),(R2) ; Unlink address block from chainn% BNE 70$ ; If NE, not last in chain - MOV R2,PL.ADD+2(R4) ; Close up tail pointerI*70$: DECB PL.USE(R4) ; Reduce usage count2 MOV #AD.LEN,R1 ; Get size of address chain entry MOV R2,-(SP) ; Save R23 CALL $DEACB ; Deallocate the address chain entry  MOV (SP)+,R2 ; Restore R23 BR 50$ ; Try next entry980$: CALL SCNPR ; Remove inactive protocol list entriesQ RETURN ; Return R< .SBTTL ****************************************************< .SBTTL * UNA Ring Handling Subroutines *< .SBTTL ****************************************************) .SBTTL INIRG - Initialize Ring pointerst;+;D$; **-INIRG- Initialize Ring Pointers;yA; This routine is called to initialize the rings used by the UNA. ?; The ring pointers used by the other ring routines are set up.e;y ; INPUTS:L; R4 = Controller Stat00nrqpibjbkb a a ae Tablet;l; REGISTERS PRESERVED ;-INIRG::$ MOV R0,-(SP) ; Save work registers MOV R1,-(SP) ; ...;*; Initialize receive ringR; 6 MOV C.RCVB(R4),C.RCVF(R4) ; Restart next free pointer; MOV C.RCVB(R4),C.RCVC(R4) ; Restart current active pointeri) MOV #U$$NRS,R0 ; R0 = Receive ring sizeG, MOV C.RCVB(R4),R1 ; R1 = Receive ring base10$:! CALL CLRING ; Clear ring entryy. MOV R1,RG.LNK(R1) ; Copy descriptor address.5 ADD #RG.SIZ,RG.LNK(R1) ; Plus length of a descriptorn/ MOV RG.LNK(R1),R1 ; Update descriptor pointer DEC R0 ; One less to do BNE 10$ ; Loop till doneRM MOV C.RCVB(R4),RG.LNK-RG.SIZ(R1); Set link word to point to first descriptorR;a; Initialize transmit ring;V6 MOV C.XMTB(R4),C.XMTF(R4) ; Restart next free pointer; MOV C.XMTB(R4),C.XMTC(R4) ; Restart current active pointer - MOV #,R0 ; R0 = Receive ring sizeC, MOV C.XMTB(R4),R1 ; R1 = Receive ring base20$:! CALL CLRING ; Clear ring entry1. MOV R1,RG.LNK(R1) ; Copy descriptor address.5 ADD #RG.SIZ,RG.LNK(R1) ; Plus length of a descriptors/ MOV RG.LNK(R1),R1 ; Update descriptor pointerV DEC R0 ; One less to do BNE 20$ ; Loop till donedB MOV C.XMTB(R4),RG.LNK-RG.SIZ(R1); Set link word to point to first ; ... descriptore7 CLR C.RSEQ(R4) ; Clear receive sequence # accumulatort8 CLR C.XSEQ(R4) ; Clear transmit sequence # accumulator" MOV (SP)+,R1 ; Restore registers MOV (SP)+,R0 ; ... RETURN ; Exit to caller1CLRING: MOV R2,-(SP) ; Save R2p2 MOV #RG.SIZ/2,R2 ; R2 = Word count of ring entry#10$: CLR (R1)+ ; Clear ring entry  DEC R2 ; Count down BNE 10$ ; Loop till done & SUB #RG.SIZ,R1 ; Restore R1 at entry MOV (SP)+,R2 ; Restore R2; RETURN ; Returnn r1 .SBTTL GFRRE - Get next free receive ring entryr;+;s+; **-GFRRE-Get next free receive ring entrye;tA; This routine is called to get the next free receive ring entry.sH; If no free entry is available a BEQ condition is returned. The routineG; uses the ring pointers set up by INIRNG and updates these pointers asC ; required.C;r ; INPUTS: ; R4 = Controller State Table1; ; OUTPUTS:&; R1 -> Free Ring Entry (or 0 if none);t;; REGISTERS MODIFIED:e; R1;-/GFRRE: MOV C.RCVF(R4),R1 ; Get next ring entryx- TSTB RG.ACT(R1) ; Is this an active packet?E BEQ 20$ ; Noc0 CLR R1 ; Indicate no receive packet available"10$: TST R1 ; Set condition code RETURN ; Return to callera20$:0 MOV RG.LNK(R1),C.RCVF(R4) ; Update free pointer# CLRB RG.FLG(R1) ; Clear flag bytep$ 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 n2 .SBTTL GFXRE - Get next free transmit ring entry;+;Q,; **-GFXRE-Get next free transmit ring entry;kB; This routine is called to get the next free transmit ring entry.H; If no free entry is available a BEQ condition is returned. The routineG; uses the ring pointers set up by INIRNG and updates these pointers asI ; required.); ; INPUTS:q; R4 = Controller State TableR;E ; OUTPUTS:&; R1 -> Free Ring Entry (or 0 if none); ; REGISTERS MODIFIED:e; R1;-GFXRE:) MOV C.XMTF(R4),R1 ; Get next ring entryn% TSTB RG.ACT(R1) ; Is packet active? BEQ 20$ ; Nox5 CLR R1 ; Indicate no transmit ring entry availabled"10$: TST R1 ; Set condition code RETURN ; Return to callerv20$:0 MOV RG.LNK(R1),C.XMTF(R4) ; Update free pointer# CLRB RG.FLG(R1) ; Clear flag byten$ CLRB RG.ERR(R1) ; Clear error word, INCB C.XSEQ(R4) ; Generate sequence number5 MOVB C.XSEQ(R4),RG.SEQ(R1) ; Return sequence # in R2f, INCB RG.ACT(R1) ; Indicate entry is active BR 10$ ; Return to caller t/ .SBTTL GCRRE - Get current receive ring entrye;+;2); **-GCRRE-Get current receive ring entryt;nG; This routine is called to get a completed ring entry from the receiver:; ring. If none is available a BEQ condition is returned.;i00nzqof__DATADATADATADATAD; If a ring entry is found the error bit is tested and the C-bit set; if an error is found.R; ; INPUTS:s(; R4 = Address of Controller State Table; ; OUTPUTS:; R1 -> Ring Entry or 0T; Z-Bit set if no entry 7; C-Bit set if valid ring entry and error in ring entryR;- ; R1 modifiedc;-GCRRE:;e'; Check to see if an entry is availablee;n) MOV C.RCVC(R4),R1 ; Get next ring entrye% TSTB RG.ACT(R1) ; Is packet active?v' BEQ 10$ ; No - show no current entryo0 BITB #RF.OWN,RG.FLG(R1) ; Do we own this entry? BEQ 20$ ; Yes*10$: CLR R1 ; No - show no current entry BR 50$ ; ...N;s;; Got an entry - check sequence numbers and update pointers ;-;20$: INCB C.RSEQ+1(R4) ; Update Sequence Number, check forv ; overflown BNE 30$ ; Skip overflow codem/ TSTB RG.SEQ(R1) ; Ring entry overflowed also?t! BNE 100$ ; No - sequence error4 BR 40$ ;e;30$: CMPB C.RSEQ+1(R4),RG.SEQ(R1) ; Sequence numbers match?1 BNE 100$ ; No - crash40$:3 MOV RG.LNK(R1),C.RCVC(R4) ; Update current pointer;2$; Set up conditions codes for caller;c250$: ; Converge here for condition code set up$ TST R1 ; Do we have a ring entry? BEQ 70$ ; No - just exitQ0 BITB #RF.STP,RG.FLG(R1) ; Is this a start entry BEQ 55$ ; No3> 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 errors"60$: CLZ ; Set buffer available470$: RETURN ; Return with Z and C cond. codes set;r/; Ring has gone out of sequence - serious error ; 100$:T .IF DF DEBUG ; If debugging BPT( BR 100$ ; Don't loose the break point .IFF; CRASH ; Serious error5 .ENDC ; DEBUGA ,7 .SBTTL GCXRE - Get current active transmit ring entryT;+;,1; **-GCXRE-Get current active transmit ring entryC; H; This routine is called to get a completed ring entry from the transmit:; ring. If none is available a BEQ condition is returned.;tD; If a ring entry is found the error bit is tested and the C-bit set; if an error is found.0;T ; INPUTS:E(; R4 = Address of Controller State Table;n ; OUTPUTS:; R1 -> Ring Entry or 0; Z-Bit set if no entry57; C-Bit set if valid ring entry and error in ring entryt;t ; R1 modifiedn;-GCXRE:;'; Check to see if an entry is availablet;n) MOV C.XMTC(R4),R1 ; Get next ring entrye$ TSTB RG.ACT(R1) ; Is packet active' BEQ 10$ ; No - show no current entry 0 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;; Got an entry - check sequence numbers and update pointers;1720$: BITB #RF.STP,RG.FLG(R1) ; Is this the start entry?e BEQ 25$ ; Non6 MOV RG.LNK(R1),R1 ; Get data entry for this transmit9 BITB #RF.OWN,RG.FLG(R1) ; Do we own the data entry also?V/ BNE 10$ ; No, wait until we own both entriesA3 MOV C.XMTC(R4),R1 ; Yes, return with header entry 25$:7 INCB C.XSEQ+1(R4) ; Update Sequence Number, check for? ; overflows BNE 30$ ; Skip overflow coder/ TSTB RG.SEQ(R1) ; Ring entry overflowed also?y! BNE 100$ ; No - sequence errore BR 40$ ;1;30$: CMPB C.XSEQ+1(R4),RG.SEQ(R1) ; Sequence numbers match?B BNE 100$ ; No - crash40$:3 MOV RG.LNK(R1),C.XMTC(R4) ; Update current pointer,;G$; Set up conditions codes for caller;B250$: ; Converge here for condition code set up$ TST R1 ; Do we have a ring entry? BEQ 70$ ; No - just exitQ< 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 errorsE"60$: CLZ ; Set buffer available470$: RETURN ; Return with Z and C cond. codes set;e/; Ring has gone out of sequence - serious errorR;N100$:. .IF DF DEBUG ; If debugging BPT ; Serious errorn' BR 100$ ; Don't lose the break pointg .IFFr# CRASH ; Something is very wrongw .ENDC ; DEBUG$ .SBTT00nqpibjbkb a a aL RLRPK - Release ring packet;+; **-RLRPK-Release ring packet;e:; This routine releases a ring packet by clearing clearing; it's active flag byte.;e; INPUT:; R1 -> Ring packetr;a/RLPKT: CLRB RG.ACT(R1) ; Make packet available. RETURN ; i3 .SBTTL STRBF - Set up receive buffers on the ring$;+;D,; **-STRBF-SET UP RECEIVE BUFFER ON THE RING;oI; These routine, if it can, will allocate receive buffers for all receiveh1; ring entries and puts them on the receive ring.B; ; INPUTS:l%; R4 - Address Controller state tablee;n ; OUTPUTS:; None;u; REGISTERS CHANGEDp;e; R3, R1;-GTRBF:, CLR -(SP) ; Indicate, no new ring entries610$: MOV C.RBFL(R4),R3 ; Get next free receive buffer BEQ 20$ ; No more0 CALL GFRRE ; Get next free receive ring entry1 BEQ 20$ ; No free entries - just return buffer 5 MOV (R3),C.RBFL(R4) ; Dequeue buffer from free lista+ ; Clear ring entry save area in bufferi9 MOV R3,RG.VAD(R1) ; Save virtual addr of receive bufferS CLR (R3)+ ; M.LNK CLR (R3)+ ; M.ERR CLR (R3)+ ; M.MLENu;EF; NOTE - We cannot move the relocation value into the ring as this mayL; set the ownership bit and we are not ready for the UNA to take this entry.;26 MOV RELCT+2,-(SP) ; Put relocation constant on stack MOV RELCT,-(SP) ; ...N* ADD R3,(SP) ; Convert packet address to" ADC 2(SP) ; ... Unibus address.6 MOV (SP)+,RG.ADD(R1) ; Put unibus address of segment, MOVB (SP)+,RG.AD2(R1) ; ... into ring entry5 BIT #374,RG.AD2(R1) ; High order bits must be clearM, BNE 40$ ; Something is very wrong, CRASH!@ MOV #M.SIZE-M.DADD.,RG.LEN(R1); Set buffer length in ring entry+ MOVB #RF.OWN,RG.FLG(R1) ; Set owner to UNAe. INC (SP) ; Say, we added buffer to the ring BR 10$ ; Try another onen;k(; Receive ring loaded or no more buffers;C%20$: TST (SP)+ ; Did we do anything; RETURN ; Return40$: .IF DF DEBUG ; If debugging BPT ; just break .IFFA CRASH ; Otherwise, CRASH .ENDC ; DEBUG  h0 .SBTTL UMRMPA - UMR mapped communications area;+*; **-UMRMPA-UMR mapped communications area;(E; This (UP TO 4K) area is mapped with a UMR. This area contains datao:; structures used to communicate with the UMR controllers.<; i.e. - PCB, UDBB, etc. The remainder of the space is used; for receive buffers.;-CBASE:3 .REPT U$$NCT ; Generate UMR mapped communication: ; ... buffers.=.+C.BASZ ; GEN mapped areae .ENDR1RCVBFA: .BLKW 1 ; Start of receive buffers area 9NBPERC: .BLKW 1 ; TEMP SAVE # OF BUFFERS PER CONTROLLERr2RCVBFL: .BLKW 1 ; Temp receive buffers list root h/ .SBTTL UNAIN - UNA driver initialization codee;+1; **-UNAIN-RSX QIO UNA driver initialization codeh;MD; This routine sets up and initializes the driver's data structures.I; Once the driver is initialized, this code becomes a part of the receivemM; buffers. This routine is called by the load routine at load time ($XELOA).N; ; Inputs:K5; IMPUR, CBASE work areas, CVIRA (CBASE VIRTUAL ADDR) ; ; Outputs:-; The driver data structures are initialized. ;p; All registers are used;-+UNAIN:ASL R3 ; Make word controller indexi MOV R3,-(SP) ; Save R3, R4, R5 MOV R4,-(SP) ; ... MOV R5,-(SP) ; ...;u$; Create UMR wait buffer list in UCB; 3 MOV #U$$NTS,R0 ; R0 = # of UMR wait blocks neededh5 ADD #U.UCBX+10,R5 ; R5 = Addr of 1st UMR wait blocks% MOV R5,-2(R5) ; Init list root worda10$:* 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 done 1 CLR -UMRWBS(R5) ; Clear link word of last entrye;2; Compute number of receive buffers per controller;+ MOV CVIRA,R1 ; R1 = CBASE virtual addressu- BIC #160000,R1 ; R1 = Area size below CBASE 5 MOV #8192.-256.,R0 ; R0 = MAX receive area possibleA, SUB R1,R0 ; R0 = Communications area size6 SUB #RCVBFA-CBASE,R0 ; Adjust for communications area- MOV R0,R2 ; Save re00nqof__DATADATADATADATAceive buffers area size(? CMP R0,# ; Do we have at least 1 buff/control.?t BGE 20$ ; Yes" CALLR 130$ ; No receive buffers20$: CLR R1 ; Clear counter%30$: INC R1 ; Generate buffer count 7 SUB #,R0 ; Compute # of buff/controllerd! BGT 30$ ; Loop to get quotienta;z; ALLOCATE THE BUFFERS;-+ MOV CVIRA,R0 ; R0 = CBASE VIRTUAL ADDRESSS8 ADD #RCVBFA-CBASE,R0 ; R0 = VIRTUAL ADDRESS OF "RCVBFA"1 MOV R1,2(R0) ; Save # of buffers per controller 1 MOV R0,4(R0) ; Init receive buff list root wordN1 MOV R0,R1 ; R1 = Start of receive buffers areaB3 ADD R2,R0 ; R0 points beyond last receive buffer0+40$: MOV R1,(R1) ; Generate chain pointere ADD #M.SIZE,(R1) ; ...% MOV (R1),R1 ; POINT TO NEXT BUFFERf CMP R1,R0 ; ARE WE DONE BLO 40$ ; LOOP TILL DONEL2 CLR -M.SIZE(R1) ; CLEAR LINK WORD OF LAST BUFFER;T; Clear controller state tablesR; ? MOV #/2,R0 ; R0 = Word count of controller tablesf1 MOV #IMPUR,R1 ; R1 = Start of controller tables 50$:+ CLR (R1)+ ; Clear controller tables areaf DEC R0 ; Decrement counter, BNE 50$ ; Loop till doner;i"; Clear mapped communications area;r@ MOV #/2,R0 ; R0 = Word count of controller tables0 MOV CVIRA,R1 ; R1 = Start of controller tables60$:+ CLR (R1)+ ; Clear controller tables areaA DEC R0 ; Decrement counter BNE 60$ ; Loop till donee6 MOV #IMPUR,R1 ; R1 = Address of 1st controller table' MOV #CTABL,R4 ; R4 = Controller tablea- MOV #U$$NCT,R5 ; R5 = Number of controllersC;r-; Start controller state table initialization ;n/ MOV CVIRA,R3 ; R3 = Virtual addrress of CBASEa570$: MOV #U$$NPC,R0 ; R0 = # of ports per controller 3 MOV R1,R2 ; R2 = Address of 1st controller table;6 ADD #C.LEN,R2 ; R2 = Address of word after 1st table/ MOV R4,C.INDX(R1) ; Generate controller index  SUB #CTABL,C.INDX(R1) ; ...4 MOV R2,C.PORT(R1) ; Initialize port list root word. MOV R1,(R4)+ ; Save controller table pointer ; ... in CTABL 8 MOV #CS.OFL,C.FLAG(R1) ; Indicate controller is offline .IF DF R$$MPL ; If RSX-11M+8 BIS #CS.STP,C.FLAG(R1) ; Indicate controller is stopped .ENDC ; R$$MPL .IF DF DEBUG ; If debugging9 MOV #MD.TPD!MD.LOO,C.MODE(R1); Default mode is loop back  .ENDC ; DEBUGd# .IF NDF DEBUG ; If not debugging 6 MOV #MD.TPD!MD.ECT,C.MODE(R1) ; See UNA mode bit def. .ENDC ; DEBUGT5 MOV R1,C.PROL+2(R1) ; Set end protocol list pointerS ADD #C.PROL,C.PROL+2(R1) ; ... ;.1; Create list of port state tables for controllern;l>80$: MOV R1,P.CTBL(R2) ; Save Control.State Table ptr in port= MOV R2,P.MCST+2(R2) ; Initialize multicast list end pointerM ADD #P.MCST,P.MCST+2(R2) ; ...i$ MOV R2,(R2) ; Generate port chain' ADD #P.LENG,(R2) ; Point to next portU' MOV (R2),R2 ; R2 = Next port pointer  DEC R0 ; One less to do BNE 80$ ; Loop till done0 CLR -P.LENG(R2) ; Clear link word of next port; 4; Allocate UMR mapped data structures for controller;7 MOV R3,C.PCBP(R1) ; Set PCBB addr in controller tablel+ ADD #CB.SIZ,R3 ; Point to word after PCBBe: MOV R3,C.UDBP(R1) ; Set UDBB address in controller table* ADD #RD.SIZ,R3 ; R3 => Receive ring area; !; Initialize receive ring pointero;c, MOV R3,C.RCVB(R1) ; Save receive ring base4 MOV R3,C.RCVF(R1) ; Receve ring free entry pointer8 MOV R3,C.RCVC(R1) ; Receive ring current entry pointer6 ADD #U$$NRS*RG.SIZ,R3 ; Account for receive ring size;p"; Initialize transmit ring pointer;- MOV R3,C.XMTB(R1) ; Save transmit ring basee6 MOV R3,C.XMTF(R1) ; Transmit ring free entry pointer9 MOV R3,C.XMTC(R1) ; Transmit ring current entry pointere; ADD #*2,R3 ; Account for transmit ring sizer) ; (2 XMIT RING ENTRIES PER TRANSMIT)); !; Initialize transmit header listC;R2 MOV #U$$NTS,R0 ; R0 = # of transmit ring entries5 MOV R3,C.XHDR(R1) ; init xmit header list root wordN90$:, MOV R3,(R3) ; Create transmit header list ADD #2+6+6+2+2,(R3) ; ...t00nqoqibjbkb a a a MOV (R3),R3 ; ... DEC R0 ; Dec counterg BNE 90$ ; Loop till done . CLR -22(R3) ; Clear link word of last entry1 MOV R3,C.WRKP(R1) ; Save pointer to work buffer#3 ADD #C.WKSZ,R3 ; Add in controller work area sizer; ); Allocate receive buffers for controller ; 2 MOV NBPERC,R0 ; R0 = # of buffers per controller3 MOV #RCVBFL,R2 ; R2 = Receive buffer list pointerR0 MOV (R2),C.RBFL(R1) ; Point to list of buffers100$:)/ MOV (R2),R2 ; Allocate buffers to controller, DEC R0 ; ...V BNE 100$ ; ...D2 MOV (R2),RCVBFL ; Dequeue buffers just allocated2 CLR -M.SIZE(R2) ; Clear link word in last buffer= ADD #C.LEN+,R1; Point to next controller areaR& DEC R5 ; Decrement controller count BNE 70$ ; Do next controllerc" CLC ; Indicate successful init'110$: MOV (SP)+,R5 ; Restore registersL MOV (SP)+,R4 ; ... MOV (SP)+,R3 ; ...% BCS 120$ ; We failed to initializeb;e%; Save pointers to KRB, SCB, DCB, UCBu;r/ MOV CTABL(R3),R0 ; Get controller state table 7 MOV R4,C.SCB(R0) ; Save SCB in controller state table .IF DF R$$MPL ; If RSX-11M+= MOV S.KRB(R4),C.KRB(R0) ; Save KRB in controller state table  .IFFr0 MOV S.CSR(R4),C.CSR(R0) ; Save controller's CSR .ENDC ; R$$MPL7 MOV R5,C.UCB(R0) ; Save UCB in controller state tableS= MOV U.DCB(R5),C.DCB(R0) ; Save DCB in controller state tableR"120$: RETURN ; Return to caller#130$: SEC ; Indicate init failedB BR 110$ ; ReturnDREND: ; End of driver codee'DRVSIZ=DREND-IMPUR ; Driver area size <RBFASZ=<16384.-64.>-DRVSIZ-196. ; Receive buffers area size& .BLKB RBFASZ ; Receive buffers areaRCBEND:r .ENDte table  .IFFr0 MOV S.CSR(R4),C.CSR(R0) ; Save controller's CSR .ENDC ; R$$MPL7 MOV R5,C.UCB(R0) ; Save UCB in controller state tableS= MOV U.DCB(R5),C.DCB(R0) ; Save DCB in controller state tableR"120$: RETURN ; Return to caller#130$: SEC ; Indicate init failedB BR 110$ ; ReturnDREND: ; End of driver .TITLE TTYL .IDENT /06.00/r;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reservedM;R;.<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.; ;u; 27-JAN-78 PETER WANNHEDEN;;d; PREVIOUSLY MODIFIED BY:$;;; P. WANNHEDEN ; C. F. SPITZr; D. R. DONCHINZ ; T. LEKAS;;;i$; MODIFIED FOR RSX-11M-PLUS V4.1 BY:;Z;6; L. KOGAN 20JAN-88 06.00i;"; LK731 -- CLEAR DSR SUPPORT BITS;;E;+*; CONTROLLER-DEPENDENT ROUTINES FOR DL-11.;-;9;1 > .IIF DF R$$PRO .IIF NDF D$$C11 .ERROR ;R$$PRO REQUIRES D$$C11 .IF DF D$$L11 U R .IF DF R$$MPL B .MCALL KRBDF$  KRBDF$ ;DEFINE KRB SYMBOLSM F .ENDC ;R$$MPL  .MCALL HWDDF$,UCBDF$A" HWDDF$ ;DEFINE HARDWARE SYMBOLS UCBDF$ ;DEFINE UCB SYMBOLSF .PSECT MAP5;O;I; EQUATED SYMBOLS;; DL-11 REGISTER DEFINITIONS;BRCSR = 0 ;RECEIVER STATUS REG.6$RBUF = 2 ;RECEIVER DATA BUFFER REG."XCSR = 4 ;TRANSMITTER STATUS REG.'XBUF = 6 ;TRANSMITTER DATA BUFFER REG. ;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. THE00oqof__DATADATADATADATA 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 .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 7, BIC #140000,R4 ;;;DL11 DOES NOT SUPPORT DSR4 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 RTS4 BR 16$ ;;;AND LOOK IF FURTHER PROCESSING IS NEEDED&15$: BICB #6,@R3 ;;;CLEAR DTR AND RTS16$: MOV (SP)+,R2 ;;;RESTORE R2L$20$: TSTB R2 ;;;RECEIVER INTERRUPT? BPL 10$ ;;;N - EXITP  .ENDC ;D$$LMD G .IF DF R$$PRO ASSUME H2.BRG,100000T- TST $HFMSK+2 ;;;IS THIS A PRO BRIDGE SYSTEM?R 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 ;;00oqpqibjbkb a a a;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-DEPEND .TITLE DRCLI  .IDENT /01.03/O E;6; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY6; BE USED OR COPIED ONLY IN ACCORDANCE WITH THE TERMS; OF SUCH LICENSE.; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.L; All rights reservedI;R;R; VERSION 01.01P;; M. S. FOX 20-APR-81C;O;U; MODIFIED BY:;E; M. S. FOX 23-SEP-81L;3; MF225 -- FIX CP.RST CHECKS, AND DO NOT ALLOW CLIU1; TO BE SET IF TTY IS LOGGED OFF, AND CP.LGO=0I;R; K. L. NOEL 13-MAY-88 R;E?; KLN101 -- SEND PROMPT INFORMATION OVER TO PARENT AME FOR CPRA; ; K. L. NOEL 07-OCT-88 N;A/; KLN109 -- ALLOW CLI TO DO IT'S OWN PROMPTINGT;H;+G; **-$DRCLI-SET CLI / GET CLI INFO / DECLARE CMD ARRIVAL AST DIRECTIVESU;A:; 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.;R ; INPUTS:O;1?; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASKN*; 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.RS00pqof__DATADATADATADATA1' 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 50$ ;IF EQ NOT' MOV (SP)+,R3 ;POINT TO CLI NAME IN CPBB20$:% .IF DF C$$RMT ; REMOTE TASK SUPPORT 4 BIT #F5.RTK,$FMSK5 ; REMOTE TASK SUPPORT TURNED ON? BEQ 25$ ; IF EQ NO: CLR $CPPKT ;MAKE SURE NO PACKET ADDRESS IS LEFT IN THERE* CMP T.UCB(R5),R0 ;IS REQUEST FOR OWN CLI? BNE 25$ ;IF NE NO MOV R0,R4 ;SAVE UCB ADDRESSR% MOV R3,R5 ;SAVE POINTER TO CLI NAME ( MOV #1,R1 ;ALLOCATE A PACKET OF SIZE 1= MOV #AL$BCK!AL$IMP,R0 ;BLOCK TASK AND DO IMPLICIT TASK STARTD CALL $CPALO ;ALLOCATE PACKET/ MOV R0,$CPPKT ;STORE PACKET ADDRESS FOR $STCLI: MOV R4,R0 ;RESTORE UCB ADDRESS( MOV R5,R3 ;RESTORE POINTER TO CLI NAME$ MOV $TKTCB,R5 ;GET TCB ADDRESS BACK25$: .ENDC ;C$$RMT% CALL $STCLI ;SET THE TERMINAL'S CLIE BCC 60$ ;IF CC, SUCCESSE TST R0 ;IDENTIFY ERROR BEQ 40$ ;IF EQ, PRIV VIOLATION BPL 30$ ;IF PL, NO POOL DRSTS D.RS2 ;CLI NOT IN SYSTEM!30$: DEC R0 ;ALLOCATION FAILURE? BNE 35$ ;IF NE YES3 DRSTS D.RS8 ;TERMINAL NOT LOGGED IN, CP.LGO CLEARA%35$: DRSTS D.RS1 ;ALLOCATION FAILURE;'40$: DRSTS D.RS16 ;PRIVILEGE VIOLATION,,50$: DRSTS D.RS92 ;ILLEGAL DEVICE SPECIFIED60$: RETURN ;SUCCESS;+'; **-GCII-GET CLI INFORMATION DIRECTIVEC;$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) ! +; !-------00pqqibjbkb a a a--------------------------------!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$ 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 OCCU00pqof__DATADATADATADATARS 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 EXIT 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 $ .IF DF C$$RMT ;REMOTE TASK SUPPORT3 BIT #F5.RTK,$FMSK5 ;REMOTE TASK SUPPORT TUR00pqqibjbkb a a aNED ON?C BEQ 45$ ;IF EQ NOG# TST $CPPKT ;WAS PACKET ALLOCATED?R BEQ 45$ ;IF EQ NOC( CALL SNDCLI ;SEND PACKET WITH PROMPTS 45$: .ENDC ; C$$RMT  RETURN ;ALL DONES;V; ERROR CLEANUP CODE;,F; ERROR WHILE ACTIVATING CURRENT CLI, SO UNLINK AND DEALLOCATE MESSAGE;C/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 LENGTHR 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$:$ .IF DF C$$RMT ;REMOTE TASK SUPPORT3 BIT #F5.RTK,$FMSK5 ;REMOTE TASK SUPPORT TURNED ON?U BEQ 90$ ;IF EQ NOR, MOV $CPPKT,R0 ;GET ADDRESS OF CPRBUF PACKET BEQ 90$ ;IF EQ NONEA CALL $CPDEA ;DON'T NEED IT CLR $CPPKT ;90$: .ENDC ; C$$RMT SEC ;SET ERROR STATUS BR 40$ ;GO TO COMMON EXIT CODE; ); LOCAL ROUTINE TO SET UP MESSAGE BUFFERS ; ; INPUTS:A; R1=ADDRESS OF MESSAGE BUFFER; R2=ADDRESS OF TERMINAL UCB-; R4=ADDRESS OF CPB OF CLI TO RECEIVE MESSAGEA;T ; OUTPUTS:;F=; THE MESSAGE BUFFER IN SEC POOL IS FILLED IN AND LEFT MAPPED ;K ; REGISTERS R1, R4, R5 PRESERVED;Q(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 (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;C%; SNDCLI - SEND CLI PROMPTS TO CPRCLIC;,; INPUT: $CPPKT - ADDRESS OF CPRBUF PACKET+; R0 - EXIT STATUS (PRESERVED IN R0)M;($ .IF DF C$$RMT ;REMOTE TASK SUPPORTSNDCLI:G;L; FILL IN HEADER OF PACKET;2) MOV KISAR6,-(SP) ; SAVE CURRENT MAPPINGR' MOV $CPPKT,KISAR6 ; MAP CPRBUF PACKETB$ CLR $CPPKT ; INDICATE PACKET USED, MOV #140000,R1 ; POINT TO HEADER OF PACKET0 MOVB #HT$SET,H$TYPE(R1) ; SET TYPE OF SET_INFO MOVB #2,H$ICNT(R1) ; TWO ITEMS ADD #H$SIZE,R1 ; POINT TO ITEM; ; FILL IN DEFAULT PROMPT ITEMR;C MOVB #II$DPR,I$ID(R1) ; SET ID CLR R2 ; ASSUME NO PROMPT6 BIT #CP.NUL,C.PSTS(R4) ; CLI DOES IT'S OWN PROMPTING? BNE 2$ ; IF NE YESC3 MOVB C.PDPL(R4),R2 ; SET LENGTH OF DEFAULT PROMPT, BEQ 2$S" ADD #1,R2 ; INCLUDE LENGTH BYTE2$: MOVB R2,I$LEN(R1) / MOV R1,I$BUF(R1) ; CALCULATE OFFSET TO PROMPT45 SUB #140000-12,I$BUF(R1) ; PROMPT COMES AFTER ITEMSY! ADD #4,R1 ; POINT TO NEXT ITEMV;2; FILL IN ^C PROMPT ITEM;D MOVB #II$CPR,I$ID(R1) ; SET ID CLR R3 ; ASSUME NO PROMPT6 BIT #CP.NUL,C.PSTS(R4) ; CLI DOES IT'S OWN PROMPTING? BNE 3$ ; IF NE YESN5 MOVB C.PCPL(R4),R3 ; SET LENGTH OF CONTROL C PROMPT  BEQ 3$ " ADD #1,R3 ; INCLUDE LENGTH BYTE3$: MOVB R3,I$LEN(R1)B/ MOV R1,I$BUF(R1) ; CALCULATE OFFSET TO PROMPTO. ADD R2,I$BUF(R1) ; SKIP OVER DEFAULT PROMPT% SUB #140000-6,I$BUF(R1) ; SKIP ITEMU* ADD #4,R1 ; POINT TO STORAGE FOR STATUS; ; SAVE EXIT STATUS; MOV R0,(R1)+ ;;P3; DON'T COPY PROMPTS IF CLI DOES IT'S OWN PROMPTING ; 6 BIT #CP.NUL,C.PSTS(R4) ; CLI DOES IT'S OWN PROMPTING? BNE 25$ ; IF NE YES; ; COPY DEFAULT PROMPTC;R3 MOVB C.PDPL(R4),R2 ; GET LENGTH OF DEFAULT PROMPTA BEQ 15$$ MOV R4,00pqqqf__DATADATADATADATAR3 ; GET ADDRESS OF PROMPT ADD #C.PRMT,R3 ( MOVB R2,(R1)+ ; PUT LENGTH INTO BUFFER)10$: MOVB (R3)+,(R1)+ ; COPY A CHARACTERM SOB R2,10$ ; UNTIL DONE; ; COPY CONTROL C PROMPT;;I15$:/ MOVB C.PCPL(R4),R2 ; GET LENGTH OF ^C PROMPTM BEQ 25$( MOVB R2,(R1)+ ; PUT LENGTH INTO BUFFER)20$: MOVB (R3)+,(R1)+ ; COPY A CHARACTERT SOB R2,20$ ; UNTIL DONE 25$: B! MOV KISAR6,R0 ; GET PACKET BIASF$ MOV (SP)+,KISAR6 ; RESTORE MAPPING& SUB #140000,R1 ; GET SIZE OF REQUEST MOV #SN$IMP,R5 ; GET SEND FLAG. BIC #SF$DSW,R5 ; THIS MAY NOT BE A DIRECTIVE;G ; SEND PACKET;:) CPSEN$ R5,R0,R1 ; SEND PACKET TO CPRCLIB;,; GET EXIT STATUS BACK;O! MOV KISAR6,-(SP) ; SAVE MAPPINGO MOV R0,KISAR6 ; MAP PACKET% MOV 140000+H$SIZE+10,R5 ; GET STATUS+$ MOV (SP)+,KISAR6 ; RESTORE MAPPING;); DEALLOCATE PACKETR;E" CALL $CPDEA ; DEALLOCATE PACKET;:; RETURN WITH STATUS;  MOV R5,R0 ; RETURN ; .ENDC ;C$$RMT .ENDC ;A$$CLI .ENDSIZE OF REQUEST MOV #SN$I .TITLE VTDRVN .IDENT /05.00/D R;;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.:; All rights reservedE;P;EA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDSA; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE5A; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISAA; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORTA; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO ANDN1; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERED.I; A; 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; 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$; MODIFIED FOR RSX-11M-PLUS V4.2 by:;E; M. W. ZAHAREE 27-MAY-88 5.001; MWZ004 -- DONT VALIDATE SIZE OF XFR ON ATT/DET ; ;S; VIRTUAL TERMINAL DRIVER.;T;+E; THE VIRTUAL TERMINAL DRIVER IS PRIMARILY INTENDED FOR A PARENT TASKVC; TO SIMULATE TERMINAL I/O FOR AN OFFSPRING TASK ACTIVATED WITH THE:F; SPAWN DIRECTIVE. THIS SIMULATION TAKES PLACE VIA A VIRTUAL TERMINALA; UNIT WHOSE UNIQUE DATA STRUCTURES (DCB AND UCB) ARE DYNAMICALLY1E; CREATED WITH THE CREATE VIRTUAL TERMINAL DIRECTIVE. ONE COMMON SCBF); IS USED FOR ALL VIRTUAL TERMINAL UNITS.E;7G; 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. 00qqqibjbkb a a aTHE 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 SYMBOLS;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.R00qqqf__DATADATADATADATAPKT(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 IS 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 00qqqibjbkb a a aPROMPT 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 BUFFER 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.WLBBVTCHK:;3C; CHECK THAT THE PARENT DECLARED AN AST FOR THE REQUESTED FUNCTION. ;C9 MOV #IE.EOF&377,R0 ;END OF FILE RETURNED IF NO INPUT ASTS( MOV U.IAST(R5),R4 ;ASSUME INPUT REQUEST7 CMPB I.FCN+1(R3),#IO.RLB/256. ;IS IT AN INPUT REQUEST?N BEQ 140$ ;IF EQ YES ) BLO 135$ ;IF LO IT IS AN OUTPUT REQUEST 2 MOV U.AAST(R5),R4 ;ELSE IT IS AN ATTACH OR DETACH3 BEQ 210$ ;IF EQ PARENT DOES NOT WANT AST, SUCCESSE' BR 145$ ;ELSE BRANCH TO QUEUE THE AST/3135$: MOV U.OAST(R5),R4 ;PICK UP OUTPUT AST ADDRESS:) MOV #IS.SUC,R0 ;SUCCESS IF NO OUTPUT AST &140$: TST R4 ;DESIRED FUNCTION LEGAL? BEQ 160$ ;IF EQ NO O;IM; CHECK FOR VALID SIZE. SINCE WE ARE USING $BLXIO, THE TRANSFER CANNOT CROSS./; APR BOUNDARIES, SO THE MAXIMUM SIZE IS 4K-63.; + MOV #IE.BAD&377,R0 ;ASSUME SIZE IS TOO BIGO- CMP #20000-63.,I.PRM+4(R3) ;IS SIZE TOO BIG?A BLO 160$ ;IF LO, YES; F; ALLOCATE AND FILL IN AST CONTROL BLOCK TO NOTIFY PARENT TASK THAT AN!; OFFSPRING REQUEST WAS DEQUEUED.R;P 0145$: MOV #A.PRM+6,R1 ;PICK UP SIZE OF AST BLOCK! CALL $ALOCB ;ALLOCATE AST BLOCKS' BCC 180$ ;IF CC SUCCESSFUL ALLOCATIONO1150$: MOV #IE.NOD&377,R0 ;INSUFFICIENT POOL SPACEN& 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 REQUESTO/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 ADD00qqqf__DATADATADATADATARESS8 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) ;BUFFERING 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 TERM00qqqibjbkb a a aINAL 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 RETURN 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( A00qqrrf__DATADATADATADATADD 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) 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) ;OFF .TITLE DRLOGB .IDENT /04.03/,;$1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.R; All rights reservedP;T;B<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;R; J. R. KAUFFMAN; J. W. BERZLE ; T. LEKAS;U; MODIFIED BY:; ; J. R. KAUFFMAN ; K. L. NOEL; D. P. RABAHY;T$; MODIFIED FOR RSX-11M-PLUS V4.1 BY:;I; PAUL K. M. WEISS ; R. D. HANEYA; J. R. KAUFFMAN; B. S. MCCARTHY;M$; MODIFIED FOR RSX00rrqibjbkb a a a-11M-PLUS V4.2 BY:;D; K. L. NOEL 12-MAY-88 04.003; KLN100 -- KEEP TRACK OF DIRECTORY IN RSX FOR CPRr;r; R. D. HANEY 04-AUG-88 04.01S<; RDH165 -- DO SDIR$ PARAMETER CHECKS BEFORE SENDING PACKET;C; K. L. NOEL 28-NOV-88 04.028; KLN116 -- SAVE $TEMP0 BEFORE CPSEN$ AND RESTORE AFTER;; K. L. NOEL 22-DEC-88 04.03-; KLN120 -- IMPLEMENT SD.MUD FOR SET DEFAULT ;I;+"; ++$DRLOG-LOGICAL NAME DIRECTIVES;K;; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE, DELETE, ORY@; TRANSLATE A LOGICAL NAME, SETUP A DEFAULT DIRECTORY STRING, OR?; GET A DEFAULT DIRECTORY STRING BY MEANS OF THE FOLLOWING FIVE; SUBFUNCTIONS: ;A; CLOG$ ( SUBFUNCTION 0 ) ;RG; THE CREATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM TO2O; CREATE A RELATIONSHIP BETWEEN A SPECIFIED LOGICAL NAME STRING AND A SPECIFIEDEM; EQUIVALENCE NAME STRING. IF THE LOGICAL NAME STRING ALREADY EXISTS, THE NEWL(; DEFINITION WILL SUPERCEDE THE OLD ONE.;I); CREATE LOGICAL NAME (CLOG$) DPB FORMAT:;R#; WD. 00 -- DIC(207.),DPB SIZE (7.)L%; WD. 01 -- SUBFUNCTION CODE (0),MODE ; WD. 02 -- TABLE NUMBER,STATUSF*; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER'; WD. 04 -- SIZE OF LOGICAL NAME BUFFERL.; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER+; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFER ;C;E; TLOG$ ( SUBFUNCTION 1 )P;FG; THE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEMSF; TO SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICALH; NAME TABLES AND RETURN THE EQUIVALENCE NAME STRING TO A USER SPECIFIED ; BUFFER.U;NL; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLESJ; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL,L; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNEDN; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER<; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER.;FL; ******************************** NOTE ************************************E; THIS VERSION OF THE TLOG$ DPB IS FOR P/OS COMPATIBILITY ONLY.I?; THE CURRENT DPB FORMAT IS UNDER THE SUBFUNCTION CODE 9. L; **************************************************************************;D,; TRANSLATE LOGICAL NAME (TLOG$) DPB FORMAT:;S#; WD. 00 -- DIC(207.),DPB SIZE (9.)S%; WD. 01 -- SUBFUNCTION CODE (1),MODEC2; WD. 02 -- TBMASK,RESERVED BYTE (RECURSION COUNT)*; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER'; WD. 04 -- SIZE OF LOGICAL NAME BUFFER*.; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER+; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERNC; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAME <; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODE;*;*; DLOG$ ( SUBFUNCTION 2 )I; M; THE DELETE LOGICAL NAME DIRECTIVE SUBFUNCTION REMOVES THE SPECIFIED LOGICAL H; NAME FROM THE LOGICAL NAME TABLE SPECIFIED. IF THE LOGICAL NAME IS NOTB; SPECIFIED, ALL LOGICAL NAMES IN THE SPECIFIED TABLE ARE REMOVED.;O); DELETE LOGICAL NAME (DLOG$) DPB FORMAT:E;V#; WD. 00 -- DIC(207.),DPB SIZE (5.)O%; WD. 01 -- SUBFUNCTION CODE (2),MODE ; WD. 02 -- TABLE NUMBER, STATUS*; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER'; WD. 04 -- SIZE OF LOGICAL NAME BUFFER;; SDIR$ ( SUBFUNCTION 3 ) ;O; THE SETUP DEFAULT DIRECTORY STRING DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM H; TO CREATE A DEFAULT DIRECTORY STRING ON A USER BASIS. THIS STRING IS AN; SPECIAL CASE SINCE THERE IS NO LOGICAL STRING PER SE AND ONLY AN EQUIVALENCE; NAME STRING EXISTS. ; &; SET DEFAULT DIRECTORY STRING (SDIR$);E#; WD. 00 -- DIC(207.),DPB SIZE (5.)(%; WD. 01 -- SUBFUNCTION CODE (3),MODET,; WD. 02 -- RESERVED FOR FUTURE EXPANSIONISM.; WD. 03 -- ADDRESS OF EQUIVALENCE NAME BUFFER+; WD. 04 -- SIZE OF EQUIVALENCE NAME BUFFER ;A; GDIR$ ( SUBFUNCTION 4 )E;BM; THE GET DEFAULT DIRECTORY STRING DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEMRN; TO RETRIEVE THE DEFAULT DIRECTORY STRING FOR THE CURRENT USER. THE STRING ISL; RETURNED TO THE SPECIFIED USER BUFFER ALONG WITH THE LENGTH OF THE STRIN00r rrf__DATADATADATADATAG.;I2; GET DEFAULT DIRECTORY STRING (GDIR$) DPB FORMAT:; #; WD. 00 -- DIC(207.),DPB SIZE (6.)%; WD. 01 -- SUBFUNCTION CODE (4),MODEO); WD. 02 -- RESERVED FOR FUTURE EXPANSIONM#; WD. 03 -- EQUIVALENCE NAME BUFFERE+; WD. 04 -- SIZE OF EQUIVALENCE NAME BUFFER C; WD. 05 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAMES;C;TE; THE FOLLOWING SUBFUNCTIONS ARE DISPATCHED FROM HERE BUT THE CODE ISU; IN THE MODULE DRPFN.MAC.;T; FSS$ ( SUBFUNCTION 5 );N/; FILE SPECIFICATION SCANNER (FSS$) DPB FORMAT:L;I#; WD. 00 -- DIC(207.),DPB SIZE (7.) *; WD. 01 -- SUBFUNCTION CODE (5), RESERVED; WD. 02 -- RESERVED5; WD. 03 -- ADDRESS OF DIRECTORY SPECIFICATION BUFFERM2; WD. 04 -- SIZE OF DIRECTORY SPECIFICATION BUFFER"; WD. 05 -- ADDRESS OF PARSE BLOCK*; WD. 06 -- SIZE OF PARSE BLOCK (IN BYTES);T<; 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 OFS?; THE STRING IF ANY. THE FLAGS WORD WILL BE HAVE A BIT SET FOR.:; EACH OF THE COMPONENTS PRESENT IN THE FORMAT FOR THE RMS ; NAM BLOCK.;3; IN MORE DETAIL.C;Y<; NODE: THE NODE INCLUDES ALL NODES IF POOR MAN'S ROUTING IS8; IS BEING USED. THE INITIAL NODE NAME IS TERMINATED7; BY THE ACCESS CONTROL STRING ADDRESS, EVEN IF THERE 8; IS NONE. (IN THIS CASE THE ACCESS CONTROL LENGTH IS ; ZERO.);O; FS$NOD IS SET IF PRESENT.;I>; ACCESS THE ACCESS CONTROL STRING IS THE ENTIRE QUOTED STRINGC; CONTROL: TERMINATED BY DOUBLE COLON. AS NOTED ABOVE, THE ADDRESS /; OF THE ACCESS CONTROL SERVES A DUAL PURPOSE.;A@; DEVICE: THE DEVICE IS THE STRING TERMINATED BY A SINGLE COLON.;O; FS$DEV IS SET IF PRESENT. ;S?; DIRECTORY:THE DIRECTORY IS THE STRING BOUNDED BY EITHER [] ORC2; <> AND INCLUDES A RATHER LOOSELY CHECKED SET OF:; CHARACTERS VALID IN A DIRECTORY SPECIFICATION INCLUDING<; WILDCARDS, HIERARCHIES, ETC. THE SYNTAX OF THE DIRECTORY5; MUST BE CHECKED FOR VALIDITY IN THE CONTEXT OF THET*; OPERATION, FOR EXAMPLE, NETWORK ACCESS.; 6; FS$DIR IS SET IF PRESENT. IN ADDITION, IF WILDCARDS;; ARE FOUND, FS$WDI IS ALSO SET. (WILDCARDS ARE "%", "*",N ; AND "...".; A; FILENAME: THE FILENAME IS THE STRING TERMINATED BY ".", ";", ORR%; THE END OF THE FILE SPECIFICATION. ;L7; FS$NAM IS SET IF PRESENT. IN ADDITION, IF WILDCARDS 9; ARE FOUND, FS$WNA IS ALSO SET. (WILDCARDS ARE "%" ANDR; "*".);T.; IF FS$QUO IS SET, THE FILE SPECIFICATION IS8; A QUOTED STRING. THIS IS EITHER A "FOREIGN" FILESPEC5; IF BEING PASSED TO ANOTHER SYSTEM (EG. VIA DAP) ORI4; AN ANSI FILESPEC. THE THE CASE OF THE ANSI FILE,8; A VERSION IS ALLOWED, BUT NO TYPE FIELD. IN THE CASE8; OF A NETWORK OPERATION, IT'S AMBIGUOUS, BUT A VERSION5; WILL BE ALLOWED BUT NOT DEFAULTED. (ACTUALLY THIS$5; DOESN'T RELATE TO FSS BUT THIS SEEMS TO BE AS GOODA!; A PLACE TO MENTION IT AS ANY.)D;D<; TYPE: THE TYPE IS THE STRING TERMINATED BY A "." OR ";" OR7; THE END OF THE FILE SPECIFICATION. A LEADING "." ISR!; ALWAYS INCLUDED IN THE STRING.T;N7; FS$TYP IS SET IF PRESENT. IN ADDITION, IF WILDCARDS 9; ARE FOUND, FS$WTY IS ALSO SET. (WILDCARDS ARE "%" AND ; "*".);I6; IF THE FILENAME IS A QUOTED STRING, THEN THIS FIELD; MUST BE NULL.; >; VERSION: THE VERSION IS THE FIELD INCLUDING A LEADING "." OR7; ";" TERMINATED BY THE END OF THE STRING. THE STRINGT7; IS LIMITED TO AN OPTIONAL LEADING "-" AND THE DIGITSI#; ZERO TO NINE, OR A "*" WILDCARD.O;H8; FS$VER IS SET IF PRESENT. IN ADDITION, IF A WILDCARD ; IS FOUND, FS$WVE IS ALSO SET.;SC; TRAILING: THE UNPARSED PORTION OF THE INITIAL STRING IS THAT PARTL4; OF THE INPUT THAT WAS SUCCESSFULLY AND COMPLETELY4; PARSED. IF AN ERROR IS DETECTED IN THE DIRECTORY7; SPECIFICATION, FOR EXAMPLE, THE TRAILING STRING WILLL1; INCLUDE THE ERRONEOUS DIRECTORY SPECIFICATION.D; 5; THIS SHOULD ALLOW THE USED OF FSS$ IN COMMAND LINEL;; PARSING. ANY CHARACTER NOT PART OF A FILE SPECIFICATIOND5; TERMINATES THE 00rrqibjbkb a a aSCAN AND RESULTS IN ALL INFORMATION "; OBTAINED SO FAR TO BE RETURNED.;E5; THE FIELD TRAILING_ADDR SHOULD ALWAYS BE FILLED IN 3; EVEN WHEN THE LENGTH IS ZERO. THIS IS DIFFERENTS2; FROM THE NORM, BUT IS AN EXCEPTION FOR MUCH THE"; SAME REASON AS FOR ACCESS_ADDR.;N@; THE PARSE BLOCK CAN BE TRUNCATED BY THE USER IF NOT ALL FIELDSC; ARE DESIRED, ALTHOUGH THE ORGANIZATION ISN'T WELL SETUP FOR THAT. A; THE DIRECTIVE CAN ALSO BE ENHANCED BY ADDING FIELDS ON THE END.C;C; ACHN$ ( SUBFUNCTION 6 )N;D$; ASSIGN CHANNEL (ACHN$) DPB FORMAT:; #; WD. 00 -- DIC(207.),DPB SIZE (5.)E); WD. 01 -- SUBFUNCTION CODE (6),RESERVED ; WD. 02 -- LUN, TABLE MASKZ); WD. 03 -- ADDRESS OF FILE SPECIFICATION &; WD. 04 -- SIZE OF FILE SPECIFICATION;E7; ASSIGN CHANNEL DOES ALL OF THE PROCESSING OF THE FILEU:; SPECIFICATION THAT IS REQUIRED TO FIND THE ACTUAL DEVICE/; NAME AND THEN ASSIGNS THE LUN TO THAT DEVICE. ; ;E; PRMS$ ( SUBFUNCTION 7 ) ;I#; PARSE FOR RMS (PRMS$) DPB FORMAT: ;U$; WD. 00 -- DIC(207.),DPB SIZE (12.)%; WD. 01 -- SUBFUNCTION CODE (7), LUN( ; WD. 02 -- TABLE MASK, RESERVED%; WD. 03 -- ADDRESS OF PRIMARY STRING2"; WD. 04 -- SIZE OF PRIMARY STRING.; WD. 05 -- ADDRESS OF RESULTANT STRING BUFFER+; WD. 06 -- SIZE OF RESULTANT STRING BUFFERE<; WD. 07 -- ADDRESS OF WORD TO RECEIVE RESULTANT STRING SIZE"; WD. 08 -- ADDRESS OF PARSE BLOCK; WD. 09 -- SIZE OF PARSE BLOCKO%; WD. 10 -- ADDRESS OF DEFAULT STRINGF"; WD. 11 -- SIZE OF DEFAULT STRING;$;######## ADD DESCRIPTION; ;(; PFCS$ ( SUBFUNCTION 8 )1; #; PARSE FOR FCS (PFCS$) DPB FORMAT:-;A$; WD. 00 -- DIC(207.),DPB SIZE (12.)%; WD. 01 -- SUBFUNCTION CODE (8), LUNO ; WD. 02 -- TABLE MASK, RESERVED%; WD. 03 -- ADDRESS OF PRIMARY STRING6"; WD. 04 -- SIZE OF PRIMARY STRING.; WD. 05 -- ADDRESS OF RESULTANT STRING BUFFER+; WD. 06 -- SIZE OF RESULTANT STRING BUFFERB<; WD. 07 -- ADDRESS OF WORD TO RECEIVE RESULTANT STRING SIZE"; WD. 08 -- ADDRESS OF PARSE BLOCK; WD. 09 -- SIZE OF PARSE BLOCKA); WD. 10 -- ADDRESS OF DEFAULT NAME BLOCKT&; WD. 11 -- SIZE OF DEFAULT NAME BLOCK;O;######## ADD DESCRIPTION;. ; INPUTS:(;)8; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK*; 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 TASKF;;D; TLOG$ ( SUBFUNCTION 9 )I;BJ; THE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM TOH; SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICAL NAMEK; TABLES AND RETURN THE EQUIVALENCE NAME STRING TO A USER SPECIFIED BUFFER.L; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLESJ; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL,L; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNEDN; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER<; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER.;E,; TRANSLATE LOGICAL NAME (TLOG$) DPB FORMAT:;A$; WD. 00 -- DIC(207.),DPB SIZE (10.)%; WD. 01 -- SUBFUNCTION CODE (1),MODEU; WD. 02 -- TBMASK, STATUS*; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER'; WD. 04 -- SIZE OF LOGICAL NAME BUFFERH.; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER+; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERTC; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAMEU<; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODE@; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCK;E;L; RLOG$ ( SUBFUNCTION 10. )-;IJ; THE RECURSIVE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THEM; SYSTEM TO SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICAL J; NAME TABLES AND RETRANSLATE THE EQUIVALENCE NAME STRING FURTHER UNTIL NOJ; MORE EQUIVALENCE NAMES MAY BE FOUND. AT THAT TIME THE FINAL EQUIVALENCE.; NAME IS RETURNED TO A USER SPECIFIED BUFFER.L; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLESJ; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO 00rrrf__DATADATADATADATASMALL,L; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNEDN; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER<; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER.;E6; RECURSIVE TRANSLATE LOGICAL NAME (RLOG$) DPB FORMAT:; $; WD. 00 -- DIC(207.),DPB SIZE (10.)%; WD. 01 -- SUBFUNCTION CODE (9),MODE ; WD. 02 -- TBMASK, STATUS*; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER'; WD. 04 -- SIZE OF LOGICAL NAME BUFFERE.; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER+; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFEROC; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAME <; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODE@; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCK;E;L; CLON$ ( SUBFUNCTION 11. )-;IG; THE CREATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM TO-O; CREATE A RELATIONSHIP BETWEEN A SPECIFIED LOGICAL NAME STRING AND A SPECIFIED M; EQUIVALENCE NAME STRING. IF THE LOGICAL NAME STRING ALREADY EXISTS, THE NEW-(; DEFINITION WILL SUPERSEDE THE OLD ONE.;-); CREATE LOGICAL NAME (CLON$) DPB FORMAT:E;Q#; WD. 00 -- DIC(207.),DPB SIZE (7.)R'; WD. 01 -- SUBFUNCTION CODE (11.),MODE ; WD. 02 -- TABLE NUMBER,STATUSS*; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER'; WD. 04 -- SIZE OF LOGICAL NAME BUFFERG.; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER+; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERP;F; ; DLON$ ( SUBFUNCTION 12. )F; M; THE DELETE LOGICAL NAME DIRECTIVE SUBFUNCTION REMOVES THE SPECIFIED LOGICAL-H; NAME FROM THE LOGICAL NAME TABLE SPECIFIED. IF THE LOGICAL NAME IS NOTB; SPECIFIED, ALL LOGICAL NAMES IN THE SPECIFIED TABLE ARE REMOVED.; ); DELETE LOGICAL NAME (DLON$) DPB FORMAT:A; #; WD. 00 -- DIC(207.),DPB SIZE (5.)F'; WD. 01 -- SUBFUNCTION CODE (12.),MODE ; WD. 02 -- TABLE NUMBER, STATUS*; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER'; WD. 04 -- SIZE OF LOGICAL NAME BUFFER;;L; TLON$ ( SUBFUNCTION 13. );HJ; THE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM TOH; SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICAL NAMEK; TABLES AND RETURN THE EQUIVALENCE NAME STRING TO A USER SPECIFIED BUFFER.EL; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLESJ; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL,L; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNEDN; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER<; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER.;E,; TRANSLATE LOGICAL NAME (TLON$) DPB FORMAT:;A$; WD. 00 -- DIC(207.),DPB SIZE (10.)'; WD. 01 -- SUBFUNCTION CODE (13.),MODEF; WD. 02 -- TBMASK, STATUS*; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER'; WD. 04 -- SIZE OF LOGICAL NAME BUFFERU.; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER+; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERIC; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAMET<; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODE@; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCK;(;N; RLON$ ( SUBFUNCTION 14. ) ;(J; THE RECURSIVE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THEM; SYSTEM TO SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICAL J; NAME TABLES AND RETRANSLATE THE EQUIVALENCE NAME STRING FURTHER UNTIL NOJ; MORE EQUIVALENCE NAMES MAY BE FOUND. AT THAT TIME THE FINAL EQUIVALENCE.; NAME IS RETURNED TO A USER SPECIFIED BUFFER.L; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLESJ; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL,L; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNEDN; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER<; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER.;E6; RECURSIVE TRANSLATE LOGICAL NAME (RLON$) DPB FORMAT:; $; WD. 00 -- DIC(207.),DPB SIZE (10.)'; WD. 01 -- SUBFUNCTION CODE (14.),MODEH; WD. 02 -- TBMASK, STATUS*; 00r"rqibjbkb a a aWD. 03 -- ADDRESS OF LOGICAL NAME BUFFER'; WD. 04 -- SIZE OF LOGICAL NAME BUFFERU.; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER+; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERSC; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAMEQ<; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODE@; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCK;( .IF DF L$$GCL!N$$DIRD .MCALL LNMDF$,LNMOD$E LNMDF$D1 LNMOD$ ;DEFINE ADDITIONAL LOGICAL NAME OFFSETSB MAP5=120000 MAP6=140000? LN$SIZ = 255. ;MAXIMUM SIZE OF LOGICAL AND EQUIVALENCE BUFFERS6 H$$HNM = 32. ;NUMBER OF HASH CELLS IN EACH HASH TABLE6 T$BLNM == 4 ;HIGHEST VALID LOGICAL NAME TABLE NUMBER; M$XLOG = 10. ;MAXIMUM RECURSION NUMBER FOR LOGICAL LOOKUPS-9 P$SSIZ = 9. ;DPB SIZE OF P/OS COMPATIBLE TLOG$ DIRECTIVE99 D$COM4 = 4 ;INDICATOR VALUE FOR THE 4TH DIRECTIVE COMMON(1 R$LOG = 10. ;SUBFUNCTION CODE FOR RLOG OPERATIOND1 R$LON = 14. ;SUBFUNCTION CODE FOR RLON OPERATIONL0 R$XBAS = 11. ;SUBFUNCTIONS BELOW THIS ARE XLOG$ GD$SIZ = 14 ;SIZE OF GDIR DPB7 GD$BUF = 4 ;SIZE OF EXTRA CPRBUF STORAGE AREA FOR GDIRF SD$SIZ = 12 ;SIZE OF SDIR DPB CL$SIZ = 16 ;SIZE OF CLOG DPB DL$SIZ = 12 ;SIZE OF DLOG DPB TL$SIZ = 24 ;SIZE OF TLOG DPB- .SBTTL ENTRY POINT FOR ALL ROUTINES IN DRLOG/;C;AO; REVERIFY DPB ADDRESS GIVEN THAT THE POINTER GOING INTO THE ROUTINES NO LONGER(%; POINTS PAST THE FUNCTION CODE WORD.O;P;T$DRLG1::( .IF DF C$$RLG ;IF REMOTE LOGICAL NAMES. CMPB #145.,-2(R3) ;WAS THIS AN ELP DIRECTIVE?7 BNE 5$ ;NOPE, IT WAS A REGULAR LOGICAL NAME DIRECTIVEF' MOV #$LNELP,-(SP) ;GET ELP ENTRY POINT$( BR 20$ ;AND GO OFF TO DO THE DIRECTIVE5$:O .ENDC ;C$$RLG. MOVB (R3),R0 ;GET THE FUNCTION CODE FROM DPB! CMPB R0,#$LNFHI ;IS IT TOO HIGH?  BHI 10$ ;IF HI, YES3 ASL R0 ;GET OFFSET INTO TABLE BY MULTIPLYING BY 4 ASL R0 ;* ADD #$LNSFT,R0 ;POINT INTO FUNCTION TABLE? MOV (R0)+,-(SP) ;GET THE COMPLETION ROUTINE ADDRESS FROM TABLEL. 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 ADDRESS-2 MOV T.UCB(R1),R1 ;GET THE CURRENT TI: OF THE TASK9 CALL $GTUSR ;SET UP THE USER LOGICAL HASH TABLE ADDRESSE .ENDC ;DF L$$GCLR> CMPB #D$COM4,(R0)+ ;DOES THIS FUNCTION LIVE IN ANOTHER DIRCOM# BEQ 20$ ;IF EQ, YES, SWITCH TO ITM) CALLR @(SP)+ ;PROCESS THE FUNCTION TYPER?10$: DRSTS D.RS99 ;RETURN DIRECTIVE STATUS -- DPB SIZE INVALIDNA20$: CALL $MPDC4 ;CALL THE ROUTINE IN THE OTHER DIRECTIVE COMMON 0 RETURN ;RETURN BACK TO DISPATCHER SUCCESFULLY .PAGE9 .SBTTL ACROB - ROUTINE TO VALIDATE USER BUFFER ADDRESSEST .ENABL LSB:;+;AM; THESE ROUTINES ADDRESS CHECK AND CALCULATE THE BIAS AND DISPLACEMENT (APR6)$; OF A SPECIFIED USER BUFFER.E;H ; INPUTS: /; R3 = THE ADDRESS OF THE TWO WORDS IN THE DPBI3; CONTAINING THE USER VIRTUAL ADDRESS AND THER&; BYTE COUNT SIZE OF THAT BUFFER;U;- ; OUTPUTS:;I(; R0 = THE BYTECOUNT OF THE USER BUFFER#; R1 = THE BIAS OF THE USER BUFFERR0; R2 = THE APR6 DISPLACEMENT OF THE USER BUFFER ; R3 = R3+4; R4 = UNCHANGEDL;TH; AN ERROR CONDITION IN THIS ROUTINE CAUSES AN IMMEDIATE DIRECTIVE ERROR4; TRAP PREVENTING ANY RETURN TO THE CALLING ROUTINE.;-1ACROB: MOV #$ACHKB,-(SP) ;ADDRESS CHECK BUFFER RW ! BR 10$ ;GO TO COMMON PROCESSING 1ACRIB: MOV #$ACHRO,-(SP) ;ADDRESS CHECK BUFFER RON510$: MOV (R3)+,R0 ;GET THE ADDRESS OF THE USER BUFFER BEQ 20$ ;IF EQ, THERE IS NONEO! MOV (R3)+,R1 ;GET SIZE OF BUFFER # BEQ 30$ ;IF EQ, IT IS NONEXISTENT CMP R1,#LN$SIZ ;IS IT TOO LARGE BHI 30$ ;IF HI, YES ( CALL @(SP)+ ;CALL THE CHECKING ROUTINE# BCS 20$ ;IF CS, BUFFER IS INVALIDC8 CALL $RELOC ;SET UP THE APR BIAS AND OFFSET FOR BUFFER) MOV -2(R3),R0 ;SET UP THE SIZE OF BUFFERR RETURN '20$: DRSTS D.RS98 ;ADDRESS CHECK ERRORN'30$: DRSTS D.RS89 ;INVALID BUFFER SIZEC .DSABL LSB0 .ENDC ; DF L$$GCL!N$$DIRE .PAGE0 .SBTTL $LNFCL - LOGICAL NAME CREATION DIRECTIVE .IF DF L$$GCL .ENABL LSB ;+0; $LNFCL -00r*rrf__DATADATADATADATA ENTRY POINT FOR LOGICAL NAME CREATION;TJ; THIS ROUTINE IS ENTERED FROM THE DRLOG DISPATCH AREA WITH R3 POINTING TO; THE FOLLOWING DPB VALUES: ;A%; WD. 01 -- SUBFUNCTION CODE (0),MODES; WD. 02 -- TABLE NUMBER,STATUS3*; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER'; WD. 04 -- SIZE OF LOGICAL NAME BUFFERN.; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER+; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFER.;E$LNFCL::' .IF DF C$$RLG ; REMOTE LOGICAL SUPPORT .MCALL CPRDF$ CPRDF$ 1 BIT #F5.RLG,$FMSK5 ;ARE WE USING REMOTE LOGICAL?A BEQ 9$ ;IF EQ NO;E"; GET A REQUEST PACKET FROM CPRBUF;A& MOV 6(R3),R1 ;GET SIZE OF USER BUFFER BEQ 1$ ;NULL NOT ALLOWED! CMP R1,#LN$SIZ ;IS SIZE TOO BIG?- BLOS 2$ ;IF LOS NO/1$: DRSTS D.RS89 ;RETURN ILLEGAL BUFFER LENGTHD2$:-3 CMP 12(R3),#LN$SIZ ;IS EQUIVALENCE STRING TOO BIG?F BHI 1$ ;IF HI YESF6 ADD 12(R3),R1 ;INCLUDE ENOUGH SPACE FOR EQUIV. STRING2 ADD #,R1 ;ADD SIZE OF HEADER & DPB3 MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ 0 ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ASH #-6,R1 ; MOV R3,R5 ;SAVE DPB POINTER)9 MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START% CALL $CPALO ;GET BUFFER FROM CPRBUFO;$; FILL IN REQUEST PACKET;9# MOV R4,-(SP) ;SAVE SIZE OF REQUEST- MOV R0,-(SP) ;SAVE PACKET BIASE MOV R0,KISAR6 ;MAP PACKET$ MOV #MAP6,R1 ;GET ADDRESS OF HEADER;U; LOAD HEADER AREA;I+ MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUESTE CLRB H$ICNT(R1) ;NO ITEMS; ; LOAD PARAMETER AREAF;C! ADD #P$DPB,R1 ;POINT TO DPB AREAE$ MOV -2(R5),(R1)+ ;COPY DIC AND SIZE3 MOV (R5),(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER0' MOV 2(R5),(R1)+ ;TABLE NUMBER & STATUSL; MOV #,(R1)+ ;ADDRESS OF LOGICAL NAME BUFFERT& MOV 6(R5),(R1)+ ;SIZE OF LOGICAL NAMED MOV #,(R1) ;CALCULATE ADDRESS OF EQUIV STRING BUFFER/ ADD 6(R5),(R1)+ ;SKIP OVER LOGICAL NAME BUFFERE- MOV 12(R5),(R1)+ ;SIZE OF EQUIVALENCE STRING ;U; COPY LOGICAL NAME INTO PACKET;% MOV 4(R5),R0 ;USER ADDRESS OF BUFFER,/ MOV 6(R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECKI CALL $ACHKB ;CHECK ADDRESS BCS 8$ ;IS CS ERRORD/ CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENTL; ; R1 := BIAS; R2 -> APR6 DISPLACEMENTO;AA SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENTS MOV (SP),R3 ;GET DEST BIAS4 MOV #,R4 ;GET DEST DISPLACEMENT# MOV 6(R5),R0 ;GET SIZE OF TRANSFER,0 CALL $BLXIO ;TRANSFER LOGICAL NAME INTO BUFFER;L%; COPY EQUIVALENCE STRING INTO PACKETU; & MOV 10(R5),R0 ;USER ADDRESS OF BUFFER0 MOV 12(R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK CALL $ACHKB ;CHECK ADDRESS BCS 8$ ;IS CS ERRORT/ CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT A SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENTE MOV (SP),R3 ;GET DEST BIAS: MOV #,R4 ;CALCULATE DEST DISPLACEMENT, ADD 6(R5),R4 ;SKIP OVER LOGICAL NAME BUFFER$ MOV 12(R5),R0 ;GET SIZE OF TRANSFER6 CALL $BLXIO ;TRANSFER EQUIVALENCE STRING INTO BUFFER# MOV (SP)+,R0 ;GET PACKET BIAS BACKA% MOV (SP)+,R4 ;GET PACKET LENGTH BACKO- CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAMEA( CALLR $CPDEA ;RELEASE THE CPRBUF SPACE; ; HANDLE ERRORSA;D!8$: MOV (SP)+,R0 ;GET PACKET BIAS; TST (SP)+ ;CLEAN OFF STACK CALL $CPDEA ;DEALLOCATE BUFFER DRSTS D.RS98 ;ADDRESS ERRORE9$:I .ENDC ; C$$RLGD5 MOV #$LGBUF,R4 ;GET POINTER TO START OF STORAGE AREA 5 MOV (R3)+,-(SP) ;STORE THE SUBFUNCTION CODE AND MODEX6 MOVB (R3),(SP) ;MOVE THE TABLE NUMBER TO STORAGE AREA- CMPB #T$BLNM,(SP) ;IS THE TABLE NUMBER VALIDT BLO 50$ ;IF LO, NO, EXIT; G; VERIFY THE DPB ARGUMENTS AND SET UP A DESCRIPTOR BLOCK TO PASS TO THEB:; ACTION ROUTINE THAT ACTUALLY CREATES AND PLACES THE LNB.;T4 MOV (SP)+,(R4)+ ;MOVE IN THE TABLE AND BLOCK NUMBER( MOV $TKTCB,R2 ;GET THE CURRENT TASK TCB. MOV T.UCB(R2),R5 ;GET THE CURRENT TI: ADDRESS5 TSTB (R3) ;SEE IF THIS IS A SYSTEM LOGICAL CREATION) BNE 10$ ;IF NE, NO/ BIT #T3.PRV,T.ST3(R2); IS THE TASK PRIVILEGED? * BEQ 60$ ;IF EQ, NO, 00r2rqibjbkb a a aDON'T ALLOW CREATION/10$: CMPB #LT.TSK,(R3) ;IS THIS A TASK CREATION ( BEQ 20$ ;IF EQ, YES, LEAVE TCB ADDRESS+ MOV R5,R2 ;GET UCB ADDRESS INSTEAD OF TCBC720$: CMPB #LT.GRP,(R3) ;IS THIS A GROUP TABLE CREATION?T- BNE 30$ ;IF NE, NO, LEAVE GROUP ENTRY BLANK = CALL GTUIC ;GET THE CURRENT TASKS PROTECTION UIC GROUP CODE): MOVB R1,(R3) ;FILL IN THE GROUP CODE FROM PROTECTION UIC130$: SWAB (R3) ;SWITCH THE STATUS AND GROUP BYTE9 MOV (R3)+,(R4)+ ;MOVE THE STATUS AND GROUP TO DESCRIPTOR 3 MOV R2,(R4)+ ;MOVE TCB/UCB ADDRESS INTO DESCRIPTORR0 CALL ACRIB ;VALIDATE IT IN THE USER TASK IMAGE0 CALL PSCNV ;CONVERT TO P/OS STYLE IF NECESSARY BCS 80$ ;IF CS, INVALID DEVICE3 MOV R0,(R4)+ ;MOVE IN THE SIZE OF THE LOGICAL NAMEI1 MOV R1,(R4)+ ;MOVE IN THE APR BIAS OF THE BUFFERE9 MOV R2,(R4)+ ;MOVE IN THE KISAR6 BIASED OFFSET OF BUFFER36 CALL ACRIB ;VALIDATE EQUIVALENCE NAME BUFFER ADDRESS7 MOV R0,(R4)+ ;MOVE IN THE SIZE OF THE EQUIVALENCE NAME41 MOV R1,(R4)+ ;MOVE IN THE APR BIAS OF THE BUFFERR9 MOV R2,(R4)+ ;MOVE IN THE KISAR6 BIASED OFFSET OF BUFFER 9 MOV #$LGBUF,R5 ;POINT TO START OF DESCRIPTOR BLOCK AGAIN ;OI; AT THIS POINT A DESCRIPTOR BLOCK WITH ALL VALIDATED PARAMETERS HAS BEEN >; CREATED AND POINTED TO BY R5. THIS BLOCK HAS THE STRUCTURE:;A1; ----------------------------------------------- 1; | BLOCK NUMBER | TABLE NUMBER |U1; -----------------------------------------------N1; | GROUP NUMBER | STATUS BYTE |M1; -----------------------------------------------M1; | TCB / UCB ADDRESS |L1; -----------------------------------------------1; | SIZE OF LOGICAL NAME IN BUFFER |A1; ----------------------------------------------- 1; | 32 WD APR ADDRESS OF START OF LOGICAL |-1; ----------------------------------------------- 1; | APR6 BIASED OFFSET TO START OF LOGICAL |-1; ----------------------------------------------- 1; | SIZE OF EQUIVALENCE NAME IN BUFFER |-1; ----------------------------------------------- 1; | 32 WD APR ADDRESS OF START OF EQUIVALENCE |-1; ----------------------------------------------- 1; | APR6 BIASED OFFSET TO START OF EQUIVALENCE|-1; ----------------------------------------------- ; 5 CALL $CRLOG ;CREATE AND INSERT A LOGICAL NAME BLOCK-7 BCS 70$ ;IF C BIT SET, AN ALLOCATION FAILURE OCCURREDO2 TST R1 ;CHECK FOR SUPERCESSION OF PREVIOUS ENTRY% BNE 40$ ;IF NE, WE HAD SUPERCESSIONI# RETURN ;OTHERWISE, SIMPLY RETURN ;-940$: DRSTS D.RSP3 ;RETURN A STATUS OF LOGICAL SUPERCEDED (50$: DRSTS D.RS20 ;INVALID TABLE NUMBER'60$: DRSTS D.RS16 ;PRIVILEGE VIOLATION-470$: DRSTS D.RS1 ;SECONDARY POOL ALLOCATION FAILURE280$: DRSTS D.RS92 ;IE.IDU - INVALID DEVICE STATUS .PAGE0 .SBTTL $LNDEL - LOGICAL NAME DELETION DIRECTIVE;+0; $LNDEL - ENTRY POINT FOR LOGICAL NAME DELETION;OM; THE ROUTINE IS ENTERED FROM THE DRLOG DISPATCH AREA WITH R3 POINTING TO THE ; FOLLOWING DPB ENTRIES:; %; WD. 01 -- SUBFUNCTION CODE (2),MODED ; WD. 02 -- TABLE NUMBER, STATUS*; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER'; WD. 04 -- SIZE OF LOGICAL NAME BUFFERV;G;-$LNDEL::' .IF DF C$$RLG ; REMOTE LOGICAL SUPPORTN1 BIT #F5.RLG,$FMSK5 ;ARE WE USING REMOTE LOGICAL?  BNE 100$ ;IF NE YEST% JMP 109$ ;PERFORM NORMAL PROCESSINGI100$:+; "; GET A REQUEST PACKET FROM CPRBUF;E& MOV 6(R3),R1 ;GET SIZE OF USER BUFFER! CMP R1,#LN$SIZ ;IS IT TOO LARGE?O BLOS 105$ ;IF LO OR SAME NO # DRSTS D.RS89 ;INVALID BUFFER SIZE 105$:)2 ADD #,R1 ;ADD SIZE OF HEADER & DPB3 MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ 0 ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ASH #-6,R1 ;9 MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT STARTE MOV R3,R5 ;SAVE DPB POINTERE% CALL $CPALO ;GET BUFFER FROM CPRBUFN;+; FILL IN REQUEST PACKET AND SEND TO CPRAMEF;E# MOV R4,-(SP) ;SAVE SIZE OF REQUESTF MOV R0,-(SP) ;SAVE PACKET BIASR MOV R0,KISAR6 ;MAP PACKET$ MOV #MAP6,R1 ;GET ADDRESS OF HEADER+ MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE RE00r:rrf__DATADATADATADATAQUESTI CLRB H$ICNT(R1) ;NO ITEMS! ADD #P$DPB,R1 ;POINT TO DPB AREAC$ MOV -2(R5),(R1)+ ;COPY DIC AND SIZE3 MOV (R5),(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIERM# MOV 2(R5),(R1)+ ;COPY TABLE NUMBERR! TST 4(R5) ;DELETE ALL LOGICALS?C BNE 106$ ;NO. CLR (R1)+ ;NO ADDRESS OF LOGICAL NAME BUFFER CLR (R1)+" BR 108$ ;DON'T COPY LOGICAL NAME106$: ; MOV #,(R1)+ ;ADDRESS OF LOGICAL NAME BUFFER;- MOV 6(R5),(R1)+ ;SIZE OF LOGICAL NAME BUFFERR;; COPY LOGICAL NAME INTO PACKETV;E% MOV 4(R5),R0 ;USER ADDRESS OF BUFFERA/ MOV 6(R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK) CALL $ACHKB ;CHECK ADDRESS BCS 8$ ;IS CS ERRORO/ CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENTN;E ; R1 := BIAS; R2 -> APR6 DISPLACEMENT;EA SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT1 MOV (SP),R3 ;GET DEST BIAS4 MOV #,R4 ;GET DEST DISPLACEMENT# MOV 6(R5),R0 ;GET SIZE OF TRANSFER(0 CALL $BLXIO ;TRANSFER LOGICAL NAME INTO BUFFER108$:M# MOV (SP)+,R0 ;GET PACKET BIAS BACKE% MOV (SP)+,R4 ;GET PACKET LENGTH BACKZ- CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAMEE! CALLR $CPDEA ;DEALLOCATE BUFFER109$:R .ENDC ; C$$RLG ;SL; CREATE A DESCRIPTOR BLOCK TO SEARCH THE APPROPRIATE TABLE FOR ALL LOGICALSJ; OR FOR A SPECIFIC ONE. THE DESCRIPTOR IS A FOUR WORD BLOCK BEGINNING ATK; LOCATION $TEMP0 IN SYSCM AND CONTAINS THE APR BIAS AND OFFSET AND SIZE OF)J; A SPECIFIC LOGICAL (OR ZEROES IF ALL) AND THE UCB ADDRESS TO MATCH (TCB,; IF TASK LOGICAL DELETE).;C= MOV #$TONYL,R5 ;GET ADDRESS OF DESCRIPTOR BLOCK TO BE FILLEDN4 MOV (R3)+,-(SP) ;STORE THE MODE VALUE FOR LATER USE; 3; GET THE APPROPRIATE UCB (OR TCB, IF TASK LOGICAL) ;A MOV $TKTCB,R2 ;GET TASK TCB6 MOV T.UCB(R2),R4 ;GET THE ASSOCIATED TI: FOR THE TASK- CMPB #T$BLNM,(R3) ;IS THE TABLE NUMBER VALID  BLO 50$ ;IF LO, NO, EXIT* TSTB (R3) ;IS THIS A SYSTEM TABLE DELETE BNE 110$ ;IF NE, NO C BIT #T3.PRV,T.ST3(R2); IS THE TASK PRIVILEGED TO DELETE SYSTEM LOG,3 BEQ 60$ ;IF EQ, NO, EXIT WITH PRIVILEGE VIOLATIONT4110$: CMPB #LT.TSK,(R3) ;IS THIS A TASK TABLE DELETE. BEQ 120$ ;IF EQ, YES, KEEP TCB IN DESCRIPTOR MOV R4,R2 ;GET UCB ADDRESS8120$: MOV R2,-(R5) ;MOVE TCB/UCB ADDRESS INTO DESCRIPTOR;VH; PICK UP THE APPROPRIATE TABLE NUMBER AND BLOCK IDENTIFIER FROM THE DPB;E> MOVB (R3)+,(SP) ;MOVE THE TABLE NUMBER INTO STORAGE WITH MODE= MOV (SP)+,-(R5) ;GET THE TABLE AND BLOCK NUMBER FROM STORAGEP0 INC R3 ;POINT TO THE BUFFER ADDRESS IN THE DPB; H; CHECK FOR A SPECIFIC LOGICAL DELETION OR AN ENTIRE TABLE BY LOOKING AT); THE BUFFER ADDRESS FOR THE LOGICAL NAMEQ;0( TST (R3) ;CHECK FOR A SPECIFIC LOGICAL BNE 130$ ;IF NE, THERE IS ONE ; D; ALL LOGICALS ARE TO BE DELETED. LEAVE THE BUFFER DESCRIPTORS ZERO;I# CLR -(R5) ;CLEAR THE LOGICAL SIZE - CLR -(R5) ;CLEAR THE APR BIAS TO THE BUFFERB+ CLR -(R5) ;CLEAR THE OFFSET TO THE STRING- BR 140$ ;JOIN COMMON CODE ;BK; A SPECIFIC LOGICAL IS GIVEN. VALIDATE THE USER BUFFER AND SIZE AND PLACEC; THEM IN THE DESCRIPTOR BLOCK. ;A8130$: CALL ACRIB ;ADDRESS CHECK THE USER LOGICAL BUFFER0 CALL PSCNV ;CONVERT TO P/OS STYLE IF NECESSARY! BCS 170$ ;IF CS, INVALID DEVICEE6 MOV R2,-(R5) ;FILL IN APR6 OFFSET TO START OF LOGICAL) MOV R1,-(R5) ;FILL IN APR BIAS OF BUFFER / MOV R0,-(R5) ;FILL IN BYTE COUNT IN DESCRIPTORA;BI; CHECK THE DESCRIPTOR FOR COMPLETE OR SPECIFIC DELETE. IF SPECIFIC, THE F; LOGICAL MUST BE HASHED, SEARCHED FOR IN THE TABLE, AND THEN DELETED.J; IF THIS IS A COMPLETE DELETE, CALL $LNDAL TO ELIMINATE EVERYTHING IN THE ; HASH TABLE.E;C:140$: MOV R5,R0 ;SET UP DESCRIPTOR ADDRESS FOR PROCESSING6 CALL $DELOG ;DELETE THE APPROPRIATE LOGICAL OR TABLE( BCC 150$ ;IF CC, SUCCESSFUL COMPLETION8 TST R3 ;CHECK WHETHER NOT FOUND OR PRIVILEGE VIOLATION2 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 FOUNDH3170$: DRSTS D.RS92 ;IE.IDU - INVALID DEVICE STATUSF .DSABL LSBL .PAGE3 .SBTTL $LNFTL - L00rBrqibjbkb a a aOGICAL NAME TRANSLATION DIRECTIVEH;+B; $LNFTL - ENTRY POINT FOR LOGICAL NAME DIRECTIVE TRANSLATION CODE;-K; THIS DIRECTIVE SEARCHES EACH OF THE HIERARCHICAL TABLES FOR THE SPECIFIEDSL; LOGICAL UNLESS AN INHIBIT MASK BIT IS SET TO PREVENT THAT TABLE FROM BEING ; LOOKED AT.;VM; THE ROUTINE IS ENTERED FROM THE DRLOG DISPATCH AREA WITH R3 POINTING TO THEN; FOLLOWING DPB ENTRIES:;C%; WD. 01 -- SUBFUNCTION CODE (1),MODE ; WD. 02 -- TBMASK, STATUS*; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER'; WD. 04 -- SIZE OF LOGICAL NAME BUFFER.; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER+; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFERSC; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAME <; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODE;GJ; THE FOLLOWING WORD IS NOT PRESENT IF THIS ROUTINE IS ENTERED VIA A TLOG$; DIRECTIVE FROM A P/OS SYSTEM.N;P@; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCK;B$LNFTL::' .IF DF C$$RLG ; REMOTE LOGICAL SUPPORTF1 BIT #F5.RLG,$FMSK5 ;ARE WE USING REMOTE LOGICAL?5 BNE 1$ ;IF NE YESL$ JMP 11$ ;PERFORM NORMAL PROCESSING1$:A;C"; GET A REQUEST PACKET FROM CPRBUF;W' MOV 6(R3),R1 ;GET SIZE OF LOGICAL NAMEM BEQ 2$ ;IF ZERO ERRORF! CMP R1,#LN$SIZ ;IS IT TOO LARGE?E BLOS 3$ ;IF LO OR SAME NO &2$: DRSTS D.RS89 ;INVALID BUFFER SIZE3$:T3 CMP 12(R3),#LN$SIZ ;IS EQUIVALENCE STRING TOO BIG?- BHI 2$ ;IF HI YESR6 ADD 12(R3),R1 ;INCLUDE ENOUGH SPACE FOR EQUIV. STRING;$1; INCREASE ALLOCATION TO ALLOW FOR THE FOLLOWING;K; H$SIZE HEADERE ; TL$SIZ DPB ; 10 TASK DESTINATION ADDRESSES;; EQUIV STRING BUFFERG; RETURNED SIZE ; TABLE # & MODE; LOGICAL STATUS BITS ; 6 RETURNED PARAMETERSM; RETURNED SIZE ; TABLE # & MODE; LOGICAL STATUS BITS;OTMP = H$SIZE+TL$SIZ+10+6 ADD #TMP,R13 MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ 0 ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ASH #-6,R1 ;9 MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT STARTL MOV R3,R5 ;SAVE DPB POINTERI% CALL $CPALO ;GET BUFFER FROM CPRBUF ;T+; FILL IN REQUEST PACKET AND SEND TO CPRAMEB;E# MOV R4,-(SP) ;SAVE SIZE OF REQUEST  MOV R0,-(SP) ;SAVE PACKET BIAS  MOV R0,KISAR6 ;MAP PACKET$ MOV #MAP6,R1 ;GET ADDRESS OF HEADER+ MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST0 CLRB H$ICNT(R1) ;NO ITEMS; ; FILL IN DPBE;S! ADD #P$DPB,R1 ;POINT TO DPB AREA;$ MOV -2(R5),(R1)+ ;COPY DIC AND SIZE3 MOV (R5),(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER * MOV 2(R5),(R1)+ ;COPY TABLE MASK & STATUS/ MOV #TMP,(R1)+ ;ADDRESS OF LOGICAL NAME BUFFER- MOV 6(R5),(R1)+ ;SIZE OF LOGICAL NAME BUFFERE5 MOV #TMP,(R1) ;CALCULATE ADDRESS OF EQUIV STRING BUFV/ ADD 6(R5),(R1)+ ;SKIP OVER LOGICAL NAME BUFFERV- MOV 12(R5),(R1)+ ;SIZE OF EQUIVALENCE STRINGI2 MOV #TMP-6,(R1)+ ;ADDRESS OF RETURNED SIZE BUFFER3 MOV #TMP-4,(R1)+ ;ADDRESS OF TABLE # & MODE BUFFER 8 MOV #TMP-2,(R1)+ ;ADDRESS OF LOGICAL STATUS BITS BUFFER;,E; FILL IN TASK ADDRESSES (TO BE USED AFTER CPRAME COMPLETES FUNCTION)E;S9 MOV 10(R5),(R1)+ ;STORE TASK ADDRESS OF EQUIV STRING BUFE: MOV 14(R5),(R1)+ ;STORE TASK ADDRESS OF RETURNED SIZE BUF7 MOV 16(R5),(R1)+ ;STORE TASK ADDRESS OF TABLE # & MODER; MOV 20(R5),(R1) ;STORE TASK ADDRESS OF LOGICAL STATUS BITSS; ; COPY LOGICAL NAME INTO PACKETM;,% MOV 4(R5),R0 ;USER ADDRESS OF BUFFER/ MOV 6(R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECKE CALL $ACHKB ;CHECK ADDRESS BCS 10$ ;IS CS ERROR/ CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENTT;C ; R1 := BIAS; R2 -> APR6 DISPLACEMENT5;RA SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENTO MOV (SP),R3 ;GET DEST BIAS( MOV #MAP6+TMP,R4 ;GET DEST DISPLACEMENT# MOV 6(R5),R0 ;GET SIZE OF TRANSFERR0 CALL $BLXIO ;TRANSFER LOGICAL NAME INTO BUFFER# MOV (SP)+,R0 ;GET PACKET BIAS BACK% MOV (SP)+,R4 ;GET PACKET LENGTH BACK- CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAME;L; GET RESPONSE PACKETS;B MOV R0,-(SP) ;SAVE PACKET BIASL MOV R0,KISAR6 ;MAP PACKET/ CMP #IS.SUC,MAP6+H$STAT ;WAS SUCCESS RETURN00rJrrf__DATADATADATADATAED?M BEQ 4$ ;IF EQ YESM5 CMP #IE.RBS,MAP6+H$STAT ;WAS IT JUST A SIZE PROBLEM? BNE 5$ ;IF NE FATAL ERROR4$:#DPB = MAP6+P$DPBTASK = DPB+TL$SIZMTEMP = TASK+10;Z!; TRANSFER EQUIV STRING INTO TASKS; + MOV TASK,R0 ;TASK ADDRESS OF EQUIV STRINGT' MOV DPB+14,R1 ;SIZE OF BUFFER FROM DPBC CALL $ACHKB ;DO ADDRESS CHECKI BCS 9$ ;IF CS ERRORO, CALL $RELOC ;GET BIAS AND OFFSET OF BUFFER;( ; R1 := BIAS; R2 -> APR6 DISPLACEMENTA;A' MOV R1,R3 ;SET UP DEST BIAS FOR BLXIOC% MOV R2,R4 ;SET UP DEST DISPLACEMENTC* MOV (SP),R1 ;SET UP SOURCE BIAS FOR APR5- MOV #MAP5+TMP,R2 ;SET UP SOURCE DISPLACEMENTP* ADD DPB+10,R2 ;SKIP OVER LOGICAL NAME BUF MOV TEMP,R0 ;GET RETURNED SIZE- CALL $BLXIO ;RETURN EQUIVALENCE NAME STRINGF;U"; TRANSFER OTHER BUFFERS INTO TASK;F) MOV #TASK+2,R3 ;ADDRESS OF OTHER BUFFERSC# MOV TEMP,R4 ;SIZE OF EQUIV STRINGL CALL 6$ ;MOVE TO TASKO MOV TEMP+2,R4 ;TABLE # & MODE CALL 6$ ;MOVE TO TASK# MOV TEMP+4,R4 ;LOGICAL STATUS BITSC CALL 6$ ;MOVE TO TASKT S&5$: MOV (SP)+,R0 ;GET BUFFER BIAS BACK! CALLR $CPDEA ;DEALLOCATE BUFFERS;UJ; ROUTINE TO VERIFY THE EXISTENCE OF AN OPTIONAL WORD, ADDRESS CHECK IT IFI; IT IS THERE, AND PLACE THE VALUE IN R4 IN THE LOCATION SPECIFIED IN THEU; NEXT WORD IN THE DPB (R3).;A.6$: MOV (R3)+,R0 ;SEE IF NEXT ENTRY IS DEFINED BEQ 8$ ;IF EQ, NO, EXITF- MOV #7$,-(SP) ;SPECIFY $SGFIN RETURN ADDRESST CALL $SGFIN ;INHIBIT TRAPS- MOV R4,-(SP) ;GET VALUE TO PLACE IN LOCATION & MTPD (R0) ;PLACE VALUE INTO LOCATION RETURN ;RETURN FROM $SGFINR7$: % ;CARRY-BIT INDICATES STATUS [TBS]S 8$: RETURN; ; HANDLE ERRORSS;C&9$: MOV (SP)+,R0 ;GET BUFFER BIAS BACK CALL $CPDEA ;DEALLOCATE BUFFER# DRSTS D.RS98 ;ADDRESS CHECK ERRORI"10$: MOV (SP)+,R0 ;GET PACKET BIAS TST (SP)+ ;CLEAN OFF STACK CALL $CPDEA ;DEALLOCATE BUFFER DRSTS D.RS98 ;ADDRESS ERROR)11$: .ENDC ; C$$RLG ;SJ; A DESCRIPTOR BLOCK IS SET UP TO PASS TO THE TABLE LOOKUP ROUTINES. THISM; BLOCK GETS THE MODIFIER VALUE FROM THE DPB DIRECTLY. THE USER LOGICAL NAME$N; BUFFER IS ADDRESS CHECKED (FOR READ-ONLY ACCESS) AND THE APR BIAS AND OFFSETN; TO THE START OF THE LOGICAL STRING IS PLACED IN THE DESCRIPTOR. THE SIZE OFJ; THE INDICATED STRING IS ALSO PLACED IN THE BLOCK. R0 WILL POINT TO THIS+; BLOCK ACROSS ALL CALLS IN THIS DIRECTIVE.L;T0 MOV #$TONYL,R5 ;GET POINTER TO DESCRIPTOR BLOCK7 MOV $TKTCB,-(R5) ;GET THE CURRENT TCB FOR FIRST LOOKUPA# MOV (R5),R0 ;SAVE THE TCB ADDRESSS9 MOV (R3)+,-(R5) ;MOVE THE MODIFIER INTO DESCRIPTOR BLOCKH= MOV (R3)+,$TONYL ;STORE THE TABLE INHIBIT MASK FOR LATER USEY. BIT #1,$TONYL ;SEE IF TASK TABLE IS INHIBITED0 BEQ 12$ ;IF EQ, NO, KEEP TCB ADDRESS IN PACKET: MOV T.UCB(R0),2(R5) ;MOVE THE UCB ADDRESS INTO THE PACKET;E,; ADDRESS CHECK THE USER LOGICAL NAME BUFFER;L<12$: CALL ACRIB ;ADDRESS CHECK THE USER LOGICAL NAME BUFFER0 CALL PSCNV ;CONVERT TO P/OS STYLE IF NECESSARY! BCS 120$ ;IF CS, INVALID DEVICE56 MOV R3,-(SP) ;STORE THE CURRENT DPB POINTER FOR LATER5 MOV R2,-(R5) ;GET THE APR6 OFFSET TO START OF STRINGO1 MOV R1,-(R5) ;GET THE APR BIAS TO LOGICAL STRINGT= MOV R0,-(R5) ;GET THE SIZE OF THE LOGICAL NAME IN DESCRIPTORP) MOV R5,R0 ;POINT R0 TO DESCRIPTOR START);O=; CALL THE ROUTINE TO DO THE LOOKUP IN THE APPROPRIATE TABLESR;G8 CMPB #R$LOG,$DICSV+2 ;IS THIS REALLY AN RLOG$ DIRECTIVE1 BEQ 20$ ;IF EQ, YES, SEARCH RECURSIVELY FOR LNBP8 CMPB #R$LON,$DICSV+2 ;IS THIS REALLY AN RLOG$ DIRECTIVE1 BEQ 20$ ;IF EQ, YES, SEARCH RECURSIVELY FOR LNBL;RH; FOR A TLOG$ DIRECTIVE, ONLY LOOK FOR THE SPECIFIED LOGICAL NAME IN THE'; TOP LEVELS OF THE LOGICAL NAME TABLESR;(9 CALL $TBSRC ;SEARCH ALL HIERARCHICAL TABLES FOR LOGICALR( BCS 100$ ;IF CS, NO LOGICAL NAME FOUND BR 40$ ;JOIN COMMON CODE BELOW;NJ; FOR AN RLOG$ DIRECTIVE, LOOK THROUGH THE LOGICAL NAME TABLES RECURSIVELYE; FOR THE FINAL EQUIVALENCE NAME. ANY SPECIFIED INHIBIT MASK WILL BER+; PROPAGATED THROUGH ALL RECURSIVE LOOKUPS.I;820$: CLR R3 ;CALL ITERATIVE ROUTINE IN EXACT MATC00rRrqibjbkb a a aH MODE0 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 ;IM; NOW THAT THE LOGICAL NAME HAS BEEN FOUND, THE APR BIAS TO THE LNB IS STOREDWK; FOR LATER USE AND THE USER EQUIVALENCE NAME BUFFER IS ADDRESSED CHECK FOREK; READ/WRITE ACCESS. IF IS VALID, THE SOURCE AND DESTINATION REGISTERS ARE L; SET UP FOR A $BLXIO CALL TO PLACE THE EQUIVALENCE NAME IN THE USER BUFFER.;I840$: MOV R3,$TONYL ;STORE THE LNB APR BIAS FOR LATER USE/ MOV (SP)+,R3 ;RESTORE THE POINTER INTO THE DPBT: CALL ACROB ;ADDRESS CHECK RW THE USER EQUIVALENCE BUFFER1 MOV R3,-(SP) ;STORE THE POINTER TO THE DPB AGAINN3 MOV R1,R3 ;SET UP DESTINATION APR BIAS FOR $BLXIOW5 MOV R2,R4 ;SET UP APR6 OFFSET VALUE FOR DESTINATIONI% MOV $TONYL,KISAR6 ;MAP THE FOUND LNBC;.M; THE NUMBER OF BYTES TO PASS THROUGH $BLXIO IS DETERMINED BY THE SIZE OF THE I; USER BUFFER. IF IT IS LARGE ENOUGH TO HOLD THE ENTIRE STRING, THE SIZENO; GIVEN IN THE LOGICAL BLOCK WILL BE PASSED. IF THE BUFFER ISN'T LARGE ENOUGH, O; ONLY AS MUCH AS IT CAN HOLD WILL BE PASSED. IN EITHER CASE, THE VALUE PASSEDPJ; IN THE USER SIZE WORD (RSIZE) WILL BE THE ACTUAL SIZE OF THE EQUIVALENCE; STRING;IB CMPB MAP6+L.NENS,R0 ;SEE IF THE EQUIVALENCE SIZE IS > BUFFER SIZE5 BHIS 50$ ;IT IS, ONLY RETURN USER BUFFER SIZE WORTHE CLR R0 ;REMOVE OLD VALUE< BISB MAP6+L.NENS,R0 ;IT ISN'T, ONLY RETURN EQUIVALENCE SIZE750$: CLR R2 ;INITIALIZE THE POINTER TO THE EQUIVALENCET' BISB MAP6+L.NLNS,R2 ;STRING FOR $BLXIOB ADD #MAP5+L.NNAM,R2 ;: MOV KISAR6,R1 ;GET THE APR BIAS TO START OF SOURCE STRING;S/; INITIATE THE DATA MOVEMENT TO THE USER BUFFERI; 9 CALL $BLXIO ;MOVE THE EQUIVALENCE STRING TO USER BUFFERC; K; THE REMAINDER OF THE WORK TO DO IS FILLING IN THE USER OPTIONAL WORDS FORIK; THE SIZE OF THE FOUND EQUIVALENCE STRING, THE TABLE NUMBER AND MOD OF THE6A; FOUND LNB, AND THE STATUS BITS TAKEN FROM IT. IF A WORD IS NOTNI; DEFINED, THAT PARTICULAR DATA WILL NOT BE PASSED BACK TO THE USER TASK.$;I& MOV (SP)+,R3 ;RESTORE THE DPB POINTER;;,; PASS BACK THE EQUIVALENCE NAME STRING SIZE; 6 CLR R4 ;GET VALUE FOR THE EQUIVALENCE NAME SIZE WORD BISB MAP6+L.NENS,R4 ;% CALL 90$ ;PLACE IT IN THE USER WORDH;E:; PASS BACK THE TABLE NUMBER AND MOD OF FOUND LOGICAL NAME; @ MOV MAP6+L.NTBL,R4 ;GET VALUE FOR USER WORD FOR TABLE # AND MOD% CALL 90$ ;PLACE IT IN THE USER WORDS;UI; PASS BACK THE STATUS BITS FOUND FOR THE LOGICAL NAME. THIS OPERATION ISI<; ELIMINATED IF THE DIRECTIVE WAS ISSUED FROM A P/OS SYSTEM.;O4 CMPB #P$SSIZ,$DICSV+1;IS THE DPB FROM A P/OS SYSTEM1 BEQ 95$ ;IF EQ, YES, SKIP THE STATUS WORD CHECKI' CLR R4 ;GET VALUE FOR THE STATUS WORD4 BISB MAP6+L.NSTS,R4 ;;+J; ROUTINE TO VERIFY THE EXISTENCE OF AN OPTIONAL WORD, ADDRESS CHECK IT IFI; IT IS THERE, AND PLACE THE VALUE IN R4 IN THE LOCATION SPECIFIED IN THE ; NEXT WORD IN THE DPB (R3).;-/90$: MOV (R3)+,R0 ;SEE IF NEXT ENTRY IS DEFINEDI BEQ 95$ ;IF EQ, NO, EXIT, MOV #2,R1 ;SET UP SIZE OF BUFFER TO VERIFY: CALL $ACHCK ;ADDRESS CHECK THE BUFFER RW (WORD BOUNDARY)/ BCS 110$ ;IF CS, ADDRESS CHECK ERROR OCCURREDT- MOV R4,-(SP) ;GET VALUE TO PLACE IN LOCATION ' MTPD$ (R0) ;PLACE VALUE INTO LOCATION 95$: RETURN +100$: DRSTS D.RS21 ;LOGICAL NAME NOT FOUNDD2110$: DRSTS D.RS98 ;ADDRESS CHECK ERROR ON BUFFER3120$: DRSTS D.RS92 ;IE.IDU - INVALID DEVICE STATUS  .PAGE;+L; $CRLOG - ROUTINE TO TAKE A PREVIOUSLY VERIFIED LOGICAL NAME CREATION BLOCKO; AND CREATE AND INSERT AN LNB INTO THE APPROPRIATE TABLE FOR THAT LOGICAL.KM; ANY PREVIOUS LOGICAL WITH THE SAME NAME WILL BE DELETED AND SUPERCEDED.TK; SUPERCESSION WILL BE INDICATED BY SETTING THE V BIT COMING OUT OF THEN; ROUTINE.;R ; INPUTS:0I; R5 - POINTER TO THE DESCRIPTOR BLOCK CONTAINING DATA FOR LOGICAL CREATEE; WITH THE FORMAT:2; 2; -----------------------------------------------2; | BLOCK NUMBER | TABLE NUMBER |2; -----------------------00rZrrf__DATADATADATADATA------------------------2; | GROUP NUMBER | STATUS BYTE |2; -----------------------------------------------2; | TCB / UCB ADDRESS |2; -----------------------------------------------2; | SIZE OF LOGICAL NAME IN BUFFER |2; -----------------------------------------------2; | 32 WD APR ADDRESS OF START OF LOGICAL |2; -----------------------------------------------2; | APR6 BIASED OFFSET TO START OF LOGICAL |2; -----------------------------------------------2; | SIZE OF EQUIVALENCE NAME IN BUFFER |2; -----------------------------------------------2; | 32 WD APR ADDRESS OF START OF EQUIVALENCE |2; -----------------------------------------------2; | APR6 BIASED OFFSET TO START OF EQUIVALENCE|2; -----------------------------------------------;2 ; OUTPUTS:#; CC - LNB WAS SUCCESSFULLY CREATED-3; R1 = 0 IF NO SUPERCESSION OF PREVIOUS ASSIGNMENTP5; R1 <> 0 IF SUPERCESSION OF PREVIOUS ENTRY OCCURRED-3; CS - A SECONDARY POOL ALLOCATION FAILURE OCCURREDE;VG; R5 IS PRESERVED ACROSS THE CALL; HOWEVER THE DATA IN THE BLOCK IS NOT-%; KISAR6 IS DESTROYED BY THIS ROUTINET; G; CALLER MUST HAVE VALIDATED ALL ENTRIES IN THE DESCRIPTOR BLOCK BEFORE|H; CALLING THIS ROUTINE. CALLER MUST ALSO HAVE VERIFIED THAT THE TASK IS6; PRIVILEGED IF THIS IS TO BE A SYSTEM TABLE CREATION.;CG; A ZERO VALUE IN THE BLOCK NUMBER VARIABLE HAS NO MEANING. THE LOWESTF; VALID NUMBER IS 1 (LB.LOC). IT WILL BE PLACED IN THE LNB BY DEFAULTG; IF A ZERO VALUE IS SEEN. THIS HELPS THE COMPATIBILITY ISSUE WITH POSL;-$CRLOG::; G; CHECK FOR A ZERO VALUE IN THE BLOCK PARAMETER. IF THERE IS ONE, TURNR,; IT INTO A DEFAULT CREATION VALUE (LB.LOC).;R* TSTB 1(R5) ;CHECK FOR A ZERO BLOCK VALUE) BNE 5$ ;IF NE, SOMETHING ELSE WAS GIVENS; MOVB #LB.LOC,1(R5) ;MOVE IN THE DEFAULT VALUE FOR CREATION; D; CREATE THE LOGICAL NAME BLOCK AND FILL IN THE APPROPRIATE ENTRIES.;A,5$: MOVB (R5),R3 ;GET TABLE NUMBER FROM LNB! CALL $TBTRL ;MAP THE HASH TABLEA) BCS 70$ ;IF CS, THERE WAS NO HASH TABLEI3 MOV #L.NHSZ+77,R1 ;GET SIZE OF STATIC PIECE OF LNBO8 ADD 6(R5),R1 ;ADD THE SIZE OF THE PROPOSED LOGICAL NAME= ADD 14(R5),R1 ;ADD THE SIZE OF THE PROPOSED EQUIVALENCE NAMEH* ASH #-6,R1 ;TURN BYTES INTO 32 WD BLOCKS9 CALL $ALSEC ;ALLOCATE A PIECE OF SECONDARY POOL FOR LNBE# BCS 70$ ;IF CS, ALLOCATION FAILEDR! MOV R0,KISAR6 ;MAP THE NEW BLOCKL> MOV #MAP6+L.NTBL,R4 ;SET UP OFFSET VALUE FOR THE TABLE NUMBER6 MOV R5,-(SP) ;SAVE THE BUFFER POINTER ACROSS THE CALL6 MOV (R5)+,(R4)+ ;MOVE BLOCK AND TABLE NUMBER INTO LNB7 MOV (R5)+,(R4)+ ;MOVE STATUS AND GROUP NUMBER INTO LNBT2 MOV (R5)+,(R4)+ ;MOVE TCB OR UCB ADDRESS INTO LNB' MOV (R5)+,R0 ;GET SIZE OF LOGICAL NAMEE;MB; TRANSFER THE LOGICAL NAME STRING FROM THE USER BUFFER TO THE LNB; # MOV R0,(R4)+ ;MOVE IT INTO THE LNBB2 MOV (R5)+,R1 ;GET APR BIAS OF LOGICAL NAME BUFFER2 MOV (R5)+,R2 ;GET OFFSET TO START OF LOGICAL NAME6 SUB #MAP6-MAP5,R2 ;TURN IT INTO AN APR5-BIASED OFFSET, MOV KISAR6,R3 ;GET THE DESTINATION APR BIAS3 CALL $BLXIO ;TRANSFER THE LOGICAL NAME TO THE LNB(;+F; TRANSFER THE EQUIVALENCE NAME STRING FROM THE USER BUFFER TO THE LNB; 5 MOV (R5)+,R0 ;GET THE SIZE OF THE EQUIVALENCE STRINGM> MOVB R0,MAP6+L.NENS ;MOVE IN THE SIZE OF THE EQUIVALENCE NAME7 MOV (R5)+,R1 ;GET APR BIAS FOR EQUIVALENCE NAME BUFFERV MOV (R5)+,R2 ;GET APR OFFSETC6 SUB #MAP6-MAP5,R2 ;TURN IT INTO AN APR5 BIASED OFFSET- CALL $BLXIO ;MOVE EQUIVALENCE NAME INTO LNB ;5K; SET UP A MINIATURE DESCRIPTOR BLOCK TO PASS TO THE LOOKUP ROUTINES TO SEETJ; IF THIS LOGICAL IS A SUPERCESSION OF A CURRENTLY EXISTING LOGICAL. THISL; MINI DESCRIPTOR BLOCK IS POINTED TO BY R0 AND CONTAINS, IN ORDER - EACH TOK; A WORD, THE SIZE OF THE LOGICAL, THE MEMORY APR BIAS TO THE STRING BLOCK, M; THE APR6-BIASED OFFSET TO THE START OF THE LOGICAL, THE TABLE/BLOCK NUMBER,G; AND THE APPROPRIATE TCB/UCB.;;+ MOV R5,R0 ;GET POINTER TO MINI DESCRIPTORX SUB #14,R0 ;5 MOV -6(R0),6(R0) ;MOVE TABLE 00rbrqibjbkb a a aNUMBER AND BLOCK NUMBERO( MOV -2(R0),10(R0) ;MOVE TCB/UCB ADDRESS;T>; NOW UPPER CASE ALL ALPHABETIC CHARACTERS IN THE LOGICAL NAME;A< MOV #MAP6+L.NNAM,R3 ;GET POINTER TO THE START OF THE STRING1 CLR R2 ;GET THE NUMBER OF CHARACTERS TO PROCESS  BISB MAP6+L.NLNS,R2 ;810$: CALL $CVBUC ;UPPER CASE THE CHARACTER IF NECESSARY1 MOVB R5,-1(R3) ;MOVE THE VALUE BACK INTO THE LNB ( SOB R2,10$ ;GO BACK IF MORE TO PROCESS; O; SEARCH THE APPROPRIATE TABLE FOR A CURRENTLY EXISTING LNB WITH THE SAME NAME.UK; IF FOUND, DELETE THAT ENTRY, ENTER THE NEW ONE, AND EXIT WITH A STATUS OFP; LOGICAL SUPERCEDED. ;R CALL $LNHSH ;HASH THE ENTRY. CLR -(SP) ;INITIALIZE SUPERCESSION INDICATOR; MOV KISAR6,-(SP) ;STORE THE LNB ADDRESS ACROSS THE LOOKUPS 5 CALL $LNTBS ;SEARCH THE TABLES FOR THE LOGICAL NAME 0 BCS 20$ ;IF CS, A PREVIOUS ENTRY WAS NOT FOUND; G; A LOGICAL WAS FOUND IN THE TABLE. FLAG THE SUPERCESSION BY MAKING R1 "; NONZERO AND REMOVE THE OLD ENTRY;E, MOV R3,2(SP) ;MOVE IN THE OLD ENTRY ADDRESS! CALL $LNELM ;REMOVE THE OLD LNBN;O&; INSERT THE NEW ENTRY INTO THE TABLES;U.20$: 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 OFFSETL?; R3 - 32 WD ADDRESS OF LNB TO BE BEHIND THE LNB TO BE INSERTED G; R4 - 32 WD ADDRESS OF LNB TO BE AHEAD OF NEW LNB IN LIST (=0 IF NONE)E;F ; OUTPUTS:B; CC = 0 -> LNB IS INSERTED INTO LIST AND ALL LINKAGES ARE UPDATED<; CC = 1 -> INSERTION FAILED FROM INVALID HASH TABLE ADDRESS;H MOV R0,KISAR6 ;MAP THE NEW LNBE@ MOV R3,MAP6+L.NLNK ;SET THE LINKAGES FOR THE LNB BEHIND THE NEW9 MOVB MAP6+L.NTBL,R3 ;GET THE TABLE NUMBER FOR THIS ENTRYN$ MOV R4,KISAR6 ;MAP THE PREVIOUS LNB BNE 30$ ;IF NE, THERE IS ONE! CALL $TBTRL ;MAP THE HASH TABLET" BCS 50$ ;IF CS, THERE WASN'T ONE' ADD #MAP6,R1 ;SET POINTER TO HASH CELL ! MOV R0,(R1) ;PUT IN FIRST ENTRY BR 40$ ;230$: MOV R0,MAP6+L.NLNK ;INSERT POINTER TO NEW LNB40$: CLC ;INDICATE SUCCESS050$: MOV (SP)+,R1 ;RESTORE THE SUPERCESSION FLAG3 MOV (SP)+,R5 ;RESTORE THE DESCRIPTOR BLOCK ADDRESSL 70$: RETURNH .PAGE;+I; $DELOG - ROUTINE TO DELETE AN EXPLICIT LOGICAL NAME OR A COMPLETE TABLE,;A ; INPUTS: E; R0 - POINTER TO A DESCRIPTOR BLOCK DESCRIBING LOGICAL TO BE DELETEDS; WITH THE FORMAT:I%; WD 1 - BYTE COUNT OF LOGICAL NAMES.; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME5; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAMER,; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)(; BLOCK TYPE NUMBER (HIGH BYTE)9; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLED;SJ; IF AN ENTIRE TABLE IS TO BE DELETED, THE FIRST 3 WORDS OF THE DESCRIPTOR; BLOCK ARE ZERO.L; ; OUTPUTS:;N%; CC - SUCCESSFUL DELETION OF LOGICALB@; CS : R3 = 0 -> LOGICAL NOT FOUND IF SPECIFIC LOGICAL REQUESTED?; R3 <> 0 -> PRIVILEGE VIOLATION IF SPECIFIC LOGICAL REQUESTEDS;-$DELOG::+ TSTB 7(R0) ;CHECK FOR ZERO BLOCK MODIFIERG! BNE 10$ ;IF NE, THERE ISN'T ONEE? MOVB #LB.LOC,7(R0) ;A ZERO MODIFIER IMPLIES LOCAL MODE DEFAULT 010$: TST (R0) ;SEE IF THIS IS A SPECIFIC DELETE8 BNE 20$ ;IF EQ, IT ISN'T, DELETE ALL MATCHING LOGICALS;3; TOTAL LOGICAL DELETE; / CALLR $LNDAL ;ELIMINATE ALL LOGICALS AND EXITE;U; SPECIFIC LOGICAL DELETES;R,20$: CALL $LNHSH ;IT IS SPECIFIC, HASH NAME3 CALL $LNTBS ;FIND THE NAME IN THE SPECIFIED TABLEI, BCC 40$ ;IF CC, FOUND LNB, CHECK PRIVILEGE# CLR R3 ;INDICATE NO LOGICAL FOUNDG SEC ;INDICATE FAILURE 30$: RETURNM040$: MOV R3,KISAR6 ;MAP THE LNB FOUND WITH MATCH/ CALL PRVTST ;CHECK TASK PRIVILEGE AGAINST LNBE/ BCS 30$ ;IF CS, TASK CANNOT ELIMINATE LOGICALA .PAGE;+3; $LNELM - ROUTINE TO ELMINATE AN ALREADY FOUND LNB;;M ; INPUTS:O/; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCK; BLOCK CONTAINS:%; WD 1 - BYTE COUNT OF LOGICAL NAMET.; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME5; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAMEI,; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)(; BLOCK TYPE NUMBER (HIGH B00rjrrf__DATADATADATADATAYTE)9; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLEG@; R1 - WORD OFFSET FROM START OF HASH TABLE TO CORRECT HASH CELL1; R3 - 32 WD BLOCK ADDRESS OF LNB TO BE ELMINATEDL=; R4 - PREVIOUS LNB 32 WD ADDRESS IN LIST (=0 IF NONE BEFORE)E;S ; OUTPUT:C; ; CC = 0NE; R3 - 32 WD BLOCK ADDRESS OF LNB AFTER THE ONE ELMINATED (0 IF NONE)A=; R4 - PREVIOUS LNB 32 WD ADDRESS IN LIST (=0 IF NONE BEFORE)F;G ; CC = 1!; R3 AND R4 ARE THE SAME AS INPUTL;+$LNELM::2 MOV R4,-(SP) ;SAVE THE PREVIOUS ENTRY ACROSS CALL/ MOV R1,-(SP) ;SAVE THE HASH OFFSET ACROSS CALL-4 MOV R3,-(SP) ;SAVE THE LNB ADDRESS TO BE ELIMINATED MOV R3,KISAR6 ;MAP THE LNBE< MOV MAP6+L.NLNK,R3 ;GET THE FORWARD LINK IN THE CURRENT LNB$ MOV R4,KISAR6 ;MAP THE PREVIOUS LNB BNE 20$ ;IF NE, THERE IS ONE! CALL $MPHSH ;MAP THE HASH TABLE  BCC 10$ ;CC -> SUCCESS MOV (SP)+,R3 ;RESTORE R3 4 BR 40$ ;RESTORE THE REST OF THE REGISTERS AND EXIT&10$: ADD #MAP6,R1 ;GET ADDRESS OF CELL) MOV R3,(R1) ;RESET THE FORWARD LINKAGESS BR 30$ ;F20$: 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 6B MOV MAP6+L.NLNS,R1 ;GET THE LENGTH OF THE LOGICAL NAME IN THE LNB3 MOVB R1,R2 ;SCREEN OUT THE VARIOUS VALUES AND ADDT& BIC #177400,R2 ;GET LOGICAL NAME SIZE1 SWAB R1 ;PUT EQUIVALENCE NAME IN LOW BYTE OF R1 & BIC #177400,R1 ;GET LOGICAL NAME SIZE* ADD R2,R1 ;GET FULL SIZE OF BOTH BUFFERS1 ADD #L.NHSZ+77,R1 ;GET FULL SIZE OF LNB IN BYTESV$ ASH #-6,R1 ;TURN BYTES INTO BLOCKS* CALL $DESEC ;DEALLOCATE THE PREVIOUS LNB CLC ;INDICATE SUCCESS/40$: MOV (SP)+,R1 ;RESTORE THE HASH CELL OFFSETA) MOV (SP)+,R4 ;RESTORE THE PREVIOUS ENTRYF RETURNC .PAGE;+4; -- $LNTDR -- TRANSLATE RSX DEVICE FORM RECURSIVELYJ; -- $LNTSL -- TRANSLATE RSX DEVICE FORM RECURSIVELY WITH SPECIFIC INHIBIT; MASK AND MODIFIER VALUE4;RO; THIS ROUTINE WILL RECURSIVELY SEARCH THE LOGICAL NAME TABLES FOR DEVICE NAME.ZK; THE DEVICE MNEMONIC AND UNIT NUMBER ARE MERGED INTO AN INTERNAL STRING TOJ; USE AS THE BASE LOGICAL FOR THE LOOKUPS. AS A LOGICAL IS FOUND FOR EACHG; LEVEL, IT IS CHECKED TO SEE IF IT IS TERMINAL. IF SO, LOOKUPS CEASE,EL; OTHERWISE A NEW SET OF LOOKUPS ARE PERFORMED FOR THE LATEST LOGICAL. ONCEL; THE BOTTOM LEVEL LOGICAL IS FOUND, THE DEVICE MNEMONIC AND UNIT NUMBER (IN1; BINARY) ARE RESTORED TO R2 AND R0 RESPECTIVELY.H;RI; $LNTSL IS IDENTICAL TO $LNTDR WITH THE ADDITION OF AN EXPLICIT MODIFIER I; VALUE THAT MUST MATCH THE VALUE IN THE LNB AND AN INHIBIT MASKWORD THATI; INDICATES THE LOGICAL TABLES THAT CANNOT BE SEARCHED. THIS MASKWORD IS,; IN EFFECT IN ALL LOOKUP LEVELS AND TABLES.; ; INPUTS:U;C1; R0 = THE BINARY UNIT NUMBER OF THE DEVICE SPECM-; R2 = THE ASCII MNEMONIC OF THE DEVICE SPECL!; $LNTSL SPECIFIC PARAMETERS:N/; R3 = SPECIFIC MODIFIER VALUE TO MATCH IN LNBD=; $TONYL = SPECIFIC INHIBIT MASKWORD USED ACROSS ALL LOOKUPSD;I ; OUTPUTS:; C=0, ;L;; R0 = THE BINARY UNIT NUMBER OF THE RESULTANT DEVICE SPECA=; R2 = THE ASCII DEVICE MNEMONIC OF THE RESULTANT DEV. SPEC.A5; R3 = APR BIAS OF MATCHING LNB SECONDARY POOL BLOCKN;L/; C=1 INVALID TRANSLATION ON EXISTING LOGICAL ; /; R3 = 0 IF NO MATCH WAS FOUND FOR DEVICE NAMER>; = N IF A MATCH WAS FOUND BUT DID NOT TRANSLATE TO DEVICE; OR RECURSION LIMIT WAS HITM;FL; IF AN ERROR CONDITION OCCURS (VS, CS) R0 AND R2 ARE PRESERVED ACROSS THEL; CALL. R1,R3 ARE DESTROYED BY THIS ROUTINE. R4,R5,KISAR6 ARE PRESERVED.; ;-$LNTDR::' CLR R3 ;INITIALIZE THE MODIFIER VALUE . CLR $TONYL ;INITIALIZE THE INHIBIT MASK WORD$LNTSL::SAVNR ;SAVE R4 AND R5C0 MOV KISAR6,-(SP) ;SAVE THE OLD DATA MAPPING APR# MOV R0,-(SP) ;SAVE THE UNIT NUMBER ' MOV R2,-(SP) ;SAVE THE DEVICE MNEMONICT1 MOV R3,-(SP) ;SAVE THE MODIFIER VALUE TO BE USEDO;EN; MOVE THE DEVICE NAME MNEMONIC AND ASCIIZED UNIT NUMBER INTO A SCRATCH BUFFER'; FOR THE INITIAL LOOKUP IN THE TABLES.3;E? MOV #$LTBUF,R3 ;POINT TO SCRATCH BUFFER00rrrqibjbkb a a a TO BUILD DEVICE STRING0 MOV R2,(R3)+ ;MOVE IN THE ASCII DEVICE MNEMONIC< CALL $DCBTA ;TURN THE OCTAL UNIT NUMBER TO ASCII IN BUFFER; K; INITIALIZE THE INTERNAL LOGICAL NAME DESCRIPTOR BLOCK TO BE PASSED AROUND,; DURING THE VARIOUS LOOKUPS.M;R, SUB #$LTBUF,R3 ;GET THE STRING LENGTH IN R39 MOV #$TONYL,R0 ;CREATE THE LOGICAL NAME DESCRIPTOR BLOCKV+ MOV $TKTCB,R2 ;GET THE CURRENT TCB ADDRESST* BIT #1,(R0) ;IS THE TASK TABLE INHIBITED% BEQ 5$ ;IF EQ, NO, KEEP TCB ADDRESSP. MOV T.UCB(R2),R2 ;GET THE UCB ADDRESS INSTEAD15$: MOV R2,-(R0) ;MOVE IN THE APPROPRIATE ADDRESSC- CLR -(R0) ;CLEAR THE TABLE AND BLOCK NUMBERI; BISB (SP)+,1(R0) ;GET AN EXPLICIT MODIFIER VALUE IF IS ONEP= MOV #$LTBUF+20000,-(R0) ;MOVE APR6 BIASED ADDRESS INTO BLOCK< MOV KISAR5,-(R0) ;TURN THE ADDRESS INTO APR BIAS AND OFFSET< MOV R3,-(R0) ;MOVE THE LENGTH OF THE STRING INTO DESCRIPTOR;ED; ENTER A LOOP OF LOOKUPS FOR EACH NEWLY FOUND LOGICAL IN THE CHAIN.I; A POINTER TO THE LATEST FOUND LNB IS KEPT FOR USE AFTER ALL LOOKUPS AREDG; COMPLETED. LOOKUPS TERMINATE AS SOON AS A LOGICAL ISN'T FOUND, OR IFRG; THE LATEST HAS THE TERMINAL ATTRIBUTE OR BEGINS WITH AN _. THIS LOOPTI; WILL BE EXECUTED A MAXIMUM OF M$XLOG TIMES BEFORE AN ERROR IS RETURNED.EI; THIS IS TO PREVENT AN INFINITE LOOP IN ASSIGNMENTS AND ALSO TO PUT SOMET;; KIND OF RESTRICTION ON USAGE OF SYSTEM STATE LOOKUP TIME.R;EG; A NONZERO VALUE IN R3 INDICATES THAT THE LOGICAL LOOKUP IS TO BE DONE G; IN FILES-11 MODE - THIS MEANS THAT THE SUBSEQUENT EQUIVALENCE NAME ISE; SEARCHED UP TO, BUT NOT INCLUDING, THE COLON. IF ONE IS NOT FOUND,RF; THE ENTIRE STRING IS USED FOR THE NEXT ROUND. OTHERWISE, EVERYTHING; BEFORE THE COLON IS USED.M;O5 CALL $LGRCS ;LOOK UP THE DEVICE LOGICAL RECURSIVELY 2 BCS 10$ ;IF CS, RECURSION LIMIT FAILURE OCCURRED;PJ; NOW THAT THE CHAIN HAS BEEN WALKED DOWN COMPLETELY, RESTORE THE LAST LNBJ; FOUND AND PARTIALLY VERIFY THAT THE EQUIVALENCE NAME IS A VALID PHYSICALH; DEVICE NAME. IF IT IS, R0 AND R2 ARE RESTORED WITH THE DEVICE MNEMONIC; AND BINARY UNIT NUMBER.L;N8 CALL DVVFY ;VALIDATE THE RESULTING LOGICAL AS A DEVICE) BCS 10$ ;IF CS, THE LOGICAL WAS INVALIDR8 CMP (SP)+,(SP)+ ;ELIMINATE THE OLD VALUES FOR R0 AND R2 BR 20$ ;EXIT SUCCESSFULLYU210$: MOV (SP)+,R2 ;RESTORE THE OLD DEVICE MNEMONIC* MOV (SP)+,R0 ;RESTORE THE OLD UNIT NUMBER SEC/20$: MOV (SP)+,KISAR6 ;RESTORE ANY OLD MAPPINGSN: MOV $LSTLG,R3 ;SET INDICATION OF WHETHER A MATCH OCCURRED RETURNE;+,; -- $RTRL1 -- TRANSLATE LOGICAL RECURSIVELY;NL; THIS ROUTINE WILL RECURSIVELY SEARCH THE LOGICAL NAME TABLES FOR A LOGICALN; AS A LOGICAL IS FOUND AT EACH LEVEL, IT IS CHECKED TO SEE IF IT IS TERMINAL.L; IF SO, LOOKUPS CEASE, OTHERWISE A NEW SET OF LOOKUPS ARE PERFORMED FOR THEN; LATEST LOGICAL. ONCE THE BOTTOM LEVEL LOGICAL IS FOUND, THE DEVICE MNEMONICE; AND UNIT NUMBER (IN BINARY) ARE RESTORED TO R2 AND R0 RESPECTIVELY.$;L ; INPUTS:N;A;; R0 = POINTER TO A USER BUFFER ADDRESS CONTAINING LOGICAL$!; R2 = SIZE OF LOGICAL IN BUFFERE; ; OUTPUTS:; C=0,L;E;; R0 = THE BINARY UNIT NUMBER OF THE RESULTANT DEVICE SPECA=; R2 = THE ASCII DEVICE MNEMONIC OF THE RESULTANT DEV. SPEC.T5; R3 = APR BIAS OF MATCHING LNB SECONDARY POOL BLOCKF;O/; C=1 INVALID TRANSLATION ON EXISTING LOGICALC;H/; R3 = 0 IF NO MATCH WAS FOUND FOR DEVICE NAMEN>; = N IF A MATCH WAS FOUND BUT DID NOT TRANSLATE TO DEVICE; OR RECURSION LIMIT WAS HIT ; L; IF AN ERROR CONDITION OCCURS (VS, CS) R0 AND R2 ARE PRESERVED ACROSS THEL; 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 MAPPINGS. MOV R2,-(SP) ;SAVE LOGICAL SIZE FOR LATER USE; H; CREATE THE LOGICAL DESCRIPTOR BLOCK FOR USE ACROSS THE RECURSIVE CALLS; 2 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 NUMBERSS7 CLR $TONYL ;INDICATE ROUTINE SHOULD 00rzrrf__DATADATADATADATASEARCH ALL TABLESE; CALL $RELOC ;TURN USER BUFFER ADDRESS INTO OFFSET AND APR2 MOV R2,-(R3) ;MOVE THE OFFSET INTO THE DESCRIPTOR7 MOV R1,-(R3) ;MOVE THE APR6 OFFSET INTO THE DESCRIPTORR& MOV (SP)+,-(R3) ;GET THE LOGICAL SIZE' MOV R3,R0 ;POINT R0 AT THE DESCRIPTORC, ; AND INDICATES FILES-11 MODE OF $LGRCS;TD; ENTER A LOOP OF LOOKUPS FOR EACH NEWLY FOUND LOGICAL IN THE CHAIN.I; A POINTER TO THE LATEST FOUND LNB IS KEPT FOR USE AFTER ALL LOOKUPS AREBG; COMPLETED. LOOKUPS TERMINATE AS SOON AS A LOGICAL ISN'T FOUND, OR IFLG; THE LATEST HAS THE TERMINAL ATTRIBUTE OR BEGINS WITH AN _. THIS LOOPHI; WILL BE EXECUTED A MAXIMUM OF M$XLOG TIMES BEFORE AN ERROR IS RETURNED.DI; THIS IS TO PREVENT AN INFINITE LOOP IN ASSIGNMENTS AND ALSO TO PUT SOMET;; KIND OF RESTRICTION ON USAGE OF SYSTEM STATE LOOKUP TIME.S;T5 CALL $LGRCS ;LOOK UP THE DEVICE LOGICAL RECURSIVELYL2 BCS 10$ ;IF CS, RECURSION LIMIT FAILURE OCCURRED;KJ; NOW THAT THE CHAIN HAS BEEN WALKED DOWN COMPLETELY, RESTORE THE LAST LNBJ; FOUND AND PARTIALLY VERIFY THAT THE EQUIVALENCE NAME IS A VALID PHYSICALH; DEVICE NAME. IF IT IS, R0 AND R2 ARE RESTORED WITH THE DEVICE MNEMONIC; AND BINARY UNIT NUMBER.N;D8 CALL DVVFY ;VALIDATE THE RESULTING LOGICAL AS A DEVICE>10$: MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING AND KEEP CARRY RETURN ;+9; $LGRCS - ROUTINE TO SCAN THE LOGICAL TABLES RECURSIVELYS;$ ; INPUTS:E<; R0 - POINTER TO DESCRIPTOR BLOCK OF FIRST LOGICAL IN CHAIN"; $TONYL - TABLE INHIBIT MASK WORD0; R3 - FILES-11 MODE PROCESSING FLAG (>0 -> YES);Q ; OUTPUTS::; CC - SEARCH MAY OR MAY NOT HAVE RESULTED IN AN LNB MATCH@; $LSTLG - SECONDARY POOL ADDRESS OF FINAL LNB (=0 IF NO MATCH)2; CS - RECURSION LIMIT WAS HIT (DEFINED BY M$XLOG);ED; ENTER A LOOP OF LOOKUPS FOR EACH NEWLY FOUND LOGICAL IN THE CHAIN.;T; NOT PRESERVED: KISAR6, R3I; A POINTER TO THE LATEST FOUND LNB IS KEPT FOR USE AFTER ALL LOOKUPS ARETG; COMPLETED. LOOKUPS TERMINATE AS SOON AS A LOGICAL ISN'T FOUND, OR IFTG; THE LATEST HAS THE TERMINAL ATTRIBUTE OR BEGINS WITH AN _. THIS LOOPTI; WILL BE EXECUTED A MAXIMUM OF M$XLOG TIMES BEFORE AN ERROR IS RETURNED. I; THIS IS TO PREVENT AN INFINITE LOOP IN ASSIGNMENTS AND ALSO TO PUT SOMET;; KIND OF RESTRICTION ON USAGE OF SYSTEM STATE LOOKUP TIME.O;AF; IN FILES-11 PROCESSING MODE, THIS ROUTINE WILL SEARCH FOR A COLON INF; THE LOGICAL AND ONLY USE THE BEFORE IT. THIS HAPPENS IN ALL PASSES.?; IF NO COLON IS FOUND, THE ENTIRE STRING IS USED IN EACH CASE.U;-$LGRCS::, MOV R3,-(SP) ;SAVE THE MODE PROCESSING FLAG, CLR $LSTLG ;CLEAR THE ULTIMATE LNB POINTER@ MOV #M$XLOG,-(SP) ;PUT THE MAXIMUM RECURSION LIMIT ON THE STACK/10$: DEC (SP) ;SEE IF ANOTHER ROUND IS ALLOWED 2 BGE 13$ ;IF LT, NO, RECURSION ERROR HAS OCCURRED- SEC ;INDICATE FAILURE FROM RECURSION LIMITS= MOV (SP)+,(SP)+ ;MAXIMUM RECURSION LIMIT, MAINTAIN CARRY SETA% BR 40$ ;RETURN WITH RECURSION ERRORP113$: TST 2(SP) ;IS THIS FILES-11 PROCESSING MODEI, BEQ 15$ ;IF EQ, NO, USE EXACT MATCH ALWAYS8 CALL LGTSET ;YES, DO COLON SEARCH AND RESET DESCRIPTOR=15$: CALL $TBSRC ;LOOK FOR LOGICAL IN ALL APPROPRIATE TABLESH# BCS 30$ ;IF CS, LOGICAL NOT FOUNDK3 MOV R3,$LSTLG ;SAVE THE CURRENT LINK FOR LATER USEB9 MOV R3,KISAR6 ;MAP THE LNB TO RESET THE DESCRIPTOR BLOCKN/ BIT #LS.TRM,MAP6+L.NSTS ;IS THIS LNB TERMINAL?(# BNE 30$ ;IF NE, YES, STOP LOOKUPSI8 CLR R2 ;INITIALIZE POINTER TO START OF EQUIVALENCE STR8 BISB MAP6+L.NLNS,R2 ;GET THE LENGTH OF THE LOGICAL NAME3 ADD #MAP6+L.NNAM,R2 ;POINT TO THE START OF THE ENSS0 CMPB #'_,(R2) ;IS THIS TERMINAL IN THE OLD WAY?# BEQ 30$ ;IF EQ, YES, STOP LOOKUPSO;20$: CLR (R0) ;INITIALIZE THE NEW LENGTH IN THE DESCRIPTOR,) BISB MAP6+L.NENS,(R0);GET THE NEW LENGTHB2 MOV R2,4(R0) ;MOVE THE NEW OFFSET INTO DESCRIPTOR/ MOV R3,2(R0) ;MOVE IN THE NEW APR BIAS AS WELLE2 BIT #1,$TONYL ;SEE IF THE TASK TABLE IS INHIBITED* BNE 10$ ;IF NE, IT IS, SKIP TCB RECOVERY? MOV $TKTCB,10(R0) ;RESTORE THE TCB POINTER FOR NEXT LOOKUP SETE" BR 10$ ;GO BACK FOR ANOTHER LOOP>30$: CLR (SP)+ 00rrqibjbkb a a a;CLEAR THE RECURSION LIMIT VALUE OFF THE STACK CLR (SP)+ ; AND CLEAR CARRY 40$: RETURN: .ENABL LSBI;+K; DVVFY - ROUTINE TO VERIFY THAT THE LOGICAL DESCRIBED BY $LSTLG IS A VALIDMD; FORM OF AN RSX PHYSICAL DEVICE. ONLY THE FORMAT OF THE LOGICAL IS9; VERIFIED - ACTUAL EXISTENCE OF THE DEVICE IS IRRELEVANTS;A ; INPUTS:B;; $LSTLG - CONTAINS SECONDARY POOL ADDRESS OF LNB TO VERIFY, ; OUTPUTS:B; CC - LOGICAL IN $LSTLG SUCCESSFUL PASSED FORM TEST OF RSX DEVICE7; CS - NO LOGICAL IN $LSTLG OR LOGICAL FAILED FORM TESTE;F.; R0,R1,R2,R3,R5 ARE DESTROYED BY THIS ROUTINE;RN; THIS CODE WILL IGNORE ANY LEADING TERMINAL CHARACTERS (_) IN THE EQUIVALENCE+; STRING BEFORE BEGINNING THE VERIFICATION.R;-DVVFY:( MOV $LSTLG,KISAR6 ;MAP THE ULTIMATE LNB5 BEQ 50$ ;IF EQ, ONE WAS NOT FOUND, INDICATE FAILUREV* CLR R5 ;INITIALIZE A STRING LENGTH VALUE. BISB MAP6+L.NENS,R5 ;GET THE LENGTH TO VERIFY9 MOVB MAP6+L.NLNS,R1 ;POINT R1 TO THE START OF THE STRING : ADD #MAP6+L.NNAM,R1 ;POINT TO START OF EQUIVALENCE STRING65$: CMPB #'_,(R1)+ ;CHECK FOR LEADING FINAL INDICATORS BNE 10$ ;IF NE, NO MORE THERE 1 DEC R5 ;DECREMENT THE REMAINING NUMBER TO CHECKN BEQ 50$ ;IF EQ, INVALID DEVICE% BR 5$ ;GO BACK FOR ANOTHER TO CHECK,*10$: DEC R1 ;BACK UP TO INCLUDE DELIMITERDEVCHK: $ CLR R0 ;INITIALIZE THE UNIT NUMBER/ MOVB (R1)+,R2 ;GET FIRST CHARACTER IN MNEMONICN+ DEC R5 ;SEE IF THIS IS THE LAST CHARACTERL% BEQ 50$ ;IF EQ, YES, INVALID DEVICES- CALL CHRCHK ;IS THIS CHARACTER ALPHANUMERIC # BCS 50$ ;IF CS, ERROR IN THE NAME+* SWAB R2 ;GET SECOND HALF OF THE TASKNAME CLRB R2 ;O BISB (R1)+,R2 ; CALL CHRCHK ;IS IT VALID BCS 50$ ;IF CS, IT WAS BAD7 SWAB R2 ;REVERSE THE LETTERS BACK TO CORRECT POSITIONH DEC R5 ;IS IS A ZERO VALUE6 BNE 30$ ;IF NE, THERE IS MORE ON THE STRING TO CHECK20$: CLC ;INDICATE SUCCESS BR 60$ ;EXIT; L; VALIDATE THAT THE REST OF THE STRING IS A VALID OCTAL NUMBER OR A TRAILING; COLON.;D:30$: MOVB (R1)+,R3 ;GET THE FIRST CHARACTER OF UNIT NUMBER0 CMPB R3,#'0 ;IS THIS A VALID NUMERIC CHARACTER BLO 40$ ;IF LO, NO2 CMPB R3,#'7 ;IS IT STILL VALID ON THE HIGH SIDE? BHI 40$ ;IF HI, NO1 SUB #60,R3 ;TURN THE NUMBER INTO A BINARY VALUES/ ASH #3,R0 ;MULTIPLY EVERYTHING UP TO NOW BY 8O" ADD R3,R0 ;ADD IN THE NEW NUMBER) DEC R5 ;ANY MORE CHARACTERS TO PROCESS?I BNE 30$ ;IF NE, YES;% CMP #377,R0 ;IS THIS A VALID NUMBERH BHI 20$ ;IF LO, DEFINITELY NOT BR 50$ ;INDICATE ERROR)40$: CMPB R3,#': ;SEE IF THIS IS A COLONE+ BEQ 20$ ;IF EQ, IT IS, VALID STRING FOUNDL50$: SEC 60$: RETURNB .DSABL LSBO;+E; CHRCHK - ROUTINE TO VALIDATE THE ALPHA STATE OF THE DEVICE MNEMONICS;# ; INPUTS:N; R2 - CHARACTER TO BE VERIFIED;-4CHRCHK: 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, YESL CLC ;INDICATE SUCCESS BR 20$ ;EXIT10$: SEC ;INDICATE FAILURE20$: RETURN ; ;+G; PSCNV - ROUTINE TO TRANSLATE THE LOGICAL NAME SPECIFIED IN ONE OF THECC; P/OS COMPATIBLE DIRECTIVES INTO A FORM RECOGNIZED BY RSX EXTENDEDE; LOGICAL SUPPORT.; ; INPUTS:O/; R0 - SIZE OF THE LOGICAL NAME TO BE PROCESSEDF,; R1 - 32 WD APR BIAS TO GET TO LOGICAL NAME6; R2 - KISAR6 VIRTUAL ADDRESS OF START OF LOGICAL NAME;I ; OUTPUTS:H; CS -> CONVERSION RESULTED IN INVALID LOGICAL NAME: R0 IS ZERO OR -17; CC -> CONVERSION RESULTED IN NONZERO LOGICAL NAME:E/; R0 - SIZE OF THE LOGICAL NAME TO BE PROCESSEDN,; R1 - 32 WD APR BIAS TO GET TO LOGICAL NAME@; R2 - KISAR6 VIRTUAL ADDRESS OF START OF PROCESSED LOGICAL NAME;XH; THIS ROUTINE RECOGNIZES THAT IT WAS CALLED BY A TLOG$, RLOG$, CLOG$ ORE; DLOG$ DIRECTIVE AND PROCESSES THE LOGICAL NAME IN TWO WAYS. IF THE G; LOGICAL ENDS IN ONE OR TWO COLONS, THEY ARE STRIPPED OFF OF THE NAME. F; FOLLOWING THAT, THE STRING IS CHECKED TO SEE IF IT IS OF THE FORM OFE; AN RSX PHYSICAL DEVICE NAME (IE. DDNNN). IF SO, THE STRING IS ZEROTK; COMPRESSED. IF IT ISN'T, THE OR00rrrf__DATADATADATADATAIGINAL STRING IS USED, MINUS THE STRIPPEDE ; COLONS.S;-PSCNV:: CMPB #R$XBAS,$DICSV+2;IS THIS ONE OF THE XLOG$ DIRECTIVES' BLOS 10$ ;IF LOS, NO, SKIP PROCESSINGG, TST R0 ;SEE IF THIS IS A FULL TABLE DELETE7 BNE 20$ ;IF NE, IT ISN'T, CONTINUE ON WITH PROCESSINGN*10$: CLC ;INDICATE SUCCESSFUL COMPLETION RETURN ;EM; AT THIS POINT WE KNOW THIS IS A XLOG$ DIRECTIVE AND THAT THERE IS A NONZERONK; LENGTH OF STRING TO PROCESS. IF, AFTER STRIPPING 1-2 COLONS, THERE ISN'TSK; ANY STRING LEFT, WE SET THE CARRY TO INDICATE AN INVALID INPUT STRING. R0SM; WILL BE INVALID AT THAT POINT AS WELL. ANY OTHER CONDITIONS WILL LEAVE THE E; CARRY CLEAR TO INDICATE A SUCCESSFUL OPERATION AND VALID REGISTERS.L;E"20$: SAVNR ;SAVE REGISTERS R4,R5/ MOV KISAR6,-(SP) ;SAVE THE DATA REGISTER VALUES' MOV R3,-(SP) ;SAVE THE OTHER REGISTERST MOV R2,-(SP) ;  MOV R1,-(SP) ;I) ADD R2,R0 ;POINT TO END OF LOGICAL NAMEG$ MOV R1,KISAR6 ;MAP THE LOGICAL NAME) CMPB #':,-(R0) ;IS THIS A DEVICE OR NODEI BNE 30$ ;IF NE, NO CMPB #':,-(R0) ;IS THIS A NODES BEQ 40$ ;IF EQ, YESN&30$: INC R0 ;POINT BACK TO TERMINATOR%40$: SUB R2,R0 ;GET LENGTH OF STRINGA+ MOV R0,-(SP) ;GET THE NEW LENGTH OF STRINGD BLE 60$ ;IF LE, INVALID STRING MOV R0,R5 ;GET SIZE IN R5R+ MOV R2,R1 ;GET POINTER TO START OF STRINGR6 CALL DEVCHK ;SEE IF STRING MATCHES RSX PHYSICAL FORM/ BCS 50$ ;IF CS, NO, USE STRING WITHOUT COLONSC( TST R5 ;ANY LEFTOVER JUNK AFTER DEVICE& BNE 50$ ;IF NE,YES, SKIP COMPRESSION- MOV #$LTBUF,R3 ;POINT TO NEW PHYSICAL STRING & MOV R2,(R3)+ ;MOVE IN DEVICE MNEMONIC+ CALL $DCBTA ;TURN OCTAL NUMBER INTO ASCII:% MOV R3,R0 ;INITIALIZE SIZE REGISTERV0 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 VALUEL& ADD #6,SP ;CLEAR STACK OF OLD VALUES& CLC ;INDICATE SUCCESSFUL COMPLETION BR 70$ ;050$: TST (PC)+ ;CLEAR CARRY TO INDICATE SUCCESS60$: SEC ;INDICATE FAILURE& MOV (SP)+,R0 ;RESTORE SIZE OF LOGICAL/ MOV (SP)+,R1 ;RESTORE 32WD APR BIAS TO LOGICAL 1 MOV (SP)+,R2 ;RESTORE VIRTUAL ADDRESS OF LOGICALI70$: MOV (SP)+,R3 ;RESTORE R3E+ MOV (SP)+,KISAR6 ;RESTORE ORIGINAL MAPPINGO RETURN ;+C;LGTSET - ROUTINE TO SCAN A LOGICAL NAME DEFINED BY A DESCRIPTOR TOK>; DETERMINE IF IT HAS A COLON IN IT. IF SO, THE LENGTH OF THE9; LOGICAL IS REDUCED TO INCLUDE THE STRING UP TO, BUT NOT ; INCLUDING, THE COLON.R;R ; INPUTS:A$; R0 - POINTER TO LOGICAL DESCRIPTOR ; OUTPUTS:.; R0 - UPDATED LENGTH OF LOGICAL IN DESCRIPTOR;-LGTSET:P SAVNR ;SAVE R4,R53 MOV 2(R0),KISAR6 ;MAP THE LOGICAL NAME WITH KISAR6:; MOV 4(R0),R4 ;GET THE VIRTUAL ADDRESS OF THE LOGICAL STARTA4 MOV (R0),R5 ;GET THE CURRENT LENGTH OF THE LOGICAL210$: CMPB #':,(R4)+ ;IS THE NEXT CHARACTER A COLON BEQ 20$ ;IF EQ, YESN1 DEC R5 ;DECREMENT THE COUNT OF CHARS TO PROCESSD! BNE 10$ ;IF NE, MORE TO PROCESSO420$: SUB R5,(R0) ;RESET LENGTH OF LOGICAL TO LOOKUP RETURN ;+I; $MPHSH - ROUTINE TO MAP THE APPROPRIATE HASH TABLE THROUGH KISAR6 FOR AG ; SPECIFIED LOGICAL TABLE NUMBER;R ; INPUTS:M4; 6(R0) - CONTAINS A BYTE VALUE FOR THE TABLE NUMBER ; OUTPUT:A:; CC -> SUCCESSFUL MAPPING OF HASH TABLE ADDRESS IN KISAR6:; CS -> NO HASH TABLE WAS AVAILABLE FOR GIVEN TABLE NUMBER;-$MPHSH::& MOV R3,-(SP) ;SAVE R3 ACROSS THE CALL$ MOVB 6(R0),R3 ;GET THE TABLE NUMBER2 CALL $TBTRL ;TRANSLATE TABNUM AND MAP HASH TABLE0 MOV (SP)+,R3 ;RESTORE R3 AND MAINTAIN CARRY BIT RETURN ;+K; $TBTRL - ROUTINE TO TRANSLATE THE LOGICAL TABLE NUMBER INTO AN HASH TABLEE3; OFFSET AND THEN MAP THE HASH TABLE THROUGH KISAR6T;S ; INPUTS:U; R3 - TABLE NUMBERR ; OUTPUTS:; CC - SUCCESS:F3; KISAR6 - CONTAINS MAPPING TO START OF HASH TABLEO$; CS - NO HASH TABLE VALUE AVAILABLE; "; R3, KISAR6 ARE DESTROYED BY CALL;VD; THIS ROUTINE TAKES THE SPECIFIED LOGICAL TABLE NUMBER AND TURNS ITF; INTO A WORD OFFSET INTO THE HIERARCHY TABLE IN SYSCM. THE HIERARCHYG; TABLE CONTAINS THE SECONDARY POOL POINTERS TO EACH OF THE HA00rrqibjbkb a a aSH TABLESOF; IN AN ORDERED, PRECEDENCE-DERIVED SEQUENCE. SINCE THE TABLE NUMBERSE; NO LONGER HAVE ANY PRETENSE OF PRECEDENCE ORDERING, IT IS NECESSARYE; TO HASH THE VALUES INTO THE CORRECT WORD OFFSET. FROM THIS OFFSET,B; THE APR BIAS OF THE HASH TABLE IS PLACED INTO KISAR6 SO THAT ANYB; 140000-140100 KERNEL DATA REFERENCES WILL ACCESS THE HASH TABLE.;-$TBTRL::4 CMP #T$BLNM,R3 ;SEE IF THIS IS A VALID TABLE NUMBER" BLO 10$ ;IF LO, NO, RETURN ERROR8 MOVB $TRANL(R3),R3 ;HASH TABLE NUMBER TO CORRECT OFFSET+ ASL R3 ;TURN INTO WORD OFFSET AND KEEP CC 9 MOV $LOGTB(R3),KISAR6 ;MAP THE HASH TABLE THROUGH KISAR6P BNE 20$ ;IF NE, THERE WAS ONER10$: SEC ;FAILURE INDICATORH 20$: RETURND .PAGE;+I; $LDELX - ROUTINE TO DELETE EVERY LOGICAL IN A GIVEN TABLE REGARDLESS OFH8; THE BLOCK MODIFIER SPECIFIED. THIS ROUTINE IS USED BY9; DREIF TO ELIMINATE A TASK AND BY BYE TO LOGOFF A USER.S; ; INPUTS:L3; R0 - POINTER TO TCB OR UCB TO DELETE LOGICALS FORT2; R1 - TABLE CODE INDICATING WHICH TABLE TO DELETE;R;-$LDELX::? MOV R0,$TEMP0+10 ;PUT THE TCB/UCB ADDRESS INTO A PARTIAL DESC.T9 MOV #$TEMP0,R0 ;SET UP THE DESCRIPTOR ADDRESS FOR $LNDAL 5 MOV R1,6(R0) ;PUT THE TABLE NUMBER IN THE DESCRIPTORE3 ; THIS STATEMENT ALSO FORCES A ZERO IN 7(R0). 0 ; THIS CAUSES $LNDAL TO SKIP BOTH THE MODE- ; AND THE PRIVILEGE CHECKS. THIS IS TO * ; PREVENT LOSS OF BLOCKS IN RUNDOWN.;+I; $LNDAL - ROUTINE TO DELETE ALL LOGICALS IN A GIVEN TABLE THAT MATCH THEN+; BLOCK TYPE MODIFIER SPECIFIED IN THE DPBE;: ; INPUTS:,C; R0 - POINTER TO A LOGICAL NAME DESCRIPTOR BLOCK WITH NO SPECIFIED0; LOGICAL NAMEE ; OUTPUTS:; CC - ALWAYS INDICATE SUCCESS;TH; 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 R50 CLR -(SP) ;SET UP INITIAL VALUE FOR HASH TABLE! CALL $MPHSH ;MAP THE HASH TABLE% BCS 50$ ;IF CS, NO HASH TABLE ENTRYL- MOV KISAR6,(SP) ;SAVE THE HASH TABLE MAPPINGP4 CLR R1 ;INITIALIZE TO THE FIRST HASH CELL IN TABLE510$: CLR R4 ;INITIALIZE PREVIOUS LNB ADDRESS IN LISTP$ MOV (SP),KISAR6 ;MAP THE HASH TABLE2 MOV MAP6(R1),R3 ;GET FIRST ENTRY IN THE CELL LIST1 BEQ 40$ ;IF EQ, THERE ARE NONE, GO TO NEXT CELLO$20$: MOV R3,KISAR6 ;MAP THE NEXT LNB6 CALL $LNTST ;CHECK TO SEE IF ENTRY MATCHES CRITERION BCC 30$ ;IF CC, IT DOES <23$: MOV R3,R4 ;IT DOESN'T, SET POINTERS AND GET NEXT ENTRY/25$: MOV MAP6+L.NLNK,R3 ;GET NEXT ENTRY ADDRESSA4 BEQ 40$ ;IF EQ, THERE ARE NO MORE, GO TO NEXT CELL& BR 20$ ;GO BACK AND CHECK THIS ENTRY230$: TSTB 7(R0) ;SEE IF THIS IS A GENERIC COMPARE8 BEQ 35$ ;IF EQ, IT IS, IGNORE BLOCK NUMBER COMPARISONS4 CMPB MAP6+L.NBLK,7(R0);SEE IF THE BLOCK TYPES MATCH" BNE 23$ ;IF NE, NO, DON'T DELETE1 CALL PRVTST ;CHECK FOR TASK PRIVILEGE TO DELETE - BCS 23$ ;IF CS, TASK DOESN'T, SKIP THIS ONET035$: MOV R4,-(SP) ;SAVE THE PREVIOUS LNB POINTER4 MOV R0,-(SP) ;SAVE THE STORAGE AREA ACROSS THE CALL" CALL $LNELM ;ELMINATE THIS ENTRY/ MOV (SP)+,R0 ;RESTORE THE STORAGE AREA ADDRESSC+ MOV (SP)+,R4 ;RESTORE THE PREVIOUS POINTER ; MOV R4,KISAR6 ;MAP THE PREVIOUS TO GET THE FORWARD POINTER + BNE 25$ ;GO BACK AND CHECK THE NEXT ENTRY(- BR 10$ ;START AT THE HASH CELL IF NECESSARY /40$: ADD #2,R1 ;BUMP THE HASH CELL OFFSET WORDS+ CMP R1,#<*2>;SEE IF END OF CELLSK BLOS 10$ ;IF LOS, NO, DO MOREV750$: CLR (SP)+ ;POP THE HASH TABLE LOCATION AND SET CCS RETURNT .PAGE;+H; $TBSRC - ROUTINE TO DO HIERARCHICAL LOOKUPS IN THE APPROPRIATE LOGICALA; NAME TABLES. THIS ROUTINE MUST BE PASSED A LOGICAL DESCRIPTOREA; BLOCK AND AN INHIBIT MASK WORD IN $TONYL. SEARCH WILL BEGIN ATB>; THE TASK TABLE LEVEL, AND PROCEED SEQUENTIALLY TO THE SYSTEMB; LEVEL. IT IS UP TO THE CALLER TO MAKE SURE THAT THE INITIAL TCBF; OR UCB IS SET UP CORRECTLY IF ONE OF THE TABLES ARE TO BE INHIBITED.; ; INPUTS:V;0:; R0 - POINTER TO CURRENT DESCRIPTOR BLOCK WHICH CONTAINS:%; WD 1 - BYTE COUNT OF LOGICAL NAMET.; WD 2 - 32 WD BLOCK ADDRE00rrrf__DATADATADATADATASS OF LOGICAL NAME5; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAMEG,; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)(; BLOCK TYPE NUMBER (HIGH BYTE)9; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLEMH; $TONYL - CONTAINS THE INHIBIT MASK WORD WHERE A SET BIT INDICATES THAT1; THAT THE TABLE IS TO BE SKIPPED IN THE LOOKUP.O; ; OUTPUTS:;; CC = 01; R3 - APR BIAS ADDRESS OF START OF MATCHING LNBI;C; CC = 1; R3,R4 INDETERMINATE;-$TBSRC::; J; THE LOGICAL NAME IS NOW HASHED TO GET THE CELL OFFSET THAT WILL BE VALIDK; ACROSS ALL TABLE LOOKUPS. THEN A LOOP IS ENTERED TO CHECK EACH TABLE FOR I; LOOKUP VALIDITY. IF IT IS VALID, THE TCB (IF A TASK TABLE LOOKUP) OR AOJ; UCB ADDRESS IS PLACED IN THE DESCRIPTOR BLOCK, AND THE APPROPRIATE TABLE#; IS SEARCHED FOR THE LOGICAL NAME.T;E7 CALL $LNHSH ;HASH THE LOGICAL NAME TO GET CELL OFFSET ) CLR R2 ;INITIALIZE THE TABLE OFFSET BIT ;II; INITIALLY CHECK FOR A TASK LOGICAL TABLE LOOKUP. IT IS ASSUMED AT THISAJ; POINT THAT THE DESCRIPTOR CONTAINS THE CORRECT TCB. IF THE LOOKUP FAILSI; FOR THE TASK TABLE, THE TCB IS USED TO GET THE APPROPRIATE UCB ADDRESS.DJ; 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 FOUNDI2 BVS 30$ ;IF VS, TABLE INHIBITED, DON'T TOUCH TCB7 MOV 10(R0),R5 ;GET THE TCB ADDRESS FROM THE DESCRIPTORE2 MOV T.UCB(R5),10(R0);AND PUT THE UCB ADDRESS BACK- BR 30$ ;GO ON FOR THE OTHER TYPES OF LOOKUPT;EI; THE FOLLOWING LOOKUPS ARE ONLY FOR THE USER, GROUP, AND SYSTEM LOOKUPS.TO; FOR THE USER AND GROUP LOOKUPS, IT IS ASSUMED THAT THE CORRECT UCB IS ALREADYS; IN THE DESCRIPTOR BLOCKR;R?20$: CALL 50$ ;VERIFY ONE OF THE USER, GROUP, OR SYSTEM TABLESE' BCC 40$ ;IF CC, THE LOGICAL WAS FOUNDI 30$: INC R2 ;BUMP TO NEXT TABLE# CMP #T$BLNM,R2 ;ALL TABLES CHECKEDE BHIS 20$ ;IF HIS, NO, CONTINUE,35$: SEC ;INDICATE FAILURE TO FIND A MATCH 40$: RETURNB;0J; ROUTINE TO DETERMINE IF THIS TABLE IS VALID AND IF THE LOGICAL IS WITHIN ; THE TABLEE;GE50$: BITB $MSKBT(R2),$TONYL ;SEE IF SEARCH OF THIS TABLE IS INHIBITEDU% SEV ;INITIALIZE TO TABLE INHIBITED 1 BNE 35$ ;IF EQ, IT IS, CONTINUE WITH NEXT TABLEY; CLRB 6(R0) ;SET TABLE NUMBER TO BE SEARCHED IN DESCRIPTOR  BISB $LTMSK(R2),6(R0);0 .PAGE;+D; $LNTBS - ROUTINE TO FIND A LOGICAL NAME STRING IN A SPECIFIC TABLE;O ; INPUTS:/; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCK:; BLOCK CONTAINS:%; WD 1 - BYTE COUNT OF LOGICAL NAME .; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME5; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAMEE,; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)(; BLOCK TYPE NUMBER (HIGH BYTE)9; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLEA/; R1 - WORD OFFSET TO BE USED TO FIND HASH CELL;. ; OUTPUTS:,; CC = 0 -> SUCCESSFUL MATCH OF LOGICAL NAME*; R3 = MATCHING LNB (32 WD BLOCK ADDRESS)2; R4 = PREVIOUS LNB IN LIST (32 WD BLOCK ADDRESS); CC = 1 -> UNSUCCESSFUL MATCH9; R3 = LOGICAL FITS BELOW THIS LNB (32 WD BLOCK ADDRESS)I9; R4 = LOGICAL FITS ABOVE THIS LNB (32 WD BLOCK ADDRESS)N;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 6W! CALL $MPHSH ;MAP THE HASH TABLEC) BCS 30$ ;IF CS, NO HASH TABLE AVAILABLEL% CLR R4 ;INITIALIZE PREVIOUS POINTERG: ADD #MAP6,R1 ;ADD A KISAR6 OFFSET TO THE HASH TABLE ENTRY( SEC ;ASSUME THAT THERE ARE NO ENTRIES2 MOV (R1),R3 ;GET THE APR BIAS OF THE FIRST ENTRY BEQ 30$ ;IF NO ENTRY EXITI&10$: MOV R3,KISAR6 ;MAP THE NEXT ENTRY? CMPB (R0),MAP6+L.NLNS;ARE THE LENGTHS OF THE ENTRIES THE SAME?+ BLO 30$ ;IF LO, NO - LOGICAL BELONGS HEREV( 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- BEQ 30$ ;IF EQ, NO MORE, ENTRY BELONGS HERET* BR 10$ ;GO BACK AND CHECK THE NEXT ENTRY920$: CALL $LNTST ;CHECK THE T00rrqibjbkb a a aABLE PARAMETERS FOR A MATCHE0 BCS 15$ ;IF CS, THEY DIDN'T MATCH, GET ANOTHER7 CALL $CMPST ;CONDITIONS MATCH, SEE IF LOGICAL IS SAMEA8 BCS 30$ ;IF CS, THEY DON'T - ENTRY BELONGS HERE THOUGH# TST R1 ;IF R1 = 0 THIS IS A MATCH$$ BNE 15$ ;IF NE, TRY THE NEXT ENTRY. TSTB 7(R0) ;SEE IF THIS IS A GENERIC COMPARE4 BEQ 30$ ;IF EQ, IT IS, DON'T COMPARE BLOCK NUMBERSD 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 SUCCESS'-30$: MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPING + MOV (SP)+,R1 ;RESTORE THE HASH CELL OFFSET  RETURND .PAGE;+H; $LNHSH - ROUTINE TO TURN A LOGICAL NAME STRING INTO A WORD OFFSET INTO(; A TO-BE-DETERMINED LOGICAL HASH TABLE; ; INPUTS:C/; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCKB; BLOCK CONTAINS:%; WD 1 - BYTE COUNT OF LOGICAL NAMEI.; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME5; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAMEO ; OUTPUTS:; R0 - SAME AS INPUT@; R1 - WORD OFFSET FROM START OF HASH TABLE TO CORRECT HASH CELL;PI; ALL CHARACTERS IN THE ASCII RANGE WITHIN THE LOGICAL ARE UPCASED BEFORER ; PROCESSING.A;GH; *************************** TAKE NOTE ********************************;T+; THIS ROUTINE MUST NOT BE CHANGED WITHOUTA/; THE CORRESPONDING CHANGE TO THE SAME ROUTINE 1; IN [70,10]ASNOV.MAC FOR VMR. ANY CHANGES MADED0; HERE AND NOT THERE WILL CAUSE AN INABILITY TO+; FIND AND DELETE LOGICALS CREATED BY VMR.T;H; **********************************************************************;+$LNHSH::% CLR R1 ;INITIALIZE THE OFFSET VALUEI. MOV KISAR6,-(SP) ;SAVE CURRENT KISAR6 MAPPING, MOV R0,-(SP) ;SAVE DESCRIPTOR BLOCK ADDRESS# MOV R2,-(SP) ;SAVE THE INCOMING R2# MOV R3,-(SP) ;SAVE THE INCOMING R3E5 MOV (R0)+,R2 ;GET THE NUMBER OF BYTES IN THE LOGICALT BEQ 20$ ;NONE TO BE PROCESSEDV- MOV (R0)+,KISAR6 ;MAP THE BLOCK TO BE HASHEDI4 MOV (R0)+,R3 ;GET THE OFFSET TO THE FIRST CHARACTER710$: CALL $CVBUC ;GET THE NEXT CHARACTER IN UPPER CASE*8 ADD R5,R1 ;SUM THE UPCASED CHARACTER VALUES OF LOGICAL+ SOB R2,10$ ;ALL THE VALUES OF THE LOGICALR MOV R1,R0 ;SQUARE THE VALUEP CALL $MUL ;(; ASH #-5.,R1 ;SHIFT VALUE TO GET WORD OFFSET RANGE OF 0-31N5 BIC #177701,R1 ;BY TAKING THE MIDDLE 6 BITS OF VALUE(20$: MOV (SP)+,R3 ;RESTORE R3S MOV (SP)+,R2 ;RESTORE R2 3 MOV (SP)+,R0 ;RESTORE THE DESCRIPTOR BLOCK ADDRESSO) MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPINGF RETURNE .PAGE;+N; $LNTST - ROUTINE TO MATCH THE TABLE PARAMETERS OF A DESCRIPTOR BLOCK AGAINST; AN LNB IN THE LISTE;F ; INPUTS:S/; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCKR; BLOCK CONTAINS:%; WD 1 - BYTE COUNT OF LOGICAL NAMEI.; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME5; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAME:,; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)(; BLOCK TYPE NUMBER (HIGH BYTE)9; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLEP6; R3 - APR BIAS TO THE START OF AN LNB IN A TABLE LIST; F; KISAR6 MUST MAP THE LNB CURRENTLY IN R3 WHEN THIS ROUTINE IS INVOKED; ; OUTPUTS:7; CC = 0 -> TABLE TYPES AND UCB/TCB/GROUP NUMBERS MATCHB/; CC = 1 -> ENTRIES DO NOT MATCH IN SOME REGARDN;I;-$LNTST::" MOV R1,-(SP) ;SAVE THE CURRENT R1) MOV 6(R0),R1 ;GET THE TABLE NUMBER IN R1C? CMPB #LT.TSK,R1 ;IS THE DESCRIPTOR ENTRY IN THE THE TASK TABLE % BNE 20$ ;IF NE, NO, CONTINUE CHECKS5710$: CMP MAP6+L.NTCB,10(R0);DO THE TCB/UCB VALUES MATCH-( BEQ 40$ ;IF EQ, YES, EXIT SUCCESSFULLY( BR 30$ ;IF NE, NO, EXIT UNSUCCESSFULLY320$: CMPB #LT.SES,R1 ;IS THIS A SESSION TABLE CHECKT BEQ 10$ ;IF EQ, YESY- CMPB #LT.GRP,R1 ;IS THIS A GROUP TABLE CHECK-0 BNE 40$ ;IF NE, NO, IT IS A SYSTEM TABLE CHECK; CALL GTUIC ;GET THE PROTECTION UIC GROUP CODE FROM $TKTCBG@ CMPB MAP6+L.NGRP,R1 ;CHECK THE GROUP AGAINST THE PROTECTION UIC# BEQ 40$ ;IF EQ, THEY ARE THE SAME 30$: SEC40$: MOV (SP)+,R1 ;RESTORE R1P RETURN1 .PAGE;+C; $DCBTA - ROUTINE TO TURN A BIN00rrrf__DATADATADATADATAARY VALUE INTO AN ASCII TEXT STRING ;F ; INPUTS:I); R0 - NUMBER TO BE TRANSLATED INTO ASCIIT3; R3 - POINTER TO BUFFER TO STORE TRANSLATED NUMBERC; ; OUTPUTS:$; R3 - POINTS PAST THE NUMBER STRING;IH; THIS ROUTINE WILL NOT TRANSLATE A ZERO UNIT NUMBER INTO AN ASCII DIGIT;O;-3$DCBTA::BIC #177400,R0 ;PREVENT SIGN PROPAG. IN ASH ! ;(0,R1 ;ADD SIZE OF HEADER,DPB,BUFFEREDN ;STORAGE AREAV ; AND RETURNED SIZE BUFFER3 MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ 0 ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ASH #-6,R1 ;9 MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START0 MOV R3,R5 ;SAVE DPB POINTERG% CALL $CPALO ;GET BUFFER FROM CPRBUF;;Z+; FILL IN REQUEST PACKET AND SEND TO CPRAMER;P MOV R0,KISAR6 ;MAP PACKET$ MOV #MAP6,R1 ;GET ADDRESS OF HEADER+ MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST, CLRB H$ICNT(R1) ;NO ITEMS! ADD #P$DPB,R1 ;POINT TO DPB AREA$ MOV -2(R5),(R1)+ ;COPY DIC AND SIZE3 MOV (R5),(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER# CLR (R1)+ ;RESERVED WORDB MOV #,(R1)+ ;ADDRESS OF DEFAULT DIRECTORY ;BUFFER 2 MOV 6(R5),(R1)+ ;SIZE OF DEFAULT DIRECTORY BUFFER, CLR (R1)+ ;ASSUME NO RETURN SIZE REQUESTED$ TST 10(R5) ;SIZE BUFFER SPECIFIED? BEQ 110$ ;IF EQ NO? MOV #,-(R1) ;ADDRESS OF USER SIZE BUFFER) TST (R1)+ ;POINT TO NEXT WORDT8110$: MOV 4(R5),(R1)+ ;STORE ADDRESS OF DIRECTORY BUFFER: MOV 10(R5),(R1) ;STORE ADDRESS OF USER SIZE BUFFER (OR 0)- CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAMEO;; GET RESPONSE PACKET AND+!; TRANSFER BUFFERS INTO USER AREAO;" MOV R0,-(SP) ;SAVE PACKET ADDRESS MOV R0,KISAR6 ;MAP PACKET/ CMP #IS.SUC,MAP6+H$STAT ;WAS SUCCESS RETURNED? BEQ 125$ ;IF EQ YESE5 CMP #IE.RBS,MAP6+H$STAT ;WAS IS JUST A SIZE PROBLEM?Z BNE 200$ ;IF NE FATAL ERROR 7125$: MOV MAP6+H$SIZE+GD$SIZ,R0 ;ADDRESS OF USER BUFFER / MOV MAP6+H$SIZE+10,R1 ;SIZE OF BUFFER FROM DPBM CALL $ACHKB ;DO ADDRESS CHECKU BCS 240$ ;IF CS ERROR, CALL $RELOC ;GET BIAS AND OFFSET OF BUFFER' MOV R1,R3 ;SET UP DEST BIAS FOR BLXIOF% MOV R2,R4 ;SET UP DEST DISPLACEMENT,* MOV (SP),R1 ;SET UP SOURCE BIAS FOR APR5B MOV #,R2 ;SET UP SOURCE DISPLACEMENT) MOV MAP6+H$SIZE+10,R0 ;GET SIZE FROM DPB;& TST MAP6+H$SIZE+12 ;WAS SIZE RETURNED BEQ 130$ ;IF EQ NO MOV R0,-(SP) ;SAVE BUFFER SIZEA4 MOV MAP6+H$SIZE+GD$SIZ+GD$BUF,R5 ;GET RETURNED SIZE# SUB R5,(SP)+ ;WILL THE STRING FIT?  BMI 130$ ;IF MI NO MOV R5,R0 ;USE RETURNED SIZE2130$: CALL $BLXIO ;RETURN EQUIVALENCE NAME STRING' TST MAP6+H$SIZE+12 ;WAS SIZE RETURNED?U BEQ 200$ ;IF EQ NO/ MOV #200$,-(SP) ;SPECIFY $SGFIN RETURN ADDRESS# CALL $SGFIN ;INHIBIT TRAPS7 MOV MAP6+H$SIZE+GD$SIZ+GD$BUF,-(SP) ;GET RETURNED SIZEE8 MOV MAP6+H$SIZE+GD$SIZ+2,R3 ;GET ADDRESS OF USER BUFFER MTPD (R3) ;RETURN IT TO USER RETURN ;RETURN FROM $SGFINP(200$: MOV (SP)+,R0 ;GET BUFFER BIAS BACK! CALLR $CPDEA ;DEALLOCATE BUFFERF(240$: MOV (SP)+,R0 ;GET BUFFER BIAS BACK CALL $CPDEA ;DEALLOCATE BUFFER# DRSTS D.RS98 ;ADDRESS CHECK ERRORT  .ENDC ; C$$RDR ,10$: ADD #4,R3 ;POINT TO WD 3 OF THE DPB - CALL ACROB ;CALCULATE BIAS AND DISPLACEMENT MOV R3,$TEMP0 ;SAVE DPB POINTER& MOV R0,-(SP) ;SAVE SIZE OF DDS BUFFER) MOV R1,R3 ;SET UP BUFFER BIAS FOR BLXIOM MOV R2,R4 ;SET UP DISPLACEMENT) MOV R5,R1 ;SET UP BIAS OF CONT00rrrf__DATADATADATADATAEXT BLOCK, MOV R5,KISAR6 ;MAP CTX BLOCKR CLR R5 ;) BISB C.DDSL+MAP6,R5 ;GET THE DDS LENGTHU( 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 COPY 2 MOV #C.DDS+MAP5,R2 ;SET UP DISPLACEMENT OF STRING020$: CALL $BLXIO ;RETURN EQUIVALENCE NAME STING% MOV $TEMP0,R3 ;GET SAVED DPB POINTERP. TST (R3) ;WAS AN ADDRESS SPECIFIED TO RETURN/ ;THE LENGTH (BYTE COUNT) OF THE EQUIVALENCEA ;NAME STRING INTO? BEQ 30$ ;IF EQ NOL. MOV #30$,-(SP) ;SPECIFY $SGFIN RETURN ADDRESS CALL $SGFIN ;INHIBIT TRAPS$ CLR -(SP) ;CLEAR LOCATION ON STACK' BISB C.DDSL+MAP6,(SP) ;GET SIZE OF ENSU MTPD @(R3) ;RETURN IT TO USERD RETURN0930$: MOV (SP)+,R0 ;GET SIZE DIFERENCE BETWEEN USER BUFFERA ;AND STRING+ BPL 40$ ;IF PL ENTIRE STRING WAS RETURNEDI; DRSTS D.RS15 ;RETURN DIRECTIVE STATUS--'BUFFER TOO SMALL'N 40$: RETURNI .PAGE ;+;N7; $LNFSD -- SET UP DEFAULT DIRECTORY STRING SUBFUNCTIONT;?; THIS SUBFUNCTION SETS UP A SPECIFIC DEFAULT DIRECTORY STRING.EA; IF SD.LOG IS SPECIFIED, THE DDS IN THE CONTEXT BLOCK POINTED TOAA; BY THE USER TI: UCB WILL BE MODIFIED. IF THE MODIFIER IS ZERO,IC; THE DDS IN THE CONTEXT BLOCK POINTED TO BY THE ISSUING TASK'S TCBSD; WILL BE MODIFIED. IF SD.BYE IS SPECIFIED, THE USERS CONTEXT BLOCK; WILL BE DELETED.;E ; INPUTS:I; R3 = ADDRESS OF DPB+2A1; R5 = THE ADDRESS OF THE TCB OF THE CURRENT TASKL;D; AFTER CALL TO ACROB:%; R0 = SIZE OF USER BUFFER (IN BYTES)B; R1 = BIAS OF USER BUFFER'; R2 = APR6 DISPLACEMENT TO USER BUFFERS;E;I ; OUTPUTS:6; THE DEFAULT DIRECTORY STRING IS CREATED OR SUPERSEDS5; THE EXISTING STRING. IF A NULL STRING IS SPECIFIED, 5; (I.E. NO BUFFER ADDRESS SPECIFIED IN THE DIRECTIVE)C<; THEN THE DEFAULT DIRECTORY STRING FOR THE ISSUING TERMINAL ; IS DELETED.I;B;E;-$LNFSD::! CLR $TEMP0 ;ASSUME NO CTX BLOCK 6 CMPB #SD.MOD,1(R3) ;IS THIS A TASK MODIFY REQUEST?  BEQ 1000$ ;IF EQ YES7 CMPB #SD.MUD,1(R3) ;IS THIS A TERMINAL MUDIFY REQUEST?  BNE 4$ ;IF NE NO,CONTINUE T' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING % MOV T.UCB(R5),R1 ;GET TI UCB ADDRESSS5 MOV U.CTX(R1),-(SP) ;SAVE UCB'S DDS ADDRESS (IF ANY)E BR 1010$ ;ENTER COMMON CODER1000$:+ MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING D3 MOV T.CTX(R5),-(SP) ;GET TASK DDS ADDRESS (IF ANY)D1010$:# MOV #2,R0 ;PRETEND 2 CHAR DDS U+ MOV #"[],R1 ;PRETEND IT'S NONAMED MODE S# MOV (SP)+,KISAR6 ;GET DDS ADDRESS$+ BEQ 2$ ;IF EQ NO CONTEXT, NONAMED MODE T+ MOVB MAP6+C.DDSL,R0 ;GET LENGTH OF DDS C MOV MAP6+C.DDS,R1 ;GET DDS )2$: MOV (SP)+,KISAR6 ;RESTORE MAPPING T CMP #2,R0 ;LENGTH 2? R" BNE 3$ ;IF NE NO, KEEP GOING  CMP #"[],R1 ;STRING="[]" C" BNE 3$ ;IF NE NO, KEEP GOING , .IF DF C$$RDR ;REMOTE DIRECTORY SUPPORT 1 BIT #F5.RDR,$FMSK5 ;USING REMOTE DIRECTORIES? U& BEQ 25$ ;NO. JUST EXIT AT THIS TIME MOV 6(R3),R1 ;GET DDS LENGTH & BEQ 185$ ;IF EQ ILLEGAL SIZE FOR DDS. CMP #11.,R1 ;MAX LENGTH OF DDS BUFFER IS 11. BGE 199$ ;OK, CONTINUE BR 185$ ;BUFFER TOO LONG25$: .ENDC ;C$$RDR " DRSTS D.RS00 ;RETURN IS.CLR 3$:  ASSUME SD.MOD,7 ASSUME SD.MUD,8.1= BICB #SD.MOD,1(R3) ;CLEAR THE SD.MOD BITS IN THE SUBFUNCTION 0 ;CODE. THIS SHOULD LEAVE 0 IF SD.MOD, SD.MUD ;(NOT ZERO) IF SD.MUD.4 BEQ 4$ ;IF EQ WAS SD.MOD, 0 IS CORRECT REPLACEMENT/ MOVB #SD.LOG,1(R3) ;COMMUTE SD.MUD INTO SD.LOGT 4$: ;# CMPB #SD.TI,1(R3) ;SD.TI MODIFIER?,( BEQ 150$ ;YES. GO CLEAR BUFFER LENGTH% CMPB #SD.BYE,1(R3) ;SD.BYE MODIFIER?  BNE 160$ ;NO' MOV T.UCB(R5),R0 ;GET TI:UCB ADDRESSU& BIT #DV.PSE,U.CW1(R0) ;PSEUDO DEVICE? BNE 165$ ;YES. NOT ALLOWED150$:S! CLR R1 ;NO DDS LENGTH IN SD.BYEI BR 198$ ;CONTINUE 160$:. MOV 6(R3),R1 ;GET DDS LENGTH & BEQ 185$ ;IF EQ ILLEGAL SIZE FOR DDS% CMPB #SD.LOG,1(R3) ;SD.LOG MODIFIER?P BNE 170$ ;NO' MOV T.UCB(R5),R0 ;GET TI:UCB ADDRESST& BIT #DV.PSE,U.CW1(R0) ;PSEUDO DEVICE? BEQ 180$ ;NO. CON00rrqibjbkb a a aTINUEE165$:C' DRSTS D.RS21 ;RETURN - NAME NOT FOUNDS170$:O TSTB 1(R3) ;TEST MODIFIERV1 BEQ 180$ ;IT IS ZERO. OTHERWISE ERROR BECAUSE U) ; HAS NOT BEEN SD.TI, SD.BYE, SD.LOG. DRSTS D.RS99 ;INVALID MODIFIER180$:L. CMP #11.,R1 ;MAX LENGTH OF DDS BUFFER IS 11. BGE 190$ ;OK, CONTINUE*185$: DRSTS D.RS89 ;INVALID BUFFER LENGTH190$:  MOV R1,-(SP) ;SAVE DDS LENGTH! MOV R3,-(SP) ;SAVE DPB+2 POINTER ' ADD #4,R3 ;POINT TO WORD 3 OF THE DPB1- CALL ACROB ;CALCULATE BIAS AND DISPLACEMENTU3 SUB #MAP6-MAP5,R2 ;MAKE BIAS APR5 RATHER THAN APR6! CALL $CRCTX ;CREATE A CTX BLOCKV BCC 195$ ;SUCCESSE) DRSTS D.RS1 ;FAILED TO CREATE. NO POOLN195$: & MOV R3,$TEMP0 ;SAVE CTX BLOCK POINTER$ MOV (SP)+,R3 ;RESTORE DPB+2 POINTER! MOV (SP)+,R1 ;RESTORE DDS LENGTH198$:0) .IF DF C$$RDR ; REMOTE DIRECTORY SUPPORTL; BIT #F5.RDR,$FMSK5 ;ARE WE USING REMOTE DIRECTORY STORAGE?V BNE 199$ ;IF NE YES JMP 1$ ;JUST DO LOCAL SDIR 199$: ; L"; GET A REQUEST PACKET FROM CPRBUF;M9 CMP R1,#LN$SIZ ;IS SIZE TOO BIG? NOTE CPRSX WILL ALLOW E- ; 255 BUT RSX WILL ONLY ALLOW 11 FOR NOWD BHI 185$ ;IF HI YES.A ADD #,R1 ;ADD SIZE OF HEADER,DPB,EXTRA STORAGE P5 MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ S0 ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ASH #-6,R1 ; MOV R3,R5 ;SAVE DPB POINTERE9 MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START1% CALL $CPALO ;GET BUFFER FROM CPRBUF $ MOV R5,R3 ;RESTORE DPB POINTER ;T; FILL IN REQUEST PACKET;$# MOV R4,-(SP) ;SAVE SIZE OF REQUESTL MOV R0,-(SP) ;SAVE PACKET BIAS  MOV R0,KISAR6 ;MAP PACKET$ MOV #MAP6,R1 ;GET ADDRESS OF HEADER+ MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUESTE CLRB H$ICNT(R1) ;NO ITEMS! ADD #P$DPB,R1 ;POINT TO DPB AREAD$ MOV -2(R5),(R1)+ ;COPY DIC AND SIZE4 MOV (R5)+,(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER MOV (R5)+,(R1)+ ;RESERVED WORDH> MOV #,(R1)+ ;ADDRESS OF DEFAULT DIR BUFFER ) MOV (R5)+,R0 ;USER ADDRESS OF BUFFER T3 MOV (R5),(R1)+ ;SIZE OF DEFAULT DIRECTORY BUFFER I) MOV R0,(R1)+ ;ADDRESS OF USER BUFFER B MOV R3,(R1) ;DPB POINTER # MOV $TEMP0,2(R1) ;SAVE CTX POINTER! CMPB #SD.BYE,1(R3) ;SD.BYE?  BEQ 220$ ;IF EQ YES CMPB #SD.TI,1(R3) ;SD.TI?  BEQ 220$ ;IF EQ YES 1 MOV (R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK C! CALL $ACHKB ;CHECK ADDRESS ( BCS 300$ ;IS CS ERRORV/ CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT A SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT) MOV (SP),R3 ;GET DEST BIAS8 MOV #,R4 ;GET DEST DISPLACEMENT / MOV MAP6+P$DPB+10,R0 ;GET SIZE OF TRANSFER S2 CALL $BLXIO ;TRANSFER DIRECTORY SPEC INTO BUFFER, CMP #2,MAP6+P$DPB+10 ;COULD THIS BE []?  BNE 220$ ;IF NE NO - CMP #"[],MAP6+H$SIZE+SD$SIZ+6 ;IS IT []?  BNE 220$ ;IF NE NO . ADD #2,2(SP) ;INCLUDE EXTRA WORD IN PACKET # MOV $TKTCB,R5 ;GET TCB ADDRESS S& MOV T.UCB(R5),R5 ;GET UCB ADDRESS 4 MOV U.LUIC(R5),MAP6+H$SIZE+SD$SIZ+10 ;STORE UIC 220$: # MOV (SP)+,R0 ;GET PACKET BIAS BACK$% MOV (SP)+,R4 ;GET PACKET LENGTH BACKV- CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAMEL MOV R0,KISAR6 ;MAP PACKET I5 MOV MAP6+P$DPB+SD$SIZ+4,$TEMP0 ;GET CTX POINTER BACK ( TST MAP6+H$STAT ;IS STATUS SUCCESS?  BMI 400$ ;IF MI, ERROR & MOV #MAP6+P$DPB,R1 ;POINT TO DPB . MOV SD$SIZ+2(R1),R3 ;GET DPB POINTER BACK > MOV SD$SIZ(R1),6(R1) ;PUT ADDRESS OF USER BUFFER BACK IN DPB ! MOV R3,R5 ;COPY DPB POINTER D+ SUB #2,R5 ;BACK UP TO BEGINNING OF DPB . MOV #SD$SIZ/2,R2 ;GET SIZE OF DPB IN WORDS 250$: $ MOV (R1)+,(R5)+ ;COPY DPB BACK " SOB R2,250$ ;LOOP UNTIL DONE # MOV R3,-(SP) ;SAVE DPB POINTER X$ CALL $CPDEA ;DEALLOCATE PACKET & MOV (SP)+,R3 ;RESTORE DPB POINTER ( MOV $TKTCB,R5 ;GET TASK TCB ADDRESS . CMPB 1(R3),#SD.MOD ;IS THIS SD.MOD OR SD.MUD?; VERY IMPORTANT NOTE.(; D; THE FOLLOWING BRANCH DEPENDS ON THE FACT THAT SD.MUD > SD.MOD, ANDC00rrrf__DATADATADATADATA; THAT SD.ANYTHING_ELSE ISN'T. IF ANOTHER SD. IS ADDED, THIS BRANCHR; LOGIC MUST BE CHANGED. BLT 1$ ;IF NE NO V. RETURN ;MAKE SURE WE STAY IN NONAMED MODE +300$: MOV $TEMP0,R1 ;POINT TO ALLOCATED CTX  BEQ 310$ ;NONE WAS ALLOCATED CALL $DLCTX ;DELETE IT#310$: MOV (SP)+,R0 ;GET PACKET BIASV TST (SP)+ ;CLEAN OFF STACK CALL $CPDEA ;DEALLOCATE BUFFER DRSTS D.RS98 ;ADDRESS ERROR 400$: / MOV $TEMP0,R1 ;POSSIBLY POINT TO ALLOCATED CTXA BEQ 410$ ;NONE WAS ALLOCATED+ CALL $DLCTX ;IT WAS ALLOCATED. DELETE ITD410$:B/ CALLR $CPDEA ;DEALLOCATE PACKET AND RETURN N1$:  .ENDC ; C$$RDRM# TSTB 1(R3) ;CHECK MODIFIER IN DPB  BEQ 30$ ;USE CTX FROM TCB ( CMPB #SD.TI,1(R3) ;WAS SD.TI SPECIFIED? BNE 10$ ;IF NE, NO6 MOV T.CTX(R5),-(SP) ;GET TASK'S CONTEXT BLOCK POINTER MOV T.UCB(R5),R1 ;GET TI: UCB8 CMP U.CTX(R1),(SP)+ ;IS TERMINAL CONTEXT SAME AS TASK? BNE 5$ ;IF NE, MORE WORK TO DO RETURN ;RETURN WITH SUCCESS5$:T' MOV T.CTX(R5),R1 ;GET TERMINAL CONTEXT + CALL $DLCTX ;DELETE TASKS CURRENT CONTEXTB$ 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 MAPPINGR( MOV U.CTX(R1),KISAR6 ;MAP CONTEXT BLOCK- INCB C.REF+140000 ;INCREMENT REFERENCE COUNTB" MOV (SP)+,KISAR6 ;RESTORE MAPPING" BR 65$ ;INDICATE NAME SUPERCEDED*10$: MOV T.UCB(R5),R5 ;GET TI: UCB ADDRESS;,3; IF SD.BYE, DELETE CONTEXT BLOCK AND RETURN STATUST;M& CMPB #SD.BYE,1(R3) ;SD.BYE SPECIFIED?( BNE 30$ ;IF NE, NO. MUST BE AN SD.LOG0 MOV U.CTX(R5),R1 ;GET USER CONTEXT BLOCK (BIAS)# CALL $DLCTX ;DEALLOCATE CTX BLOCK * CLR U.CTX(R5) ;ZERO CONTEXT BLOCK POINTER % .IF DF C$$RDR ;REMOTE DIRECTORY R = BIT #F5.RDR,$FMSK5 ;ARE WE USING REMOTE DIRECTORY STORAGE? ( BEQ 15$ *14$: RETURN ;DSW ALREADY SET BY KXDRV 15$:  .ENDC ;C$$RDR 2 DRSTS D.RSP3 ;RETURN STATUS OF 'NAME SUPERSEDED'30$:% MOV R3,R2 ;MOVE DPB+2 POINTER TO R2. MOV $TEMP0,R3 ;PREVIOUSLY ALLOCATED CTX BLOCK* CMPB #SD.LOG,1(R2) ;WAS SD.LOG SPECIFIED? BNE 40$ ;IF NE, NO5 MOV U.CTX(R5),R1 ;GET CONTEXT BLOCK POINTER FROM UCBT BEQ 60$ ;IF EQ, NO CURRENT CTX! CALL $DLCTX ;DELETE OLD CONTEXTB# BR 60$ ;UPDATE CTX POINTER IN UCBE940$: MOV T.CTX(R5),R1 ;GET CONTEXT BLOCK POINTER FROM TCBW BEQ 50$ ;IF EQ, NO CURRENT CTX! CALL $DLCTX ;DELETE OLD CONTEXT 150$: MOV R3,T.CTX(R5) ;PUT NEW CTX POINTER IN TCBR % .IF DF C$$RDR ;REMOTE DIRECTORY = BIT #F5.RDR,$FMSK5 ;ARE WE USING REMOTE DIRECTORY STORAGE? S BEQ 55$ & RETURN ;DSW ALREADY SET BY KXDRV 55$:  .ENDC ;C$$RDR , DRSTS D.RSP3 ;STATUS OF 'NAMED SUPERCEDED'160$: MOV R3,U.CTX(R5) ;PUT NEW CTX POINTER IN UCBM MOV KISAR6,-(SP) ;SAVE MAPPINGK! MOV R3,KISAR6 ;MAP CONTEXT BLOCKQ1 MOV #C.DDS+140001,R0 ;POINT TO FIRST CHAR OF DDS  MOV R5,-(SP) ;SAVE UCB ADDRESSC5 CALL CNTB ;CONVERT DDS TO BINARY EQUIV, IF POSSIBLE " MOV (SP)+,R5 ;RESTORE UCB ADDRESS" MOV (SP)+,KISAR6 ;RESTORE MAPPING! BCC 62$ ;IF CC, CONVERSION DONE ; MOV U.LUIC(R5),U.UIC(R5) ;SET DEFAULT UIC = PROTECTION UICN BR 65$ ;<62$: MOV R1,U.UIC(R5) ;SET DEFAULT UIC = BINARY EQUIV OF DDS65$: % .IF DF C$$RDR ;REMOTE DIRECTORY M = BIT #F5.RDR,$FMSK5 ;ARE WE USING REMOTE DIRECTORY STORAGE? V BEQ 68$ & RETURN ;DSW ALREADY SET BY KXDRV 68$:  .ENDC ;C$$RDR . DRSTS D.RSP3 ;STATUS OF 'NAME SUPERCEDED' ;6; CNTB - CONVERT A NAMED DIRECTORY TO A BINARY WORD IF#; IN THE FORM OF [G,M] OR [GGGMMM](; ; INPUTS: R0 = BUFFER POINTER;#; OUTPUTS: IF CC, R1 = BINARY WORDT3; IF CS, INDICATES NAMED DIRECTORY NOT CONVERTED.;DCNTB: % CLR -(SP) ; USE STACK FOR FLAG WORDT( MOV #3,R4 ; NUMBER OF CHARS TO CONVERT" CLR R1 ; CLEAR ACCUMULATED VALUE MOVB #',,R2 ; STOP ON A COMMAR CALL 100$ ; CONVERT. BCS 20$ ; BR IF INVALID  MOV R1,R3 ; STORE RE00rrsribjbkb a a aSULT BEQ 20$ ; IF EQ, INVALID( MOV #3,R4 ; NUMBER OF CHARS TO CONVERT" CLR R1 ; CLEAR ACCUMULATED VALUE% CMPB #',,(R0) ; POINTING TO A COMMA?U BNE 10$ ; IF NE, NOR TSTB (R0)+ ; SKIP THE COMMAI INC (SP) ; INDICATE COMMA SEEN%10$: MOVB #'],R2 ; STOP ON A BRACKETN CALL 100$ ; CONVERT  BCS 20$ ; BR IF INVALID#' SWAB R3 ; PUT GROUP CODE IN HIGH BYTER BIS R3,R1 ; PUT INTO RESULTM BEQ 20$ ; IF EQ, INVALID! CMPB #'],(R0)+ ; ENDING BRACKET?$ BNE 20$ ; IF NE, ERROR TST (SP) ; DID WE SEE A COMMA? BNE 15$ ; IF NE, YES# TST R4 ; VERIFY WE PARSED 3 CHARSR BNE 20$ ; IF NE, - ERROR/15$: TST (SP)+ ; CLEAN STACK, INDICATE SUCCESS1# BR 30$ ; RETURN TO CALLER WITH CC 20$: TST (SP)+ ; CLEAN STACKT) SEC ; INDICATE DIRECTORY NOT CONVERTED $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 RESULTP SOB R4,100$ ; GO AGAIN-110$: CMP #377,R1 ; NUMBER GREATER THAN 377?  RETURN ; RETURN TO ABOVEC115$: TSTB -(R0) ; BACK UPR$ 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$$DIRS .END ; SUBTRACT CHARACTER BIAS BMI 120$ ; IF MI, ILLEGAL CHAR" CMPB R5,#8. ; CH .TITLE LRDRVE .IDENT /06/1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reservedU;A;RA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDE9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.); ; VERSION 05;,; DAVID R. CROWE;Y; PREVIOUSLY MODIFIED BY: ; ; DAVID H. CHAN ; HELEN GORDON; PATRICIA C. LEET; ; MODIFIED BY:;B; R. E. CALDWELL 21-AUG-79;N'; RC011 -- USE CORRECT FORM OF GTPKT$.;; ; $; MODIFIED FOR RSX-11M-PLUS V4.2 BY:; ; A. V. HUDED 06-SEP-88 06;i8; AVH0004 --- MODIFIED TO SAVE THE LENGTH OF RECEPTION+; IN SECOND WORD OF I/O STATUS BLOCKD;DF; PARALLEL COMMUNICATIONS LINK (PCL) RECEIVER DRIVER FOR RSX-11M-PLUS.;S; MACRO LIBRARY CALLS.;E .MCALL PKTDF$,TCBDF$,UCBDF$$ PKTDF$ ;DEFINE I/O PACKET OFFSETS- TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS.E UCBDF$ ;DEFINE UCB OFFSETS.;+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.R;P; INDEX MEANING; 0 NO TASK CONNECTED.%; 2 TASK CONNECTED BUT NOT TRIGGERED.K); 4 TASK TRIGGERED & AWAITING ATF OR RTF.S3; 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. ; FUNCTION 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 ;R00srrf__DATADATADATADATAEJECT (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$; R0 = 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$; 00srribjbkb a a aINSERT 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(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 #00srrf__DATADATADATADATAREJ!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 RECEIVER 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 ADDRE00srribjbkb a a aSS; 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* MOV (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 CALL $IODON ;FINISH I/OB JMP LRINI ;TRY FOR MORE WORK*M2ERR: MOV RSR(R0),R1 ;GET CONTENTS OF RSR$ BIT #BCOFL,R1 ;CHECK FOR BYTE COUNT BNE 10$ ;IF NE OVERFLOWP2 BIT #PAR!TXMERR,R1 ;PARITY OR TRANSMISSION ERROR? BNE M2PAR ;IF NE YES$ BIT #TIMOUT,R1 ;CHECK FOR TIME OUT. BNE M2TIME ;IF NE YESN) BIT #MEMOFL!NEXLOC,R1 ;NEM OR OVERFLOW?. BNE M2OFL ;IF NE YES* CALLR IEBBE ;INDICATE TRANSMISSION ERROR;E; BYTE COUNT OVERFLOWR;;/10$: BIC #BCOFL,RSR(R0) ;CLEAR ERROR CONDITION.S# BIS #REJ!IE,(R0) ;TRUNCATE MESSAGEJ RETURN ;Y;R; PARITY OR 00srtsf__DATADATADATADATATRANSMISSION 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 FUN .TITLE XXTTI  .IDENT /01.04/:;V1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reserved7; ;L<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;S;E; 03-MAR-87 KAREN NOEL;C; MODIFIED FOR CPRSX V2.0 BY:;P#; Eric Postpischil 20 Oct 1989 1.04#4; edp076 Move SF.GMC and SF.SMC processing to XXFIN.;M$; Paul K. M. Weiss 28 Jul 1989 01.03C; pkw182 Don't permanently block task on attach with illegal paramsX; $; Paul K. M. Weiss 21 Jun 1989 01.02,; pkw181 Buffer requests smaller than $CPMXB;s$; Eric Postpischil 25 May 1989 01.013; edp072 Remove restriction on attaching terminals.E;N;I;+;D; ****** X X T T I ******I;SA; THIS MODULE CONTAINS THE ROUTINES TO VALIDATE A NEW I/O REQUESTYH; 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 CURREN00tsribjbkb a a aT TASK. NEXT, THE REQUEST IS 1; PLACED IN THE REQUEST QUEUE FOR THE TERMINAL. s;l;-;  .MCALL PKTDF$,UCBDF$,TCBDF$ PKTDF$9 UCBDF$ ,,1d TCBDF$v;e; LOCAL SYMBOL DEFINITIONS;s MAP5 = 120000 MAP6 = 140000X.PAGE*, .SBTTL XXTTI - FUNCTION CODE DISPATCH TABLE;O?; DISPATCH TABLE FOR PROCESSING DIFFERENT FUNCTION CODES BEFORE %; ENTERING A PACKET IN THE I/O QUEUE. ;TQPDSP: .WORD 0 ;IO.KILE .WORD QPWLB ;IO.WLBE .WORD QPRLB ;IO.RLBC .WORD QPATT ;IO.ATT  .WORD QPDET ;IO.DET ! .WORD QPSPC ;SPECIAL FUNCTIONS: ; IO.GTS ; SF.SMC ; SF.GMC .WORD QPHNG ;IO.HNG$/ .WORD 0 ;RESERVED EXEC CLOSE-OUT-LUN FUNCTION- .WORD 0 ;RESERVED FOR USER MODE DIAGNOSTICS0 .WORD QPRPR ;IO.RPRP .WORD QPRTT ;IO.RTT  .IF DF B$$MAP .WORD QPWSD ;IO.WSDT .WORD QPRSD ;IO.RSD  .ENDC ;B$$MAP .WORD 0 ;IO.EIOG.PAGE ; .SBTTL XXTTI - TERMINAL I/O REQUEST INITIATION ENTRY POINTW; ;+-; **-XXTTI - VALIDATE I/O PACKET ENTRY POINT..; K; THIS ROUTINE IS CALLED FROM "XXDRV" WHEN A TASK HAS ISSUED AN I/O REQUEST K; FOR A TERMINAL. THE CALL IS MADE PRIOR TO QUEUEING THE I/O PACKET TO THEOK; SCB QUEUE SINCE TERMINALS HAVE THE "UC.QUE" BIT SET IN THEIR UCB'S. THISQJ; IS DONE WHILE THE TASK CONTEXT IS STILL VALID, SINCE MANY FUNCTIONS WILL?; NEED ADDITIONAL PARAMETER CHECKS NOT DONE BY THE EXECUTIVE. .;G ; 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 CLR -(SP) ;POSSIBLE CPR PACKET FOR ERROR RECOVERYL3 CALLR @QPDSP(R0) ;DISPATCH TO PROCESS THIS REQUESTA.PAGEH9 .SBTTL . BUFFER ADDRESS CHECKING AND RELOCATION ROUTINES ; ;+;; **-CKBFR - ADDRESS CHECK AND LOCK BUFFER FOR READ ACCESSMK; **-CKBFRW - ADDRESS CHECK AND LOCK BUFFER FOR READ ACCESS, WORD ALIGNMENTRP; **-CKBFW - ADDRESS CHECK AND LOCK BUFFER FOR READ/WRITE ACCESS,WORD ALIGNMENTA; **-CKBFB - ADDRESS CHECK AND LOCK BUFFER FOR READ/WRITE ACCESSA;RI; THESE ROUTINES PERFORM THE DESCRIBED ADDRESS CHECKING ON A USER BUFFER.R;V ; INPUTS:%; R0 => USER BUFFER (VIRTUAL ADDRESS) ; R1 = LENGTH OF USER BUFFERU;R ; OUTPUTS:K*; CC-C = 0 IF ADDRESS CHECK WAS SUCCESSFUL"; CC-C = 1 IF ADDRESS CHECK FAILED-; R1 = BIAS OF RELOCATED USER BUFFER ADDRESS @; R2 = DISPLACEMENT OF RELOCATED USER BUFFER ADDRESS IF SUCCESS4; R2 = 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;; REGISTERS MODIFIED: R0;-;S .ENABL LSBECKBFRW:S. BIT #1,R0 ;DOES BUFFER START ON ODD ADDRESS?4 BNE 910$ ;IF NE, YES...RETURN INVALID BUFFER ERRORCKBFR:: 5 MOV #$CKBFR,-(SP) ;SET UP CALL FOR READ-ACCESS CHECKI BR 10$ ;SKIP TO COMMON CODEFCKBFW::SC MOV #$CKBFW,-(SP) ;SET UP CALL FOR WRITE-ACCESS CHECK-WORD ALIGNED  BR 10$ CKBFB::I6 MOV #$CKBFB,-(SP) ;SET UP CALL FOR WRITE-ACCESS CHECK10$: TST R1 ;IS BUFFER SIZE VALID? 3 BEQ 900$ ;IF EQ, NO...RETURN INVALID BUFFER ERROR6 CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?5 BHI 920$ ;IF HI, YES...RETURN BAD BUFFER SIZE ERROR; MOV (SP),-(SP) ;DUPLICATE MAPPING ROUTINE ADDRESS ON STACK. MOV @#KISAR6,2(SP) ;SAVE CURRENT EXEC MAPPING- MOV $SAHDB,@#KISAR6 ;MAP CURRENT TASK HEADERS3 CALL @(SP)+ ;CALL REQUESTED ADDRESS CHECK ROUTINEE- MOV (SP)+,@#KISAR6 ;RESTORE PREVIOUS MAPPINGB+ BCS 910$ ;IF CS, IT FAILED...RETURN ERROR09 CALL $RELOC ;RELOCATE ADDRESS AND CONVERT TO DOUBLEWORD. RETURN ;ALL DONE 900$:( TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS910$:YA MOV #IE.SPC&377,R2 ;SET COMPLETION ERROR CODE FOR INVALID BUFFERV BR 990$ ;SKIPI920$:P( TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS; MOV #IE.BAD&377,R2 ;SET COMPLETION ERROR CODE FOR BAD00t ssf__DATADATADATADATA SIZEA990$:N SEC ;RETURN WITH ERROR FLAG RETURN ;ALL DONE ;C;+8; **-CPBFW - WRITE CHECK, WORD ALIGNED, BUFFER IN CPRBUF8; **-CPBFRW - READ CHECK, WORD ALIGNED, BUFFER IN CPRBUF); **-CPBFR - READ CHECK, BUFFER IN CPRBUFWG; **-CPBUF - NO ADDRESS CHECKING, READING FROM BUFFER, BUFFER IN CPRBUFE;M; THESE ROUTINES PERFORM THE APPROPRIATE ADDRESS CHECK ON THE BUFFER AND COPY ; THE BUFFER INTO CPRBUF;P ; INPUTS:F;O; R0 USER ADDRESS OF BUFFERD; R1 LENGTH OF BUFFER ; R2 CPR PACKET BIAS; R3 I/O PACKET ADDRESSN;; R4 OFFSET INTO CPRBUF TO START BUFFERING (AS APR6 OFFSET)W; R5 UCB ADDRESS;N ; OUTPUTS:;P*; CC-C = 0 IF ADDRESS CHECK WAS SUCCESSFUL"; CC-C = 1 IF ADDRESS CHECK FAILED; R1 CPR PACKET BIAS9; R2 OFFSET INTO CPRBUF OF BEGINNING OF BUFFER IF SUCCESS,4; R2 = 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. BYTES1; P$LUN+32 IN CPR PACKET - USER ADDRESS OF BUFFERO ; R3, R5, APR6 MAPPING PRESERVED;-0CPBFW: MOV #$CKBFW,-(SP) ;ADDRESS CHECK ROUTINE BR 110$ ;CONTINUE IN COMMON CCPBFRW:D/ BIT #1,R0 ;DOES BUFFER START ON ODD ADDRESS?F0 BNE 910$ ;IF NE, YES...RETURN INVALID BUFFER CPBFR: MOV #$ACHRO,-(SP) ;E BR 110$ ;CONTINUE IN COMMON-CPBUF: MOV #130$,-(SP) ;NO ADDRESS CHECKING E110$:F TST R1 ;IS BUFFER SIZE VALID?4 BEQ 900$ ;IF EQ, NO...RETURN INVALID BUFFER ERROR7 CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?R1 BHI 920$ ;IF HI, YES...RETURN BAD BUFFER SIZE -/ SUB #6,SP ;GET SPACE ON STACK TO SAVE THINGSI1 MOV 6(SP),(SP) ;COPY ADDRESS OF ROUTINE TO CALLT0 MOV @#KISAR6,2(SP) ;SAVE CURRENT EXEC MAPPING, MOV R2,4(SP) ;CPR PACKET BIAS,$ MOV R1,6(SP) ;AND SIZE OF TRANSFER. MOV $SAHDB,@#KISAR6 ;MAP CURRENT TASK HEADER4 CALL @(SP)+ ;CALL REQUESTED ADDRESS CHECK ROUTINE. MOV (SP)+,@#KISAR6 ;RESTORE PREVIOUS MAPPING' MOV (SP)+,R2 ;RESTORE CPR PACKET BIAS0( MOV (SP)+,R1 ;RESTORE SIZE OF TRANSFER, BCS 910$ ;IF CS, IT FAILED...RETURN ERROR# MOV R3,-(SP) ;SAVE THE I/O PACKETS" MOV R4,-(SP) ;SAVE BUFFER OFFSET MOV R1,-(SP) ;SAVE THE LENGTHL MOV R2,R3 ;MOVE CPR BIASE! CALL $RELOC ;RELOCATE ADDRESS P MOV (SP),R0 ;RESTORE LENGTH& MOV @#KISAR6,(SP) ;SAVE APR6 MAPPING% MOV R3,@#KISAR6 ;MAP THE CPR PACKETL, MOV R1,MAP6+P$LUN+32 ;STORE BIAS IN PACKET ! MOV R2,MAP6+P$LUN+34 ;AND OFFSETR* MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING2 SUB #20000,R2 ;MAKE USER OFFSET INTO APR5 OFFSET CALL $BLXIO ;COPY THE BUFFER.) MOV R3,R1 ;MOVE PACKET BIAS FOR OUTPUTO3 MOV (SP)+,R2 ;STARTING OFFSET OF BUFFER IN PACKET," MOV (SP)+,R3 ;RESTORE I/O PACKET4 BIC #170000,R2 ;OFFSET SHOULD NOT INCLUDE APR BIAS 130$: CLC, RETURN ;ALL DONE .DSABL LSBS .PAGE" .SBTTL . WRITE REQUEST PROCESSING% .SBTTL . QPWSB - WRITE SPECIAL DATA3;S;+(; **-QPWSD - WRITE SPECIAL DATA (IO.WSD);-;E .IF DF B$$MAPQPWSD::T9 BIC #^C,I.FCN(R3) ;CLEAR DISALLOWED BITSR( BIS #TF.WAL,I.FCN(R3) ;SET REQUIRED BIT< CMP #T.RSDN,I.PRM+10(R3) ;IS THE DATA TYPE SPECIFIER LEGAL?4 BLO EQPBAD ;NO,RETURN REQUEST WITH BAD PARAMENTERS;T; FALL THROUGH TO QPWLB0;R .ENDC ;B$$MAP& .SBTTL . QPWLB - WRITE LOGICAL BLOCK; ;+*; **-QPWLB - NORMAL WRITE REQUEST (IO.WLB);-;UQPWLB::S6 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? ' BNE 10$ ;IF NE, YES...DO BREAKTHROUGHI, CMP T.UCB(R0),R5 ;IS THE IO.WBT TO OWN TI:?% BNE EQPPRI ;IF NOT, DON'T ALLOW IT W 10$:  6 MOVB #251.,I.PRI(R3) ;CHANGE REQUEST TO PRIORITY 251.= BIS #TF.CCO,I.FCN(R3) ;BREAKTHROUGH IMPLIES CANCEL CONTROL-OP6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST.PAGEE! .SBTTL . READ REQUEST PROCESSINGH$ .SB00tsribjbkb a a aTTL . QPRSD - READ SPECIAL DATA;T;+/; **-QPRSD - READ SPECIAL DATA REQUEST (IO.RSD),;-;0 .IF DF B$$MAPQPRSD::C8 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- .SBTTL . QPRTT - READ WITH TERMINATOR TABLE;;+/; **-QPRPR - READ AFTER PROMPT REQUEST (IO.RPR)O8; **-QPRTT - READ WITH TERMINATOR TABLE REQUEST (IO.RTT);-;3 .ENABL LSBIQPRPR::, MOV I.PRM+12(R3),R1 ;GET PROMPT BUFFER SIZE BR 5$ ;CONTINUE IN COMMON QPRTT::E4 MOV #32.,R1 ;LENGTH OF TABLE IS FIXED AT 32. BYTES. BIT #1,I.PRM+10(R3) ;CHECK FOR WORD ALIGNMENT, BNE EQPSPC ;CAN'T HAVE BYTE ALIGNED BUFFER5$:D& MOV #CKBFR,-(SP) ;READ CHECK AND LOCK- CMP R1,$CPMXB ;CAN IT BE BUFFERED IN CPRBUF?  BHI 10$ ;NOPE, CONTINUEO6 CMP I.PRM+4(R3),$CPMXB ;CAN PRIMARY BE BUFFERED ALSO? BHI 10$ ;NOPE, CAN'T DO IT# MOV #CPBFR,(SP) ;BUFFERING ROUTINE) MOV R1,-(SP) ;SAVE LENGTH MOV R3,-(SP) ;AND I/O PACKET % ADD I.PRM+4(R3),R1 ;GET TOTAL LENGTHN1 ADD #177,R1 ;ROUND TO NEXT BLOCK, ADD ONE BLOCKI% ASH #-6,R1 ;MAKE INTO 32-WORD BLOCKR CLR R0 ;NO FLAGS) CALL $CPALO ;ALLOCATE A BLOCK OF CPRBUFG! MOV (SP)+,R3 ;RESTORE I/O PACKET " MOV (SP)+,R1 ;RESTORE REAL LENGTH" BCC 9$ ;GOT CPR PACKET, CONTINUE ;SO MUCH FOR BUFFERING0 MOV #CKBFR,(SP) ;GO BACK TO READ CHECK AND LOCK BR 10$19$: MOV R0,R2 ;SET CPR BIAS; MOV R0,2(SP) ;STORE CPR PACKET FOR POSSIBLE ERROR RECOVERYV) MOV #MAP6+100,R4 ;OFFSET TO START BUFFER)- ADD I.PRM+4(R3),R4 ;PUT AFTER PRIMARY BUFFER /10$: MOV I.PRM+10(R3),R0 ;GET ADDRESS OF BUFFER . MOV R1,I.PRM+14(R3) ;SET LENGTH IN I/O PACKET; CALL @(SP)+ ;CHECK READ ACCESS AND RELOCATE TABLE ADDRESSC8 BCS IOFIN ;IF CS, CHECK FAILED...RETURN WITH THE ERROR< 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 WORD;" MOV #21,R4 ;INDICATE TWO BUFFERS6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST .DSABL LSBA% .SBTTL . QPRLB - READ LOGICAL BLOCKR;I;+); **-QPRLB - NORMAL READ REQUEST (IO.RLB)D;-;FQPRLB:: MOV #1,R4 ;INDICATE ONE BUFFER6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST.PAGE  .SBTTL . ERROR HANDLING; ,; EQPPRI - RETURN PRIVILEGE VIOLATION ERROR.;REQPPRI:;; MOV #IE.PRI&377,R2 ;SET ERROR CODE FOR PRIVILEGE VIOLATION; BR IOFIN ;FINISH I/O REQUEST;W+; EQPBAD - RETURN ERROR FOR BAD PARAMETERS. ;FEQPBAD::: MOV #IE.BAD&377,R2 ;SET ERROR FOR BAD PARAMETER SPECIFIED BR IOFIN ;FINISH REQUEST;C@; EQPSPC - RETURN ERROR BECAUSE OF INVALID BUFFER SPECIFICATION.;:EQPSPC:#? MOV #IE.SPC&377,R2 ;SET ERROR FOR ILLEGAL BUFFER SPECIFICATIONQIOFIN::Q" MOV (SP)+,R0 ;POSSIBLE CPR PACKET BEQ 10$ ;NOPEI MOV R3,-(SP)L MOV R2,-(SP) ;SAVE ERROR STATUS MOV I.TCB(R3),R3 ; GET TCB.7 BIC #TS.RSW,T.STAT(R3) ; CANCEL RESOURCE WAIT, IF ANY.R CALL $CPDEA ;DEALLOCATE PACKET# MOV (SP)+,R2 ;RESTORE ERROR STATUS MOV (SP)+,R37,10$: MOV R2,R0 ;MOVE ERROR STATUS FOR IOFIN# CLR R1 ;CLEAR SECOND WORD OF IOSBC SEC ;INDICATE FAILURE RETURN ;RETURN TO XXDRV.PAGEQ, .SBTTL . CKBFLN - FINAL BUFFER LENGTH CHECK;L=; CKBFLN - CHECK THAT BUFFER LENGTH IS WITHIN (1,8K-64) BYTES !; BUFFER IN CPRBUF IF POSSIBLE(;LCKBFLN:,3 MOV I.PRM+4(R3),R1 ;GET LENGTH OF TRANSFER REQUEST4 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 ERRORV% CMP R1,$CPMXB ;BUFFER IN CPR PACKET?A( BHI QUEUE ;NOPE, JUST QUEUE THE PACKET% TST (SP) ;CPR PACKET ALREADY EXIST?P BNE 20$ ;YES, USE IT& CMP #1,R4 ;IS THERE JUST ONE BUFFER?8 BNE QUEUE ;NO. IF PROMPT COULD NOT BE BUFFERED, DON'T 00tssf__DATADATADATADATA ;BUFFER PRIMARY EITHER6 ADD #177,R1 ;ROUND TO NEXT BLOCK, ADD ONE FOR HEADER& ASH #-6,R1 ;MAKE INTO 32 WORD BLOCK  CLR R0 ;NO FLAGS MOV R3,-(SP) ;SAVE I/O PACKET CALL $CPALO ;ALLOCATE A BLOCKE! MOV (SP)+,R3 ;RESTORE I/O PACKETT/ BCS QUEUE ;IF CAN'T GET ONE, FORGET BUFFERING $ MOV R0,(SP) ;SAVE IN CASE OF ERROR2 CMPB #,I.FCN+1(R3) ;WAS THIS A READ?( BEQ 20$ ;YES, DON'T BLXIO EMPTY BUFFER MOV R4,-(SP) ;SAVE BUFFER FLAGS MOV R3,-(SP) ;SAVE I/O PACKET1 MOV #MAP6+100,R4 ;OFFSET TO BUFFER IN CPR PACKETD3 MOV I.PRM+4(R3),R0 ;GET LENGTH OF TRANSFER REQUESTA& MOV I.PRM(R3),R1 ;BIAS OF USER BUFFER* MOV I.PRM+2(R3),R2 ;OFFSET OF USER BUFFER) SUB #MAP6-MAP5,R2 ;MAKE INTO APR5 OFFSETV! MOV 4(SP),R3 ;BIAS OF CPR PACKETS& CALL $BLXIO ;COPY BUFFER INTO PACKET! MOV (SP)+,R3 ;RESTORE I/O PACKETF MOV (SP)+,R4 ;RESTORE FLAGS BR 30$ ;FINISH UPA*20$: MOV @#KISAR6,R0 ;SAVE CURRENT MAPPING" MOV (SP),@#KISAR6 ;MAP CPR PACKET' MOV I.PRM(R3),MAP6+P$LUN+32 ;SAVE BIAS#* MOV I.PRM+2(R3),MAP6+P$LUN+34 ;AND OFFSET& MOV R0,@#KISAR6 ;RESTORE APR6 MAPPING'30$: MOV (SP),I.PRM(R3) ;BIAS OF PACKETF0 MOV #100,I.PRM+2(R3);OFFSET OF BUFFER IN PACKET F< .SBTTL QUEUE - PLACE I/O REQUEST PACKET INTO TERMINAL QUEUE;AK; R4 NOW CONTAINS BUFFER FLAG. SAVE THE FLAG IN I.LN2+1 OF THE I/O PACKET.O9; SET THE HIGH BIT IF THE CPR PACKET IS ALREADY ALLOCATEDI;UQUEUE::M. TST (SP)+ ;WAS THERE A CPR PACKET ALLOCATED? BEQ 10$ ;NOPE, CONTINUEM, BIS #200,R4 ;MARK THE BUFFER POINTER FLAGS?10$: ADD #U.TSTA,R5 ;POINT UCB POINTER TO THE FIRST STATUS WORDP. 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)A ASR R0 ;! INC R0 ;LUN NUMBERS START AT 1 5 MOVB R0,I.LN2(R3) ;RETURN TO LUN FIELD IN I/O PACKETT+ MOVB R4,I.LN2+1(R3) ;SAVE BUFFER FLAG BYTEL0 MOV U.SCB-U.TSTA(R5),R0 ;GET I/O QUEUE LISTHEAD MOV R3,R1 ;GET PACKET POINTER1( CALLR $QINSP ;INSERT PACKET AND RETURN.PAGER. .SBTTL . QPATT/QPDET - ATTACH/DETACH REQUESTS;T;+-; **-QPATT - ATTACH TERMINAL REQUEST (IO.ATT)G-; **-QPDET - DETACH TERMINAL REQUEST (IO.DET)>; K; ENTRY POINT "QPATT" PERFORMS UNSOLICITED INPUT AST ADDRESS ADJUSTMENT FOR ; SUPERVISOR MODE LIBRARIES.;A ; INPUTS:,; R3 => I/O PACKET FOR ATTACH/DETACH REQUEST; R5 => UCB FOR THE TERMINAL;F ; OUTPUTS:L; R3 => I/O PACKET TO BE QUEUED ; R4 = BUFFER INDICATOR BYTE ;T"; REGISTERS MODIFIED: R0, R1, R2;-;CQPATT::E;N7; CHECK FOR UCB OF TERMINAL WHICH IS NOT TI: NOR HT377:S; DO NOT ALLOW ATTACHA;C- MOV I.UCB(R3),R2 ;GET UCB ADDRESS FOR ATTACHC" MOV I.TCB(R3),R4 ;GET TCB OF TASK: BITB #TF.AST,I.FCN(R3) ;ATTACH FOR UNSOLICITED INPUT AST? BEQ 35$ ;IF EQ NOE1 MOV I.PRM+4(R3),-(SP) ;GET CONTROL-C AST ADDRESSA0 BEQ 10$ ;IF EQ, NONE...CHECK OTHER AST ADDRESS5 BIT #TF.XCC,I.FCN(R3) ;CONFLICTING SUBFUNCTION CODE?Q' BNE 40$ ;IF NE, YES...RETURN AN ERRORT10$:; BIS I.PRM(R3),(SP)+ ;"OR" IN UNSOLICITED INPUT AST ADDRESS 3 BEQ 50$ ;IF EQ, NEITHER ADDRESS SPECIFIED...ERRORO430$: MOV I.PRM(R3),R2 ;GET ALL CHARACTER AST ADDRESS) CALL $CALTA ;ADJUST FOR SUPER/USER MODEO" 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 MODE-$ MOV R2,I.PRM+4(R3) ;AND PUT IT BACK35$: K< BIS #TS.RSW,T.STAT(R4) ; BLOCK TASK TO MAKE IT SYNCHRONOUS. CLR R4 ;INDICATE NO BUFFERS JMP QUEUE40$: TST (SP)+ ;CLEAN STACK#50$: JMP EQPSPC ;RETURN WITH ERROR  RQPDET::Q" MOV I.UCB(R3),R2 ;GET UCB ADDRESS CLR U.ATT(R2) ;CLEAR ATTACH ) CLR R4 ;INDICATE NO BUFFERSE JMP QUEUE ;QUEUE THE REQUEST E.PAGED$ .SBTTL . QPSPC - "SPECIAL" REQUESTS;M;+=; **-QPSPC - HANDLE "SPECIAL" REQUESTS (IO.GTS/SF.GMC/SF.SMC) ; G; THIS ROUTINE CHECKS PARAMETERS FOR THE "GET TERMINAL SUPPORT" AND THERJ; "GET/SET MULTIPLE CHARACTERISTICS" FUNCTIONS. THE USER BUFFER FOR THESE"; REQUESTS MUST BE WORD-ALIGNED. ;C ; INPUTS:"; R3 => I/O PACKET FOR THE REQUEST; R5 => UCB FOR THE TERMIN00t"sribjbkb a a aAL; ; OUTPUTS:E; R3 => I/O PACKET TO BE QUEUED; R4 = BUFFER INDICATOR BYTER;"; REGISTERS MODIFIED: R0, R1, R2;-;QPSPC::P* MOV I.PRM+2(R3),R1 ;GET BUFFER ITS LENGTH BIT #1,R1 ;ODD? ( BEQ 1$ ;IF EQ, IT'S A FULL WORD LENGTH6 JMP EQPSPC ;RETURN ERROR FOR LENGTH NOT WORD-ALIGNED1$: 0 MOV R1,I.PRM+4(R3) ;PUSH LENGTH DOWN ONE FIELDE CMP I.FCN(R3),#IO.GTS ;IO.GTS? ;GET TERMINAL DRIVER SUPPORT REQUEST? BEQ 2$ ;IF EQ, YES= CMP I.FCN(R3),#SF.GMC ;GET MULTIPLE CHARACTERISTICS REQUEST?O BNE 3$ ;IF NE, NO ;KN; THIS IS A GET INFORMATION REQUEST. TASK MUST BE BLOCKED FOR SYNCHRONIZAION, ; BUFFER MUST HAVE WRITE ACCESS.;P2$:R* MOV I.TCB(R3),R0 ;GET TCB ADDRESS OF TASK: BIS #TS.RSW,T.STAT(R0) ;BLOCK TASK TO MAKE IT SYNCHRONOUS5 MOV #CKBFW,-(SP) ;ASSUME A WRITE CHECK, NO BUFFERINGR* CMP R1,$CPMXB ;BUFFER THIS IN CPR PACKET? BHI 10$ ;NOPE, ACCESS DIRECTLY< MOV #CPBFW,(SP) ;BUFFER REQUEST, WRITE ACCESS, WORD ALIGNED BR 6$ ;ALLOCATE CPRBUF PACKETP3$:A;T1; SANITY CHECK - IS THIS A LEGAL QIO TYPE FOR US?S; = CMP I.FCN(R3),#SF.SMC ;SET MULTIPLE CHARACTERISTICS REQUEST?A BEQ 4$ ;IF EQ YES, CONTINUEA7 JMP EQPIFC ;IF NE, NO...RETURN ILLEGAL FUNCTION ERRORA4$:B;#O; WRITE REQUEST. READ ACCESS ONLY NECESSARY FOR BUFFER, MUST BE OWN TI OR PRIV ; TASK.C;N) MOV I.TCB(R3),R2 ;GET ISSUING TASK'S TCBN, CMP T.UCB(R2),R5 ;IS THIS TERMINAL HIS TI:?' BEQ 5$ ;IF EQ, YES...REQUEST IS LEGAL / BIT #T3.PRV,T.ST3(R2) ;IS THE TASK PRIVILEGED?C BNE 5$ ;IF NE YES, OKC5 JMP EQPPRI ;IF EQ, NO...CAN'T ALLOW USER TO DO THISN:5$: MOV #CKBFRW,-(SP) ;SET UP FOR READ CHECK, WORD ALIGNED* CMP R1,$CPMXB ;BUFFER THIS IN CPR PACKET? BHI 10$ ;NOPE, ACCESS DIRECTLY< MOV #CPBFRW,(SP) ;BUFFER REQUEST, READ ACCESS, WORD ALIGNED"6$: CLR R0 ;NO FLAGS FOR ALLOCATE* ADD #177,R1 ;ROUND UP, AND ADD ONE BLOCK, ASH #-6,R1 ;ROUND TO NEAREST 32 WORD BLOCK MOV R3,-(SP) ;SAVE I/O PACKET) CALL $CPALO ;ALLOCATE A BLOCK OF CPRBUFR! MOV (SP)+,R3 ;RESTORE I/O PACKET5 BCC 7$ ;GOT ONE+ ;CAN'T GET CPR PACKET, FORGET BUFFERING , MOV #CKBFRW,(SP) ;GO BACK TO CHECK AND LOCK= CMP I.FCN(R3),#SF.SMC ;SET MULTIPLE CHARACTERISTICS REQUEST?E BEQ 10$ ;IF EQ YES, CONTINUE. MOV #CKBFW,(SP) ;NOPE, WRITE ACCESS REQUIRED  BR 10$ ;GO ADDRESS CHECK$7$: MOV R0,R2 ;MOVE THE CPRBUF BIAS; MOV R0,2(SP) ;STORE CPR PACKET FOR POSSIBLE ERROR RECOVERYT) MOV #MAP6+100,R4 ;OFFSET TO START BUFFERK7 MOV I.PRM+2(R3),R1 ;RESTORE THE LENGTH OF THE TRANSFER+ ,10$: MOV I.PRM(R3),R0 ;GET ADDRESS OF BUFFER= CALL @(SP)+ ;ADDRESS CHECK BUFFER AND RELOCATE OR BUFFER IT  BCC 20$ ;IF CC, NO ERROR6 JMP IOFIN ;IF ERROR, FINISH UP WITH ERROR CODE IN R020$: MOV #1,R4 ;SHOW ONE BUFFER) MOV R1,I.PRM(R3) ;PUT BIAS IN I/O PACKETE' MOV R2,I.PRM+2(R3) ; AND DISPLACEMENT  JMP QUEUE ;QUEUE REQUEST;VM; EQPIFC - RETURN AN ERROR DUE TO ILLEGAL FUNCTION CODE OR INVALID MODIFIERS.F; EQPIFC::D MOV #IE.IFC&377,R2 ;SET ERROR FOR ILLEGAL FUNCTION CODE OR MODIFIER: JMP IOFIN ;FINISH OFF THE REQUEST (RESTORE MAPPING ALSO).PAGEE .SBTTL . QPHNG - HANGUP REQUEST;;+$; **-QPHNG - HANGUP REQUEST (IO.HNG);RH; THIS ROUTINE CHECKS AN IO.HNG REQUEST. A NON-PRIVILEGED TASK CAN HANGK; UP ONLY ITS "TI:" LINE. PRIVILEGED TASKS CAN HANG UP ANY LINE. A HANGUPCK; REQUEST, LIKE AN IO.WBT OR GET CHARACTERISTICS, BREAKS THROUGH THE QUEUE.L ; ; INPUTS:"; R3 => I/O PACKET FOR THE REQUEST; R5 => UCB FOR THE TERMINAL;R ; OUTPUTS:T; R3 => I/O PACKET TO BE QUEUED ; R4 = BUFFER INDICATOR BYTEE;P; REGISTERS MODIFIED: R0;-;NQPHNG::P) MOV I.TCB(R3),R0 ;GET ISSUING TASK'S TCBS, CMP T.UCB(R0),R5 ;IS THIS TERMINAL HIS TI:?( BEQ 10$ ;IF EQ, YES...ALLOW THE HANGUP/ BIT #T3.PRV,T.ST3(R0) ;IS THE TASK PRIVILEGED? ( BNE 10$ ;IF NE, YES...ALLOW THE HANGUP. JMP EQPPRI ;RETURN PRIVILEGE VIOLATION ERROR!10$: CLR R4 ;INDICATE NO BUFFERSP JMP QUEUE ;QUEUE THE REQUEST .END; R5 => UCB FOR THE TERMINAL;R ; OUTPUTS:T; R3 => I/O PACKET TO BE QUEUED ; R4 = BUFF00u*ssf__DATADATADATADATA .TITLE DRASGT .IDENT /11.14/E;M1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.G; All rights reserved;P;U<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;;E; PREVIOUSLY MODIFIED BY:H;A; J. R. KAUFFMAN ; K. L. NOEL; J. W. BERZLE; ERIC POSTPISCHIL; PAUL K. M. WEISS;J; MODIFIED FOR CPRSX V2.O BY:;N; %; Eric Postpischil 11.14 19-Sep-1989UA; edp075 -- Remove prohibition on assignments to pseudo devices.T;.%; Paul K. M. Weiss 11.13 12-JUN-19895%; PKW177 -- Change H$TIUC to H$UNIT.i;s; MACRO LIBRARY CALLSH;S .MCALL TCBDF$, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS .MCALL UCBDF$ T UCBDF$ ,,1 & .IF DF C$$RTK ;REMOTE TASK SUPPORT .MCALL CPRDF$ CPRDF$ ; ; LOCAL DATA;Z)IMPFLG: .WORD 0 ;IF = 1 CALLED AT IMPASG.LUNNUM: .WORD 0 ;LUN NUMBER FOR IMPLICIT ALUN'OLDUCB: .WORD 0 ;FORMER UCB ASSIGNMENTp .ENDC ; C$$RTKb;o; LOCAL SYMBOLSt;s#MAP6 = 140000 ;ADDRESS TO MAP APR6s!AS$DIC = 7 ;DIC FOR ASSIGN LUNC.AS$SIZ = 4 ;SIZE OF DPB FOR ASSIGN LUN(AC$DIC = 207. ;DIC FOR ASSIGN CHANNEL -AC$SIZ = 5 ;SIZE OF DPB FOR ASSIGN CHANNEL ,AC$SUB = 6 ;SUBFUNCTION FOR ASSIGN CHANNEL 'VNAMSZ = 8. ;SIZE OF VMS TERMINAL NAME;+; **-$DRASG-ASSIGN LUN;MB; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ASSIGN A DEVICE UNIT TO A; LOGICAL UNIT NUMBER (LUN).;R ; DPB FORMAT:B;S!; WD. 00 -- DIC(7.),DPB SIZE(4.). ; WD. 01 -- LUN TO BE ASSIGNED. *; WD. 02 -- NAME OF DEVICE TO BE ASSIGNED.1; WD. 03 -- UNIT NUMBER OF DEVICE TO BE ASSIGNED. ;I ; INPUTS:D;=9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. #; R3=ADDRESS OF THE LUN IN THE DPB.B/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.O,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;L5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ;E-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.R&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED. 5; DIRECTIVE STATUS OF 'D.RS90' IS RETURNED IF A FILEG2; IS OPEN OR UNIT ATTACHED ON THE SPECIFIED LUN.5; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF DEVICEU; AND/OR UNIT IS INVALID.;-;E; PACKET FORMAT FOR REMOTE ALUNA;E; +---------------------------+A; | |T; | HEADER |(; | |T; +---------------------------+I ; | |Y; | ALUN DPB |S ; | |S; +---------------------------+ ; | PTR TO 2ND WORD IN LUN |F; +---------------------------+; ; FORMER UCB ADDRESS ;H; +---------------------------+A; | SAVED KISAR6 |V; +---------------------------+; | SAVED IMPFLG |E; +---------------------------+-;-;+#; **-$IMAS1-IMPLICIT LUN ASSIGNMENT ;F; THIS ROUTINE DOES AN IMPLICIT ALUN FOR THE DIRECTIVE WHICH CALLED IT;-H; IF SYSTEM SUPPORTS REMOTE TASK SERVICES, A CALL TO CPRAME WILL BE MADEI; TO FIND THE LUN ASSIGNMENT. NO ATTEMPT IS MADE TO SAVE THE CONTEXT OFI; THE ORIGINAL DIRECTIVE. THE PC OF THE USER TASK IS BACKED UP OVER THE-2; THE TRAP SO THE DIRECTIVE WILL BE ISSUED AGAIN.; ; INPUTS:-;--; R1 - POINTER TO 2ND LUN WORD OF TASK HEADER +; R3 - POINTER TO THE LUN NUMBER IN THE DPB; ; OUTPUTS:;LG; THE LUT ENTRY IS FILLED IN WITH THE UCB OF THE DEVICE. IF THE DEVICERB; IS NOT FOUND THE DIRECTIVE STATUS OF 'D.RS92' IS RETURNED ; ;-+$DRASG::CALL $MPLUN ;MAP LUN TO DEVICE UCBS! TST (R1) ;FILE ACCESSED ON LUN?E BEQ 10$ ;IF EQ NOT( DRSTS D.RS90 ;RETURN WITH ERROR STATUS 10$: ;C" .IF DF C$$RTB ; RUN TIME BINDING( CLR IMPFLG ;INDICATE NOT IMPLICIT ALUN BR RTK ;JOIN COMMON CODE$IMAS1::2 MOV #1,IMPFLG ;INDICATE THIS WAS AN IMPLICIT CALL CLR R0 ;NO FORMER UCB ADDRESS  RTK: S* MOV R0,OLDUCB ;SAVE FORMER UCB ASSIGNMENT MOV -2(R3),R2 ;GET LUN NUMBER% .IF DF C$$RTK ;REMOTE TASK SUPPORTR5 BIT #F5.RTK,$FMSK5 ;ARE WE USING REMOTE TASK SUPPORTC BNE 10$ ;IF NE YES( J00u2sribjbkb a a aMP 160$ ;DO NON REMOTE LUN ASSIGNMENT;S"; GET A REQUEST PACKET FROM CPRBUF;:-10$: MOV R1,R4 ;SAVE POINTER TO 2ND LUN WORD MOV R2,LUNNUM ;SAVE LUN NUMBERI MOV R3,R5 ;SAVE POINTER TO DPB( MOV #1,R1 ;SET FOR 1 BLOCK FROM CPRBUF9 MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START% CALL $CPALO ;GET BUFFER FROM CPRBUF ) MOV KISAR6,-(SP) ; SAVE CURRENT MAPPING.B MOV R0,KISAR6 ; MAP PACKET. MOV #IS.SUC,MAP6+H$STAT/ ; MARK PACKET WITH SUCCESS SO THAT IMPLICITB2 ; ASSIGNMENTS TO OV: APPEAR SUCCESSFUL EVEN% ; THOUGH THEY NEVER GO TO VMS.O$ MOV (SP)+,KISAR6 ; RESTORE MAPPING.;E7; GET DEVICE AND UNIT NUMBER BEFORE WE UNMAP THE HEADERVJ; - FOR IMPLICIT ALUN, THE DEVICE AND UNIT NUMBER IS IN THE LUT EXTENSIONG; OFFSET INTO LUT IS THE SAME AS IN THE HEADER LUT. THE ADDRESS OF TP; THE PROTO LUN IS GOTTEN BY SUBTRACTING H.LUN+140000 FROM THE ADDRESS OF THED; 2ND LUN WORD THEN ADDING THE BASE ADDRESS OF THE LUT EXTENSION.H; - FOR REGULAR REMOTE ALUN, THE DEVICE AND UNIT NUMBER ARE GOTTEN FROM ; THE DPB;Y TST IMPFLG ;IMPLICIT ALUN+ BEQ 30$ ;IF EQ NOP( MOV R4,R1 ;GET ADDRESS OF 2ND LUN WORD4 SUB #H.LUN+2+MAP6,R1 ;GET OFFSET INTO LUT EXTENSION) ADD MAP6+H.LUTE,R1 ;ADD EXTENSION OFFSETN MOV (R1)+,R2 ;GET DEVICE NAME BEQ 20$ ;IF EQ, UNASSIGNED LUN MOV (R1),R3 ;GET UNIT NUMBER;TA; SPECIAL CASE OV - IF THIS IS AN IMPLICIT CALL, DON'T LET CPRAMEN; TRY TO TRANSLATE THE LOGICALS;  CMP #"OV,R2 ;IS THIS OV? BNE 40$ ;IF NE NO 3 MOV R0,$CPPKT ;SET ADDRESS OF PACKET TO DEALLOCATEB & MOV $TKTCB,R5 ;GET CURRENT TASK'S TCB& MOV T.LDV(R5),R1 ;GET LOAD DEVICE UCB JMP 260$ ;JOIN COMMON CODE020$: DRSTS D.RS5 ;RETURN WITH ERROR CODE IE.ULN&30$: MOV (R5),R2 ;GET DEVICE FROM DPB MOV 2(R5),R3 ; AND UNIT NUMBERQ;N%; FILL IN THE HEADER AND THE ALUN DPBU;R240$: MOV KISAR6,-(SP) ;SAVE MAPPING TO TASK HEADER MOV R0,KISAR6 ;MAP PACKET+ MOV #MAP6,R1 ;GET ADDRESS OF PACKET HEADER * MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUST CLRB H$ICNT(R1) ;NO ITEMS! ADD #P$DPB,R1 ;POINT TO DPB AREA$ MOVB #AS$DIC,(R1)+ ;DIC MOVB #AS$SIZ,(R1)+ ;SIZEG" MOV LUNNUM,(R1)+ ;COPY LUN NUMBER MOV R2,(R1)+ ;DEVICE NAME MOV R3,(R1)+ ;UNIT NUMBER;E'; FILL IN THE COMMON EXTRA STORAGE AREAM;B6 ADD #6,R1 ;SKIP 6 BYTES FOR COMPATIBILITY WITH ACHN$: MOV R4,(R1)+ ;SAVE POINTER TO 2ND LUN WORD IN TASK HEADER* MOV OLDUCB,(R1)+ ;SAVE OLD UCB ADDRESS ( MOV (SP)+,(R1)+ ;SAVE MAPPING TO HEADER;EI; IF THIS IS AN IMPLICIT ALUN, SET SN$IMP SO DRFIN WILL NOT BE CALLED YET;D" MOV #SN$DIR,R2 ;SET DIRETIVE FLAG MOV IMPFLG,(R1) ;IMPLICIT ALUNI BEQ 50$ ;IF EQ NOT IMPLICIT)" MOV #SN$IMP,R2 ;SET IMPLICIT FLAG*50$: SUB #140000,R1 ;GET SIZE OF PACKET ;I; SEND PACKET TO THE DRIVERE;E60$:< CLR $CPPKT ; MAKE SURE NO ONE USES PACKET WHILE WE'RE GONE/ CPSEN$ R2,KISAR6,R1 ; SEND REQUEST TO HOST AMEE ; <; MAP PACKET AND RETRIEVE IMPFLG AND POINTER INTO THE HEADER;I MOV R0,KISAR6 ;MAP PACKET' MOV #MAP6,R5 ;GET ADDRESS OF HEADER W ADD #P$DPB,R5 ;POINT TO DPB ) MOV R0,$CPPKT ;SAVE ADDRESS OF PACKET R% MOV 2(R5),$CPLUN ;SAVE LUN NUMBER T& CMPB #AC$DIC,(R5) ;IS THIS ACHN$?  BNE 70$ ;IF NE NO R3 MOV 4(R5),$CPLUN ;LUN NUMBER IS IN DIFFERENT PLACEI) MOV 30(R5),R4 ;SO IS THE SECOND LUN WORD  BR 71$ ;COMMON CODEE470$: MOV 16(R5),R4 ;GET ADDRESS OF SECOND LUN WORD 171$: MOV 20(R5),OLDUCB ;RESTORE OLD UCB ADDRESS A* MOV 24(R5),IMPFLG ;GET SAVED FLAG WORD ; ; CHECK STATUS RETURNEDD>; - IF SUCCESS, LOOK FOR DEVICE NAME AS A GENERIC DEVICE TYPEF; - IF FAILURE AND DEVICE NAME IS HT, DO AN ASSIGN CHANNEL DIRECTIVE P; - IF FAILURE AND DEVICE NAME IS NON ZERO, LOOK FOR LOCAL DEVICES OF THAT NAME5; - IF DEVICE NAME IS ZERO, RETURN WITH ERROR STATUS;;I) MOV 4(R5),R2 ;GET RETURNED DEVICE NAME D MOV 6(R5),R0 ; AND UNIT NUMBERS! CMPB #AC$DIC,(R5) ;IS THIS ACHN?( BNE 75$ ;IF NE NOL/ MOV 6(R5),R2 ;DEVICE NAME AND UNIT NUMBER ARE L$ MOV 10(R5),R0 ; IN DIFFERENT PLACES75$:# TST R2 ;00u:ssf__DATADATADATADATAWAS DEVICE NAME RETURNED?E BEQ 130$ ;IF EQ ERROR / CMP #IS.SUC,MAP6+H$STAT ;WAS SUCCESS RETURNED?N BEQ 100$ ;IF EQ YES ; ; CHECK FOR HTn: N ; ' CMP #"HT,R2 ;IS DEVICE A TERMINAL? E2 BNE 150$ ;IF NE NO, LOOK IN LOCAL DEVICE TABLES ! CALL GETUCB ;GET UCB ADDRESS 6 BCC 90$ ;IF CC, OKAY &80$: JMP 189$ ;IF NOT THERE, ERROR 90$: L0 BIT #U2.LOG,U.CW2(R1) ;IS TERMINAL LOGGED IN? BNE 80$ ;IF NE, NO - REJECT ( JMP 370$ ;SEND ASSIGN CHANNEL PACKET ; %; HOST SUCCESSFULLY ASSIGNED LUN + ; 2100$: CMPB #AC$DIC,(R5) ;IS THIS ASSIGN CHANNEL?  BNE 110$ ;IF NE NO 3 MOV 26(R5),R1 ;USE UCB ADDRESS FIGURED OUT BEFORE E4 MOV 22(R5),KISAR6 ;RESTORE MAPPING TO TASK HEADER  BR 120$ ;JOIN COMMON CODE 110$: 4 MOV 22(R5),KISAR6 ;RESTORE MAPPING TO TASK HEADER # MOV #377,R0 ;LOOK FOR UNIT 377 U& CALL GETUCB ;LOOK FOR GENERIC UCB " BCS 80$ ;IF CS, DEVICE NOT THERE120$: ; ; PREPARE TO JOIN COMMON CODEE;U: MOV OLDUCB,-(SP) ;PUT OLD ASSIGNMENT UCB ADDRESS ON STACK JMP 230$ ;JOIN COMON CODEB130$:;$ .IF DF C$$RTK ;REMOTE TASK SUPPORT/ CALL RMTERR ;DEALLOCATE PACKET IF REMOTE TASK( .ENDC" DRSTS D.RS5 ;RETURN ERROR IE.ULN150$:$;J!; GET INFO SET UP FOR COMMON CODE;V% MOV 22(R5),KISAR6 ;MAP TASK HEADER # MOV R4,R1 ;PTR INTO TASK HEADER T* MOV $TKTCB,R5 ;CURRENT TASK'S TCB ADDRESS; ,; GET OLD ASSIGNMENT UCB ADDRESS FROM HEADER; # MOV OLDUCB,-(SP) ;SAVE UCB ADDRESSM BR 180$ ;JOIN COMMON CODE 160$:A .ENDC ;C$$RTKR TST IMPFLG ;IMPLICIT ALUN? BEQ 170$ ;IF EQ NO;F2; GET DEVICE AND UNIT NUMBER FROM HEADER EXTENSION;C( MOV R1,R4 ;GET ADDRESS OF 2ND LUN WORD4 SUB #H.LUN+2+MAP6,R1 ;GET OFFSET INTO LUT EXTENSION) ADD MAP6+H.LUTE,R1 ;ADD EXTENSION OFFSETI MOV (R1)+,R2 ;GET DEVICE NAME MOV (R1),R0 ;GET UNIT NUMBER;V; SET UP OLD UCB ADDRESS;B$ CLR -(SP) ;NO PREVIOUS UCB ADDRESS;DD; SPECIAL CASE OV - IF OV IS IN LUN EXTENSION, DON'T DO LOGICAL NAME; TRANSLATION;  CMP #"OV,R2 ;IS THIS OV? BNE 180$ ;IF EQ NO MOV $TKTCB,R5 ;GET TASK'S TCB& MOV T.LDV(R5),R1 ;GET LOAD DEVICE TCB JMP 240$ ;JOIN COMMON CODE170$:D .ENDC ;C$$RTB" MOV R0,-(SP) ;SAVE ADDRESS OF UCB, MOV R1,R4 ;SAVE ADDRESS OF SECOND LUN WORD! MOV (R3)+,R2 ;GET NAME OF DEVICET MOVB (R3),R0 ;GET UNIT NUMBERU180$:$ .IF DF C$$RTK ;REMOTE TASK SUPPORT" BIT #F5.RTK,$FMSK5 ;REMOTE TASKS? BNE 220$ ;IF NE YESO .ENDC ;C$$RTK .IF DF M$$MUP# BIT #T3.SLV,T.ST3(R5) ;SLAVE TASK?,2 BNE 220$ ;IF NE YES, BYPASS LOGICAL DEVICE TABLE .ENDC .IF DF L$$GCL- MOV T.UCB(R5),R1 ;GET THE CURRENT TASK'S TI:C6 CALL $GTUSR ;RESOLVE RAW UCB AND SET USER HASH TABLE9 MOV #$LNTDR,-(SP) ;RESOLVE ANY LOGICAL NAME TRANSLATIONS 5 CALL $MPDC3 ;USE ROUTINE IN FOURTH DIRECTIVE COMMON / BCC 220$ ;IF CC, SUCCESSFULLY MATCHED LOGICALR2 TST R3 ;SEE IF ERROR OCCURRED OR NO MATCH AT ALL BEQ 190$ ;IF EQ VALID MATCH .IFF$ BR 190$ ;DO OLD LOGICALS .IFTF188$:  TST (SP)+ ;CLEAN STACK189$: $ .IF DF C$$RTK ;REMOTE TASK SUPPORT/ CALL RMTERR ;DEALLOCATE PACKET IF REMOTE TASKG .ENDC! DRSTS D.RS92 ;RETURN WITH ERRORS190$:U1 MOV #$LOGHD,R3 ;POINT TO LOGICAL ASSIGNMENT LISTV-200$: MOV (R3),R3 ;GET ADDRESS OF NEXT ENTRY  BEQ 220$ ;IF EQ END OF LISTE) TSTB L.TYPE(R3) ;SYSTEM WIDE ASSIGNMENT?A BEQ 210$ ;IF EQ YES / CMP L.UCB(R3),T.UCB(R5) ;TI UCB ADDRESS MATCH?1 BNE 200$ ;IF NE NO*210$: CMP R2,L.NAM(R3) ;DEVICE NAME MATCH? BNE 200$ ;IF NE NO' CMPB R0,L.UNIT(R3) ;UNIT NUMBER MATCH?R BNE 200$ ;IF NE NO- MOV L.ASG(R3),R1 ;GET ASSIGNMENT UCB ADDRESST BR 230$ ;FINISH IN COMMON CODE .ENDC ;L$$GCL220$: ( CALL GETUCB ;GET CORRECT UCB ADDRESS  BCS 188$ ;IF CS ERROR D X' .IF DF C$$RTK ;REMOTE TASK SUPPORT " BIT #F5.RTK,$FMSK5 ;REMOTE TASKS? BEQ 230$ ;IF EQ NO ; ; TEST FOR GENERIC DEVICED;S@ CMP (R1),$XXLOW ;IS00uBsribjbkb a a a THIS A GENERIC DEVICE? HIGHER THAN LOW DCB? BLO 230$ ;IF LO NO ) CMP (R1),$XXHGH ;LOWER THAN HIGH DCB? H% BLOS 188$ ;IF LOS, IT IS GENERIC ) S .ENDC ;C$$RTK B230$: ;REFERENCE LABEL ; 2 .IF DF V$$TRM" MOV (R1),R3 ;POINT TO DEVICE DCB6 CMP D.NAM(R3),#"VT ;IS THE DEVICE A VIRTUAL TERMINAL? BNE 240$ ;IF NE NO/ CMP U.PTCB(R1),R5 ;IS ISSUING TASK THE PARENT?Q BEQ 240$ ;IF EQ NO0 CMP R1,T.UCB(R5) ;IS ISSUING TASK AN OFFSPRING? BNE 188$ ;IF NE NO .ENDC0240$: MOV (SP)+,R3 ;WAS LUN PREVIOUSLY ASSIGNED? BEQ 260$ ;IF EQ NO1 CMP R5,U.ATT(R3) ;UNIT ATTACHED TO CURRENT TASK?N BNE 250$ ;IF NE NO. MOV R1,-(SP) ;SAVE NEW ASSIGNMENT UCB ADDRESS MOV R1,R0 ;COPY UCB ADDRESS.& CALL $MPLND ;MAP TO REAL UCB ADDRESS2 MOV (SP)+,R1 ;RETRIEVE NEW ASSIGNMENT UCB ADDRESS. CMP R0,R3 ;NEW ASSIGNMENT TO SAME FINAL UCB? BNE 320$ ;IF NE NO1250$: MOV R3,R5 ;COPY OLD ASSIGNMENT UCB ADDRESSC: MOV #$IOKIL,-(SP) ;SET TO KILL I/O ON PREVIOUS ASSIGNMENT BR 261$260$:$: MOV #NULL,-(SP) ; PUT ADDRESS ON STACK TO KEEP IT A KNOWN/ ; LENGTH. THIS SHOULD BE THE ADDRESS OFN" ; ANY "RTS PC" INSTRUCTION.261$:P& MOV R1,-2(R4) ;ASSIGN LUN TO NEW UNIT .IF DF C$$RTK ;REMOTE TASKS ; <; DECIDE IF WE REALLY WANT TO DEALLOCATE THE CPRBUF PACKET ; " BIT #F5.RTK,$FMSK5 ;REMOTE TASKS? BEQ 300$ ;IF EQ NO;NB; WE HAVE SUCCESSFULLY ASSIGNED A LOCAL DEVICE. NOW WE NOTIFY THED; VMS SYSTEM THAT IT CAN DEASSIGN WHATEVER PREVIOUS ASSIGNMENT THERE; WAS FOR THIS LUN.A;E MOV (R1),R0 ; GET DCB." CMP #"TI,D.NAM(R0) ; IS THIS TI:?5 BEQ 266$ ; YES, LEAVE IT ALONE; VMS HAS IT ALREADY.) MOV KISAR6,-(SP) ; SAVE CURRENT MAPPING.N MOV $CPPKT,KISAR6 ; MAP PACKET.8 TST MAP6+H$STAT ; DID VMS SUCCESSFULLY ASSIGN A DEVICE?! BGT 265$ ; YES, LEAVE IT THERE.T, ; OTHERWISE, WE'RE GOING TO DEASSIGN THE ; PREVIOUS DEVICE.C MOVB #HT$DEA,MAP6+H$TYPEE ; INDICATE DEASSIGN PACKET.Y0 MOV #MAP6+P$LUN,R0 ; GET ADDRESS OF PARAMETERS.+ MOV $CPLUN,(R0)+ ; PASS LUN TO DEALLOCATE.1 MOV R1,(R0)+ ; SAVE REGISTER. MOV R2,(R0)+ ; SAVE REGISTER. MOV R3,(R0)+ ; SAVE REGISTER. MOV R4,(R0)+ ; SAVE REGISTER. MOV R5,(R0)+ ; SAVE REGISTER.1 MOV IMPFLG,(R0)+ ; SAVE IMPLICIT DIRECTIVE FLAG.V$ MOV (SP)+,(R0)+ ; SAVE SAVED APR 6.' MOV (SP)+,(R0)+ ; SAVE RETURN ADDRESS.E8 SUB #MAP6,R0 ; COMPUTE LENGTH OF PACKET WITH SAVE AREA.5 CLR $CPPKT ; MAKE SURE NO ONE ELSE USES OUR PACKET. . CPSEN$ #SF$BIA!SF$HDR!SF$AST!SF$BLK,KISAR6,R0 ; SEND PACKET. MOV R0,KISAR6 ; MAP PACKET.4 MOV R0,$CPPKT ; RESTORE RECORD OF PACKET'S ADDRESS. MOV #MAP6+P$LUN+2,R0R ; POINT TO SAVE AREA.M! MOV (R0)+,R1 ; RESTORE REGISTER.R! MOV (R0)+,R2 ; RESTORE REGISTER.L! MOV (R0)+,R3 ; RESTORE REGISTER.L! MOV (R0)+,R4 ; RESTORE REGISTER. ! MOV (R0)+,R5 ; RESTORE REGISTER.U4 MOV (R0)+,IMPFLG ; RESTORE IMPLICIT DIRECTIVE FLAG.* MOV 2(R0),-(SP) ; RESTORE RETURN ADDRESS.+ MOV (R0),-(SP) ; RESTORE MAPPING TO STACK.I265$:R- MOV (SP)+,KISAR6 ; RESTORE PREVIOUS MAPPING.M266$:I/ CMP #$IOKIL,(SP) ;HAS I/O KILL BEEN REQUESTED?R( BNE 280$ ;IF NE NO - DEALLOCATE PACKET ; 6; CHECK IF THE NEW ASSIGNED DEVICE IS A GENERIC ONE ; + CMP (R1),$XXLOW ;IS NEW DEVICE GENERIC? T BLO 270$ ;IF LO NO + CMP (R1),$XXHGH ;IS NEW DEVICE GENERIC? T- BLOS 280$ ;IF LOS - YES, DEALLOCATE PACKET L ; ; NEW DEVICE IS LOCAL, S6; CHECK IF THE OLD ASSIGNED DEVICE IS A GENERIC ONE ; 270$: - CMP (R5),$XXLOW ;IS THIS A GENERIC DEVICE? * BLO 280$ ;IF LO NO - DEALLOCATE PACKET - CMP (R5),$XXHGH ;IS THIS A GENERIC DEVICE? 2 BLOS 290$ ;IF LOS YES - DON'T DEALLOCATE PACKET 280$: % MOV $CPPKT,R0 ;GET ADDRESS OF PACKETV CALL $CPDEA ;DEALLOCATE IT NOW. CLR $CPPKT ;INDICATE WE ARE DONE WITH PACKET290$:;O@; IF THIS IS A REMOTE SYSTEM, THE KX DRIVER SET THE ERROR STATUS;I1 MOV #IS.SUC,-(SP) ;OVERRIDE CPRSYS' ERROR STATUSE MTPD$ @#H.DSW ; - BIC #1,$UMPS ;MAKE SURE CAR00uJssf__DATADATADATADATARY BIT IS CLEAR ;300$:  .ENDC ; C$$RTK! .IF DF C$$RTB ;RUN TIME BINDING ;KF; WE SHOULDN'T NEED A RUN TIME CONDITIONAL HERE, BECAUSE IF RTB IS NOT-; SUPPORTED, IMPFLG WILL NEVER GET SET ANYWAY ;M TST IMPFLG ;IMPLICIT ALUNP BEQ 310$ ;IF EQ NO% SUB #2,$UMPC ;BACK UP THE USER'S PCE" MOV #$STACK-22,SP ;DON'T DO DRFIN310$:I .ENDC ; C$$RTBT RETURN ;E(320$: MOV R1,-(SP) ;SAVE NEW UCB POINTER .IF DF X$$HDR' MOV $SAHPT,R1 ;GET TASK HEADER ADDRESS# .IFFM' MOV $HEADR,R1 ;GET TASK HEADER ADDRESSN .ENDC, ADD #H.NLUN,R1 ;POINT TO THE NUMBER OF LUNS MOV (R1),-(SP) ;PICK UP COUNT6330$: CMP (R1)+,(R1)+ ;ADVANCE TO NEXT UCB POINTER + 2* CMP R1,R4 ;SAME LUN AS BEING REASSIGNED? BEQ 340$ ;IF EQ YESQ' MOV -2(R1),R0 ;GET THIS LUN ASSIGNMENTU# BEQ 340$ ;IF EQ, LUN NOT ASSIGNED;. CALL $MPLND ;FOLLOW ANY REDIRECT; HANDLE TI:3 CMP R0,R3 ;LUN ASSIGNED TO SAME DEV AS REASS LUN? BNE 340$ ;NO, BRANCH TST (SP)+ ;REMOVE COUNT % MOV (SP)+,R1 ;GET NEW LUN ASSIGNMENTE+ BR 250$ ;IF EQ YES, ATTACH CAN BE IGNOREDL"340$: DEC (SP) ;POINT TO NEXT LUN BGT 330$ ;TRY AGAINP CMP (SP)+,(SP)+ ;CLEAN STACKA350$:T$ .IF DF C$$RTK ;REMOTE TASK SUPPORT TST (SP)+ ;CLEAN STACK/ CALL RMTERR ;DEALLOCATE PACKET IF REMOTE TASKH .ENDC ;C$$RTK&360$: DRSTS D.RS90 ;LUN LOCKED IN USE$ .IF DF C$$RTK ;REMOTE TASK SUPPORT ; "; SEND ASSIGN CHANNEL PACKET ; 5; INPUT: R1 - UCB ADDRES OF UNIT TO ASSIGN LUN TO M%; R5 - POINTER TO DPB IN PACKET B ; 370$:  MOVB #AC$DIC,(R5)+ ;DIC  MOVB #AC$SIZ,(R5)+ ;SIZ ;$ MOVB #AC$SUB,(R5)+ ;SUBFUNCTION  CLRB (R5)+ ;MODIFIER " MOVB $CPLUN,(R5)+ ;LUN NUMBER  CLRB (R5)+ ;TBMASK + MOV #H$SIZE+32,(R5)+ ;POINTER TO BUFFER ;# CLR (R5)+ ;MAKE IT A LONG WORD C# MOV #VNAMSZ,(R5)+ ;SIZE OF BUFFER MOV #"HT,(R5)+ ;RSX DEVICE NAME9 MOV (R5),12(R5) ;MOVE THE POINTER TO THE SECOND LUN WORDD CLRB (R5)+ ;MOVE UP ONE BYTE- MOVB U.UNIT(R1),(R5)+ ;STORE THE DEVICE UNIT * ADD #6,R5 ;POINT TO UCB ADDRESS FIELD MOV R1,(R5)+ ;STORE UCB ADDRESS1 TST (R5)+ ;SKIP PAST POINTER TO SECOND LUN WORDR, CMPB U.CPUN(R1),140000+H$UNIT ;IS THIS TI:?' BNE 371$ ;NOPE, USE VMS TERMINAL NAME+ MOV #3,-20(R5) ;CHANGE SIZE TO SIZE OF TI: CLR -16(R5) ;CLEAR OUT HT NAME CLR -14(R5) ;AND UNITI% MOV #"TI,(R5)+ ;MOVE TI: INTO STRINGV MOVB #':,(R5)+5 BR 373$ ;SEND IT OFF371$:H+ ADD #U.VNAM,R1 ;POINT TO VMS TERMINAL NAME $ MOV (R1)+,(R5)+ ;COPY TERMINAL NAME BNE 372$ ;IF THERE, CONTINUE JMP 189$ ;EXIT WITH ERRORM%372$: MOV (R1)+,(R5)+ ;ALL FOUR WORDS5 MOV (R1)+,(R5)+ ;...T MOV (R1)+,(R5)+ ;...P373$:N* MOV #SN$IMP,R2 ;SEND PACKET IMPLICITLY & MOV #H$SIZE+42,R1 ;GET SIZE OF PACKET JMP 60$ ;SEND THE PACKET ;; RMTERR - REMOTE ERROR CODE;*; - CHECK IF REMOTE TASKS ARE SUPPORTED); - IF PACKET ALLOCATED, DEALLOCATE IT G; - IF IMPLICIT ALUN, ERROR CODE ALREADY SET, DON'T RETURN TO CALLER;VRMTERR:5, BIT #F5.RTK,$FMSK5 ;REMOTE TASKS SUPPORTED? BEQ 20$ ;IF EQ NO; MOV $CPPKT,R0 ;GET PACKET BIASR' BEQ 10$ ;IF NONE, DON'T DEALLOCATE IT. CALL $CPDEA ;DEALLOCATE PACKET) CLR $CPPKT ;INDICATE PACKET DEALLOCATED10$:( TST IMPFLG ;WAS THIS AN IMPLICIT ALUN? BNE 20$ ;IF EQ NO 9 TST (SP)+ ;DON'T RETURN TO CALLER, KXDRV HAS SET STATUSE20$: S RETURN ;T .ENDC ;C$$RTK ; :; GETUCB - ROUTINE TO FIND CORRECT UCB IN SYSTEM TABLES ; ; INPUT: R2 - DEVICE NAME ; R0 - UNIT NUMBER ; ; OUTPUT: R1 - UCB ADDRESS ; R3 - DCB ADDRESS ; GETUCB: 1 MOV #$DEVHD,R3 ;POINT TO PHYSICAL DEVICE TABLES C,10$: MOV (R3),R3 ;GET ADDRESS OF NEXT DCB ! BEQ 20$ ;IF EQ END OF TABLES T( CMP R2,D.NAM(R3) ;DEVICE NAME MATCH?  BNE 10$ ;IF NE NO K S? CMPB R0,D.UNIT(R3) ;UNIT GREATER THAN OR EQUAL TO LOW BOUNDRY?  BLO 10$ ;IF LO NO C? CMPB R0,D.UNIT+1(R3) ;UNIT LESS THAN OR EQUAL TO HIGH BOUNDRY?N BHI 10$ ;IF HI NO 00uRsvSsibjbkb a a a N4 SUB D.UNIT(R3),R0 ;CALCULATE RELATIVE UNIT NUMBER % BIC #177400,R0 ;CLEAR EXCESS BITS / MOV D.UCBL(R3),R1 ;GET LENGTH OF UCB IN BYTES ' CALL $MUL ;CALCULATE NUMBER OF BYTES 3, ADD D.UCB(R3),R1 ;CALCULATE ADDRESS OF UCB   RETURN ;RETURN SUCCESS 20$: SEC 12NULL: ; THIS RETURN DOUBLES AS A RETURN FOR THE. ; PRECEDING CODE AND A LABEL FOR A NULL ; ROUTINE.C RETURN ;RETURN FAILURE  .END OR EQUAL TO HIGH BOUNDRY?N BHI 10$ ;IF HI NO .TITLE TTRW .IDENT /10.00/T;E;I1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.S; All rights reserved1;E;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 WANNHEDEN ;S; PREVIOUSLY MODIFIED BY: ;U; P. WANNHEDEN; D. R. DONCHIN ; T. LEKAS ; S. C. ADAMS ; R. S. PHILPOTT; M. W. ZAHAREEC;R;R$; MODIFIED FOR RSX-11M-PLUS V4.3 BY:;T; M. W. ZAHAREE 28-JUN-89 10.00IE; MWZ010 -- DON'T CLOBBER OTHER BITS WHEN INITIALIZING U.AFLG FOR ACD9 ; CALLS.I;+; ****** T T R W ******e;F; THIS MODULE CONTAINS THE ROUTINES TO STARTUP AND COMPLETE A READ ORN; WRITE REQUEST THAT HAS BEEN DEQUEUED FOR A TERMINAL. BOTH TYPES OF REQUESTSI; HAVE THREE PARTS. THE FIRST STEP DOES PRE-PROCESSING OF THE PARAMETERS.K; CONTAINED IN THE I/O PACKET NECESSARY TO PROCEED TO THE SECOND STEP. THEI; SECOND STEP SETS UP BUFFER POINTERS, ETC. FOR THE NEXT PART OF THE DATA K; TRANSFER. THIS STEP IS REPEATED UNTIL THE TRANSFER FULLY COMPLETES. THE9K; FINAL STEP CLEANS UP AND PASSES THE I/O REQUEST BACK TO THE SYSTEM WITH A H; COMPLETION STATUS. NOTE THAT BOTH SOLICITED AND UNSOLICITED INPUT ARE ; HANDLED BY THE INPUT ROUTINES.;-;O& .SBTTL .MCALLS AND SYMBOL DEFINITIONS .MCALL TTSYM$ TTSYM$ ;DEFINE TF.XXX SYMBOLS .IF DF T$$SPC!T$$CCA!T$$EIO .MCALL PKTDF$3 PKTDF$ ;DEFINE CLI COMMAND BUFFER HEADER OFFSETSP% ;AND ACB OFFSETS AND IOPX OFFSETSD .ENDC ;T$$SPC!T$$CCA!T$$EIO .PSECT MAP5.6.PAGEE2 .SBTTL PPEIO - EXTENDED READ/WRITE PRE-PROCESSING;S;+@; **-PPEIO - PRE-PROCESSING FOR EXTENDED READ AND WRITE (IO.EIO);EG; THIS ROUTINE DOES THE SETUP NECESSARY TO START UP AN EXTENDED READ ORU0; WRITE REQUEST. THE FOLLOWING STEPS ARE TAKEN:?; 1. LOCATE THE I/O PACKET EXTENSION (IOPX) ASSOCIATED WITH THED9; IO.EIO REQUEST'S I/O PACKET. THE IOPX IS REMOVED FROM ; THE IOPX LIST.HB; 2. MOVE THE I/O FUNCTION MODIFIERS FROM THE IOPX TO THE FUNCTION;; CODE FIELD IN THE CURRENT I/O PACKET. THE FUNCTION CODE ;; IS FLAGGED AS AN IO.EIO REQUEST BY SETTING THE HIGH BIT.P?; 3. ALL PARAMETERS THAT WERE EARLIER SAVED IN THE IOPX ARE NOWE8; TRANSFERRED TO THE I/O PACKET FOR THE IO.EIO REQUEST.; 4. THE IOPX IS DEALLOCATED.N>; 5. DISPATCH TO THE ROUTINE FOR HANDLING THE SPECIFIC TYPE OF; I/O REQUEST.H;K; *** NOTE *** AT PRESENT, THIS ROUTINE ASSUMES THAT THE ONLY REQUEST THATHD; WILL GET PASSED TO IT IS AN EXTENDED READ REQUEST (IO.EIO!TF.RLB).D; ANY IO.EIO!TF.WLB OPERATION IS EXPECTED TO HAVE BEEN MAPPED INTO A=; NORMAL IO.WLB REQUEST PRIOR TO BEING QUEUED (WITH NO IOPX).P;M ; INPUTS:#; R3 => CURRENT I/O REQUEST PACKETE; R4 => UCBX FOR THE TERMINAL#; R5 => U.TSTA OF THE TERMINAL UCBIH; U.TRTT(R4) => TERMINATOR TABLE FOR THE READ, IF ANY (SET UP BY FPGRQ).; I.LNK(R3) = 0 ;Q ; OUTPUTS: ; IOPX IS DEALLOCATEDTE; CURRENT I/O PACKET IS SET UP FOR PROCESSING BY "PPRLB" OR "PPRPR1".O; "; REGISTERS MODIFIED: R0, R1, R2;-;. .IF DF T$$EIO ASSUME I.XLNK,0 ASSUME I.XLNK+2,I.XIOP  ASSUME I.XIOP+2,I.XTCBE ASSUME I.XTCB+2,I.XMODE ASSUME I.XMOD+4,I.XRBF  ASSUME I.XRBF+4,I.XRBLT ASSUME I.XRBL+2,I.XTMO4 ASSUME I.XTMO+2,I.XPBFL ASSUME I.XPBF+4,I.XPBLT ASSUME I.XPBL+2,I.XPBV)PPEIO::T$ MOV R5,R0 ;GET COPY OF UCB POINTER> ADD #U.TIXL-U.TSTA,R0 ;MAKE POINTER TO U.TIXL (IOPX LISTHEAD)10$:0 MOV R0,R1 ;MAKE THIS THE PREVIOUS IOPX POINTER< MOV (R1),R0 ;LOCATE THE NEXT IOPX (MUST BE HERE SOMEWHERE)A CMP00vZssf__DATADATADATADATA I.XIOP(R0),R3 ;DOES THIS IOPX BELONG TO THE CURRENT REQUEST?O+ BNE 10$ ;IF NE, NO...LOOP TILL WE FIND IT23 MOV (R0),(R1) ;REMOVE THIS IOPX FROM THE WAIT LISTI< ADD #I.XMOD,R0 ;POINT PAST LINK, I/O PACKET AND TCB OFFSETS= MOV (R0)+,I.FCN(R3) ;STORE REQUESTED MODIFIERS IN I/O PACKETV+ TST (R0)+ ;SKIP OVER UNUSED MODIFIER WORDUC BIS #S6.EIO,U.TST6-U.TSTA(R5) ;INDICATE REQUEST IS (WAS) AN IO.EIOK$ MOV R3,R1 ;COPY I/O PACKET ADDRESS6 ADD #I.PRM,R1 ;MAKE A POINTER INTO THE PARAMETER LIST> 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 LENGTH+ MOV (R0)+,(R1)+ ;COPY TIMEOUT FOR THE READT20$:@ MOV (R0)+,(R1)+ ;COPY 1.ST ADDRESS DOUBLE WORD OF PROMPT BUFFER@ MOV (R0)+,(R1)+ ;COPY 2.ND ADDRESS DOUBLE WORD OF PROMPT BUFFER+ MOV (R0)+,(R1)+ ;COPY PROMPT BUFFER LENGTHW 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 IOPXR CALL $DEACB ;DEALLOCATE IOPX MOV (SP)+,R3 ;RESTORE R3  .IF DF T$$RPR9 BIT #TF.RPR,I.FCN(R3) ;DID USER REQUEST A READ W/PROMPT?2 BEQ PPRLB1 ;IF EQ, NO...PROCESS AS A NORMAL READ5 JMP PPRPR1 ;GO PROCESS THE PROMPT PART AS AN OUTPUTO .IFF ;T$$RPR( .IF DF B$$MAP- BR PPRLB1 ;PROCESS AS A NORMAL READ REQUEST0 .ENDC ;B$$MAP .ENDC ;T$$RPR .ENDC ;T$$EIO.PAGEM$ .SBTTL INPUT REQUEST PRE-PROCESSING4 .SBTTL . PPRSD - READ-SPECIAL-DATA REQUEST (IO.RSD); ;+:; **-PPRSD - PRE-PROCESSING FOR READ-SPECIAL-DATA (IO.RSD);; **-PPRLB - PRE-PROCESSING FOR READ-LOGICAL-BLOCK (IO.RLB)I;SG; THIS ROUTINE DOES THE SETUP NECESSARY TO START UP AN IO.RSD OR IO.RLBA4; REQUEST. ANY OF THE FOLLOWING STEPS MAY BE TAKEN:@; 1. FOR ENTRY AT "PPRSD", THE HIGH BYTE OF THE FUNCTION CODE IS9; CLEARED, SINCE IT MAY BE NECESSARY TO STORE OTHER READ$ ; MODIFIERS FOR LATER CHECKING.E; 2. FOR ENTRY AT "PPRLB", THE UNSOLICITED INPUT AST CONTROL BLOCK IST:; UNLOCKED IN CASE IT IS LOCKED DUE TO A NOTIFICATION AST<; HAVING BEEN SENT (TF.NOT MODIFIER ON THE ATTACH REQUEST).?; 3. THE I/O REQUEST PACKET BECOMES THE CURRENT REQUEST PACKET.EB; 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 ISS=; SET TO "NOECHO" MODE, THE READ MODIFIER TF.RNE WILL BE SET.:; REGARDLESS OF WHETHER THE USER SPECIFIED IT IN THE QIO.7; THE RESULTING MODIFIERS ARE SAVED IN THE I/O PACKET.A5; 5. THE TIMEOUT REQUEST MODIFIER/VALUE IS PROCESSED.T>; 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.CF; 8. CONTROL IS PASSED TO THE ROUTINES TO START BUFFERED OR UNBUFFERED!; INPUT, WHICHEVER IS NECESSARY.;S ; INPUTS:"; R3 => CURRENT I/O REQUEST PACKET; R4 => UCBX FOR THE TERMINALE"; R5 => U.TSTA OF THE TERMINAL UCB2; I.LNK(R3) = 0 IF THE REQUEST IS IO.RLB OR IO.RSD@; = 1 IF THIS IS THE READ PART OF A READ AFTER PROMPT REQUEST*; (THE PROMPT OUTPUT HAS BEEN COMPLETED) ; OUTPUTS:IA; R2 => FIRST INPUT BUFFER (IF BUFFERED INPUT IS TO BE STARTED)"$; (R4) => CURRENT I/O REQUEST PACKET0; UCB STATUS AND UCBX INITIALIZED TO START INPUT;U"; REGISTERS MODIFIED: R0, R1, R2;-;S .IF DF B$$MAPPPRSD::; CLRB I.FCN+1(R3) ;CLEAR OUT HIGH BYTE OF THE FUNCTION CODEI" BR RLB1 ;CONTINUE IN COMMON CODE .ENDC ;B$$MAP5 .SBTTL . PPRLB - READ-LOGICAL-BLOCK REQUEST (IO.RLB)IPPRLB::P .IF DF T$$EIOE BIC #S6.EIO,U.TST6-U.TSTA(R5) ;INDICATE THAT THIS IS NOT EXTENDED IOI .ENDC ;T$$EIO+ CLRB I.FCN+1(R3) ;CLEAR FLAGS IN HIGH BYTEDPPRLB1:= .IF DF T$$CCAC MOV U.TAST(R4),R0 ;GET UNSOLICITED INPUT AST BLOCK IF THERE IS ONEG! BEQ RLB1 ;IF EQ, NOT ONE...SKIPA BICB #AF.LCK,A.PRM+5(R0) ;UNLOCK THE AST BLOCK IN CASE IT WAS...E ; ...LOCKED DUE TO TF.NOT1 .ENDC ;T$$CCARLB1:: BIC #S5.ITI,U.TST00vbsSsibjbkb a a a5-U.TSTA(R5) ;INDICATE THAT THIS IS NOT  ;IMMEDIATE TIMEOUT ASSUME U.TCI,0. MOV R3,(R4)+ ;SAVE THE CURRENT PACKET ADDRESS;IM; SET UP THE FULL READ MODIFIERS FOR THE CURRENT READ REQUEST. THIS INVOLVESBI; TAKING THE MODIFIERS SPECIFIED WITH THE READ AND "OR'ING" THEM WITH THENK; PERMANENT CHARACTERISTICS FLAGS. NOTE THAT THE MODIFIERS MAY EXTEND INTOAA; THE HIGH BYTE OF I.FCN IF CONTROL WAS PASSED HERE FROM "PPEIO"..K; NOTE: IF THERE IS EVER A READ MODIFIER WITH THE SAME BIT VALUE AS S1.TSY.J; AND S3.TSY, THIS HERE ROB PHILPOTT MEMORIAL BIT SETTING CODE WILL BREAK!; ASSUME TF.RAL,S3.RALH ASSUME TF.RNE,S3.NECS ASSUME TF.RPT,S3.PTH  ASSUME TF.RES,S3.RESC? MOV I.FCN(R3),R0 ;GET ALL READ MODIFIERS (COULD BE FROM PPEIO)I- BIC #4,R0 ;CLEAR MODIFIERS THAT WON'T MAP 9 MOV 4(R5),R1 ;GET THE CURRENT INPUT CHARACTERISTICS BITSA> BIC #^C,R1 ;CLEAN THEM UP9 BIS R1,R0 ;"OR" IN PERM CHARACTERISTICS WITH TEMP FLAGSE< MOV R0,I.FCN(R3) ;SAVE THE COMPLETE FLAGS IN THE I/O PACKET; ; SET UP RST AND RSP;T5 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 FILTER5$:A1 BIT #TF.RTT,R0 ;NEW-STYLE READ WITH TERM. TABLE?, BEQ 10$ ;BR IF NOS4 BIS #S1.RST,R0 ;SAY WE'RE USING SPECIAL TERMINATORS10$: .IF DF T$$EIO MOV R0,R1 ;GET FUNCTION CODE ASSUME TF.RDI,S6.RDI  ASSUME TF.RLU,S6.RLUN4 BIC #^C,R1 ;ISOLATE RDI AND RLU BITS9 BIS R1,U.TST6-U.TSTA(R5) ;AND PLOP THEM INTO STATUS WORDR .ENDC ;T$$EIO;R'; SET UP TTSYNC AND PASTHRU AS FOLLOWS:ME; 1. OLD STYLE "TF.RAL" AND "SET /RPA (S3.RAL)" MAP INTO PASTHRU MODEC; WITH TTSYNC DISABLED.E; 2. NEW STYLE "TF.RPT" AND "PASTHRU MODE" ARE INDEPENDENT OF TTSYNC.BA; 3. IF TTSYNC IS DISABLED, TF.RPT IS EQUIVALENT TO OLD "TF.RAL". ;E ASSUME S3.RAL,S1.PTHF ASSUME S3.TSY,S1.TSY 1 BIT #TF.RAL,R0 ;WAS EITHER TF.RAL OR S3.RAL SET?T5 BEQ 20$ ;IF EQ, NO...SKIP TO CHECK FOR PASTHRU MODES: BIC #S1.TSY,(R5) ;CLEAR TTSYNC FOR OLD READ-PASS-ALL MODE8 BIC #S1.TSY,R0 ;CLEAR TTSYNC FOR OLD READ-PASS-ALL MODE5 BR 30$ ;SKIP TO FORCE PASTHRU MODE ON THE READ ALSOP20$:1 BIT #TF.RPT,R0 ;WAS EITHER TF.RPT OR S3.PTH SET?F9 BEQ 40$ ;IF EQ, NO...SKIP TO FINISH MODIFIER PROCESSINGI30$:9 BIS #S1.PTH,R0 ;BOTH TF.RPT AND TF.RAL USE PASSTHRU MODEA;MJ; ESTABLISH THE TIMEOUT VALUE TO BE USED FOR THIS READ REQUEST. NOTE THATL; NORMAL READS MULTIPLY THE TIMEOUT VALUE BY TEN. "IO.EIO" TAKE THE TIMEOUTJ; VALUE AS SPECIFIED. A ZERO TIMEOUT ON A NORMAL READ WILL TIME OUT WHICHL; IS A CHANGE FROM THE OLD BEHAVIOR. A ZERO TIMEOUT TIMES OUT IMMEDIATELY, E; RETURNING DATA THAT IS CURRENTLY IN THE TYPE-AHEAD BUFFER (IF ANY).F;B40$:. CLR R1 ;ASSUME ZERO-LENGTH TIMEOUT SPECIFIED ASSUME TF.TMO,2004 TSTB R0 ;IS USER REQUESTING A TIMEOUT ON THE READ?* BPL 70$ ;IF PL, NO...SKIP TIMEOUT CHECKS6 MOVB I.PRM+6(R3),R1 ;GET USER SPECIFIED TIMEOUT VALUE# BNE 45$ ;IF NE, NOT ZERO TIMEOUT D BIS #S5.ITI,U.TST5-U.TSTA(R5) ;INDICATE IMMEDIATE TIMEOUT IS NEEDED% BR 70$ ;AND VALUE IS READY TO STASHR45$: .IF DF T$$EIO; BIT #S6.EIO,U.TST6-U.TSTA(R5) ;WAS/IS THIS AN EXTENDED IO?S* BNE 70$ ;IF SO, INTERPRET VALUE DIRECTLY  .ENDC ;T$$EIO;S?; MULTIPLY THE SPECIFIED TIMEOUT VALUE BY TEN FOR NORMAL READS. ; 2 CMPB R1,#<377/10.> ;EXCEED MAXIMUM TIMEOUT VALUE? BLOS 50$ ;IF LOS, NO4 MOV #377,R1 ;SET MAXIMUM TIMEOUT LENGTH IN SECONDS BR 70$ ;USE THIS TIMEOUT VALUE50$: .IF DF R$$EIS% MUL #10.,R1 ;ADJUST TO UNITS OF TENT .IFF ;R$$EIS ASL R1 ;MULTIPLY BY TWOT" MOV R1,-(SP) ;SAVE PARTIAL RESULT ASL R1 ;MAKE IT X 4A ASL R1 ;MAKE IT X 8T% ADD (SP)+,R1 ;(X 8) + (X 2) = (X 10)  .ENDC ;R$$EIS70$:- MOVB R1,U.TITI-U.TIP(R4) ;SAVE TIMEOUT VALUET@ MOVB R1,I.PRM+6(R3) ;SAVE TIMEOUT VALUE IN I/O PACKET FOR LATER;I=; TURN NECESSARY MODIFIERS INTO INPUT STATUS FLAGS IN U.TSTA.T;X ASSUME TF.RST,S1.RSTS ASSUME S3.NEC,S1.RNEH ASSUME S3.RES,S1.RES ASSUME TF00vjssf__DATADATADATADATA.RNF,S1.RNF# ASSUME TF.TNE,S1.TNESD BIC #^C,R04 ;CLEAR UNDESIRED STATUS BITS FROM READ MODIFIERS3 BIS R0,(R5) ;ESTABLISH NEW INPUT PROCESSING FLAGS ( BIC #S2.CTO,2(R5) ;READ CLEARS ^O STATE8 MOVB #TF.RLB,I.FCN+1(R3) ;REMEMBER THAT THIS WAS A READ;T8; DETERMINE WHETHER OR NOT TO OUTPUT A LEADING LINEFEED.;D. BIT #S1.RNE,(R5)+ ;IS INPUT ECHOING REQUIRED? BNE 80$ ;IF NE, NO...SKIPM ASSUME S3.FDX,2002 TSTB 2(R5) ;IS THE LINE SET TO FULL DUPLEX MODE?, BMI 80$ ;IF MI, NO...SKIP LEADING LINEFEED, BIT #S2.FLF,(R5) ;NEED TO FORCE A LINEFEED?. BEQ 80$ ;IF EQ, NO...DON'T OUTPUT ONE - SKIP= MOV #PRLF,-(SP) ;OUTPUT LEADING LF WHEN WE EXIT THIS ROUTINE#80$: .IF DF T$$EIO" BIS #S1.IBY,-(R5) ;SET INPUT BUSY ASSUME S6.RDI,100000 0 TST U.TST6-U.TSTA(R5) ;DEFAULT INPUT SPECIFIED?8 BMI 90$ ;IF NE YES, BUFFER STATUS HAS ALREADY BEEN SET' BIS #S1.IBF,@R5 ;ASSUME BUFFERED INPUTM .IFF ;T$$EIO2C BIS #S1.IBY!S1.IBF,-(R5) ;SET INPUT BUSY AND ASSUME BUFFERED INPUTI .ENDC ;T$$EIO90$:B MOVB U.TCHP-U.TSTA(R5),U.TIHP-2(R4) ;SAVE INITIAL CURSOR POSITION .IF DF T$$RPR6 TST (R3) ;HAVE WE JUST FINISHED OUTPUTTING A PROMPT? BEQ RDBCHK ;IF EQ, NO...SKIP- CLR (R3) ;RESET THE COMPLETION STATUS FIELD< TST I.PRM+16(R3) ;DID THE PROMPT SUCCESSFULLY INITIALIZE... ; ...INTERMEDIATE BUFFERING?1 BEQ UNBI ;IF EQ, NO...GO AND DO UNBUFFERED READ5= MOV U.TFIB-U.TIP(R4),R2 ;ELSE, GET THE FIRST INPUT BUFFER...B- ; ...WHICH WAS ALLOCATED BEFORE PROMPTINGU BR BUFRD ;DO BUFFERED READ .ENDC ;T$$RPR.PAGEI% .SBTTL INPUT REQUEST BUFFER HANDLING? .SBTTL . RDBCHK - DETERMINE NEED FOR BUFFERED/UNBUFFERED INPUTA;OI; RDBCHK - DETERMINE THE TYPE OF INPUT BUFFERING TO BE USED ON THIS READ.U;IRDBCHK:T, CALL $TSTBF ;SHOULD WE DO A BUFFERED READ?, BCS UNBI ;IF CS, NO...DO AN UNBUFFERED ONE .IF DF T$$EIO ASSUME S6.RDI,100000R3 TST U.TST6-U.TSTA(R5) ;READING WITH DEFAULT INPUT?U. BPL 10$ ;IF EQ NO, NEED TO ALLOCATE A BUFFERB MOV U.TDIF-U.TIP(R4),R2 ;USE DEFAULT INPUT BUFFERS FOR INPUT DATA) BNE 20$ ;IF NE HAVE A BUFFER WE CAN USE, BR UNBI ;ELSE NOT ENOUGH BUFFERS AVAILABLE .ENDC ;T$$EIO10$:/ CALL ALTB ;GET A BUFFER FOR THE BUFFERED READ 3 BCS UNBI ;IF CS, FAILED...MUST DO UNBUFFERED READ 20$:& MOV R2,-(SP) ;SAVE THE BUFFER ADDRESS0 CALL $INIBF ;INITIALIZE INTERMEDIATE BUFFERING* MOV (SP)+,R2 ;RETRIEVE THE BUFFER ADDRESS .DSABL LSB- .SBTTL . BUFRD - SET UP TO DO BUFFERED INPUTA;C$; BUFRD - SET UP FOR BUFFERED INPUT.;SBUFRD:& ADD #U.TTIC-U.TIP,R4 ;POINT TO U.TTIC MOV R4,R1 ;COPY POINTERA1 MOV I.PRM+4(R3),(R1)+ ;SET UP MAXIMUM BYTE COUNTE ASSUME U.TFIB,U.TTIC+2:;C.; BUFRD1 - LINK CURRENT BUFFER TO PREVIOUS ONE;SBUFRD1:F* MOV R2,(R1) ;LINK FIRST BUFFER TO U.TFIB' .SBTTL . NXTIB - GET NEXT INPUT BUFFERC; ;+"; **-NXTIB - GET NEXT INPUT BUFFER;G; *** NOTE *** THIS ROUTINE IS ALSO CALLED AT DEVICE PRIORITY FROM THEU'; INPUT DONE INTERRUPT SERVICE ROUTINE. ;R ; INPUTS:; R2 => NEW INPUT BUFFER#; R4 => U.TTIC OF THE TERMINAL UCBX &; U.TTIC = TOTAL REMAINING BYTE COUNT;P ; OUTPUTS:+"; R4 => U.TIC OF THE TERMINAL UCBX!; NEW BUFFER LINKED TO OLD BUFFERL=; SECOND WORD OF NEW BUFFER SET UP WITH LOGICAL BUFFER LENGTH /; U.TIP, U.TIP+2, U.TIC, AND U.TTIC ARE UPDATED 8; CC-Z = 0 IF THE INPUT BYTE COUNT IS NOT YET EXHAUSTED; = 1 OTHERWISEO;*"; REGISTERS MODIFIED: R2, R3, R4;-;RNXTIB::O3 TST (R2)+ ;POINT TO SECOND WORD OF THE NEW BUFFER5 MOV #T$$BFL-4,(R2) ;SET LOGICAL LENGTH OF THE BUFFER + SUB (R2),(R4) ;ADJUST U.TTIC APPROPRIATELYN1 BPL 10$ ;IF PL, THERE IS MORE ROOM STILL...SKIPE; ADD (R4),(R2) ;WENT BELOW ZERO - ADJUST LOG. BUFFER LENGTHW CLR (R4) ;U.TTIC <-- 0 ASSUME U.TIP,U.TTIC-610$:" CMP -(R4),-(R4) ;POINT TO U.TIP+2A CMP -(R4),-(R2) ;POINT R4 TO U.TIP AND R2 TO START OF THE BUFFERD.PAGE , .SBTTL GENERAL INPUT/OUTPUT BUFFER HANDLING8 .SBTTL . UPUB - UPDATE UCBX PARAMETERS FOR BUFFERED I/O00vrsSsibjbkb a a a;R;+C; **-UPUB - UPDATE PARAMETERS IN UCBX FOR BUFFERED INPUT OR OUTPUT.E;-; THIS ROUTINE IS CALLED IN THREE SITUATIONS:B!; 1. AT PRIORITY 0 TO START INPUTS'; 2. AT DEVICE PRIORITY TO START OUTPUTZB; 3. AT DEVICE PRIORITY FROM THE OUTPUT OR INPUT INTERRUPT SERVICEA; ROUTINE TO SWITCH FROM THE CURRENT PARTIAL BUFFER TO THE NEXT.);R ; INPUTS: ; R2 => INPUT OR OUTPUT BUFFER@; R4 => U.TIP (INPUT) OR U.TOP (OUTPUT) OF THE TERMINAL'S UCBX; 2(R2) = LOGICAL BUFFER LENGTHR;O ; OUTPUTS:O; R2 => SECOND WORD OF BUFFERR(; R4 => U.TIC/U.TOC OF THE TERMINAL UCBXG; U.TIP, U.TIP+2, U.TIC (OR U.TOP, U.TOP+2, U.TOC) ARE UPDATED FOR NEXTY; PARTIAL TRANSFER.'; CC-Z = 0 IF THERE IS MORE WORK TO DO ; = 1 OTHERWISER;T; REGISTERS MODIFIED: R2, R4;-; UPUB::1 MOV R2,(R4)+ ;U.TIP+0/U.TOP+0 <-- BUFFER ADDRESSE1 CMP (R2)+,(R2)+ ;SKIP OVER LINK AND LENGTH WORDSF: MOV R2,(R4)+ ;U.TIP+2/U.TOP+2 <-- START OF DATA IN BUFFER4 MOV -(R2),(R4) ;U.TIC/U.TOC <-- BYTE COUNT FOR THIS ;(POSSIBLY PARTIAL) TRANSFER RETURN4- .SBTTL . UNBI - ESTABLISH NON-BUFFERED INPUTT;2; UNBI - DO NON-BUFFERED INPUT.);EUNBI:D$ CLR I.PRM+16(R3) ;USE $IOFIN AT END( BIC #S1.IBF,(R5) ;SHOW UNBUFFERED INPUT ASSUME U.TIP, 3 .SBTTL . UPUNB - UPDATE UCB FOR NON-BUFFERED INPUTR; ;+/; **-UPUNB - UPDATE UCB FOR NON-BUFFERED INPUT.+;K ; INPUTS:"; R3 => CURRENT I/O REQUEST PACKET"; R4 => U.TIP OF THE TERMINAL UCBX;F ; OUTPUTS:)#; R4 => U.TTIC OF THE TERMINAL UCBX >; U.TIP, U.TIP+2, U.TIC, U.TTIC UPDATED FOR NON-BUFFERED INPUT;-; REGISTERS MODIFIED: R3, R4;-;NUPUNB::O- ADD #I.PRM,R3 ;POINT TO PARAMETERS IN PACKET3? MOV (R3)+,(R4)+ ;U.TIP+0 <-- BUFFER ADDRESS (ADRS DOUBLE WORD)A> MOV (R3)+,(R4)+ ;U.TIP+2 <-- 2.ND HALF OF ADDRESS DOUBLE WORD ASSUME U.TIC, & MOV (R3)+,(R4)+ ;U.TIC <-- BYTE COUNT ASSUME U.TTIC, CLR (R4) ;U.TTIC <-- 0 RETURN ;ALL DONE .PAGEI .SBTTL INPUT REQUEST COMPLETION1 .SBTTL . FPIRD - INPUT REQUEST DONE FORK PROCESS.;,;+-; **-FPIRD - INPUT REQUEST DONE FORK PROCESS.S;S8; THIS ROUTINE IS ENTERED FROM THE FORK DISPATCHER WHEN::; 1. AN END OF LINE WAS DETECTED (OR A HARD RECEIVE ERROR)#; 2. AN INTERMEDIATE BUFFER IS FULLV@; 3. THE USER TASK BUFFER IS FULL (NON-BUFFERED SOLICITED INPUT);.F; AFTER INITIALIZING, THIS ROUTINE DISPATCHES TO PROCESS COMPLETION OF(; EITHER SOLICITED OR UNSOLICITED INPUT.; ; INPUTS:; R4 => UCBX OF THE TERMINAL"; R5 => U.TSTA OF THE TERMINAL UCB; ; OUTPUTS: NONE.;S&; REGISTERS MODIFIED: R0, R1, R2, R3;-;KFPIRD::S ASSUME U.TCI,0I) MOV (R4)+,R3 ;GET CURRENT REQUEST PACKET: ASSUME U.TIP,U.TCI+2A5 MOV (R4)+,R1 ;GET CURRENT BUFFER (IF BUFFERED INPUT)A ASSUME U.TIC,U.TIP+4. TST (R4)+ ;POINT TO U.TIC  ASSUME U.TTIC,U.TIC+24 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 READ - TST (R3) ;HAS A COMPLETION STATUS BEEN SET?M, BNE IRQDON ;IF NE, YES...COMPLETE THE READ;SK; HERE WE ARE DOING BUFFERED INPUT AND THE CURRENT BUFFER IS FULL. WE WILL L; TRY TO ALLOCATE ANOTHER BUFFER AND CONTINUE THE READ. NOTE THAT THE INPUTI; ISR HAS ALREADY CHECKED WHETHER THERE IS ANOTHER BUFFER ALLOCATED (THISTG; COULD BE THE CASE IF THE OPERATOR DID RUBOUT OR CTRL-U). IF THERE IS 7; ANOTHER BUFFER ALLOCATED ALREADY, WE DON'T COME HERE.O;;% CALL ALTB ;GET ANOTHER INPUT BUFFERE9 BCC BUFRD1 ;IF CC, LINK TO PREVIOUS BUFFER AND CONTINUEE& MOV #IE.NOD,(R3) ;SET AN ERROR STATUS ASSUME S1.USI,100000N+ TST (R5) ;ARE WE DOING UNSOLICITED INPUT?L BPL IRQDON ;IF PL, NO...SKIP;T?; UNSOLICITED INPUT REQUIRES ANOTHER BUFFER, WHICH WE FAILED TO C; ALLOCATE. THE STATUS "IE.NOD" WILL FORCE A ^U TO FLUSH THE INPUT.O; ( JMP USIDON ;COMPLETE UNSOLICITED INPUT;LG; SOLICITED INPUT REQUIRES ANOTHER BUFFER, WHICH WE FAILED TO ALLOCATE.E8; WE WILL RETURN PARTIAL INPUT WITH THE STATUS "IE.NOD".;;.PAGEN1 .SBTTL . IRQDON - AN INPUT REQUEST HAS COMPLETED3;S00vzssf__DATADATADATADATA"; IRQDON - INPUT REQUEST COMPLETED;0IRQDON:( .IF DF T$$ACD! MOV U.ACB-U.TSTA(R5),R2 ;GET ACBF+ BEQ 30$ ;TERMINAL DOESN'T HAVE ONE - JUMPR5 BIC #UA.TRA,U.AFLG-U.TSTA(R5);SET DEFAULT PROCESSING 0 MOV (R3),A.IOS(R2) ;SET INPUT COMPLETION STATUS1 MOV #A.INPU,R0 ;SET INPUT COMPLETION ENTRY POINTL CALL $SWACD ;CALL ACDR= MOV A.IOS(R2),(R3) ;SET POSSIBLY DIFFERENT INPUT STATUS CODEU8 BIT #UA.TRA,U.AFLG-U.TSTA(R5) ;TRANSFER CHARACTERS NOW? BEQ 30$ ;IF EQ, NO...SKIPE10$:! MOV U.ACB-U.TSTA(R5),R0 ;GET ACBT- ADD #A.SMAP,R0 ;POINT TO TRANSFER PARAMETERSA/ BIT #S1.IBF,(R5) ;ARE WE DOING BUFFERED INPUT?$ BEQ 20$ ;IF EQ, NO...SKIP-& MOV R1,R2 ;COPY INPUT BUFFER ADDRESS1 CMP (R2)+,(R2)+ ;POINT PAST LINK AND COUNT WORDSP& MOV R5,(R2)+ ;SAVE R5 IN INPUT BUFFER' MOV R3,(R2)+ ;ALSO SAVE PACKET ADDRESSS3 MOV (R0)+,(R2)+ ;SAVE ACD BUFFER APR BIAS (A.SMAP)I7 MOV (R0)+,(R2)+ ;SAVE ACD BUFFER DISPLACEMENT (A.SBUF)). MOV I.PRM+16(R3),(R2)+ ;SAVE TASK PCB ADDRESS6 MOV I.PRM(R3),(R2)+ ;SAVE TASK BUFFER APR BIAS OFFSET/ MOV (R0),(R2) ;SAVE ACD BUFFER LENGTH (A.SLEN)#2 BR 30$ ;TRANSFER WILL OCCUR WHEN $FINBF CALLS US20$: MOV R4,-(SP) ;SAVE R4/ MOV (R0)+,R1 ;GET ACD BUFFER APR BIAS (A.SMAP);3 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)F2 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 TIME + MOV (SP)+,R4 ;GET TASK BUFFER DISPLACEMENTH6 CALL $BLXIO ;TRANSFER FROM ACD BUFFER TO TASK BUFFER MOV (SP)+,R4 ;RESTORE R4 $ MOV U.TCI-U.TTIC(R4),R3 ;RESTORE R36 BIC #UA.CAL,U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING4 MOV #A.CALL,R0 ;SET TRANSFER COMPLETION ENTRY POINT, CALL $SWACD ;CALL ACD TO DEALLOCATE BUFFER@ BIT #UA.CAL,U.AFLG-U.TSTA(R5) ;ACD HAVE ANOTHER BUFFER TO COPY?% BNE 10$ ;IF NE, YES...LOOP TO DO ITB; BIS #UA.TRA,U.AFLG-U.TSTA(R5) ;SET FLAG FOR CHECKING LATERC30$: .ENDC ;T$$ACD* CLRB U.TITI-U.TTIC(R4) ;CLEAR INPUT TIMER/ BIT #S1.IBF,(R5) ;ARE WE DOING BUFFERED INPUT?F: BEQ SOLIDN ;IF EQ, NO...MUST BE SOLICITED INPUT, SO SKIP0 MOV (R1),R2 ;GET NEXT BUFFER (IF THERE IS ONE). CALL DELTB ;DEALLOCATE ALL REMAINING BUFFERS' CLR (R1) ;THIS IS NOW THE LAST BUFFER  ASSUME S1.USI,100000R+ TST (R5) ;ARE WE DOING UNSOLICITED INPUT?O-; BMI USIDON ;IF MI, YES...SKIP TO FINISH ITO1 BPL SOLIDN ;IF PL, NO...PROCESS SOLICITED INPUTL, JMP USIDON ;IF MI, YES...SKIP TO FINISH IT.PAGER- .SBTTL . SOLIDN - SOLICITED INPUT COMPLETION1;F$; SOLIDN - SOLICITED INPUT COMPLETED;Q ; INPUTS:"; R3 => CURRENT I/O REQUEST PACKET#; R4 => U.TTIC OF THE TERMINAL UCBXR"; R5 => U.TSTA OF THE TERMINAL UCB;OSOLIDN:R& CALL IRESEL ;RESET INPUT STATE FLAGS- BIC #S1.IBY,(R5) ;INDICATE INPUT IS NOW IDLET< BIC #S5.ITI,U.TST5-U.TSTA(R5) ;CLEAR IMMEDIATE TIMEOUT FLAG3 CLR U.TCI-U.TTIC(R4) ;CLEAR PACKET POINTER (U.TCI).; MOV U.TRTT-U.TTIC(R4),R2 ;GET THE TERMINATOR TABLE ADDRESSF BEQ 10$ ;IF EQ, NONE...SKIPI, CALL DETB ;DEALLOCATE THE TERMINATOR TABLE6 CLR U.TRTT-U.TTIC(R4) ;CLEAR TERMINATOR TABLE ADDRESS10$: .IF DF T$$RPR1 MOV U.TFPB-U.TTIC(R4),R2 ;GET PROMPT BUFFER LISTA BEQ 20$ ;IF EQ, NONE...SKIPN+ CALL DELTB ;DEALLOCATE ALL PROMPT BUFFERSB% CLR U.TFPB-U.TTIC(R4) ;CLEAR POINTERI20$: .ENDC ;T$$RPR+ MOV I.PRM+4(R3),R1 ;GET MAXIMUM BYTE COUNTR2 SUB (R4)+,R1 ;SUBTRACT REMAINING BYTES TO READ...% ; ...YIELDING BYTES ACTUALLY READA. TST (R3) ;COMPLETION STATUS ALREADY PRESENT?2 BNE 30$ ;IF NE, YES...SKIP TO COMPLETE THE INPUT- INC (R3) ;BUFFER FULL - SET STATUS = IS.SUCD .IF DF T$$ESC7 BIT #S1.ESC,(R5) ;IN THE MIDDLE OF AN ESCAPE SEQUENCE?L* BEQ 30$ ;IF EQ, NO...ALL IS OKAY SO SKIP> MOV #IE.PES&377,(R3) ;SET ERROR FOR "PARTIAL ESCAPE SEQUENCE"2 BIC #S1.ESC,(R5) ;GET OUT OF ESCAPE SEQUENCE MODE3 CLRB U.TISV-U.TFIB(R4) ;CLEAR INPUT STATE VARIABLEB .ENDC ;T$$ESC30$: .IF DF T$$EIO;D@; IF THIS WAS AN IO.EIO AN00vsSsibjbkb a a aD THERE ARE MORE CHARACTERS IN THE TAB8; AND THE SYSTEM SUPPORTS ICS, REQUEST ICS NOTIFICATION.;I; BIT #S6.EIO,U.TST6-U.TSTA(R5) ;WAS/IS THIS AN EXTENDED IO?C BEQ 50$ ;IF NOT NO ICS .IF DF T$$ICS/ MOV R3,-(SP) ;SAVE REGISTER DESTROYED BY GCTABY3 CALL GCTAB ;ANY CHARACTERS SITTING IN TYPE-AHEAD?  MOV (SP)+,R3 ;RESTORE REGISTER  BCS 40$ ;IF CS, NO - SKIPO- FRKBIT BIS,#FR.ICS ;REQUEST ICS NOTIFICATIONR .ENDC ;T$$ICS=40$: BIC #S6.EIO!S6.RLU!S6.RDI,U.TST6-U.TSTA(R5);;CLEAR FLAGS 50$: .ENDC ;T$$EIO/ BIT #S1.IBF,(R5) ;ARE WE DOING BUFFERED INPUT?E BEQ 70$ ;IF EQ, NO...SKIPT ASSUME U.TFIB,U.TTIC+2). MOV (R4),R4 ;GET FIRST INPUT BUFFER (U.TFIB)8 MOV R4,I.PRM+12(R3) ;STORE POINTER IN PACKET FOR $FINBF .IF DF T$$SPL7 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$$SPL,7 MOV KISAR5,I.PRM+14(R3) ;STORE MAPPING INFO FOR $FINBF: .IFTF ;T$$SPL60$:; MOV (R4)+,R2 ;GET LINK TO NEXT BUFFER, POINT TO BYTE COUNTT- MOV #T$$BFL,(R4) ;SET TOTAL LENGTH OF BUFFERB MOV R2,R4 ;GET NEXT BUFFER" BNE 60$ ;IF NE, FOUND ONE...LOOP70$:6 BIT #TF.XOF,I.FCN(R3) ;SEND XOFF AT INPUT COMPLETION? BEQ 80$ ;IF EQ, NO...SKIPF ASSUME S3.FDX,200) TSTB 4(R5) ;IS THIS A FULL DUPLEX LINE?N8 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$$SPLO, MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPLO" MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX .ENDC ;T$$SPL4 CALL ECHRL ;"ECHO" XOFF WITH INTERRUPTS LOCKED OUT MOV (SP)+,R3 ;RESTORE R3N80$: .IF DF T$$ACD! MOV U.ACB-U.TSTA(R5),R2 ;GET ACBM2 BEQ 90$ ;IF EQ, TERMINAL DOESN'T HAVE ONE...SKIP3 BIT #UA.TRA,U.AFLG-U.TSTA(R5) ;DOING TRANSFER NOW?B BEQ 90$ ;IF EQ, NO...SKIPT1 MOV A.IOS+2(R2),R1 ;GET TRANSFER LENGTH FROM ACBM) BIT #S1.IBF,(R5) ;DOING A BUFFERED READ?. BEQ 90$ ;IF EQ, NO...SKIPR@ INC I.PRM+12(R3) ;SET BUFFER ADDRESS ODD FOR NON-STD $FINBF USE90$: .ENDC ;T$$ACD0 CALLR DONE ;COMPLETE THE CURRENT INPUT REQUEST .PSECT MAP5.PAGEP( .SBTTL . NXTOB - GET NEXT OUTPUT BUFFER;M;+$; **-NXTOB - GET NEXT OUTPUT BUFFER.;II; *** NOTE *** THIS ROUTINE IS CALLED AT DEVICE PRIORITY FROM THE OUTPUTN; INTERRUPT SERVICE ROUTINEI;. ; INPUTS:$; R4 => U.TOP+2 OF THE TERMINAL UCBX"; R5 => U.TSTA OF THE TERMINAL UCB;G ; OUTPUTS:E+; IF THERE IS ANOTHER OUTPUT BUFFER LINKED:M ; CC-Z = 0"; R4 => U.TOC OF THE TERMINAL UCBX/; U.TOP, U.TOP+2, U.TOC UPDATED FOR NEXT BUFFERO;E; IF NOTHING MORE TO OUTPUT: ; CC-Z = 1"; R4 => U.TOP OF THE TERMINAL UCBX;E; REGISTERS MODIFIED: R2, R4;-;-NXTOB::  .IF DF T$$ACD3 BIT #S2.OBF,2(R5) ;;;ARE WE DOING BUFFERED OUTPUT?R- BEQ 10$ ;;;IF EQ, NO...RETURN WITH CC-Z = 1N .ENDC ;T$$ACD4 MOV -(R4),R2 ;;;GET START OF CURRENT BUFFER (U.TOP)9 BEQ 10$ ;;;IF EQ, THIS WAS AN ECHO...EXIT WITH CC-Z = 1 ) MOV (R2),R2 ;;;GET START OF NEXT BUFFER / BEQ 10$ ;;;IF EQ, NONE...RETURN WITH CC-Z = 1O8 MOVB OPTIMR,U.TOTI-U.TOP(R4) ;;;SET UP THE OUTPUT TIMER# JMP UPUB ;;;GO AND UPDATE THE UCBT10$:! RETURN ;;;RETURN WITH CC-Z = 1 2 .SBTTL . USIDON - UNSOLICITED INPUT HAS COMPLETED;2'; USIDON - UNSOLICITED INPUT COMPLETED.B;1E; THIS ROUTINE WILL ALLOCATE A CLI COMMAND BUFFER IN THE SYSTEM POOL.)H; THE INPUT BUFFERS ARE THEN COPIED INTO THE CLI BUFFER AND IT IS QUEUEDG; TO THE CLI TASK. IF CONTINUATION LINES ARE TO FOLLOW (LAST CHARACTER4; OF THIS BUFFER IS A HYPHEN), SIMULATE A CONTRTL-C.;P ; INPUTS:&; SECOND WORD OF FIRST RECEIVE BUFFER: ; <0 - ERRORA; 0 - BUFFER FULL; IS.SUC - SUCCESST; IS.TMO - TIME-OUT; >IS.TMO - CTRL-U COMPLETEDD;PUSIDON:M5 MOV #M$$CRB-4+1,-(SP) ;GET MAX LENGTH OF CLI COMMAND1 ;PLUS 1 FOR TERMINATOR0 SUB (R4)+,(SP) ;GET NUMBER OF BYTES READ PLUS 1 CMP (R3),#IS.TMO ;TIME-OUT? BEQ 50$ ;Y - JUMPN CMPB (R3)+,#IS.SUC ;TEST STATUS BLO 50$ ;BUFFER FULL - JUMPF BLT 40$ ;ERROR - JUMP " BGT 30$00vssf__DATADATADATADATA ;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$$SPCA BIC #UM.KIL,U.MUP-U.TSTA(R5) ;RESET CLI CONTINUATION LINE STATUS .ENDC ;T$$SPC .IF DF T$$SER; MOV #CC.TTD,-(SP) ;ASSUME NEED TO SET CC.TTD IN CLI PACKETP8 TSTB U.TFPB-U.TFIB(R4) ;HERE BECAUSE USER TYPED CTRL-C? BEQ 10$ ;N - JUMP-; BIT #UM.CMD,U.MUP-U.TSTA(R5) ;COMMAND ALREADY IN PROGRESS?U# BEQ 10$ ;N - NOTHING UNUSUAL THEN6 CLR (SP) ;DON'T SET CC.TTD SO THAT COMPLETION OF THE. ;COMMAND WE ARE ABOUT TO SEND WON'T AFFECT) ;THE SERIAL PROCESSING ALREADY IN USE10$:4 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 BIT5 BIT #UM.SER,U.MUP-U.TSTA(R5) ;CLI TYPEAHEAD ENABLED?P BEQ 20$ ;N - JUMPU= BIS #UM.CMD,U.MUP-U.TSTA(R5) ;Y - SHOW A COMMAND IS UNDERWAY-20$: .ENDC ;T$$SER0 CMP (SP),#1 ;ONE BYTE READ? (MUST BE A RETURN) BNE 100$ ;N - JUMP .IF DF T$$SPC. MOV #CC.PRM,R1 ;SET PROMPT REQUEST STATUS BIT4 BIS U.TFPB-U.TFIB(R4),R1 ;OR IN POSSIBLE CC.TTD BIT MOV R5,R2 ;GET UCB ADDRESS SUB #U.TSTA,R2 ;T. CALL $QCNTP ;QUEUE PROMPT REQUEST TO THE CLI .IFF ;T$$SPC(3 MOV #4,R1 ;Y - ONLY ALLOCATE 4 BYTES FROM THE DSRU CALL $ALOCB ;P BCS 50$ ;FAILED - JUMP MOV R0,R1 ;SAVE ADDRESSU TST (R0)+ ;SKIP PAST LINK WORD! MOV R5,(R0) ;INSERT UCB ADDRESSS8 SUB #U.TSTA-1,(R0) ;+1 TO INDICATE A SPECIAL MCR PACKET- BR 140$ ;QUEUE THIS SHORT PACKET TO THE CLIC .IFTF ;T$$SPC30$: BR 200$ ;BRANCH AIDS40$: BR 210$ ; 50$: JMP 220$ 100$:B .IFT ;T$$SPC " MOV (SP),R1 ;GET CHARACTER COUNT5 ADD #C.CTXT+77,R1 ;ROUND UP TO NEXT 32 WORD BOUNDARY < ASH #-6,R1 ;COMPUTE NUMBER OF SECONDARY POOL BLOCKS NEEDED" CALL $ALSEC ;ALLOCATE CLI BUFFER BCS 220$ ;FAILURE - JUMP! MOVB (R3),-(SP) ;SAVE TERMINATORL .IF NDF T$$SPLR2 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 IT1 MOV $MCRPT,(R2)+ ;SET CLI DISPATCHER TCB ADDRESS$ MOV R5,(R2) ;SET UCB ADDRESS SUB #U.TSTA,(R2)+ ; .IFT ;NDF T$$SPLR$ MOV 4(SP),(R2) ;SET CHARACTER COUNT .IFF ;NDF T$$SPL $ MOV 2(SP),(R2) ;SET CHARACTER COUNT .IFTF ;NDF T$$SPL DEC (R2)+ ;LESS TERMINATOR .IFT ;NDF T$$SPLL MOV (SP)+,(R2)+ ;SET STATUS BIT .IFF ;NDF T$$SPLF, MOV U.TFPB-U.TFIB(R4),(R2)+ ;SET STATUS BIT .ENDC ;NDF T$$SPL' CLR (R2)+ ;CLEAR TEXT STARTING OFFSETU$ MOVB (SP)+,(R2)+ ;INSERT TERMINATOR8 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 HANDS2" MOV 2(SP),R2 ;GET CHARACTER COUNT MOV R5,-(SP) ;SAVE UCB POINTERL .IFF ;T$$SPC' 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 BUFFER2 MOV (SP),R2 ;GET TOTAL NUMBER OF CHARACTERS READ ;PLUS TERMINATOR. MOV R0,-(SP) ;SAVE CLI COMMAND BUFFER ADDRESS TST (R0)+ ;SKIP LINK WORDR! MOV R5,(R0) ;INSERT UCB ADDRESSU SUB #U.TSTA,(R0)+ ;( MOV (R4),R1 ;GET FIRST BUFFER (U.TFIB) .IFTF ;T$$SPC110$:A* MOV (R1)+,-(SP) ;SAVE LINK TO NEXT BUFFER TST (R1)+ ;SKIP SECOND WORD$4 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 - ADJUSTR120$:R, SUB R3,R2 ;GET NUMBER OF BYTES STILL TO GO130$:E .IFT ;T$$SPCE5 MOVB (R1)+,R5 ;GET NEXT CHARACTER FROM DRIVER BUFFER  MOV R0,KISAR6 ;MAP CLI BUFFER+ MOVB R5,(R4)+ ;PUT CHARACTER IN CLI BUFFERS' MOV $DALED,KISAR6 ;REMAP DRIVER BUFFERG .IFF ;T$$SPCU' MOVB (R1)+,(R0)+ ;COPY INTO CLI BUFFER1 .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$$SPC3 MOV R0,KISAR6 ;MAP CLI BUFFER9 MOVB #CH.CR,-(R4) ;DELIMIT BUFFER00vsSsibjbkb a a a WITH A CARRIAGE RETURNE, MOVB -(R4),4(SP) ;SAVE LAST INPUT CHARACTER# MOV $DALED,KISAR6 ;REMAP DATASPACE " MOV (SP)+,R5 ;RESTORE UCB POINTER# MOV (SP)+,R4 ;RESTORE UCBX POINTER;6 MOV R0,R1 ;GET SECONDARY POOL COMMAND BUFFER ADDRESS' CALL $QCPKT ;QUEUE CLI COMMAND BUFFERS .IFF ;T$$SPCE% MOV (SP)+,R1 ;GET CLI COMMAND BUFFERO0 MOVB -2(R0),(SP) ;N - SAVE LAST INPUT CHARACTER140$:1' CALL $QMCRL ;QUEUE CLI COMMAND BUFFERP .ENDC ;T$$SPC .IF DF R$$MPL, CMPB (SP),#'- ;WAS LAST CHARACTER A HYPHEN? .IF DF A$$CLI BNE 205$ ;N - JUMP( MOV U.MUP-U.TSTA(R5),R2 ;GET CLI OFFSET+ BIC #^C,R2 ;SEPARATE OUT CLI INDEXT- MOV $CPTBL(R2),R2 ;POINT TO CLI PARSER BLOCKR5 BIT #CP.SGL,C.PSTS(R2) ;CONTINUATION LINES ACCEPTED?  .ENDC ;A$$CLI2 BEQ 300$ ;Y - CONTINUATION LINES TO FOLLOW, JUMP BR 205$ .IFTF ;R$$MPL200$:( .IFT ;R$$MPLA9 TST U.TFPB-U.TFIB(R4) ;ARE WE DOING A CONTINUATION LINE?B BPL 205$ ;PL - NO -BRANCH.@ FRKBIT BIS,#FR.KIL ;AN ERROR OCCURED, SO KILL THE CONTIN. LINE.205$:$ .ENDC ;R$$MPL TST (SP)+ ;CLEAN STACK& CALL IRESEL ;RESET INPUT STATE FLAGS< BIC #S1.USI!S1.IBY,(R5) ;CLEAR ADDITIONAL INPUT STATE FLAGS; CLR U.TFPB-U.TFIB(R4) ;CLEAN UP TEMPORARY VARIABLE WE USED 6 FRKBIT BIS,#FR.GRQ ;TRY TO GET ANOTHER REQUEST PACKET3 CLR U.TCI-U.TFIB(R4) ;CLEAR PACKET POINTER (U.TCI)% MOV (R4),R2 ;GET FIRST INPUT BUFFER.6 CALLR DELTB ;DEALLOCATE ALL INPUT BUFFERS AND RETURN;L3; ERROR DURING UNSOLICITED INPUT. THESE ERRORS ARE:,+; 1. FAILURE TO ALLOCATE CLI COMMAND BUFFER; ; 2. TIME-OUT(#; 3. BUFFER FULL WITH NO TERMINATORS$; IN EITHER CASE, SIMULATE A CTRL-U.;,210$:L0 CMPB -(R3),#IE.EOF ;END-OF-FILE (CTRL-Z TYPED)?1 BEQ 200$ ;Y - DON'T ECHO ^U (^Z ALREADY ECHOED)K220$:, BIT #S1.OBY,(R5) ;OUTPUT BUSY?S6 BNE 200$ ;Y - WE CANNOT BEGIN OUTPUT OF A ^U BECAUSE) ;OUTPUT IS ALREADY BUSY. WE CAN'T DOF ;ANYTHING BUT GIVE UPC230$: ( MOVB #CH.CTU,(SP) ;GET CTRL-U CHARACTER" ;(OVERWRITE OLD WORD ON STACK)1 BR 310$ ;REQUEST POST-FORK PROCESSING OF CTRL-U;.; CLI CONTINUATION EXPECTEDW; 300$:IA MOVB #CH.CTC,(SP) ;GET CTRL-C CHARACTER (OVER OLD WORD ON STACK)3 .IF DF T$$SPC; MOV #100000,U.TFPB-U.TFIB(R4) ;SET CLI CONTINUATION PROMPT  .ENDC ;T$$SPC310$: ;REFERENCE LABELY .IF DF T$$SER? BIC #UM.CMD,U.MUP-U.TSTA(R5) ;SHOW NO CLI COMMANDS IN PROGRESSS .ENDC ;T$$SER .IF DF T$$MOD% BITB #US.DSB!US.CRW,U.STS-U.TSTA(R5) * ;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-FORKS .IFF ;T$$SPLA; MOVB (SP)+,U.TECB-U.TFIB(R4) ;LOAD CHARACTER FOR POST-FORK0 .ENDC ;T$$SPL ;PROCESSING IN ECHO BUFFER@ FRKBIT BIS,# ;TRY TO GET ANOTHER PACKET (FR.GRQ)& ;REQUEST POST-FORK PROCESSING' ;TRY TO GET ANOTHER PACKET (FR.GRQ)* ;REQUEST POST-FORK PROCESSING (FR.PFP) RETURN ;RETURN .PAGEI% .SBTTL OUTPUT REQUEST PRE-PROCESSING0, .SBTTL . PPWLB - WRITE-SPECIAL-DATA REQUEST;L;+; **-PPWSD - WRITE SPECIAL DATAA4; **-PPRPR - WRITE THE PROMPT OF A READ-AFTER-PROMPT ; **-PPWLB - WRITE-LOGICAL-BLOCK;E ; INPUTS:; R3 I/O PACKET ADDRESS ; I.LNK = 0; R4 UCBX ADDRESS; R5 POINTER TO U.TSTA;>;R .ENABL LSBH .IF DF B$$MAPPPWSD:: 5 BIC #TF.RCU!TF.WBT,I.FCN(R3) ;CLEAR DISALLOWED BITST> MOVB I.PRM+10(R3),U.TDYP(R4) ;STORE THE DATA TYPE (4TH PARM)A CLR I.PRM+10(R3) ;NO VFC OR CURSOR POSITIONING ALLOWED (FOR CUP)06 CLR I.PRM+6(R3) ;NO VFC OR CURSOR POSITIONING ALLOWED BR WLB1 ;DO THE OUTPUT .ENDC ;B$$MAP5 .SBTTL . PPRPR - WRITE PROMPT OF A READ-AFTER-PROMPTW .IF DF T$$RPRPPRPR::P? 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+166 MOV (R2),-(SP) ;SAVE 2.ND WORD OF ADDRESS DOUBLE WORD5 MOV -(R2),2(R2) ;MOVE VFC/CURSOR-CONTROL TO I.PRM+16H- MOV -(R2),2(R2) ;MOVE BYTE COUNT TO I.PRM+14I2 MOV (SP)+,(R2) ;MOVE 2.ND WORD OF00vssf__DATADATADATADATA ADW TO I.PRM+12PPRPR1:R2 INC (R3) ;SET STATUS NON-ZERO TO INDICATE IO.RPR ;(FOR EASIER CHECKING)5 CLR U.TFOB(R4) ;CLEAR POINTER TO FIRST OUTPUT BUFFER$ .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 REQUESTR;F; PPWLB - WRITE LOGICAL BLOCK);RPPWLB::V .IF DF T$$CUP6 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, TEXTWLB1:R .ENDC ;B$$MAP& BIT #TF.CCO,I.FCN(R3) ;CANCEL CTRL-O? BEQ WLB3 ;N - JUMPWLB2:U BIC #S2.CTO,2(R5) ;Y - DO ITWLB3:.- BIT #S2.CTO,2(R5) ;OUTPUT STOPPED BY CTRL-O?;+ ;(CAN ONLY HAPPEN IF TERM. IS ATTACHED). 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 ANY. CALL DELTB ;DEALLOCATE DEFAULT INPUT BUFFERS CLR U.TDIF(R4) ;CLEAR POINTER .ENDC ;T$$EIO0 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 ADDRESSE+ MOVB I.FCN(R3),R0 ;GET IO SUBFUNCTION CODES .IF DF T$$RPR TST (R3) ;PROMPT FOR IO.RPR? BEQ 40$ ;N - JUMPC ASSUME TF.WAL,TF.BIN*4D& ASL R0 ;SHIFT SUBF. CODE LEFT 2 BITS ASL R0  .IF DF T$$CUP ASSUME TF.RCU,S2.RCUA4 BIC #TF.RCU,R0 ;CAN'T DO CURSOR RESTORE WITH IO.RPR .ENDC ;T$$CUP! BIS #S1.IBY,(R5) ;SET INPUT BUSYU4 ADD #10,R3 ;ADVANCE PACKET POINTER SO OFFSET I.PRM( ;FROM R3 POINTS AT PROMPT PARAMETERS7 MOV R2,U.TFPB(R4) ;SAVE POINTER TO FIRST PROMPT BUFFERD .ENDC ;T$$RPR40$: ASSUME S2.WAL,TF.WALD ASSUME S2.RCU,TF.RCU BIC #^C,R0+ ;CLEAR ALL BUT WAL AND RCU SUBFUNCTIONSI# TST (R5)+ ;POINT TO STATUS WORD 2 0 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+23 MOV I.PRM+4(R3),(R1)+ ;U.TTOC <-- TOTAL BYTE COUNTO ASSUME U.TFOB,U.TTOC+2A& MOV R2,(R1) ;LINK BUFFER TO LISTHEAD; ,; INTERPRET AND SAVE VERTICAL FORMAT CONTROL;A' BIC #S2.CR,(R5) ;ASSUME NO TRAILING CRC .IF DF T$$CUP- TSTB I.PRM+7(R3) ;CURSOR POSITION SPECIFIED?U BEQ 50$ ;N - JUMP 9 MOV I.PRM+6(R3),U.TOC(R4) ;Y - SAVE CURSOR POS. IN U.TOCC BIS #S2.PCU,(R5) ;SET FLAG BR 80$ ;50$: .ENDC ;T$$CUP2 MOV #VFCRT,R0 ;POINT TO RECOGNITION TABLE FOR VFC60$: TSTB (R0)+ ;END OF TABLE?P BMI 70$ ;Y - JUMPC CMPB -1(R0),I.PRM+6(R3) ;MATCH? BNE 60$ ;N - LOOPR70$:( SUB #CHRT+1,R0 ;GET INDEX IN CHRD TABLE ASL R0 ;MAKE WORD INDEXC3 MOVB CHRD(R0),U.TVFC(R4) ;STORE ENCODED VFC IN UCB$ ;(SEE MODULE "TTDAT" FOR CODING) ASSUME ,0I0 BISB CHRD+1(R0),1(R5) ;SAVE CR FLAG IN U.TSTA+280$:# TST -(R5) ;POINT TO STATUS WORD 1# .IF DF T$$RPR* MOV U.TCO(R4),R0 ;GET REAL PACKET POINTER8 MOV SP,I.PRM+16(R0) ;ASSUME WE CAN BUFFER ALL OUTPUT IN& ;ONE LIST - MAKE I.PRM+16 NON-ZERO .IFF ;T$$RPR18 MOV SP,I.PRM+16(R3) ;ASSUME WE CAN BUFFER ALL OUTPUT IN& ;ONE LIST - MAKE I.PRM+16 NON-ZERO .ENDC ;T$$RPR .DSABL LSBD.PAGET& .SBTTL OUTPUT REQUEST BUFFER HANDLING& .SBTTL . WRITE1 - FILL OUTPUT BUFFERS;S;+3; **-WRITE1 - FILL OUTPUT BUFFERS WITH OUTPUT DATA.S;2 ; INPUTS:'; U.TFOB POINTER TO FIRST OUTPUT BUFFERD; R3 POINTER TO PACKET; (ADVANCED 4 WORDS IF IO.RPR)M; R4 POINTER TO UCBX; R5 POINTER TO U.TSTA$; U.TCHP CURRENT HORIZONTAL POSITION"; U.TCVP CURRENT VERTICAL POSITION(; U.TVFC ENCODED VERTICAL FORMAT CONTROL;-; WRITE1:O .IF DF T$$RPR ASSUME U.TCHP&1,0 ASSUME U.TCVP,U.TCHP+1D> MOV U.TCHP-U.TSTA(R5),-(SP) ;SAVE CURRENT HOR. AND VERT. POS. .ENDC .IF DF T$$CUP7; SAVE CURRENT HORIZONTAL AND VERTICAL POSITION IN CASE2; CURSOR RESTORE IS REQUESTED.;I ASSUME U.TSHP&1,0 ASSUME U.TS00vsSsibjbkb a a aVP,U.TSHP+1  .IF DF T$$RPR MOV (SP),U.TSHP(R4) .IFF ;T$$RPRP! MOV U.TCHP-U.TSTA(R5),U.TSHP(R4)R .ENDC ;T$$RPR' MOV #EXPC3,EXPCP ;SET POINTER TO EXPC3C .IFTF ;T$$CUP ; TO; CHECK IF 'PURE' IO.WAL. IF IT IS 'PURE', MEANING NO VFC, CURSOR POSITIONING, HL; ETC. TRANSFER IS DONE DIRECTLY FROM A TASK BUFFER, OTHERWISE TRANSFER IS .; DONE THROUGH INTERMEDIATE TTDRV BUFFERS ; S  .IF DF T$$DMA & BIT #S2.WAL,2(R5) ;DOING IO.WAL?  BEQ 5$ ;NO 7 BIT #S5.DMA,U.TST5-U.TSTA(R5) ;CHECK FOR DMA DEVICE (' BEQ 5$ ;NO. SETUP INTERNAL BUFFERS C5 BIT #S1.IBY,(R5) ;CHECK IF IO.RPR!TF.BIN IN PROGERSS # BNE 5$ ;YES. SETUP REGULAR OUTPUTW  .IF DF T$$CUP 9 BIT #S2.PCU!S2.RCU!S2.CR,2(R5) ;CURSOR POS. REQUESTED? U W .IFF ;DF T$$CUP T0 BIT #S2.CR,2(R5) ;CARRIAGE RETURN AT THE END? D .IFTF ;DF T$$CUP ' BNE 5$ ;YES. SETUP INTERNAL BUFFERS ; .ENDC ;DF T$$CUP T R" TSTB U.TVFC(R4) ;CHECK FOR VFC & BNE 5$ ;YES. SETUP INTERNAL BUFFERS  MOV U.TCO(R4),R3 ; + MOV R1,-(SP) ;SAVE R1. $TSTBF WILL KILL ITT% CALL $TSTBF ;CHECK IF TASK IS FIXED - BCC 3$ ;NOT FIXED - USE INTERMEDIATE BUFFER!3 .IF LT T$$BFL-12 ;CHECK IF BUFFER HAS ENOUGH SPACEF .ERROR .ENDC ; ,&;SETUP TRANSFER FROM A TASK BUFFER ; . % MOV U.TFOB(R4),R2 ;GET BUFFER ADDR .$ MOV I.PRM(R3),R1 ;GET TASK BUFFER  CLR R0 ;  ASHC #6,R0 ;GET PHYS. ADDR V$ CLR (R2)+ ;CLEAR LINK WORD FOR WAL# TST (R2)+ ;STEP TO NEXT OFFSET T( MOV U.TTOC(R4),(R2)+ ;SETUP COUNTER ! MOV R0,(R2)+ ;GET HIGH 6 BITS E- MOV I.PRM+2(R3),(R2) ;GET VIRTUAL ADDRESS ' BIC #160000,(R2) ;CONVERT TO OFFSET  ADD R1,(R2) ;GET LOW ADDR F ADC -(R2) ;ADJUST HIGH BITS 2 CLR U.TTOC(R4) ;CLEAR TOTAL BYTE COUNTER IN UCBX 0 MOV (SP)+,R1 ;RESTORE R1 (SAVED BEFORE $TSTBF) ; BIC #S2.FLF,2(R5) ;;CLEAR FORCE-LF FLAG (LF IS FORCED ONLY ! ;ON ECHO, NOT ON TASK OUTPUT)V: BIS #S5.DWA,U.TST5-U.TSTA(R5); SET DMA IO.WAL IN PROGRESS JMP 80$ ;GO ON U3$: MOV (SP)+,R1 ;RESTORE R15$:M  .ENDC ;T$$DMA M R T* MOV U.TFOB(R4),R0 ;GET FIRST BUFFER IN R0+ MOV #SETOBF,-(SP) ;FIRST SET UP NEW BUFFERD .IFT ;T$$CUP)* BIT #S2.PCU,2(R5) ;CURSOR POS. REQUESTED? BEQ 10$ ;N - JUMPN- MOV U.TOC(R4),R2 ;Y - GET CURSOR COORDINATES  SUB #401,R2 ;ADJUST TO BASE 0E4 MOV #CPOS,EXPCP ;SET POINTER TO CURSOR POS. ROUTINE CALL @(SP)+ ;CALL COROUTINEA+ MOV #EXPC3,EXPCP ;RESTORE POINTER TO EXPC3S BIC #S2.PCU,2(R5) ;CLEAR FLAG BR 40$ ; .ENDC ;T$$CUP; .; CHECK IF ANY LEADING LF'S SHOULD BE INSERTED; 10$:# TSTB U.TVFC(R4) ;GET VFC CHARACTER0% BEQ 40$ ;NO LEADING LF OR FF - JUMPB .IF DF T$$RPR&T$$EIO9 BIT #S6.EIO,U.TST6-U.TSTA(R5) ;WAS THIS AN EXTENDED I/O?J BEQ 15$ ;BR IF NOT* MOV U.TCO(R4),R2 ;GET SAVED OUTPUT PACKET TST (R2) ;IS THIS IO.RPR BEQ 15$ ;IF EQ, NO6 TSTB U.TCHP-U.TSTA(R5) ;AT LEFT (OTHER RIGHT) MARGIN?" BNE 40$ ;IF NE NO, JUMP AND PRAY15$: .ENDC ; DF T$$RPR&T$$EIOL& MOVB U.TVFC(R4),R2 ;GET VFC CHARACTER BPL 30$ ;FF - JUMP20$:! MOVB #CH.LF,R2 ;ONE OR MORE LF'S30$: CALL @(SP)+ ;INSERTR INCB U.TVFC(R4) ;ANY MORE LF'S? BEQ 35$ ;N - JUMPD BMI 20$ ;Y - LOOPB' CLRB U.TVFC(R4) ;JUST DID A FF - CLEAR ;E$; INSERT CHARACTERS FROM TASK BUFFER;T35$: .IF DF T$$RPR&T$$EIOA9 BIT #S6.EIO,U.TST6-U.TSTA(R5) ;WAS THIS AN EXTENDED I/O?  BEQ 40$ ;BR IF NOT* MOV U.TCO(R4),R2 ;GET SAVED OUTPUT PACKET TST (R2) ;IS THIS IO.RPR BEQ 40$ ;IF EQ, NO. BIS #S2.ELF,2(R5) ;SET THE EAT-A-LINEFEED BIT .ENDC ; DF T$$RPR&T$$EIOV40$: ;REFERENCE LABEL .IF DF T$$ACD6 TST U.ACB-U.TSTA(R5) ;DOES THIS TERMINAL HAVE AN ACD? BEQ 48$ ;N - JUMP$? BIT #UA.TRN,U.AFLG-U.TSTA(R5) ;IN THE MIDDLE OF A TRANSLATION?E2 BNE 44$ ;Y - CONTINUE FROM POINT OF INTERRUPTION= TST U.TTOC(R4) 00vssf__DATADATADATADATA;HAVE WE ALREADY BEEN THROUGH THIS CODE PATH?E( BEQ 60$ ;Y - JUST OUTPUT A TRAILING CR:42$: BIC #UA.TRN,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 R0 E BIT #UA.TRN,U.AFLG-U.TSTA(R5) ;DOES ACD WANT TO PERFORM TRANSLATION?4 BEQ 48$ ;N - JUMP#@ CLR U.TTOC(R4) ;ACD WILL DETERMINE NUMBER OF CHARACTERS OUTPUT %44$: MOV U.ACB-U.TSTA(R5),R2 ;GET ACBP? ADD #A.SMAP,R2 ;POINT TO SYSTEM STATE BUFFER PARAMETERS OFFSETH/46$: MOV (R2)+,KISAR6 ;MAP BUFFER PASSED BY ACD:* MOVB @(R2)+,R2 ;GET CHARACTER FROM BUFFER* MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING1 CALL @(SP)+ ;INSERT CHARACTER INTO TTDRV BUFFERN! MOV U.ACB-U.TSTA(R5),R2 ;GET ACB(7 ADD #A.SMAP+2,R2 ;POINT TO SYSTEM STATE BUFFER ADDRESSS INC (R2)+ ;UPDATE POINTERI DEC @R2 ;DECREMENT COUNT4 BEQ 42$ ;ZERO - CALL ACD TO GET NEXT BUFFER IF ANY5 CMP -(R2),-(R2) ;BACKUP TO BUFFER ADDRESS DOUBLEWORDD/ BR 46$ ;LOOP TO GET AND INSERT NEXT CHARACTERE .ENDC ;T$$ACD:48$: TST U.TTOC(R4) ;ANY MORE CHARACTERS FROM TASK BUFFER?) ;(THERE WON'T BE IF WE COME HERE FROM6% ;"FPORD" TO OUTPUT A TRAILING CR)  BEQ 60$ ;N - JUMPO*50$: MOV I.PRM(R3),KISAR6 ;MAP TASK BUFFER) MOVB @I.PRM+2(R3),R2 ;GET NEXT CHARACTERS* MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING CALL @(SP)+ ;INSERT CHARACTER/ INC I.PRM+2(R3) ;UPDATE POINTER IN TASK BUFFERA+ DEC U.TTOC(R4) ;DECREMENT TOTAL BYTE COUNTS BNE 50$ ;MORE TO DO - LOOP;E,; CHECK IF TRAILING CARRIAGE RETURN REQUIRED;(60$: BIT #S2.CR,2(R5) ;INSERT CR AT END? BEQ 70$ ;N - JUMP  MOVB #CH.CR,R2 ;Y - DO IT CALL @(SP)+ ;"( BIC #S2.CR,2(R5) ;CLEAR CR AND ELF FLAG70$: .IF DF T$$CUP- BIT #S2.RCU,2(R5) ;CURSOR RESTORE REQUESTED?R BEQ 80$ ;N - JUMPC- MOV U.TSHP(R4),R2 ;Y - GET SAVED CURSOR POS.I4 MOV #CPOS,EXPCP ;SET POINTER TO CURSOR POS. ROUTINE CALL @(SP)+ ;CALL COROUTINEA+ MOV #EXPC3,EXPCP ;RESTORE POINTER TO EXPC3S BIC #S2.RCU,2(R5) ;CLEAR FLAG .ENDC ;T$$CUP80$:) MOV -(R1),R2 ;GET POINTER TO NEXT BUFFER,# BEQ 90$ ;NO UNUSED BUFFERS - JUMPN2 CLR (R1) ;END THE LIST WITH THE LAST USED BUFFER5 CLZ ;CLEAR CC-Z TO TELL DELTB TO DEALLOCATE A LIST.+ CALL DELTB ;DEALLOCATE THE UNUSED BUFFERSS90$: .IF DF T$$RPR. MOV U.TCO(R4),R3 ;RESTORE REAL PACKET POINTER .IFTF ;T$$RPR7 TST I.PRM+16(R3) ;DID WE MANAGE TO BUFFER ALL THE DATAP ;IN ONE BUFFER LIST? BEQ WRITE2 ;N - JUMP3 CALL $TSTBF ;Y - TEST IF TASK CAN BE CHECKPOINTED. BCS CLR16 ;N - JUMPM .IFT ;T$$RPRP TST (R3) ;IS THIS AN IO.RPR? BEQ 100$ ;N - JUMP .IF DF T$$EIO ASSUME S6.RDI,100000T3 TST U.TST6-U.TSTA(R5) ;READING WITH DEFAULT INPUT?O+ BPL 95$ ;IF EQ NO, MUST ALLOCATE A BUFFERUD MOV U.TDIF(R4),U.TFIB(R4) ;USE DEFAULT INPUT BUFFERS FOR INPUT DATA/ BNE 100$ ;IF NE THERE ARE SOME BUFFERS TO USE1- BR CLR16 ;ELSE NOT ENOUGH AVAILABLE BUFFERS  .ENDC ;T$$EIO,95$: CALL ALTB ;ALLOCATE FIRST INPUT BUFFER BCS CLR16 ;FAILED - JUMP, MOV R2,U.TFIB(R4) ;OK - SAVE BUFFER POINTER .IFTF ;T$$RPR100$:I0 CALL $INIBF ;INITIALIZE INTERMEDIATE BUFFERING BR WRITE2 ;START OUTPUTTCLR16:$ CLR I.PRM+16(R3) ;USE $IOFIN AT END2 .SBTTL . WRITE2 - START OUTPUT OF THE BUFFER LIST;U*; WRITE2 - START OUTPUT OF THE BUFFER LIST; WRITE2: .IFT ;T$$RPR; TST (R3) ;IO.RPR?F BEQ 10$ ;N - JUMP1= BIS #S5.RPO,U.TST5-U.TSTA(R5) ;SET PROMPT OUTPUT IN PROGRESS: CLR (R3) ;INITIALIZE STATUSU!10$: CMP (SP)+,(SP)+ ;CLEAN STACKU .IFF ;T$$RPRB TST (SP)+ ;CLEAN STACK .ENDC ;T$$RPR. MOV #STAXL,-(SP) ;START OUTPUT OF BUFFER LIST JMP LOCKI ; .PAGEA@ .SBTTL . PRLF - OUTPUT LEADING LF FOR SOLICITED INPUT IF NEEDED; =; PRLF - OUTPUT LEADING LF FOR SOLICITED INPUT AT LEFT MARGINO;UPRLF:E .IF DF T$$SPL, MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPL-" MOV U.TUX-U.TSTA(R5),R4 ;GET UCBX .ENDC ;T$$SPL5 CALL EXCR1 ;EXPAND A CARRIAGE RETURN (YIELDING LF!)( MOV #ECHSTR,-(S00vsSsibjbkb a a aP) ;OUTPUT LF JMP LOCKI.PAGEP= .SBTTL . INSERT - INSERT (EXPANSION OF) CHARACTER IN BUFFER.O;U;+P; INSERT - INSERT (THE EXPANSION OF) ONE CHARACTER IN THE CURRENT OUTPUT BUFFER.;L ; INPUTS:%; R0 CURRENT POINTER IN OUTPUT BUFFER 4; R1 POINTER TO SECOND WORD IN CURRENT OUTPUT BUFFER; R2 CHARACTER TO INSERT; R4 POINTER TO UCBX; R5 POINTER TO U.TSTA;$ ; OUTPUT:VD; 1. IF (THE EXPANSION OF) THE CHARACTER FITS IN THE CURRENT BUFFER,@; OR IF IT DOES NOT BUT ANOTHER BUFFER IS SUCCESSFULLY ALLOCATED9; AND LINKED TO THE OLD BUFFER, THE CHARACTER IS INSERTEDI4; AND THE CALLER IS CALLED BACK AS A COROUTINE WITH: ; R0 UPDATED-; R1 POINTER TO SECOND WORD IN CURRENT BUFFERE; (MAY BE A NEW BUFFER); R2 DESTROYED; R3-R5 UNCHANGED 5; THE CALLER MAY NOW LOAD ANOTHER CHARACTER IN R2 AND22; HAVE IT INSERTED BY A "CALL @(SP)+" INSTRUCTION.;R>; 2. ELSE, IF THIS IS THE PROMPT FOR AN IO.RPR, THE HORIZONTAL3; AND VERTICAL POSITION AND THE WRAP-AROUND CONTEXT 2; IS RESTORED, AND THE ERROR IE.NOD IS RETURNED TO"; THE TASK. (NO RETURN TO CALLER).; >; 3. ELSE, OUTPUT IS STARTED WITH THE CURRENT LIST OF BUFFERS.; (NO RETURN TO CALLER).;-; .ENABL LSBNINSERT:B MOV R3,-(SP) ;SAVE R310$: CLR -(SP) ;CLEAR FLAGR MOV R2,-(SP) ;SAVE CHARACTERN ASSUME U.TCHP&1,0 ASSUME U.TCVP,U.TCHP+1I3 MOV U.TCHP-U.TSTA(R5),-(SP) ;SAVE CURRENT POSITIONE* 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)  .IF DF T$$CUP2 CALL @EXPCP ;EXPAND CHAR. OR CURSOR POS. COMMAND .IFF ;T$$CUP  CALL EXPC3 ;EXPAND CHARACTER .ENDC ;T$$CUP5 BVC 15$ ;IF V IS SET, THIS CHAR. IS TO BE DISCARDEDR ASL 6(SP) ;CLEAR SAVED CARRY BR 40$ ;GO TO RESTORE STACK.15$:, BEQ 30$ ;SINGLE CHARACTER EXPANSION - JUMP ROL 6(SP) ;SAVE CC-C' ADD R2,(R1) ;UPDATE BUFFER BYTE COUNT % CMP (R1),#T$$BFL-4 ;DOES STRING FIT?C BHI 50$ ;N - JUMP 20$:* MOVB (R3)+,(R0)+ ;COPY STRING INTO BUFFER SOB R2,20$ ;LOOP BR 40$ 30$:7 CMP (R1),#T$$BFL-4 ;ROOM FOR ONE MORE CHAR. IN BUFFER? BHIS 60$ ;N - JUMP$ MOVB R2,(R0)+ ;Y - INSERT CHARACTER INC (R1) ;UPDATE BYTE COUNTT40$:< 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?S BCS 10$ ;Y - LOOP) MOV (SP)+,R3 ;N - RESTORE R3C CALL @(SP)+ ;CALL CALLER BACKT BR INSERT ;DO IT AGAIN;:-; CHARACTER EXPANSION DOES NOT FIT IN BUFFER.SF; RESTORE CURRENT HORIZONTAL AND VERTICAL POSITION AND STATE VARIABLE.;A50$:( SUB R2,(R1) ;RESTORE BUFFER BYTE COUNT;+I; RESTORE PREVIOUS WRAP AND POSITION CONTEXT. *** NOTE *** MOST BITS OFPI; U.TSTA+2 ARE MODIFIED ONLY AT SYSTEM STATE OR DURING CHARACTER ECHOING.AH; ECHOING CAN NOT INTERRUPT US HERE BECAUSE INPUT PROCESSING IS DISABLEDH; BY S1.DSI. HOWEVER, A FEW BITS ARE MODIFIED DURING INPUT PRIOR TO THEH; S1.DSI CHECK (^O, ^S, TABUF FULL). THE STATE OF THES BITS MUST NOT BE(; DISTURBED WHEN RESTORING WRAP CONTEXT.;V60$:C BIC #S2.BEL!S2.CTO!S2.CTS,(SP) ;CLEAR BITS WE DON'T WANT TO AFFECTED BIC #^C,2(R5) ;WIPE OUT BITS WE WANT TO RESET' BIS (SP)+,2(R5) ;RESTORE STATUS WORD 2D ASSUME U.TCHP&1,0 ASSUME U.TCVP,U.TCHP+1E6 MOV (SP)+,U.TCHP-U.TSTA(R5) ;RESTORE CURRENT POSITION;R ; ALLOCATE ANOTHER OUTPUT BUFFER;O) MOV -(R1),R2 ;GET POINTER TO NEXT BUFFER 4 BNE 70$ ;THERE IS A FREE BUFFER IN THE LIST - JUMP$ CALL ALTB ;ALLOCATE ANOTHER BUFFER70$:/ MOV R2,R0 ;GET BUFFER ADDRESS (IF WE GOT ONE)2 MOV (SP)+,R2 ;RESTORE CHARACTER/ MOV R2,(SP)+ ;POP FLAG WORD (DON'T TOUCH CC-C)O MOV (SP)+,R3 ;RESTORE R3T .IF DF T$$RPR BCS 80$ ;FAILED - JUMP .IFF ;T$$RPR( BCS CLR16 ;FAILED - CLEAR I.PRM+16 AND ;START OUTPUTH .ENDC ;T$$RPR% MOV R0,(R1) ;LINK NEW BUFFER TO OLDH2 .SBTTL . SETOBF - INITIALIZE OUTPUT BUFFER HEADERSETOBF: ! TST (R0)+ ;POINT TO SECOND WORD  MOV R0,R1 ;SAVE POINTER IN R1A, C00vssf__DATADATADATADATALR (R0)+ ;INITIALIZE BYTE COUNT AND POINT ;TO START OF DATA AREA# BR INSERT ;START USING NEW BUFFERR;M; FAILED TO ALLOCATE BUFFERO;  .IF DF T$$RPR80$:* MOV U.TCO(R4),R3 ;GET REAL PACKET POINTER TST (R3) ;IO.RPR?% BEQ CLR16 ;N - START PARTIAL OUTPUT  ;AFTER CLEARING I.PRM+16 TST (SP)+ ;POP RETURN ADDRESSV ASSUME U.TCHP&1,0 ASSUME U.TCVP,U.TCHP+1 6 MOV (SP)+,U.TCHP-U.TSTA(R5) ;RESTORE CURRENT POSITION- BIC #S2.WRA,2(R5) ;CLEAR WRAP-AROUND CONTEXTS; MOV #IE.NOD&377,(R3) ;GET STATUS FOR "NO BUFFER AVAILABLE"I CLR I.PRM+16(R3) ;USE $IOFIN+ ;FALL THRU TO "FPORD" TO FINISH REQUESTA .ENDC ;T$$RPR .DSABL LSBF.PAGER! .SBTTL OUTPUT REQUEST COMPLETIONR% .SBTTL . FPORD - OUTPUT REQUEST DONE;B;+; FPORD - OUTPUT REQUEST DONE.; 5; COME HERE WHEN ALL OUTPUT BUFFERS HAVE BEEN OUTPUT.R2; TRANSFER MAY OR MAY NOT BE COMPLETED - IF IT IS,5; STATUS IS STORED IN THE LINK WORD OF THE IO PACKET.;C8; THIS ROUTINE IS ENTERED FROM THE FORK DISPATCHER WITH:; R4 UCBX ADDRESS ; R5 POINTER TO U.TSTA;-;RFPORD::(! MOV U.TCO(R4),R3 ;GET I/O PACKET  TST (R3) ;STATUS PRESENT? BNE ORQDON ;Y - JUMP TST U.TTOC(R4) ;ALL DONE? BNE 10$ ;N - MORE TO DO, JUMP 1 ;NOTE - THIS CANNOT HAPPEN WHEN DOING IO.RPR!P( BIT #S2.CR,2(R5) ;TRAILING CR REQUIRED? BEQ 20$ ;IF EQ, NO...SKIPP10$: MOV R4,R1 ;POINT TO UCBX- ADD #U.TFOB,R1 ;POINT TO FIRST OUTPUT BUFFERH JMP WRITE1 ;BRANCH AID20$: INC (R3) ;SET STATUS = IS.SUCT. .SBTTL . ORQDON - OUTPUT REQUEST HAS FINISHED;I; OUTPUT DONE.;ORQDON::/ 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$$RPR? BIT #S5.RPO,U.TST5-U.TSTA(R5) ;WAS THIS PROMPT OF RPR REQUEST?T BEQ 20$ ;N - JUMPN? BIC #S5.RPO,U.TST5-U.TSTA(R5) ;CLEAR PROMPT OUTPUT IN PROGRESSP# TSTB (R3) ;HAVE AN ERROR ALREADY?T BMI 10$ ;Y - JUMPH2 FRKBIT BIS,#FR.GRQ ;TRY ANOTHER PACKET WHEN INPUT/ ;HAS BEEN STARTED (LINE MAY BE FULL DUPLEX)S JMP PPRLB1 ;NOW DO THE READN* ;(LEAVE LINK WORD NON-ZERO TO INDICATE ;DOING IO.RPR)10$:! BIC #S1.IBY,(R5) ;SET INPUT FREE% CLR U.TFPB(R4) ;CLEAR BUFFER POINTER6 TST I.PRM+16(R3) ;INTERMEDIATE BUFFERING INITIALIZED?2 BEQ 15$ ;IF EQ- NO, NO NEED TO DEALLOCATE BUFFER, MOV U.TFIB(R4),R2 ;GET INPUT BUFFER POINTER$ CALL DETB ;DEALLOCATE INPUT BUFFER15$: .IF DF T$$EIO: MOV U.TDIF(R4),R2 ;GET FIRST DEFAULT INPUT BUFFER, IF ANY. CALL DELTB ;DEALLOCATE DEFAULT INPUT BUFFERS CLR U.TDIF(R4) ;CLEAR POINTER) MOV U.TRTT(R4),R2 ;ANY TERMINATOR TABLE?T BEQ 16$ ;BRANCH IF NOT CALL DETB ;DEALLOCATE IT* CLR U.TRTT(R4) ;AND CLEAR OUT THE POINTER16$: .ENDC ;T$$EIO .ENDC ;T$$RPR20$: .IF DF T$$ACD6 TST U.ACB-U.TSTA(R5) ;DOES THIS TERMINAL HAVE AN ACD? BEQ 30$ ;N - JUMP 2 MOV #A.OUTP,R0 ;SET OUTPUT COMPLETION ENTRY POINT CALL $SWACD ;CALL ACDE .ENDC ;T$$ACD30$:+ MOV U.TFOB(R4),R2 ;GET FIRST OUTPUT BUFFER $ CALL DELTB ;DEALLOCATE ALL BUFFERS2 MOV I.PRM+4(R3),R1 ;GET NUMBER OF BYTES REQUESTED# SUB U.TTOC(R4),R1 ;SUBTRACT U.TTOC ;A@; IF A REQUEST IS ABORTED (BY TIME-OUT OR IO.KIL), WE RETURN THE>; NUMBER OF BYTES TRANSFERRED, INCLUDING THE CURRENT (PARTIAL)=; BUFFER. THERE IS NO WAY WE CAN FIND OUT HOW MANY BYTES FROMA>; THE TASK'S BUFFER CORRESPOND TO THE NUMBER OF EXPANDED BYTES'; THAT WE SENT FROM THE CURRENT BUFFER.C;  ASSUME TF.WIR,2002 TSTB I.FCN(R3) ;DOES USER WANT INPUT REDISPLAYED? .IF DF T$$BTW BMI 40$ ;IF MI, YES...DO ITP* CMPB I.PRI(R3),#251. ;WAS THIS AN IO.WBT? BNE 70$ ;N - JUMPU ASSUME S3.FDX,200 TSTB 4(R5) ;FULL DUPLEX LINE?E BMI 70$ ;Y - JUMPE40$: .IFF ;T$$BTWY4 BPL 70$ ;IF PL, NO...JUST FINISH THE INPUT REQUEST .ENDC ;T$$BTW ASSUME S1.IBY,200 TSTB (R5) ;INPUT BUSY? BPL 70$ ;N - JUMPD; =; WE JUST FINISHED AN IO.WBT THAT BROKE THROUGH AN INPUT ON AU>; NON-FULL-DUPLEX LINE. FAKE A CTRL-R TO REDISPLAY THE CURRENT ; INPUT LINE.E;C; THERE CANNOT BE A FORK REQUEST PENDING FOR00vswsibjbkb a a a INPUT DONE (OR PARTIAL2C; INPUT DONE) SINCE INPUT FORK REQUESTS ARE PROCESSED BEFORE OUTPUTT; FORK REQUESTS.;E .IF DF T$$SPL@ MOVB #CH.CTR,U.TECO-U.TSTA(R5) ;PUT CTRL-R CHAR. IN ECHO BUFFER .IFF ;T$$SPLR9 MOVB #CH.CTR,U.TECB(R4) ;PUT CTRL-R CHAR. IN ECHO BUFFERI .ENDC ;T$$SPL1 FRKBIT BIS,#FR.PFP ;REQUEST POST-FORK PROCESSINGR .IF DF T$$ESC;UC; IF WE ARE IN THE MIDDLE OF AN ESCAPE SEQUENCE, WE MUST RUB IT OUTN=; SINCE THE ESCAPE SEQUENCE AND CTRL-R ROUTINES SHARE U.TISV.P5; FURTHERMORE, CTRL-R DOES NOT WORK IF S1.ESC IS SET.Q;T& BIT #S1.ESC,(R5) ;IN ESCAPE SEQUENCE? BEQ 70$ ;N - JUMPD MOV R3,-(SP) ;SAVE R3- CALL RUBESC ;Y - RUBOUT THE ESCAPE SEQUENCEF MOV (SP)+,R3 ;RESTORE R3  .ENDC ;T$$ESC70$:? CLR I.PRM+12(R3) ;TELL $FINBF NO BUFFERS TO COPY OR DEALLOCATE.; ; FALL THRU TO "DONE"E;N.PAGE* .SBTTL DONE - GENERAL I/O DONE PROCESSING; ;+&; DONE - DO I/O COMPLETION PROCESSING.;I; 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, ; NON-0 IF $QUEBF TO BE USED;- ; OUTPUT:V; I/O REQUEST FINISHED.L;U#; REGISTERS ALTERED: R0,R1,R2,R3,R4F;-;VDONE::7 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 IOO10$: CALLR $IOFIN ;FINISH IO- .ENDOMPLETION PROCESSING.;I; INPUT:; R1 IOSB WORD 2; R3 POINTER TO PACKET .TITLE TTSUB  .IDENT /08.01/T;T1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reservedS;;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;R;O; 02-FEB-78 PETER WANNHEDEN3;0; PREVIOUSLY MODIFIED BY:P;1; P. WANNHEDEN; D. R. DONCHIN- ; T. LEKAS ; R. PHILPOTTI ; S. ADAMS ; L. KOGAN; ;I$; MODIFIED FOR RSX-11M-PLUS V4.3 BY:;I; M. W. ZAHAREE 28-JUN-89 08.003F; MWZ009 -- DON'T CLOBBER OTHER BITS WHEN INITIALIZING U.AFLG FOR ACD ; ACD CALLS. n;,; L. KOGAN 5-OCT-89 08.01s?; LK750 -- CLEAR THE NUMBER OF BYTES IN CURRENT OUTPUT BUFFER A ; (U.TOC); ;C .MCALL PKTDF$,EVNDF$T PKTDF$M EVNDF$ .PSECT MAP6; ;+9; TTSUBR - MISCELLANEOUS SUBROUTINES FOR TERMINAL DRIVER.;-;N;D..SBTTL ALUCBX - ALLOCATE A UCB EXTENSION BLOCK; ;++; ALUCBX - ALLOCATE A UCB EXTENSION (UCBX).1;P; INPUT:; R5 POINTER TO U.TSTA;J ; OUTPUT:3(; IF SUCCESS, OR IF UCBX ALREADY EXISTS:; CC-C 0; R4 POINTER TO UCBX; U.TUX POINTS TO UCBX/; UCBX INITIALIZED (ONLY IF UCBX WAS ALLOCATED) ;B ; IF FAILURE:C; CC-C 1; ; REGISTERS ALTERED: R0,R2,R4;-;C .IF NDF T$$SPL;F .ENABL LSB;. ASSUME U.TUX,U.TSTA-2.ALUCBX::MOV -(R5),R4 ;IS THERE ALREADY A UCBX? CLC ;ASSUME YES! BNE 10$ ;Y - EXIT WITH CC-C = 0N" CALL ALTB ;N - ALLOCATE A BUFFER& BCS 10$ ;FAILED - EXIT WITH CC-C = 1 MOV R2,R4 ;SAVE POINTER;; INITIALIZE A FEW CELLS;I ASSUME U.TCI,0I" ;U.TCI ALREADY CLEARED BY ALTB) CLR U.TCO(R2) ;NO CURRENT OUTPUT REQUESTD; CLR U.TOC(R2) ;NO REMAINING BYTES IN CURRENT OUTPUT BUFFER+ CLRB U.TISV(R2) ;INITIALIZE STATE VARIABLE ASSUME U.TITI&1,0 ASSUME U.TOTI,U.TITI+1S. CLR U.TITI(R2) ;CLEAR INPUT AND OUTPUT TIMERS> CLR U.TFPB(R2) ;CLEAR PROMPT BUF ADDRS/UNSOLICITED INPUT FLAG* CLR U.TRTT(R2) ;ASSUME NOT A RTT FUNCTION .IF DF T$$EIO9 CLR U.TDIF(R2) ;CLEAR FIRST DEFAULT INPUT BUFFER POINTERN .ENDC ;T$$EIO* .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB7 ADD #U.TAST,R2 ;POINT TO UNSOLICITED INPUT ACB ADDRESSC-X = U.TAST ;SYMBOL NEEDED FOR ASSUME MACROSP .IF DF T$$CCA4 CLR (R2)+ ;CLEAR ACB POINTER FOR UNSOLICITED INPUT X = X + 2  .ENDC ;T$$CCA .IF DF T$$SCA ASSUME U.TSCA,X X = X + 2C/ CLR (R2)+ ;CLEAR SWITCH CHARACTER ACB POINTER  .ENDC ;T$$SCA .IF DF T$$MHU ASSUME U.TMHA,X X = X + 2$ + CLR (R2)+ ;CLEAR MODEM HANGUP ACB POINTERT .ENDC ;T$$MHU .IF DF T$$ICS00wssf__DATADATADATADATA ASSUME U.TICA,X X = X + 2U& CLR (R2)+ ;CLEAR ICS ACB/TEP POINTER .ENDC ;T$$ICS .IF DF T$$OOB ASSUME U.TOBA,X X = X + 2 % CLR (R2) ;CLEAR OOB ACB/TEP POINTERR .ENDC ;T$$OOB* .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB MOV R4,(R5) ;SET UCBX POINTER ;EXIT WITH CC-C = 0 010$: MOV (R5)+,R4 ;RESTORE R5 AND GET UCBX IN R4! ;(OR 0 IF COMING FROM DEUCBX)M20$: RETURN ;RETURN; ; 0.SBTTL DEUCBX - DEALLOCATE A UCB EXTENSION BLOCK;;+'; DEUCBX - DEALLOCATE UCBX IF POSSIBLE. ;I; INPUT:; R5 POINTER TO U.TSTA;I ; OUTPUT:P7; IF LINE IS IDLE (BOTH INPUT AND OUTPUT), NOT ATTACHEDO); AND THERE ARE NO FORK REQUESTS PENDING,/,; THE UCBX (IF THERE IS ONE) IS DEALLOCATED.;T; REGISTERS ALTERED: R0,R2,R4M;-;R; (DEUCBX::MOV @R5,-(SP) ;GET STATUS WORD 15 BIC #^C,@SP ;CLEAR ALL BUT INPUT AND  ;OUTPUT BUSY FLAGS7 BIS U.TFRQ-U.TSTA(R5),@SP ;OR WITH FORK REQUEST FLAGS 3 BIS U.ATT-U.TSTA(R5),(SP)+ ;OR WITH ATTACH POINTERD! BNE 20$ ;IF NE DON'T DEALLOCATE  .IF DF T$$IDO. TST $MCRPT ;IS THE MCR DISPATCHER INSTALLED?/ BEQ 20$ ;IF EQ NO - DON'T DEALLOCATE THE UCBX  .ENDC ;T$$IDO MOV -(R5),R2 ;GET UCBXF BEQ 10$ ;NONE - EXIT CLR (R5)+ ;OK - CLEAR POINTERR ;FALL THRU TO "DETB";: .DSABL LSB  .IFTF ;NDF T$$SPL;C#.SBTTL DEALLOCATE A TERMINAL BUFFERP;A;+$; DETB - DEALLOCATE TERMINAL BUFFER.;S; INPUT:; R2 BUFFER ADDRESSS;L ; OUTPUT:U6; BUFFER DEALLOCATED TO TT-DRIVER POOL OR SYSTEM POOL.;I; REGISTERS ALTERED: R0,R2;-;$;O)DETB:: CMP R2,#120000 ;IN TT-DRIVER POOL?T BLO 10$ ;N - JUMP 4 MOV FREEB,@R2 ;Y - ADD TO FRONT OF FREE BUFFER LIST MOV R2,FREEB  RETURNF10$: MOV R1,-(SP) ;SAVE R1,R3( MOV R3,-(SP)A MOV R2,R0 ;GET BUFFER ADDRESST MOV #T$$BFL,R1 ;GET LENGTHF( CALL $DEACB ;DEALLOCATE TO SYSTEM POOL MOV (SP)+,R3 ;RESTORE REG'S MOV (SP)+,R1E RETURNF .PSECT MAP5* .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB.PAGEA9 .SBTTL . DQACB - AST CONTROL BLOCK WAS DEQUEUED BY SYSXT ;E;+1; **-DQACB - AST CONTROL BLOCK DEQUEUE PROCESSINGI; D; THIS SUBROUTINE IS CALLED WHEN SYSXT DEQUEUES AN AST CONTROL BLOCKK; THAT HAS A.CBL=0 AND THE DOUBLEWORD ADDRESS OF THIS ROUTINE IN A.KSR5 ANDRJ; A.DQSR. IF THIS ACB GOT MARKED FOR DELETE WHILE IT WAS IN THE AST QUEUEH; (AF.MDE SET), DEALLOCATE THE BLOCK NOW. OTHERWISE CLEAR THE FLAG THAT3; INDICATES THE BLOCK IS IN THE AST QUEUE (AF.QUE).A;$M; IF THE ACB IS FOR UNSOLICITED INPUT AST'S AND THE ACB IS NOT LOCKED (AF.LCKUJ; SET DUE TO TF.NOT CONSIDERATIONS), ATTEMPT TO GET ANOTHER CHARACTER FROM9; THE TYPEAHEAD BUFFER, WHICH WILL REQUEUE THE AST BLOCK.N;L ; INPUTS:; R0 => LINK WORD IN AST BLOCK;D; OUTPUTS: NONE.;N ; REGISTERS MODIFIED: R1,R3,R5;-;MDQACB:: ! CALL MAPD ;MAP DRIVER DATA AREAE' MOVB A.PRM+5(R0),R1 ;GET THE ACB FLAGSW ASSUME AF.MDE,200& BPL 3$ ;IF PL, NOT MARKED FOR DELETE MOV R0,-(SP) ;SAVE R0 JMP DEACB1 ;GO TO DEALLOCATE3$:N: 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 F9 TSTB A.PRM+24(R0) ;ANYTHING IN THE OOB TYPE AHEAD BUFFER0 BEQ 10$ ;IF NOT, WE'RE DONE. MOV #FR.OOB,R3 ;STILL MORE CHARACTERS WAITING9 MTPS #TTPRI ;DISABLE INTERUPTS WHILE CHANGING FORK LISTE% CALL FORK ;;;SO SET UP FORK REQUESTG MTPS #0 ;RE-ENABLE INTERPUTS BR 7$5$:N .ENDC ;T$$OOB+ BIT #TF.AST,R1 ;IS THIS ACB FOR AN IO.ATA? ) BEQ 10$ ;IF EQ, NO...NOTHING ELSE TO DO0# BIT #AF.LCK,R1 ;IS THE ACB LOCKED?5 BNE 10$ ;IF NE, YES...DON'T CHECK MORE UNSOL. INPUT* MOV A.PRM+2(R0),R5 ;GET POINTER TO U.TSTA7$:G .IF DF M$$PRO1 CLR R3 ;IF A SWITCH TO ANOTHER CPU TAKES PLACE,R* ;NO SPECIAL FORK PROCESSING ROUTINE IS* ;REQUIRED - JUST GET ANOTHER CHARACTER ;FROM THE TYPE-AHEAD BUFFERE# CALL SWCPU ;SWITCH TO CORRECT CPUB;I9; IF WE FALL THRU HERE, WE ARE ALREADY ON THE CORRECT CPU ;  .ENDC ;M$$PRO' CALL SETDSI ;DISABLE INPUT PROCESSING 10$:1 RETURN ;SIMULAT00wssibjbkb a a aE RETURN FROM A FORK PROCESSINGI. ;ROUTINE IN ORDER TO GET ANOTHER CHARACTER ;FROM THE TYPE-AHEAD BUFFER.* .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB;C;O;+@; DELTB0 - DRIVER ENTRY POINT TO DEALLOCATE INTERMEDIATE BUFFERS(; FOR INPUT REQUEST. CALLED FROM $FINBF.;; INPUT:"; R0 POINTER TO FIRST INPUT BUFFER;-;H; !DELTB0::CALL MAPD ;MAP DATA AREA  .IF DF T$$ACD$ BIT #1,R0 ;DO BUFFER TRANSFER NOW? BEQ 10$ ;N - JUMP & MOV R0,-(SP) ;Y - SAVE BUFFER ADDRESS2 CALL UBTRA ;CALL ROUTINE TO PERFORM THE TRANSFER% MOV (SP)+,R0 ;RESTORE BUFFER POINTERR DEC R0 ;MAKE EVENA .ENDC ;T$$ACD!10$: MOV R0,R2 ;GET FIRST BUFFERO% CALLR DELTB1 ;"FALL THRU" TO DELTB1R;O; ;.SBTTL DELTB - DEALLOCATE A LINKED LIST OF TERMINAL BUFFERSE;R;+0; DELTB - DEALLOCATE A LIST OF TERMINAL BUFFERS.;F; INPUT:*; R2 ADDRESS OF FIRST BUFFER IN LIST, OR 0!; CC-Z 0 IF R2 POINTS TO A BUFFERU;R ; OUTPUT:O@; BUFFER POINTED TO BY R2 AND ALL FOLLOWING BUFFERS DEALLOCATED.;L; REGISTERS ALTERED: R0,R2;-;H;R .PSECT MAP6 DELTB1:: E! MOV @R2,-(SP) ;SAVE LINK TO NEXTE# CALL DETB ;DEALLOCATE THIS BUFFER2 MOV (SP)+,R2 ;GET NEXT BUFFER(DELTB:: BNE DELTB1 ;THERE IS ONE - LOOP RETURN- A.PAGE 5 .SBTTL . IRESET - RESET INPUT STATE PROCESSING FLAGSE5; AND IRESEL (SAME AS IRESET BUT FIRST CALLS LOCKI)2;D;+%; **-IRESET - RESET INPUT STATE FLAGS0; I; THIS ROUTINE RESETS THE FLAGS IN U.TSTA THAT AFFECT THE INPUT PRE-INPUTOJ; AND INPUT PROCESSES OF THE TERMINAL DRIVER. ALL FLAGS ARE FIRST CLEAREDI; AND NEW SETTINGS ARE DERIVED FOR CERTAIN ONES FROM THE CURRENT STATE OF I; THE TERMINAL CHARACTERISTICS (U.TSTA+4). NOTE THAT THIS ROUTINE MAY BE1K; CALLED FROM EITHER INTERRUPT STATE WHEN A TERMINATOR IS SEEN OR FROM FORKS); LEVEL WHEN COMPLETING AN INPUT REQUEST.E; ; INPUTS:#; R5 => U.TSTA OF THE TERMINAL UCBE; ; OUTPUTS:T;; U.TSTA FLAGS SET ACCORDING TO CHARACTERISTICS IN U.TSTA+4T;F; REGISTERS MODIFIED: NONE. ;-;RIRESEL:: CALL LOCKI ;LOCK OUT INTERUPTSIRESET::B BIC #S1.TNE!S1.RST!S1.PTH!S1.RNE!S1.TSY!S1.RES!S1.RNF!S1.RSP,(R5) ;;CLEAR UNWANTED FLAGS. MOV 4(R5),-(SP) ;;GET CURRENT CHARACTERISTICS< BIC #^C,(SP) ;;CLEAR EXTRANEOUS FLAGS ASSUME S3.RAL,S1.PTHM ASSUME S3.NEC,S1.RNEM ASSUME S3.TSY,S1.TSYT6 BIT #S3.RAL,(SP) ;;IS TERMINAL IN READ-PASS-ALL MODE? BEQ 10$ ;;IF EQ, NO...SKIPB BIC #S1.TSY,(SP) ;;READ-PASS-ALL FORCES NO TTSYNC (S1.PTH IS SET)10$:2 BIT #S3.PTH,4(R5) ;;IS TERMINAL IN PASSTHRU MODE? BEQ 20$ ;;IF EQ, NO...SKIP2 BIS #S1.PTH,(SP) ;;SET PASSTHRU MODE IN THE FLAGS20$:. BIS (SP)+,(R5) ;;UPDATE THE INPUT STATE FLAGS RETURN ;;ALL DONE .PAGE6 .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 INTERRUPTS/; 2. CALL CALLER (OR CALL ROUTINE WHOSE ADDRESS ; IS ON TOP OF STACK); 3. DROP PRIORITY ; 4. RETURNT;-;H)LOCKI:: MTPS #TTPRI ;LOCK OUT INTERRUPTSQ CALL @(SP)+ ;;;CALL COROUTINE1$LOCKR:: MTPS #0 ;;;ALLOW INTERRUPTS RETURN ;RETURNP9; ERRORS IN GET/SET SPEED, PARITY OPTIONS OR FLOW CONTROL;A*YJLPAR:: ;DJ11, DL11 DON'T HAVE SETTABLEYLLPAR:: ;LINE PARAMETERSK0YCLPAR:: ;NEITHER DOES THE PRO VIDEO INTERFACE1 TST R1 ;WAS THIS A NOTIFICATION OF FLOW CONTROL ;CHANGE?) BEQ 10$ ;IF EQ NO - GO REPORT THE ERRORS3 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 MAPPING7 CMP (SP)+,(SP)+ ;POP RETURN ADDRESSES OF THIS AND THAT .IFF ;T$$OVL TST (SP)+ ;POP RETURN ADDRESSL .ENDC ;T$$OVL MOV (SP)+,R3 ;RESTORE R3  TST (SP)+ ;POP RETURN ADDRESST% MOV (SP)+,R1 ;RESTORE BUFFER POINTER  DEC R1 ;AND BACK IT UP/ CMP (SP)+,(SP)+ ;RETURNS FROM SPDPRM AND MCXSP  .ENDC ;D$$H11!D$$Z11!D$$V110 CALLR ERCNSC ;CONTROLLER SPEED IS NOT SETTABLE00wssf__DATADATADATADATA.PAGE!* .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB8 .SBTTL . DEACB/DEACB1 - DEALLOCATE AN AST CONTROL BLOCK;;+,; **-DEACB - DEALLOCATE AN AST CONTROL BLOCK;A>; THIS ROUTINE IS CALLED WHEN AN AST CONTROL BLOCK NEEDS TO BED; DEALLOCATED OR A TSA EVENT PACKET NEEDS TO BE PASSED TO IT'S OWNERE; FOR DEALLOCATION PROCESSING. AN ACB IS DISTINGUISHED FROM A TEP BYK; OFFSETS A.CBL/E.VSIZ. AN ACB HAS A ZERO IN THIS WORD; A TEP IS NON-ZERO.VJ; IF THE PACKET IS A TEP, IT IS MARKED FOR DELETE AND QUEUED TO THE OWNER.H; IF IT IS AN ACB, IT IS MARKED FOR DELETE AND A CHECK IS MADE TO SEE IFJ; IT IS IN A TASK'S AST QUEUE (AF.QUE SET). IF SO, IT WILL BE DEALLOCATEDJ; WHEN IT IS DEQUEUED LATER ON (WITH A CALL TO DQACB). OTHERWISE THE SIZE/; OF THE ACB IS OBTAINED AND IT IS DEALLOCATED. ;S ; INPUTS:; FOR ENTRY AT DEACB:@; (R4) => UCBX LOCATION HOLDING ADDRESS OF ACB/TEP TO DEALLOCATE/; R5 => UCB FOR THE TERMINAL IF PACKET IS A TEPO;; FOR ENTRY AT DEACB1:TF; R0 => THREAD WORD OF THE ACB (STRUCTURE HAS NEGATIVE OFFSETS) OR TEP;R; OUTPUTS: NONE.;E@; REGISTERS MODIFIED: R2 MAY BE DESTROYED BY THE OWNER ROUTINE;-; .ENABL LSBADEACB:: MOV R0,-(SP) ;SAVE R0 MOV (R4),R0 ;GET THE ACB/TEP BEQ 30$ ;IF EQ, NONE...RETURNI( 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? % BEQ 10$ ;IF EQ, YES...DEALLOCATE ITL 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 DELETEE3 CALL QUETEP ;PASS TEP TO NETWORK FOR DEALLOCATIONO BR 20$ ;SKIP TO FINISH UP 10$: .ENDC ;T$$TSA2 BISB #AF.MDE,A.PRM+5(R0) ;MARK THE ACB FOR DELETE9 BITB #AF.QUE,A.PRM+5(R0) ;IS ACB CURRENTLY IN AST QUEUE?E2 BNE 30$ ;IF NE, YES...WAIT FOR IT TO BE DEQUEUED;T%; HERE TO ACTUALLY DEALLOCATE AN ACB.O; DEACB1::& MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS MOV R1,-(SP) ;SAVE REGISTER+ MOVB A.PRM+4(R0),R1 ;GET LENGTH OF THE ACBD- CMP -(R0),-(R0) ;BACK UP TO START OF THE ACBA# CALL $DEACB ;DEALLOCATE THE BLOCKS20$: MOV (SP)+,R1 ;RESTORE REGISTER % MOV (SP)+,R3 ;RESTORE PACKET ADDRESS;30$: MOV (SP)+,R0 ;RESTORE R00 RETURN ;ALL DONEE .DSABL LSB.* .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB;+@; **-MPROT- MAP AND CALL SPECIFIED ROUTINE WITHIN THE ROOT (MAINA; APR5 MAPPING) OF THE TERMINAL DRIVER, RESTORE PREVIOUS MAPPINGK; AND RETURN TO CALLER;S ; INPUTS:R;M.; 2(SP) = ADDRESS OF APR5 ROUTINE TO BE CALLED1; (SP) = ADDRESS OF TO WHICH TO RETURN WHEN DONED;B ; OUTPUTS:;H; NONE.;:; ALL REGISTERS ARE PRESERVED.;-9 .IF DF T$$OVL ;IF SYSTEM CONTAINS MEMORY-OVERLAID TTDRV MPROT::0+ MOV 2(SP),-(SP) ;DUPLICATE ADDRESS TO CALLN7 MOV 2(SP),4(SP) ;PUT RETURN ADDRESS WHERE IT SHOULD BET' MOV KINAR5,2(SP) ;SAVE CURRENT MAPPINGH* MOV ROTMAP,KINAR5 ;MAP MAIN ROOT OF TTDRV CALL @(SP)+ ;AND CALL ROUTINEN" MOV (SP)+,KINAR5 ;RESTORE MAPPING RETURN ;RETURN TO CALLER ;+F; **-MPEXT- MAP AND CALL SPECIFIED ROUTINE WITHIN THE OVERLAY (TTEXT),/; RESTORE PREVIOUS MAPPING AND RETURN TO CALLERT; ; INPUTS:E;+; R1 = ADDRESS OF APR5 ROUTINE TO BE CALLEDY;E ; OUTPUTS:;; NONE.;V; ALL REGISTERS ARE PRESERVED.;-MPEXT::2' MOV KINAR5,-(SP) ;SAVE CURRENT MAPPINGH* MOV EXTMAP,KINAR5 ;MAP MAIN ROOT OF TTDRV CALL (R1) ;AND CALL ROUTINE " MOV (SP)+,KINAR5 ;RESTORE MAPPING RETURN ;RETURN TO CALLERK;+#; **-TRANSFERS TO AND FROM THE ROOTO;L; TRANSFER FROM TTINI TO QPEIOQPETRA::% MOV EXTMAP,KINAR5 ;MAP THE EXTENSION CALLR QPEIO1 ;JMP TO QPEIO1R;R; TRANSFER FROM QPEIO1 TO QPWLBQPWTRA:: MOV ROTMAP,KINAR5 ;MAP THE ROOT CALLR QPWLB ;JMP TO QPWLB;; TRANSFER FROM TTATT TO QUEUEQUETRA:: MOV ROTMAP,KINAR5 ;MAP THE ROOT CALLR QUEUE ;JMP TO QUEUE5 .ENDC ;T$$OVL;V;C(.SBTTL ALTB - ALLOCATE A TERMINAL BUFFER;R;+"; ALTB - ALLOCATE TERMINAL BUFFER.;L; INPUT:; NONE;S ; OUTPUT: ; IF SUCCESS:; CC-C 00; R2 POINT00wssibjbkb a a aER TO BUFFER WITH LENGTH T$$BFL BYTES.; FIRST WORD CLEARED.; ; IF FAILURE:;; CC-C 1;R; REGISTERS ALTERED: R0,R2;-;L;*ALTB:: MOV FREEB,R2 ;GET FIRST FREE BUFFER BEQ 20$ ;NONE - JUMP) MOV @R2,FREEB ;POINT TO NEXT FREE BUFFER10$: CLR @R2 ;CLEAR LINK WORD RETURNO20$: MOV R1,-(SP) ;SAVE R1# MOV #T$$BFL,R1 ;SET DESIRED LENGTHT& CALL $ALOCB ;ALLOCATE IN SYSTEM POOL MOV (SP)+,R1 ;RESTORE R1M MOV R0,R2 ;GET BUFFER IN R2O BCC 10$ ;OK - JUMP% RETURN ;ELSE RETURN WITH CARRY SET .PAGEW .IFT ;NDF T$$SPLEE.SBTTL CKTAB - CHECK FOR TYPE-AHEAD BUFFER ALLOCATION OR DEALLOCATION ;E;+=; CKTAB - CHECK WHETHER TYPE-AHEAD BUFFER SHOULD BE ALLOCATED; OR DEALLOCATED.U;; INPUT:; R5 POINTER TO U.TSTA;; S3.TAB 0 DEALLOCATE TYPE-AHEAD BUFFER IF ONE IS ALLOCATEDR); (LOSING ALL CHARACTERS STORED IN IT)R4; 1 ALLOCATE TYPE-AHEAD BUFFER IF NONE IS ALLOCATED.; (LOSING SINGLE CHARACTER IF THERE IS ONE);N; REGISTERS ALTERED: R0,R2;-; ;E(CKTAB:: CALL LOCKI ;LOCK OUT INTERRUPTS2 MOV U.TTAB-U.TSTA(R5),R2 ;;;GET TYPE-AHEAD BUFFER BEQ 10$ ;;;NONE - JUMP' BIT #1,R2 ;;;SINGLE-CHARACTER BUFFER?E BNE 10$ ;;;Y - JUMPU;B; TYPE-AHEAD BUFFER EXISTS;U( BIT #S3.TAB,4(R5) ;;;DEALLOCATE BUFFER? BNE 20$ ;;;N - JUMPE CALL DETB ;;;Y - DO IT1 CLR U.TTAB-U.TSTA(R5) ;;;SHOW NO BUFFER ANY MORER BR 20$ ;;;;Y"; TYPE-AHEAD BUFFER DOES NOT EXIST; *10$: BIT #S3.TAB,4(R5) ;;;ALLOCATE BUFFER? BEQ 20$ ;;;N - JUMPE CALL ALTB ;;;Y - DO IT BCS 20$ ;;;FAILED - JUMP3 MOV R2,U.TTAB-U.TSTA(R5) ;;;SAVE POINTER TO BUFFER CLR (R2)+ ;;;INITIALIZE HEADER MOV #*400,@R2 ;;;;U ; ALL DONE;$020$: RETURN ;;;RETURN VIA COROUTINE THAT DROPS ;;;PRIORITYR .ENDC ;NDF T$$SPL.PAGE2*.SBTTL EXPCHR - EXPAND AN OUTPUT CHARACTER;R;+A; EXPCHR - THIS MODULE CONTAINS THE ROUTINES TO EXPAND CHARACTERSE%; INTO STRINGS ON OUTPUT AS REQUIRED.B;#>; 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 MUSTI; BE REENTRANT.V;-;F;>; EXPAND A CHARACTER;O;+; EXPCHR - EXPAND A CHARACTER.;O; INPUT:; R2 CHARACTER; R5 POINTER TO U.TSTA$; U.TCHP CURRENT HORIZONTAL POSITION"; U.TCVP CURRENT VERTICAL POSITION7; S2.FLF 1 IF LINE FEED MUST BE OUTPUT BEFORE NEXT ECHOT-; S2.ELF 1 IF A LINE-FEED SHOULD BE DISCARDED#; ; OUTPUT:N); IF THE EXPANSION IS A SINGLE CHARACTER:T ; CC-Z 1A; R2 UNCHANGEDN; IF THE EXPANSION IS A STRING:E ; CC-Z 0 ; R2 LENGTH OF EXPANDED STRING ; R3 POINTER TO EXPANDED STRING4; IF CHARACTER SHOULD BE KEPT AND PRESENTED AGAIN ON2; NEXT CALL TO EXPCHR (ONLY RELEVANT IF CC-Z = 0): ; CC-C 1R-; IF CHARACTER SHOULD NOT BE PRESENTED AGAIN:N ; CC-C 0C9; IF THE CHARACTER IS A LINE-FEED AND SHOULD BE DISCARDEDU ; CC-V 1 ; R2 UNCHANGEDE ; ALWAYS:I:; 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 RETURNED ; 0 ELSEO5; S2.ELF 0 IF THE V-BIT GETS SET OR IF THE CHARACTER (; WAS ANY ONE EXCEPT CR ,ESC,BSP OR FF;I; REGISTERS ALTERED: R2,R3;L>; 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. ;-;T; .ENABL LSBH;B0EXCR1:: MOVB #CH.CR,R2 ;EXPAND A CARRIAGE RETURN BR EXPCHR ;E;O*EXPC3:: BIT #S2.WAL,2(R5) ;WRITE PASS ALL? BEQ EXPCHR ;N - JUMP SEZ ;Y - EXIT WITH CC-Z = 1 RETURN ;R;L6EXPCHR::CLR -(SP) ;INITIALIZE FLAG TO 0 TO EXIT WITH: ; CC-C = 0 (DON'T KEEP CHAR) ; CC-Z = 1 (OUTPUT CHAR)6 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) ;DISPA00wssf__DATADATADATADATATCHH;,;;.; DEFAULT CASE - NO SPECIAL THINGS IN PROGRESS;:+EXPC0:: BIT #S2.FLF,@R5 ;FORCE A LINE FEED?P BNE 40$ ;Y - JUMP  CMPB R2,#CH.ESC ;ESCAPE?R BEQ EXESC ;Y - JUMP:! CMPB R2,#CH.CR ;CARRIAGE RETURN? 0 BHI EXDEF ;N - HIGHER, CAN'T BE IN RECOGNITION$ ;TABLE - JUMP TO DEFAULT ROUTINE# BEQ EXCRJ ;CARRIAGE RETURN - JUMPI9 MOV #EXCRT,R3 ;POINT TO START OF CHAR. RECOGNITION TABLEN ;FALL THRU TO "CHRDSP";S;R!; DISPATCH ACCORDING TO CHARACTERM;2;++; CHRDSP - DISPATCH ACCORDING TO CHARACTER.A; ; INPUT:; R2 CHARACTER); R3 START OF CHARACTER RECOGNITION TABLER;A ; OUTPUT:P:; JUMPS TO CHARACTER PROCESSING ROUTINE WITH R2 UNCHANGED.;-;-;M"CHRDSP::TSTB (R3)+ ;END OF TABLE? BEQ 30$ ;Y - JUMPH CMPB R2,-1(R3) ;MATCH?I BNE CHRDSP ;N - LOOP)30$: SUB #CHRT+1,R3 ;GET OFFSET FROM CHRTE ASL R3 ;MAKE WORD INDEX3 JMP @CHRD(R3) ;JUMP TO ROUTINET.PAGEL;; ; EXPAND ESCAPER;" ASSUME U.TCVP,IHEXESC: CLR U.TCHP-(R5) ;CLEAR HORIZONTAL AND VERTICAL POSITION# JMP 180$ ;OUTPUT THE ESCAPE AS IST; ; FORCE LINE FEEDO;A240$: CMPB R2,#CH.LF ;IS THE CHARACTER A LINE FEED? BEQ EXLF ;Y - JUMP" BR 50$ ;N - NEED CHARACTER AGAIN; "; DO THE LINE FEED FOR WRAP-AROUND;C8EXPC1:: ADD #S2.WRB,@R5 ;NEXT TIME GO TO EXPC2 TO DO THE ;CHARACTER ITSELFR BR 50$ ;;R;;0; EXPAND FORM FEED AND VERTICAL TAB IF NECESSARY;PEXVT::.EXFF:: BIT #S4.HFF,4(R5) ;SIMULATE FORM FEEDS? BNE 110$ ;N - JUMP;-550$: COMB 1(SP) ;WE NEED CHARACTER AGAIN, EXIT WITH: ; CC-C = 1 (KEEP CHAR) ; CC-Z = 0 (OUTPUT STRING);A;0; EXPAND LINE FEED;H+EXLF:: BIC #S2.FLF,@R5 ;CLEAR FORCE-LF FLAGP' BIT #S2.ELF,@R5 ;SHOULD WE EAT THE LF? BEQ 55$ ;BR IF NOR. BIC #S2.ELF,@R5 ;NEXT SHOULD NOT BE DISCARDED@ CMP -(R5),(SP)+ ;POINT TO U.TSTA AND POP THE FLAG OFF THE STACK SEV ;SET STATUS BIT RETURN 55$: MOV #ASLF,R3 ;POINT TO LF BIS #400,@SP ;EXIT WITH:I ; CC-C = ? (NO CHANGE) ; CC-Z = 0 (OUTPUT STRING)9 INCB U.TCVP-(R5) ;UPDATE CURRENT VERTICAL POS.E3 CALL 190$ ;RESET POSITION IF CROSSED A PAGE LIMITX* 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 - JUMPP"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?I BNE 90$ ;N - JUMPS980$: BIC #140000,@SP ;Y - DON'T WANT CHAR AGAIN EXIT WITH( ; CC-C = 0 (DON'T KEEP)< ; CC-Z = 0 (OUTPUT STRING)* ; CC-N = 0 (INSURE CC-V = 0 AFTER ROL)+90$: BIT #U2.CRT,U.CW2-(R5) ;CRT?  BEQ 120$ ;N - JUMP1 MOV #4,R2 ;Y - ECHO 4 LF'S IN PLACE OF FF OR VTB+ SUB R2,R3 ;POINT TO FIRST OF 4 LINE FEEDS + BIT #S4.VFL,4(R5) ;VERTICAL FILL REQUIRED?C BEQ 100$ ;N - JUMP0 MOV #<1+NLFF>*4,R2 ;Y - ECHO 4 LF'S PLUS FILLER, SUB R2,R3 ;POINT TO START OF OUTPUT STRING@100$: MOVB U.TCVP-(R5),-(SP) ;UPDATE VERTICAL POSITION4 ADD #3,@SP ;(ADD 3 SINCE 1 LF WAS ALREADY COUNTED)@ MOVB (SP)+,U.TCVP-(R5) ;MUCH PAIN FOR ADD TO ODD ADRS5 CALL 190$ ;CORRECT POSITION IF CROSSED A PAGE LIMIT;" BIC #140000,@SP ;DON'T KEEP CHAR 5110$: BR 180$ ;FILL CHARACTERS ALREADY ACCOUNTED FORF,120$: MOV #1,R2 ;ASSUME NO FILLERS REQUIRED+ BIT #S4.VFL,4(R5) ;VERTICAL FILL REQUIRED?1 BEQ 180$ ;N - JUMP0 ADD #NLFF,R2 ;Y - ADD NUMBER OF FILL CHARACTERS/ BR 180$ ;DON'T CHANGE HOR. POS. OR BYTE COUNT-;);P; EXPAND BACKSPACE;"EXBSP:: TSTB @SP ;AT LEFT MARGIN?- BEQ 180$ ;Y - EXIT (DON'T CHANGE HOR. POS.)( DECB @SP ;N - BACKSPACED BR 170$ ;EXIT$;CEXCRJ: BR EXCR ;BRANCH AIDP; ;ID; CR AND LF FOR WRAP-AROUND HAVE BEEN DONE. DO THE CHARACTER ITSELF.;; NOTE - THE CHARACTER MUST BE EITHER A HORIZONTAL TAB OR A 9; "NORMAL" CHARACTER, SINCE ONLY THOSE CAUSE WRAP-AROUND.Q;02EXPC2:: BIC #S2.WRA,@R5 ;CLEAR WRAP-AROUND CONTEXT CMPB R2,#CH.HT ;HORIZONTAL TAB? BNE EXDEF ;N - JUMPN;;; EXPAND HORIZONTAL TAB;X(EXHT:: MOV @SP,R3 ;GET CURREN00wssibjbkb a a aT HOR.POS.& BIC #S2.ELF,@R5 ;CLEAR DISCARD LF BIT- BIS #7,@SP ;POINT JUST BEFORE NEXT TAB STOPC. 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 1A NEG R2 ;MAKE POSITIVET INC R2 ;ADJUST MOV #ASHT,R3 ;POINT TO HTAB- BIS #400,@SP ;OUTPUT IS A STRING, EXIT WITH:H ; CC-C 0 (DON'T KEEP CHAR.)N ; CC-Z 0 (OUTPUT STRING) BR 130$ ;CHECK FOR WRAP-AROUND;;; ; EXPAND NORMAL CHARACTERE;@EXDEF:: & BIC #S2.ELF,@R5 ;CLEAR DISCARD LF BIT% BIT #140,R2 ;NON-SPACING CHARACTER?R BEQ 180$ ;Y - EXIT> BIT #U3.UPC,U.CW3-(R5) ;TERMINAL SUPPORT LOWERCASE? BEQ 130$ ;Y - JUMP4 ;NOTE THAT LOWER TO UPPER CASE CONVERSION IS NOT4 ;PERFORMED HERE FOR THE GR CHARACTER SET SINCE A4 ;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 UPPERCASET5130$: CMPB @SP,U.CW4-(R5) ;AT RIGHT MARGIN?T BLO 160$ ;N - JUMP& BIT #S3.ACR,2(R5) ;AUTO CR-LF WANTED? BEQ 160$ ;N - JUMP. 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 RETURNR;E;E; EXPAND A CARRIAGE RETURN; EXCR:: BIS #400,@SP ;EXIT WITH:K ; CC-C = ? (NO CHANGE) ; CC-Z = 0 (OUTPUT STRING) ASSUME S4.HFL,7) MOVB 4(R5),R2 ;GET HOR. FILL REQUIREMENTG& BIC #^C,R2 ;CLEAR OTHER BITS CMP R2,#7 ;FILL FOR LA30S? BNE 150$ ;N - JUMP' MOVB @SP,R2 ;Y - GET CURRENT HOR.POS.T .IF DF R$$EIS ASH #-3,R2 ;DIVIDE BY 8( .IFFR ASR R2 ;DIVIDE BY 8E ASR R2A ASR R2  .ENDC! CMP R2,#9. ;WITHIN TABLE RANGE?  BLOS 140$ ;Y - JUMPR& MOV #9.,R2 ;N - SET TO HIGHEST VALUE2140$: MOVB HORFT(R2),R2 ;GET FILL COUNT FROM TABLE150$: MOV #ASCR,R3 ;POINT TO CR(, MOVB #-1,@SP ;INITIALIZE CURRENT HOR. POS." ;BOTH BYTE COUNT AND HOR. POS. ;WILL BE INCREMENTED ON EXIT/ BIS #S2.FLF,@R5 ;FORCE A LINEFEED ON NEXT ECHOU INC R2 ;INCR. BYTE COUNT;E;H!160$: INCB @SP ;UPDATE HOR. POS.#=170$: MOVB @SP,U.TCHP-(R5) ;STORE UPDATED HOR. POS.R!180$: TST -(R5) ;POINT TO U.TSTA9 CLRB @SP ;CLEAR LOW BYTE) ROL (SP)+ ;GET FLAGS TO GENERATE PROPER  ;CONDITION CODES RETURN ;R;R6190$: CMPB U.TCVP-(R5),U.TLPP-(R5) ;CROSSED A PAGE LIMIT? BLO 200$ ;N - RETURN+ CLRB U.TCVP-(R5) ;Y - RESET TO 0L' BIT #U2.CRT,U.CW2-(R5) ;CRT?5 BEQ 200$ ;N - RETURN1 MOVB U.TLPP-(R5),U.TCVP-(R5)  ;Y - CRT'S SCROLL, NOT ROLL$8 DECB U.TCVP-(R5) ;CURSOR STAYS ON BOTTOM LINE 200$: RETURN; .DSABL LSBT;9;C  .IF DF T$$CUP E.PAGE(=.SBTTL CPOS - SUBROUTINE TO EXPAND CURSOR POSITIONING COMMANDT; ;+@; CPOS - EXPAND CURSOR COORDINATES TO CURSOR POSITIONING COMMAND!; SUITABLE FOR THE TERMINAL TYPE.;; ; INPUT:,; R2 LOW BYTE: COLUMN NUMBER (STARTING AT 1)); HIGH BYTE: LINE NUMBER (STARTING AT 1)Q; R5 POINTER TO U.TSTA;. ; OUTPUT:A); R2 LENGTH OF CURSOR POSITIONING COMMANDT*; R3 POINTER TO CURSOR POSITIONING COMMAND; CC-C 0; CC-Z 0;B; REGISTERS ALTERED: R2,R3;-;B;SCPOS::;0; USE U.TTYP TO DETERMINE HOW TO EXPAND COMMAND.;I- MOVB U.TTYP-U.TSTA(R5),R3 ;GET TERMINAL TYPE+" BEQ CPOS0 ;NOT RECOGNIZED - JUMP CMP R3,#TTPHI ;RECOGNIZED?D BHI CPOS0 ;N - JUMPR: 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 .IFFP ASL R3 ;SHIFT INTO BITS 9-10 ASL R3 ; ASL R3 ; SWAB R3 ;GET IT IN BITS 1-2R .ENDC# BIC #^C6,R3 ;CLEAR ALL OTHER BITS05 BEQ CPOS0 ;NO CURSOR POSITIONING IMPLEMENTED - JUMP( MOV R2,-(SP) ;SAVE ORIGINAL COORDINATES' BIC #100000,R2 ;CLEAR SCREEN CLEAR BIT;2 MOV R2,U.TCHP-U.TSTA(R500wssf__DATADATADATADATA) ;SET NEW CURSOR POSITION& JMP @CPOST-2(R3) ;JUMP VIA JUMP TABLE .ENABL LSBR;V-; TYPE 0 - CURSOR POSITIONING NOT IMPLEMENTEDI;6)CPOS0: CLR R2 ;EXPAND INTO A SINGLE NULLT) RETURN ;RETURN WITH CC-C = 0, CC-Z = 1N;B; TYPE 1 - VT05 ;3CPOS1:: ADD #401*40,R2 ;BIAS BOTH COORDINATES BY 40 MOVB R2,CP1+20 ;STORE X COORD.B& SWAB R2 ;GET Y COORD. AND CLEAR CC-C MOVB R2,CP1+13 ;STORE Y COORD.P MOV #7,R2 ;STRING LENGTH = 7" MOV #CP1+12,R3 ;POINTER TO STRING$ TST (SP)+ ;CLEAR SCREEN REQUESTED? CLZ ;(LEAVE CC-Z CLEAR) BPL 10$ ;N - RETURNT3 SUB #12,R3 ;POINT TO CLEAR SCREEN ESCAPE SEQUENCEN0 ADD #12,R2 ;ADD THAT TO CURSOR POSITION OUTPUT10$: RETURN ;RETURNT; ; TYPE 2 - VT52 AND VT50H-; ;CPOS2:: SWAB R2 ;GET COLUMN IN HIGH BYTE, LINE IN LOW BYTET, ADD #401*40,R2 ;BIAS BOTH COORDINATES BY 40+ MOV #CP2+6,R3 ;POINT TO COMMAND STRING + 2C MOV R2,@R3 ;STORE COORDINATESD4 TST -(R3) ;POINT TO START OF STRING AND CLEAR CC-C MOV #4,R2 ;LENGTH = 4P$ TST (SP)+ ;CLEAR SCREEN REQUESTED? CLZ ;(LEAVE CC-Z CLEAR) BPL 10$ ;N - RETURN26 SUB #4,R3 ;Y - POINT TO CLEAR SCREEN ESCAPE SEQUENCE BR 20$ ;FINISH IT OFFS;O; TYPE 3 - VT100; !CPOS3:: MOV R0,-(SP) ;SAVE R0, R1  MOV R1,-(SP) ;:' MOV #CP3A,R3 ;POINT AT FINAL CHARACTER $ CALL 30$ ;EXPAND X-COORD. TO ASCII! MOVB #';,-(R3) ;INSERT DELIMITER3 SWAB R2 ;GET Y-COORD.  CALL 30$ ;EXPAND ITR MOV (SP)+,R1 ;RESTORE R0, R1I MOV (SP)+,R0 ;R3 MOVB #'[,-(R3) ;INSERT CONTROL SEQUENCE INTRODUCERP$ MOVB #CH.ESC,-(R3) ; .. (BACKWARDS) MOV #CP3A+1,R2 ;6 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 - RETURNS MOVB #'J,-(R3) ;INSERT...3 MOVB #'2,-(R3) ;...CLEAR SCREEN ESCAPE SEQUENCE...L) MOVB #'[,-(R3) ;...INTO OUTPUT STRING...,! MOVB #CH.ESC,-(R3) ;...BACKWARDS 320$: ADD #4,R2 ;ADD THAT TO CURSOR POSITION OUTPUT  RETURN ;RETURNM30$: CLR R1 ; BISB R2,R1 ;GET NUMERIC VALUEE 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$$EIST40$: MOV R1,R0 ;GET DIVIDENDE MOV #10.,R1 ;GET DIVISOR CALL $DIV ;DIVIDE BY 10 .ENDC ;R$$EIS) BIS #'0,R1 ;BIAS REMAINDER BY ASCII /0/C MOVB R1,-(R3) ;STORE IN STRING  MOV R0,R1 ;GET QUOTIENT! BNE 40$ ;NON-ZERO - DO IT AGAIN RETURN ;RETURND A .ENDC ;T$$CUP N .DSABL LSBT.PAGER,.SBTTL UBTRA - BUFFERED ACD TRANSFER ROUTINE; ;+@; UBTRA - TRANSFER BUFFERS FROM THE ACD TO A TASK AT $FINBF TIME;A; INPUT:5; R0 ADDRESS OF BUFFER CONTAINING TRANSFER PARAMETERS$;T ; OUTPUT:VC; THE CHARACTERS DESCRIBED BY THE BUFFER PARAMETERS ARE TRANSFERREDD;; FROM THE ACD TO THE TASK. THE ACD IS THEN CALLED BACK TO A; DEALLOCATE ITS BUFFER AND POSSIBLY TO REQUEST ANOTHER TRANSFER.I;; REGISTERS ALTERED: ALL;-;I; .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 ADDRESSN1 MOV I.PRM+2(R3),R4 ;GET TASK BUFFER DISPLACEMENT10$: MOV R3,-(SP) ;SAVE R3/ MOV (R0)+,R1 ;GET ACD BUFFER APR BIAS (A.SMAP)U3 MOV (R0)+,R2 ;GET ACD BUFFER DISPLACEMENT (A.SBUF)M* SUB #20000,R2 ;CONVERT TO AN APR5 MAPPING# MOV (R0)+,R3 ;GET TASK PCB ADDRESST$ MOV P.REL(R3),R3 ;GET TASK APR BIAS+ ADD (R0)+,R3 ;COMPUTE TASK BUFFER APR BIAST/20$: MOV (R0),R0 ;GET TRANSFER LENGTH (A.SLEN)# CALL $BLXIO ;PERFORM THE TRANSFERO3 MOV R3,R1 ;SAVE R3 IN CASE ACD CONTINUES TRANSFERT) MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSG6 BIC #UA.CAL,U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING2 MOV #A.CALL,R0 ;SET TRANSFER CALLBACK ENTRY POINT CALL $SWACD ;CALL ACDF+ BIT #UA.CAL,U.AFLG-U.TSTA(R5) ;MORE TO GO?O BEQ 30$ ;N - JUMPI* MOV R3,-(SP) ;Y - SAVE I/O PACKET ADDRESS) MOV R1,R3 ;RESTORE TASK BUFFER APR BIAS0! MOV U.ACB-U.TSTA(R5),R0 ;GET ACBT/ ADD #A.SMAP,R0 ;POINT TO ACD BUFFER PARAMETERS& MOV (R0)+,R1 ;GET ACD BUFFER APR BIAS* MOV (R0)+,R2 ;GET ACD BUFFER DISPLACEMENT* SUB #20000,R2 ;CONVERT TO AN APR5 MAP00wtxtibjbkb a a aPING BR 20$ ;DO THE TRANSFERL 30$: RETURN; .ENDC ;T$$ACD .END#A.CALL,R0 ;SET TRANSFER CALLBACK ENTRY POINT CALL $SWACD ;CALL ACDF+ BIT #UA.CAL,U.AFLG-U.TSTA(R5) ;MORE TO GO?O BEQ 30$ ;N - JUMPI* MOV R3,-(SP) ;Y - SAVE I/O PACKET ADDRESS) MOV R1,R3 ;RESTORE TASK BUFFER APR BIAS0! MOV U.ACB-U.TSTA(R5),R0 ;GET ACBT/ ADD #A.SMAP,R0 ;POINT TO ACD BUFFER PARAMETERS& MOV (R0)+,R1 ;GET ACD BUFFER APR BIAS* MOV (R0)+,R2 ;GET ACD BUFFER DISPLACEMENT* SUB #20000,R2 ;CONVERT TO AN APR5 MAP .TITLE ERRORF .IDENT /12.01/0;R,; Copyright (c) 1995 by Mentec, Inc., U.S.A.; All rights reserved.;U;S<; 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; ;N+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:.;( ; S. C. ADAMSF; J. R. KAUFFMAN; J. M. LAWLER;,+; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:M;$; B. S. MCCARTHY; +; MODIFIED FOR RSX-11M-PLUS VERSION 4.3 BY:R;E ; K. L. NOEL;+; Modified for RSX-11M-PLUS VERSION 4.6 by: ;t; D. Carroll 18-Oct-1995 12.01s7; DC404 - Include PSECT statement to allow ICB pool toN; be fully extended by SYSGENN;I;C; ERROR LOGGING ;M;S; MACRO LIBRARY CALLS ;J8 .MCALL CLKDF$,EPKDF$,F11DF$,HDRDF$,HWDDF$,PKTDF$,UCBDF$& EPKDF$ ;DEFINE ERROR PACKET OFFSETS. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404;+:; **-$BMSET-SET THE UNIT'S ACTIVE INTERRUPT BIT IN THE SCB;F;; THIS COROUTINE RAISES THE PROCESSOR PRIORITY TO SEVEN ANDi7; SETS THE INTERRUPT ACTIVE BIT IN THE SCB, RECALLS THE1:; CALLER TO START THE FUNCTION AND THEN ALLOWS INTERRUPTS.; ; INPUTS:N; ; R4=ADDRESS OF THE SCBS;N ; OUTPUTS:;O*; THE INTERRUPT ACTIVE BIT (S2.ACT) IS SET;-'$BMSET::MTPS #PR7 ;LOCK OUT INTERRUPTS$3 BIS #S2.ACT,S.ST2(R4) ;;;SHOW INTERRUPT IS ACTIVES" CALL @(SP)+ ;;;RECALL THE CALLER MTPS #0 ;;;ALLOW INTERRUPTSEBMXIT: RETURN ;EXIT ;+; **-$DTOER-LOG DEVICE TIMEOUTSR6; **-$DVTMO-LOG DEVICE TIMEOUTS FOR OVERLAPPED DEVICES;TA; THIS ROUTINE IS CALLED TO LOG A DEVICE TIMEOUT ERROR CONDITION. @; IF ENTRY IS AT $DTOER THE CONTROLLER'S INTERRUPT ENABLE BIT IS<; RESET AND THE PROCESSOR PRIORITY IS DROPPED TO ZERO. IF A:; DIAGNOSTIC FUNCTION WAS IN PROGRESS, NO ERROR IS LOGGED.;R ; INPUTS:S;28; R2=ADDRESS OF A BLOCK OF REGISTERS TO LOG (MUST BE THE"; CSR ADDRESS IF KS.MBC IS SET); R4=SCB ADDRESS; R5=UCB ADDRESS;I ; OUTPUTS:;$"; R0=IE.DNR&377 (DEVICE NOT READY); R1=ADDRESS OF I/O PACKET9; C=0 IF FUNCTION WAS NOT A USER MODE DIAGNOSTIC FUNTION.E6; THE ERROR LOG PACKET IS FILLED AND THE SCB CONTAINS6; A POINTER TO IT. THE ERROR IN PROGRESS FLAG IS SET; IN THE SCB.?; C=1 IF FUNCTION WAS A USER MODE DIAGNOSTIC FUNCTION. IN THISR8; CASE ONLY THE INTERRUPT ENABLE BIT IS CLEARED AND THE; PRIORITY IS LOWERED TO ZERO.M;- .ENABL LSBR/$DTOER::MOV (R2),$DVSAV ;;;SAVE CONTENTS OF CSR5. BIC #100,(R2) ;;;DISABLE THE DEVICE INTERRUPT MTPS #0 ;;;ALLOW INTERRUPTSE BR 5$ ;A-$DVTMO::MOV (R2),$DVSAV ;SAVE CONTENTS OF CSRG75$: MOV #IE.DNR&377,R0 ;SET DEVICE NOT READY ERROR CODEH/ BIC #S2.ACT,S.ST2(R4) ;SET INTERRUPT INACTIVE 8 MOV S.PKT(R4),R1 ;PICK UP THE ADDRESS OF THE I/O PACKET* SEC ;ASSUME IT IS A DIAGNOSTIC FUNCTION6 BITB #IQ.UMD,I.FCN(R1) ;IS IT A DIAGNOSTIC FUNCTION? BNE BMXIT ;IF NE YES .IF DF E$$LOG .IFTF ; DF E$$LOG> MOV #$DVTM2,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON* CALL $MPDC2 ;MAP AND CALL CODE IN SECOND ;DIRECTIVE COMMON RETURNO;+; **-$DVERR-LOG A DEVICE ERROR/; **-$DVCER-LOG A DEVICE ERROR (ALTERNATE NAME)R;DD; THIS ROUTINE IS CALLED TO LOG A DEVICE ERROR. AN ERROR LOG PACKETC; WILL BE ALLOCATED AND THE CONTEXT OF THE CURRENT TRANSFER WILL BENG; SAVED. IF AN ERROR IS ALREADY IN PROGRESS FOR THIS DEVICE, THE ERRORBG; WILL BE IGNORED. INFORMATION CONCERNING ALL ACTIVE DEVICES WILL ALSOD ; BE SAVED.E;PF; THE ERROR CODE IS SETUP TO MARK THIS AS A HARD DEVICE ERROR. IF THED; OPERATION IS SUC00x tsf__DATADATADATADATACESSFUL, THE CODE WILL BE CHANGED TO A SOFT DEVICE-; ERROR WHEN THE I/O OPERATION IS TERMINATED.E;T ; 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;N ; OUTPUTS:;A<; IF THIS IS THE FIRST OCCURENCE OF THE ERROR, THE ERROR LOG;; PACKET IS FILED AND THE SCB IS SET TO POINT TO THE PACKETI/; ADDRESS AND THE ERROR IN PROGRESS BIT IS SET.E; $; 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 PROCESSING ;+>; **-$LOGER-LOG AN ERROR LOG PACKET (NO ERROR NEED BE PRESENT);UD; THIS ROUTINE IS CALLED BY DRIVERS THAT WISH TO CREATE AN ERROR LOGE; PACKET WHEN NO ERROR IS PRESENT, I.E. FOR AN UNSOLICITED INTERRUPT.OF; THE PACKET WILL BE CREATED AND THE DRIVER IS RESPONSIBLE FOR FILLING$; IN THE NECESSARY DATA INFORMATION.;. ; INPUTS:E;:); R1=LENGTH OF DATA TO BE LOGGED IN BYTESE8; R4=SCB ADDRESS (IF ZERO THEN NO I/O PACKET IS PRESENT); R5=UCB ADDRESS;M ; OUTPUTS:;R.; C=1 IF ERROR CANNOT BE LOGGED FOR ANY REASON; C=0 IF ERROR CAN BE LOGGED.; R1=ADDRESS OF DATA AREA IN ERROR LOG PACKET!; R3=ADDRESS OF ERROR LOG PACKETE;R; R4 AND R5 ARE PRESERVEDR; R0, R2 AND R3 ARE DESTROYEDC-; APR6 MAPPING DESTROYED: KISAR6 MAPS PACKETA;- .IFTF$LOGER:: .IFTI> MOV #$LGER1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON% BR 10$ ;BRANCH TO COMMON PROCESSING;+(; **-$FNERL-FINISH ERROR LOGGING PROCESS;SA; THIS ROUTINE IS CALLED AT I/O DONE TIME OR WHEN IT IS NECESSARYE?; TO QUEUE AN ERROR LOG PACKET AFTER A SUCCESSFUL RECOVERY OF AS; MID-TRANSFER ERROR. ; ; INPUTS:R; R0=FIRST I/O STATUS WORD*; R2=STARTING AND FINAL ERROR RETRY COUNTS%; R3=ERROR LOG PACKET ADDRESS IF R4=0D; R4=SCB ADDRESS OR ZERO; R5=UCB ADDRESS; ; OUTPUTS:1; THE ERROR PACKET IS QUEUED TO THE ERROR LOGGER.O'; THE ERROR IN PROGRESS BIT IS CLEARED.T;O; R1 AND R2 ARE DESTROYED.;- .IFTF($FNERL:: ;FINISH ERROR LOGGING PROCESS .IFTA> MOV #$FERL1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON% BR 10$ ;BRANCH TO COMMON PROCESSINGS;+#; **-$CRPKT-CREATE ERROR LOG PACKET0;RG; THIS ROUTINE IS CALLED TO CREATE AN ERROR LOG PACKET, EITHER FROM THERG; SEND MESSAGE DIRECTIVE PROCESSING, OR WITHIN THE EXECUTIVE AS PART OFD; THE PROCESSING OF A MEMORY ERROR, NONSENSE INTERRUPT, TIME CHANGE,'; POWER FAIL RECOVERY, OR DEVICE ERROR.O; ; INPUTS:R;E; R0=PACKET CODE; R1=LENGTH OF DATA SUBPACKETR; R2=CONTROL MASK WORD1; R3=BEGINNING ADDRESS OF DATA FOR DATA SUBPACKET %; R4=TCB ADDRESS (FOR TASK SUBPACKET)O6; R5=UCB ADDRESS (FOR DEVICE IDENTIFICATION SUBPACKET);E ; OUTPUTS:;R; R0=UNCHANGED-; R1=BEGINNING ADDRESS OF DATA SUBPACKET DATAR; R2=UNCHANGED ; R3=BEGINNING ADDRESS OF PACKET; R4=UNCHANGED; R5=UNCHANGED;C; C=0 IF A PACKET WAS CREATEDN!; C=1 IF A PACKET WAS NOT CREATED -; APR6 MAPPING DESTROYED: KISAR6 MAPS PACKETR;E; OUTPUT PACKET FORMAT:L;T3; +-----------------------------------------------+G%; | RESERVED FOR PACKET LINK WORD |E3; +-----------------------------------------------+A3; | PACKET LENGTH (LENGTH OF REMAINDER OF PACKET) |U3; +-----------------------------------------------+ ; | HEADER SUBPACKET |U ; . .;B ; | |3; +-----------------------------------------------+ ; | OTHER SUBPACKETS |N ; . .;C ; | |3; +-----------------------------------------------+E;- .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 PACKETN; C; THIS ROUTINE CREATES AND QUEUES ERROR LOG PACKET. IT USES $CRPKT-E; AND $QUPKT. IT'S INPUT IS THE SAME AS THE INPUT TO $CRPKT AND IT'S B; OUTPUT IS THE SAME AS THAT FROM $QUPKT. IF THE PACKET CANNOT BED; CREATED, $QUPKT IS NOT CALLED AND A RETURN IS MADE00xtytibjbkb a a a WITH CARRY SET.;-; KISAR6 MAPPING IS PRESERVED;- .IFTF$CREQU:: .IFTM> MOV #$CREQ1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON% BR 10$ ;BRANCH TO COMMON PROCESSING;+"; **-$QUPKT-QUEUE ERROR LOG PACKET;EF; THIS ROUTINE IS CALLED TO QUEUE AN ERROR LOG PACKET. IF THERE IS NOH; OTHER PACKET IN THE QUEUE, THE ERROR LOGGER IS REQUESTED WITH A DELAY.F; IF THERE IS ANOTHER PACKET ALREADY IN THE QUEUE, THE ERROR LOGGER IS; REQUESTED IMMEDIATLY.C;E ; INPUTS:U;I-; R3=POINTER TO PACKET FOR INSERTION IN QUEUE ;S ; OUTPUTS:;.; R4 AND R5 ARE PRESERVED#; ALL OTHER REGISTERS ARE DESTROYEDO;- .IFTF$QUPKT:: .IFT > MOV #$QUPK1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON% BR 10$ ;BRANCH TO COMMON PROCESSINGT;+-; **-$QERMV-REMOVE ENTRY FROM ERROR LOG QUEUEK;IF; THIS ROUTINE REMOVES AN ENTRY FROM THE ERROR LOG QUEUE AND TRANSFERS; IT INTO A USER BUFFER.; ; INPUTS:E;R; R4=LENGTH OF USER BUFFER; R5=ADDRESS OF USER BUFFER;3 ; OUTPUTS:;K; R1=LENGTH OF PACKETU; R4=UNCHANGED; R5=UNCHANGED; %; C=0 PACKET WAS REMOVED SUCCESSFULLYR;; C=1 NO PACKET TO REMOVE OR PACKET TOO LONG. IF R1<>0 THEP=; PACKET WAS TOO LONG, AND R1 CONTAINS THE PACKET LENGTH.;;- .IFTF$QERMV:: .IFT> MOV #$QRMV1,-(SP) ;SET UP ADDRESS OF CODE IN DIRECTIVE COMMON10$:* CALL $MPDC2 ;MAP AND CALL CODE IN SECOND ;DIRECTIVE COMMON  .IFFE SEC .IFTF RETURNL .ENDC ;E$$LOG .DSABL LSBO;+2; **-$NSIER-UNEXPECTED (NONSENSE) INTERRUPT ERRORS;4:; THIS ROUTINE IDENTIFIES THE INTERRUPTING VECTOR AND LOGS ; THE ERROR.; ; INPUTS:O;M.; @(SP)=BITS 06:04 OF THE UNUSED VECTOR NUMBER.; PS=VECTOR ID (MOD 20) IN CONDITION CODE BITS;H ; OUTPUTS:;F4; AN ERROR LOG PACKET IS ALLOCATED AND QUEUED TO THE; ERROR LOGGER. ;- .IF DF E$$NSI5$NSIER::MFPS -(SP) ;;;SAVE THE VECTOR ID (MODULO 20)E .IF DF M$$PRO;C>; THIS INTERRUPT COULD BE THE ONE FROM THE IIST AS PART OF CPU ; STARTUP.;-F; THE CRITERION FOR DETERMINING IS THIS IS A NORMAL NONSENSE INTERRUPTF; AS DISTINCT FROM A CPU STARTUP IS THE STATE OF THE MEMORY MANAGEMENTF; UNIT. IF MAPPING IS ENABLED, THEN THIS IS ASSUMED A NORMAL NONSENSEF; INTERRUPT. IF MAPPING IS NOT ENABLED, THEN A JUMP TO CPU STARTUP IS ; PERFORMED.;E# BIT #1,SR0 ;;;IS MAPPING ENABLED?N BNE 5$ ;;;IF NE YES)' CALLR $CPBGN ;;;NO, START UP THIS CPU .ENDC"5$: INCB $NSI ;;;NSI IN PROGRESS?' BMI 7$ ;;;DON'T ALLOW COUNTER TO WRAPR BNE 10$ ;;;IF NE YES& BIT #ES.LOG,$ERFLA ;;;LOGGING ERRORS? BNE 20$ ;;;IF NE YES!7$: DECB $NSI ;;;RESTORE COUNTERT'10$: CMP (SP)+,(SP)+ ;;;CLEAR THE STACK  RTI ;;;RETURN;NG; THE NONSENSE INTERRUPT HAS NOT INTERRUPTED THE HANDLING OF A PREVIOUSE1; NONSENSE INTERRUPT, SO GO AHEAD AND PROCESS IT.;B820$: 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 PSS! CALL $INTSV,PR7 ;;;SWITCH STACKSE( MOV $ERLFK,R4 ;;;GET FORK BLOCK ADDRESS CALL $FORK0 ;;;AND FORK+ INC $ERRSQ ;COUNT THE ERRORI1 MOV #E$CCPU+<400*E$SINT>,R0 ;GET THE ERROR CODET. MOV #3*2,R1 ;THE BUFFER IS 3 WORDS (6 BYTES)3 MOV #SM.HDR!SM.DAT!SM.DAC,R2 ;SET SUBPACKET FLAGS0& MOV #$VID,R3 ;GET ADDRESS OF THE DATA' CALL $CREQU ; CREATE AND QUEUE PACKETH+30$: MOVB #-1,$NSI ;RESET RECURSION COUNTERG RETURN ;M .ENDC ;E$$NSI .END PC' MOV 2(SP) .TITLE XXPRE2 .IDENT /01.01/];.1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.9; All rights reservedL;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 17-MAR-87;n; MODIFIED FOR CPRSX V2.0 BY:D;4#; PAUL K. M. WEISS 16-JUN-1989 1.01E;@; PKW1811 - BUFFER ACP QIOS AND SMALL READ/WRITES IN CPR PACKET;.; PREPROCESSOR MODULE FOR NON TERMINAL DEVICES;0;, .PAGE; ; LOCAL MACR00ytsf__DATADATADATADATAOS;I .MACRO EVEN A INC A BIC #1,A .ENDM; ; LOCAL SYMBOL DEFINITIONc;U/ MAP5 = 120000 ; ADDRESS OF FIRST WORD IN APR5F. MAP6 = 140000 ; ADDRESS OF FIRST WORD IN APR6 .PAGE;+; "; I/O FUNCTION CODE DISPATCH TABLE;C;- DSPTBL: .WORD FC0BF ; 0 IO.KIL .WORD FC1BF ; 1 IO.WLB. .WORD FC1BF ; 2 IO.RLBI .WORD FCATT ; 3 IO.ATT  .WORD FC0BF ; 4 IO.DETA .WORD FC0BF ; 5 ? .WORD FC0BF ; 6 ? .WORD FC0BF ; 7 IO.CLNE" .WORD FCIFC ;10-ILLEGAL FUNCTION- .WORD FCPKT ;11-FIND FILE NAME IN DIRECTORY#. .WORD FCIFC ;12-UNLOCK BLOCK - NOP'D IN MASK1 .WORD FCPKT ;13-REMOVE FILE NAME FROM DIRECTORY. .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 BLOCKD .WORD FCPKT ;23-EXTEND FILEF .WORD FCCRE ;24-CREATE FILEO4 .WORD FCPKT ;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; ATTACH PROCESSINGL;TFCATT:2 .WORD SETRSW ; BLOCK TASK TO APPEAR SYNCHRONOUS.1 .WORD CK0XT ; EXIT WITH 0 BUFFERS IN FLAG BYTE.W; "; NON ACP FUNCTION WITH NO BUFFERS;R4FC0BF: .WORD CK0XT ;EXIT WITH 0 BUFFER IN FLAG BYTE;C"; NON ACP FUNCTION WITH ONE BUFFER;EAFC1BF: .WORD CHKBUF ;BUFFER THE REQUEST IN CPRBUF IF APPROPRIATED. .WORD CK1XT ;EXIT WITH 1 BUFFER IN FLAG BYTE;E8; ACCESS FILE FOR READ, READ/WRITE, OR READ/WRITE/EXTEND;FFCACC:4 .WORD CKALN ;CHECK IF FILE ALREADY ACCESSED ON LUN" .WORD BDPKT ;BUILD AN I/O PACKET .WORD CKLHD ;LOCK DOWN HEADERU! .WORD CKRLK ;SYNCHRONIZE ACCESSF< .WORD CK1XC ;EXIT CONDITIONALLY WITH 1 BUFFER IN FLAG BYTE;B; DEACCESS FILEE; 2FCDAC: .WORD CKNLN ;CHECK IF FILE ACCESSED ON LUN" .WORD BDPKT ;BUILD AN I/O PACKET .WORD CKLHD ;LOCK DOWN HEADERI! .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 LUN;C; BUILD AN I/O PACKET FOR FIND, ENTER, REMOVE, EXTEND, DELETE, READ "; ATTRIBUTES, AND WRITE ATTRIBUTES;NFCPKT:" .WORD BDPKT ;BUILD AN I/O PACKET .WORD CKLHD ;LOCK DOWN HEADERC8 .WORD CK1XC ;EXIT CONDITIONALY WITH ONE BUFFER IN BYTE;.F; TABLE OF SPECIAL FUNCTION CODES TO BE CHECKED BY SOFTWARE WRITE LOCK;LWLKTB: ;DEVICE DEPENDENT CODEST! .WORD IO.SMD ;SET MEDIA DENSITYC! .WORD IO.EOF ;WRITE END OF FILEW .WORD IO.ERS ;ERASE TAPE# .WORD IO.DSE ;DATA SECURITY ERASEL ;DIAGNOSTIC CODESC% .WORD IO.WDH ;WRITE DATA AND HEADERL& .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 REJ00y"ttibjbkb a a aECT.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 SPECIFY 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 INSTSK ; INSERT TASK NAME.! .WORD CKLHD ; LOCK DOWN HEADER.E .WORD CKRLK ; INTERLOCK.SKIP:D. .WORD CK0XT ; INDICATE NO BUFFERS AND LEAVE.:SAVATT: .BLKW 13. ; SAVE ATTRIBUTE DESCRIPTORS - MAX OF 6 .PAGEXXPRE::G SAVNR7 MOV R1,-(SP) ;SAVE I/O PACKET ADDRESS FOR ERROR RETURNC5 CLR -(SP) ;SAVE ADDRESS OF CPRBUF PACKET FOR ERRORSS- MOV SP,$TEMP0 ;REMEMBER WHERE THE STACK GOESN; 0; PREPARE REGISTERS FOR POLISH DISPATCH ROUTINES;L) MOV R1,R4 ;PUT I/O PACKET ADDRESS IN R4P0 MOVB I.FCN+1(R1),R2 ;RETRIEVE I/O FUNCTION CODE ASL R2 ;CONVERT TO WORD INDEXC3 MOV R5,-(SP) ;SAVE UCB ADDRESS FOR POLISH ROUTINESN MOV R5,R0 ;E5 MOV I.LN2(R4),R1 ;SAVE ADDRESS OF SECOND LUN WORD " MOV R1,-(SP) ;FOR POLISH ROUTINES0 MOV DSPTBL(R2),R5 ;GET ADDRESS OF POLISH VECTOR$ JMP @(R5)+ ;EXECUTE POLISH ROUTINE;C'; REGISTERS AT POLISH DISPATCH ROUTINES;;E ; R0 - UCB; R1 - ADDRESS 2ND LUN WORD ; R4 - POINTER TO I/O PACKET;T; SP-> 2ND LUN WORD ADDRESSO; UCB ADDRESS;RK; TASK HEADER IS ASSUMED TO BE MAPPED FOR ALL OF THE THREADED CODE ROUTINESR;N;C(; CHECK FOR FILE ALREADY ACCESSED ON LUN;R(CKALN: TST (R1) ;FILE ACCESSED ON LUN? BEQ CKJR5 ;IF EQ NOO JMP IEALN ;ERROR;P ; CHECK FOR FILE ACCESSED ON LUN;2(CKNLN: TST (R1) ;FILE ACCESSED ON LUN? BNE CKJR5 ;IF NE YES JMP IENLN ;ERROR;T; SET ACCESS/DEACCESS INTERLOCK ;-9CKRLK: INC @(SP) ;SET ACCESS/DEACCESS PENDING INTERLOCKKCKJR5: JMP @(R5)+N R;DL; CHECK BUFFER SIZE AGAINST $CPMXB. IF SMALLER OR SAME, ALLOCATE CPRBUF NOWO; AND REPLACE I.PRM AND I.PRM+2 WITH THE BIAS AND OFFSET OF THE PACKET. IF THEO; FUNCTION IS A READ, STORE THE USER BIAS AND ADDRESS IN THE PACKET TO RESTORE EP; THE DATA UPON RETURN FROM VMS. IF IT'S A WRITE, COPY THE DATA INTO THE CPRBUF ; PACKET. ;EO; AT SOME POINT THIS PROBABLY SHOULD CALL THE EXEC BUFFERED I/O ROUTINES SO THEM; REGIONS ARE NOT LOCKED DOWN DURING THE QIO, BUT WE DON'T HAVE THE TIME FOR )O; THAT NOW. DON'T FORGET THAT IF THIS IS DONE, THE USER ADDRESS MUST BE STOREDB6; AND RE-RELOCTED RATHER THAN STORING THE BIAS/OFFSET.;FG; AT SOME OTHER POINT, IT MIGHT BE USEFUL TO BUFFER OVERLAY LOADS. BUTN; AGAIN, NOT NOW.C; CHKBUF:E7 CMP #IO.LOV,I.FCN(R4) ;IS IT THE I-SPACE LOAD OVERLAY?P% BEQ CKJR5 ;IF EQ YES, DON'T BUFFER7 CMP #IO.LDO,I.FCN(R4) ;IS IT THE D-SPACE LOAD OVERLAY?F% BEQ CKJR5 ;IF EQ YES, DON'T BUFFERR* MOV I.PRM+4(R4),R1 ;GET SIZE OF TRANSFER, CMP R1,$CPMXB ;IS SIZE <= MAX BUFFER SIZE? BHI CKJR5 ;NOPE, JUST EXITS7 ADD #177,R1 ;ROUND TO NEXT BLOCK, ADD ONE FOR HEADER  ASH #-6,R1 ;32 WORD BLOCK CLR R0 ;NO FLAGS,% CALL $CPALO ;GET A BLOCK OF CPRBUFO0 BCS CKJR5 ;COULDN'T GET ONE, FORGET BUFFERING0 MOV R0,@$TEMP0 ;SAVE BUFFER IN CASE OF FAILURE' MOV I.PRM(R4),R1 ;BIAS OF USER BUFFER+ MOV I.PRM+2(R4),R2 ;OFFSET OF USER BUFFERO8 MOV R0,I.PRM(R4) ;MAKE THE BIAS THE BASE OF THE PACKET5 MOV #100,I.PRM+2(R4) ;OFFSET 100 FROM BASE OF PACKET = CMPB #,I.FCN+1(R4) ;IS THIS READ LOGICAL BLOCK?A1 BEQ 20$ ;00y*tsf__DATADATADATADATAYES, DON'T BLXIO, SAVE USER ADDR/BIASE? CMPB #,I.FCN+1(R4) ;HOW ABOUT READ VIRTUAL BLOCK?A1 BEQ 20$ ;YES, DON'T BLXIO, SAVE USER ADDR/BIAST" MOV R0,R3 ;MOVE CPR PACKET BIAS2 SUB #20000,R2 ;MAKE USER OFFSET INTO APR5 OFFSET* MOV I.PRM+4(R4),R0 ;GET LENGTH OF BUFFER MOV R4,-(SP) ;SAVE IO PACKET9 MOV #MAP6+100,R4 ;START WITH SECOND BLOCK OF CPR PACKET CALL $BLXIO ;COPY THE BUFFER " MOV (SP)+,R4 ;RESTORE IO PACKET # BR 30$ ;JOIN COMMON CODE TO EXITC020$: MOV @#KISAR6,R3 ;SAVE CURRENT APR6 MAPPING! MOV R0,@#KISAR6 ;MAP CPR PACKETF% MOV R1,MAP6+P$LUN+32 ;SAVE USER BIASA( MOV R2,MAP6+P$LUN+34 ;SAVE USER OFFSET' MOV R3,@#KISAR6 ;RESTORE APR6 MAPPING +30$: MOV (SP),R1 ;RESTORE SECOND LUN WORDR# MOV 2(SP),R0 ;RESTORE UCB ADDRESSE JMP @(R5)+ ;LEAVE)PRMPRP: ; PREPARE NETWORK PARAMETERS.;8 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(R4),I.PRM+12(R4)J MOV I.PRM+4(R4),I.PRM+6(R4) MOV I.PRM+2(R4),I.PRM+4(R4) JMP @(R5)+ ; LEAVE. .ENABL LSBP.CKBFR2: ; CHECK BUFFER TWO FOR READ ACCESS.0 MOV #I.PRM+6,R3 ; SET OFFSET TO SECOND ADDRESS. BR 10$I.CKBFR1: ; CHECK BUFFER ONE FOR READ ACCESS.- MOV #I.PRM,R3 ; SET OFFSET TO FIRST ADDRESS.E10$: ADD R4,R3 ; POINT TO ADDRESS.E MOV R1,-(SP) ; SAVE REGISTERS. MOV R0,-(SP)M% MOV (R3),R0 ; GET ADDRESS TO CHECK.A MOV 4(R3),R1 ; GET LENGTH.( BEQ 50$ ; YES, ACCEPT IT.6- 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;.; INSERT00y2ttibjbkb a a a TASK NAME.X;CINSTSK:I MOV I.TCB(R4),R1 ; FIND TCB.< MOV T.NAM(R1),I.PRM+4(R4) ; PUT NAME IN PARAMETERS 3 AND 4. MOV T.NAM+2(R1),I.PRM+6(R4) ; JMP @(R5)+ ; CONTINUE.Y;E; ERROR ROUTINES;@;)F; FUNCTION IS AN ILLEGAL FUNCTION-DECLARE ILLEGAL FUNCTION CODE STATUS;O0IEIFC: MOV #IE.IFC&377,R4 ;SET ILLEGAL FUNCTION JMP IECMN;.@; ILLEGAL BUFFER ADDRESS SPECIFIED-DECLARE ILLEGAL BUFFER STATUS;A2IESPC: MOV #IE.SPC&377,R4 ;SET ILLEGAL BUFFER CODEIECOM: BR IECMN ;; 9; ILLEGAL BYTE COUNT OR ALIGNMENT-DECLARE ODD BYTE STATUS ;..IEBYT: MOV #IE.BYT&377,R4 ;SET ODD BYTE STATUS BR IECMN ;;T:; NO BUFFER SPACE AVAILABLE-SET NO BUFFER AVAILABLE STATUS;R7IENOD: MOV #IE.NOD&377,R4 ;SET NO BUFFER AVAILABLE CODEL BR IECMN ;;N(; BAD PARAMETER-SET BAD PARAMETER STATUS;41IEBAD: MOV #IE.BAD&377,R4 ;SET BAD PARAMETER CODEF BR IECMN ;;D4; 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 BR IECOM ;;E ; RANDOM ERROR WITH STATUS IN R0;7IER0: MOV R0,R4 D;; COMMON ERROR EXIT ;V)IECMN: MOV $TEMP0,SP ;RESET STACK POINTERS6 MOV (SP)+,R0 ;RETRIEVE ADDRESS OF SECONDARY CONTROL B BEQ 10$ ;IF EQ NONE' CALL $CPDEA ;DEALLOCATE CPRBUF PACKETF%10$: MOV R4,R0 ;SET FINAL I/O STATUSL& CLR R1 ;CLEAR SECOND I/O STATUS WORD- MOV (SP)+,R3 ;RETRIEVE ADDRESS OF I/O PACKETC' MOV I.UCB(R3),R5 ;RETRIEVE UCB ADDRESST SEC ;INDICATE ERROR RETURN ;N; BUILD AN I/O PACKET; BDPKT:;; SPREAD OUT PARAMETERSS; 0 MOV I.PRM+12(R4),I.PRM+16(R4) ;COPY FNB ADDRESS' MOV I.PRM+10(R4),I.PRM+14(R4) ;COPY P5E' MOV I.PRM+6(R4),I.PRM+12(R4) ;COPY P4 ' MOV I.PRM+4(R4),I.PRM+10(R4) ;COPY P3 ; MOV I.PRM+2(R4),I.PRM+6(R4) ;COPY ATTRIBUTE LIST POINTERM, CLR I.PRM+4(R4) ;ASSUME NO BUFFER LENGTH. MOV I.PRM(R4),I.PRM+2(R4) ;COPY FID POINTER( CLR I.PRM(R4) ;ASSUME NO BUFFER BIAS; &; DETERMINE SIZE OF BUFFER TO ALLOCATE;R4 MOV #7,-(SP) ;SET COUNT OF ATTRIBUTES + 1 - MAX SIX- MOV @#KISAR6,-(SP) ;SAVE TASK HEADER MAPPINGM% MOV R5,-(SP) ;GET A WORKING REGISTER2 CLR -(SP) ;SET SIZE OF CPRBUF ALLOCATION TO ZERO! TST I.PRM+2(R4) ;IS THERE A FID?V BEQ 10$ ;IF EQ NO(9 ADD #3.*2+2,(SP) ;ACCOUNT FOR 3 WORD BUFFER PLUS ADDRESSU'10$: TST I.PRM+16(R4) ;IS THERE AN FNB?S BEQ 20$ ;IF EQ NO: ADD #15.*2+2,(SP) ;ACCOUNT FOR 15 WORD BLOCK PLUS ADDRESS20$:;S-; CALCULATE SIZE OF ALL THE ATTRIBUTE BUFFERSF;T2 MOV I.PRM+6(R4),R3 ;GET ADDRESS OF ATTRIBUTE LIST BEQ 70$ ;IF EQ NONE S0 MOV #SAVATT,R5 ;ADDRESS OF SAVED ATTRIBUTE AREA930$: DEC 6(SP) ;DECCREMENT NUMBER OF ATTRIBUTES COUNTER  BEQ 40$ ;NO MORE* MOV R3,R0 ;GET ADDRESS OF NEXT ATTRIBUTE" MOV #4,R1 ;SET SIZE OF ATTRIBUTE1 CALL $ACHCK ;ADDRESS CHECK ATTRIBUTE DESCRIPTORM BCS IESPC ;IF CS ERROR CALL $RELOM ;RELOCATE AND MAP*$ ADD #4,R3 ;POINT TO NEXT ATTRIBUTE1 MOV (R0),(R5)+ ;SAVE THE ATTRIBUTE TYPE AND SIZET BEQ 40$ ;IF EQ NO ATTRIBUTEM( ADD #6,(SP) ;INCLUDE ATTRIBUTE IN SIZE MOV #512.,R2 ;ASSUME FULL BLOCK3 CMP #366,(R0)+ ;IS THIS "READ ENTIRE FILE HEADER"?  BEQ 35$ ;YES, SIZE IS CORRECTI. MOVB -1(R0),R2 ;GET THE SIZE OF THE ATTRIBUTE EVEN R2 ;ROUND TO NEXT WORD>35$: MOV (R0),(R5)+ ;COPY THE BUFFER ADDRESS TO THE SAVED AREA4 CMP R2,$CPMXB ;IS IT TOO BIG TO GO INTO THE BUFFER? BHI 30$ ;IF HI OR SAME, YESA& ADD R2,(SP) ;INCLUDE IT IN THE TOTAL- ADD #2,(SP) ;INCLUDE SPACE FOR USER ADDRESS BR 30$ ;LOOK AT NEXT ATTRIBUTE/40$: ADD #2,(SP) ;ACCOUNT FOR END OF LIST WORD.$ CLR (R5)+ ;INSERT 0 AT END OF LIST%70$: MOV (SP)+,R1 ;GET SIZE OF BUFFER/ MOV (SP)+,R5 ;RESTORE POLISH DISPATCH REGISTER 0 MOV (SP)+,@#KISAR6 ;RECOVER TASK HEADER MAPPING+ TST (SP)+ ;CLEAN STACK OF ATTR00y:tsf__DATADATADATADATAIBUTE COUNTU# TST R1 ;WAS ANY BUFFER NECESSARY?R BEQ PKTDON ;NOPE, ALL DONE;75$: MOV R1,I.PRM+4(R4) ;SET LENGTH OF BUFFER IN I/O PACKET);I; ALLOCATE A BUFFER FROM CPRBUFS; ?80$: ADD #177,R1 ;ROUND SIZE TO NEAREST 32, ADD ONE FOR HEADERE ASH #-6,R1 ; WORD BLOCKT CLR R0 ;NO FLAGS, CALL $CPALO ;ALLOCATE A BUFFER FROM CPRBUF$ BCS IENOD ;IF CS ALLOCATION FAILED# MOV R0,@$TEMP0 ;SAVE BIAS ON STACKG. MOV R0,I.PRM(R4) ;PUT BIAS IN FIRST PARAMETER4 MOV #MAP6+100,R3 ;POINT TO SECOND BLOCK FOR BUFFERS;T ; BUILD FID ;U1 MOV I.PRM+2(R4),R0 ;SET ADDRESS OF FILE ID BLOCK: BEQ 90$ ;IF EQ NONETD MOV #100000,I.PRM+2(R4);INDICATE THAT FID EXISTS (OFFSET 0 IMPLIED)* MOV #3*2,R1 ;SET LENGTH OF FILE ID BLOCK# CALL INP.RW ;INSERT FILE ID BLOCKR90$:; ; BUILD FILE NAME BLOCKS;C4 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 BLOCK% CALL INP.RW ;INSERT FILE NAME BLOCKS100$:E;O; BUILD ATTRIBUTE POINTER BLOCKQ;NI; FIRST COPY THE ATTRIBUTE BLOCK, LEAVING A EXTRA WORD AFTER EACH BUFFER MM; ADDRESS. THIS WILL ALLOW THE ADDRESS TO BE EXPANDED TO A BIAS/OFFSET PAIR.;:3ATRBK: TST I.PRM+6(R4) ;ATTRIBUTE DESCRIPTOR BLOCK 0% BEQ PKTDON ;NOT SPECIFIED? IF EQ NO1/ MOV R3,I.PRM+6(R4) ;PUT OFFSET INTO I/O PACKETI1 BIC #MAP6,I.PRM+6(R4) ;GET RID OF APR6 BIAS BITS ! MOV @#KISAR6,-(SP) ;SAVE MAPPINGE' MOV I.PRM(R4),@#KISAR6 ;MAP CPR BUFFERI4 MOV #SAVATT,R0 ;GET ADDRESS OF SAVED ATTRIBUTE AREA MOV R5,-(SP) ;GET A REGISTERT5 MOV R3,R5 ;SAVE THE BEGINNING OF THE ATTRIBUTE LISTF(10$: MOV (R0)+,(R3)+ ;MOVE TYPE AND SIZE BEQ 17$ ;CLEAR, DONE# MOV (R0)+,(R3)+ ;MOVE USER ADDRESSI, TST (R3)+ ;EXTRA WORD FOR BIAS/OFFSET PAIR BR 10$ ;GET NEXT ATTRIBUTE17$:;MN; INSERT ATTRIBUTES INTO THE BUFFER. THIS WILL BE DONE FOR EACH ATTRIBUTE IN ; ONE OF THREE WAYS:;VI; 1) THE ATTRIBUTE IS LARGER THAN $CPMXB. IT WILL BE ADDRESS CHECKED ANDI; LOCKED DOWN, AND THE BIAS/OFFSET IN RSX MEMORY WILL BE STORED IN THER=; ATTRIBUTE LIST. THE AME WILL ACCESS THE BUFFER DIRECTLYF;0G; 2) THE ATTRIBUTE IS <= $CPMXB, AND IS TO BE WRITTEN TO THE FILE. THE+*; ATTRIBUTE WILL BE COPIED INTO CPRBUF.;WH; 3) THE ATTRIBUTE IS <= $CPMXB, AND IS TO BE READ FROM THE FILE. SPACEE; WILL BE ALLOCATE IN THE CPR BUFFER, AND THE USER ADDRESS OF THE A; BUFFER WILL BE APPENDED AFTER THE BUFFER, SO THAT IT CAN BE ?; RELOCATED UPON RETURN TO COPY THE DATA TO THE USER BUFFER.O; ;N X,30$: TSTB (R5) ;IS THERE AN ATTRIBUTE HERE? BEQ 40$ ;IF EQ NO, ALL DONE  MOV #512.,R1 ;ASSUME FULL SIZEI3 CMP #366,(R5)+ ;IS THIS "READ ENTIRE FILE HEADER"?  BEQ 21$ ;YES, CONTINUE& MOVB -1(R5),R1 ;GET SIZE OF ATTRIBUTE+21$: MOV (R5),R0 ;GET ADDRESS OF ATTRIBUTEH5 CMP R1,$CPMXB ;SMALL ENOUGH TO BUFFER IN CPR PACKET?,( BHI 25$ ;NOPE, JUST CHECK AND RELOCATE@ MOV #INPR.R,-(SP) ;ASSUME WRITE ATTRIBUTE - READ ONLY ACCESS OK( TSTB -2(R5) ;IS THIS A READ ATTRIBUTE?, BPL 23$ ;NOPE, WRITE. LEAVE ROUTINE ALONE) MOV #INPR.W,(SP) ;WRITE ACCESS NECESSARYN423$: MOV I.PRM(R4),(R5)+ ;BIAS IS BIAS OF CPR PACKET" MOV R3,(R5) ;MOVE CURRENT OFFSET0 BIC #170000,(R5)+ ;CLEAR OUT APR PART OF OFFSET* MOV 4(SP),@#KISAR6 ;HEADER MUST BE MAPPED CALL @(SP)+ ;MOVE BUFFER) MOV I.PRM(R4),@#KISAR6 ;REMAP CPR PACKETI BR 30$ ;GET NEXT ATTRIBUTE , S825$: MOV #$CKBFR,-(SP) ;ASSUME READ ONLY ACCESS REQUIRED- TSTB -2(R5) ;IS THIS READING FROM THE FILE?I BPL 27$ ;NOPE, WRITE ATTRIBUTEB MOV #$CKBFB,(SP) ;IT'S READING THE ATTRIBUTE-WE NEED WRITE ACCESS.27$: MOV 4(SP),@#KISAR6 ;HEADER MUST BE MAPPED! CALL @(SP)+ ;GO LOCK THE BUFFERM BCS INERR ;EXIT WITH ERROR CALL $RELOC ;RELOCATEA) MOV I.PRM(R4),@#KISAR6 ;REMAP CPR PACKETU MOV R1,(R5)+ ;MOVE THE BIAS MOV R2,(R5)+ ;AND THE OFFSETS# BR 30$ ;GO GET THE NEXT ATTRIBUTE *40$: MOV (SP)+,R5 ;RESTORE POLISH DISPATCH& MOV (SP)+,@#KISAR6 ;REMAP TASK HEADER00yBttibjbkb a a aPKTDON:I JMP @(R5)+G;OG; INP.RW: READ/WRITE ACCESS - ADDRESS CHECK AND INSERT PARAMETER BLOCK EM; INPR.W: WRITE ONLY ACCESS - ADDRESS CHECK AND INSERT USER ADDRESS, NO BLXIOBH; INPR.R: READ ONLY ACCESS - ADDRESS CHECK AND INSERT IN PARAMETER BLOCK;C8; INPUTS : R0 - ADDRESS OF BLOCK IN USER'S ADDRESS SPACE; R1 - LENGTH OF BLOCK/; R3 - POINTER INTO CPR BUFFER (APR6 ADDRESS) ; F; OUTPUT: BUFFER COPIED INTO CPR BLOCK, USER ADDRESS FOLLOWING BUFFER1; R0 - OFFSET INTO CPR BUFFER OF START OF BLOCKI0; R3 - UPDATED TO POINTER AFTER INSERTED BLOCK; R4 IS PRESERVEDE;P .ENABL LSBK-INPR.W: MOV #$ACHKB,R2 ;ADDRESS CHECK ROUTINE  CLR -(SP) ;DON'T DO BLXIOL BR 3$-INP.RW: MOV #$ACHKB,R2 ;ADDRESS CHECK ROUTINES BR 2$/INPR.R: MOV #$ACHRO,R2 ;ADDRESS CHECK READ ONLYO'2$: MOV I.PRM(R4),-(SP) ;BASE OF CPRBUFT'3$: MOV R1,-(SP) ;SAVE LENGTH OF BUFFERF CALL @R2 ;CHECK USER'S BUFFER  BCS INERR ;IF CS ERROR MOV (SP),R1 ;GET BACK LENGTH( ADD R3,R1 ;GET OFFSET AT END OF BUFFER EVEN R1 ;MOVE TO WORD BOUNDARY- MOV @#KISAR6,-(SP) ;SAVE TASK HEADER MAPPINGE# MOV I.PRM(R4),@#KISAR6 ;MAP CPRBUFC! MOV R0,(R1) ;STORE USER ADDRESSR& MOV (SP)+,@#KISAR6 ;REMAP TASK HEADER TST 2(SP) ;DO BLXIO? BNE 7$ ;YESS# ADD (SP)+,R3 ;ADD LENGTH OF BUFFERR TST (SP)+ ;CLEAN STACK BR 8$ ;AND EXIT ; ; USE BLXIO TO DO COPY;S!7$: CALL $RELOC ;RELOCATE BUFFERR) SUB #MAP6-MAP5,R2 ;MAKE OFFSET FROM APR5S0 MOV R4,R0 ;SAVE IO PACKET ADDRESS FOR A SECOND# MOV R3,R4 ;GET OFFSET INTO CPRBUF ! MOV 2(SP),R3 ;GET BIAS OF CPRBUFK. MOV R0,2(SP) ;SAVE THE IO PACKET ON THE STACK MOV (SP)+,R0 ;RESTORE LENGTHM CALL $BLXIO ;COPY BUFFER( MOV R4,R3 ;PUT UPDATED POINTER INTO R3( MOV (SP)+,R4 ;RESTORE IO PACKET ADDRESS#8$: EVEN R3 ;MOVE TO WORD BOUNDARYR- ADD #2,R3 ;UPDATE POINTER PAST USER ADDRESS RETURN .DSABL LSBOINERR:  JMP IESPC ;RETURN WITH ERROR;B+; LOCK HEADER IN MEMORY DURING ACP FUNCTIONR;03CKLHD: MOV $TKTCB,R0 ;GET CURRENT TASK TCB ADDRESST, 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 REQUESTR JMP @(R5)+ ;;DG; SET .RSW IN TCB TO BLOCK TASK UNTIL OPERATION IS COMPLETE OR AT LEASTS0; PAST PORTION THAT NEEDS TO APPEAR SYNCHRONOUS.; SETRSW:E% MOV I.TCB(R4),R1 ; GET TCB ADDRESS.< BIS #TS.RSW,T.STAT(R1) ; BLOCK TASK TO MAKE IT SYNCHRONOUS.2 JMP @(R5)+ ; GO TO NEXT ENTRY IN DISPATCH TABLE.;RF; EXIT WITH EITHER ONE OR NO BITS SET IN THE FLAG WORD, OR THE WORD AS; SPECIFIED IN R1.; .ENABL LSBM$CKNXT: ; USE R1 FOR BUFFER FLAGS. MOV R1,R0 ; GET BUFFER FLAGS./# BR 10$ ; CONTINUE IN COMMON CODE.E)CK1XC: TST I.PRM(R4) ;IS THERE A BUFFER?  BNE CK1XT ;IF NE YESCK0XT: CLR R0 ;NO BUFFERS BR 10$ ;JOIN COMMON CODECK1XT: MOV #1,R0 ;ONE BUFFERG10$: .DSABL LSBB;#; CALCULATE LUN NUMBER ;K1 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. TST (SP)+ ;WAS THERE A CPR PACKET ALLOCATED? BEQ 20$ ;NOPE, CONTINUE2 BIS #100000,I.LN2(R4) ;MARK THAT CPRBUF ALLOCATED&20$: TST (SP)+ ;CLEAN OFF ERROR STACK, MOV U.SCB(R5),R0 ;GET I/O QUEUE LISTHEAD MOV R4,R1 ;GET PACKET POINTERN CALLR $QINSP ;INSERT PACKETL .END 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. TST (SP)+ ;WAS THERE A CPR PACKET ALLOCATED? BEQ 20$ ;NOPE, CONTINUE2 BIS #100000,I.LN2(R4) ;MA00zJtsf__DATADATADATADATA .TITLE XXFINA .IDENT /01.03/T;+1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.E; All rights reservedM;R;1<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;U; K. L. NOEL 24-MAR-87;; MODIFIED FOR CPRSX V2.0 BY:X;#; Eric Postpischil 20-Oct-1989 1.03SB; edp076 Move processing for SF.GMC and SF.SMC from XXTTI to here.;T#; PAUL K. M. WEISS 3-AUG-1989 1.02$<; PKW183 - DON'T FILTER OUT IO.LOV AND IO.LDO FOR TERMINALS;.$; PAUL K. M. WEISS 22-JUN-1989 1.015; PKW181 - BUFFER ACP AND SMALL IO REQUEST IN CPRBUFe;*; I/O FINISHING MODULE FOR ALL REMOTE QIOS;C;E .PAGE; ; LOCAL SYMBOL DEFINITIONC;D/ MAP5 = 120000 ; ADDRESS OF FIRST WORD IN APR5 . MAP6 = 140000 ; ADDRESS OF FIRST WORD IN APR6 .PAGE;+; #; I/O FUNCTION CODE DISPATCH TABLESM; ;-!DSPTBL: .WORD DEAPKT ; 0 IO.KILT .WORD DEAPKT ; 1 IO.WLB .WORD FN1BF ; 2 IO.RLB  .WORD DEAPKT ; 3 IO.ATT .WORD DEAPKT ; 4 IO.DET .WORD DEAPKT ; 5 ?I .WORD DEAPKT ; 6 ?  .WORD DEAPKT ; 7 ?D .WORD 0 ;10-ILLEGAL FUNCTION- .WORD FNACP ;11-FIND FILE NAME IN DIRECTORY. .WORD FNACP ;12-UNLOCK BLOCK - NOP'D IN MASK1 .WORD FNACP ;13-REMOVE FILE NAME FROM DIRECTORYM. .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 FILEA$ .WORD FN1BF ;21-READ VIRTUAL BLOCK& .WORD DEAPKT ;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 DEAPKT ;31-TRANSMIT PROCESS MESSAGE* .WORD DEAPKT ;32-RECEIVE PROCESS MESSAGE$ .WORD NTACC ;33-CONNECT TO PROCESS) .WORD NTDEA ;34-DISCONNECT FROM PROCESSE+ .WORD NCTSPL ;35-NETWORK CONTROL FUNCTIONBTTIDSP:D .WORD 0 ;IO.KILV .WORD DEAPKT ;IO.WLB .WORD FN1BF ;IO.RLB. .WORD DEAPKT ;IO.ATT .WORD DEAPKT ;IO.DET .WORD SPC ;SPECIAL FUNCTIONS:E ; IO.GTS ; SF.SMC ; SF.GMC .WORD DEAPKT ;IO.HNG/ .WORD 0 ;RESERVED EXEC CLOSE-OUT-LUN FUNCTIONC- .WORD 0 ;RESERVED FOR USER MODE DIAGNOSTICSR .WORD FN1BF ;IO.RPRD .WORD FN1BF ;IO.RTTE .IF DF B$$MAP .WORD DEAPKT ;IO.WSD .WORD FN1BF ;IO.RSD- .ENDC ;B$$MAP .WORD 0 ;IO.EIO  .PAGE;C'; DISPATCH TO CORRECT FINISHING ROUTINEI;I/; R0 IS ADDRESS OF CPR PACKET TO BE DEALLOCATED.;.XXFIN::K SAVNR' MOV R0,-(SP) ;SAVE CPR BUFFER ON STACKE* MOV I.TCB(R3),R4 ;GET TCB ADDRESS OF TASK" MOV T.PCB(R4),R4 ;GET PCB ADDRESS# MOV P.REL(R4),@#KISAR6 ;MAP HEADERT0 MOVB I.FCN+1(R3),R2 ;RETRIEVE I/O FUNCTION CODE ASL R2 ;CONVERT TO WORD INDEXP4 MOV I.LN2(R3),R4 ;GET POINTER TO SECOND LUN WORD2 BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL DEVICE? BEQ 10$ ;IF EQ NO, USE DSPTBL.+ JMP @TTIDSP(R2) ;EXECUTE FINISHING ROUTINET:10$: CMP #IO.LOV,I.FCN(R3);IS IT THE I-SPACE LOAD OVERLAY? BEQ DEAPKT ;IF EQ YESM6 CMP #IO.LDO,I.FCN(R3);IS IT THE D-SPACE LOAD OVERLAY? BEQ DEAPKT ;IF EQ YESK+ JMP @DSPTBL(R2) ;EXECUTE FINISHING ROUTINER-NCTSPL: ; SPLIT NETWORK CONTROL FUNCTIONS.2& MOV I.FCN(R4),R1 ; GET FUNCTION CODE.9 BIC #177707,R1 ; EXTRACT THREE BITS INDICATING FUNCTION.O ASR R1U ASR R1B JMP @NCTTBL(R1) ; DISPATCH.NCTTBL:D .WORD NTACC ; 00, OPEN .WORD NTDEA ; 10, CLOSEP .WORD DEAPKT ; 20, SPECIFY AST% .WORD DEAPKT ; 30, GET NETWORK DATAS% .WORD DEAPKT ; 40, GET NETWORK DATA % .WORD DEAPKT ; 50, GET NETWORK DATAD .WORD DEAPKT ; 60/ .WORD DEAPKT ; 70, GET LOCAL NODE INFORMATIONT;I/; PROCESS ACCESS OR DEACCESS ERROR FOR NETWORK.R;FNTAERR:27 BIC #1,(R4) ; CLEAR INTERLOCK BIT, LEAVING SECOND LUN , ; WORD UNCHANGED FROM ORIGINAL VALUE.;R5; COMPLETION FOR ALL ROUTINES - DEALLOCATE CPR BUFFER;O)DEAPKT: MOV (SP)+,R0 ;RESTORE CPR PAC00zRttibjbkb a a aKETL BEQ 10$ ;IF NONE, EXIT MOV R3,-(SP) ;SAVE I/O PACKET) CALL $CPDEA ;DEALLOCATE PACKET AND EXITG! MOV (SP)+,R3 ;RESTORE I/O PACKET5 10$: RETURNK;D?; FN1BF - FINISH, RETURNING ONE BUFFER IF IT WAS KEPT IN CPRBUFM;OFN1BF:. CMP I.PRM(R3),(SP) ;WAS THE REQUEST BUFFERED?- BNE DEAPKT ;BIAS NOT THE SAME, NOT BUFFEREDC& MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS' MOV I.PRM+4(R3),R0 ;LENGTH OF TRANSFERO! MOV 2(SP),R1 ;BIAS OF CPR PACKETA2 MOV I.PRM+2(R3),R2 ;OFFSET TO BEGINNING OF BUFFER& BIS #120000,R2 ;MAKE INTO APR5 OFFSET MOV R1,@#KISAR6 ;MAP CPR PACKET* MOV MAP6+P$LUN+32,R3 ;BIAS OF USER BUFFER, MOV MAP6+P$LUN+34,R4 ;OFFSET OF USER BUFFER CALL $BLXIO ;COPY THE BUFFER! MOV (SP)+,R3 ;RESTORE I/O PACKETU* BR DEAPKT ;AND DEALLOCATE THE CPR PACKET;Q$; NETWORK ACCESS AND DEACCESS STUBS.;ENTACC: TST 14(SP) ; DID ACCESS FAIL? ( BLT NTAERR ; YES, HANDLE ACCESS ERROR.: MOV #$XXWIN,(R4) ; SET UP REFERENCE TO FAKE WINDOW BLOCK. BR DEAPKTNTDEA: TST 14(SP) ; DID ACCESS FAIL?#( BLT NTAERR ; YES, HANDLE ACCESS ERROR.3 CLR (R4) ; DELETE REFERENCE TO FAKE WINDOW BLOCK. ( MOV R3,-(SP) ; SAVE I/O PACKET ADDRESS. MOV R3,R1 ; PASS IT TO XXDET. & MOV I.UCB(R3),R5 ; PASS UCB TO XXDET.1 JSR PC,XXDET ; CALL XXDET TO DELETE ACB, IF ANY.A+ MOV (SP)+,R3 ; RESTORE I/O PACKET ADDRESS.. BR DEAPKT;T3; PROCESS ACCESS OR DEACCESS ERROR FOR FILE ACCESS.A;EFNAERR:R7 BIC #1,(R4) ; CLEAR INTERLOCK BIT, LEAVING SECOND LUN , ; WORD UNCHANGED FROM ORIGINAL VALUE. BR FNACP ; JOIN COMMON CODE.; ; FINISH ACCESS FILE FUNCTION ;DFNACC: TST 14(SP) ; DID ACCESS FAIL?M( BLT FNAERR ; YES, HANDLE ACCESS ERROR.8 MOV #$XXWIN,(R4) ;SET UP REFERENCE TO FAKE WINDOW BLOCK BR FNACP ;JOIN COMMON CODE;L ; FINISH DEACCESS FILE FUNCTIONS; FNDEA: TST 14(SP) ; DID ACCESS FAIL?B( BLT FNAERR ; YES, HANDLE ACCESS ERROR.1 CLR (R4) ;DELETE REFERENCE TO FAKE WINDOW BLOCK); ; FINSH ACP FUNCTION;IFNACP:* MOV R3,-(SP) ;SAVE THE I/O PACKET ADDRESS$ MOV R3,R5 ;COPY I/O PACKET ADDRESS% MOV I.PRM(R5),R3 ;IS THERE A BUFFER? BEQ ACPDON ;IF EQ NO D MOV R3,@#KISAR6 ;MAP CPR BUFFER; ; COPY FNB IF THERE IS ONE;W' MOV I.PRM+16(R5),R4 ;GET OFFSET OF FNBB BEQ COPFID ;IF EQ NONE! MOV #15.*2,R0 ;GET LENGTH OF FNBE+ CALL COPPRM ;COPY FNB INTO USER'S BUFFER C; ; COPY FID IF THERE IS ONE;DCOPFID: ! TST I.PRM+2(R5) ;IS THERE A FID?E BPL COPATR ;IF EQ NO MOV #3.*2,R0 ;LENGHT OF FID MOV #100,R4 ;OFFSET TO FID0 CALL COPPRM ;COPY FID BACK INTO USER'S BUFFER ;D; COPY UPDATED ATTRIBUTES ;R4COPATR: MOV I.PRM+6(R5),R1 ;GET OFFSET OF ATTRIBUTES BEQ ACPDON ;IF EQ NONE, BIS #MAP6,R1 ;MAKE SURE IT'S A APR6 ADDRESS10$: TSTB (R1) ;TEST ATTRIBUTEP BEQ ACPDON ;IF EQ, NONE* 0/ BGT 20$ ;IF GT ZERO, IT WAS A WRITE ATTRIBUTEO MOV #512.,R0 ;ASSUME FULL SIZE 3 CMP #366,(R1)+ ;IS THIS "READ ENTIRE FILE HEADER"?E BEQ 11$ ;YES, CONTINUE& MOVB -1(R1),R0 ;GET SIZE OF ATTRIBUTE!11$: CMP R0,$CPMXB ;IS IT TOO BIGO0 BHI 30$ ;IF HI YES, DIRECT ACCESS ALREADY DONE TST (R1)+ ;SKIP PAST BIASA& MOV (R1)+,R4 ;GET OFFSET TO ATTRIBUTE- MOV R1,-(SP) ;SAVE POINTER TO ATTRIBUTE LISTR CALL COPPRM ;COPY PARAMETERS MOV (SP)+,R1 ;RESTORE POINTER BR 10$ ;GET NEXT ATTRIBUTE*20$: TST (R1)+ ;SKIP PAST TYPE AND LENGTH+30$: CMP (R1)+,(R1)+ ;SKIP PAST BIAS/OFFSETC BR 10$ ;GET NEXT ATTRIBUTE(ACPDON: MOV (SP)+,R3 ;RESTORE I/O PACKET JMP DEAPKTR;RB; COPPRM - COPY PIECE OF CPR BUFFER BACK INTO USER'S ADDRESS SPACE; (; INPUTS: R0 - LENGTH OF BUFFER IN BYTES6; R4 - OFFSET OF SOURCE BUFFER FROM TOP OF CPR BUFFER; R5 - I/O PACKET ADDRESS;; USER ADDRESS MUST BE LOCATED AFTER THE INDICATED BUFFER E;S; OUTPUT: BUFFER IS COPIED;RCOPPRM:0 MOV R0,-(SP) ;SAVE LENGTH! ADD R4,R0 ;ADD OFFSET OF BUFFERE INC R0 ;INC AND BIC TO...K BIC #1,R0 ;ROUND TO NEXT WORDE" MOV MAP6(R0),R0 ;GET USER ADDRESS# CALL $RELOC ;RELOCATE THE ADDRESSR MOV R1,R3 ;OUTPUT BIAS0 MOV R4,R1 ;HOLD CPR PACKET OFFSET FOR A MOMENT MOV R2,R4 ;OUT00zZtsf__DATADATADATADATAPUT OFFSET MOV R1,R2 ;CPR PACKET OFFSET BIS #MAP5,R2 ;GET SOURCE OFFSET" MOV I.PRM(R5),R1 ;GET SOURCE BIAS MOV (SP)+,R0 ;GET THE LENGTH ' CALLR $BLXIO ;PERFORM COPY AND RETURN ;IH; SPC DOES SOME SPECIAL POST-PROCESSING FOR SF.GMC AND SF.SMC FUNCTIONS.K; WE LOOK THROUGH THE PORTION OF THE BUFFER THAT VMS SUCCESSFULLY PROCESSEDA; TO FIND CHARACTERISTICS WHICH REQUIRE ADDITIONAL WORK FROM RSX.R;RD; WE ASSUME ONLY CHARACTERISTICS WITH THE NORMAL TWO-BYTE FORMAT AREI; SUCCESSFULLY PROCESSED BY VMS. THAT IS, THE ODDER CHARACTERISTICS WITHAI; ADDITIONAL PARAMETERS ARE NOT IN THE PORTION OF THE BUFFER WE WILL SEE. J; IF THAT CHANGES, IT WILL BE NECESSARY TO IMPROVE THE SCANNING ALGORITHM.;S; INPUT:; R0 -- CPR PACKET; R1 -- I/O PACKETD; THE I/O STATUS IN THE CPR PACKET MUST INCLUDE THE LENGTH PROCESSEDC; IN THE SECOND WORD, WHETHER OR NOT AN ERROR OCCURRED. THE LENGTHL&; MAY BE ZERO, BUT IT MUST BE CORRECT.;A ; OUTPUT:W?; ON SF.SMC OPERATIONS, SLAVE AND SERIAL SETTINGS ARE ADJUSTED.M;; ON SF.GMC OPERATIONS, THE PRIVILEGED STATUS IS FILLED IN.R'; FN1BF IS CALLED FOR FINAL PROCESSING.F;WSPC:7 CMP #SF.GMC,I.FCN(R3) ; IS THIS A GET CHARACTERISTICS?E% BEQ 10$ ; YES, WE WILL PROCESS IT.7 CMP #SF.SMC,I.FCN(R3) ; IS THIS A SET CHARACTERISTICS?I( BNE 90$ ; NO, WE WILL NOT PROCESS IT.10$: MOV R5,-(SP)C MOV R2,-(SP)E MOV R0,-(SP)O MOV @#KISAR6,-(SP)T' MOV R0,@#KISAR6 ; MAP THE CPR PACKET..7 MOV MAP6+H$STAT+2,R0 ; GET THE LENGTH FROM THE STATUS.L) MOV I.PRM(R3),@#KISAR6 ; MAP THE BUFFER.T& MOV I.PRM+2(R3),R2 ; GET THE OFFSET./ BIS #MAP6,R2 ; ADJUST IT TO THE APR 6 REGION.! MOV I.UCB(R3),R5 ; GET THE UCB.H7 CMP #SF.GMC,I.FCN(R3) ; IS THIS A GET CHARACTERISTICS?C BNE 20$ ; NO, GO ON.F+ JSR PC,SCNGMC ; DO THE GMC-SPECIFIC SCAN.E BR 30$ ; JOIN COMMON CODE.S20$:+ JSR PC,SCNSMC ; DO THE SMC-SPECIFIC SCAN.,30$: MOV (SP)+,@#KISAR6T MOV R0,(SP)+A MOV R2,(SP)+P MOV R5,(SP)+V90$:' CALLR FN1BF ; CALL FN1BF AND RETURN.T;ML; SCNGMC SCANS A BUFFER OF TERMINAL CHARACTERISTICS AND PERFORMS ADJUSTMENTS,; NECESSARY TO COMPLETE AN SF.GMC OPERATION.;N*; SEE ASSUMPTION DESCRIBED IN SPC ROUTINE.;F; INPUT:; R0 -- LENGTH OF BUFFER?; R2 -- START OF BUFFER (WHICH IS, OF COURSE, CURRENTLY MAPPED)G/; R5 -- UCB OF DEVICE SF.GMC WAS PERFORMED UPONS;0 ; OUTPUT:, ; R0 -- ZERO!; R2 -- JUST BEYOND END OF BUFFER(;+SCNGMC:T+ ASR R0 ; CONVERT FROM BYTES TO NUMBER OF)# ; TERMINAL CHARACTERISTICS. ) BEQ 90$ ; IF ZERO, WE'RE DONE ALREADY.E10$:< CMPB #TC.PRI,(R2) ; IS THIS THE PRIVILEGED CHARACTERISTIC? BNE 20$ ; NO, GO ON.T2 CLRB 1(R2) ; ASSUME TERMINAL IS NOT PRIVILEGED.* BIT #U2.PRV,U.CW2(R5) ; IS IT PRIVILEGED?( BEQ 70$ ; NO, WE WERE CORRECT, GO ON.- INCB 1(R2) ; YES, INDICATE THAT IN BUFFER.G*; BR 70$ ; GO ON TO NEXT CHARACTERISTIC.20$:70$: ; END OF LOOP.F. TST (R2)+ ; ADVANCE TO NEXT CHARACTERISTIC.+ SOB R0,10$ ; CONTINUE IF THERE ARE MORE.A90$: RTS PCQ;;L; SCNSMC SCANS A BUFFER OF TERMINAL CHARACTERISTICS AND PERFORMS ADJUSTMENTS,; NECESSARY TO COMPLETE AN SF.SMC OPERATION.;*; SEE ASSUMPTION DESCRIBED IN SPC ROUTINE.;E; INPUT:; R0 -- LENGTH OF BUFFER?; R2 -- START OF BUFFER (WHICH IS, OF COURSE, CURRENTLY MAPPED) /; R5 -- UCB OF DEVICE SF.SMC WAS PERFORMED UPONG;N ; OUTPUT:A ; R0 -- ZERO!; R2 -- JUST BEYOND END OF BUFFER;TSCNSMC:;+ ASR R0 ; CONVERT FROM BYTES TO NUMBER OF # ; TERMINAL CHARACTERISTICS.0) BEQ 90$ ; IF ZERO, WE'RE DONE ALREADY.E10$:8 CMPB #TC.TBM,(R2) ; IS THIS THE SERIAL CHARACTERISTIC? BNE 20$ ; NO, GO ON.P- TSTB 1(R2) ; DOES USER WANT TO TURN IT ON? " BEQ 15$ ; NO, THEY WANT IT OFF.* BIS #UM.SER,U.MUP(R5) ; OKAY, TURN IT ON.) BR 70$ ; GO ON TO NEXT CHARACTERISTIC. 15$:2 BIT #1,U.LFLG(R5) ; IS SERIAL MODE BEING FORCED?& BNE 70$ ; YES, WE MUST LEAVE IT ON.0 BIC #UM.SER,U.MUP(R5) ; NO, WE CAN TURN IT OFF.) BR 70$ ; GO ON TO NEXT CHARACTERISTIC.A20$:7 CMPB #TC.SLV,(R2) ; IS THIS THE SLAVE 00zbt{ctibjbkb a a aCHARACTERISTIC? BNE 30$ ; NO, GO ON.T- TSTB 1(R2) ; DOES USER WANT TO TURN IT ON?," BEQ 25$ ; NO, THEY WANT IT OFF.* BIS #U2.SLV,U.CW2(R5) ; OKAY, TURN IT ON.) BR 70$ ; GO ON TO NEXT CHARACTERISTIC.,25$:% BIC #U2.SLV,U.CW2(R5) ; TURN IT OFF.C*; BR 70$ ; GO ON TO NEXT CHARACTERISTIC.30$:70$: ; END OF LOOP. . TST (R2)+ ; ADVANCE TO NEXT CHARACTERISTIC.+ SOB R0,10$ ; CONTINUE IF THERE ARE MORE.O90$: RTS PCC .ENDA20$:7 CMPB #TC.SLV,(R2) ; IS THIS THE SLAVE .TITLE EXESBN .IDENT /15.02/R;R,; Copyright (c) 1995 by Mentec, Inc., U.S.A.; 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.;O; D. N. CUTLER 4-AUG-73P;P; PREVIOUSLY MODIFIED BY:(;+; J. R. KAUFFMAN; J. M. LAWLER; B. S. MCCARTHY ; K. L. NOEL;; MODIFIED BY:;; K. L. NOEL 14-SEP-89 15.00; !; KLN147 - MOVE TASK INDEX FIELDR;D; K. L. NOEL 8-NOV-89 15.01M;(/; KLN152 - CHECK FOR 0 TASK INDEX BEFORE TICLRo;i$; Modified for RSX-11M-PLUS V4.6 by:;l; D. Carroll 18-Oct-1995 15.02;; DC404 - Include PSECT definition to allow ICB pool to beR ; fully expanded during sysgen;E; ;S; I/O RELATED ROUTINES;U5; ROUTINES CALLED PRIMARILY FROM WITHIN THE EXECUTIVE.; ; MACRO LIBRARY CALLSR; 8 .MCALL F11DF$,HDRDF$,HWDDF$,PCBDF$,PKTDF$,SHDDF$,TCBDF$/ F11DF$ ;DEFINE WINDOW AND LOCK BLOCK OFFSETS % HDRDF$ ;DEFINE TASK HEADER OFFSETS $ HWDDF$ ;DEFINE HARDWARE REGISTERS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSP$ PKTDF$ ;DEFINE I/O PACKET OFFSETS* SHDDF$ ;DEFINE SHADOW RECORDING OFFSETS, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS ;DC404. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;DC404 .PAGE;+); **-$ACHKP-ADDRESS CHECK PARAMETER BLOCKR6; **-$ACHKW-ADDRESS CHECK PARAMETER BLOCK WORD ALIGNED;CG; THESE ROUTINES ARE CALLED TO ADDRESS CHECK A TASK SPECIFIED PARAMETER M; BLOCK TO INSURE IT IS WITHIN THE TASK'S ADDRESS SPACE AND ALIGNED PROPERLY.AI; IF EITHER CHECK FAILS, THEN A DIRECTIVE STATUS OF 'D.RS98' IS RETURNED.F; ; INPUTS:D;R1; R0=STARTING ADDRESS OF THE BLOCK TO BE CHECKED.O0; R1=LENGTH OF THE BLOCK TO BE CHECKED IN BYTES.; ; OUTPUTS:; A; THE SPECIFIED BLOCK IS CHECKED FOR PROPER ALIGNMENT AND WHETHERA?; IT IS WITHIN THE TASK'S ADDRESS SPACE. IF EITHER CHECK FAILS,N@; 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)A-; (FOR PRIVILEGED TASKS SEE NOTE IN $ACHKB.)T;O&; R0 AND R3 ARE PRESERVED ACROSS CALL.;- .ENABL LSB 1$ACHKP::MOV R3,R0 ;SET ADDRESS OF BLOCK TO CHECKF) CALL $ACHCK ;ADDRESS CHECK WORD ALIGNEDU BCS 10$ ;IF CS CHECK FAILURE/ CALL $RELOC ;RELOCATE PARAMETER BLOCK ADDRESS & MOV R1,KISAR6 ;MAP TO PARAMETER BLOCK- MOV R2,R3 ;REDEFINE PARAMETER BLOCK ADDRESSU RETURN ; 0$ACHKW::CALL $ACHCK ;ADDRESS CHECK WORD ALIGNED BCC 50$ ;IF CC OKAYS(10$: DRSTS D.RS98 ;SET DIRECTIVE STATUS .PAGE;+&; **-$ACHKB-ADDRESS CHECK BYTE ALIGNED&; **-$ACHCK-ADDRESS CHECK WORD ALIGNED;.J; THIS ROUTINE IS CALLED TO ADDRESS CHECK A BLOCK OF MEMORY TO SEE WHETHER7; IT LIES WITHIN THE ADDRESS SPACE OF THE CURRENT TASK.S;E ; INPUTS:;L1; R0=STARTING ADDRESS OF THE BLOCK TO BE CHECKED.R0; R1=LENGTH OF THE BLOCK TO BE CHECKED IN BYTES.;N ; OUTPUTS:;C; C=1 IF ADDRESS CHECK FAILED.!; C=0 IF ADDRESS CHECK SUCCEEDED.A;N+; 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 SHUF00{jtsf__DATADATADATADATAFLED 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 MAPPINGD2 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$$LIB 4 MOV H.SMAP(R2),-(SP) ;SAVE USER/SUPER MAPPING MASKS ;FOR LATERP+145$: CLR -(SP) ;ALLOCATE SPACE FOR BUFFER= ;DESCRIPTOR MASK .IFTF ; DF U$$DAS!S$$LIB 3 MOV H.WND(R2),R2 ;POINT TO NUMBER OF WINDOW BLOCKST. 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, WE 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 .IF DF S$$LIB* TSTB W.BFPD(R2) ;SUPERVISOR MODE MAPPING?. BPL 20$ ;IF PL YES, IGNORE FOR ADDRESS CHECK .ENDC ; DF U$$DAS& CMP R0,W.BLVR(R2) ;COMPARE LOW LIMITS" BLO 20$ ;IF LO NOT IN DESCRIPTOR' CMP R1,W.BHVR(R2) ;COMPARE HIGH LIMITSE* BLOS 40$ ;IF LOS BUFFER IS IN DESCRIPTOR<; TEST FOR ISSUER PR:0. IF SO MAPPING SUCCESSFUL EVEN THOUGH; LAST ADDRESS FAILED MAPPINGH2 MOV $TKTCB,-(SP) ;GET TCB ADDRESS OF CURRENT TASK1 ADD #T.ST3,(SP) ;POINT 00{rtctibjbkb a a aTO THIRD TASK STATUS WORDI% BIT #T3.PRV,@(SP)+ ;TASK PRIVILEGED?.' BEQ 20$ ;IF EQ NO, LAST ADDR. FAILURE23 CMP R0,W.BHVR(R2) ;LAST ADDRESS FAILURE OK, BUT ISD! ;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 GUARANTEED 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 TRA00{ztsf__DATADATADATADATANSFER 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 ISB; 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 RELEASET@; BUFFERS FOR AN I/O REQUEST ONE AT A TIME, I.E. THE DRIVERA; SHOULD NOT CALL $DECIO DIRECTLY, BUT SHOULD CALL $IODON OR5; $DECAL AFTER ALL BUFFER ACCESS HAS SCOMPLETED.N;.F; 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 BE 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$ 00{tctibjbkb a a a;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 ;+2; **-$CEFN-CONVERT EVENT FLAG NUMBER FOR DIRECTIVE,; **-$CEFI-CONVERT EVENT FLAG NUMBER FOR I/O;#>; THIS ROUTINE IS CALLED TO CONVERT AN EVENT FLAG NUMBER TO ANA; EVENT FLAG MASK WORD AND EVENT FLAG MASK ADDRESS. IF AN ILLEGAL0A; EVENT FLAG IS SPECIFIED, THEN A DIRECTIVE STATUS OF 'D.RS97' IS+@; RETURNED. ELSE THE EVENT FLAG NUMBER IS CONVERTED AND THE COM-*; PONENT PARTS ARE RETURNED TO THE CALLER.;G ; INPUTS:C;T'; R0=EVENT FLAG NUMBER TO BE CONVERTED.G6; R3=ADDRESS CONTAINING EVENT FLAG NUMBER ($CEFN ONLY)0; R5=TCB ADDRESS OF THE TASK THE EFN APPLIES TO.;T ; OUTPUTS:;B,; C=1 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 MASK00{tsf__DATADATADATADATA 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 FLAGE; 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); R1=ADDRESS OF GROUP GLOBAL EVENT FLAGSC;P;; C=1 IF THE EVENT FLAGS WERE NOT FOUND OR IF THE SPECIFIEDG; TASK IS CHECKPOINTED.R; ;- .IF DF G$$GEF$$GTGEF::MOV R0,-(SP) ;SAVE REGISTERS MOV R4,-(SP) ;F. MOV T.PCB(R5),R4 ;GET TASK REGION PCB ADDRESS8 BIT #PS.OUT!PS.CKP,P.STAT(R4) ;TASK HEADER ACCESSIBLE ? SEC ;ASSUME IT WAST BNE 10$ ;IF NE YES .IF DF X$$HDR1 MOV KISAR6,-(SP) ;SAVE MAPPING IN CASE XTRNL HDRR( MOV P.HDR(R4),-(SP) ;GET HEADER ADDRESS BNE 5$ ;IF NE RESIDENT HEADERS- MOV P.REL(R4),KISAR6 ;MAP TO EXTERNAL HEADERE- MOV #140000,(SP) ;SET HEADER VIRTUAL ADDRESSG)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 .PAGE;+/; **-$SRGEF-SEARCH FOR GROUP GLOBAL EVENT FLAGS ;)?; THIS ROUTINE IS CALLED TO SEARCH FOR GROUP GLOBAL EVENT FLAGSN;E ; INPUTS:P;K; R4=GROUP NUMBERI; ; OUTPUTS:;F5; C=1 IF SPECIFIED GROUP GLOBAL EVENT FLAGS NOT FOUNDD5; C=0 IF SPECIFIED GROUP GLOBAL EVENT FLAGS ARE FOUNDC'; R0=ADDRESS OF WORD POINTING TO BLOCK ; R1=ADDRESS OF THE BLOCK;1;-:$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 SEARCHING +20$: SEC ;SET CARRY TO INDICATE NOT FOUNDF30$: RETURN ;G .ENDC ; DF G$$GEF .PAGE;+?; **-$CVDVN-CONVERT DEVICE NAME AND LOGICAL UNIT TO UCB ADDRESSW; 3; THIS ROUTINE TAKES A 2 CHARACTER ASCII NAME AND A-4; UNIT NUMBER AND SEARCHES THE DEVICE TABLES TO FIND ; THE CORRESPONDING UCB ADDRESS.;E ; INPUTS:T;O%; R0=TWO CHARACTER ASCII DEVICE NAME.B; R1=UNIT NUMBER. ;E ; OUTPUTS:;P; C=0 IF DEVICE WAS FOUND.; R2=UCB ADDRESS.; R3=DCB ADDRESS.; C=1 IF DEVICE NOT FOUND.;;-$CVDVN::SAVNR ;SAVE REGISTERSO0 MOV #$SCDVT,-(SP) ;SET UP TO SCAN DEVICE TABLES*10$: CALL @(SP)+ ;GET ADDRESS OF NEXT DCB BCS 100$ ;IF CS END OF LISTW4 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 NO 5 CMPB D.UNIT+1(R3),R1 ;UNIT ASSOCIATED WITH THIS DCB?0 BLO 10$ ;IF LO NOD 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 NUMBER4 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 V00{tctibjbkb a a aIRTUAL TERMINAL.;S ; INPUTS:T;V; NONE.;V ; OUTPUTS:;D; R0-R3 ARE MODIFIED.V;- .IF DF V$$TRM!C$$RTKB7$TICLR::MOV $TKTCB,R3 ;PICK UP CURRENT TASK TCB ADDRESSN$ .IF DF C$$RTK ;REMOTE TASK SUPPORT2 TSTB T.TKI(R3) ;HAS THIS TASK EVER SENT A PACKET?1 BEQ 130$ ;IF EQ NO, NO NEED TO DO SPECIAL STUFFT3 BIT #F5.RTK,$FMSK5 ;REMOTE TASK SUPPORT TURNED ON?  BEQ 130$ ;IF EQ NOC CMPB T.TKI(R3),$RMTSK ;IS IT ONE OF THE STATIC REMOTE TASKS - OR -I* ; IF ZERO, IT HAS NEVER ASSIGNED A LUN BLOS 130$ ;IF LOS, YES; CMPB T.TKI(R3),#-1 ;HAS THIS TASK BEEN TERMINATED ALREADY?9 BEQ 130$ ;IF EQ YES, NO NEED TO CLEAR LUNS OR TERMINATEC ; TASK AGAIN MOV R5,-(SP) ;SAVE REG  MOV KISAR6,-(SP) ;SAVE MAPPINGK. MOV $SAHDB,KISAR6 ;MAP HEADER OF CURRENT TASK MOV R3,R5 ;COPY TCB ADDRESSP$ MOV $SAHPT,R1 ;POINT TO TASK HEADER( ADD #H.NLUN,R1 ;POINT TO NUMBER OF LUNS! MOV (R1)+,R3 ;GET NUMBER OF LUNS;- BEQ 125$ ;IF NONE, DON'T NEED TO CLEAR LUNS 90$: MOV (R1),R0 ;GET UCB ADDRESS BEQ 110$ ;IF EQ, NOT ASSIGNEDC# CALL $MPLND ;FOLLOW ALL REDIRECTS ( CMP (R0),$XXLOW ;IS IT A GENERIC DEVICE BLO 110$ ;IF LO NO( CMP (R0),$XXHGH ;IS IT A GENERIC DEVICE BHI 110$ ;IF HI NO100$:R CLR (R1)+ ;CLEAR TABLE ENTRY CLR (R1)+ ; BR 120$ ;R110$:K( CMP (R1)+,(R1)+ ;DON'T CLEAR THIS ENTRY$120$: SOB R3,90$ ;LOOP FOR ALL LUNS125$: " MOV (SP)+,KISAR6 ;RESTORE MAPPING? MOV #AL$SWS,R0 ;INDICATE WE WANT TO COME BACK WITH CS IF ERRORR MOV #1,R1 ;NEED JUST ONE BLOCK) CALL $CPALO ;ALLOCATE A BLOCK OF CPRBUFC5 BCS 127$ ;IF CS, JUST DON'T DO THE TASK TERMINATIONW MOV KISAR6,-(SP) ;SAVE MAPPING  MOV R0,KISAR6 ;MAP PACKET* MOV #140000,R1 ;POINT TO HEADER OF PACKET1 MOVB #HT$TKN,H$TYPE(R1) ;TASK TERMINATION PACKET1# CLRB H$ICNT(R1) ;INDICATE NO ITEMS1" MOV (SP)+,KISAR6 ;RESTORE MAPPING8 CPSEN$ #SN$DET,R0,#H$SIZE ;SEND TASK TERMINATION PACKET127$:O> CLRB T.TKI(R5) ;CLEAR TASK INDEX SO TASK DOESN'T TRY ANYTHING ; WITHOUT A TASK START MOV R5,R3 ;RESTORE TCB ADDRESS MOV (SP)+,R5 ;RESTORE REG .ENDC ;C$$RTK .IF DF V$$TRM130$: * MOV T.UCB(R3),R0 ;PICK UP TI: UCB ADDRESS' MOV (R0),R1 ;POINT TO TI: DCB ADDRESS4. CMP D.NAM(R1),#"VT ;IS IT A VIRTUAL TERMINAL? BNE 150$ ;IF NE NO .IF DF D$$PAR MOV KINAR5,-(SP) ;SAVE APR 5M2 MOV $DRAPR,KINAR5 ;MAP TO THE DIRECTIVE PARTITION .ENDC1 CALL $CVTLN ;CLEAR OUT ANY LUNS ASSIGNED TO VT:., 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?C BNE 140$ ;IF NE NO MOV R3,-(SP) ;SAVE TCB ADDRESSP& CALL $DEAVT ;DEALLOCATE THE VT: UNIT" MOV (SP)+,R3 ;RESTORE TCB ADDRESS140$: ;REFERENCE SYMBOL .IF DF D$$PAR" MOV (SP)+,KINAR5 ;RESTORE MAPPING .ENDC MOV $COPT,R0 ;POINT TO CO: UCB;! CALL $MPLND ;FOLLOW REDIRECTION.$ MOV R0,T.UCB(R3) ;ASSIGN TI: TO CO: .ENDC ;V$$TRM150$: RETURN ; .IFFV0$TICLR::RETURN ;NOP ROUTINE IF LACK OF SUPPORT .ENDC .PAGE;+,; **-$MPLNE-MAP LOGICAL UNIT NUMBER FOR EXIT#; **-$MPLUN-MAP LOGICAL UNIT NUMBER(; K; THIS ROUTINE IS CALLED TO VALIDATE A LOGICAL UNIT NUMBER (LUN) AND TO MAPSD; 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.;A ; INPUTS:O;:; 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 UCB4; R2=ADDRESS OF REDIRECTED-TO UCB OR SPOOLED DEVICE; @; 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 LSB.($MPLUN::CLR R1 ;GET LOGICAL UNIT NUMBER BISB (R3)+,R1 ; INC R3 ;POINT TO NEXT WORD DEC R1 ;BACK OFF LUN BY 1C CMP R1,H.NLUN(R4) ;LE00{t|tf__DATADATADATADATAGAL LUN? BHIS 40$ ;IF HIS NO $$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 HEADERO SEC ;ASSUME LUN NOT ASSIGNED-( MOV (R1)+,R0 ;GET POINTER TO DEVICE UCB# BEQ 30$ ;IF EQ NO DEVICE ASSIGNED 5$MPLND::MOV R0,R2 ;INITIALIZE SPOOLED DEVICE UCB PTRA+5$: CMP R0,U.RED(R0) ;IS DEVICE REDIRECTED?1 BEQ 10$ ;IF EQ NOU. MOV U.RED(R0),R0 ;GET POINTER TO REDIRECT UCB2 BIT #DV.ISP!DV.OSP,U.CW1(R2) ;SPOOLED DEVICE YET?* BEQ $MPLND ;IF EQ NO, ADVANCE R2 AS WELL' BR 5$ ;ELSE INHIBIT ADVANCEMENT OF R2 .10$: MOV (R0),-(SP) ;GET ADDRESS OF DEVICE DCB- ADD #D.NAM,(SP) ;POINT TO DEVICE NAME IN DCB / CMP #"TI,@(SP)+ ;TERMINAL INPUT PSEUDO DEVICE?I BNE 20$ ;IF NE NOB* MOV T.UCB(R5),R0 ;GET ADDRESS OF "TI" UCB BR $MPLND ;T$20$: CLC ;INDICATE DEVICE ASSIGNED30$: RETURN ;S(40$: DRSTS D.RS96 ;SET DIRECTIVE STATUS .DSABL LSB) .PAGE;+*; **-$TKWSE-TASK WAITFOR SIGNIFICANT EVENT;2M; THIS ROUTINE IS CALLED TO EXECUTE A WAITFOR SIGNIFICANT EVENT DIRECTIVE FORS-; THE CURRENT TASK FROM WITHIN THE EXECUTIVE.P;G ; INPUTS:O;E; NONE.;D ; OUTPUTS:;OC; A WAITFOR SIGNIFICANT EVENT DIRECTIVE IS EXECUTED FOR THE CURRENTE.; 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 EVENT4 CALLR $SETRQ ; .TITLE INICRA .IDENT /3.00/1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reservedi;f;X; J. WEHNER 06-MAY-83;.&; LOADABLE CRASH INITIALIZATION MODULE;u; PREVIOUSLY MODIFIED BY:w;B; J. G. WEHNER; J. W. BERZLE; G. N. LARSEN; P. K. M. WEISS;4?; MODIFIED FOR RSX-11M-PLUS V4.3 - VAX COPROCESSOR/RSX V2.0 BY:V;E; K. L. NOEL 19-JUL-89 V3.00;0>; KLN138 -- VECTOR SYMBOLS FOR NETWORK LOADABLE CRASH DRIVERS;0;C;***********************;LF; 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 THIS35; LOCATION TO BYPASS THE EXP INITIALIZATION ROUTINES.V;S .WORD TRNSFR B;*********************** .MCALL DIR$,GIN$;.; EXEC ENTRY VECTOR TABLED;REXEVEC:P .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 $CRSCSCRSFM:: .WORD $CRSFMCRSUN:: .WORD $CRSUNCRUNT:: .WORD $CRUNTHFMSK:: .WORD $HFMSKKISA5:: .WORD KISAR5KISA6:: .WORD KISAR6MSCR1:: .WORD $MSCR1MSCR2:: .WORD $MSCR2MSCR3:: .WORD $MSCR3UISA6:: .WORD UISAR6SYSIZ:: .WORD $SYSIZEXEVCL=<<.-EXEVEC>/2>E>TRNVEC: GIN$ GI.VEC,EXEVEC,EXEVCL ; TRANSLATE EXECUTIVE VECTOR;R; INITIALIZE CRASH DATA BASE ;M$XPL00|t}tibjbkb a a aOA:: MOV PC,R0 ; MAKE CODE PIC* ADD #TRNVEC-.,R0 ; RELOCATED ADDR OF DPB MOV PC,R1 W ADD #EXEVEC-.,R1 , MOV R1,4(R0) ; RELOCATE EXEVEC ADDR IN DPB' DIR$ R0 ; TRANSLATE EXECUTIVE VECTOR  BCC 5$M BPT5$:W# ADD #2,CRSB2 ; MAKE THIS $CRSBN+2R! INC CRDV1 ; MAKE THIS $CRDEV+1C& 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$ ; 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 .TITLE TTTBL  .IDENT /07.00/C;S1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.A; All rights reservedA;E;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;T;S; 08-MAY-78 PETER WANNHEDENT;E; PREVIOUSLY MODIFIED BY:0;M ; C. F. SPITZ;; D. R. DONCHINS ; T. LEKAS; S. C. ADAMS ; K. L. FELDMANN;R; MODIFICATIONS:; ;;$; MODIFIED FOR RSX-11M-PLUS V4.3 BY:;U; L. KOGAN 5-OCT-89 07.00I?; LK750 -- CLEAR THE NUMBER OF BYTES IN CURRENT OUTPUT BUFFER ; (U.TOC);e .PSECT MAP5; ;+1; THIS MODULE CONTAINS THE DRIVER DISPATCH TABLE.H?; IN A SYSTEM THAT SUPPORTS KERNEL DATA SPACE, THIS MODULE MUSTE'; BE BUILT INTO THE TASK IMAGE "TTDRV".B; THIS IS IN CONTRAST TO ALL OTHER DRIVER DATA, WHICH IS CONTAINEDA; IN THE MODULE "TTDAT" AND IS BUILT INTO THE TASK IMAGE "TTCOM". ;-;N;R; DRIVER DISPATCH TABLE;;  .IF DF B$$MAP; .IIF NDF,T$$SPC,.ERROR ;ASSUME THAT THERE IS NO SECONDARY ( ;POOL BUFFERS FOR BITMAP SYSTEMS.' ;FOR NOW THERE IS NO SUPPORT FORA ;I/D SPACE BITMAP SYSTEMS0 .WORD R$OUTD ;OUTPUT COMPLETION ROUTINE FOR CT" .WORD G$IN ;INPUT ROUTINE FOR CT .ENDC ;B$$MAP .IF DF T$$SPC7 .WORD NXTCMD ;ROUTINE TO PROCESS THE NEXT CLI COMMANDA .ENDC ;T$$SPC- .WORD DELTB0 ;ROUTINE TO DEALLOCATE BUFFERS '$TTTBL::.WORD TTINI ;REQUEST INITIATORR .WORD TTCAN ;CANCEL I/OD< .WORD $NLTMO ;TIME-OUT - USE SPECIAL NULL TIME-OUT ROUTINE .IF DF R$$CON% .WORD TTPWFL ;POWERFAIL ENTRY POINT , .WORD TTKRB ;KRB STATUS CHANGE ENTRY POINT, .WORD TTUCB ;UCB STATUS CHANGE ENTRY POINT .IFFT .WORD TTPWUP ;POWER-UP .IF DF B$$MAP3 .WORD FORVMR,FORVMR ;VMR REQUIRES THAT THESE WORDSN# ;BE HERE AND THAT THEY POINT TOL! ;TO AN ADDRESS IN THE DRIVER.O! ;THIS IS BECAUSE VMR DOES NOTU ;BELIEVE IN M-PLUS SYSTEMS$ ;WITHOUT RECONFIGURATION SUPPORT .ENDC ;B$$MAP .ENDC U .IF DF R$$MPL E, .IIF DF B$$MAP .IRP X,+ .IIF NDF B$$MAP .IRP X,A .IF IDN X,LH  .IF DF T$$LTH .ASCII /LH/ .WORD $LHDEV .WORD 0LHCTBP::.WORD 0; .ENDC ; T$$LTH  .ENDC ; IDN X,LH, .IF IDN X,USR .IF DF T$$USP .ASCII /US/ .WORD $USINPY .WORD $USOUT  .WORD 0USCTBP::.WORD 0R .ENDC ; T$$USPC .ENDC ; IDN X,US .IF DIF X,LH- .IF DIF X,US  .IF DF D$$'X'11 .ASCII /Y'X'/ .IF IDN X,M .WORD $DM11B. .IFFM .WORD $Y'X'INPB .00}ttf__DATADATADATADATAWORD $Y'X'OUT, .ENDC .WORD 0 .IF IDN X,M .IF NDF T$$COMLYMCP1:: .ENDC ;NDF T$$COM .ENDC ;IDN X,MIY'X'CTBP::.WORD 0 . .ENDC .ENDC ; DIF X,US. .ENDC ; DIF X,LH .ENDR$TTTBE::.WORD 0 ;END OF TABLE;U; . .IF DF T$$COM $); POINTER TO PCB FOR COMMON BLOCK "TTCOM"W; ($TTCOM::.BLKW 1 ;TO BE FILLED IN BY VMR- ;CLEARED BY DRIVER INITIALIZATION ROUTINE  ' .ENDC ;T$$COM X .IFF ;R$$MPL .5$NLTMO::CLR S$$SPC+2(SP) ;FORCE $SCDVT ON TO NEXT DCB'6 INCB S.CTM(R4) ;RESET TIMEOUT COUNT FOR THE NEXT TIME RETURN ;P  .ENDC ;R$$MPL C .IF DF R$$CON7TTPWFL::MOV KINAR6,-(SP) ;SAVE KERNEL INSTRUCTION APR 6U# BCC 20$ ;BRANCH ON UNIT POWERFAIL5 MOV #CT.CPW,R4 ;GET CONTROLLER POWERFAIL OFFSET CODEC. BR TTDSP ;GO TO COMMON CONTROLLER DISPATCHER420$: ADD #U.TSTA,R5 ;POINT TO UCB STATUS TRIPLE-WORD .IF DF T$$ACD6 TST U.ACB-U.TSTA(R5) ;DOES THIS TERMINAL HAVE AN ACD? BEQ 30$ ;N - JUMPO* MOV #A.POWE,R0 ;SET POWERFAIL ENTRY POINT CALL $SWACD ;CALL ACDS .ENDC ;T$$ACD330$: MOV #CT.UPW,R2 ;GET UNIT POWERFAIL OFFSET CODE( BR TTCRD ;GO TO UNIT DEPENDENT ROUTINE7TTKRB:: MOV KINAR6,-(SP) ;SAVE KERNEL INSTRUCTION APR 6 ' BCS 20$ ;BRANCH IF CONTROLLER OFFLINEE .IF DF T$$COM# TST $TTCOM ;GET TTCOM PCB ADDRESSL% BEQ 10$ ;ALREADY INITIALIZED - JUMPI .IFF ;T$$COMT TST $DALED ;GET KISAR6 MAPPING% BNE 10$ ;ALREADY INITIALIZED - JUMPA .ENDC ;T$$COM MOV R2,-(SP) ;SAVE R2# CALL TTINIT ;INITIALIZE THE WORLDL MOV (SP)+,R2 ;RESTORE R2N610$: MOV #CT.CON,R4 ;GET CONTROLLER ONLINE OFFSET CODE. BR TTDSP ;GO TO COMMON CONTROLLER DISPATCHER720$: MOV #CT.COF,R4 ;GET CONTROLLER OFFLINE OFFSET CODE . BR TTDSP ;GO TO COMMON CONTROLLER DISPATCHER7TTUCB:: MOV KINAR6,-(SP) ;SAVE KERNEL INSTRUCTION APR 6- BCS 10$ ;BRANCH IF WANT TO SET UNIT OFFLINE / ADD #U.TSTA,R5 ;POINT TO UCB STATUS TRIPLEWORDE CALL MAPD ;MAP DATA AREA .IF DF T$$SPL+ CALL ALUCBX ;ALLOCATE A UCBX FOR THIS UCB - BCS TTRET1 ;RETURN WITH CC-C SET IF FAILURER .IFF ;T$$SPLC5 CALL CKTAB ;ALLOCATE TYPE-AHEAD BUFFER IF NECESSARYT .IFTF ;T$$SPL .IF DF T$$MOD% BICB #US.CRW!US.DSB,U.STS-U.TSTA(R5)F ;ASSUME LOCAL LINE .ENDC2 MOV #CT.UON,R2 ;SET ROUTINE INDEX FOR UNIT ONLINE3 BR TTCRD ;GO TO UNIT DEPENDENT ROUTINE DISPATCHERW:10$: CLRB U.TMTI(R5) ;PREVENT MODEM TIMEOUT FROM OCCURRING$ ADD #U.TSTA,R5 ;ADVANCE UCB POINTER3 MOV #CT.UOF,R2 ;SET ROUTINE INDEX FOR UNIT OFFLINEX, MOV KISAR6,-(SP) ;SAVE CURRNT APR 6 MAPPING! CALL MAPD ;MAP DRIVER DATA AREA( CALL CTRD ;CALL UNIT DEPENDENT ROUTINE .IFT ;T$$SPL8 TSTB $SCERR ;CHECK FOR ERROR IN UNIT DEPENDENT ROUTINE1 BMI TTRET ;IF MI, ERROR - DON'T DEALLOCATE UCBX, CALL DEUCBX ;DEALLOCATE THE UCBX AND TABUF .IFTF ;T$$SPL% BR TTRET ;GO TO COMMON RETURN CODE3TTDSP: MOV KISAR6,-(SP) ;SAVE CURRENT APR 6 MAPPINGI! CALL MAPD ;MAP DRIVER DATA AREAI MOV @R2,R3 ;GET CSR ' MOVB K.PRM(R2),R1 ;GET CONTROLLER TYPEV, ADD CTBL(R1),R4 ;GET DISPATCH TABLE POINTER0 CALL @(R4)+ ;CALL CONTROLLER DEPENDENT ROUTINE$ BR TTRET ;GO TO COMMON RETURN CODE3TTCRD: MOV KISAR6,-(SP) ;SAVE CURRENT APR 6 MAPPINGR! CALL MAPD ;MAP DRIVER DATA AREA ( CALL CTRD ;CALL UNIT DEPENDENT ROUTINE4TTRET: MOV (SP)+,KISAR6 ;RESTORE ENTRY APR 6 MAPPING:TTRET1: MOV (SP)+,KINAR6 ;RESTORE KERNEL INSTRUCTION APR 6 RETURNR .IFT ;T$$SPLI .ENABL LSBM;D;+;AG; ALUCBX - ALLOCATE A UCB EXTENSION (UCBX) AND TYPEAHEAD BUFFER (TABUF)V6; STUCBX - SET UP A UCB EXTENSION AND TYPEAHEAD BUFFER;+; INPUT:>; R0 APR BIAS OF 1ST SECONDARY POOL BLOCK (IF ENTRY AT STUCBX); R5 POINTER TO U.TSTA; ; OUTPUT:N ; IF SUCCESS:R; CC-C 0I; UCBX AND CONTIGUOUS TABUF ALLOCATED FROM SECONDARY POOL AND INITIALIZED:;V ; IF FAILURE:R; CC-C 1H; IE.ALC RETURNED IN $SCERR TO INDICATE FAILURE TO BRING TERMINAL ONLINE;;-;R>ALUCBX: CALL 20$ ;GET NUMBER OF SECONDARY POOL NODES REQUIRED5 CALL $ALSEC ;ALLOCATE THEM FOR USE BY THIS TERMINALV' BCS 10$ ;BRANC00}ttibjbkb a a aH ON ALLOCATION FAILUREYGSTUCBX::MOV R0,U.TAPR-U.TSTA(R5) ;THESE NODES BECOME THE UCBX AND TABUFI( MOV R0,@#KDSAR5 ;MAP THE UCBX AND TABUF* MOV #120000,R4 ;SET THEIR VIRTUAL ADDRESS ASSUME U.TCI,0U# CLR @R4 ;NO CURRENT INPUT REQUESTO) CLR U.TCO(R4) ;NO CURRENT OUTPUT REQUESTC; CLR U.TOC(R4) ;NO REMAINING BYTES IN CURRENT OUTPUT BUFFERG+ CLRB U.TISV(R4) ;INITIALIZE STATE VARIABLE$ ASSUME U.TITI&1,0 ASSUME U.TOTI,U.TITI+1D. CLR U.TITI(R4) ;CLEAR INPUT AND OUTPUT TIMERS> CLR U.TFPB(R4) ;CLEAR PROMPT BUF ADDRS/UNSOLICITED INPUT FLAG$ CLR U.TRTT(R4) ;NO TERMINATOR TABLE .IF DF T$$EIO9 CLR U.TDIF(R4) ;CLEAR FIRST DEFAULT INPUT BUFFER POINTERR .ENDC ;T$$EIO;D* .IF DF T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB7 ADD #U.TAST,R4 ;POINT TO UNSOLICITED INPUT ACB ADDRESS-X = U.TAST ;SYMBOL NEEDED FOR ASSUME MACROSU .IF DF T$$CCA4 CLR (R4)+ ;CLEAR ACB POINTER FOR UNSOLICITED INPUT X = X + 2M .ENDC ;T$$CCA .IF DF T$$SCA ASSUME U.TSCA,X X = X + 2/ CLR (R4)+ ;CLEAR SWITCH CHARACTER ACB POINTERE .ENDC ;T$$SCA .IF DF T$$MHU ASSUME U.TMHA,X X = X + 2O + CLR (R4)+ ;CLEAR MODEM HANGUP ACB POINTERF .ENDC ;T$$MHU .IF DF T$$ICS ASSUME U.TICA,X X = X + 2U& CLR (R4)+ ;CLEAR ICS ACB/TEP POINTER .ENDC ;T$$ICS .IF DF T$$OOB ASSUME U.TOBA,X X = X + 2 & CLR (R4)+ ;CLEAR OOB ACB/TEP POINTER .ENDC ;T$$OOB* .ENDC ;T$$CCA!T$$SCA!T$$MHU!T$$ICS!T$$OOB ASSUME U.TTBF,X CLR (R4)+ ;INITIALIZE HEADER0 CLRB (R4)+ ;RESET ACTIVE COUNT AND CLEAR CARRY/ MOVB U.TBSZ-U.TSTA(R5),(R4) ;SET SIZE OF TABUF RETURN.310$: MOVB #IE.ALC,$SCERR ;INDICATE CAUSE OF FAILUREU RETURN ;RETURN WITH CARRY SET;.;+;$(; DEUCBX - DEALLOCATE THE UCBX AND TABUF;4; INPUT:; R5 POINTER TO U.TSTA;N ; OUTPUT:0; UCB EXTENSION AND TYPEAHEAD BUFFER DEALLOCATED;-;4?DEUCBX::MOV U.TAPR-U.TSTA(R5),R0 ;GET ADDRESS OF UCBX AND TABUFA% CLR U.TAPR-U.TSTA(R5) ;CLEAR POINTER 2 CALL 20$ ;GET THE NUMBER OF BLOCKS TO DEALLOCATE8 CALLR $DESEC ;DEALLOCATE THE UCBX AND TABUF AND RETURN;(G; CALCULATE THE NUMBER OF SECONDARY POOL BLOCKS REQUIRED TO CONTAIN THEEJ; UCB EXTENSION AND A TYPEAHEAD BUFFER WHOSE SIZE IS KEPT IN OFFSET U.TBSZ;A*20$: CLR R1 ;PREVENT UNWANTED SIGN EXTENDE BISB U.TBSZ-U.TSTA(R5),R1 ;GET THE SIZE OF THE TABUF LESS ITS HEADERF> 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 R1C .DSABL LSBE .ENDC ;T$$SPL .ENDC ;R$$CON .IF DF T$$SER;;+;A'; NXTCMD - PROCESS THE NEXT CLI COMMANDK;E; INPUT:; R0 UCB ADDRESS;X ; OUTPUT: C; THE COMMAND IN PROGRESS BIT (UM.CMD) IS CLEARED AND AN ATTEMPT ISRC; MADE TO PROCESS CHARACTERS FROM THE TYPEAHEAD BUFFER. FOR MULTI- B; PROCESSOR SYSTEMS, IF WE ARE NOT ON THE CORRECT CPU, FORK TO GETE; THERE WITH A NULL FORK REQUEST, SINCE AFTER FORK PROCESSING WE WILLP<; TRY TO PROCESS CHARACTERS FROM THE TYPEAHEAD BUFFER ANYWAY;-; "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 REQUESTR3 CALL SWCPU ;SWITCH TO THE CORRECT CPU (NO RETURN)I- ;OR FALL THRU IF ALREADY ON THE RIGHT CPUO .ENDC ;M$$PRO! CALL LOCKI ;LOCK OUT INTERRUPTST8 CALLR SERPRO ;;;SERIALLY PROCESS CHARACTERS FROM TABUF .ENDC ;T$$SER .IF DF B$$MAP!R$$PRO-)NXTCMD:: ;THIS SHOULD NOT BE CALLED FORV ;P/OS SYSTEMS5.FORVMR: CRASH ;THIS NEEDS TO BE HERE FOR VMR! ;THIS IS BECAUSE VMR DOES NOTU ;BELIEVE IN M-PLUS SYSTEMS$ ;WITHOUT RECONFIGURATION SUPPORT .ENDC ;B$$MAP!R$$PROU;;L .END ;SWITCH TO THE CORRECT CPU (NO RETURN)I- ;OR FALL THRU IF ALREADY ON THE RIGHT CPUO .ENDC ;M$$PRO! CALL LOCKI ;LOCK OUT INTERRUPTST8 CALLR SERPRO ;;;SERIALLY PROCESS CHARACTERS FROM TABUF .ENDC ;T$$SER .IF DF B$$MAP!R$$PRO-)NXTCMD:: ;THIS SHOULD NOT 00~ttt__DATADATADATADATA .TITLE MUDRV - TMSCP DRIVER. .SBTTL TAPEPRE- TMSCP PREFIX FILE DEFINITIONS;R1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.I; All rights reservedW;O;R:; THIS SOFTWARE IS FURNISHED UNDER LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;F;R; VERSION: 02.00P;; PREVIOUSLY MODIFIED BY:O; ; J. MELVINT;U$; MODIFIED FOR RSX-11M-PLUS V4.3 BY:;C; J. MELVIN 06-OCT-89 02.00C9; JJM0437 - UPDATE VARIOUS COMMENTS, CLEAN UP SOURCEO; ; RD.L = 14. ; READ CMD LENGTHB WR.L = 14. ; WRITE CMD LENGTH#CMP.L = 14. ; COMPARE CMD LENGTH9*WTM.L = 6. ; WRITE TAPE MARK CMD LENGTH ERS.L = 6. ; ERASE CMD LENGTH$ERG.L = 6. ; ERASE GAP CMD LENGTH&REP.L = 10. ; REPOSITION CMD LENGTH4SUC.L = 18. ; SET UNIT CHARACTERISTICS CMD LENGTH$AVL.L = 6. ; AVAILABLE CMD LENGTH"ONL.L = 22. ; ONLINE CMD LENGTH!T$$APE = 1 ; ASSEMBLE FOR TAPE6)M.PEOV = 100000 ; TAPE PAST LOGICAL EOVU'M.AEOV = 40000 ; TAPE AT LOGICAL EOVD!M.BOT = 20000 ; TAPE IS AT BOTL1M.1600 = 4000 ; UNIT IS 1600 BPI PHASE ENCODEDA'M.HWL = 2000 ; HARDWARE WRITE-LOCKEDE#M.RWD = 1000 ; UNIT IS REWINDINGS)M.SER = 400 ; SELECT ERROR HAS OCCURED &M.IWR = 200 ; INHIBIT WRITE RETRIES&M.SWL = 100 ; SOFTWARE WRITE-LOCKED5M.TMK = 40 ; ENCOUNTERED TAPE MARK - FWD DIRECTIONG4M.EOT = 20 ; LAST COMMAND ENCOUNTERED END OF TAPE!M.6250 = 10 ; UNIT IS 6250 BPI1DM.DEFM = M.PEOV!M.EOT!M.HWL!M.SWL!M.1600!M.6250!M.SER ; DEFAULT MASK7USRBTS = M.IWR!M.SWL ; STATUS BITS CONTROLLED BY USERUNIT IS 1600 BPI PHASE ENCODEDA'M.HWL = 2000 ; HARDWARE WRITE-LOCKEDE#M.RWD = 1000 ; UNIT IS REWINDINGS)M.SER = 400 ; SELECT ERROR HAS OCCURED &M.IWR = 200 ; INHIBIT WRITE RETRIES&M.SWL = 100 ; SOFTWARE WRITE-LOCKED5M.TMK = 40 ; ENCOUNTERED TAPE MARK - FWD DIRECTIONG4M.EOT = 20 ; LAST COMMAND ENCOUNTERED END OF TAPE!M.6250 = 10 ; UNIT IS 6250 BPI1DM.DEFM = M.PEOV!M.EOT!M.HWL!M.SWL!M.1600!M.6250!M.SER ; DEFAULT  .TITLE DUDRV - MSCP DRIVER - .SBTTL DISKPRE- MSCP PREFIX FILE DEFINITIONSP;H1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.E; All rights reservedN;I;E:; THIS SOFTWARE IS FURNISHED UNDER LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;OI; THIS DEFINES THE SYMBOL NEEDED TO DO CONDITIOANL ASSEMBLY OF DISK CLASS B; DRIVERS. IF THE SYMBOL IS DEFINED, THEN DISK CLASS IS SELECTED.;P;; VERSION: 02.00.;!; PREVIOUSLY MODIFIED BY:.; ; G. MARIGOWDA; $; MODIFIED FOR RSX-11M-PLUS V4.3 BY:;C; J. MELVIN 06-OCT-89 02.00H9; JJM0437 - UPDATE VARIOUS COMMENTS, CLEAN UP SOURCE ;hRD.L = 20 ; READ CMD LENGTHWR.L = 20 ; WRITE CMD LENGTHD"RPL.L = 20 ; REPLACE CMD LENGTH!FMT.L = 20 ; FORMAT CMD LENGTHE)D$$DSK = 0 ; ASSEMBLE DISK CLASS ITEMS &M.SWL = 100 ; SOFTWARE WRITE LOCKEDDRIVERS. IF THE SYMBOL IS DEFINED, THEN DISK CLASS IS SELECTED.;P;; VERSION: 02.00.;!; PREVIOUSLY MODIFIED BY:.; ; G. MAR .TITLE DRGLIO .IDENT /10.07/M;U1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reservedU;OA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDL9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.E;H ; VERSION 08; ; D. N. CUTLER 18-SEP-73;=; PREVIOUSLY MODIFIED BY: ;M; D. N. CUTLER; T. J. MILLER; T. J. MILLER; J. E. PROVINOO ; K. L. NOEL; B. S. MCCARTHY;L2; MODIFIED FOR VAX-CoProcessor/RSX VERSION 1.0 BY:;D ; R. D. HANEY ; K. L. NOEL; +; MODIFIED FOR RSX-11M-PLUS VERSION 4.3 BY: ;5-; B. S. MCCARTHY / K. L. NOEL 20-OCT-89 10.06s;e-; KLN149 -- ADD GDVI SUPPORT TO RSX-11M-PLUSC;E; K. L. NOEL 7-NOV-89 10.07; !; KLN151 -- FIX ABOVE CORRECTIONH;C;E; MACRO LIBRARY CALLS ;  .MCALL HWDDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS& .IF DF C$$RMT ;REMOTE TASK SUPPORT .MCALL CPRDF$ CPRDF$ .ENDC ; C$$RMT ;C; LOCAL SYMBOLSI;D MAP5 = 120000e MAP6 = 140000N4GL$BUF = 4. ;SIZE OF LOCAL BUFFER00ttibjbkb a a a STORAGE FOR GLUN$!GL$SIZ = 3. ;DPB SIZE FOR GLUN$Y GD$SIZ = 4. ;DPB SIZE FOR GDVI$5GN$SIZ = 8. ;DPB SIZE FOR GIN$ (GET ASSIGNED DEVICE) ;+; **-$DRGLI-GET LUN INFORMATIONO;9D; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A SIX WORD BUFFER WITHH; INFORMATION ABOUT A DEVICE THAT IS ASSIGNED TO A SPECIFIED LUN. IF RE-J; QUESTS TO THE DEVICE HAVE BEEN RE-DIRECTED, THEN THE INFORMATION RETURN-&; ED PERTAINS TO THE RE-DIRECT DEVICE.;1 ; DPB FORMAT:1;0!; WD. 00 -- DIC(5.),DPB SIZE(3.).F*; WD. 01 -- LUN TO RETURN INFORMATION FOR.); WD. 02 -- ADDRESS OF A SIX WORD BUFFER.V;; BUFFER FORMAT:;E$; WD. 00 -- NAME OF ASSIGNED DEVICE.:; WD. 01 -- UNIT NUMBER OF ASSIGNED DEVICE AND FLAGS BYTE..; WD. 02 -- FIRST DEVICE CHARACTERISTICS WORD./; WD. 03 -- SECOND DEVICE CHARACTERISTICS WORD. .; WD. 04 -- THIRD DEVICE CHARACTERISTICS WORD./; WD. 05 -- FOURTH DEVICE CHARACTERISTICS WORD.T;- ; INPUTS:A; 9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.-#; R3=ADDRESS OF THE LUN IN THE DPB. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.S,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;E5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)T;M-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.2&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.E7; DIRECTIVE STATUS OF 'D.RS5' IS RETURNED IF NO DEVICEW%; IS ASSIGNED TO THE SPECIFIED LUN.E;- .ENABL LSB .IF DF D$$PAR$DRGL1:: .IFF ; DF D$$PARD$DRGLI:: .ENDC ; DF D$$PARK;IF GDVI SUPPORT IS INCLUDED, DPB VALIDATION OF THE SIZE FIELD HAS NOT BEEN5!;DONE AT THIS POINT. DO IT HERE.T .IF DF G$$DVI3 CMPB #GL$SIZ,-1(R3) ;IS SIZE CONSISTENT WITH GLUN?= BEQ 98$ ;IF EQ YES F3 CMPB #GD$SIZ,-1(R3) ;IS SIZE CONSISTENT WITH GDVI?E BEQ 98$ ;IF EQ YES! DRSTS D.RS99 ;DPB INVALID ERRORF .ENDC ; DF G$$DVI O)98$: CALL $MPLUN ;MAP LUN TO UCB ADDRESSL BCC 105$ ;IF CC DEVICE FOUND .IF DF C$$RTB& BIT #F5.RTB,$FMSK5 ;RUN TIME BINDING? BEQ 99$ ;IF EQ NO JMP $IMASG ;DO IMPLICIT ALUN .ENDC ;C$$RTB)99$: DRSTS D.RS5 ;RETURN ERROR STATUS -5N105$: ;E?; THIS ENTRY POINT IS FOR GIN$ SUBFUNCTION GET ASSIGNED DEVICE T&; AT THIS POINT: R3 = WD 02 OF THE DPB*; R2 = UCB ADDRESS OF DEVICE OR 0 (GIN$);D$RTINF:: MOV R3,-(SP) ;SAVE DPB ADDRESS ) MOV R2,R4 ;SAVE ADDRESS OF DEVICE UCB & MOV #6*2,R1 ;SET LENGTH OF BUFFER # CMPB #GL$SIZ,-3(R3) ;IS THIS GLUN?D BEQ 110$ ;IF EQ YESB, MOV 2(R3),R1 ;GET LENGTH OF BUFFER FROM DPB)110$: MOV (R3),R3 ;GET ADDRESS OF BUFFERN# CALL $ACHKP ;ADDRESS CHECK BUFFERR" MOV (SP)+,R5 ;RESTORE DPB ADDRESS$ .IF DF C$$RTK ;REMOTE TASK SUPPORT( BIT #F5.RTK,$FMSK5 ;REMOTE TASK SUPPORT BNE 130$ ;IF NE YESD#120$: JMP 2$ ;JOIN NON REMOTE CODE 130$:D;R3; IF THIS IS GIN$, THERE IS NO UCB ADDRESS TO CHECK ;V" CMPB #GN$SIZ,-3(R5) ;IS THIS GIN$ BEQ 140$ ;IF EQ YESF; 8; CHECK FOR GENERIC DEVICE TYPE BEFORE SENDING TO CPRAME;E MOV (R4),R1 ;GET DCB ADDRESS. CMP R1,$XXLOW ;IS DCB LOWER THAN LOWER BOUND?" BLO 120$ ;IF LO YES, NOT GENERIC/ CMP R1,$XXHGH ;IS DCB HIGHER THAN UPPER BOUND?S$ BHI 120$ ;IF HIGH YES, NOT GENERIC;"; GET A REQUEST PACKET FROM CPRBUF;OF; NOTE: IF SIZE OF REQUEST PACKET OR DPB OF GLUN, GDVI OR GIN$ IS EVERG; MADE LARGER, THE NUMBER OF BLOCK TO ALLOCATE MAY NEED TO BE INCREASED ;$1140$: MOV #1,R1 ;ASSUME ONLY ONE BLOCK IS NEEDED 9 MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START% CALL $CPALO ;GET BUFFER FROM CPRBUFP;,; FILL IN REQUEST PACKET O;  MOV R0,KISAR6 ;MAP PACKET$ MOV #MAP6,R1 ;GET ADDRESS OF HEADER+ MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUESTG CLRB H$ICNT(R1) ;NO ITEMS! ADD #P$DPB,R1 ;POINT TO DPB AREA;O; COPY DPB INTO REQUEST PACKET;B" CMPB #GL$SIZ,-3(R5) ;IS THIS GLUN BEQ 150$ ;IF EQ YESF- CMP #7,2(R5) ;IS BUFFER LARGER THAN 7 WORDS?$ BGE 150$ ;IF GE, NOU: MOV #7,2(R5) ;FORCE BUFFER SIZE OF 7 WORDS FOR AME'S SAKE150$:K0 MOV R5,R3 ;COPY POINTER TO USER BUFFER ADDRESS& SUB #4,R3 ;POINT TO BEGINNING OF DPB00ttt__DATADATADATADATA MOVB 1(R3),R2 ;GET SIZE OF DPBT"160$: MOV (R3)+,(R1)+ ;COPY A WORD SOB R2,160$ ;LOOP UNTIL DONE;T4; CHANGE ADDRESS IN DPB TO OFFSET FROM TOP OF HEADER;; MOVB -3(R5),R2 ;GET SIZE OF DPB ASL R2 ;IN BYTESC ADD #,R2 ;ADD SIZE OF HEADER AND EXTRA STORAGE AREAP* MOV R2,MAP6+H$SIZE+4 ;STORE OFFSET IN DPB;E5; STORE REAL ADDRESS OF USER BUFFER IN REQUEST PACKET ;O- MOV (R5),(R1)+ ;STORE ADDRESS OF USER BUFFERO MOV R4,(R1) ;STORE UCB ADDRESS;3; SEND REQUEST TO CPRAME;. SUB #,R1 ;GET SIZE OF REQUEST PACKET CPSEN$ #SN$DIR,R0,R1S;R; GET RESPONSE PACKETE;T" MOV R0,-(SP) ;SAVE PACKET ADDRESS MOV R0,KISAR6 ;MAP PACKET;3; CHECK STATUSM; - IF ERROR OCCURED AND THIS IS GIN$, CHECK DEVICE NAME FIELD FOR TRANSLATEDE; DEVICE NAMEP;M/ CMP #IS.SUC,MAP6+H$STAT ;WAS SUCCESS RETURNED?T BNE 200$ ;IF NE NO;B!; TRANSFER BUFFERS INTO USER AREA(;,' MOVB MAP6+H$SIZE+1,R0 ;GET SIZE OF DPBV ASL R0 ;IN BYTES7 ADD #,R0 ;POINT TO ADDRESS OF USER BUFFER- CMP #"$I,4(R0) ; IS DEVICE $I?T BEQ 165$ ; IF EQ YES CMP #"$O,4(R0) ; IS DEVICE $O? BNE 166$ ; IF NE NOK-165$: MOV $TKTCB,R5 ; GET TCB ADDRESS OF TASKH MOV T.UCB(R5),R5 ; GET TI: UCBA MOV U.DCB(R5),R4 ; GET TI: DCBE" MOV D.NAM(R4),4(R0) ; CHANGE NAME= MOVB U.UNIT(R5),6(R0) ; GET UNIT NUMBER FROM UCB (ASSUME HT)E# CMP #"VT,D.NAM(R4) ; IS THIS A VT?E% BNE 166$ ; IF NE, U.UNIT IS CORRECTZ1 MOVB D.UNIT(R4),6(R0) ; IF VT, D.UNIT IS CORRECT#166$:$) CMPB MAP6+H$SIZE+1,#GN$SIZ ;IS THIS GIN$% BEQ 170$ ;IF EQ YES, DON'T HAVE UCB1 MOV 2(R0),R4 ;GET UCB ADDRESS- CMPB U.UNIT(R4),#377 ;IS THIS A GENERIC UCB?$2 BEQ 170$ ;IF EQ YES, PRV BIT IS NOT VALID IN UCB' BIT #U2.PRV,U.CW2(R4) ;IS PRIV BIT SETR BEQ 170$ ;IF EQ NO0 BIS #U2.PRV,GL$BUF+6(R0) ;SET PRV BIT IN BUFFER170$:G) MOV (R0),R0 ;GET ADDRESS OF USER BUFFER#, CALL $RELOC ;GET BIAS AND OFFSET OF BUFFER' MOV R1,R3 ;SET UP DEST BIAS FOR BLXIO)% MOV R2,R4 ;SET UP DEST DISPLACEMENT$* MOV (SP),R1 ;SET UP SOURCE BIAS FOR APR58 MOV #<6*2>,R0 ;GET SIZE OF BUFFER ASSUMING THIS IS GLUN' MOVB MAP6+H$SIZE+1,R2 ;GET SIZE OF DPBI CMPB #GL$SIZ,R2 ;IS THIS GLUN?  BEQ 180$ ;IF EQ YES 2 MOV MAP6+H$SIZE+6,R0 ;GET SIZE OF BUFFER FROM DPB ASL R0 ; IN BYTESF'180$: ASL R2 ;GET SIZE OF DPB IN BYTESV6 ADD #,R2 ;SET SOURCE DISPLACEMENT2190$: CALL $BLXIO ;RETURN EQUIVALENCE NAME STRING# MOV (SP)+,R0 ;GET BUFFER BIAS BACKO" BR 210$ ;GO TO DEALLOCATE BUFFER;L; CPRAME HAS RETURNED AN ERRORG; - IF THIS IS GIN$, CHECK DEVICE NAME FIELD FOR TRANSLATED DEVICE NAME ;N200$: # MOV (SP)+,R0 ;GET BUFFER BIAS BACKC) CMPB #GN$SIZ,MAP6+H$SIZE+1 ;IS THIS GIN?F BNE 210$ ;IF NE NO8 CMP #IE.ULN,MAP6+H$STAT ;CAN WE RECOVER FROM THIS ERROR BNE 210$ ;IF NE NO- MOV MAP6+H$SIZE+10,R4 ;DEVICE NAME RETURNED?> BNE 250$ ;IF NE YESE&210$: CALLR $CPDEA ;DEALLOCATE BUFFER245$:T3 RETURN ;JUST RETURN SINCE KXDRV SET ERROR IN DSW 250$:A6 MOV MAP6+H$SIZE+,-(SP) ;SAVE BUFFER ADDRESS' MOV MAP6+H$SIZE+12,R5 ;GET UNIT NUMBERF CALL $CPDEA ;DEALLOCATE BUFFER; I; CPRAME HAS RETURN A TRANSLATED LOGICAL DEVICE NAME, LOOK FOR IT IN OUR H; TABLES;E MOV R4,R0 ;GET DEVICE NAME MOV R5,R1 ;AND UNIT NUMBER CALL $CVDVN ;GET UCB ADDRESS% MOV (SP)+,R3 ;RESTORE BUFFER ADDRESSN BCS 245$ ;IF CS ERROR ;N(; MAKE SURE THIS IS NOT A GENERIC DEVICE;F% MOV R2,R4 ;MOVE UCB ADDRESS INTO R4N) CMP (R2),$XXLOW ;LOWER THAN LOWER BOUND?M BLO 2$ ;IF LO YES,) CMP (R2),$XXHGH ;HIGHER THAN HIGH BOUND?E BHI 2$ ;IF HI YESE' RETURN ;RETURN WITH ERROR STATUS SET  .ENDC ;C$$RTK 2$: $GLINF::& MOV (R4),R2 ;GET BACK POINTER TO DCB3$:* TST (R2)+ ;POINT TO ADDRESS OF FIRST UCB MOV R4,R0 ;COPY ADDRESS OF UCB0 SUB (R2)+,R0 ;CALCULATE RELATIVE ADDRESS OF UCB, MOV (R2)+,(R3)+ ;INSERT GENERIC DEVICE NAME0 MOV (R2)+,(R3) ;PICK UP LOW UNIT NUMBER FOR DCB! MOV (R2)+,R1 ;PICK UP UCB LENGTH(+ CALL $DIV ;CALCULATE RELATIVE UNIT NUMBER , ADD R0,(R3)+ ;CALCULATE LOGICAL UNI00ttibjbkb a a aT NUMBER( MOVB #200,-(R3) ;ASSUME RESIDENT DRIVER TST (R2) ;DRIVER RESIDENT?  BNE 5$ ;IF NE YES0 CLRB (R3) ;ELSE INDICATE DRIVER IS NONRESIDENT5$: INC R3 ;ADVANCE POINTER T3 ADD #U.CW1,R4 ;POINT TO FIRST CHARACTERISTICS WORDU5 MOV (R4)+,(R3)+ ;INSERT DEVICE CHARACTERISTICS WORDSM MOV (R4)+,(R3)+ ; MOV (R4)+,(R3)+ ; MOV (R4),(R3) ;  .IF DF G$$DVI1 CMPB #GL$SIZ,$DICSV+1 ;IS THIS A GLUN DIRECTIVE?C+ BEQ 4$ ;IF EQ YES, DON'T RETURN DEV. TYPEA2 CMPB #6,$DICSV+6 ;BUFFER BIG ENOUGH TO HOLD TYPE? BGE 4$ ;IF GE NO, DON'T RETURN( MOV -12(R3),2(R3) ;COPY DEVICE MNEMONIC4$: ; .ENDC ; DF G$$DVI& MOV $TKTCB,R5 ;RESTORE R5=TCB ADDRESS= BIT #DV.ISP!DV.OSP,U.CW1-U.CW4(R4) ;IS IT A SPOOLED DEVICE? T BEQ 9$ ;IF EQ NO = CMP U.ATT-U.CW4(R4),R5 ;IS ISSUING TASK THE DESPOOLER TASK? + BEQ 9$ ;IF EQ YES, DONE = MOV U.RED-U.CW4(R4),R0 ;PICK UP ADDRESS OF INTERMEDIATE UCB I< MOV U.CW4(R0),(R3) ;RETURN BUFFER SIZE OF INTERMEDIATE DEV 4 TST -(R3) ;THIRD CHARACTERISTICS WORD IS UNDEFINED6 MOV (R4),-(R3) ;RETURN BUFFER SIZE OF SPOOLED DEVICE 6 BIC #^C,-(R3) ;CLR ALL BUT SPOOL BITS 9 BIS U.CW1(R0),(R3) ;RETURN INTERMEDIATE CHARACTERISTICS ,-9$: RETURN ;RETURN DIRECTIVE STATUS OF +1 Q*10$: DRSTS D.RS5 ;SET DIRECTIVE STATUS  .ENDNG TASK THE DESPOOLER TASK? + BEQ 9$ ;IF EQ YES, DONE = MOV U.RED-U.CW4(R4),R0 ;PICK UP ADDRESS OF INTERMEDIATE UCB I< MOV U.CW4(R0),(R3) ;RETURN BUFFER SIZE OF INTERMEDIATE DEV 4 TST -(R3) ;THIRD CHARACTERISTICS W .TITLE POWERM .IDENT /10.01/ ; ,; Copyright (c) 1995 by Mentec, Inc., U.S.A.; 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.;R; D. N. CUTLER 1-OCT-73 ;$; MODIFIED FOR RSX-11M-PLUS V2.1 BY:;M ; H. HUANG; H. BERNSTEIN; B. S. MCCARTHY;I+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:$;S ; S. C. ADAMS ; J. W. BERZLE; M. PETTENGILL; B. S. MCCARTHY; J. C. FRANZINI;; MODIFIED BY:;D; J. W. BERZLE 20-MAY-86 10.00;9,; JWB174 -- MODIFY POWER DOWN CALL TO IPDRV;; D. Carroll 18-Oct-1995 10.01:; DC404 - Include PSECT statement to allow ICB pool to be ; fully extended during sysgen;E;.;R; POWERFAIL RECOVERY; ; MACRO LIBRARY CALLSX;M1 .MCALL EPKDF$,HDRDF$,HWDDF$,PCBDF$,TCBDF$,BGCK$A & EPKDF$ ;DEFINE ERROR PACKET OFFSETS% HDRDF$ ;DEFINE TASK HEADER OFFSETSD$ HWDDF$ ;DEFINE HARDWARE REGISTERS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSI, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS;J; POWERFAIL VECTOR;O .ASECTI.=24PWVCT: .WORD PDOWN ;- .WORD PR7 ;D .PSECTc. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;DC404;+%; **-PDOWN-POWERFAIL INTERRUPT (DOWN)Y; D; THIS ROUTINE IS ENTERED AS A RESULT OF A POWER DOWN INTERRUPT. ALLH; VOLATILE MACHINE REGISTERS ARE SAVED, THE POWERFAIL VECTOR IS SWITCHEDC; TO THE POWER UP ROUTINE, AND THE PROCESSOR IS HALTED TO AWAIT THED; POWER UP INTERRUPT. ;-PDOWN: ;REF LABEL .IF DF M$$PRO;F@; IN THE MULTIPROCESSING CASE, THIS IS THE ONLY PLACE THE VECTOR?; AT 24 EVER POINTS. THIS IS BECAUSE ON POWER-UP, THE HARDWAREPD; MUST USE THE VECTOR AT PHYSICAL 24, NOT KERNEL VIRTUAL 24 (BECAUSE/; THERE ISN'T ANY KERNEL MAPPING AT THAT TIME).R;L?; DUE TO THIS, WE HAVE THREE CONDITIONS WHICH CAN BRING US THRUE; THIS VECTOR.;IC; 1. POWERFAIL (POWER GOING DOWN) -- WE CAN DETERMINE THIS FROM THE @; FACT THAT MAPPING IS ENABLED (WHICH IT NEVER IS OTHERWISE).;BD; 2. POWER RETURNS (AFTER A POWERFAIL) -- WE CAN DETERMINE THIS FROME; THE FACT THAT MAPPING IS NOT ENABLED, AND THE LOW MEMORY MAPPINGW>; FOR US IS SET UP IN THE $PWKA0 VECTOR (ONE WORD PER CPU).;ND; 3. POWER RETURNS (BUT WE NEVER POWERFAILED). THIS IS BECAUSE SOMEA; UNCLEVER PERSON TURNED THE KEY ON (OR OTHERWISE BROUGHT BACKTD; THE POWER) AND DIDN'T HAVE THE HALT KEY DOWN. IF THEY HAVE THEH; NEAT 11/70 REMOTE DIAGNOSTIC CONSOL, THEY CAN BE PARTIALLY EXCU00ttt__DATADATADATADATASED,F; SINCE THEY HAVE NO ACTUAL HALT KEY (ALTHO THEY CAN USE THE LITTLEG; SLIDE SWITCH, WHICH MIGHT SURVIVE 100 OPERATIONS WITHOUT FAILURE).WD; IN THIS CASE WE WILL HALT THE MACHINE, AND THEY WILL NEVER KNOW!; WHAT WE DID FOR THEM. SIGH.(; 5 CACHE$ BYPASS ;;;MAKE SURE WE HAVE THE "REAL THING"E/ BIT #1,SR0 ;;;ARE WE COMING UP OR GOING DOWN?T+ BNE PDOWN1 ;;;IF NE WE'RE ON THE WAY DOWNA;Y$; NOW -- EITHER POWER UP OR SPURIOUS; & MOV $PWCSR,R0 ;;;GET IIST CSR ADDRESS( MOV (R0),R2 ;;;GET IIST REGISTER VALUE# SWAB R2 ;;;PUT CPU ID IN LOW BYTE , BIC #177774,R2 ;;;MAKE IT ONLY TWO BITS BIG ASL R2 ;;;AND WORD INDEX;W; DID WE GO DOWN???E;L2 MOV $PWKA0(R2),R1 ;;;GET KINAR0 VALUE FROM BEFORE/ BNE 10$ ;;;IF NE THERE IS ONE, WE DID PWRFAIL;; C; SOME CLEVER FELLOW POWERED UP THE CPU WITH THE HALT KEY UNHALTED.OB; WE WILL HALT AND HE WILL PROBABLY NEVER KNOW WE DIDN'T CRASH THEC; POSSIBLE MP SYSTEM UNDERNEATH HIM. TOO BAD IT'S A WASTE OF SPACER$; TO GIVE HIM A SNAPPY ERRORMESSAGE.;T5$: HALT ;;;HERE WE AREU BR 5$ ;;;OH NO YOU DON'T610$: CLR $PWKA0(R2) ;;;SHOW WE ARE MORE OR LESS UP NOW DEC R1 ;;;REMOVE BIAS OF ONE;; R0 = IIST CSR ADDRESSE ; R1 = KINAR0 VALUE FOR THIS CPU#; R2 = CPU ID * 2 FOR TABLE INDEXESF;;; :; WE WILL NOW SET UP THE KERNEL MAPPING AND TURN ON 18 BIT9; MODE SO THIS CPU CAN ACCESS THE LOW MEMORY CONTEXT WITHW:; WHICH IT IS SO WELL FAMILIAR. AS FAR AS THE REST OF THE@; POWERFAIL CODE IS CONCERNED, IT ALWAYS HAS ITS OWN LOW MEMORY.;TB; THIS MEANS THAT THE CODE THAT LOADS THE KERNEL I SPACE REGISTERSA; CANNOT LOAD JUNK AND THEN CORRECT IT -- IT MUST LOAD (OVERLOAD)E1; VALID INFORMATION SO THIS CODE DOESN'T GO AWRY.=;N CLR R3 ;;;START WITH KINAR0U MOV #KINAR0,R4 ;;;DITTO520$: MOV #77406,KINDR0-KINAR0(R4) ;;;SET UP FOR 4K RW  MOV R3,(R4)+ ;;;LOAD ADDRESSC ADD #200,R3 ;;;MOVE ANOTHER 4K! CMP #KINAR0+16,R4 ;;;ARE WE DONEI BHIS 20$ ;;;IF HIS NO ;E5; NOW CORRECT KINAR0 AND KINAR7 WITH THE REAL VALUES.L;M- 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 PS + INC SR0 ;;;TURN ON MAPPING AND AWAY WE GON) JMP PUP ;;;GO TO "NORMAL" POWERUP CODEI .ENDC3PDOWN1: MOV SP,$PWSTK ;;;SAVE CURRENT STACK POINTERK4 MOV #$PWSTK,SP ;;;SET ADDRESS OF REGISTER SAVE AREA* MOV R5,-(SP) ;;;SAVE REGISTERS R5 THRU R0 MOV R4,-(SP) ;;;  MOV R3,-(SP) ;;;E MOV R2,-(SP) ;;;A MOV R1,-(SP) ;;;T MOV R0,-(SP) ;;;M;M#; MULTIPROCESSOR POWERFAIL SUPPORT:P; 7; EACH PROCESSOR THAT POWERFAILS SETS ITS BIT IN A WORDA=; WHICH CONTAINS THE MASK OF PROCESSORS IN THEIR SAVE-RESTORE;;; 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.T;D;O.; SET OUR BIT IN THE POWERFAILED CPU FLAG WORD;R .IF DF M$$PRO LOCK$ $PWRLK,SPIN7 BIS $CPBIT,$PWRMK ;;;SET OUR BIT IN THE POWERFAIL MASKR ULOCK$ $PWRLK,SPIN ) MOV $URMST,R1 ;;;GET MASK OF ONLINE URMSA) BIC $CPMSK,R1 ;;;MAKE IT PROCESSORS ONLYN& 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 FUNCTION5$: ;;;REFERENCE LABEL  .ENDC/ BIT #FE.EXT,$FMASK ;;;IS THIS A 22-BIT SYSTEM?D BEQ 21$ ;;;IF EQ NON- BIT #HF.UBM,$HFMSK ;;;IS THERE A UNIBUS MAP?  BEQ 21$ ;;;IF EQ NO,6 MOV #UBMPR+<31.*4>,R0 ;;;POINT PAST LAST MAP REGISTER/ MOV #31.,R1 ;;;SET COUNT OF REGISTERS TO SAVEE320$: MOV -(R0),-(SP) ;;;SAVE HIGH 6 BITS OF ADDRESSC/ MOV -(R0),-(SP) ;;;SAVE LOW 16 BITS OF ADDRESSH! SOB R1,20$ ;;;LOOP FOR ALL UMRS 521$: BIS #PMODE,PS ;;;MAKE SURE PREVIOUS MODE IS USERI$ 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+2/ MOV #UINAR0+16.,R1 ;;;POINT00ttibjbkb a a a TO USER I PAR 7 +2C/ MOV #UINDR0+16.,R2 ;;;POINT TO USER I PDR 7 +2; .IF DF U$$DAS9 MOV #UDSAR0+16.,R3 ;;;POINT TO USER DATA ADDRESS REG 7+29 MOV #UDSDR0+16.,R4 ;;;POINT TO USER DATA DESC. REG 7+2A .ENDC ; DF U$$DAS .IF DF K$$DAS; MOV #KDSAR0+16.,R5 ;;;POINT TO KERNEL DATA ADDRESS REG 7+2E .ENDC010$: MOV -(R1),-(SP) ;;;SAVE USER INSTR ADDR REG1 MOV -(R2),-(SP) ;;;SAVE USER DESCRIPTOR REGISTER0 .IF DF U$$DAS3 MOV -(R3),-(SP) ;;;SAVE USER DATA ADDRESS REGISTERI3 MOV -(R4),-(SP) ;;;SAVE USER DATA DESC. REGISTERT .ENDC ; DF U$$DAS. MOV -(R0),-(SP) ;;;SAVE KERNEL INSTR ADDR REG .IF DF K$$DAS5 MOV -(R5),-(SP) ;;;SAVE KERNEL DATA ADDRESS REGISTER  .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+29200$: MOV -(R0),-(SP) ;;;SAVE SUPER DATA ADDRESS REGISTER-4 MOV -(R1),-(SP) ;;;SAVE SUPER DATA DESC. REGISTER4 MOV -(R2),-(SP) ;;;SAVE SUPER INST ADDRESS REGISTER4 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?T BMI 210$ ;;;IF MI NO, STFPS -(SP) ;;;STORE FLOATING POINT STATUS# SETD ;;;SET FLOATING DOUBLE MODE.. STD R0,-(SP) ;;;SAVE FLOATING POINT REGISTERS STD R1,-(SP) ;;;; STD R2,-(SP) ;;;D STD R3,-(SP) ;;;V LDD R4,R0 ;;;A STD R0,-(SP) ;;;  LDD R5,R0 ;;;- STD R0,-(SP) ;;;S+210$: CLR -(SP) ;;;PUSH AN ADDRESS OF ZERO;7 CMP @#244,#$FPPR7 ;;;IS THERE A PIRQ REGISTER TO SAVE?N2 BEQ 30$ ;;;IF EQ NO, DO DUMMY SAVE OF LOCATION 0' MOV #PIRQ,(SP) ;;;SET FOR SAVE OF PIRQ;;30$: MOV @(SP),-(SP) ;;;SAVE PIRQ REGISTER OR CONTENTS OF 0  .ENDC .IF NDF M$$PRO- MOV #PUP,PWVCT ;;;SWITCH TO POWER UP ROUTINEP .ENDC& MOV SP,$POWSP ;;;SAVE SP FOR POWER UP .IF DF I$$P11&I$$PFSD MOV $IPUCB,R0 ;;;GET IP UCB, BEQ 40$ ;;;IF EQ, DRIVER POWERFAIL NOT SET MOV (R0),R0 ;;;GET IP DCB 1 MOV D.DSP(R0),R1 ;;;GET IP DRIVER DISPATCH TABLE;% BEQ 40$ ;;;IF EQ, DRIVER NOT LOADEDQ# MOV D.PCB(R0),R0 ;;;GET DRIVER PCBO BEQ 40$ ;;;IF EQ, FORGET IT!. MOV P.REL(R0),KINAR5 ;;;MAP DRIVER IN I-SPACE .IF DF K$$DAS. MOV P.REL(R0),KDSAR5 ;;;MAP DRIVER IN D-SPACE .ENDC ; DF K$$DAS5 MOV D.VINI-2(R1),-(SP) ;;;GET POWER-DOWN ENTRY POINT; CALL @(SP)+ ;;;CALL DRIVER40$: ;;;REFERENCE LABEL .ENDC ; DF I$$P11&I$$PFS$; F; AT THIS POINT, WE HAVE ALL BUT HALTED. WE WILL PLACE OUR KINAR0 LOWD; MEMORY MAPPING IN THE CELL IN CPA'S LOW MEMORY. THIS IS A FLAG TOD; THE POWERUP ROUTINE THAT WE HAVE ACTUALLY POWERFAILED. IF WE FAILE; TO DO THIS, THE POWERUP ROUTINE WILL JUST HALT (SINCE IT CAN'T TELLDC; THAT FACT FROM THE CASE WHERE SOMEONE POWERED UP THE MACHINE WITH$; THE HALT KEY UP.)(;, .IF DF M$$PRO% MOVB $PROC2,R1 ;;;GET OUR CPU OFFSETR- MOV @#KINAR0,R0 ;;;GET OUR LOW MEMORY OFFSET - CLR @#KINAR0 ;;;START USING CPA'S LOW MEMORYE .IF DF K$$DAS$ CLR @#KDSAR0 ;;;D-SPACE TOO, IF ANY .ENDC/ INC R0 ;;;BIAS BY ONE, SO NEVER ACTUALLY ZERO 2 MOV R0,$PWKA0(R1) ;;;STORE OUR LOW MEMORY POINTER .ENDC HALT ;;;WAIT FOR SOME JUICE!L;+!; **-PUP-POWERFAIL INTERRUPT (UP)F; K; THIS ROUTINE IS ENTERED AS A RESULT OF A POWER UP INTERRUPT. ALL VOLATILE(F; MACHINE REGISTERS ARE RESTORED, A SCHEDULE REQUEST IS FORCED FOR THEB; NULL TASK, THE POWERFAIL INDICATOR IS INCREMENTED, AND AN RTI ISF; EXECUTED. AT THE APPROPRIATE TIME THE DISPATCHER WILL CALL THE POWER9; RECOVERY ROUTINE TO ACTUALLY PROCESS THE POWER FAILURE. ;-/PUP: MOV $POWSP,SP ;;;RE-LOAD SP FROM POWERFAILO .IF DF F$$LPP9 MOV (SP)+,@(SP)+ ;;;CONDITIONALLY RESTORE PIRQ OR LOC. 0R% TST $HFMSK ;;;FPP HARDWARE PRESENT?E BMI 1$ ;;;IF MI NO2 LDFPS #200 ;;;SET FLOATING DOUBLE MODE00ttt__DATADATADATADATA, NO TRAPS1 LDD (SP)+,R0 ;;;RESTORE FLOATING POINT REGISTERSD STD R0,R5 ;;;T LDD (SP)+,R0 ;;;I STD R0,R4 ;;;M LDD (SP)+,R3 ;;;S LDD (SP)+,R2 ;;;E LDD (SP)+,R1 ;;;H LDD (SP)+,R0 ;;;A. LDFPS (SP)+ ;;;RESTORE FLOATING POINT STATUS .ENDC.1$: BIS #PMODE,PS ;;;SET PREVIOUS MODE TO USER .IF DF S$$LIB4 MOV #SDSAR0,R3 ;;;POINT TO SUPER DATA ADDRESS REG 04 MOV #SDSDR0,R2 ;;;POINT TO SUPER DATA DESC. REG 04 MOV #SISAR0,R1 ;;;POINT TO SUPER INST ADDRESS REG 04 MOV #SISDR0,R0 ;;;POINT TO SUPER INST DESC. REG 0:5$: MOV (SP)+,(R0)+ ;;;RESTORE SUPER INST DESC. REGISTER7 MOV (SP)+,(R1)+ ;;;RESTORE SUPER INST ADDRESS REGISTERR7 MOV (SP)+,(R2)+ ;;;RESTORE SUPER DATA DESC. REGISTERP7 MOV (SP)+,(R3)+ ;;;RESTORE SUPER DATA ADDRESS REGISTERI CMP R0,#SISDR0+16. ;;;DONE YET? BLO 5$ ;;;IF LO NOL .ENDC ; DF S$$LIB3 MOV #KINAR0,R0 ;;;POINT TO KERNEL INSTR ADDR REG 0P. MOV #UINAR0,R1 ;;;POINT TO USER I SPACE PAR 0. MOV #UINDR0,R2 ;;;POINT TO USER D SPACE PDR 0 .IF DF U$$DAS8 MOV #UDSDR0,R3 ;;;POINT TO USER DATA DESC. REGISTER 08 MOV #UDSAR0,R4 ;;;POINT TO USER DATA ADDRESS REGISTER 0 .ENDC .IF DF K$$DAS2 MOV #KDSAR0,R5 ;;;POINT TO KERNEL DATA ADDR REG 0 .ENDC10$: ;;;REF LABEL .IF DF K$$DAS1 MOV #77406,KDSDR0-KDSAR0(R5) ;;;SET 4K RW ACCESSO6 MOV (SP)+,(R5)+ ;;;RESTORE KERNEL DATA INSTR ADDR REG;EB; IN THE MULTIPROCESSING, I+D SPACE CASE, WE WOULD NORMALLY TRY TO@; LOAD 1600 INTO KINAR7 AND SET IT FOR 4K RO. THIS WIPES US OUT,@; SINCE WE ARE EXECUTING OUT OF THESE REGISTERS. WE WILL DETECT,; THIS FACT, AND WILL DO ANYTHING TO KISAR7.;I .IF DF M$$PRO= CMP R0,#KINAR0+16 ;;;ARE WE JUST ABOUT TO WIPE THE I/O PAGE?R BNE 15$ ;;;IF NE NO:* CMP (SP)+,(R0)+ ;;;BUMP STACK AND ADDRESS) BR 20$ ;;;SKIP ACTUAL LOAD INSTRUCTIONSS15$: ;;;REFERENCE LABEL .ENDC1 MOV #77402,KINDR0-KINAR0(R0) ;;;SET 4K RO ACCESS+ .IFFA1 MOV #77406,KINDR0-KINAR0(R0) ;;;SET 4K RW ACCESS  .ENDC1 MOV (SP)+,(R0)+ ;;;RESTORE KERNEL INSTR ADDR REGG20$: ;;;REFERENCE LABEL .IF DF U$$DAS6 MOV (SP)+,(R3)+ ;;;RESTORE USER DATA DESC. REGISTER6 MOV (SP)+,(R4)+ ;;;RESTORE USER DATA ADDRESS REGISTER .ENDC ; DF U$$DAS6 MOV (SP)+,(R2)+ ;;;RESTORE USER INST DESC. REGISTER6 MOV (SP)+,(R1)+ ;;;RESTORE USER INST ADDRESS REGISTER CMP R0,#KINAR0+16. ;;;DONE YET? BLO 10$ ;;;IF LO NOR .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+16R .ENDC .IFF;& INC SR0 ;;;TURN ON MEMORY MANAGEMENT .ENDC .IF DF S$$LIB5 BIC #^CPSMODE&PMODE,PS ;;;SET PREVIOUS MODE TO SUPERD- MTPI SP ;;;RESTORE SUPERVISOR STACK POINTERM+ BIS #PMODE,PS ;;;SET PREVIOUS MODE TO USERE. TSTB $SUPFL ;;;CURRENT TASK USE SUPER MODE ? BEQ 25$ ;;;IF EQ NO,( BIS #10,SR3 ;;;TURN ON CSM INSTRUCTION25$: ;;;REFERENCE LABEL .ENDC' MTPI SP ;;;RESTORE USER STACK POINTERC/ BIT #FE.EXT,$FMASK ;;;IS THIS A 22-BIT SYSTEM?# BEQ 35$ ;;;IF EQ NO.: BIT #HF.UBM,$HFMSK ;;;DOES THIS SYSTEM HAVE A UNIBUS MAP? BEQ 35$ ;;;IF EQ NO$- MOV #UBMPR,R0 ;;;POINT TO FIRST MAP REGISTER 2 MOV #31.,R1 ;;;SET COUNT OF REGISTERS TO RESTORE630$: MOV (SP)+,(R0)+ ;;;RESTORE LOW 16 BITS OF ADDRESS2 MOV (SP)+,(R0)+ ;;;RESTORE HIGH 6 BITS OF ADDRESS! SOB R1,30$ ;;;LOOP FOR ALL UMRS 35$: ;;;REF LABEL;3; SHOW OTHER PROCESSORS THAT WE ARE BACK ON THE AIR;;S .IF DF M$$PRO LOCK$ $PWRLK,SPIN5 BIC $CPBIT,$PWRMK ;;;CLEAR OUT OUR BIT FROM THE MASK. .IFTF' INC $PWRFL ;;;SHOW POWERFAIL HAPPENEDU .IFTB# INCB $PWRFL+1 ;;;URM POWERFAIL TOO;( BIS @$CPURM,$PFURM ;;;FOR ALL OUR URM'S;SI; AT THIS POINT, WE WANT TO ASSURE OURSELVES THAT THIS CPU WILL, IN FACT,TD; GO THROUGH DIRXT AT SOME POINT IN THE FUTURE. THIS REQUIRES A TWOI; PRONGED ATTACK -- FIRST WE SET $IIPND SO THAT IF WE RETURN FROM A CLOCKOF; INTERRUPT TO A USER PROGRAM, THEN WE WILL GO THRU THE EXEC. SECOND,@; WE FIX UP THE IDLE LOOP TO LOOK AT00ttibjbkb a a a $IIPND ON EACH LOOP AROUND.;5 BIS $CPBIT,$IIPND ;;;TELL US LATER THAT WE HAVE WORKF ULOCK$ $PWRLK,SPIN; .ENDCC; IF THE SYSTEM HAS ANY MK11 BOXES ON IT, WE WILL RESTORE THEM NOW,,@; SINCE THE RTI MAY GO BACK TO A LOADED DRIVER (OR TASK) IN ONE. .IF DF M$$K11( CALL $MKSET ;;;RESET MK11 MEMORY BOXES .ENDC ; DF M$$K11# MOV (SP)+,R0 ;;;RESTORE R0 THRU R5N MOV (SP)+,R1 ;;;N MOV (SP)+,R2 ;;;R MOV (SP)+,R3 ;;;  MOV (SP)+,R4 ;;;S MOV (SP)+,R5 ;;; & MOV (SP),SP ;;;RESTORE STACK POINTER+ MOV #$ACTHD,@$RQSCH ;;;FORCE REDISPATCHINGL .IF NDF M$$PROE1 MOV #PDOWN,PWVCT ;;;SWITCH TO POWER DOWN ROUTINEEF; AT THIS POINT WE WILL BYPASS THE CACHE. THIS PREVENTS GETTING STUCKG; IN $PWRMP, AND ALSO ASSURES THAT IF THE CODE INTERRUPTED BY POWERFAILF; RUNS WITH CACHE BYPASSED, IT WILL BE AFTER THE POWERFAIL. (NOTE THATE; THE SYSTEM WILL ALWAYS BE CACHE BYPASSED BETWEEN POWER RECOVERY AND; THE FIRST ENTRY TO THE EXEC) .IFFM& CACHE$ BYPASS ;;;GET THE REAL THINGS .ENDC2 MOV $CKLDC,@$CKCNT ;;;RELOAD CLOCK COUNT REGISTER* MOV #K$$IEN,@$CKCSR ;;;TURN CLOCK BACK ON RTI ;;;;+; **-$POWER-POWER FAIL RECOVERYL;YC; THIS ROUTINE WILL PERFORM POWERFAIL AND INITIALIZATION FOR ACTIVES; TASKS AND DEVICES.;T ; INPUTS: ;E ; $PWRFL=GENERAL POWERFAIL FLAG:9; 0 - DON'T INVOKE ACTIVE TASK POWERFAIL AST'S AND DON'TW3; CALL DRIVERS WITHOUT KRBS. $PWRFL+1 MUST BEN'; NON-ZERO OR WE WOULDN'T BE HERE.F6; 1 - CALL ALL ACTIVE TASKS WITH POWERFAIL AST'S, AND; ALL DRIVERS TOO.;;L!; $PWRFL+1=DEVICE POWERFAIL FLAG:I8; 0 - $PWRFL MUST HAVE BEEN SET OR WE WOULDN'T BE HERE.9; 1 - DO ONLY DEVICE POWERFAIL, AND CHECK $PFURM FOR THE 9; UNIBUS RUN MASKS WHICH DEFINE THE RUNS TO PWRFAIL.E;=; $PFURM=MASK DEFINING THE RUNS FOR POWERFAIL IF $PWRFL+1<>0.N!; OTHERWISE THIS SHOULD BE ZERO.';N;- .ENABL LSBL4$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 RELAYI .ENDC;$>; EFFECT POWERFAIL AST'S FOR TASKS THAT ARE ACTIVE AND IN CORE;V( MOV $ACTHD,R5 ;GET ADDRESS OF FIRST TCB010$: MOV #AS.PFA,R4 ;GET CODE FOR POWER FAIL AST7 MOV T.ACTL(R5),-(SP) ;SAVE POINTER TO NEXT ACTIVE TASK  BEQ 15$ ;IF EQ THERE IS NONE$ CALL $DASTT ;DECLARE POWERFAIL AST215$: MOV (SP)+,R5 ;GET ADDRESS OF NEXT ACTIVE TASK BNE 10$ ;IF NE NOI;N.; DO POWERFAIL RECOVERY FOR ALL ACTIVE DEVICES;$B; IF THE POWERFAIL IS FOR A CPU URM, THEN INITIALIZE THE CACHE AND-; MEMORY PARITY REGISTERS FOR THAT PROCESSOR.S;R16$: ;REFERENCE LABEL .IF DF M$$PRO3 BIT $CPBIT,$PFURM ;IS IT A POWERFAIL FOR THIS CPU? & BEQ 22$ ;IF EQ NO -- JUST DO DEVICES .IFTF' MOV #21$,-(SP) ;INLINE SUBROUTINE CALL1 .IFTQ+ BR 18$ ;SKIP IIST INITIALIZATION ON PWRFLL .ENDC;+9; **-$CPNIT-INITIALIZE CPU AT POWERFAIL, STARTUP, ONLINE.I;@; THIS ROUTINE WILL PERFORM COMMON CPU INITIALIZATION FOR INITL,; SAVE, AND LOWCR CPU STARTUP.;T ; INPUTS:C;E; NONE.E;Y ; OUTPUTS:;R; INITIALIZATION PERFORMED.;:; NO REGISTERS ARE PRESERVED.D;-$CPNIT:: ;REFERENCE LABELI .IF DF M$$PRO0; 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 ALLN .ENDC ; DF M$$K11" CALL $IINIT ;INITIALIZE THE IIST* BIS $CPBIT,$URMST ;WE ARE ONLINE FOR SURE/ CALL $IINOT ;SEE IF WE CAN TALK TO OTHER CPUST%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'S9 MOV $MPCSR+6,R0 ;GET ADDRESS OF 11/70 CACHE CSR REGISTER$ .IF DF P$$D70$ MOV $MPCTL,(R0) ;SET UP 11/70 CACHE .IFF  MOV #3,(R0) ;DISABLE TRAPS .ENDC .ENDC ; DF P$$RTY RETURN21$: ;REF LABEL .IF DF P$$RTY/ MOV #177777,-(R0) ;CLEAR MEMORY ERROR00ttt__DATADATADATADATA REGISTERT .ENDC ; DF P$$RTY .IF DF E$$LOG1 BIT #ES.DAT,$ERFLA ;ARE WE LOGGING DATA PACKETS?8 BEQ 22$ ;IF EQ NOY8 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;+0;**-DRVPF-LOCAL ENTRY FOR DRIVER ONLY POWER FAIL;-#DRVPF: ;CALLED FROM $DRVPF BELOWC; B; SCAN DEVICES FROM THE CTB SIDE (I.E. PHYSICAL) AND CHECK TO MAKE; SURE THEY ARE ALL THERE.;R22$: ;REFERENCE LABEL .IF DF M$$NET0 MOV $NETPF,R5 ;GET ADDRESS OF NETWORK POWERFAIL ;RECOVERY ROUTINEQ BEQ 225$ ;IF EQ THERE IS NONE0( CALL (R5) ;CALL POWER RECOVERY ROUTINE .ENDC ; DF M$$NET1225$: MOV #27$,-(SP) ;RETURN TO HERE AFTER $SGFINL& CALL $SGFIN ;WE EXPECT TRAPS TO FOUR5 MOV #$CTLST,R3 ;GET ADDRESS OF FIRST ADDRESS OF CTBS*23$: MOV (R3),R3 ;GET ADDRESS OF NEXT CTB' BEQ 35$ ;IF EQ NO MORE -- EXIT $SGFINY& MOVB L.NUM(R3),R4 ;GET NUMBER OF KRBS MOV R4,R5 ;COPY NUMBER ASL R5 ; *2B ADD R3,R5 ;$4 ADD #L.KRB,R5 ;POINTER TO JUST BEYOND LAST KRB ADDR24$: 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?% BNE 24$ ;IF NE YES -- DONT CHECK ITT .IF DF M$$PRO- BIT K.URM(R2),$PFURM ;SHOULD WE DO THIS ONE?M BEQ 24$ ;IF EQ NOE0 BIT K.URM(R2),@$CPURM ;IS IT ON THIS PROCESSOR? BEQ 24$ ;IF EQ NO3 .ENDC; .; CALL DRIVER AT THE POWERFAIL-KRB ENTRY POINT;D3 MOV L.DCB(R3),R1 ;GET DCB ASSOCIATED WITH THIS CTB ; MOV CI.PWF(R1),R0 ;ASSUME IT WASN'T DCB BUT COMMON INT TBLO7 BITB #LS.CIN,L.STS(R3) ;WAS IT COMMON INTERRUPT TABLE?O1 BNE 25$ ;IF NE YES -- GO AND CALL DRIVER IMMED. ;N6; R4 CONTAINS DCB ADDRESS. MAP AND CALL NORMAL DRIVER;P+ MOV D.PCB(R1),R0 ;GET PCB OF LOADED DRIVERO, MOV P.REL(R0),KINAR5 ;MAP DRIVER IN I-SPACE .IF DF K$$DAS, MOV P.REL(R0),KDSAR5 ;MAP DRIVER IN D-SPACE .ENDC" MOV D.DSP(R1),R1 ;GET DDT ADDRESS: MOV D.VPWF(R1),R0 ;GET ADDRESS OF DRIVER POWERFAIL ENTRY;MB; IF POWERFAIL ADDRESS EXISTS, CALL DRIVER AFTER SAVING REGISTERS.;I)25$: TST R0 ;IS THERE A POWERFAIL ENTRY?# BEQ 24$ ;IF EQ NO -- TRY NEXT KRBR6 MOV R5,-(SP) ;SAVE POINTER TO NEXT KRB ADDRESS IN CTB4 MOV R4,-(SP) ;SAVE NUMBER OF KRB'S LEFT IN THIS CTB MOV R3,-(SP) ;SAVE CTB POINTERK:; CALL DRIVER AT POWERFAIL ENTRY POINT WITH THE ARGUMENTS:;)8; C=1 TO SHOW CONTROLLER POWERFAIL (NOT UNIT POWERFAIL).; R2=KRB ADDRESS.E; R3=CTB ADDRESS.); ; ALL REGISTERS MAY BE USED.;E- SEC ;SHOW KRB POWERFAIL, NOT UCB POWERFAILR CALL (R0) ;CALL DRIVER" MOV (SP)+,R3 ;RESTORE CTB ADDRESS7 MOV (SP)+,R4 ;RESTORE NUMBER OF KRB'S LEFT IN THIS CTBM" MOV (SP)+,R5 ;RESTORE KRB ADDRESS( BR 24$ ;GO TO NEXT KRB AND KEEP TRYING; C; NOW SCAN DEVICES FROM THE DCB (I.E. LOGICAL) ORIENTATION AND CALLI&; THE DRIVER FOR THE APPROPRIATE ONES.;E27$: MOV #$SCDVT,-(SP)'30$: CALL @(SP)+ ;GET NEXT UCB ADDRESS BCC 40$ ;IF CC GOT ONE .IF DF M$$PRO6 BIC @$CPURM,$PFURM ;WE JUST DID POWERFAIL FOR OUR CPU .ENDC% CLRB $PWRFL ;CPU POWERFAIL COMPLETEV .IF DF M$$PRO5 TST $PFURM ;ANY URM'S LEFT TO PWRFAIL ON OTHER CPU?N BNE 35$ ;IF NE YES -- EXIT NOW2 CLRB $PWRFL+1 ;CLEAR OUT URM POWERFAIL INDICATION .ENDC 35$: RETURNS'40$: MOV #30$,-(SP) ;SET RETURN ADDRESSD0 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 ADDRESSU4 TSTB $PWRFL ;IS THIS TOTAL PWRFAIL OR JUST DEVICES' BEQ 35$ ;IF EQ NOT TOTAL -- TRY AGAIN  BR 45$ ;GO DO THIS ONE .IFFE BEQ 45$ ;IF EQ NO KRB ADDRESS3 .IFTE;43$: BIT K.URM(R2),$PFURM ;SHOULD WE CHECK OUT THIS DEVICE?A BEQ 431$ ;IF EQ NO0 BIT K.URM(R2),@$CPURM ;IS IT ON THIS PROCESSOR? BNE 44$ ;IF NE YES BR 35$ ;EQ - NOCE; CHECK FOR A DUAL PORT, LOAD SHARE DEVICE WHERE ONLY ONE PORT'S URM, 00utibjbkb a a aB; 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 SETT& 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 ONLINER) BEQ 35$ ;IF EQ NO, NO ONLINE PORT PWFLDA CMP R0,R2 ;PORT A ?$ 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 ?P) BEQ 35$ ;IF EQ NO, NO ONLINE PORT PWFLDS$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 WORKS ; FOR NOTHING) 4 BIT K.URM(R2),@$CPURM ;OTHER PORT ON THIS PROCESSOR' BEQ 35$ ;IF EQ NO (DON'T WORRY, WE'LLA# ;CATCH IT LATER ON ANOTHER CPU) .ENDC244$: 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 NOT;T?; THE CONTROLLER IS OFFLINE, AND THE UNIT IS ACTIVE. WE HAVE A ?; PROBLEM. WE CANNOT CALL THE DRIVER AT THE CANCEL ENTRY SINCER$; THE DEVICE REGISTERS DO NOT EXIST.;QC BGCK$A BF.ERR,BE.CSR,FATAL ;ACTIVE CONTROLLER DISAPPEARED AT PWRFLC@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 NOS;50$: MOV D.DSP(R3),R2 ;GET ADDRESS OF DRIVER DISPATCH TABLE" BEQ 35$ ;IF EQ DRIVER NOT LOADED;++; **-$LDPWF-CALL DRIVER AT POWERFAIL ENTRY.N;AD; THIS ROUTINE WILL UNCONDITIONALLY CALL THE DRIVER AT ITS POWERFAIL; ENTRY FOR A SINGLE UNIT.; ; INPUTS:E;G; R2=DDT ADDRESS..; R3=DCB ADDRESS.E; R4=SCB ADDRESS.T; R5=UCB ADDRESS.P;R ; OUTPUTS:;5; NONE;.; NO REGISTERS ARE PRESERVED!;-6$LDPWF::MOV KINAR5,-(SP) ;SAVE KERNEL INSTR ADDR REG 5 .IF DF K$$DAS. MOV KDSAR5,-(SP) ;SAVE KERNEL DATA ADDR REG 5 .IFTF) MOV D.PCB(R3),R3 ;GET DRIVER PCB ADDRESS % MOV P.REL(R3),KINAR5 ;MAP THE DRIVERT .IFTL/ MOV P.REL(R3),KDSAR5 ;MAP DRIVER IN DATA SPACEA .IFTF&55$: MOV S.KRB(R4),R3 ;GET KRB ADDRESS BEQ 60$ ;IF EQ NO KRB ADDRESSD( MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX;E:; CALL DRIVER AT POWERFAIL ENTRY POINT WITH THE ARGUMENTS:; ; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.E'; R5=ADDRESS OF THE UNIT CONTROL BLOCK.;V"; IF S.KRB=0 THEN R3 IS UNDEFINED.;G(60$: TST D.VPWF(R2) ;IS THERE AN ENTRY ? BEQ 70$ ;IF EQ NOP CLC6 CALL @D.VPWF(R2) ;CALL DRIVER AT POWERFAIL ENTRYPOINT70$: ;REFERENCE LABEL .IFT1 MOV (SP)+,KDSAR5 ;RESTORE KERNEL DATA ADDR REG 5Q .ENDC2 MOV (SP)+,KINAR5 ;RESTORE KERNEL INSTR ADDR REG 5 RETURN ; .DSABL LSBT .IF DF M$$PRO3$PWRMP::CACHE$ BYPASS ;;;GET ACTUAL WORD IN MEMORY4;E; REMOVE OUR BIT FROM $STENB;$ MOV $STENB,R0 ;;;GET CURRENT STATUS=5$: CACHE$ BYPASS ;;;KEEP FORCING BYPASS IN CASE OF PWR FAIL(' BIC $CPBIT,$STENB ;;;CLEAR OUT OUR BITQ BIT $CPBIT,$STENB ;;;BREAK TIES/ BNE 5$ ;;;FIX ONE IN A MILLION RACE CONDITIONN! MOV $CPBIT,R1 ;;;GET OUR CPU BITS" COM R1 ;;;MAKE IT BIT CLEAR MASK' BIC R1,R0 ;;;LEAVE ONLY OUR BIT IN R0E2 CALL $STTIC ;;;MAKE SURE THE SANITY TIMER IS OFF>10$: CACHE$ BYPASS ;;;KEEP FORCING BYPASS IN CASE OF PWR FAIL, TST $PWRMK ;;;ANYONE IN THE POWERFAIL AREA BNE 10$ ;;;IF YES KEEP TRYINGU# BIS R0,$STENB ;;;SET OUR BIT AGAINE% CACHE$ RESTOR ;;;UNBYPASS THE CACHE RETURNI .ENDC;+);**-$MKSET-RESET MK11 CSR'S ON CPU ONLINE ;SD; THIS ROUTINE IS CALLED TO RESTORE THE SETTING OF MK11 CSR'S (USINGD; $MKCSR,$MKCS1,$MKCS2) AFTER POWER FAILURE AND RECOVERY, AND AT CPUF; ONLINE TIME TO BRING PARITY (NO PUN INTENDED) TO THE NEW PROCESSOR'S; OUTLOOK ON MEMORY.; ; INPUTS:C; ; NONE. ;E ; OUTPUTS:;T; MK11 MEMORY BOXES REMAPPED;F; R0,R1 ARE DESTROYEDI$; R2 = STATUS (VALID ONLY IF $MKSET)8; C = 1 IF ANY ONLINE BOX (IN $MKCSR) IS NOT IN I/O PAGE;- .IF DF M$$K11<; NOTE: THE FOLLOWING CODE ASSUMES THAT WE ARE CALLED ON CPU6; ONLINE IN A SECTION PROTECTED BY $SGFIN (I.E. MPENT)700 uut__DATADATADATADATA; AND THAT POWERFAIL DOES NOT CALL $SGFIN. THIS WAY, IFE8; A CSR "DISAPPEARS" WHILE POWERED DOWN, THE SYSTEM WILL8; CRASH. IF IT DISSAPEARS BEFORE PROCESSOR ON-LINE (E.G.9; SWITCHES NOT SET CORRECTLY) THE ON-LINE TRANSITITION ISO ; REJECTED.2$MKSET::MOV #$MKCSR,R0 ;POINT TO FIRST CSR ADDRESS) MOV #IE.ONP,R2 ;ASSUME CSR'S NOT PRESENTM-10$: MOV (R0)+,R1 ;GET FIRST/NEXT CSR ADDRESS& CMP #160000,R1 ;IS IT A CSR ADDRESS ?! BHI 20$ ;IF HI NO, IT'S A DUMMY " CLC ;ASSUME THAT THE CSR EXISTS/ MOV $MKCS1,(R1) ;STUFF CSR1 WITH CONTROL VALUE. BCS 30$ ;IF CS DIDN'T EXISTE9 MOV $MKCS2-$MKCSR-2(R0),2(R1) ;CRAM CSR2 WITH START ADDRS*20$: CMP R0,#$MKCS2 ;REACHED THE END YET ? BLO 10$ ;IF LO NO, CONTINUEN2 MOV #1,R2 ;SET SUCCESS (NOTE C-BIT MUST BE CLEAR% ;FOR BLO TO HAVE DROPPED THROUGH)30$: RETURN ;BACK TO CALLERO .ENDC ; DF M$$K11;+.;**-$DRVPF-CALL DRIVERS FOR POWERFAIL RECOVERY;TD; THIS ENTRY POINT IS PROVIDED SPECIFICALLY FOR USE BY AUTOCONFIGUREE; TO RECOVER THE SYSTEM. THE DEVICE DRIVERS ARE CALLED AT THEIR POWERB=; FAIL ENTRY POINTS IN ORDER TO RE-ESTABLISH INTERRUPTS, ETC.R;-+$DRVPF:: ;DRIVER POWERFAIL RECOVERY ENTRYH6 MOV KISAR5,-(SP) ;SAVE APR 5 MAPPING (D OR I/D SPACE) .IF DF K$$DAS/ MOV KINAR5,-(SP) ;SAVE APR 5 MAPPING (I SPACE)P .IFTF ; DF K$$DAS .IF DF M$$PRO4 BIS @$CPURM,$PFURM ;INDICATE THIS CPU'S URMS FAILED .ENDC ; DF M$$PRO' CALL DRVPF ;CALL DRIVERS AT POWERFAILE .IFT ; DF K$$DASA2 MOV (SP)+,KINAR5 ;RESTORE APR 5 MAPPING (I SPACE) .ENDC ; DF K$$DAS9 MOV (SP)+,KISAR5 ;RESTORE APR 5 MAPPING (D OR I/D SPACE)U RETURN ;- .END: ;DRIVER POWERFAIL RECOVERY ENTRYH6 MOV KISAR5,-(SP) ;SAVE APR 5 MAPPING (D OR I/D SPACE) .IF DF K$$DAS/ MOV KINAR5,-(SP) ;SAVE APR 5 MAPPING (I SPACE)P .IFTF ; DF K$$DAS .IF DF M$$PRO4 BIS @$CPURM,$PFURM ;INDICATE THIS CPU'S URMS FAILED .ENDC ; DF M$$PRO' CALL DRVPF ;CALL DRIVERS AT POWERFAILE .IFT ; DF K$$DASA2 MOV (SP)+,KINAR5 ;RESTORE APR 5 M .IF DF L$$GCL .IFF ; DF L$$GCL.% .TITLE DRPFN Logical Name Directives1 .IDENT /X.X/4 .IFT ; DF L$$GCLc .NLIST1 .ENABL LC .NLIST BIN,LOCa .LIST,; 0001 0 %TITLE 'Logical Name Directives'); 0002 0 MODULE DRPFN (IDENT = 'X1.12'I; 0003 0 ) = ; 0004 1 BEGINE1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.M; All rights reservedP; 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 !cT; 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 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.; 004600utibjbkb a a a 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 ; 0051 1 ! .; 0052 1 ! Paul K. M. Weiss 8-Aug-1986 1.10 ; 0053 1 !9H; 0054 1 ! PKW117 - Don't clear FS$QUO when a node is separated for #; 0055 1 ! logical expansion3 ; 0056 1 !4/; 0057 1 ! Paul K. M. Weiss 24-May-1988 1.11 ; 0058 1 !sK; 0059 1 ! PKW156 - Don't crash if dev in primary and node in secondaryr ; 0060 1 !00; 0061 1 ! Modified for RSX-11M-PLUS V4.4 by: ; 0062 1 !f6; 0063 1 ! J. C. Franzini 26-Sep-1990 X1.12I; 0064 1 ! JCF400 -- Fix PKW156 to return correct flags for secondaryg0; 0065 1 ! Wildcard flags were being lost; 0066 1 !--Q ; 0067 1 ; 0068 1 !o; 0069 1 ! INCLUDE FILES: ; 0070 1 ! !; 0071 1 LIBRARY 'BLI:RSX11M';. ; 0072 1 LIBRARY 'BLI:FCS11'; ; 0073 1 !9; 0074 1 ! MACROS:r ; 0075 1 !r; 0076 1 MACROe; 0077 1 ! /; 0078 1 ! Set directive status and exit4; 0079 1 !f); M 0080 1 ERROR_EXIT (error_code) =9; M 0081 1 BEGIN; M 0082 1 LINKAGE#; M 0083 1 error_trap = TRAP;e0; M 0084 1 error_trap (error_code AND %o'377'); 0085 1 END %; ; 0086 1 ; 0087 1 MACROo; 0088 1 !LA; 0089 1 ! Move a character string. Advance the pointers. ; 0090 1 !I'; M 0091 1 ch$move (len, ip, op) =A; M 0092 1 BEGIN ; M 0093 1 ; M 0094 1 MAP&; M 0095 1 ip : REF VECTOR [,BYTE],&; M 0096 1 op : REF VECTOR [,BYTE]; ; M 0097 1 ; M 0098 1 IF len NEQU 0; M 0099 1 THEN (; M 0100 1 DECR i FROM len TO 1 DO; M 0101 1 BEGIN4; M 0102 1 op [0] = .ip [0];o; M 0103 1 op = op [1];; M 0104 1 ip = ip [1];; M 0105 1 END; ; M 0106 1 ; 0107 1 END; %; ; 0108 1 ; 0109 1 LITERAL 4; 0110 1 debug_version = 1; ! Variant type ; 0111 1 ; 0112 1 MACRO ; 0113 1 ! E; 0114 1 ! No /VARIANT switch produces the production version.RH; 0115 1 ! /VARIANT produces the debug version with global stuff.; 0116 1 ! "; M 0117 1 global_for_debug =@; 0118 1 %IF %VARIANT EQLU debug_version %THEN GLOBAL %FI %,0; M 0119 1 global_for_debug_own_otherwise =I; 0120 1 %IF %VARIANT EQLU debug_version %THEN GLOBAL %ELSE OWN %FI%, -; M 0121 1 external_debug_forward_else = O; 0122 1 %IF %VARIANT EQLU debug_version %THEN EXTERNAL %ELSE FORWARD %FI%, ; M 0123 1 find_something =,; M 0124 1 %IF %VARIANT EQLU debug_version; M 0125 1 %THEN; M 0126 1 find_test; M 0127 1 %ELSE!; M 0128 1 find_equivalenced; 0129 1 %FI%; ; 0130 1 !Q; 0131 1 ! LINKAGES ; 0132 1 ! ; 0133 1 LINKAGEfj; 0134 1 $LNxxx_l = JSR (REGISTER = 3, REGISTER = 4, REGISTER = 5) : NOPRESERVE (0, 1, 2, 3, 4, 5),^; 0135 1 common_parse_l = JSR (REGISTER = 3, REGISTER = 4, REGISTER = 5, REGISTER = 0),T; 0136 1 sec_spec_convert_l = JSR (REGISTER = 3, REGISTER = 4; REGISTER = 3),D; 0137 1 return_ie_xxx_l = JSR : PRESERVE (0, 1, 2, 3, 4, 5),i; 0138 1 lun_assign_l = JSR (REGISTER = 3, REGISTER = 4, REGISTER = 5, REGISTER = 0, REGISTER = 1,II; 0139 1 REGISTER = 2; REGISTER = 1) : NOPRESERVE (0, 1, 2, 3, 4, 5),Rb; 0140 1 find_equivalence_l = JSR (REGISTER = 1, REGISTER = 2; REGISTER = 1, REGISTER = 2),U; 0141 1 fss_l = JSR (REGISTER = 4, REGISTER = 5; REGISTER = 4, REGISTER = 5), 7; 0142 1 expand_filespec_l = JSR (REGISTER = 3),EF; 0143 1 separate_logical_l = JSR (REGISTER = 3, REGISTER = 4),3; 0144 1 ch$classify_l = JSR (REGISTER = 1),To; 0145 1 ch$copy_l = JSR (REGISTER = 1, REGISTER = 2, REGISTER = 3; REGISTER = 3) : NOPRESERVE (0, 1, 2)E; 0146 1 PRESERVE (4, 5), I; 0147 1 save_parse_l = JSR (REGISTER = 1) : NOPRESERVE (0, 1, 2),=`; 00uut__DATADATADATADATA 0148 1 RAD50_to_ASCII_l = JSR (REGISTER = 1, REGISTER = 2, REGISTER = 3; REGISTER = 2); ; 0149 1 ; 0150 1 !a ; 0151 1 ! TABLE OF CONTENTS: ; 0152 1 ! ; 0153 1 FORWARD ROUTINE(Y; 0154 1 $LNFSS : $LNxxx_l NOVALUE, ! File Specification Scan, called from DRLOG5P; 0155 1 $LNCHN : $LNxxx_l NOVALUE, ! Assign channel, called from DRLOGR; 0156 1 $LNRMS : $LNxxx_l NOVALUE, ! RMS format parse, called from DRLOGR; 0157 1 $LNFCS : $LNxxx_l NOVALUE, ! FCS format parse, called from DRLOG_; 0158 1 common_parse : common_parse_l NOVALUE, ! Parse code common to RMS and FCS parse1V; 0159 1 fss : fss_l NOVALUE, ! Utility routine to parse a file specification`; 0160 1 expand_filespec : expand_filespec_l, ! Expand a file specification with logicalsF; 0161 1 ch$classify : ch$classify_l, ! Classify the characterS; 0162 1 ch$copy : ch$copy_l NOVALUE, ! Copy, upcase, and compress a string ]; 0163 1 convert_parse : NOVALUE, ! Convert addresses in parse block to user virtualpL; 0164 1 merge, ! Merge primary and secondary file specificationsO; 0165 1 save_parse : save_parse_l NOVALUE, ! Save and zero parse blocknS; 0166 1 RAD50_to_ASCII : RAD50_to_ASCII_l NOVALUE; ! Convert RAD50 to ASCIIw/; 0167 1 EXTERNAL_DEBUG_FORWARD_ELSE ROUTINEaZ; 0168 1 find_equivalence : find_equivalence_l; ! Find equivalence for logical name ; 0169 1 ; 0170 1 !; 0171 1 ! EQUATED SYMBOLS: ; 0172 1 !n; 0173 1 LITERALs; 0174 1 true = 1, ; 0175 1 false = 0,; 0176 1 valid = 1,; 0177 1 success = 1,; 0178 1 terminal = 3, ; 0179 1 error = 0,-; 0180 1 bad_node = -1176, ! ER$NODD.; 0181 1 bad_device = -448, ! ER$DEVD; 0182 1 bad_directory = -464, ! ER$DIRD; 0183 1 bad_filename = -752, ! ER$FNMD; 0184 1 bad_char = -1824, ! ER$XTRD; 0185 1 bad_logical = -184, ! ER$BEQD; 0186 1 bad_recursive = -1688, ! ER$TRND; 0187 1 bad_size = -780; ! ER$FTB ; 0188 1 ; 0189 1 LITERAL!>; 0190 1 apr5_v = %o'120000', ! APR 5 virtual address>; 0191 1 apr6_v = %o'140000'; ! APR 6 virtual address ; 0192 1 *; 0193 1 LITERAL ! Character types7; 0194 1 ch_other = 0, ! All other characters ,; 0195 1 ch_lower = 1, ! Lowercase); 0196 1 ch_space = 2, ! SpacesB.; 0197 1 ch_oct = 3, ! Octal Number.; 0198 1 ch_alpha = 4, ! Alphabetic (; 0199 1 ch_comma = 5, ! Comma(; 0200 1 ch_colon = 6, ! Colon1; 0201 1 ch_quote = 7, ! "Double" quoteu<; 0202 1 ch_dir = 8, ! Matching directory bracket=; 0203 1 ch_wild = 9, ! Wildcards, star and percentr'; 0204 1 ch_dash = 10, ! Dash!%; 0205 1 ch_dot = 11, ! Dot 0; 0206 1 ch_dollar = 12, ! Dollar sign.; 0207 1 ch_under = 13, ! Underscore4; 0208 1 ch_8and9 = 14, ! Non octal digitsA; 0209 1 ch_misc = 15, ! Miscellaneous valid characters0?; 0210 1 ch_valid = 2, ! Minimum valid character type 8; 0211 1 ch_max = 15; ! Maximum character type ; 0212 1 ; 0213 1 !2D; 0214 1 ! These are from FSS$BT in RMSMAC.MLB. They are defined!; 0215 1 ! here for convience.2 ; 0216 1 !t; 0217 1 LITERAL ; 0218 1 FS$VER = %o'1',D; 0219 1 FS$TYP = %o'2',d; 0220 1 FS$NAM = %o'4',8 ; 0221 1 FS$WVE = %o'10', ; 0222 1 FS$WTY = %o'20', ; 0223 1 FS$WNA = %o'40',!; 0224 1 FS$DIR = %o'100',d!; 0225 1 FS$DEV = %o'200',t!; 0226 1 FS$NOD = %o'400', "; 0227 1 FS$WDI = %o'1000',"; 0228 1 FS$QUO = %o'2000',"; 0229 1 FS$WCH = %o'4000',#; 0230 1 FS$NDF = %o'10000';e ; 0231 1 ; 0232 1 LITERAL C; 0233 00"utibjbkb a a a1 logical_type_none = 0, ! Values for parse_block_f A; 0234 1 logical_type_filename = 1, ! field logical_type (; 0235 1 logical_type_device = 2,&; 0236 1 logical_type_node = 3; ; 0237 1 ; 0238 1 FIELD0; 0239 1 parse_block_f ='; 0240 1 SET?; 0241 1 fss_status = [0, 0, 16, 0], ! Status of operation 1; 0242 1 flags = [1, 0, 16, 0], ! Flag wordWF; 0243 1 node_len = [2, 0, 16, 0], ! Length of node specificationH; 0244 1 node_addr = [3, 0, 16, 0], ! Address of node specificationJ; 0245 1 device_len = [4, 0, 16, 0], ! Length of device specificationL; 0246 1 device_addr = [5, 0, 16, 0], ! Address of device specificationO; 0247 1 directory_len = [6, 0, 16, 0], ! Length of filename specification Q; 0248 1 directory_addr = [7, 0, 16, 0], ! Address of filename specification N; 0249 1 filename_len = [8, 0, 16, 0], ! Length of filename specificationP; 0250 1 filename_addr = [9, 0, 16, 0], ! Address of filename specificationG; 0251 1 type_len = [10, 0, 16, 0], ! Length of type specification I; 0252 1 type_addr = [11, 0, 16, 0], ! Address of type specification M; 0253 1 version_len = [12, 0, 16, 0], ! Length of version specification O; 0254 1 version_addr = [13, 0, 16, 0], ! Address of version specification,H; 0255 1 trailing_len = [14, 0, 16, 0], ! Length of trailing stringJ; 0256 1 trailing_addr = [15, 0, 16, 0], ! Address of trailing stringK; 0257 1 access_len = [16, 0, 16, 0], ! Length of access specification1M; 0258 1 access_addr = [17, 0, 16, 0], ! Address of access specification,J; 0259 1 logical_type = [18, 0, 8, 0], ! First element which could be; 0260 1 ! a logical ; 0261 1 ! 0 - None ; 0262 1 ! 1 - Filename; 0263 1 ! 2 - Device; 0264 1 ! 3 - Node7; 0265 1 reserved_field = [18, 8, 8, 0] ! Reserved ; 0266 1 ; 0267 1 TES; ; 0268 1 ; 0269 1 FIELD &; 0270 1 logical_descriptor_f =; 0271 1 SETE; 0272 1 length = [0, 0, 16, 0], ! Logical name length in bytesfJ; 0273 1 address_base = [1, 0, 16, 0], ! 32 word block offset of baseV; 0274 1 address_disp_apr6 = [2, 0, 16, 0], ! APR6 displacment of the logical nameH; 0275 1 table_number = [3, 0, 8, 0], ! Table number to be searched<; 0276 1 block_type = [3, 8, 8, 0], ! Block type number[; 0277 1 matching_tcb_ucb = [4, 0, 16, 0] ! Matching UCB or TCB depending on table type ; 0278 1 TES;i ; 0279 1 ; 0280 1 LITERAL2J; 0281 1 file_spec_size = 255, ! Maximum file specification size E; 0282 1 logical_size = 255, ! Maximum size of one logical 4H; 0283 1 parse_block_size = 19, ! Parse work area size in words[; 0284 1 logical_descriptor_size = 5, ! Logical name descriptor block size in wordsb<; 0285 1 iteration_max = 10; ! Max iteration count ; 0286 1 ; 0287 1 !0-; 0288 1 ! OWN STORAGE (GLOBAL for DEBUG): ; 0289 1 !T*; 0290 1 GLOBAL_FOR_DEBUG_OWN_OTHERWISE5; 0291 1 must_have_device, ! Flag for ACHN$eE; 0292 1 cannot_have_node, ! Node is illegal except for RMS <; 0293 1 terminal_logical_flag, ! Flag for terminalF; 0294 1 do_directory_defaulting, ! Directory defaulting flag#; 0295 1 saved_inhibit_mask,iI; 0296 1 init_logical_descriptor : BLOCK [logical_descriptor_size]L; 0297 1 FIELD (logical_descriptor_f), ! Logical name descriptor blockJ; 0298 1 scr_pb : BLOCK[parse_block_size] ! Scratch buffer for fss(; 0299 1 FIELD (parse_block_f), !O; 0300 1 pri_pb : BLOCK [parse_block_size] ! Primary file specification 5; 0301 1 FIELD (parse_block_f), ! parse block2M; 0302 1 merged : REF VECTOR [, BYTE], ! Merged specification buffer O; 0303 1 primary : REF VECTOR [, BYTE], ! Primary specification bufferdd; 0304 1 secondary : VECTOR [file_spec_size, BYTE], ! Work area for secondary input to mergeD; 00*uut__DATADATADATADATA0305 1 work_1 : VECTOR [file_spec_size, BYTE], ! Work areaC; 0306 1 work_2 : VECTOR [file_spec_size, BYTE]; ! Work areaO ; 0307 1 ; 0308 1 !a"; 0309 1 ! EXTERNAL REFERENCES: ; 0310 1 !l; 0311 1 EXTERNAL2; 0312 1 $SAHDB, ! Saved header mappingM; 0313 1 KISAR5, ! Kernel APR 5 actual data space mapping register,M; 0314 1 KISAR6, ! Kernel APR 6 actual data space mapping registere>; 0315 1 $TONYL, ! Temporary storage for directives:; 0316 1 H_DUIC, ! Default UIC offset in header:; 0317 1 T_UCB, ! TI: UCB address offset in TCB;; 0318 1 T_CTX, ! Task dds context block addressEB; 0319 1 D_UCB, ! Address of the first UCB for this DCB9; 0320 1 D_UCBL, ! Length of UCBs for this DCBA5; 0321 1 D_UNIT, ! Lowest unit on this DCBe5; 0322 1 D_NAM, ! Device name for this DCBa?; 0323 1 U_CTX, ! Terminal dds context block addressr<; 0324 1 U_DCB, ! Address of the DCB for this UCB;; 0325 1 U_CW1, ! UCB first characteristics worda<; 0326 1 DV_REC, ! Record oriented device (U.CW1)=; 0327 1 DV_SDI, ! Single directory device (U.CW1)h7; 0328 1 DV_SQD, ! Sequential device (U.CW1)e3; 0329 1 DV_PSE, ! Pseudo device (U.CW1) ;; 0330 1 $FMSK4, ! 4th feature mask word addressv9; 0331 1 F4_DVN; ! Decimal version number flaga ; 0332 1 ; 0333 1 LINKAGE3v; 0334 1 $ACHxx_l = JSR (REGISTER = 0, REGISTER = 1; REGISTER = 2) : CLEARSTACK VALUECBIT PRESERVE (0, 3, 4, 5); 0335 1 NOPRESERVE (1, 2),dt; 0336 1 $BLXIO_l = JSR (REGISTER = 0, REGISTER = 1, REGISTER = 2, REGISTER = 3, REGISTER = 4) : PRESERVE (5)(; 0337 1 NOPRESERVE (0, 1, 2, 3, 4),Y; 0338 1 $MPLUN_l = JSR (REGISTER = 3, REGISTER = 4, REGISTER = 5; REGISTER = 2) :rJ; 0339 1 CLEARSTACK VALUECBIT NOPRESERVE (0, 1, 2, 3) PRESERVE (4, 5),Y; 0340 1 $MPLND_l = JSR (REGISTER = 0, REGISTER = 5; REGISTER = 0, REGISTER = 2) : J; 0341 1 CLEARSTACK VALUECBIT NOPRESERVE (0, 2) PRESERVE (1, 3, 4, 5),a; 0342 1 $RELOC_l = JSR (REGISTER = 0; REGISTER = 1, REGISTER = 2) : PRESERVE (0, 3, 4, 5)R; 0343 1 NOPRESERVE (1, 2),)X; 0344 1 $RELOM_l = JSR (REGISTER = 0) : PRESERVE (3, 4, 5) NOPRESERVE (0, 1, 2),S; 0345 1 $TBSRC_l = JSR (REGISTER = 0; REGISTER = 3) : CLEARSTACK VALUECBIT,St; 0346 1 $DCBTA_l = JSR (REGISTER = 0, REGISTER = 3; REGISTER = 3) : PRESERVE (2, 4, 5) NOPRESERVE (0, 1, 3)"; 0347 1 CLEARSTACK VALUECBIT; ; 0348 1 ; 0349 1 EXTERNAL ROUTINEM; 0350 1 $ACHKB : $ACHxx_l, ! Address check byte aligned read/write L; 0351 1 $ACHRO : $ACHxx_l, ! Address check byte aligned read only6; 0352 1 $BLXIO : $BLXIO_l, ! Block transferI; 0353 1 $MPLUN : $MPLUN_l, ! Map logical unit number to device ?; 0354 1 $MPLND : $MPLND_l, ! Follow unit redirectionRD; 0355 1 $RELOC : $RELOC_l, ! Relocate user buffer addressD; 0356 1 $RELOM : $RELOM_l, ! Relocate and map user bufferE; 0357 1 TBSRC_BLI : $TBSRC_l, ! Search logical name tables Q; 0358 1 DCBTA_BLI : $DCBTA_l, ! Binary to octal ASCII routine in DRLOGeH; 0359 1 lun_assign : lun_assign_l; ! Routine to assign the LUN6; 0360 1 %SBTTL 'File Specification Scan Directive' ; 0361 1 W; 0362 1 GLOBAL ROUTINE $LNFSS (dpb_ptr, header_addr, tcb_addr) : $LNxxx_l NOVALUE = ; 0363 1 ; 0364 1 !++e ; 0365 1 !d%; 0366 1 ! FUNCTIONAL DESCRIPTION:, ; 0367 1 !aH; 0368 1 ! This routine is called by DRLOG if the FSS subfunction was; 0369 1 ! specified. ; 0370 1 !L ; 0371 1 ! FORMAL PARAMETERS: ; 0372 1 !i; 0373 1 ! dpb_ptr 4; 0374 1 ! Address of the second word of the dpb ; 0375 1 ! ; 0376 1 ! IMPLICIT INPUTS: ; 0377 1 ! ; 0378 1 ! the dpb B; 0379 1 ! The Directive Parameter Block provides all the user*; 0380 1 ! supplied 002utibjbkb a a acalling parameters ; 0381 1 ! ; 0382 1 ! IMPLICIT OUTPUTS:N ; 0383 1 ! J; 0384 1 ! The directive is performed or an error indicating the reason; 0385 1 ! is returned. ; 0386 1 !; 0387 1 !--M ; 0388 1 ; 0389 2 BEGIN3; 0390 2 ! N; 0391 2 ! The File Specification Scanner DPB has the following format:; 0392 2 ! word contents ; 0393 2 ! ---- --------9/; 0394 2 ! 0 Directive code, DPB length *; 0395 2 ! 1 Subfunction, reserved; 0396 2 ! 2 Reserved39; 0397 2 ! 3 Address of file specification bufferh6; 0398 2 ! 4 Size of file specification buffer+; 0399 2 ! 5 Address of parse block3; 0400 2 ! 6 Size of parse block (in bytes)I; 0401 2 ! L; 0402 2 ! The parse block will zeroed and filled in with descriptorsL; 0403 2 ! for each field present of node, access, device, directory,K; 0404 2 ! filename, type, and version, plus the trailing portion ofnO; 0405 2 ! the string if any. The flags word will be have a bit set forsJ; 0406 2 ! each of the components present in the format for the RMS; 0407 2 ! NAM block.; 0408 2 ! !; 0409 2 ! In more detail.o; 0410 2 ! L; 0411 2 ! NODE: The node includes all nodes if poor man's routing isH; 0412 2 ! is being used. The initial node name is terminatedF; 0413 2 ! by the access control string address, even if thereG; 0414 2 ! is none. (In this case the access control length is ; 0415 2 ! zero.) ; 0416 2 ! ,; 0417 2 ! FS$NOD is set if present.; 0418 2 ! N; 0419 2 ! ACCESS The access control string is the entire quoted stringS; 0420 2 ! CONTROL: terminated by double colon. As noted above, the address'?; 0421 2 ! of the access control serves a dual purpose.d; 0422 2 !dP; 0423 2 ! DEVICE: The device is the string terminated by a single colon.; 0424 2 ! ,; 0425 2 ! FS$DEV is set if present.; 0426 2 !zO; 0427 2 ! DIRECTORY:The directory is the string bounded by either [] or8B; 0428 2 ! <> and includes a rather loosely checked set ofJ; 0429 2 ! characters valid in a directory specification includingL; 0430 2 ! wildcards, hierarchies, etc. The syntax of the directoryE; 0431 2 ! must be checked for validity in the context of the :; 0432 2 ! operation, for example, network access.; 0433 2 !5F; 0434 2 ! FS$DIR is set if present. In addition, if wildcardsK; 0435 2 ! are found, FS$WDI is also set. (Wildcards are "%", "*", ; 0436 2 ! and "...".e; 0437 2 !eQ; 0438 2 ! FILENAME: The filename is the string terminated by ".", ";", or 5; 0439 2 ! the end of the file specification.a; 0440 2 !G; 0441 2 ! FS$NAM is set if present. In addition, if wildcards I; 0442 2 ! are found, FS$WNA is also set. (Wildcards are "%" and5; 0443 2 ! "*".); 0444 2 !.>; 0445 2 ! If FS$QUO is set, the file specification isH; 0446 2 ! a quoted string. This is either a "foreign" filespecE; 0447 2 ! if being passed to another system (eg. via DAP) oriD; 0448 2 ! an ANSI filespec. The the case of the ANSI file,H; 0449 2 ! a version is allowed, but no type field. In the caseH; 0450 2 ! of a network operation, it's ambiguous, but a versionE; 0451 2 ! will be allowed but not defaulted. (Actually this4E; 0452 2 ! doesn't relate to FSS but this seems to be as goodo1; 0453 2 ! a place to mention it as any.)e; 0454 2 !iL; 0455 2 ! TYPE: The type is the string terminated by a "." or ";" orG; 0456 2 ! the end of the file specification. A leading "." is 1; 0457 2 ! always included in the string.f; 0458 2 !G; 0459 2 ! FS$TYP is set if present. In addition, if wildcardsI; 0460 2 ! 00:uut__DATADATADATADATA are found, FS$WTY is also set. (Wildcards are "%" and ; 0461 2 ! "*".); 0462 2 ! F; 0463 2 ! If the filename is a quoted string, then this field ; 0464 2 ! must be null.; 0465 2 !eN; 0466 2 ! VERSION: The version is the field including a leading "." orG; 0467 2 ! ";" terminated by the end of the string. The stringdG; 0468 2 ! is limited to an optional leading "-" and the digits 3; 0469 2 ! zero to nine, or a "*" wildcard. ; 0470 2 !YH; 0471 2 ! FS$VER is set if present. In addition, if a wildcard0; 0472 2 ! is found, FS$WVE is also set.; 0473 2 !eS; 0474 2 ! TRAILING: The unparsed portion of the initial string is that part D; 0475 2 ! of the input that was successfully and completelyD; 0476 2 ! parsed. If an error is detected in the directoryG; 0477 2 ! specification, for example, the trailing string will A; 0478 2 ! include the erroneous directory specification.Y; 0479 2 ! E; 0480 2 ! This should allow the used of FSS$ in command line K; 0481 2 ! parsing. Any character not part of a file specificationIE; 0482 2 ! terminates the scan and results in all information 2; 0483 2 ! obtained so far to be returned.; 0484 2 ! E; 0485 2 ! The field trailing_addr should always be filled in C; 0486 2 ! even when the length is zero. This is different B; 0487 2 ! from the norm, but is an exception for much the2; 0488 2 ! same reason as for access_addr.; 0489 2 !aP; 0490 2 ! The parse block can be truncated by the user if not all fieldsS; 0491 2 ! are desired, although the organization isn't well setup for that.3Q; 0492 2 ! The directive can also be enhanced by adding fields on the end.T@; 0493 2 ! Does this code return an error...it shouldn't.; 0494 2 !lQ; 0495 2 ! As coded, the parse block is zeroed and then filled in with theeO; 0496 2 ! data from the specified string. This block is then relocated B; 0497 2 ! to the user string virtual address and returned.; 0498 2 !l ; 0499 2 ; 0500 2 MAPa@; 0501 2 dpb_ptr : REF VECTOR; ! Treat the DPB as a vector ; 0502 2 ; 0503 2 LOCALc; 0504 2 status,'; 0505 2 b_len, ! Buffer lengtho); 0506 2 b_addr, ! Buffer address4+; 0507 2 b_mapping, ! Buffer mappinga3; 0508 2 p : REF VECTOR; ! Temporary pointer ; 0509 2 =; 0510 2 b_addr = .dpb_ptr [2]; ! Get buffer address;; 0511 2 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP);r;; 0512 2 b_len = .dpb_ptr [3]; ! Get buffer lengthU; 0513 2 IF .b_len EQLU 0 OR .b_len GTRU 1024*8 - 64 THEN ERROR_EXIT (IE_IBS);3 ; 0514 2 ; 0515 2 !uQ; 0516 2 ! Address check, relocate, and map the user buffer. No operationrO; 0517 2 ! will unmap the user buffer for the duration. The user string H; 0518 2 ! is then parsed and the output parse block is returned.; 0519 2 !d]; 0520 2 IF $ACHRO (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read accessd ; 0521 2 9; 0522 2 p = $RELOM (.b_addr); ! Map user bufferb?; 0523 2 fss (.p, .b_len); ! Parse file specification b; 0524 2 convert_parse (scr_pb, .p, .b_addr); ! Convert parse block addresses to user mode ; 0525 2 =; 0526 2 b_addr = .dpb_ptr [4]; ! Get buffer addressr;; 0527 2 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP);l;; 0528 2 b_len = .dpb_ptr [5]; ! Get buffer lengthR:; 0529 2 IF .b_len EQLU 0 THEN ERROR_EXIT (IE_IBS); ; 0530 2 ; 0531 2 !2L; 0532 2 ! Address check and relocate the user buffer. Then copy the$; 0533 2 ! parse block to it.; 0534 2 !oc; 0535 2 IF $ACHKB (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read/write access5 ; 0536 2 J; 0537 2 $RELOC (.b_addr; b_mapping, b_ad00Butibjbkb a a adr); ! Relocte user bufferk; 0538 2 $BLXIO (MINU (parse_block_size*2, .b_len), .kisar5, scr_pb, .b_mapping, .b_addr); ! Move itF; 0539 2 RETURN; 0540 1 END; .NLIST .LIST BIN,LOC .LIST% .TITLE DRPFN Logical Name Directivest .IDENT /X1.12/T .PSECT $OWN$, D MUST.HAVE.DEVICE:o .BLKW 1CANNOT.HAVE.NODE:  .BLKW 1TERMINAL.LOGICAL.FLAG: .BLKW 1DO.DIRECTORY.DEFAULTING: .BLKW 1SAVED.INHIBIT.MASK:  .BLKW 1INIT.LOGICAL.DESCRIPTOR: .BLKW 5SCR.PB: .BLKW 23PRI.PB: .BLKW 23MERGED: .BLKW 1 PRIMARY:.BLKW 1a SECONDARY: .BLKB 377 .EVENWORK.1: .BLKB 377i .EVENWORK.2: .BLKB 377 & .GLOBL $SAHDB, KISAR5, KISAR6, $TONYL+ .GLOBL H.DUIC, T.UCB, T.CTX, D.UCB, D.UCBLR* .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  .NLISTK .ENABL LSB  .LIST$LNFSS::TST -(SP) ; 0362.- MOV 4(R3),-(SP) ; *(DPB.PTR),B.ADDR 0510O BNE 1$ ; 0511. TRAP 236B/1$: MOV 6(R3),2(SP) ; *(DPB.PTR),B.LEN 0512T BEQ 2$ ; 0513. CMP 2(SP),#17700 ; B.LEN,*C BLOS 3$ 2$: TRAP 247%3$: MOV (SP),R0 ; B.ADDR,* 05204 MOV 2(SP),R1 ; B.LEN,*. JSR PC,$ACHRO BHIS 4$ TRAP 236%4$: MOV (SP),R0 ; B.ADDR,* 0522U JSR PC,$RELOM MOV R0,R1 ; *,Pc MOV R1,R4 ; P,* 0523 MOV 2(SP),R5 ; B.LEN,*K JSR PC,FSS  MOV #SCR.PB,-(SP) ; 0524  MOV R1,-(SP) ; P,*S MOV 4(SP),-(SP) ; B.ADDR,*O JSR PC,CONVERT.PARSE.. MOV 10(R3),6(SP) ; *(DPB.PTR),B.ADDR 0526 BNE 5$ ; 0527 TRAP 236115$: MOV 12(R3),10(SP) ; *(DPB.PTR),B.LEN 0528R BNE 6$ ; 0529 TRAP 247,%6$: MOV 6(SP),R0 ; B.ADDR,* 0535 MOV 10(SP),R1 ; B.LEN,* JSR PC,$ACHKB BHIS 7$ TRAP 236,%7$: MOV 6(SP),R0 ; B.ADDR,* 0537  JSR PC,$RELOC MOV R1,R3 MOV R2,6(SP)V" MOV 10(SP),R0 ; B.LEN,* 0538 CMP R0,#46B BLOS 8$ MOV #46,R0M8$: MOV KISAR5,R1S MOV #SCR.PB,R2) MOV 6(SP),R4 ; B.ADDR,* JSR PC,$BLXIO ADD #12,SP ; 0362) RTS PC 7; Routine Size: 80 words, Routine Base: $CODE$ + 0000(.; Maximum stack depth per invocation: 7 words .NLIST .DSABL LSB$ .NLIST BIN,LOC; .LIST-; 0541 1 %SBTTL 'Assign Channel Directive'H ; 0542 1 W; 0543 1 GLOBAL ROUTINE $LNCHN (dpb_ptr, header_addr, tcb_addr) : $LNxxx_l NOVALUE =( ; 0544 1 ; 0545 1 !++* ; 0546 1 !R%; 0547 1 ! FUNCTIONAL DESCRIPTION: ; 0548 1 !VH; 0549 1 ! This routine is called by DRLOG if the CHN subfunction was; 0550 1 ! specified. ; 0551 1 !8C; 0552 1 ! Assign channel does all of the processing of the fileoF; 0553 1 ! specification that is required to find the actual device;; 0554 1 ! name and then assigns the LUN to that device. ; 0555 1 !B ; 0556 1 ! FORMAL PARAMETERS: ; 0557 1 !); 0558 1 ! dpb_ptr4; 0559 1 ! Address of the second word of the dpb ; 0560 1 !N; 0561 1 ! IMPLICIT INPUTS: ; 0562 1 ! ; 0563 1 ! the dpbbB; 0564 1 ! The Directive Parameter Block provides all the user*; 0565 1 ! supplied calling parameters ; 0566 1 !e0; 0567 1 ! Assign Channel (ACHN$) DPB Format: ; 0568 1 !t/; 0569 1 ! WD. 00 -- DIC(207.),DPB Size (5.)t5; 0570 1 ! WD. 01 -- Subfunction code (6),Reserved '; 0571 1 ! WD. 02 -- LUN, Table mask 5; 0572 1 ! WD. 03 -- Address of file specification 2; 0573 1 ! WD. 04 -- Size of file specification ; 0574 1 !I; 0575 1 ! IMPLICIT OUTPUTS: ; 0576 1 ! J; 0577 1 ! The directive is performed or an error indicating the reason; 0578 1 ! is returned. ; 0579 1 ! ; 0580 1 !-- ; 0581 1 ; 0582 2 BEGIN; 0583 2 ! B; 0584 2 ! This directive uses the same code as the RMS and@; 0585 2 ! FCS format parse routines. It only passes the!; 0586 2 ! primary string.d; 00Juut__DATADATADATADATA 0587 2 !f ; 0588 2 ; 0589 2 MAPi@; 0590 2 dpb_ptr : REF VECTOR; ! Treat the DPB as a vector ; 0591 2 ; 0592 2 OWN B; 0593 2 temp_dpb : VECTOR [12]; ! Temp dpb for common parse ; 0594 2 ; 0595 2 LOCAL '; 0596 2 temp_dpb_ptr : REF VECTOR;5 ; 0597 2 ; 0598 2 ! P; 0599 2 ! Define the routine to convert the users default string and putT; 0600 2 ! it into the secondary string. For ACHN there isn't one so we just!; 0601 2 ! put a blank in. ; 0602 2 ! N; 0603 2 ROUTINE achn_convert (b_addr, b_len; p) : sec_spec_convert_l =; 0604 3 BEGINW3; 0605 3 secondary [0] = %C' '; ! No filespec ); 0606 3 RETURN valid; ! Return ok ; 0607 2 END; .NLISTp .LIST BIN,LOC .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 ; 0605 MOV #1,R0 ; 0604 RTS PC ; 0603 6; Routine Size: 6 words, Routine Base: $CODE$ + 0240.; Maximum stack depth per invocation: 0 words .NLISTy .DSABL LSB  .NLIST BIN,LOC .LIST ; 0608 2 ; 0609 2 ! ); 0610 2 ! Initialize the fake dpbC; 0611 2 !C@; 0612 2 temp_dpb_ptr = temp_dpb [0]; ! Init the pointer ; 0613 2 M; 0614 2 temp_dpb_ptr [0] = .dpb_ptr [0]; ! Modifier for common parseNH; 0615 2 temp_dpb_ptr = temp_dpb_ptr [1]; ! Advance the pointers.; 0616 2 dpb_ptr = dpb_ptr [1]; ! ... ; 0617 2 Q; 0618 2 temp_dpb_ptr [0] = .dpb_ptr [0]; ! LUN and mask for common parse H; 0619 2 temp_dpb_ptr = temp_dpb_ptr [1]; ! Advance the pointers.; 0620 2 dpb_ptr = dpb_ptr [1]; ! ... ; 0621 2 V; 0622 2 temp_dpb_ptr [0] = .dpb_ptr [0]; ! File spec address for common parseH; 0623 2 temp_dpb_ptr = temp_dpb_ptr [1]; ! Advance the pointers.; 0624 2 dpb_ptr = dpb_ptr [1]; ! ... ; 0625 2 U; 0626 2 temp_dpb_ptr [0] = .dpb_ptr [0]; ! File spec length for common parseeH; 0627 2 temp_dpb_ptr = temp_dpb_ptr [1]; ! Advance the pointers.; 0628 2 dpb_ptr = dpb_ptr [1]; ! ... ; 0629 2 ; 0630 2 ! ); 0631 2 ! Zero the unused fields. ; 0632 2 !e%; 0633 2 DECR i FROM 8 TO 1 DOs; 0634 3 BEGIN5; 0635 3 temp_dpb_ptr [0] = 0; ! Zero the field1C; 0636 3 temp_dpb_ptr = temp_dpb_ptr [1]; ! Advance the pointer!; 0637 2 END; ; 0638 2 ; 0639 2 !=; 0640 2 ! Do the parse; 0641 2 !eS; 0642 2 do_directory_defaulting = false; ! No directory defaulting for ACHN H; 0643 2 must_have_device = true; ! Must have a device for ACHN$I; 0644 2 cannot_have_node = true; ! Node specification is illegal O; 0645 2 common_parse (temp_dpb, .header_addr, .tcb_addr, achn_convert); ; 0646 2 RETURN;6; 0647 1 END; .NLISTp .LIST BIN,LOC .LIST' .SBTTL $LNCHN Assign Channel Directive  .NLIST .ENABL LSB6 .LIST2$LNCHN::MOV #TEMP.DPB,R0 ; *,TEMP.DPB.PTR 06120 MOV (R3)+,(R0)+ ; DPB.PTR,TEMP.DPB.PTR 06140 MOV (R3)+,(R0)+ ; DPB.PTR,TEMP.DPB.PTR 06180 MOV (R3)+,(R0)+ ; DPB.PTR,TEMP.DPB.PTR 06220 MOV (R3)+,(R0)+ ; DPB.PTR,TEMP.DPB.PTR 0626 MOV #10,R1 ; *,I 0633 '1$: CLR (R0)+ ; TEMP.DPB.PTR 0635r SOB R1,1$ ; I,* 0633( CLR DO.DIRECTORY.DEFAULTING ; 0642$ MOV #1,MUST.HAVE.DEVICE ; 0643$ MOV #1,CANNOT.HAVE.NODE ; 0644 MOV #TEMP.DPB,R3 ; 0645 MOV #ACHN.CONVERT,R0M JSR PC,COMMON.PARSE RTS PC ; 0543+7; Routine Size: 25 words, Routine Base: $CODE$ + 0254;-; Maximum stack depth per invocation: 1 word  .NLISTR .DSABL LSB  .NLIST BIN,LOC+ .LIST/; 0648 1 %SBTTL 'RMS Format Parse Directive' ; 0649 1 W; 0650 1 GLOBAL ROUTINE $LNRMS (dpb_ptr, header_addr, tcb_addr) : $LNxxx_l NOVALUE =A ; 0651 1 ; 0652 1 !++T ; 0653 1 00Rutibjbkb a a a! %; 0654 1 ! FUNCTIONAL DESCRIPTION: ; 0655 1 !EH; 0656 1 ! This routine is called by DRLOG if the RMS subfunction was; 0657 1 ! specified. ; 0658 1 ! ; 0659 1 ! FORMAL PARAMETERS: ; 0660 1 !t; 0661 1 ! dpb_ptrn4; 0662 1 ! Address of the second word of the dpb ; 0663 1 ! ; 0664 1 ! IMPLICIT INPUTS: ; 0665 1 ! ; 0666 1 ! the dpb B; 0667 1 ! The Directive Parameter Block provides all the user*; 0668 1 ! supplied calling parameters ; 0669 1 ! ; 0670 1 ! IMPLICIT OUTPUTS:N ; 0671 1 ! J; 0672 1 ! The directive is performed or an error indicating the reason; 0673 1 ! is returned. ; 0674 1 !; 0675 1 !--M ; 0676 1 ; 0677 2 BEGIN6; 0678 2 ! D; 0679 2 ! The RMS format parse DPB has the following format:; 0680 2 ! word contents ; 0681 2 ! ---- -------- /; 0682 2 ! 0 Directive code, DPB lengtho*; 0683 2 ! 1 Subfunction, Modifier$; 0684 2 ! 2 LUN, Table maskE; 0685 2 ! 3 Address of the primary file specification buffertK; 0686 2 ! 4 Size of the primary file specification buffer in bytes.G; 0687 2 ! 5 Address of the resultant file specification bufferM; 0688 2 ! 6 Size of the resultant file specification buffer in bytesgK; 0689 2 ! 7 Address of a word to receive the resultant string size/; 0690 2 ! 8 Address of the parse block5; 0691 2 ! 9 Size of the parse block in bytes E; 0692 2 ! 10 Address of the default file specification bufferiK; 0693 2 ! 11 Size of the default file specification buffer in bytesf; 0694 2 !yS; 0695 2 ! The basic operation of the FCS and RMS format parse6S; 0696 2 ! subfunctions is the same. The only difference consists of S; 0697 2 ! differences in the formats of the input and output parameters.8S; 0698 2 ! Both formats exists in order to minimize the amount of code thatG; 0699 2 ! must be added to the RMS and FCS access methods code. ; 0700 2 !S3; 0701 2 ! The follow operations occur:f; 0702 2 !y6; 0703 2 ! 1. First process the input strings:; 0704 2 !mS; 0705 2 ! 1. The primary string is copied, compressed, and upcasedoA; 0706 2 ! from the users buffer to a work buffer.u; 0707 2 !a@; 0708 2 ! 2. The resulting string is parsed. (FSS); 0709 2 !o;; 0710 2 ! 3. The resulting string is Expanded.a; 0711 2 ! S; 0712 2 ! 4. The resulting value for logical type, (none, filename, 2; 0713 2 ! device, node), is saved.; 0714 2 !7S; 0715 2 ! 5. The secondary string is copied, compressed, and upcasedaS; 0716 2 ! from the users buffer to a work buffer. This is somewhat L; 0717 2 ! more involved for the FCS format of the directive.; 0718 2 ! @; 0719 2 ! 6. The resulting string is parsed. (FSS); 0720 2 !Q; 0721 2 ! 7. The processed primary and secondary strings are merged. ; 0722 2 ! V; 0723 2 ! 8. If the resulting value for logical type is greater than theS; 0724 2 ! saved value for the processed primary string then expande,; 0725 2 ! the merged string.; 0726 2 ! S; 0727 2 ! 9. If a node specification is present then we are all done. 3; 0728 2 ! Return the output values.d; 0729 2 ! ; 0730 2 ! 3; 0731 2 ! 2. Now do the device defaulting:t; 0732 2 !K; 0733 2 ! 3. The previous merged string is now the primary string.c; 0734 2 !tS; 0735 2 ! 4. Save the flags word from the parse block. The flags returnednS; 0736 2 ! indicate what was supplied from the input strings, not what 9; 0737 2 ! is supplied by the system defaults.a; 0738 2 ! -; 0739 00Zuut__DATADATADATADATA2 ! 5. If the LUN is assigned:d; 0740 2 ! S; 0741 2 ! 1. Build a secondary string containing the device 5; 0742 2 ! specification from the LUN.i; 0743 2 !rS; 0744 2 ! 2. Also indicate that the LUN must not be assigned at therS; 0745 2 ! end of the directive. Reassigning the LUN will result ino1; 0746 2 ! an IO.KIL being issued. ; 0747 2 !eS; 0748 2 ! 3. Merge the primary and the secondary strings. Do notdS; 0749 2 ! expand the merged string. We know that we have a reali&; 0750 2 ! device name.; 0751 2 !o; 0752 2 ! 1; 0753 2 ! 6. If the LUN is not assigned:d; 0754 2 !m;; 0755 2 ! 1. Put SY: in the secondary string. ; 0756 2 !RB; 0757 2 ! 2. Merge the primary and secondary strings.; 0758 2 !3; 0759 2 ! 3. Expand the merged string.h; 0760 2 ! ; 0761 2 ! S; 0762 2 ! 7. If a node specification is present then we are all done.a/; 0763 2 ! Return the output values..; 0764 2 !oK; 0765 2 ! 8. The previous merged string is now the primary string. ; 0766 2 ! S; 0767 2 ! 9. If there is a non null, ([], <>), directory specification in7S; 0768 2 ! the primary string then go on to assign the LUN if7"; 0769 2 ! appropriate.; 0770 2 !0,; 0771 2 ! 10. Directory defaulting:; 0772 2 !pT; 0773 2 ! 1. If there is a non null default directory string then putP; 0774 2 ! the default directory string in the secondary string.; 0775 2 !rT; 0776 2 ! 2. Otherwise build a directory specification in theA; 0777 2 ! secondary string from the default UIC. ; 0778 2 !oT; 0779 2 ! 3. Merge the primary and secondary strings and make the5; 0780 2 ! result the primary string. ; 0781 2 ! ; 0782 2 ! T; 0783 2 ! 11. If there is a LUN assigment and if that LUN assigment wasT; 0784 2 ! used as the default device then do not assign the LUN.T; 0785 2 ! Otherwise use the device portion of the primary string to&; 0786 2 ! assign the LUN.; 0787 2 !7T; 0788 2 ! 12. Return the primary string to the expanded string buffer.T; 0789 2 ! Return the parse block for the primary string with the saved9; 0790 2 ! flags to the users parse block.a; 0791 2 !i ; 0792 2 ! 13. All done.; 0793 2 !u ; 0794 2 ; 0795 2 !eP; 0796 2 ! Define the routine to convert the users default string and putS; 0797 2 ! it into the secondary string. For RMS we just copy, compress and ; 0798 2 ! upcase it.; 0799 2 !tT; 0800 2 ROUTINE rms_convert (b_addr, b_len; p) : sec_spec_convert_l NOVALUE=; 0801 3 BEGINnD; 0802 3 IF .b_len GTRU file_spec_size THEN ERROR_EXIT (IE_IBS);9; 0803 3 ch$copy (.b_len, .b_addr, secondary [0]; p);.; 0804 2 END; .NLIST  .LIST BIN,LOC .LIST. .SBTTL RMS.CONVERT RMS Format Parse Directive .NLISTe .ENABL LSBa .LIST RMS.CONVERT: JSR R1,$SAVE2 ; 0800i MOV R3,R2 ; *,B.ADDR! CMP R4,#377 ; B.LEN,* 0802p BLOS 1$ TRAP 247 "1$: MOV R4,R1 ; B.LEN,* 0803 MOV #SECONDARY,R3 JSR PC,CH$COPY_ RTS PC ; 0800 7; Routine Size: 13 words, Routine Base: $CODE$ + 0336i.; Maximum stack depth per invocation: 5 words .NLISTn .DSABL LSBc .NLIST BIN,LOC .LIST ; 0805 2 ; 0806 2 !C; 0807 2 ! Do the parse; 0808 2 !rQ; 0809 2 do_directory_defaulting = true; ! Do directory defaulting for RMSQ; 0810 2 must_have_device = false; ! Don't need explicit device for $PRMSF; 0811 2 cannot_have_node = false; ! RMS likes n00butibjbkb a a aodes just fineN; 0812 2 common_parse (.dpb_ptr, .header_addr, .tcb_addr, rms_convert);; 0813 1 END; .NLIST  .LIST BIN,LOC .LIST) .SBTTL $LNRMS RMS Format Parse Directive. .NLIST .ENABL LSB .LIST1$LNRMS::MOV #1,DO.DIRECTORY.DEFAULTING ; 08098! CLR MUST.HAVE.DEVICE ; 0810c! CLR CANNOT.HAVE.NODE ; 0811o! MOV #RMS.CONVERT,R0 ; 0812  JSR PC,COMMON.PARSE RTS PC ; 0650x7; Routine Size: 12 words, Routine Base: $CODE$ + 0370=-; Maximum stack depth per invocation: 1 word  .NLISTm .DSABL LSBb .NLIST BIN,LOCr .LIST/; 0814 1 %SBTTL 'FCS Format Parse Directive'T ; 0815 1 W; 0816 1 GLOBAL ROUTINE $LNFCS (dpb_ptr, header_addr, tcb_addr) : $LNxxx_l NOVALUE =: ; 0817 1 ; 0818 1 !++; ; 0819 1 !R%; 0820 1 ! FUNCTIONAL DESCRIPTION:N ; 0821 1 !;H; 0822 1 ! This routine is called by DRLOG if the FCS subfunction was; 0823 1 ! specified. ; 0824 1 ! ; 0825 1 ! FORMAL PARAMETERS: ; 0826 1 !t; 0827 1 ! dpb_ptrn4; 0828 1 ! Address of the second word of the dpb ; 0829 1 ! ; 0830 1 ! IMPLICIT INPUTS: ; 0831 1 ! ; 0832 1 ! the dpb B; 0833 1 ! The Directive Parameter Block provides all the user*; 0834 1 ! supplied calling parameters ; 0835 1 ! ; 0836 1 ! IMPLICIT OUTPUTS:N ; 0837 1 ! J; 0838 1 ! The directive is performed or an error indicating the reason; 0839 1 ! is returned. ; 0840 1 !; 0841 1 !--M ; 0842 1 ; 0843 2 BEGIN8; 0844 2 ! D; 0845 2 ! The FCS format parse DPB has the following format:; 0846 2 ! word contents ; 0847 2 ! ---- -------- /; 0848 2 ! 0 Directive code, DPB lengtho*; 0849 2 ! 1 Subfunction, Modifier$; 0850 2 ! 2 LUN, Table maskE; 0851 2 ! 3 Address of the primary file specification buffertK; 0852 2 ! 4 Size of the primary file specification buffer in bytes.G; 0853 2 ! 5 Address of the resultant file specification bufferM; 0854 2 ! 6 Size of the resultant file specification buffer in bytesgK; 0855 2 ! 7 Address of a word to receive the resultant string size/; 0856 2 ! 8 Address of the parse block5; 0857 2 ! 9 Size of the parse block in bytes 6; 0858 2 ! 10 Address of the default name block3; 0859 2 ! 11 Size of the default name block ; 0860 2 !eS; 0861 2 ! The basic operation of the FCS and RMS format parseuS; 0862 2 ! subfunctions is the same. The only difference consists ofcS; 0863 2 ! differences in the formats of the input and output parameters.uS; 0864 2 ! Both formats exists in order to minimize the amount of code that G; 0865 2 ! must be added to the RMS and FCS access methods code.h; 0866 2 !k/; 0867 2 ! See $LNRMS for a discription.l; 0868 2 ! ; 0869 2 ! P; 0870 2 ! Define the routine to convert the users default string and put/; 0871 2 ! it into the secondary string. ; 0872 2 !sU; 0873 2 ROUTINE fcs_convert (b_addr, b_len; p) : sec_spec_convert_l NOVALUE =s; 0874 3 BEGINo; 0875 3 MACRO ; 0876 3 ; 0877 3 !L; 0878 3 ! Insert a character into a string. Increment the pointer.; 0879 3 !$; M 0880 3 ch$insert (value) =; M 0881 3 BEGIN ; M 0882 3 p [0] = value;; M 0883 3 p = p [1];; M 0884 3 ENDt; 0885 3 %; ; 0886 3 ; 0887 3 MAP); 0888 3 p : REF VECTOR [ ,BYTE]; ; 0889 3 ; 0890 3 BIND-; 0891 3 name_block = .b_addr : NAM$;e ; 0892 3 ; 0893 3 !/; 0894 3 ! It should be the full name block ; 0895 3 !@; 0896 3 IF .b_len NEQU nam$size*2 THEN ERROR_EXIT (IE_IBS);3; 0897 3 p = secondary [0]; ! Init the pointer ; 0898 3 ; 0899 3 !D; 0900 3 ! Move the device name and unit number into the string.; 0901 3 !+; 0902 3 IF .name_block [N_DVNM] NEQU 0 ; 0903 3 T00juut__DATADATADATADATAHEN ; 0904 4 BEGIN ; 0905 4 ; 0906 4 !; 0907 4 ! Do the name; 0908 4 !N; 0909 4 ch$insert (.(name_block [N_DVNM])<0,8>); ! Get the first charO; 0910 4 ch$insert (.(name_block [N_DVNM])<8,8>); ! Get the second charI ; 0911 4 ; 0912 4 !6; 0913 4 ! Do the unit number zero suppressed.; 0914 4 !O; 0915 4 DCBTA_BLI (.name_block [N_UNIT], .p; p); ! Get the unit number ; 0916 4 ; 0917 4 !(; 0918 4 ! Insert the trailing :; 0919 4 !#; 0920 4 ch$insert (%C':'); ; 0921 3 END; ; 0922 3 ; 0923 3 !.; 0924 3 ! Fill in the file name and type.; 0925 3 !); 0926 3 ! Check for ANSII format FNB8; 0927 3 !%; 0928 3 IF .name_block [NB__ANS] ; 0929 3 THEN ; 0930 4 BEGIN; 0931 4 LOCALG; 0932 4 file_p : REF VECTOR [,BYTE]; ! Pointer to ANSII file spec ; 0933 4 ; 0934 4 !+; 0935 4 ! Process ANSII format FNBs; 0936 4 !); 0937 4 ! Move the file name in.e; 0938 4 !9; 0939 4 ch$insert (%C'"'); ! The opening quoteF ; 0940 4 ; 0941 4 !/; 0942 4 ! Get the first 12 characters.a; 0943 4 !B; 0944 4 file_p = .name_block [N_ANM1]; ! Init the pointer'; 0945 4 DECR i FROM 0 TO 11 DOL$; 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 !-; 0952 4 ! Get the next 6 characters. ; 0953 4 !B; 0954 4 file_p = .name_block [N_ANM2]; ! Init the pointer&; 0955 4 DECR i FROM 0 TO 5 DO$; 0956 4 IF .file_p [.i] NEQU 0; 0957 4 THEN?; 0958 5 ch$insert (.file_p [.i]) ! Move the character ; 0959 4 ELSE; 0960 4 EXITLOOP; :; 0961 4 ch$insert (%C'"'); ! The trailing quote; 0962 4 END; 0963 3 ELSE9; 0964 4 BEGIN; 0965 4 !/; 0966 4 ! Process non ANSII format FNB ; 0967 4 !O; 0968 4 ! Convert the filename from RAD50 and move it into the string.r; 0969 4 !Y; 0970 5 IF (.name_block [N_FNAM] NEQU 0) AND (.(name_block [N_FNAM] + 2) NEQU 0) ; 0971 4 THENp=; 0972 4 RAD50_to_ASCII (9, .p, name_block [N_FNAM]; p); ; 0973 4 /; 0974 4 IF .name_block [N_FTYP] NEQU 0i; 0975 4 THEN ; 0976 5 BEGIN E; 0977 5 ch$insert (%C'.'); ! Insert the . between name and typeP; 0978 5 !fL; 0979 5 ! Convert the filename from RAD50 and move it into the string.; 0980 5 !i=; 0981 5 RAD50_to_ASCII (3, .p, name_block [N_FTYP]; p);e; 0982 4 END;; 0983 3 END;N ; 0984 3 ; 0985 3 !*; 0986 3 ! Fill in the version number.; 0987 3 !+; 0988 3 IF .name_block [N_FVER] NEQU 0 ; 0989 3 THEN ; 0990 4 BEGIN; 0991 4 LOCAL5; 0992 4 t : VECTOR [2], ! Temporary for divider-; 0993 4 temp_digits : VECTOR [6, BYTE],f1; 0994 4 temp_string_p : REF VECTOR [,BYTE],n; 0995 4 base,r; 0996 4 char;i ; 0997 4 <; 0998 4 ch$insert (%C';'); ! Insert the ; to start; 0999 4 !J; 1000 4 ! Convert the number. Put it backwards into temp_string.; 1001 4 !; 1002 4 t [1] = 0;_.; 1003 4 t [0] = .name_block [N_FVER];1; 1004 4 temp_string_p = temp_digits [0];2H; 1005 4 base = (IF (.$FMSK4 AND F4_DVN) NEQU 0 THEN 10 ELSE 8); ; 1006 4 8; 1007 4 IF (.t [0] GTRU 32767) THEN !PKW112!; 1008 5 BEGIN !PKW112 >; 1009 5 ch$insert (%C'-'); !Put in a - sign !PKW112/; 1010 5 t [0] = 0 -.t [0] !PKW1120 ; 1011 4 END; !PKW112; 1012 4 &; 1013 4 DECR i FROM 6 TO 1 DO; 1014 5 BEGIN=; 1015 5 BUILTINt; 1016 5 EDIV;R ; 1017 5 1; 1018 5 EDIV (base, t, t [0], char); !-2 0; 00rutibjbkb a a a 1019 5 temp_string_p [0] = .char + %C'0';0; 1020 5 temp_string_p = temp_string_p [1];; 1021 4 END; !-1 ; 1022 4 T; 1023 4 temp_string_p = temp_string_p [0] - 1; !Back up to last char PKW112!; 1024 4 ! !PKW112.M; 1025 4 ! Remove any leading zeros. (They're trailing zeros !PKW112 /; 1026 4 ! in temp_string) !PKW112=!; 1027 4 ! !PKW112 ; 1028 4 !PKW112A; 1029 4 WHILE .temp_string_p [0] EQLU %C'0' DO !PKW112e>; 1030 4 temp_string_p = temp_string_p [0] - 1; !PKW112 ; 1031 4 ; 1032 4 !I; 1033 4 ! Move the string from temp_string where it is backwardsp@; 1034 4 ! to the secondary string in the correct order.; 1035 4 !D; 1036 4 DECR i FROM temp_string_p [0] TO temp_digits [0] DO; 1037 5 BEGIN $; 1038 5 ch$insert(.(.i)<0,8>);; 1039 4 END;; 1040 3 END; ; 1041 2 END; .NLISTI .LIST BIN,LOC .LIST. .SBTTL FCS.CONVERT FCS Format Parse Directive .NLISTs .ENABL LSB  .LIST FCS.CONVERT: MOV R1,-(SP) ; 0873 MOV R2,-(SP)! MOV R4,-(SP)g MOV R5,-(SP)n SUB #14,SP  MOV R3,R5 ; *,B.ADDR CMP R4,#36 ; B.LEN,* 0896 BEQ 1$ TRAP 247 &1$: MOV #SECONDARY,R4 ; *,P 0897 MOV #32,R0 ; 0902e ADD R5,R0 ; B.ADDR,* TST (R0)  BEQ 2$8! MOVB (R0),(R4)+ ; *,P 09090" MOVB 1(R0),(R4)+ ; *,P 0910& MOV 34(R5),R0 ; *(B.ADDR),* 0915 MOV R4,R3 ; P,*. JSR PC,DCBTA.BLIC MOV R3,R4 MOVB #72,(R4)+ ; *,P 0920,2$: BIT #2000,20(R5) ; *,*(B.ADDR) 0928 BEQ 3$M MOVB #42,(R4)+ ; *,P 0939* MOV 24(R5),R0 ; *(B.ADDR),FILE.P 0954 MOVB #42,(R4)+ ; *,P 0961 BR 5$ ; 09283$: MOV #6,R3 ; 0970  ADD R5,R3 ; B.ADDR,* TST (R3)  BEQ 4$A TST 10(R5) ; *(B.ADDR) BEQ 4$B MOV #11,R1 ; 0972; MOV R4,R2 ; P,*  JSR PC,RAD50.TO.ASCII MOV R2,R44$: MOV #14,R3 ; 0974 ADD R5,R3 ; B.ADDR,* TST (R3)T BEQ 5$M MOVB #56,(R4)+ ; *,P 0977 MOV #3,R1 ; 0981 MOV R4,R2 ; P,*  JSR PC,RAD50.TO.ASCII MOV R2,R4)5$: MOV 16(R5),R0 ; *(B.ADDR),* 0988) BEQ 13$ MOVB #73,(R4)+ ; *,P 0998 CLR 12(SP) ; T+2 1002  MOV R0,10(SP) ; *,T 1003,& MOV #2,R2 ; *,TEMP.STRING.P 1004) ADD SP,R2 ; TEMP.DIGITS,TEMP.STRING.P# BIT $FMSK4,#F4.DVN ; 1005 BEQ 6$ MOV #12,(SP) ; *,BASE BR 7$6$: MOV #10,(SP) ; *,BASE4&7$: CMP 10(SP),#77777 ; T,* 1007 BLOS 8$ MOVB #55,(R4)+ ; *,P 1009 NEG 10(SP) ; T 1010V8$: MOV #6,R3 ; *,I 1013O"9$: MOV 10(SP),R1 ; T,* 1018 MOV 12(SP),R0 ; T,* DIV (SP),R0 ; BASE,* MOV R0,10(SP) ; *,T MOV R1,R5 ; *,CHAR MOV R5,R0 ; CHAR,* 1019 ADD #60,R0#" MOVB R0,(R2)+ ; *,TEMP.STRING.P SOB R3,9$ ; I,* 1013.10$: CMPB -(R2),#60 ; TEMP.STRING.P,* 1029 BEQ 10$ ; 1030 MOV #2,R0 ; 1036 ADD SP,R0 ; TEMP.DIGITS,*0 BR 12$7%11$: MOVB (R2),(R4)+ ; I,P 1038, DEC R2 ; I 1036N12$: CMP R2,R0 ; I,*V BGE 11$ 13$: MOV R4,R3 ; P,* 0873 ADD #14,SP MOV (SP)+,R5M MOV (SP)+,R4; MOV (SP)+,R2, MOV (SP)+,R1 RTS PC08; Routine Size: 130 words, Routine Base: $CODE$ + 0420/; Maximum stack depth per invocation: 14 words. .NLIST .DSABL LSB  .NLIST BIN,LOC0 .LIST; 1042 2 !N; 1043 2 ! Do the parse; 1044 2 ! O; 1045 2 ! FCS handles directory defaulting. This directive should not.P; 1046 2 ! 0; 1047 2 do_directory_defaulting = false;Q; 1048 2 must_have_device = false; ! Don't need explicit device for $PFCSE; 1049 2 cannot_have_node = true; ! FCS don't like them nodes N; 1050 2 common_parse (.dpb_ptr, .header_addr, .tcb_addr, fcs_convert);; 1051 1 END; .NLIST  .LIST BIN,LOC .LIST) .SBTTL $LNFCS FCS Format Parse Directiver .NLIST0 .ENABL LSB .LIST/$LNFCS::CLR DO.DIRECTORY.DEFAULTING ; 100zuut__DATADATADATADATA047 ! CLR MUST.HAVE.DEVICE ; 1048 $ MOV #1,CANNOT.HAVE.NODE ; 1049! MOV #FCS.CONVERT,R0 ; 1050  JSR PC,COMMON.PARSE RTS PC ; 0816c7; Routine Size: 12 words, Routine Base: $CODE$ + 1024u-; Maximum stack depth per invocation: 1 word  .NLISTp .DSABL LSBr .NLIST BIN,LOCt .LIST&; 1052 1 %SBTTL 'Common Parse Code' ; 1053 1 U; 1054 1 ROUTINE common_parse (dpb_ptr, header_addr, tcb_addr, sec_spec_convert) :I(; 1055 1 common_parse_l NOVALUE = ; 1056 1 ; 1057 1 !++C ; 1058 1 !%; 1059 1 ! FUNCTIONAL DESCRIPTION:M ; 1060 1 !,L; 1061 1 ! This routine is called by $LNRMS, $LNFCS, and $LNCHN to do theO; 1062 1 ! parse operation. See those routines for information on the parsen; 1063 1 ! operation. ; 1064 1 !S; 1065 1 !--T; 1066 2 BEGINS; 1067 2 MAPd@; 1068 2 dpb_ptr : REF VECTOR; ! Treat the DPB as a vector ; 1069 2 ; 1070 2 BIND\; 1071 2 dpb_ptr_b = dpb_ptr : REF VECTOR [, BYTE]; ! Treat the DPB as a vector of bytes ; 1072 2 ; 1073 2 LOCALM; 1074 2 status,'; 1075 2 b_len, ! Buffer lengthS); 1076 2 b_addr, ! Buffer address +; 1077 2 b_mapping, ! Buffer mappingf=; 1078 2 pri_logical_type, ! Saved primary logical typeS;; 1079 2 flags_for_user, ! Flags word to be returned,; 1080 2 do_assign_lun, ! Assign flag5; 1081 2 res_length, ! Resultant string lengthE; 1082 2 assign_lun_error, ! Deferred error from LUN assignment 2; 1083 2 ucb, ! Address of the UCB for LUND; 1084 2 merge_directory_flag, ! Merge hierarchial directories3; 1085 2 p : REF VECTOR; ! Temporary pointer7 ; 1086 2 ; 1087 2 LABEL ; 1088 2 process_file_specs,; 1089 2 assign_lun,; 1090 2 merge_directories; ; 1091 2 ; 1092 2 process_file_specs :; 1093 3 BEGIN ; 1094 3 !rP; 1095 3 ! Initialize the logical descriptor block for later logical nameW; 1096 3 ! translations. The length and offset address will be filled in later.0; 1097 3 !o9; 1098 3 init_logical_descriptor [block_type] = 0;:R; 1099 3 init_logical_descriptor [table_number] = .dpb_ptr_b [1]; ! aka modq; 1100 3 init_logical_descriptor [address_base] = .KISAR5; ! Logical names will be in the directive commonca; 1101 3 init_logical_descriptor [matching_tcb_ucb] = .tcb_addr; ! For user table searchescN; 1102 3 saved_inhibit_mask = .dpb_ptr_b [3]; ! Settup the inhibit mask ; 1103 3 G; 1104 3 do_assign_lun = true; ! Init to enable LUN assignment ;; 1105 3 assign_lun_error = 0; ! LUN assignment ok :; 1106 3 merged = work_1 [0]; ! Initialize merged>; 1107 3 primary = work_2 [0]; ! Initialize secondaryE; 1108 3 save_parse (scr_pb); ! Init the scratch parse block E; 1109 3 save_parse (pri_pb); ! Init the primary parse blockt; 1110 3 ! 2; 1111 3 ! Settup the users primary string.; 1112 3 !aE; 1113 3 b_addr = .dpb_ptr [2]; ! Get primary string addressb;; 1114 3 b_len = .dpb_ptr [3]; ! Get string length ; 1115 3 ; 1116 3 IF .b_len NEQU 0; 1117 3 THEN; 1118 4 BEGIN ; 1119 4 ; 1120 4 LOCAL>; 1121 4 trailing_length; ! Returned length from fss ; 1122 4 8; 1123 4 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP); ; 1124 4 D; 1125 4 IF .b_len GTRU file_spec_size THEN ERROR_EXIT (IE_IBS); ; 1126 4 ; 1127 4 !J; 1128 4 ! Address check, relocate, map, copy, compress, upcase, parse-; 1129 4 ! and expand the primary string. ; 1130 4 !Z; 1131 4 IF $ACHRO (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read access ; 1132 4 :; 1133 4 b_addr = $RELOM (.b_addr); ! Map user buffer ; 1134 4 D; 1135 4 primary [0] = %C' '; ! Init it in case string is null<; 1136 4 ch$copy (.b_len, .b_addr, primary [0]; b_addr);H; 1137 4 fss (primary [0], .00utibjbkb a a ab_addr - primary [0];, trailing_length);'; 1138 4 IF .trailing_length NEQU 0m; 1139 4 THENe; 1140 5 BEGINM; 1141 5 save_parse (pri_pb); ! Move scr_pb to primaryeL; 1142 5 pri_pb [fss_status] = bad_char; ! Settup the error codeD; 1143 5 LEAVE process_file_specs; ! And return it; 1144 4 END;' ; 1145 4 ; 1146 4 END; 1147 3 ELSE; 1148 4 BEGIN1; 1149 4 primary [0] = %C' '; ! No filespecr?; 1150 4 fss (primary [0], 1); ! Parse file specification ; 1151 3 END;Q ; 1152 3 ?; 1153 3 save_parse (pri_pb); ! Move scr_pb to primaryp ; 1154 3 \; 1155 3 pri_logical_type = .pri_pb [logical_type]; ! Save the logical type for merge ; 1156 3 o; 1157 3 IF expand_filespec (.dpb_ptr) NEQU success THEN LEAVE process_file_specs; ! Expand any logicals ; 1158 3 A; 1159 3 IF .pri_pb [logical_type] GTRU .pri_logical_type [a; 1160 3 THEN pri_logical_type = .pri_pb [logical_type]; ! Save the logical type for merge ; 1161 3 ; 1162 3 ! 4; 1163 3 ! Settup the users secondary string.; 1164 3 ! U; 1165 3 ! First validate the users buffer. Then call the appropriate routiner,; 1166 3 ! to perform the conversion.; 1167 3 !rG; 1168 3 b_addr = .dpb_ptr [9]; ! Get secondary string address <; 1169 3 b_len = .dpb_ptr [10]; ! Get string length ; 1170 3 ; 1171 3 IF .b_len NEQU 0; 1172 3 THEN; 1173 4 BEGIN ; 1174 4 ; 1175 4 LOCAL>; 1176 4 trailing_length; ! Returned length from fss ; 1177 4 8; 1178 4 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP); ; 1179 4 ; 1180 4 !N; 1181 4 ! Address check, relocate, map, copy, compress, upcase, and parse$; 1182 4 ! the secondary string.; 1183 4 ! ; 1184 4 Z; 1185 4 IF $ACHRO (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read access ; 1186 4 ;; 1187 4 b_addr = $RELOM (.b_addr); ! Map user buffer ; 1188 4 M; 1189 4 sec_spec_convert_l (.sec_spec_convert, .b_addr, .b_len; b_addr);sL; 1190 4 fss (secondary [0], .b_addr - secondary [0];, trailing_length);'; 1191 4 IF .trailing_length NEQU 0A; 1192 4 THENa; 1193 5 BEGIN ; 1194 5 ; 1195 5 !4; 1196 5 ! Settup the bad string for return.; 1197 5 !U; 1198 5 primary = secondary [0]; ! The primary string is returned M; 1199 5 save_parse (pri_pb); ! Move scr_pb to primary1L; 1200 5 pri_pb [fss_status] = bad_char; ! Settup the error codeD; 1201 5 LEAVE process_file_specs; ! And return it; 1202 4 END;a ; 1203 4 ; 1204 4 END; 1205 3 ELSE; 1206 4 BEGIN3; 1207 4 secondary [0] = %C' '; ! No filespechA; 1208 4 fss (secondary [0], 1); ! Parse file specificationa; 1209 3 END; ; 1210 3 !iR; 1211 3 ! If the primary string either before or after expansion containedQ; 1212 3 ! a node or device then don't merge in a node or device from the #; 1213 3 ! secondary string.E; 1214 3 !;?; 1215 3 IF .pri_logical_type GTRU logical_type_filename; 1216 3 THENJ; 1217 3 IF .scr_pb [logical_type] GTRU logical_type_filename !PKW156 ; 1218 3 THEN !PKW156; 1219 4 BEGINPT; 1220 4 scr_pb [flags] = .scr_pb [flags] AND NOT (FS$DEV OR FS$NOD); !JCF400&; 1221 4 scr_pb [node_len] = 0;'; 1222 4 scr_pb [node_addr] = 0; (; 1223 4 scr_pb [device_len] = 0;); 1224 4 scr_pb [device_addr] = 0;e6; 1225 4 scr_pb [logical_type] = 0; !PKW156; 1226 3 END; ; 1227 3 ; 1228 3 !6S; 1229 3 ! Merge the users primary and secondary strings. Expand the result1N; 1230 3 ! if a new logical could be present from the secondary string.; 1231 3 !_G; 1232 3 IF merge () NEQU success THEN LEAVE process_00uut__DATADATADATADATAfile_specs;o ; 1233 3 @; 1234 3 IF .pri_pb [logical_type] GTRU .pri_logical_type; 1235 3 THEN ; 1236 3 V; 1237 3 IF expand_filespec (.dpb_ptr) NEQU success THEN LEAVE process_file_specs; ; 1238 3 N; 1239 3 flags_for_user = .pri_pb [flags]; ! Save flags to be returned ; 1240 3 ; 1241 3 !rQ; 1242 3 ! If there is a node spec we are all done here. Return the parsen/; 1243 3 ! block and string to the user.(; 1244 3 ! L; 1245 3 IF .pri_pb [node_addr] NEQU 0 THEN LEAVE process_file_specs;; 1246 3 !iL; 1247 3 ! If the user did not provide a device apply the appropriate; 1248 3 ! defaults.L; 1249 3 !p/; 1250 3 IF .pri_pb [device_addr] EQLU 0r; 1251 3 THEN; 1252 4 BEGINn; 1253 4 ! D; 1254 4 ! The assign channel directive will not allow deviceE; 1255 4 ! defaulting. The device must be explicitly present.h; 1256 4 ! >; 1257 4 IF .must_have_device THEN ERROR_EXIT (IE_IDU);\; 1258 4 IF (.dpb_ptr [11] AND (FS$NDF OR FS$DEV)) EQLU 0 !Do we want to do defaults?; 1259 4 THEN; 1260 5 BEGIN ; 1261 5 A; 1262 5 KISAR6 = .$SAHDB; ! Make sure task header is mapped H; 1263 5 IF NOT $MPLUN (dpb_ptr_b [2], .header_addr, .tcb_addr; ucb); 1264 5 THENs; 1265 6 BEGIN; 1266 6 !;; 1267 6 ! The device name will be merged in later.y; 1268 6 !A; 1269 6 do_assign_lun = false; ! Don't reassign the LUNE; 1270 6 END; 1271 5 ELSE ; 1272 6 BEGIN; 1273 6 !O; 1274 6 ! The LUN is not assigned, use the string SY: for the default. N; 1275 6 ! Put the default string in the secondary string and parse itN; 1276 6 ! in order to settup the scratch parse block. Next merge theK; 1277 6 ! default string with the primary string. Next expand anye?; 1278 6 ! logical names that may have been introduced.n; 1279 6 !; 1280 6 MACRO ; 1281 6 ; 1282 6 ! I; 1283 6 ! Insert a character into a string. Increment the pointer.L; 1284 6 !d!; M 1285 6 ch$insert (value) =t; M 1286 6 BEGINt&; M 1287 6 dev_ptr [0] = value;(; M 1288 6 dev_ptr = dev_ptr [1];; M 1289 6 ENDc; 1290 6 %; ; 1291 6 ; 1292 6 REGISTERnJ; 1293 6 dev_ptr : REF VECTOR [, BYTE]; ! Pointer into the dev string ; 1294 6 =; 1295 6 dev_ptr = secondary [0]; ! Init the pointerO#; 1296 6 ch$insert (%C'S'); #; 1297 6 ch$insert (%C'Y'); #; 1298 6 ch$insert (%C':'); (; 1299 6 fss (secondary [0], 3);H; 1300 6 IF merge () NEQU success THEN LEAVE process_file_specs;Z; 1301 6 IF expand_filespec (.dpb_ptr) NEQU success THEN LEAVE process_file_specs;; 1302 6 !R; 1303 6 ! If there is a node spec we are all done here. Return the parse0; 1304 6 ! block and string to the user.; 1305 6 !M; 1306 6 IF .pri_pb [node_addr] NEQU 0 THEN LEAVE process_file_specs;e; 1307 5 END; ; 1308 4 END;C; 1309 3 END; ; 1310 3 ! Q; 1311 3 ! Assign the LUN if appropriate. The LUN will not be assigned ifQ; 1312 3 ! the current LUN assignment is being used as the device default._; 1313 3 ! ; 1314 3 assign_lun :; 1315 4 BEGIN ; 1316 4 U; 1317 5 IF .do_assign_lun AND ((.dpb_ptr [11] AND (FS$NDF OR FS$DEV)) EQLU 0) ; 1318 4 THEN; 1319 5 BEGIN; 1320 5 MACRO ; 1321 5 ; 1322 5 !P; 1323 5 ! NEXT_CHAR sets the next character and returns true if success; 1324 5 !; M 1325 5 next_char =; M 1326 5 BEGINi(; M 1327 5 char = .(.unit_ptr)<0, 8>;'; M 1328 5 unit_ptr = .unit_ptr + 1;t; M 1329 5 .char NEQU %C':'; 1330 5 END %; ; 1331 5 ; 1332 5 ROUTINEf; 1333 5 ie_idu_return : return_ie_xxx_l = ERROR_EXIT (IE_00utibjbkb a a aIDU), ! 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) ; 1333 TRAP 244 MOV (SP)+,R0! RTS PC56; Routine Size: 4 words, Routine Base: $CODE$ + 1054.; Maximum stack depth per invocation: 3 words .NLISTt .DSABL LSB  .NLIST BIN,LOC  .LISTf; 1334 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  .LISTIE.ILU.RETURN: MOV R0,-(SP) ; 1334 TRAP 240T MOV (SP)+,R0: RTS PC,6; Routine Size: 4 words, Routine Base: $CODE$ + 1064.; Maximum stack depth per invocation: 3 words .NLIST .DSABL LSBc .NLIST BIN,LOCa .LIST ; 1335 5 ; 1336 5 LOCALI; 1337 5 unit_number, ! Unit number for device to be assigned toEB; 1338 5 unit_ptr, ! Pointer into the unit number string;; 1339 5 char; ! Current character in unit number ; 1340 5 ; 1341 5 !8; 1342 5 ! Check the length. It must be at least 3.; 1343 5 !/; 1344 5 IF .pri_pb [device_len] LSSU 3e; 1345 5 THENi; 1346 6 BEGINnL; 1347 6 assign_lun_error = ie_idu_return; ! The error will be reported.; 1348 6 LEAVE assign_lun; ! at the end; 1349 5 END;; 1350 5 !(; 1351 5 ! Calculate the unit number; 1352 5 !5; 1353 5 unit_number = 0; ! Init the unit number E; 1354 5 unit_ptr = .pri_pb [device_addr] + 2; ! Init the pointer ; 1355 5 ; 1356 5 !$; 1357 5 ! Loop thru the digits.; 1358 5 !; 1359 5 WHILE next_char DOe; 1360 6 BEGIN ; 1361 6 ; 1362 6 !C; 1363 6 ! Check the character. It must be an octal digit. ; 1364 6 !<; 1365 7 IF (.char LSSU %C'0') OR (.char GTRU %C'7'); 1366 6 THENe; 1367 7 BEGIN L; 1368 7 assign_lun_error = ie_idu_return; ! The error will be reported.; 1369 7 LEAVE assign_lun; ! at the end; 1370 6 END; ; 1371 6 Q; 1372 6 unit_number = .unit_number * 8 + (.char - %C'0'); ! Add this onen; 1373 5 END; ; 1374 5 ; 1375 5 !R; 1376 5 ! Give the LUN assignment routine the LUN number, the header address,C; 1377 5 ! the TCB address, the two letters of the device name,h>; 1378 5 ! the unit number, and the terminal logical flag.; 1379 5 !S; 1380 5 ! The routine will assign the LUN if possible and return the directivenR; 1381 5 ! error code if any. Any error will be signaled later, after as muchE; 1382 5 ! information as possible has been returned to the user. ; 1383 5 !K; 1384 5 ! If the terminal logical flag was set by the last expand thennM; 1385 5 ! lun_assign will just look for the device in the system tables.tO; 1386 5 ! If the logical was not terminal then the device translation thatJ; 1387 5 ! is normally done for the assign LUN directive will be done.; 1388 5 !A; 1389 5 KISAR6 = .$SAHDB; ! Make sure task header is mappeda; 1390 5 assign_lun_error =2D; 1391 6 (IF .dpb_ptr_b [2] NEQU 0 ! Defer error for LUN of zero; 1392 6 THEN ,; 1393 6 lun_assign ( dpb_ptr_b [2],; 1394 6 .header_addr, ; 1395 6 .tcb_addr,'; 1396 6 ..pri_pb [device_addr],; 1397 6 .unit_number,a'; 1398 6 .terminal_logical_flag;n; 1399 6 ucb); 1400 6 ELSEo ; 1401 5 ie_ilu_return);; 1402 4 END; "; 1403 3 END; ! assign_lun; 1404 3 !aU; 1405 3 ! At this point the LUN is assigned. Either we are using the current0Q; 1406 3 ! assignment as the device default or the LUN was assigned above.p; 1407 3 !3A; 1408 3 ! The only exception is if the assign LUN failed. ; 1409 3 !aO; 1410 3 ! Here we will generate a device name and unit number and mergeQ; 1411 3 ! it into the primary 00uut__DATADATADATADATAstring. First we will call $MPLND to track2W; 1412 3 ! down an redirections. No point in doing any of this for ACHN becauset,; 1413 3 ! we do not return a string.; 1414 3 !C; 1415 3 IF .must_have_device THEN LEAVE process_file_specs;iZ; 1416 5 IF (.assign_lun_error EQLU 0) AND ((.dpb_ptr [11] AND (FS$NDF OR FS$DEV)) ; 1417 3 EQLU 0) THEN; 1418 4 BEGIN; 1419 4 LOCAL4; 1420 4 dcb, ! Address of the DCB for LUNC; 1421 4 unit_number, ! Unit number for device on this LUN2K; 1422 4 redirected_ucb; ! We need the real UCB and the redirectedA*; 1423 4 ! UCB for spooled devices ; 1424 4 ; 1425 4 REGISTER M; 1426 4 dev_ptr : REF VECTOR [, BYTE]; ! Pointer into the dev string ; 1427 4 ; 1428 4 MACRO ; 1429 4 ; 1430 4 !L; 1431 4 ! Insert a character into a string. Increment the pointer.; 1432 4 !$; M 1433 4 ch$insert (value) =; M 1434 4 BEGIN_"; M 1435 4 dev_ptr [0] = value;$; M 1436 4 dev_ptr = dev_ptr [1];; M 1437 4 ENDh; 1438 4 %; ; 1439 4 9; 1440 4 dev_ptr = secondary [0]; ! Init the pointer ; 1441 4 ; 1442 4 !I; 1443 4 ! Now get the correct UCB address. Follow any redirections, 5; 1444 4 ! and get both UCBs for spooled devices. ; 1445 4 !;; 1446 4 $MPLND (.ucb, .tcb_addr; redirected_ucb, ucb);o ; 1447 4 ; 1448 4 !J; 1449 4 ! While we have the ucb address a check will be made. If theI; 1450 4 ! device is unit record, sequential or single directory thenH; 1451 4 ! directory defaulting will not be done because a directory; 1452 4 ! is not required. ; 1453 4 !T; 1454 4 IF (.(.redirected_ucb + U_CW1) AND (DV_REC OR DV_SDI OR DV_SQD)) NEQU 0; 1455 4 THENs1; 1456 4 do_directory_defaulting = false; ; 1457 4 :; 1458 4 dcb = .(.ucb + U_DCB); ! Get the DCB address ; 1459 4 ; 1460 4 !0; 1461 4 ! Calculate the logical unit number; 1462 4 !i; 1463 5 unit_number = ((.ucb - .(.dcb + D_UCB)) / .(.dcb + D_UCBL)) ! Relative UCB addr / UCB lengthbI; 1464 4 + .(.dcb + D_UNIT) <0,8>; ! Plus lowest unit on this DCB! ; 1465 4 @; 1466 4 ch$insert (%C'_'); ! Terminal logical from the LUNC; 1467 4 ch$insert (.(.dcb + D_NAM)); ! Fill in the device name=-; 1468 4 ch$insert (.(.dcb + D_NAM + 1));c ; 1469 4 ; 1470 4 !D; 1471 4 ! Generate the ASCII device number from the unit number; 1472 4 ! zero suppressed. ; 1473 4 !9; 1474 4 DCBTA_BLI (.unit_number, .dev_ptr; dev_ptr);l ; 1475 4 ; 1476 4 !$; 1477 4 ! Insert the trailing :; 1478 4 !; 1479 4 ch$insert (%C':'); ; 1480 4 ; 1481 4 !:; 1482 4 ! Parse the device spec and merge it into the; 1483 4 ! primary string.; 1484 4 !;; 1485 4 fss (secondary [0], .dev_ptr - secondary [0]); ; 1486 4 ; 1487 4 !I; 1488 4 ! Kill the primary device info so that the new device string !; 1489 4 ! will be merged in.4; 1490 4 !%; 1491 4 pri_pb [device_len] = 0; &; 1492 4 pri_pb [device_addr] = 0;D; 1493 4 IF merge () NEQU success THEN LEAVE process_file_specs;; 1494 3 END;; 1495 3 ! M; 1496 3 ! If the user did not provide a directory or if the directorysN; 1497 3 ! was null apply the appropriate defaults unless the directoryN; 1498 3 ! defaulting flag is set off for the FCS format parse. If theK; 1499 3 ! user provided a directory with a leading . or - then this ?; 1500 3 ! directory will be merged in with the default. ; 1501 3 !L; 1502 4 merge_directory_flag = ((.pri_pb [directory_len] GEQU 3) ANDD; 1503 5 ((.(.pri_pb [directory_addr] + 1)<0,8> EQLU %C'.') ORC; 1504 3 (.(.pri_pb [directory_addr] + 1)<0,8> EQLU %C'-')));a ; 1505 3 0; 1506 3 IF .do_directory_defaulting AND A; 1507 3 ((.dpb_ptr [11] AND (FS$NDF OR FS$DIR)) EQLU 0) AND:00utibjbkb a a a; 1508 4 ((.pri_pb [directory_addr] EQLU 0) OR4; 1509 4 (.pri_pb [directory_len] EQLU 2) OR'; 1510 4 .merge_directory_flag) ; 1511 3 THEN; 1512 4 BEGIN ; 1513 4 ; 1514 4 !H; 1515 4 ! Try to get the default directory string. Put it intoH; 1516 4 ! the secondary string. It will be returned terminated.; 1517 4 ! by a blank. Then parse it.; 1518 4 !; 1519 4 FIELD ; 1520 4 dds_context_f =; 1521 4 SET8>; 1522 4 reference_count= [0, 0, 8, 0], ! Reference countG; 1523 4 dds_length = [0, 8, 8, 0], ! Length of the default stringrH; 1524 4 dds_uic = [1, 0, 16, 0], ! UIC for clock block propagationF; 1525 4 default_string = [2, 0, 16, 0] ! Start of default string; 1526 4 TES; ; 1527 4 ; 1528 4 LITERALG; 1529 4 dds_context_size = 2; ! Size of the fixed part of thee.; 1530 4 ! DDS context block in words ; 1531 4 ; 1532 4 BIND =; 1533 4 dds_context = apr6_v : BLOCK [dds_context_size]!R; 1534 4 FIELD (dds_context_f); ! Default directory context block address ; 1535 4 ; 1536 4 LOCAL>; 1537 4 trailing_length, ! Returned length from fss ; 1538 4 default_length,I; 1539 4 p : REF VECTOR [,BYTE]; ! Pointer into secondary stringL ; 1540 4 ; 1541 4 !R; 1542 4 ! Map the default directory string context block. If there is a taskO; 1543 4 ! context block use that one. If not, use the one hung off of theBP; 1544 4 ! terminal if it is present. If there is neither then return a DDS; 1545 4 ! of blank.; 1546 4 !<; 1547 7 IF (KISAR6 = ( IF (.(.tcb_addr + T_CTX) NEQU 0); 1548 6 THEN'; 1549 7 .(.tcb_addr + T_CTX)9; 1550 6 ELSEOJ; 1551 7 (IF (.(.(.tcb_addr + T_UCB) + U_CW1) AND DV_PSE) EQLU 0; 1552 7 THENf/; 1553 8 .(.(.tcb_addr + T_UCB) + U_CTX) ; 1554 7 ELSEn; 1555 7 0); 1556 6 ); 1557 4 ) NEQU 0 ; 1558 4 ; 1559 4 THENe; 1560 5 BEGIN ; 1561 5 ; 1562 5 !a; 1563 5 ! Here we have the context block mapped. Copy, compress, and upcase the default L; 1564 5 ! directory string. Checking of the string is done by fss.; 1565 5 !<; 1566 5 default_length = .dds_context [dds_length];[; 1567 5 ch$copy (.default_length, dds_context [default_string], secondary [0]; p);; 1568 5 END; 1569 4 ELSE$; 1570 4 default_length = 0; ; 1571 4 ; 1572 4 !(; 1573 4 ! Parse the default string.; 1574 4 !D; 1575 4 fss (secondary [0], .default_length;, trailing_length);'; 1576 4 IF .trailing_length NEQU 0d; 1577 4 THENh; 1578 5 BEGIN ; 1579 5 ; 1580 5 !4; 1581 5 ! Settup the bad string for return.; 1582 5 !J; 1583 5 primary = secondary [0]; ! The primary string is returned>; 1584 5 save_parse (pri_pb); ! Move scr_pb to primaryI; 1585 5 pri_pb [fss_status] = bad_char; ! Settup the error codee:; 1586 5 LEAVE process_file_specs; ! And return it; 1587 4 END;,; 1588 4 !8; 1589 4 ! Is there a valid non null default string?; 1590 4 !4; 1591 4 IF (.scr_pb [directory_addr] EQLU 0) OR1; 1592 4 (.scr_pb [directory_len] EQLU 2) OR I; 1593 5 ((.scr_pb [flags] AND (FS$NAM OR FS$TYP OR FS$VER)) NEQU 0)t; 1594 4 THEN ; 1595 5 BEGIN ; 1596 5 ; 1597 5 !1; 1598 5 ! Generate the UIC format string;; 1599 5 !; 1600 5 MACRO ; 1601 5 ; 1602 5 !dI; 1603 5 ! Insert a character into a string. Increment the pointer. ; 1604 5 !d!; M 1605 5 ch$insert (value) = ; M 1606 5 BEGINe&; M 1607 5 dir_ptr [0] = value;(; M 1608 5 dir_ptr = dir_ptr [1];; M 1609 5 ENDs; 1610 5 %; ; 1611 5 ; 1612 5 LOCALJ; 1613 5 dir_ptr : REF VE00uut__DATADATADATADATACTOR [, BYTE]; ! Pointer into the dir string ; 1614 5 ; 1615 5 BIND;I; 1616 5 uic_group = .header_addr + H_DUIC + 1 : BYTE, ! Default UICd7; 1617 5 uic_owner = .header_addr + H_DUIC : BYTE;e ; 1618 5 F; 1619 5 KISAR6 = .$SAHDB; ! Make sure task header is mapped4; 1620 5 dir_ptr = secondary [0]; ! Init it<; 1621 5 ch$insert (%C'['); ! Put in the opening [ ; 1622 5 ; 1623 5 !M; 1624 5 ! Fill in the group zero suppressed. Include the zero if iti); 1625 5 ! is the only character. ; 1626 5 !+; 1627 5 IF .uic_group <6,2> NEQU 0I; 1628 5 THEN ; 1629 6 BEGINi3; 1630 6 ch$insert (.uic_group <6,2> + %C'0'); 3; 1631 6 ch$insert (.uic_group <3,3> + %C'0');s; 1632 6 END; 1633 5 ELSErS; 1634 5 IF .uic_group <3,3> NEQU 0 THEN ch$insert (.uic_group <3,3> + %C'0');i6; 1635 5 ch$insert (.uic_group <0,3> + %C'0'); ; 1636 5 8; 1637 5 ch$insert (%C','); ! Insert the comma. ; 1638 5 ; 1639 5 !?; 1640 5 ! Fill in the group and owner zero suppressed.I; 1641 5 !+; 1642 5 IF .uic_owner <6,2> NEQU 0i; 1643 5 THEN ; 1644 6 BEGIN 3; 1645 6 ch$insert (.uic_owner <6,2> + %C'0'); 3; 1646 6 ch$insert (.uic_owner <3,3> + %C'0');i; 1647 6 END0; 1648 5 ELSErS; 1649 5 IF .uic_owner <3,3> NEQU 0 THEN ch$insert (.uic_owner <3,3> + %C'0');66; 1650 5 ch$insert (.uic_owner <0,3> + %C'0'); ; 1651 5 ; 1652 5 !?; 1653 5 ! Finish up the directory string and parse it.e; 1654 5 !;; 1655 5 ch$insert (%C']'); ! Put in the trailing ]3 ; 1656 5 ; 1657 5 !A; 1658 5 ! Parse the default UIC format directory string. ; 1659 5 !?; 1660 5 fss (secondary [0], .dir_ptr - secondary [0]);r<; 1661 4 END; ! Create UIC format directory string; 1662 4 !K; 1663 4 ! If the user supplied directory string contains a leading E; 1664 4 ! . or - merge it with the default directory string. ; 1665 4 !); 1666 4 IF .merge_directory_flag]; 1667 4 THENn; 1668 5 BEGIN 3; 1669 5 status = ! Set the status from merget!; 1670 5 merge_directories : ; 1671 6 BEGIN6 ; 1672 6 ; 1673 6 LOCAL_*; 1674 6 bracket : UNSIGNED BYTE,4; 1675 6 default_dir : REF VECTOR [, BYTE],1; 1676 6 user_dir : REF VECTOR [, BYTE];e ; 1677 6 ; 1678 6 ! B; 1679 6 ! The user directory pointer is initialized to pointA; 1680 6 ! to the beginning of the directory string provided]>; 1681 6 ! by the user. The default directory pointer is>; 1682 6 ! initialized to point to the end of the default!; 1683 6 ! directory string. ; 1684 6 !36; 1685 6 user_dir = .pri_pb [directory_addr] + 1;8; 1686 6 default_dir = .scr_pb [trailing_addr] - 2; ; 1687 6 ; 1688 6 !VB; 1689 6 ! Save the trailing bracket from the default string.?; 1690 6 ! This will be used to close the merged directory ; 1691 6 ! string.i; 1692 6 !o<; 1693 6 bracket = .(.scr_pb [trailing_addr] - 1)<0,8>; ; 1694 6 ; 1695 6 !a<; 1696 6 ! Loop thru any '-' requests and backup in the"; 1697 6 ! default directory.; 1698 6 !d/; 1699 6 WHILE .user_dir [0] EQLU %C'-' DO ; 1700 7 BEGINa*; 1701 7 user_dir = user_dir [1]; ; 1702 7 ; 1703 7 !l#; 1704 7 ! '.' is bad here; 1705 7 !w0; 1706 7 IF .default_dir [0] EQLU %C'.'; 1707 7 THENV; 1708 7 LEAVE merge_directories WITH pri_pb [fss_status] = bad_directory;; 1709 7 ! =; 1710 7 ! Backup one level in the default string if !; 1711 7 ! there is one. ; 1712 7 !9; 1713 7 WHILE 1 DO; 1714 8 BEGIN ; 1715 8 ; 1716 8 !5; 1717 8 ! Check for no more00utibjbkb a a a default directory. ; 1718 8 !?; 1719 8 IF default_dir [0] EQLA .scr_pb [directory_addr] ; 1720 8 THEN ; 1721 8 EXITLOOP; ; 1722 8 -; 1723 8 IF .default_dir [0] EQLU %C'.'b; 1724 8 THENi; 1725 9 BEGINF; 1726 9 default_dir = default_dir [-1]; ! Back over the '.'*; 1727 9 EXITLOOP; ! And exit; 1728 9 END; 1729 8 ELSE G; 1730 8 default_dir = default_dir [-1]; ! Backup a characterf ; 1731 8 ; 1732 7 END; ,; 1733 6 END; ! End of hyphen loop ; 1734 6 ; 1735 6 ! #; 1736 6 ! '.' is bad here too ; 1737 6 ! ,; 1738 6 IF .default_dir [0] EQLU %C'.'; 1739 6 THENR; 1740 6 LEAVE merge_directories WITH pri_pb [fss_status] = bad_directory; ; 1741 6 ; 1742 6 ! =; 1743 6 ! Check for remaining default directory string.D; 1744 6 !E>; 1745 6 IF default_dir [0] EQLA .scr_pb [directory_addr]; 1746 6 THEN; 1747 7 BEGINE ; 1748 7 ; 1749 7 ! @; 1750 7 ! Here we are out of default directory string.@; 1751 7 ! Eat a leading '.' in the users string unlessE; 1752 7 ! it is part of '...'. '..' will also be accepted.cC; 1753 7 ! That case will be caught in the access methods.7; 1754 7 ! -; 1755 7 IF .user_dir [0] EQLU %C'.'i; 1756 7 THEN; 1757 8 BEGIN ; 1758 8 ; 1759 8 !%; 1760 8 ! Skip the leading '.' ; 1761 8 !'; 1762 8 user_dir = user_dir [1];0 ; 1763 8 ; 1764 8 !@; 1765 8 ! If the next character is a '.' also then backup2; 1766 8 ! to include the previous dot also.; 1767 8 !*; 1768 8 IF .user_dir [0] EQLU %C'.'; 1769 8 THEN ,; 1770 8 user_dir = user_dir [-1]; ; 1771 8 ;; 1772 7 END; ! End of leading '.' in user directoryH ; 1773 7 ; 1774 7 ! J; 1775 7 ! If the users directory spec is gone too, we must setup2; 1776 7 ! the MFD as the directory spec.; 1777 7 ! _; 1778 8 IF user_dir [0] EQLA (.pri_pb [directory_addr] + .pri_pb [directory_len] - 1) ; 1779 7 THEN; 1780 8 BEGIN:; 1781 8 DECR i FROM 5 TO 0 DO ! Move the MFD name; 1782 9 BEGING; 1783 9 default_dir = default_dir [1]; ! Advance the pointer C; 1784 9 default_dir [0] = %C'0'; ! Insert the character ; 1785 8 END;r; 1786 7 END;o9; 1787 7 END ! End of out of default directoryo; 1788 6 ELSE; 1789 7 BEGIN ; 1790 7 ; 1791 7 !dD; 1792 7 ! Here we have some default directory string left.A; 1793 7 ! Make sure that the users directory spec has avB; 1794 7 ! leading '.' unless it is null. If it does notG; 1795 7 ! then append a '.' at the end of the default string.t; 1796 7 !I_; 1797 8 IF user_dir [0] NEQA (.pri_pb [directory_addr] + .pri_pb [directory_len] - 1)n; 1798 7 THEN*; 1799 7 IF .user_dir [0] NEQU %C'.'; 1800 7 THEN ; 1801 8 BEGINC; 1802 8 default_dir = default_dir [1]; ! Advance pointer ;; 1803 8 default_dir [0] = %C'.'; ! Append the . ; 1804 7 END;e ; 1805 7 =; 1806 6 END; ! End of default directory remaining ; 1807 6 ; 1808 6 ! F; 1809 6 ! Now merge the remaining user string with the remaining); 1810 6 ! default directory string.r; 1811 6 ! a; 1812 6 WHILE user_dir [0] NEQA (.pri_pb [directory_addr] + .pri_pb [directory_len] - 1) DO ; 1813 7 BEGIN 0; 1814 7 default_dir = default_dir [1];2; 1815 7 default_dir [0] = .user_dir [0];*; 1816 7 user_dir = user_dir [1];; 1817 6 END; ; 1818 6 ; 1819 6 !i1; 1820 6 ! Include the closing character and-; 1821 6 ! parse the new default string.r; 1822 6 !i,; 1823 6 defaul00uut__DATADATADATADATAt_dir = default_dir [1];); 1824 6 default_dir [0] = .bracket;sd; 1825 6 fss (secondary [0], default_dir [0] - .scr_pb [directory_addr] + 1; ,trailing_length); ; 1826 6 ; 1827 6 ! A; 1828 6 ! Check the merged directory and return the status.0; 1829 6 ! +; 1830 6 LEAVE merge_directories WITH ,; 1831 6 IF .trailing_length NEQU 0; 1832 6 THEN@; 1833 6 pri_pb [fss_status] = bad_directory ! Error code; 1834 6 ELSE4; 1835 6 success; ! Return the status ; 1836 6 (; 1837 5 END; ! merge_directories ; 1838 5 ; 1839 5 !sC; 1840 5 ! Check the status and return any errors to the user.7; 1841 5 !8%; 1842 5 IF .status NEQU successr; 1843 5 THEN; 1844 6 BEGIN0 ; 1845 6 ; 1846 6 ! 5; 1847 6 ! Settup the bad string for return.2; 1848 6 !8L; 1849 6 primary = secondary [0]; ! The primary string is returned@; 1850 6 save_parse (pri_pb); ! Move scr_pb to primaryH; 1851 6 pri_pb [fss_status] = .status; ! Settup the error code<; 1852 6 LEAVE process_file_specs; ! And return it; 1853 5 END;/; 1854 4 END; ! IF .merge_directory_flag; 1855 4 !G; 1856 4 ! Merge the default directory into the primary string. I; 1857 4 ! First zero the length and address for the directory in :; 1858 4 ! the primary string in case it was null.; 1859 4 !,; 1860 4 pri_pb [directory_len] = 0;-; 1861 4 pri_pb [directory_addr] = 0; ; 1862 4 merge(); ,; 1863 3 END; ! Add default directory; 1864 3 !tK; 1865 3 ! Remove any portions of the resultant string that the user M; 1866 3 ! doesn't want. This functionality is used by RMS-11 if somerH; 1867 3 ! portion of the file spec is provided in the NAM Block.; 1868 3 !8; 1869 4 BEGINy ; 1870 4 ; 1871 4 LOCAL9; 1872 4 do_merge; ; 1873 4 G; 1874 4 secondary [0] = %C' '; ! Set up secondary with a blank8!; 1875 4 do_merge = false;E4; 1876 4 IF (.dpb_ptr [11] AND FS$NOD) NEQU 0; 1877 4 THEN; 1878 5 BEGIN$; 1879 5 pri_pb [node_addr] = 0;#; 1880 5 pri_pb [node_len] = 0;c; 1881 5 do_merge = true;s; 1882 4 END; 4; 1883 4 IF (.dpb_ptr [11] AND FS$DEV) NEQU 0; 1884 4 THEN; 1885 5 BEGIN&; 1886 5 pri_pb [device_addr] = 0;%; 1887 5 pri_pb [device_len] = 0; ; 1888 5 do_merge = true;0; 1889 4 END;p ; 1890 4 R; 1891 4 ! Neither FCS nor RMS likes the underscore returned on the device..; 1892 4 ! If it's there, strip it off.; 1893 4 !9;; 1894 4 IF .(.pri_pb [device_addr])<0,8> EQLU %C'_'=; 1895 4 THEN; 1896 5 BEGIN>; 1897 5 pri_pb [device_addr] = .pri_pb [device_addr] + 1;<; 1898 5 pri_pb [device_len] = .pri_pb [device_len] - 1;; 1899 5 do_merge = true;8; 1900 4 END;c ; 1901 4 4; 1902 4 IF (.dpb_ptr [11] AND FS$DIR) NEQU 0; 1903 4 THEN; 1904 5 BEGIN); 1905 5 pri_pb [directory_addr] = 0;e(; 1906 5 pri_pb [directory_len] = 0;; 1907 5 do_merge = true; ; 1908 4 END; 4; 1909 4 IF (.dpb_ptr [11] AND FS$NAM) NEQU 0; 1910 4 THEN; 1911 5 BEGIN(; 1912 5 pri_pb [filename_addr] = 0;'; 1913 5 pri_pb [filename_len] = 0;_; 1914 5 do_merge = true;;; 1915 4 END;e; 1916 4 !9J; 1917 4 ! Include a . in the primary string if the primary string H; 1918 4 ! does not have a type in it, we are doing defaults, and2; 1919 4 ! directory defaulting is enabled.; 1920 4 ! 4; 1921 4 IF (.dpb_ptr [11] AND FS$TYP) NEQU 0; 1922 4 THEN; 1923 5 BEGIN$; 1924 5 pri_pb [type_addr] = 0;#; 1925 5 pri_pb [type_len] = 0; ; 1926 5 do_merge = true;n; 1927 5 END; 1928 4 ELSEN; 1929 4 IF .do_directory_defaulting AND (.dpb00utibjbkb a a a_ptr [11] AND FS$NDF) EQLU 0; 1930 4 THEN ; 1931 5 BEGINB; 1932 5 secondary [0] = %C'.'; ! Include the "." for RMS!; 1933 5 do_merge = true;e; 1934 4 END; ; 1935 4 4; 1936 4 IF (.dpb_ptr [11] AND FS$VER) NEQU 0; 1937 4 THEN; 1938 5 BEGIN'; 1939 5 pri_pb [version_addr] = 0;&; 1940 5 pri_pb [version_len] = 0;; 1941 5 do_merge = true; ; 1942 4 END; !; 1943 4 IF .do_merge THENd; 1944 5 BEGIN@; 1945 5 fss (secondary [0], 1); ! Parse file specification,; 1946 5 merge (); ! And do the merge; 1947 4 END;c; 1948 3 END;,; 1949 2 END; ! process_file_specs; 1950 2 !9H; 1951 2 ! Return the expanded string and the primary parse block3; 1952 2 ! with the saved flags to the user.r; 1953 2 ! ; 1954 2 !vL; 1955 2 ! First return the strings length if the buffer is provided.R; 1956 2 ! Don't do any of this for ACHN, because we don't return a string. ; 1957 2 (; 1958 2 IF NOT .must_have_device; 1959 2 THEN; 1960 3 BEGIND; 1961 3 b_addr = .dpb_ptr [6]; ! Get resultant length address@; 1962 3 IF .pri_pb [trailing_addr] NEQU 0 ! Get the length; 1963 3 THENo\; 1964 3 res_length = .pri_pb [trailing_addr] - primary [0] + .pri_pb [trailing_len]; 1965 3 ELSE ; 1966 3 res_length = 0; ; 1967 3 ; 1968 3 IF .b_addr NEQU 0; 1969 3 THENs; 1970 4 BEGIN_; 1971 4 IF $ACHKB (.b_addr, 2) THEN ERROR_EXIT (IE_ADP); ! Check for read/write accessN:; 1972 4 p = $RELOM (.b_addr); ! Map user buffer9; 1973 4 .p = .res_length; ! Fill in the lengtha; 1974 3 END; ; 1975 3 ; 1976 3 !N; 1977 3 ! RMS requires that the version number delimiter be a ; and not aO; 1978 3 ! . in the resultant string. It uses this for some later parsing.9; 1979 3 !X; 1980 3 IF .pri_pb [version_len] NEQU 0 THEN (.pri_pb [version_addr])<0,8> = %C';'; ; 1981 3 ; 1982 3 !=; 1983 3 ! Then return as much of the string as possible,p; 1984 3 !=; 1985 3 b_addr = .dpb_ptr [4]; ! Get resultant address!;; 1986 3 b_len = .dpb_ptr [5]; ! Get resultant length9C; 1987 3 $RELOC (.b_addr; b_mapping, p); ! Relocte user buffereh; 1988 3 convert_parse (pri_pb, primary [0], .b_addr); ! Convert parse block addresses to user mode ; 1989 3 ; 1990 3 IF .b_len NEQU 0l; 1991 3 THENr; 1992 4 BEGIN ; 1993 4 <; 1994 4 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP); ; 1995 4 ; 1996 4 !<; 1997 4 ! Address check the user buffer. Then copy the(; 1998 4 ! resultant string into it.; 1999 4 !d; 2000 4 IF $ACHKB (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read/write access ; 2001 4 v; 2002 4 IF .res_length NEQU 0 THEN $BLXIO (MINU (.res_length, .b_len), .kisar5, primary [0], .b_mapping, .p); ; 2003 4 ; 2004 4 ! Move it ; 2005 3 END; ; 2006 3 !ID; 2007 3 ! Now return as much of the parse block as possible,; 2008 3 !AK; 2009 3 pri_pb [flags] = .flags_for_user; ! Save flags to be returned t; 2010 4 IF .cannot_have_node AND (.pri_pb [node_addr] NEQU 0) ! If a node is illegal, put status in parse block8; 2011 3 THEN pri_pb [fss_status] = bad_logical;?; 2012 3 b_addr = .dpb_ptr [7]; ! Get parse block address]=; 2013 3 b_len = .dpb_ptr [8]; ! Get parse block length ; 2014 3 ; 2015 3 IF .b_len NEQU 00; 2016 3 THENu; 2017 4 BEGIN ; 2018 4 <; 2019 4 IF .b_addr EQLU 0 THEN ERROR_EXIT (IE_ADP); ; 2020 4 ; 2021 4 !I; 2022 4 ! Address check and relocate the user buffer. Then copy the #; 2023 4 ! parse block into it. ; 2024 4 !d; 2025 4 IF $ACHKB (.b_addr, .b_len) THEN ERROR_EXIT (IE_ADP); ! Check for read/write access ; 2026 4 K; 2027 4 $RELOC (.b_addr; b_mapping, b_addr)00uut__DATADATADATADATA; ! Relocte user buffer0l; 2028 4 $BLXIO (MINU (parse_block_size*2, .b_len), .kisar5, pri_pb, .b_mapping, .b_addr); ! Move it; 2029 3 END;T; 2030 2 END;A; 2031 2 !Y; 2032 2 ! The LUN assignment may have returned an error. If it did the signalingU; 2033 2 ! of that error was deferred so that more information about the errord0; 2034 2 ! could be returned to the user.; 2035 2 ! 6; 2036 2 ! If there was an error signal it now.; 2037 2 ! U; 2038 2 IF .assign_lun_error NEQU 0 THEN return_ie_xxx_l (.assign_lun_error);pN; 2039 2 IF .pri_pb [fss_status] NEQU success THEN ERROR_EXIT (IE_LNF); ; 2040 2 ; 2041 2 RETURN;h; 2042 1 END; .NLISTn .LIST BIN,LOC .LISTDDS.CONTEXT= -40000 & .SBTTL COMMON.PARSE Common Parse Code .NLISTt .ENABL LSB  .LIST COMMON.PARSE:  JSR R1,$SAVE5 ; 1054e SUB #24,SP  MOV R0,20(SP) MOV R5,12(SP) MOV R4,10(SP) MOV R3,14(SP)* CLRB INIT.LOGICAL.DESCRIPTOR+7 ; 1098 MOV R3,R0 ; 1099% MOVB 1(R0),INIT.LOGICAL.DESCRIPTOR+6/ MOV KISAR5,INIT.LOGICAL.DESCRIPTOR+2; 1100e- MOV R5,INIT.LOGICAL.DESCRIPTOR+10 ; 1101 ) MOVB 3(R0),SAVED.INHIBIT.MASK ; 1102 CLRB SAVED.INHIBIT.MASK+1) MOV #1,16(SP) ; *,DO.ASSIGN.LUN 1104T& CLR 6(SP) ; ASSIGN.LUN.ERRO 1105 MOV #WORK.1,MERGED ; 1106! MOV #WORK.2,PRIMARY ; 1107e MOV #SCR.PB,R1 ; 1108 JSR PC,SAVE.PARSE MOV #PRI.PB,R1 ; 1109 JSR PC,SAVE.PARSE MOV 14(SP),R0 ; 1113R MOV 4(R0),4(SP) ; *,B.ADDR,$ MOV 6(R0),2(SP) ; *,B.LEN 1114 BEQ 4$ ; 1116O TST 4(SP) ; B.ADDR 1123 BNE 1$R TRAP 236 &1$: CMP 2(SP),#377 ; B.LEN,* 1125 BLOS 2$ TRAP 247A%2$: MOV 4(SP),R0 ; B.ADDR,* 1131* MOV 2(SP),R1 ; B.LEN,*R JSR PC,$ACHRO BHIS 3$ TRAP 236M%3$: MOV 4(SP),R0 ; B.ADDR,* 1133O JSR PC,$RELOM MOV R0,4(SP) ; *,B.ADDR MOVB #40,@PRIMARY ; 1135! MOV 2(SP),R1 ; B.LEN,* 1136P MOV R0,R2 ; B.ADDR,* MOV PRIMARY,R3 JSR PC,CH$COPY MOV R3,4(SP)M MOV R3,R0 ; B.ADDR,* 1137 SUB PRIMARY,R0  MOV PRIMARY,R4) MOV R0,R5 JSR PC,FSSE# TST R5 ; TRAILING.LENGTH 1138  BEQ 5$* JMP 38$ ; 1141"4$: MOVB #40,@PRIMARY ; 1149 MOV PRIMARY,R4 ; 1150 MOV #1,R5 JSR PC,FSS5$: MOV #PRI.PB,R1 ; 1153P JSR PC,SAVE.PARSE' CLR 22(SP) ; PRI.LOGICAL.TYP 1155 + MOVB PRI.PB+44,22(SP) ; *,PRI.LOGICAL.TYPM MOV 14(SP),R3 ; 11573 JSR PC,EXPAND.FILESPECR CMP R0,#1 BNE 13$ CLR R0 ; 1159R BISB PRI.PB+44,R0$ CMP R0,22(SP) ; *,PRI.LOGICAL.TYP BLOS 6$' CLR 22(SP) ; PRI.LOGICAL.TYP 1160T+ MOVB PRI.PB+44,22(SP) ; *,PRI.LOGICAL.TYPJ6$: MOV 14(SP),R0 ; 1168 MOV 22(R0),4(SP) ; *,B.ADDR% MOV 24(R0),2(SP) ; *,B.LEN 1169R BEQ 9$ ; 1171P TST 4(SP) ; B.ADDR 1178 BNE 7$C TRAP 236 %7$: MOV 4(SP),R0 ; B.ADDR,* 1185B MOV 2(SP),R1 ; B.LEN,*. JSR PC,$ACHRO BHIS 8$ TRAP 236J%8$: MOV 4(SP),R0 ; B.ADDR,* 1187E JSR PC,$RELOM MOV R0,4(SP) ; *,B.ADDR MOV R0,R3 ; B.ADDR,* 1189 MOV 2(SP),R4 ; B.LEN,*( JSR PC,@20(SP)C MOV R3,4(SP) MOV R3,R0 ; B.ADDR,* 1190 SUB #SECONDARY,R0 MOV #SECONDARY,R4 MOV R0,R5 JSR PC,FSS # TST R5 ; TRAILING.LENGTH 1191E BEQ 10$ JMP 37$ ; 1198#9$: MOVB #40,SECONDARY ; 1207E MOV #SECONDARY,R4 ; 12080 MOV #1,R5 JSR PC,FSSM/10$: CMP 22(SP),#1 ; PRI.LOGICAL.TYP,* 1215$ BLOS 11$J CMPB SCR.PB+44,#1 ; 1217 BLOS 11$R BIC #600,SCR.PB+2 ; 1220. CLR SCR.PB+4 ; 1221 CLR SCR.PB+6 ; 1222 CLR SCR.PB+10 ; 1223 CLR SCR.PB+12 ; 1224  CLRB SCR.PB+44 ; 122511$: JSR PC,MERGE ; 1232 CMP R0,#1 BNE 16$ CLR R0 ; 1234. BISB PRI.PB+44,R0$ CMP R0,22(SP) ; *,PRI.LOGICAL.TYP BLOS 12$A MOV 14(SP),R3 ; 1237D JSR PC,EXPAND.FILESPECV CMP R0,#1 BNE 16$412$: MOV PRI.PB+2,22(SP) ; *,FLAGS.FOR.USER 123900utibjbkb a a a TST PRI.PB+6 ; 1245 13$: BNE 16$ TST PRI.PB+12 ; 12502 BNE 17$$ BIT #1,MUST.HAVE.DEVICE ; 1257 BEQ 14$ TRAP 244214$: MOV 14(SP),R0 ; 1258C BIT #10200,26(R0) BNE 17$ MOV $SAHDB,KISAR6 ; 1262J MOV R0,R3 ; 1263 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 1269 BR 17$ ; 1263C,15$: MOV #SECONDARY,R0 ; *,DEV.PTR 1295& MOVB #123,(R0)+ ; *,DEV.PTR 1296& MOVB #131,(R0)+ ; *,DEV.PTR 1297% MOVB #72,(R0)+ ; *,DEV.PTR 1298U MOV #SECONDARY,R4 ; 12991 MOV #3,R5 JSR PC,FSS1 JSR PC,MERGE ; 1300 CMP R0,#1 BNE 16$ MOV 14(SP),R3 ; 1301  JSR PC,EXPAND.FILESPEC CMP R0,#1 BNE 16$ TST PRI.PB+6 ; 1306 16$: BEQ 17$ JMP 73$-17$: BIT #1,16(SP) ; *,DO.ASSIGN.LUN 1317R BEQ 23$ MOV 14(SP),R0 BIT #10200,26(R0) BNE 23$ CMP PRI.PB+10,#3 ; 1344 BLO 19$ ; 1347 CLR R1 ; UNIT.NUMBER 1353( MOV PRI.PB+12,R2 ; *,UNIT.PTR 1354 ADD #2,R2 ; *,UNIT.PTR18$: CLR R3 ; CHAR 1359 BISB (R2)+,R3 ; UNIT.PTR,CHAR CMP R3,#72 ; CHAR,*  BEQ 21$ CMP R3,#60 ; CHAR,* 1365  BLO 19$ CMP R3,#67 ; CHAR,*E BLOS 20$,919$: MOV #IE.IDU.RETURN,6(SP) ; *,ASSIGN.LUN.ERRO 1368P BR 23$ ; 1367))20$: MOV R1,R0 ; UNIT.NUMBER,* 1372V ASH #3,R0 ADD R3,R0 ; CHAR,* MOV R0,R1 ; *,UNIT.NUMBER  SUB #60,R1 ; *,UNIT.NUMBER BR 18$ ; 1359 #21$: MOV $SAHDB,KISAR6 ; 1389P MOV #2,R0 ; 1391 ADD 14(SP),R0 MOV R0,R3 TSTB (R3) BEQ 22$ MOV 10(SP),R4 ; 1393 MOV 12(SP),R5 MOV @PRI.PB+12,R0 MOV TERMINAL.LOGICAL.FLAG,R2  JSR PC,LUN.ASSIGN# MOV R0,6(SP) ; *,ASSIGN.LUN.ERROV MOV R1,20(SP) BR 23$ ; 1391R222$: MOV #IE.ILU.RETURN,6(SP) ; *,ASSIGN.LUN.ERRO(23$: BIT #1,MUST.HAVE.DEVICE ; 1415 BEQ 24$ JMP 89$*24$: TST 6(SP) ; ASSIGN.LUN.ERRO 1416 BNE 26$ MOV 14(SP),R0 BIT #10200,26(R0) BNE 26$( MOV #SECONDARY,R3 ; *,DEV.PTR 1440! MOV 20(SP),R0 ; UCB,* 1446, MOV 12(SP),R5 JSR PC,$MPLND MOV R2,20(SP) MOV #DV.REC,R1 ; 1454 BIS #DV.SDI,R1V BIS #DV.SQD,R1.) BIT U.CW1(R0),R1 ; *(REDIRECTED.UCB),*  BEQ 25$( CLR DO.DIRECTORY.DEFAULTING ; 1456%25$: MOV 20(SP),R0 ; UCB,* 1458P MOV U.DCB(R0),R2 ; *(UCB),DCB& SUB D.UCB(R2),R0 ; *(DCB),* 1463 MOV R0,R1 SXT R06 DIV D.UCBL(R2),R0 ; *(DCB),* CLR R1 ; 14640 BISB D.UNIT(R2),R1 ; *(DCB),* ADD R1,R0& MOVB #137,(R3)+ ; *,DEV.PTR 1466/ MOVB D.NAM(R2),(R3)+ ; *(DCB),DEV.PTR 1467M0 MOVB D.NAM+1(R2),(R3)+ ; *(DCB),DEV.PTR 1468 JSR PC,DCBTA.BLI ; 1474% MOVB #72,(R3)+ ; *,DEV.PTR 1479D SUB #SECONDARY,R3 ; 1485T MOV #SECONDARY,R4 MOV R3,R5 JSR PC,FSS0 CLR PRI.PB+10 ; 1491D CLR PRI.PB+12 ; 1492B JSR PC,MERGE ; 1493 CMP R0,#1 BNE 39$26$: CLR R3 ; 1502  CMP PRI.PB+14,#3R BLO 27$ INC R3B"27$: MOV PRI.PB+16,R0 ; 1503 CLR R2M CMPB 1(R0),#56; BNE 28$ INC R228$: CLR R1 ; 1504( CMPB 1(R0),#556 BNE 29$ INC R1229$: BIS R2,R1 ; 1503+ MOV R1,16(SP) ; *,MERGE.DIRECTORY 1502, MOV R3,R0 COM R0 $ BIC R0,16(SP) ; *,MERGE.DIRECTORY* BIT #1,DO.DIRECTORY.DEFAULTING ; 1506 BEQ 30$ MOV 14(SP),R0 ; 1507R BIT #10100,26(R0) BEQ 31$ 30$: JMP 63$31$: TST PRI.PB+16 ; 15086 BEQ 32$ CMP PRI.PB+14,#2 ; 1509 BEQ 32$+ BIT #1,16(SP) ; *,MERGE.DIRECTORY 15105 BEQ 30$32$: MOV 12(SP),R1 ; 1547I MOV T.CTX(R1),R0  BNE 34$ MOV T.UCB(R1),R0 ; 1551 BIT U.CW1(R0),#DV.PSE BNE 33$ MOV U.CTX(R0),R0S BR 34$M 33$: CLR R0Y34$: MOV R0,KISAR6 ; 1547B BEQ 35$ ; 1557" CLR R5 ; DEFAULT.LENGTH 1566& BISB @#140001,R5 ; *,DEFAULT.LENGTH' MOV R5,R1 ; DEFAULT.LENGTH,* 1567B MOV #-37774,R26 MOV #SECONDARY,R3 JSR PC,CH$COPY BR 36$ ; 15474&35$: CLR R5 ; DEFAULT.LENGTH 1570#3600uut__DATADATADATADATA$: MOV #SECONDARY,R4 ; 1575Q JSR PC,FSSV MOV R5,20(SP) BEQ 40$ ; 1576'37$: MOV #SECONDARY,PRIMARY ; 1583 38$: MOV #PRI.PB,R1 ; 1584 JSR PC,SAVE.PARSE MOV #-3440,PRI.PB ; 1585:39$: JMP 73$ ; 157840$: TST SCR.PB+16 ; 1591  BEQ 41$ CMP SCR.PB+14,#2 ; 1592 BEQ 41$ BIT #7,SCR.PB+2 ; 1593  BEQ 48$"41$: MOV #H.DUIC+1,R1 ; 1616 ADD 10(SP),R1 MOV R1,R0 MOV #H.DUIC,R2 ; 1617 ADD 10(SP),R2 MOV R2,R1 MOV $SAHDB,KISAR6 ; 1619,( MOV #SECONDARY,R5 ; *,DIR.PTR 1620& MOVB #133,(R5)+ ; *,DIR.PTR 1621 BITB #300,(R0) ; 1627 BEQ 42$ MOVB (R0),R2 ; 1630R ASH #-6,R2E BIC #177774,R2. ADD #60,R28 MOVB R2,(R5)+ ; *,DIR.PTR BR 43$ ; 1631;42$: BITB #70,(R0) ; 1634+ BEQ 44$43$: MOVB (R0),R2 ASH #-3,R2B BIC #177770,R2 ADD #60,R2: MOVB R2,(R5)+ ; *,DIR.PTR44$: MOVB (R0),R2 ; 1635V BIC #177770,R2 ADD #60,R21 MOVB R2,(R5)+ ; *,DIR.PTR% MOVB #54,(R5)+ ; *,DIR.PTR 1637R BITB #300,(R1) ; 1642 BEQ 45$ MOVB (R1),R0 ; 1645B ASH #-6,R0  BIC #177774,R0Q ADD #60,R0R MOVB R0,(R5)+ ; *,DIR.PTR BR 46$ ; 164645$: BITB #70,(R1) ; 1649* BEQ 47$46$: MOVB (R1),R03 ASH #-3,R0  BIC #177770,R01 ADD #60,R0$ MOVB R0,(R5)+ ; *,DIR.PTR47$: MOVB (R1),R0 ; 1650R BIC #177770,R0+ ADD #60,R0R MOVB R0,(R5)+ ; *,DIR.PTR& MOVB #135,(R5)+ ; *,DIR.PTR 1655 SUB #SECONDARY,R5 ; 1660  MOV #SECONDARY,R4 JSR PC,FSS/48$: BIT #1,16(SP) ; *,MERGE.DIRECTORY 1666) BEQ 62$( MOV PRI.PB+16,R2 ; *,USER.DIR 1685 INC R2 ; USER.DIR(+ MOV SCR.PB+36,R5 ; *,DEFAULT.DIR 16865 SUB #2,R5 ; *,DEFAULT.DIR MOV SCR.PB+36,R1 ; 1693 MOVB -1(R1),R0 ; *,BRACKETA MOV SCR.PB+16,R4 ; 1719)49$: CMPB (R2),#55 ; USER.DIR,* 1699 BNE 52$ INC R2 ; USER.DIR 1701(( CMPB (R5),#56 ; DEFAULT.DIR,* 1706 BEQ 59$ ; 1708)50$: CMP R5,R4 ; DEFAULT.DIR,* 1719, BEQ 49$ ; 1721( CMPB (R5),#56 ; DEFAULT.DIR,* 1723 BNE 51$ DEC R5 ; DEFAULT.DIR 1726 BR 49$ ; 1725U$51$: DEC R5 ; DEFAULT.DIR 1730 BR 50$ ; 1713#,52$: CMPB (R5),#56 ; DEFAULT.DIR,* 1738 BEQ 59$ ; 1740 MOV PRI.PB+16,R1 ; 1778 ADD PRI.PB+14,R1 DEC R1 % CMP R5,R4 ; DEFAULT.DIR,* 17455 BNE 55$% CMPB (R2),#56 ; USER.DIR,* 17556 BNE 53$ INC R2 ; USER.DIR 1762 % CMPB (R2),#56 ; USER.DIR,* 1768I BNE 53$ DEC R2 ; USER.DIR 1770P&53$: CMP R2,R1 ; USER.DIR,* 1778 BNE 57$ MOV #6,R3 ; *,I 1781$54$: INC R5 ; DEFAULT.DIR 1783( MOVB #60,(R5) ; *,DEFAULT.DIR 1784 SOB R3,54$ ; I,* 1781D BR 56$ ; 1745B&55$: CMP R2,R1 ; USER.DIR,* 1797 BEQ 58$% CMPB (R2),#56 ; USER.DIR,* 1799R BEQ 56$ INC R5 ; DEFAULT.DIR 1802( MOVB #56,(R5) ; *,DEFAULT.DIR 1803&56$: CMP R2,R1 ; USER.DIR,* 1812 BEQ 58$$57$: INC R5 ; DEFAULT.DIR 18140 MOVB (R2)+,(R5) ; USER.DIR,DEFAULT.DIR 1815 BR 56$ ; 1812$58$: INC R5 ; DEFAULT.DIR 1823- MOVB R0,(R5) ; BRACKET,DEFAULT.DIR 18246 SUB R4,R5 ; 1825 INC R5S MOV #SECONDARY,R4 JSR PC,FSS  MOV R5,20(SP) BEQ 60$ ; 183159$: MOV #-720,R3 ; 1833 MOV R3,PRI.PB BR 61$ ; 1831B60$: MOV #1,R3$61$: CMP R3,#1 ; STATUS,* 1842 BEQ 62$# MOV #SECONDARY,PRIMARY ; 1849  MOV #PRI.PB,R1 ; 1850 JSR PC,SAVE.PARSE# MOV R3,PRI.PB ; STATUS,* 1851  BR 73$ ; 1844 62$: CLR PRI.PB+14 ; 18608 CLR PRI.PB+16 ; 1861  JSR PC,MERGE ; 1862$63$: MOVB #40,SECONDARY ; 1874 CLR R0 ; DO.MERGE 1875E MOV 14(SP),R2 ; 1876V MOV 26(R2),R1 BIT #400,R1 BEQ 64$ CLR PRI.PB+6 ; 1879 CLR PRI.PB+4 ; 1880" MOV #1,R0 ; *,DO.MERGE 188164$: TSTB R1 ; 1883 BPL 65$ CLR PRI.PB+12 ; 1886  CLR PRI.PB+10 ; 1887 " MOV #1,R0 ; *,DO.MERGE00utibjbkb a a a 1888&65$: CMPB @PRI.PB+12,#137 ; 1894 BNE 66$ INC PRI.PB+12 ; 1897  DEC PRI.PB+10 ; 1898 " MOV #1,R0 ; *,DO.MERGE 189966$: BIT #100,R1 ; 1902 BEQ 67$ CLR PRI.PB+16 ; 1905 CLR PRI.PB+14 ; 1906" MOV #1,R0 ; *,DO.MERGE 190767$: BIT #4,R1 ; 1909 BEQ 68$ CLR PRI.PB+22 ; 19120 CLR PRI.PB+20 ; 1913:" MOV #1,R0 ; *,DO.MERGE 191468$: BIT #2,R1 ; 1921 BEQ 69$ CLR PRI.PB+26 ; 1924  CLR PRI.PB+24 ; 1925C BR 70$ ; 1926 .69$: BIT #1,DO.DIRECTORY.DEFAULTING ; 1929 BEQ 71$ BIT #10000,R1 BNE 71$ MOVB #56,SECONDARY ; 1932&70$: MOV #1,R0 ; *,DO.MERGE 193371$: ROR R1 ; 1936 BCC 72$ CLR PRI.PB+32 ; 1939, CLR PRI.PB+30 ; 19407" MOV #1,R0 ; *,DO.MERGE 1941!72$: ROR R0 ; DO.MERGE 1943R BCC 73$ MOV #SECONDARY,R4 ; 1945, MOV #1,R5 JSR PC,FSST JSR PC,MERGE ; 1946(73$: BIT #1,MUST.HAVE.DEVICE ; 1958 BEQ 74$ JMP 89$74$: MOV 14(SP),R0 ; 1961T MOV 14(R0),4(SP) ; *,B.ADDR MOV PRI.PB+36,R0 ; 1962 BEQ 75$ SUB PRIMARY,R0 ; 1964 ADD PRI.PB+34,R00 MOV R0,R3 ; *,RES.LENGTH BR 76$ ; 1962#75$: CLR R3 ; RES.LENGTH 1966,"76$: TST 4(SP) ; B.ADDR 1968 BEQ 78$" MOV 4(SP),R0 ; B.ADDR,* 1971 MOV #2,R1 JSR PC,$ACHKB BHIS 77$E TRAP 236 &77$: MOV 4(SP),R0 ; B.ADDR,* 1972 JSR PC,$RELOM MOV R0,R4 ; *,P#& MOV R3,(R4) ; RES.LENGTH,P 197378$: TST PRI.PB+30 ; 1980; BEQ 79$ MOVB #73,@PRI.PB+3279$: MOV 14(SP),R0 ; 1985  MOV 10(R0),4(SP) ; *,B.ADDR% MOV 12(R0),2(SP) ; *,B.LEN 1986M" MOV 4(SP),R0 ; B.ADDR,* 1987 JSR PC,$RELOC MOV R1,R5 MOV R2,R4 MOV #PRI.PB,-(SP) ; 1988  MOV PRIMARY,-(SP) MOV 10(SP),-(SP) ; B.ADDR,* JSR PC,CONVERT.PARSEJ TST 10(SP) ; B.LEN 19903 BEQ 83$ TST 12(SP) ; B.ADDR 1994 BNE 80$ TRAP 236R'80$: MOV 12(SP),R0 ; B.ADDR,* 2000G MOV 10(SP),R1 ; B.LEN,* JSR PC,$ACHKB BHIS 81$$ TRAP 236,#81$: TST R3 ; RES.LENGTH 2002  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,* 2009$ BIT #1,CANNOT.HAVE.NODE ; 2010 BEQ 84$ TST PRI.PB+6 BEQ 84$ MOV #-270,PRI.PB ; 201184$: MOV 22(SP),R0 ; 2012  MOV 16(R0),12(SP) ; *,B.ADDR,& MOV 20(R0),10(SP) ; *,B.LEN 2013 BEQ 88$ ; 2015 TST 12(SP) ; B.ADDR 2019Q BNE 85$ TRAP 236 '85$: MOV 12(SP),R0 ; B.ADDR,* 2025 MOV 10(SP),R1 ; B.LEN,* JSR PC,$ACHKB BHIS 86$, TRAP 236I'86$: MOV 12(SP),R0 ; B.ADDR,* 2027J JSR PC,$RELOC MOV R1,R5 MOV R2,12(SP)" MOV 10(SP),R0 ; B.LEN,* 2028 CMP R0,#46 BLOS 87$ MOV #46,R0T87$: 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 ; 1960*89$: TST 6(SP) ; ASSIGN.LUN.ERRO 2038 BEQ 90$$ JSR PC,@6(SP) ; *,ASSIGN.LUN.ERRO90$: CMP PRI.PB,#1 ; 2039D BEQ 91$ TRAP 353(91$: ADD #24,SP ; 1054H RTS PC 9; Routine Size: 1014 words, Routine Base: $CODE$ + 1074J/; Maximum stack depth per invocation: 21 words( .NLIST; .DSABL LSB0 .NLIST BIN,LOC .LIST.; 2043 1 %SBTTL 'Expand file specification'; 2044 1 GLOBAL_FOR_DEBUGC; 2045 1 ROUTINE expand_filespec (dpb_ptr) : expand_filespec_l = ; 2046 1 ; 2047 1 !++S ; 2048 1 ! %; 2049 1 ! FUNCTIONAL DESCRIPTION:S ; 2050 1 !0I; 2051 1 ! This routine expands a file specification by merging in the H; 2052 1 ! translations of any logicals present in the initial input.J; 2053 1 ! The string must be in the primary buffer. It must be parsedN; 2054 1 ! already. The output is in the primary buffer and in the primary; 2055 1 ! parse block. ; 2056 1 ! .; 2057 1 ! The following algo00uut__DATADATADATADATArithm is used:; 2058 1 ! O; 2059 1 ! 1) Separate a potential logical from the string, and put it in a SK; 2060 1 ! buffer. If there is no potential logical, return success.mU; 2061 1 ! The primary buffer and parse block will always contain file elements.5; 2062 1 ! that we know are not to be expanded.r ; 2063 1 !a7; 2064 1 ! 2) Repeat until we run out of iterations:y ; 2065 1 !t'; 2066 1 ! 2.1) Expand the logical U; 2067 1 ! 2.2) If a logical was found, copy the expand buffer to the secondary M; 2068 1 ! buffer. If not, copy the unexpanded logical to the secondary.0D; 2069 1 ! Set the terminal logical flag if status was terminal.); 2070 1 ! 2.3) Parse the secondary.sS; 2071 1 ! 2.4) If the status of the expand was success, separate the logicalb<; 2072 1 ! from the rest of the string in the secondary.T; 2073 1 ! 2.5) If there is anything in the secondary buffer, merge it with the; 2074 1 ! primary.oS; 2075 1 ! 2.6) If the status of both the expand and the separate was success,f2; 2076 1 ! go again; otherwise return success. ; 2077 1 ! M; 2078 1 ! 3.0) If we got here, too many iterations, return bad recursive.r; 2079 1 ! ; 2080 1 ! ; 2081 1 ! IMPLICIT INPUTS: ; 2082 1 !,R; 2083 1 ! The file specification parsed in the primary buffer and parse block. ; 2084 1 ! +; 2085 1 ! The translation inhibit mask.b ; 2086 1 ! ; 2087 1 !--4 ; 2088 1 ; 2089 2 BEGIN ; 2090 2 ; 2091 2 MAPeB; 2092 2 dpb_ptr : REF VECTOR; ! Treat the DPB as a vector ; 2093 2 ; 2094 2 LOCAL .; 2095 2 eqv_ptr : REF VECTOR [, BYTE],; 2096 2 eqv_len,; 2097 2 status, ; 2098 2 mstatus; ; 2099 2 ; 2100 2 OWN28; 2101 2 log_hold : VECTOR [ logical_size, BYTE],; 2102 2 log_len; ; 2103 2 T; 2104 2 ROUTINE separate_logical ( dpb_ptr, parse_block ) : separate_logical_l = ; 2105 2 ; 2106 2 !++E ; 2107 2 ! %; 2108 2 ! FUNCTIONAL DESCRIPTION:p ; 2109 2 !TP; 2110 2 ! This routine strips off the element of the string that could be a M; 2111 2 ! logical and puts it in a special buffer to be used for logical tS; 2112 2 ! expansion. It takes the parse block of the string to be processed asoQ; 2113 2 ! input. It returns success if an element has been removed from the 4F; 2114 2 ! string, and failure if the string has not been modified. ; 2115 2 ! ; 2116 2 !--+ ; 2117 2 ; 2118 3 BEGINC ; 2119 3 ; 2120 3 MAPT;; 2121 3 parse_block : REF BLOCK FIELD (parse_block_f),rC; 2122 3 dpb_ptr : REF VECTOR; ! Treat the DPB as a vectorb ; 2123 3 W; 2124 3 ! Strip off the logical and put it in log_hold, with the length in log_len.p ; 2125 3 _; 2126 3 CASE .parse_block [logical_type] from logical_type_none TO logical_type_node OF ; 2127 3 SET ; 2128 3 "; 2129 3 [logical_type_node] :5; 2130 3 IF (.dpb_ptr [11] AND FS$NOD) EQLU 0E; 2131 3 THEN ; 2132 4 BEGIN ; 2133 4 !oE; 2134 4 ! A node specification is present - it may be a logicalV; 2135 4 !ha; 2136 4 ch$copy (.parse_block [node_len], .parse_block [node_addr], log_hold [0]; log_len);t*; 2137 4 parse_block [node_addr] = 0;); 2138 4 parse_block [node_len] = 0;f,; 2139 4 parse_block [access_addr] = 0;+; 2140 4 parse_block [access_len] = 0; P; 2141 4 parse_block [flags] = .parse_block [flags] AND NOT FS$NOD; !PKW117; 2142 4 END ; 2143 3 ELSE; 2144 3 RETURN error; ; 2145 3 $; 2146 3 [logical_type_device] :5; 2147 3 IF (.dpb_ptr [11] AND FS$DEV) EQLU 0_; 2148 3 THENe; 2149 4 BEGINo; 2150 4 !eG; 2151 4 ! A device specification is present - it may be a logicalc; 2152 4 !fe; 2153 4 ch$copy (.parse_block [device_len], .parse_block [device_addr], log_hold [0]; log_len); ,; 2154 4 parse_block [device_00utibjbkb a a aaddr] = 0;+; 2155 4 parse_block [device_len] = 0;H; 2156 4 parse_block [flags] = .parse_block [flags] AND NOT FS$DEV;; 2157 4 ENDe; 2158 3 ELSE ; 2159 3 RETURN error;$ ; 2160 3 &; 2161 3 [logical_type_filename] :5; 2162 3 IF (.dpb_ptr [11] AND FS$NAM) EQLU 0i; 2163 3 THENm; 2164 4 BEGIN ; 2165 4 ! T; 2166 4 ! A standalone filename specification is present - it may be a logical; 2167 4 ! i; 2168 4 ch$copy (.parse_block [filename_len], .parse_block [filename_addr], log_hold [0]; log_len);_.; 2169 4 parse_block [filename_addr] = 0;-; 2170 4 parse_block [filename_len] = 0; T; 2171 4 parse_block [flags] = .parse_block [flags] AND NOT (FS$NAM OR FS$WNA);; 2172 4 END ; 2173 3 ELSEA; 2174 3 RETURN error;T ; 2175 3 "; 2176 3 [logical_type_none] :; 2177 3 RETURN error;; 2178 3 TES;p ; 2179 3 /; 2180 3 log_len = .log_len - log_hold [0];h; 2181 3 RETURN success; ; 2182 3 0; 2183 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 ; 2104  CLR R0 ; 2126n$ BISB 44(R4),R0 ; *(PARSE.BLOCK),* ASL R08# ADD P.AAA(R0),PC ; Case dispatch ,2$: BIT #400,26(R3) ; *,*(DPB.PTR) 2130 BNE 6$R) MOV 4(R4),R1 ; *(PARSE.BLOCK),* 2136N" MOV 6(R4),R2 ; *(PARSE.BLOCK),* MOV #LOG.HOLD,R3C JSR PC,CH$COPYS MOV R3,LOG.LEN% CLR 6(R4) ; *(PARSE.BLOCK) 2137:% CLR 4(R4) ; *(PARSE.BLOCK) 2138E& CLR 42(R4) ; *(PARSE.BLOCK) 2139& CLR 40(R4) ; *(PARSE.BLOCK) 2140+ BIC #400,2(R4) ; *,*(PARSE.BLOCK) 21412 BR 5$ ; 2130'3$: TSTB 26(R3) ; *(DPB.PTR) 2147) BMI 6$R* MOV 10(R4),R1 ; *(PARSE.BLOCK),* 2153# MOV 12(R4),R2 ; *(PARSE.BLOCK),*  MOV #LOG.HOLD,R3V JSR PC,CH$COPYA MOV R3,LOG.LEN3& CLR 12(R4) ; *(PARSE.BLOCK) 2154& CLR 10(R4) ; *(PARSE.BLOCK) 2155+ BIC #200,2(R4) ; *,*(PARSE.BLOCK) 2156) BR 5$ ; 2147*4$: BIT #4,26(R3) ; *,*(DPB.PTR) 2162 BNE 6$B* MOV 20(R4),R1 ; *(PARSE.BLOCK),* 2168# MOV 22(R4),R2 ; *(PARSE.BLOCK),*S MOV #LOG.HOLD,R3B JSR PC,CH$COPY0 MOV R3,LOG.LEN & CLR 22(R4) ; *(PARSE.BLOCK) 2169& CLR 20(R4) ; *(PARSE.BLOCK) 2170* BIC #44,2(R4) ; *,*(PARSE.BLOCK) 2171%5$: SUB #LOG.HOLD,LOG.LEN ; 2180, MOV #1,R0 ; 2118 RTS PCB6$: CLR R0 ; 2104 RTS PCR7; Routine Size: 84 words, Routine Base: $CODE$ + 50505.; Maximum stack depth per invocation: 5 words .PSECT $PLIT$, RO , D 6P.AAA: ; CASE Table for SEPARATE.LOGICA+0014 21261$: .WORD 224 ; [6$]M .WORD 136 ; [4$] .WORD 64 ; [3$], .WORD 0 ; [2$] .NLISTR .DSABL LSB1 .NLIST BIN,LOC  .LIST ; 2184 2 K; 2185 2 terminal_logical_flag = false; ! Init the flag to not terminal2h; 2186 2 status = separate_logical ( .dpb_ptr, pri_pb ); ! Strip off the logical in the initial input(; 2187 2 IF .status EQLU success THEN ; 2188 2 ! Q; 2189 2 ! For no more than the maximum interation count, translate and merge,r; 2190 2 ! if possible ; 2191 2 ! ; 2192 3 BEGIN61; 2193 3 DECR i FROM iteration_max TO 1 DO]; 2194 4 BEGINSI; 2195 4 ! I assume that the status returned will be success, error,l4; 2196 4 ! or the successful status of terminal; 2197 4 !sS; 2198 4 status = find_equivalence (log_hold [0], .log_len; eqv_ptr, eqv_len); (; 2199 4 IF .status EQLU error THENJ; 2200 4 ch$copy (.log_len, log_hold [0], secondary [0]; eqv_ptr); 2201 4 ELSE; 2202 5 BEGINlG; 2203 5 ch$copy (.eqv_len, .eqv_ptr, secondary [0]; eqv_ptr);t/; 2204 5 IF .status EQLU terminal THEN5,; 2205 5 terminal_logical_flag = true;; 2206 4 END;N; 00uut__DATADATADATADATA2207 4 fss (secondary [0], .eqv_ptr - secondary [0]; eqv_ptr, eqv_len); ; 2208 4 IF .eqv_len NEQU 0; 2209 4 THEN; 2210 5 BEGIN ; 2211 5 ; 2212 5 !N5; 2213 5 ! Settup the bad string for return.c; 2214 5 !; 2215 5 merge();Q; 2216 5 RETURN pri_pb [fss_status] = bad_char; ! Settup the error code_; 2217 5 ; 2218 4 END;*; 2219 4 IF .status EQLU success THENA; 2220 4 status = separate_logical ( .dpb_ptr, scr_pb );yu; 2221 4 IF (.scr_pb [node_len] NEQU 0) OR (.scr_pb [device_len] NEQU 0) OR (.scr_pb [directory_len] NEQU 0) OR u; 2222 4 (.scr_pb [filename_len] NEQU 0) OR (.scr_pb [type_len] NEQU 0) OR (.scr_pb [version_len] NEQU 0) OR V; 2223 4 (.scr_pb [trailing_len] NEQU 0) OR (.scr_pb [access_len] NEQU 0) THEN; 2224 5 BEGINd!; 2225 5 mstatus = merge(); S; 2226 5 IF .mstatus NEQU success THEN RETURN pri_pb [fss_status] = .mstatus;p; 2227 4 END;:; 2228 4 IF .status NEQU success THEN RETURN success;; 2229 3 END; ; 2230 3 ! V; 2231 3 ! If we got here, then the number of iterations exceeded iteration_max; 2232 3 !0O; 2233 3 RETURN pri_pb [fss_status] = bad_recursive; ! Return error code]; 2234 3 END[; 2235 2 ELSE; 2236 2 RETURN success;; 2237 1 END; .NLISTr .LIST BIN,LOC .LIST1 .SBTTL EXPAND.FILESPEC Expand file specifications .PSECT $CODE$, RO  .NLIST .ENABL LSB8 .LISTEXPAND.FILESPEC: JSR R1,$SAVE5 ; 2045 SUB #14,SPE MOV R3,12(SP)& CLR TERMINAL.LOGICAL.FLAG ; 2185 MOV #PRI.PB,R4 ; 2186 JSR PC,SEPARATE.LOGICAL MOV R0,10(SP) ; *,STATUS3 CMP R0,#1 ; STATUS,* 2187 BNE 9$c MOV #12,6(SP) ; *,I 2193 !1$: MOV #LOG.HOLD,R1 ; 2198 MOV LOG.LEN,R2E JSR PC,FIND.EQUIVALENCE MOV R0,10(SP) ; *,STATUSL MOV R1,2(SP). MOV R2,(SP) TST R0 ; STATUS 2199t BNE 2$S MOV LOG.LEN,R1 ; 2200 MOV #LOG.HOLD,R2T MOV #SECONDARY,R3 JSR PC,CH$COPY; MOV R3,2(SP)B BR 3$ ; 2199&2$: MOV (SP),R1 ; EQV.LEN,* 2203 MOV 2(SP),R2 ; EQV.PTR,*1 MOV #SECONDARY,R3 JSR PC,CH$COPY, MOV R3,2(SP)A# CMP 10(SP),#3 ; STATUS,* 22047 BNE 3$c( MOV #1,TERMINAL.LOGICAL.FLAG ; 2205&3$: MOV 2(SP),R1 ; EQV.PTR,* 2207 SUB #SECONDARY,R1 MOV #SECONDARY,R4 MOV R1,R5 JSR PC,FSSM MOV R4,2(SP)M MOV R5,(SP) BEQ 4$ ; 22089 JSR PC,MERGE ; 2215 MOV #-3440,R0 ; 2216D BR 8$&4$: CMP 10(SP),#1 ; STATUS,* 2219 BNE 5$B MOV 12(SP),R3 ; 2220O MOV #SCR.PB,R4V JSR PC,SEPARATE.LOGICAL MOV R0,10(SP) ; *,STATUSO5$: TST SCR.PB+4 ; 2221V BNE 6$A TST SCR.PB+10 BNE 6$U TST SCR.PB+14 BNE 6$M TST SCR.PB+20 ; 2222  BNE 6$ TST SCR.PB+24 BNE 6$P TST SCR.PB+30 BNE 6$D TST SCR.PB+34 ; 2223M BNE 6$ TST SCR.PB+40 BEQ 7$P6$: JSR PC,MERGE ; 2225  MOV R0,4(SP) ; *,MSTATUS ! CMP R0,#1 ; MSTATUS,* 2226D BNE 8$&7$: CMP 10(SP),#1 ; STATUS,* 2228 BNE 9$ DEC 6(SP) ; I 2193 BNE 1$C MOV #-3230,R0 ; 2233G8$: MOV R0,PRI.PB) BR 10$ ; 2236 9$: MOV #1,R0 10$: ADD #14,SP ; 20450 RTS PCU8; Routine Size: 138 words, Routine Base: $CODE$ + 5320/; Maximum stack depth per invocation: 13 words .NLIST .DSABL LSB4 .NLIST BIN,LOCB .LIST ; 2238 1 Q.; 2240 1 %SBTTL 'Merge file specifications'; 2241 1 GLOBAL_FOR_DEBUG; 2242 1 ROUTINE merge =E ; 2243 1 ; 2244 1 !++T ; 2245 1 !B%; 2246 1 ! FUNCTIONAL DESCRIPTION:E ; 2247 1 !3L; 2248 1 ! Merge the primary and secondary file specifications. For eachN; 2249 1 ! component of the file specification, copy the piece found in theL; 2250 1 ! primary if present, or copy the piece from the secondary. TheL; 2251 1 ! result is put in merged. At the end the primary string is theE; 2252 1 ! merged result and the primary parse block is f00vtibjbkb a a ailled in.2 ; 2253 1 !eM; 2254 1 ! The handling of a file specification containing a quoted stringLP; 2255 1 ! is slightly different. A quoted string name in the primary stringS; 2256 1 ! inhibits the inclusion of both the filename and type, and the versionh(; 2257 1 ! if a node name is present. ; 2258 1 !r; 2259 1 ! IMPLICIT INPUTS: ; 2260 1 !2'; 2261 1 ! Buffers and parse blocks.e ; 2262 1 !s; 2263 1 ! IMPLICIT OUTPUTS:d ; 2264 1 ! 1; 2265 1 ! The primary parse block is updated. ; 2266 1 !h; 2267 1 !--i ; 2268 1 ; 2269 2 BEGINt ; 2270 2 ; 2271 2 !sR; 2272 2 ! A node spec followed by a quoted string with nothing else should notT; 2273 2 ! have anything merged into it other than a node name on the local node. ; 2274 2 !so; 2275 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; 2276 3 (FS$NOD OR FS$QUO OR FS$NAM OR FS$TYP)) ; 2277 3 ; 2278 2 OR ; 2279 2 ; 2280 2 !2N; 2281 2 ! If the primary string has has anything other than a node and theN; 2282 2 ! secondary string is a node name followed by a quoted string thenN; 2283 2 ! everything in the secondary string except for the node should be; 2284 2 ! gotten rid of. ; 2285 2 !5 ; 2286 2 c; 2287 2 ((.pri_pb [flags] AND (FS$DIR OR FS$NAM OR FS$TYP OR FS$VER OR FS$QUO)) NEQU 0) AND m; 2288 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; 2289 3 (FS$NOD OR FS$QUO OR FS$NAM OR FS$TYP)); 2290 2 THEN; 2291 3 BEGINd); 2292 3 scr_pb [device_addr] = 0;t(; 2293 3 scr_pb [device_len] = 0;,; 2294 3 scr_pb [directory_addr] = 0;+; 2295 3 scr_pb [directory_len] = 0;5+; 2296 3 scr_pb [filename_addr] = 0;p*; 2297 3 scr_pb [filename_len] = 0;'; 2298 3 scr_pb [type_addr] = 0;8&; 2299 3 scr_pb [type_len] = 0;*; 2300 3 scr_pb [version_addr] = 0;); 2301 3 scr_pb [version_len] = 0;D@; 2302 3 IF .scr_pb [logical_type] NEQU logical_type_node; 2303 3 THEN7; 2304 3 scr_pb [logical_type] = logical_type_none;e; 2305 2 END; ; 2306 2 ; 2307 2 !dP; 2308 2 ! Copy the lengths and pointers into the primary parse block for allS; 2309 2 ! parts of the file specification to be used. In the process, form thebP; 2310 2 ! updated status mask. We are only going to set bits in the status. ; 2311 2 ! (; 2312 2 IF .pri_pb [node_len] EQLU 0; 2313 2 THEN ; 2314 2 B; 2315 2 IF (pri_pb [node_len] = .scr_pb [node_len]) NEQU 0; 2316 2 THEN; 2317 3 BEGIN8; 2318 3 pri_pb [flags] = .pri_pb [flags] OR FS$NOD;6; 2319 3 pri_pb [node_addr] = .scr_pb [node_addr];8; 2320 3 pri_pb [access_len] = .scr_pb [access_len];:; 2321 3 pri_pb [access_addr] = .scr_pb [access_addr];; 2322 2 END;e ; 2323 2 *; 2324 2 IF .pri_pb [device_len] EQLU 0; 2325 2 THEN ; 2326 2 F; 2327 2 IF (pri_pb [device_len] = .scr_pb [device_len]) NEQU 0; 2328 2 THEN; 2329 3 BEGIN8; 2330 3 pri_pb [flags] = .pri_pb [flags] OR FS$DEV;:; 2331 3 pri_pb [device_addr] = .scr_pb [device_addr];; 2332 2 END;n ; 2333 2 -; 2334 2 IF .pri_pb [directory_len] EQLU 0_; 2335 2 THEN ; 2336 2 L; 2337 2 IF (pri_pb [directory_len] = .scr_pb [directory_len]) NEQU 0; 2338 2 THEN; 2339 3 BEGINZ; 2340 3 pri_pb [flags] = .pri_pb [flags] OR (.scr_pb [flags] AND (FS$DIR OR FS$WDI));@; 2341 3 pri_pb [directory_addr] = .scr_pb [directory_addr];; 2342 2 END;i ; 2343 2 G; 2344 2 IF ((.pri_pb [flags] OR .scr_pb [flags]) AND FS$QUO) EQLU 0d; 2345 2 THEN; 2346 3 BEGIN3 ; 2347 3 ; 2348 3 !e?; 2349 3 ! Here because neither string contains a quoted C; 2350 3 ! filespec. Handle the filename, type, and version3#; 2351 3 ! in the usual way. ; 2352 00 vvt__DATADATADATADATA3 !f0; 2353 3 IF .pri_pb [filename_len] EQLU 0; 2354 3 THEN ; 2355 3 G; 2356 3 IF (pri_pb [filename_len] = .scr_pb [filename_len]) NEQU 0 ; 2357 3 THEN ; 2358 4 BEGIN^; 2359 4 pri_pb [flags] = .pri_pb [flags] OR (.scr_pb [flags] AND (FS$NAM OR FS$WNA));B; 2360 4 pri_pb [filename_addr] = .scr_pb [filename_addr];; 2361 3 END;3 ; 2362 3 ,; 2363 3 IF .pri_pb [type_len] EQLU 0; 2364 3 THEN ; 2365 3 ?; 2366 3 IF (pri_pb [type_len] = .scr_pb [type_len]) NEQU 0n; 2367 3 THEN ; 2368 4 BEGIN^; 2369 4 pri_pb [flags] = .pri_pb [flags] OR (.scr_pb [flags] AND (FS$TYP OR FS$WTY));:; 2370 4 pri_pb [type_addr] = .scr_pb [type_addr];; 2371 3 END;p ; 2372 3 /; 2373 3 IF .pri_pb [version_len] EQLU 0l; 2374 3 THEN ; 2375 3 E; 2376 3 IF (pri_pb [version_len] = .scr_pb [version_len]) NEQU 0y; 2377 3 THEN ; 2378 4 BEGIN^; 2379 4 pri_pb [flags] = .pri_pb [flags] OR (.scr_pb [flags] AND (FS$VER OR FS$WVE));@; 2380 4 pri_pb [version_addr] = .scr_pb [version_addr];; 2381 3 END;s ; 2382 3 ; 2383 3 END0; 2384 2 ELSE; 2385 3 BEGINp ; 2386 3 ; 2387 3 !S; 2388 3 ! We are here because one or the other (or both) of the primary andP; 2389 3 ! secondary strings contain a quoted file specification. If theS; 2390 3 ! primary string contains either a filename or type then don't copyiA; 2391 3 ! either the filename or type from the secondary. R; 2392 3 ! If addition, if the primary includes a node name and the primaryX; 2393 3 ! has a filename, then don't copy the version number from the secondary.; 2394 3 ! N; 2395 3 IF .pri_pb [filename_len] EQLU 0 AND .pri_pb [type_len] EQLU 0; 2396 3 THEN; 2397 4 BEGIN ; 2398 4 ; 2399 4 !E; 2400 4 ! We are here because the primary string has no filenamemF; 2401 4 ! or type and the secondary string has a quoted filename.E; 2402 4 ! In this case the merged string will contain the quotedn+; 2403 4 ! filespec from the secondary. ; 2404 4 !L; 2405 4 pri_pb [flags] = .pri_pb [flags] OR FS$NAM OR FS$QUO OR FS$TYP;<; 2406 4 pri_pb [filename_len] = .scr_pb [filename_len];>; 2407 4 pri_pb [filename_addr] = .scr_pb [filename_addr];; 2408 3 END; ; 2409 3 ; 2410 3 ! K; 2411 3 ! If the primary string has no version the version from thetE; 2412 3 ! secondary string will be merged in if there is one. ; 2413 3 !iM; 2414 3 IF .pri_pb [node_len] EQLU 0 AND .pri_pb [version_len] EQLU 0 ; 2415 3 THENE; 2416 3 IF (pri_pb [version_len] = .scr_pb [version_len]) NEQU 0 ; 2417 3 THEN_; 2418 4 BEGIN^; 2419 4 pri_pb [flags] = .pri_pb [flags] OR (.scr_pb [flags] AND (FS$VER OR FS$WVE));@; 2420 4 pri_pb [version_addr] = .scr_pb [version_addr];; 2421 3 END;v ; 2422 3 ; 2423 2 END; ; 2424 2 ; 2425 3 BEGINn ; 2426 3 ; 2427 3 ! @; 2428 3 ! Copy each of the substrings into the output bufferA; 2429 3 ! and update the pointers to point to the new buffer.p ; 2430 3 ! ; 2431 3 LOCALlI; 2432 3 pri_pb_p : REF VECTOR, ! Pointer to primary parse blockp*; 2433 3 status, ! Merge status; 2434 3 current_len,; 2435 3 total_len,; 2436 3 temp;b ; 2437 3 ; 2438 3 REGISTER; 2439 3 o_ptr; ; 2440 3 ; 2441 3 total_len = 0;; 2442 3 status = 1; &; 2443 3 pri_pb [trailing_len] = 0;'; 2444 3 pri_pb [trailing_addr] = 0; +; 2445 3 pri_pb_p = pri_pb [fss_status];t; 2446 3 o_ptr = merged [0]; ; 2447 3 ); 2448 3 INCRU i FROM 0 TO 5*2 BY 2 DOO; 2449 4 BEGINrB; 2450 4 current_len = .pri_pb_p [.i + 2]; ! Get the length6; 2451 4 total_len = .total_len + .current_len; ; 2452 4 1; 2453 4 IF .total_len GTRU00vtibjbkb a a a file_spec_size ; 2454 4 THEN; 2455 5 BEGIN ; 2456 5 ; 2457 5 !G; 2458 5 ! Copy as much as will fit, then update the parse block toiH; 2459 5 ! reflect the actual amount returned. I'm not sure if thisB; 2460 5 ! exactly the best way of dealing with the problem...;; 2461 5 ! How do you determine the real length needed?eC; 2462 5 ! Here's how.... We will initialize the length of the G; 2463 5 ! trailing string to 0 and on completion store the addressTB; 2464 5 ! of the next character following. This will make itC; 2465 5 ! easy to determine the length of the expanded string; G; 2466 5 ! just subtract the buffer beginning from [trailing_addr].rE; 2467 5 ! For the cases where the buffer overflows, we'll updateiB; 2468 5 ! the length to include the amount that wouldn't fit.; 2469 5 !c; 2470 5 pri_pb [trailing_addr] = merged [0] + file_spec_size; ! Get address of one past bufferg_; 2471 5 pri_pb [trailing_len] = .total_len - file_spec_size; ! Set to the amount attempted ; 2472 5 a; 2473 5 IF (current_len = .current_len - .pri_pb [trailing_len]) LSS 0 THEN current_len = 0;t ; 2474 5 (; 2475 5 ! Can't be less than 07; 2476 5 status = bad_size; ! Set eventual statusi; 2477 4 END;e ; 2478 4 ; 2479 5 BEGINu ; 2480 5 ; 2481 5 LOCAL ; 2482 5 i_ptr;d ; 2483 5 B; 2484 5 i_ptr = .pri_pb_p [.i + 2 + 1]; ! Get the addressZ; 2485 5 IF .i_ptr NEQA 0 THEN pri_pb_p [.i + 2 + 1] = .o_ptr; ! Update the addressG; 2486 5 ch$move (.current_len, i_ptr, o_ptr); ! Move the stringe; 2487 4 END; ; 2488 4 ; 2489 3 END; ! INCR ; 2490 3 ; 2491 3 !6Q; 2492 3 ! If the trailing length is non zero leave the trailing address aloneT; 2493 3 ! because it has been settup by an overflow condition. Otherwise settup#; 2494 3 ! the trailing address.p ; 2495 3 ! c; 2496 3 IF .pri_pb [trailing_len] EQLU 0 THEN pri_pb [trailing_addr] = merged [0] + .total_len;a ; 2497 3 ; 2498 3 ! ;; 2499 3 ! Settup the access control string information. ; 2500 3 !N*; 2501 3 IF .pri_pb [access_len] NEQU 0; 2502 3 THENk; 2503 3 pri_pb [access_addr] = .pri_pb [node_addr] + .pri_pb [node_len] - .pri_pb [access_len] - 2;3 ; 2504 3 ; 2505 3 !tC; 2506 3 ! Update the logical type. Make it the max of the two.i ; 2507 3 !Z; 2508 3 pri_pb [logical_type] = maxu (.pri_pb [logical_type], .scr_pb [logical_type]);*; 2509 3 pri_pb [fss_status] = .status;E; 2510 3 temp = merged [0]; ! Switch primary and merged buffers !; 2511 3 merged = primary [0];r; 2512 3 primary = .temp;; 2513 3 RETURN .status; ; 2514 2 END;; 2515 1 END; .NLIST. .LIST BIN,LOC .LIST' .SBTTL MERGE Merge file specifications5 .NLIST .ENABL LSB  .LIST!MERGE: JSR R1,$SAVE5 ; 2242f CMP -(SP),-(SP) MOV PRI.PB+2,R0 ; 2275o BIC #175070,R0u CMP R0,#2406c BEQ 1$ BIT #2107,PRI.PB+2 ; 2287 BEQ 2$b MOV SCR.PB+2,R0 ; 22885 BIC #175070,R0e CMP R0,#2406t BNE 2$y1$: CLR SCR.PB+12 ; 2292 CLR SCR.PB+10 ; 2293  CLR SCR.PB+16 ; 2294  CLR SCR.PB+14 ; 2295  CLR SCR.PB+22 ; 2296; CLR SCR.PB+20 ; 2297. CLR SCR.PB+26 ; 2298i CLR SCR.PB+24 ; 2299 CLR SCR.PB+32 ; 2300J CLR SCR.PB+30 ; 2301C CMPB SCR.PB+44,#3 ; 2302  BEQ 2$7 CLRB SCR.PB+44 ; 23042$: TST PRI.PB+4 ; 2312I BNE 3$ " MOV SCR.PB+4,PRI.PB+4 ; 2315 BEQ 3$2 BIS #400,PRI.PB+2 ; 23182" MOV SCR.PB+6,PRI.PB+6 ; 2319$ MOV SCR.PB+40,PRI.PB+40 ; 2320$ MOV SCR.PB+42,PRI.PB+42 ; 23213$: TST PRI.PB+10 ; 2324 BNE 4$ $ MOV SCR.PB+10,PRI.PB+10 ; 2327 BEQ 4$R BIS #200,PRI.PB+2 ; 2330R$ MOV SCR.PB+12,PRI.PB+12 ; 23314$: TST PRI.PB+14 ; 2334 BNE 5$C$ MOV SCR.PB+14,PRI.PB+14 ; 2337 BEQ 5$C MOV SCR.PB+2,R0 ; 2340  BIC #1700vvt__DATADATADATADATA6677,R0  BIS R0,PRI.PB+2$ MOV SCR.PB+16,PRI.PB+16 ; 2341!5$: MOV PRI.PB+20,R0 ; 2353  MOV PRI.PB+2,R1 ; 2344  BIS SCR.PB+2,R1 BIT #2000,R1+ BNE 7$  TST R0 ; 2353I BNE 6$ $ MOV SCR.PB+20,PRI.PB+20 ; 2356 BEQ 6$4 MOV SCR.PB+2,R0 ; 2359  BIC #177733,R0R BIS R0,PRI.PB+2$ MOV SCR.PB+22,PRI.PB+22 ; 23606$: TST PRI.PB+24 ; 2363 BNE 9$ $ MOV SCR.PB+24,PRI.PB+24 ; 2366 BEQ 9$  MOV SCR.PB+2,R0 ; 2369, BIC #177755,R0 BIS R0,PRI.PB+2$ MOV SCR.PB+26,PRI.PB+26 ; 2370 BR 9$ ; 23737$: TST R0 ; 2395 BNE 8$V TST PRI.PB+24 BNE 8$ BIS #2006,PRI.PB+2 ; 2405$ MOV SCR.PB+20,PRI.PB+20 ; 2406$ MOV SCR.PB+22,PRI.PB+22 ; 24078$: TST PRI.PB+4 ; 2414, BNE 10$9$: TST PRI.PB+303 BNE 10$$ MOV SCR.PB+30,PRI.PB+30 ; 2416 BEQ 10$ MOV SCR.PB+2,R0 ; 24193 BIC #177766,R0V BIS R0,PRI.PB+2$ MOV SCR.PB+32,PRI.PB+32 ; 2420"10$: CLR R4 ; TOTAL.LEN 2441" MOV #1,(SP) ; *,STATUS 2442 CLR PRI.PB+34 ; 2443  CLR PRI.PB+36 ; 2444 ) MOV #PRI.PB,2(SP) ; *,PRI.PB.P 2445 " MOV MERGED,R0 ; *,O.PTR 2446 CLR R5 ; I 2448 11$: MOV R5,R1 ; I,* 2450 ASL R1  ADD 2(SP),R1 ; PRI.PB.P,* MOV 4(R1),R3 ; *,CURRENT.LEN3, ADD R3,R4 ; CURRENT.LEN,TOTAL.LEN 2451% CMP R4,#377 ; TOTAL.LEN,* 2453 BLOS 13$C! MOV MERGED,PRI.PB+36 ; 2470V ADD #377,PRI.PB+36 ) MOV R4,PRI.PB+34 ; TOTAL.LEN,* 24714 SUB #377,PRI.PB+34 + SUB PRI.PB+34,R3 ; *,CURRENT.LEN 2473  BPL 12$ CLR R3 ; CURRENT.LEN)12$: MOV #-1414,(SP) ; *,STATUS 2476V 13$: MOV R5,R1 ; I,* 2484 ASL R1; ADD 2(SP),R1 ; PRI.PB.P,* MOV 6(R1),R2 ; *,I.PTR BEQ 14$ ; 2485 MOV R0,6(R1) ; O.PTR,*U$14$: TST R3 ; CURRENT.LEN 2486 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 2448 CMP R5,#12 ; I,* BLOS 11$7 TST PRI.PB+34 ; 2496R BNE 17$! MOV R4,PRI.PB+36 ; TOTAL.LEN,*R ADD MERGED,PRI.PB+36:"17$: MOV PRI.PB+40,R1 ; 2501 BEQ 18$ MOV PRI.PB+6,R2 ; 2503L ADD PRI.PB+4,R2 SUB R1,R2 MOV R2,PRI.PB+42  SUB #2,PRI.PB+42118$: CLR R1 ; 2508( 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,* 2509*! MOV MERGED,R1 ; *,TEMP 2510 MOV PRIMARY,MERGED ; 2511" MOV R1,PRIMARY ; TEMP,* 2512" MOV (SP)+,R0 ; STATUS,* 2269 TST (SP)+ ; 2242 RTS PCV8; Routine Size: 275 words, Routine Base: $CODE$ + 5744.; Maximum stack depth per invocation: 9 words .NLIST .DSABL LSB. .NLIST BIN,LOCR .LIST-; 2516 1 %SBTTL 'Parse file specification'B; 2517 1 GLOBAL_FOR_DEBUGA; 2518 1 ROUTINE fss (ptr_p, len_p; ptr, len) : fss_l NOVALUE=R ; 2519 1 ; 2520 1 !++V ; 2521 1 !*%; 2522 1 ! FUNCTIONAL DESCRIPTION: ; 2523 1 !RM; 2524 1 ! Scan the input string for a valid file specification. On exit, N; 2525 1 ! either it has scanned the entire string, the scan was terminatedJ; 2526 1 ! by something that may or may not be a valid terminator, or a*; 2527 1 ! syntax error was discovered. ; 2528 1 !sO; 2529 1 ! Spaces are not allowed in the file specification for two reasons;_P; 2530 1 ! any reasonable external use for this routine will be in a DCL likeO; 2531 1 ! command language or similar where spaces are parameter delimiterstO; 2532 1 ! or it is being used to perform a parse merge. In this case, somecO; 2533 1 ! preprocessing has almost certainly been done; in the case of this 5; 2534 1 ! module, the string has been compressed. ; 2535 1 !w ; 2536 1 ! FORMAL PARAMETERS: ; 2537 1 !c; 2538 1 ! ptr_p *; 2539 1 ! address of the input string ; 2540 1 ! ; 2541 1 ! len_ps#; 2542 1 ! length of the stringi ; 2543 1 ! ; 2544 1 ! IMPLICIT OUT00"vtibjbkb a a aPUTS:r ; 2545 1 !r3; 2546 1 ! The scratch parse block is filled in. ; 2547 1 !r; 2548 1 !--s ; 2549 1 ; 2550 2 BEGINo ; 2551 2 ; 2552 2 MACRO ; 2553 2 ; 2554 2 !5O; 2555 2 ! NEXT_CHAR sets the next character and returns true if successO; 2556 2 ! ; M 2557 2 next_char =t; M 2558 2 BEGIN); M 2559 2 char = .(.ptr)<0, 8, 1>; ; M 2560 2 ptr = .ptr + 1;#; M 2561 2 .ptr LEQA .end_ptr ; 2562 2 END %;O ; 2563 2 ; 2564 2 REGISTER4; 2565 2 char; ! Character being examined ; 2566 2 ; 2567 2 LOCAL ,; 2568 2 status, ! Routine statusQ; 2569 2 backup_ptr, ! Restart point if current state fails to transitn3; 2570 2 end_ptr; ! End of input pointer ; 2571 2 ; 2572 2 LABELa; 2573 2 main_scan,; 2574 2 filename_scan,; 2575 2 node_scan; ; 2576 2 B; 2577 2 save_parse (scr_pb); ! Init the scratch parse block; 2578 2 ptr = .ptr_p; $; 2579 2 end_ptr = .ptr + .len_p; ; 2580 2 ; 2581 2 main_scan :; 2582 3 BEGIN; 2583 3 node_scan : 5; 2584 4 BEGIN ! Process a node specificatione ; 2585 4 ; 2586 4 !f-; 2587 4 ! Process all node specifications! ; 2588 4 !oR; 2589 4 ! No errors are returned by this section. We don't really have enoughM; 2590 4 ! information, with the possible exception of unterminated accessrJ; 2591 4 ! control string. We'll pick that up later as a bad filename. ; 2592 4 !_P; 2593 4 ! While the node specification will include all node specifications,Q; 2594 4 ! the access control string will only include the first quoted string O; 2595 4 ! plus colons, or if no access control, just the colons. This will5Q; 2596 4 ! be used to merge any node logical name translation, which of coursev;; 2597 4 ! is only performed on the first specification.i ; 2598 4 !t; 2599 4 LOCAL1; 2600 4 node_count;p ; 2601 4 ; 2602 4 node_count = 0;5; 2603 4 backup_ptr = .ptr; ; 2604 4 ; 2605 4 WHILE 1 DO; 2606 5 BEGIN ; 2607 5 ; 2608 5 LOCAL ; 2609 5 access_ptr; ; 2610 5 ; 2611 5 !lM; 2612 5 ! If there are no more characters backup to the start of this M; 2613 5 ! substring and exit this loop; its not a node specification. ; 2614 5 !e"; 2615 5 access_ptr = .ptr; ; 2616 5 ; 2617 6 IF NOT next_char; 2618 5 THEN; 2619 6 BEGIN; 2620 6 ptr = .backup_ptr;p; 2621 6 EXITLOOP;; 2622 5 END;L ; 2623 5 <; 2624 5 CASE ch$classify (.char) FROM 0 TO ch_max OF; 2625 5 SET ; 2626 5 J; 2627 5 [ch_alpha, ch_dollar, ch_under, ch_lower, ch_oct, ch_8and9] : ; 2628 5 ; 2629 5 !O; 2630 5 ! The character is valid in a node name, do the next character ; 2631 5 !; 2632 5 ; ; 2633 5 ; 2634 5 [ch_colon] :F ; 2635 5 ; 2636 5 !G; 2637 5 ! A node specification is terminated by double colons;I7; 2638 5 ! is the next character also a colon ? ; 2639 5 !; 2640 6 BEGIN ; 2641 6 !; 2642 7 IF NOT next_charh; 2643 6 THENn; 2644 7 BEGIN, ; 2645 7 ptr = .backup_ptr;; 2646 7 EXITLOOP; ; 2647 6 END; ; 2648 6 $; 2649 6 IF .char NEQU %C':'; 2650 6 THEN6; 2651 7 BEGIN ; 2652 7 ptr = .backup_ptr;; 2653 7 EXITLOOP; ; 2654 6 END; ; 2655 6 ; 2656 6 !K; 2657 6 ! We have parsed a node specification; save this knowledge P; 2658 6 ! but let's not get carried away and lose the knowledge we haveT; 2659 6 ! about the first one we found if poor man's routing is being used.; 2660 6 !&; 2661 6 IF .node_count EQLU 0; 2662 6 THEN ; 2663 7 BEGIN'/; 2664 7 scr_pb [node_addr] = .backup_ptr; 5; 2665 7 scr_pb [node_len] = .ptr - .backup_ptr; 100*vvt__DATADATADATADATA; 2666 7 scr_pb [access_addr] = .access_ptr; ;; 2667 7 scr_pb [access_len] = .ptr - .access_ptr - 2;a9; 2668 7 scr_pb [flags] = .scr_pb [flags] OR FS$NOD;r8; 2669 7 scr_pb [logical_type] = logical_type_node;; 2670 7 ENDo; 2671 6 ELSE'=; 2672 6 scr_pb [node_len] = .ptr - .scr_pb [node_addr];I ; 2673 6 #; 2674 6 backup_ptr = .ptr;6.; 2675 6 node_count = .node_count + 1;; 2676 5 END;6 ; 2677 5 ; 2678 5 [ch_quote] :p ; 2679 5 ; 2680 5 !A; 2681 5 ! Must be the start of an access control string.-; 2682 5 !; 2683 6 BEGIN ; 2684 6 ; 2685 6 LOCAL; 2686 6 state; ; 2687 6 <; 2688 6 ptr = .ptr - 1; ! backup pointer to quoteM; 2689 6 access_ptr = .ptr; ! Save address of access control string ; 2690 6 ; 2691 6 !?; 2692 6 ! Can't be a node specification if null string ; 2693 6 !8; 2694 6 IF .ptr EQLU .backup_ptr THEN EXITLOOP; ; 2695 6 :; 2696 6 state = 0; ! Initial state is unquoted ; 2697 6 ; 2698 6 WHILE 1 DON; 2699 7 BEGIN6 ; 2700 7 ; 2701 7 ! C; 2702 7 ! Get the next character. If none then exit this loopn*; 2703 7 ! and determine quote level.; 2704 7 !d; 2705 8 IF NOT next_char; 2706 7 THEN; 2707 8 BEGIN ; 2708 8 ; 2709 8 !nM; 2710 8 ! If we ran out of input, then its not a node specification ; 2711 8 !6$; 2712 8 ptr = .backup_ptr;"; 2713 8 LEAVE node_scan;; 2714 7 END; ; 2715 7 !; 2716 7 IF .char EQLU %C'"'; 2717 7 THEN$; 2718 7 state = NOT .state; 2719 7 ELSE ; 2720 7 1; 2721 7 IF .state EQLU 0 THEN EXITLOOP; ; 2722 7 ; 2723 6 END; ; 2724 6 ; 2725 6 !P; 2726 6 ! The access control string must be terminated by double colons; 2727 6 !$; 2728 6 IF .char NEQU %C':'; 2729 6 THEN ; 2730 7 BEGIN_ ; 2731 7 ptr = .backup_ptr;; 2732 7 EXITLOOP; ; 2733 6 END; ; 2734 6 !; 2735 7 IF NOT next_char ; 2736 6 THEN ; 2737 7 BEGIN ; 2738 7 ptr = .backup_ptr;; 2739 7 EXITLOOP; ; 2740 6 END; ; 2741 6 $; 2742 6 IF .char NEQU %C':'; 2743 6 THEN ; 2744 7 BEGINc ; 2745 7 ptr = .backup_ptr;; 2746 7 EXITLOOP; ; 2747 6 END; ; 2748 6 ; 2749 6 !K; 2750 6 ! We have parsed a node specification; save this knowledge;P; 2751 6 ! but let's not get carried away and lose the knowledge we haveT; 2752 6 ! about the first one we found if poor man's routing is being used.; 2753 6 !&; 2754 6 IF .node_count EQLU 0; 2755 6 THEN ; 2756 7 BEGIN'/; 2757 7 scr_pb [node_addr] = .backup_ptr; 5; 2758 7 scr_pb [node_len] = .ptr - .backup_ptr; 1; 2759 7 scr_pb [access_addr] = .access_ptr; ;; 2760 7 scr_pb [access_len] = .ptr - .access_ptr - 2;a9; 2761 7 scr_pb [flags] = .scr_pb [flags] OR FS$NOD;r8; 2762 7 scr_pb [logical_type] = logical_type_node;; 2763 7 ENDo; 2764 6 ELSE'=; 2765 6 scr_pb [node_len] = .ptr - .scr_pb [node_addr];I ; 2766 6 #; 2767 6 backup_ptr = .ptr;7.; 2768 6 node_count = .node_count + 1;8; 2769 5 END; ! Process access control string ; 2770 5 ; 2771 5 [INRANGE] : ; 2772 5 ; 2773 5 !I; 2774 5 ! Either an invalid character has been encountered or webI; 2775 5 ! aren't processing a node specification. Backup to the >; 2776 5 ! beginning of the string and exit this loop.; 2777 5 !; 2778 6 BEGIN#; 2779 6 ptr = .backup_ptr; ; 2780 6 EXITLOOP;; 2781 5 END; ; 2782 5 TES;_ ; 2783 5 ; 2784 4 END; ; 2785 4 4; 2786 3 END; ! Process a node specification7; 2787 4 002vtibjbkb a a aBEGIN ! Process a device specification! ; 2788 4 !lY; 2789 4 ! Attempt to process a device specification. The next character has not beenf<; 2790 4 ! fetched at the beginning nor end of the block. ; 2791 4 ! W; 2792 4 ! No errors are detected in this scan. If we don't find what we're lookingrW; 2793 4 ! for, its most likely because we're not looking at a device specification.T; 2794 4 ! If we don't like what we see, we just backup to the start and go on to; 2795 4 ! the next section.e ; 2796 4 !c; 2797 4 backup_ptr = .ptr; ; 2798 4 ; 2799 4 WHILE 1 DO; 2800 5 BEGINt ; 2801 5 ; 2802 5 !0M; 2803 5 ! If there are no more characters backup to the start of this /; 2804 5 ! substring and exit this loop.o; 2805 5 ! ; 2806 6 IF NOT next_char; 2807 5 THEN; 2808 6 BEGIN; 2809 6 ptr = .backup_ptr; ; 2810 6 EXITLOOP;; 2811 5 END;a ; 2812 5 <; 2813 5 CASE ch$classify (.char) FROM 0 TO ch_max OF; 2814 5 SET ; 2815 5 J; 2816 5 [ch_alpha, ch_dollar, ch_under, ch_lower, ch_oct, ch_8and9] : ; 2817 5 ; 2818 5 !Q; 2819 5 ! The character is valid in a device name, do the next character ; 2820 5 !; 2821 5 ; ; 2822 5 ; 2823 5 [ch_colon] :N ; 2824 5 ; 2825 5 !E; 2826 5 ! This is the terminating character of a device nameI; 2827 5 !; 2828 6 BEGIN ; 2829 6 -; 2830 6 IF .ptr - .backup_ptr GTRU 1 ; 2831 6 THEN5; 2832 7 BEGINh ; 2833 7 ; 2834 7 !_K; 2835 7 ! We've got a valid device specification, save this knowledge ; 2836 7 !i1; 2837 7 scr_pb [device_addr] = .backup_ptr; 7; 2838 7 scr_pb [device_len] = .ptr - .backup_ptr; 9; 2839 7 scr_pb [flags] = .scr_pb [flags] OR FS$DEV;6 ; 2840 7 >; 2841 7 IF .scr_pb [logical_type] eqlu logical_type_none; 2842 7 then>; 2843 7 scr_pb [logical_type] = logical_type_device; ; 2844 7 ; 2845 7 END ; 2846 6 ELSE ; 2847 6 ; 2848 6 ! =; 2849 6 ! Not long enough, backup and let it fail latern; 2850 6 !6 ; 2851 6 ptr = .backup_ptr; ; 2852 6 ; 2853 6 EXITLOOP;; 2854 5 END;p ; 2855 5 ; 2856 5 [INRANGE] : ; 2857 5 ; 2858 5 !I; 2859 5 ! Either an invalid character has been encountered or wepK; 2860 5 ! aren't processing a device specification. Backup to the_>; 2861 5 ! beginning of the string and exit this loop.; 2862 5 !; 2863 6 BEGIN#; 2864 6 ptr = .backup_ptr;n; 2865 6 EXITLOOP;; 2866 5 END; ; 2867 5 TES;; ; 2868 5 ; 2869 4 END; ; 2870 4 6; 2871 3 END; ! Process a device specification5; 2872 4 BEGIN ! Process a file specificationE ; 2873 4 !d0; 2874 4 ! Process a directory specification. ; 2875 4 ! W; 2876 4 ! We are immediately able to determine if we have a directory specificationtO; 2877 4 ! at this point; the current character must be either a '<' or '['. M; 2878 4 ! If we don't find the matching bracket, we will report an error. G; 2879 4 ! Likewise if we don't like some of the characters scanned.8 ; 2880 4 ! :; 2881 5 BEGIN ! Process a directory specification ; 2882 5 ; 2883 5 !:; 2884 5 ! Attempt to process a directory specification ; 2885 5 ! ; 2886 5 ; 2887 5 LOCALa; 2888 5 bracket; ; 2889 5 V; 2890 5 backup_ptr = .ptr; ! Save start of this part of string for error return ; 2891 5 2; 2892 5 IF NOT next_char THEN LEAVE main_scan; ; 2893 5 ; 2894 5 bracket = 0; ; 2895 5 ; 2896 5 SELECT .char OFh; 2897 5 SET ; 2898 5 ; 2899 5 [%C'['] :o ; 2900 5 ; 2901 5 !D; 2902 5 ! Standard directory brackets, set terminating bracket.; 2903 5 !; 2904 5 bracket = %C']'; ; 2905 5 ; 2906 00:vvt__DATADATADATADATA5 [%C'<'] :r ; 2907 5 ; 2908 5 !;; 2909 5 ! Alternate brackets, set terminating bracket. ; 2910 5 !; 2911 5 bracket = %C'>';N; 2912 5 TES; ; 2913 5 ; 2914 5 IF .bracket NEQU 0; 2915 5 THEN;; 2916 6 BEGIN ! Process directory specification8 ; 2917 6 ; 2918 6 LOCAL ; 2919 6 state; ; 2920 6 ; 2921 6 state = 0; ; 2922 6 "; 2923 7 IF NOT (WHILE 1 DO8; 2924 8 BEGIN ! Scan directory specification ; 2925 8 ; 2926 8 !E; 2927 8 ! Get the next character, if none then right bracket D; 2928 8 ! missing, terminate scan with an error indication.; 2929 8 !7; 2930 8 IF NOT next_char THEN LEAVE main_scan; ; 2931 8 =; 2932 8 CASE ch$classify (.char) FROM 0 TO ch_max OF ; 2933 8 SET ; 2934 8 T; 2935 8 [ch_alpha, ch_dollar, ch_under, ch_lower, ch_oct, ch_8and9, ch_dash] : ; 2936 8 ; 2937 8 !nA; 2938 8 ! These characters are valid in the new format.7; 2939 8 !x; 2940 8 ;o ; 2941 8 ; 2942 8 [ch_dot] : ; 2943 8 ; 2944 8 !e0; 2945 8 ! Check for ... which is wild.; 2946 8 ! ; 2947 8 =; 2948 9 IF next_char ! Is there another character?r; 2949 8 THEN/; 2950 8 IF .char EQLU %C'.' ! Is it a .?c; 2951 8 THENh3; 2952 9 IF next_char ! Is there a third?9; 2953 8 THEN 1; 2954 8 IF .char EQLU %C'.' ! Is it a .?i; 2955 8 THEN>; 2956 8 scr_pb [flags] = .scr_pb [flags] OR FS$WDI; 2957 8 ELSE?; 2958 8 LEAVE main_scan ! .. invalid, no directoryc; 2959 8 ELSE 9; 2960 8 LEAVE main_scan ! We are looking at junkt; 2961 8 ELSEr@; 2962 8 ptr = .ptr - 1 ! . followed by something else; 2963 8 ELSE9; 2964 8 LEAVE main_scan; ! We are looking at junkd ; 2965 8 ; 2966 8 [ch_wild] : ; 2967 8 ; 2968 8 !.+; 2969 8 ! Indicate wild directory ; 2970 8 !_=; 2971 8 scr_pb [flags] = .scr_pb [flags] OR FS$WDI; ; 2972 8 ; 2973 8 [ch_dir] : ; 2974 8 ; 2975 8 ! Q; 2976 8 ! End of directory specification, exit loop if matching bracket9; 2977 8 !tQ; 2978 8 IF .char EQLU .bracket THEN EXITLOOP valid ELSE EXITLOOP error;m ; 2979 8 ; 2980 8 [INRANGE] : ; 2981 8 ; 2982 8 ! F; 2983 8 ! Invalid character encountered, terminate scan withE; 2984 8 ! an error indication. We will rescan to determinec<; 2985 8 ! if the specification is in the UIC form.; 2986 8 ! !; 2987 8 EXITLOOP error; ; 2988 8 TES; ; 2989 8 7; 2990 8 END ! Scan directory specification ; 2991 7 ); 2992 6 THEN; 2993 7 BEGIN#; 2994 7 ptr = .backup_ptr + 1; ; 2995 7 C; 2996 7 WHILE 1 DO ! Process group,member format directoryn; 2997 8 BEGIN ; 2998 8 7; 2999 8 IF NOT next_char THEN LEAVE main_scan;w ; 3000 8 =; 3001 8 CASE ch$classify (.char) FROM 0 TO ch_max OFU; 3002 8 SET ; 3003 8 "; 3004 8 [ch_oct, ch_8and9] : ; 3005 8 ; 3006 8 ! $; 3007 8 ! Digits are valid; 3008 8 !9; 3009 8 ;2 ; 3010 8 ; 3011 8 [ch_wild] :4 ; 3012 8 ; 3013 8 !9+; 3014 8 ! Indicate wild directory ; 3015 8 !i=; 3016 8 scr_pb [flags] = .scr_pb [flags] OR FS$WDI; ; 3017 8 ; 3018 8 [ch_comma] : ; 3019 8 ; 3020 8 ! K; 3021 8 ! Group-member separator encountered. Only one is legal. E; 3022 8 ! Set flag indicating that a comma was encountered. ; 3023 8 !iF; 3024 8 IF (state = NOT .state) EQLU 0 THEN LEAVE main_scan; ; 3025 8 ; 3026 8 [ch_dir] : ; 3027 8 ; 3028 8 ! >; 3029 8 ! End of directory speci00Bvtibjbkb a a afication, exit loop.; 3030 8 !=; 3031 9 BEGINI ; 3032 9 O; 3033 9 IF .char NEQU .bracket OR .state EQLU 0 THEN LEAVE main_scan; ; 3034 9 ; 3035 9 EXITLOOP;O; 3036 8 END; ; 3037 8 ; 3038 8 [INRANGE] :a ; 3039 8 ; 3040 8 ! N; 3041 8 ! Invalid character encountered, exit the loop with an error; 3042 8 ! "; 3043 8 LEAVE main_scan;; 3044 8 TES; ; 3045 8 G; 3046 8 END ! Process group,member directory specification; 3047 6 END;E ; 3048 6 ; 3049 6 ! P; 3050 6 ! We have located a directory specification, save this knowledge; 3051 6 !X6; 3052 6 scr_pb [directory_addr] = .backup_ptr;<; 3053 6 scr_pb [directory_len] = .ptr - .backup_ptr;;; 3054 6 scr_pb [flags] = .scr_pb [flags] OR FS$DIR;tW; 3055 6 backup_ptr = .ptr; ! Save start of remaining string for error return:; 3056 5 END; ! Process directory specification ; 3057 5 0; 3058 4 END; ! Process a directory spec; 3059 4 filename_scan : ); 3060 5 BEGIN ! Process filenamet ; 3061 5 !k:; 3062 5 ! Attempt to process a filename specification. ; 3063 5 !c?; 3064 5 ! We will first attempt to process a quoted string._ ; 3065 5 ! O; 3066 5 ! If we don't find a quoted string, then we will attempt to process.*; 3067 5 ! a normal file specification. ; 3068 5 !; 3069 5 LOCAL;; 3070 5 state; ; 3071 5 ; 3072 5 state = 0; ; 3073 5 ; 3074 5 !e9; 3075 5 ! Attempt to process a funny filename (ANSI). ; 3076 5 !fG; 3077 5 ptr = .backup_ptr; ! Backup to start of remaining stringc ; 3078 5 ; 3079 5 WHILE 1 DO; 3080 6 BEGINp ; 3081 6 ; 3082 6 ! L; 3083 6 ! Get the next character. If none then the command is valid.; 3084 6 ! /; 3085 6 IF NOT next_char THEN EXITLOOP;8 ; 3086 6 #; 3087 6 IF .char EQLU %C'"'; 3088 6 THEN; 3089 6 state = NOT .state ; 3090 6 ELSE,; 3091 6 IF .state EQLU 0 THEN EXITLOOP;; 3092 5 END; ; 3093 5 4; 3094 5 state = -1; ! Initialize state again:; 3095 5 ptr = .ptr - 1; ! Backup to next character ; 3096 5 $; 3097 5 IF .ptr NEQU .backup_ptr; 3098 5 THEN; 3099 6 BEGINn ; 3100 6 ; 3101 6 ! S; 3102 6 ! We actually have a quoted file specification, save this knowledge ; 3103 6 !C5; 3104 6 scr_pb [filename_addr] = .backup_ptr;t;; 3105 6 scr_pb [filename_len] = .ptr - .backup_ptr;NO; 3106 6 scr_pb [flags] = .scr_pb [flags] OR FS$QUO OR FS$NAM OR FS$TYP;t; 3107 6 END ; 3108 5 ELSE5; 3109 6 BEGIN ! Process a normal filename ; 3110 6 ; 3111 6 WHILE 1 DO4; 3112 7 BEGIN ! Scan filename specification ; 3113 7 ,; 3114 7 IF NOT next_char THEN EXITLOOP; ; 3115 7 9; 3116 7 CASE ch$classify (.char) FROM 0 TO ch_max OF ; 3117 7 SET ; 3118 7 N; 3119 7 [ch_alpha, ch_dollar, ch_under, ch_lower, ch_oct, ch_8and9] : ; 3120 7 ; 3121 7 ![C; 3122 7 ! Valid character encountered, process next character8; 3123 7 !9; 3124 7 ; ; 3125 7 ; 3126 7 ! 9; 3127 7 ! Note that a wildcard has been encountered ; 3128 7 !s; 3129 7 [ch_wild] : ; 3130 7 ; 3131 7 !N9; 3132 7 ! Note that a wildcard has been encounteredh; 3133 7 !m1; 3134 7 scr_pb [flags] = .scr_pb [flags] OR9; 3135 8 BEGINh5; 3136 8 IF .state LSS 0 THEN FS$WNA ELSE FS$WTY1; 3137 7 END; ; 3138 7 ; 3139 7 [ch_dot] :n ; 3140 7 ; 3141 7 !:; 3142 7 ! The first dot is the type field delimiter,8; 3143 7 ! the second is the new version delimiter..; 3144 7 ! Exit if the version delimiter.; 3145 7 !1,; 3146 7 IF (state = .state + 1) EQLU 0; 3147 7 THEN; 3148 8 BEGIN100Jvvt__DATADATADATADATAL; 3149 8 IF (scr_pb [filename_len] = .ptr - 1 - .backup_ptr) NEQU 0; 3150 8 THEN; 3151 9 BEGIN4; 3152 9 scr_pb [filename_addr] = .backup_ptr;:; 3153 9 scr_pb [flags] = .scr_pb [flags] OR FS$NAM;; 3154 8 END;i(; 3155 8 backup_ptr = .ptr - 1;; 3156 8 ENDi; 3157 7 ELSE; 3158 7 EXITLOOP;t ; 3159 7 ; 3160 7 [INRANGE] : ; 3161 7 ; 3162 7 !a<; 3163 7 ! Any other character is not valid in the file>; 3164 7 ! name or type fields. Exit loop to the version ; 3165 7 ! processing scan.; 3166 7 ! ; 3167 7 EXITLOOP;r; 3168 7 TES;b ; 3169 7 3; 3170 6 END; ! Scan filename specificationA ; 3171 6 =; 3172 6 ptr = .ptr - 1; ! Backup to next character ; 3173 6 ; 3174 6 IF .state LSS 0 ; 3175 6 THEN; 3176 7 BEGIN ; 3177 7 C; 3178 7 IF (scr_pb [filename_len] = .ptr - .backup_ptr) NEQU 0e; 3179 7 THENh; 3180 8 BEGIN6; 3181 8 scr_pb [filename_addr] = .backup_ptr;<; 3182 8 scr_pb [flags] = .scr_pb [flags] OR FS$NAM;; 3183 7 END; ; 3184 7 ; 3185 7 END; 3186 6 ELSE; 3187 7 BEGIN.; 3188 7 scr_pb [type_addr] = .backup_ptr;4; 3189 7 scr_pb [type_len] = .ptr - .backup_ptr;8; 3190 7 scr_pb [flags] = .scr_pb [flags] OR FS$TYP;; 3191 6 END; ; 3192 6 4; 3193 5 END; ! Process a normal filename ; 3194 5 %; 3195 4 END; ! filename_scan ; 3196 4 backup_ptr = .ptr;2; 3197 4 IF NOT next_char THEN LEAVE main_scan; ; 3198 4 ; 3199 4 SELECTONEU .char OFE; 3200 4 SET ; 3201 4 ; 3202 4 [%C'.', %C';'] : ; 3203 4 ; 3204 4 !%; 3205 4 ! Process version number ; 3206 4 !; 3207 5 BEGIN ; 3208 5 ; 3209 5 LOCAL; 3210 5 state;Y ; 3211 5 P; 3212 5 state = 0; ! State is the character count or wildcard flag if -1 ; 3213 5 ; 3214 5 WHILE 1 DOa; 3215 6 BEGIN ; 3216 6 ; 3217 6 !C; 3218 6 ! Get next character. If none command line valid.N; 3219 6 !0; 3220 6 IF NOT next_char THEN EXITLOOP; ; 3221 6 $; 3222 6 SELECTONEU .char OF; 3223 6 SETi ; 3224 6 ; 3225 6 [%C'0' TO %C'9'] : ; 3226 6 ; 3227 6 ! H; 3228 6 ! If number then continue skipping over version number; 3229 6 ! F; 3230 6 IF (state = .state + 1) EQLU 0 THEN LEAVE main_scan; ; 3231 6 ; 3232 6 [%C'-'] : ; 3233 6 ; 3234 6 !xO; 3235 6 ! Minus sign only valid if first character of version number.I; 3236 6 !E; 3237 7 BEGIN ; 3238 7 8; 3239 7 IF .state NEQU 0 THEN LEAVE main_scan; ; 3240 7 %; 3241 7 state = .state + 1;7; 3242 6 END; ; 3243 6 ; 3244 6 [%C'*'] :i ; 3245 6 ; 3246 6 ! W; 3247 6 ! Wildcard version number. Must be only character in version number.1; 3248 6 !%; 3249 7 BEGIN ; 3250 7 8; 3251 7 IF .state NEQU 0 THEN LEAVE main_scan; ; 3252 7 %; 3253 7 state = NOT .state; ; 3254 6 END; ; 3255 6 ; 3256 6 [OTHERWISE] :E ; 3257 6 ; 3258 6 !0=; 3259 6 ! Non-digit encountered, exit version scan. ; 3260 6 ! ; 3261 6 EXITLOOP;2; 3262 6 TES; ; 3263 6 ; 3264 5 END;d ; 3265 5 :; 3266 5 ptr = .ptr - 1; ! Backup to next character ; 3267 5 ; 3268 5 !F; 3269 5 ! We just processed a version number, save this knowledge; 3270 5 ! ; 3271 5 M; 3272 5 IF .state LSS 0 THEN scr_pb [flags] = .scr_pb [flags] OR FS$WVE; ; 3273 5 8; 3274 5 scr_pb [flags] = .scr_pb [flags] OR FS$VER;1; 3275 5 scr_pb [version_addr] = .backup_ptr;27; 3276 5 scr_pb [version_len] = .ptr - .backup_ptr; >; 3277 5 backup_ptr = .ptr; ! Include the version number00Rvtibjbkb a a a; 3278 4 END; ; 3279 4 ; 3280 4 [OTHERWISE] : ; 3281 4 ; 3282 4 !(; 3283 4 ! Return the last character; 3284 4 !; 3285 5 BEGIN:; 3286 5 ptr = .ptr - 1; ! Backup to next character; 3287 4 END;]; 3288 4 TES3 ; 3289 4 6; 3290 3 END; ! Process filename specification!; 3291 2 END; ! main_scankT; 3292 2 scr_pb [trailing_addr] = ptr = .backup_ptr; ! Always fill in the address_; 3293 2 scr_pb [trailing_len] = len = .end_ptr - .ptr; ! of the traling string even if nullO ; 3294 2 q; 3295 2 IF (.scr_pb [flags] NEQU 0) AND (.scr_pb [flags] AND NOT FS$NAM) EQLU 0 ! If a standalone filename is66; 3296 2 THEN ! present it could be a logical>; 3297 2 scr_pb [logical_type] = logical_type_filename; ; 3298 2 (; 3299 2 scr_pb [fss_status] = valid;; 3300 1 END; .NLIST  .LIST BIN,LOC .LIST$ .SBTTL FSS Parse file specification .NLISTa .ENABL LSB2 .LISTFSS: JSR R1,$SAVE3 ; 2518p TST -(SP) MOV #SCR.PB,R1 ; 2577 JSR PC,SAVE.PARSE% MOV R5,R3 ; LEN.P,END.PTR 25790 ADD R4,R3 ; PTR,END.PTRT! CLR (SP) ; NODE.COUNT 2602i% MOV R4,R2 ; PTR,BACKUP.PTR 2603e(1$: MOV R4,R5 ; PTR,ACCESS.PTR 2615# MOVB (R4)+,R1 ; PTR,CHAR 2617e CMP R4,R3 ; PTR,END.PTR  BHI 9$ ; 2620t JSR PC,CH$CLASSIFY ; 2624 ASL R0.# ADD P.AAB(R0),PC ; Case dispatcha3$: DEC R4 ; PTR 2688% MOV R4,R5 ; PTR,ACCESS.PTR 2689S% CMP R4,R2 ; PTR,BACKUP.PTR 2694C BEQ 10$ CLR R0 ; STATE 2696E&4$: MOVB (R4)+,R1 ; PTR,CHAR 2705 CMP R4,R3 ; PTR,END.PTRT BHI 9$ ; 2712O CMP R1,#42 ; CHAR,* 2716, BNE 5$R COM R0 ; STATE 2718P BR 4$ ; 27165$: TST R0 ; STATE 2721 BNE 4$P CMP R1,#72 ; CHAR,* 2728  BNE 9$ ; 2731,&6$: MOVB (R4)+,R1 ; PTR,CHAR 2735 CMP R4,R3 ; PTR,END.PTRc BHI 9$ ; 2738  CMP R1,#72 ; CHAR,* 2742E BNE 9$ ; 2745,! TST (SP) ; NODE.COUNT 2754Q BNE 7$R) MOV R2,SCR.PB+6 ; BACKUP.PTR,* 2757 # MOV R4,SCR.PB+4 ; PTR,* 2758 ! SUB R2,SCR.PB+4 ; BACKUP.PTR,*O* MOV R5,SCR.PB+42 ; ACCESS.PTR,* 2759 MOV R4,R0 ; PTR,* 2760 SUB R5,R0 ; ACCESS.PTR,* MOV R0,SCR.PB+407 SUB #2,SCR.PB+40R BIS #400,SCR.PB+2 ; 27619 MOVB #3,SCR.PB+44 ; 2762R BR 8$ ; 2754&7$: MOV R4,SCR.PB+4 ; PTR,* 2765 SUB SCR.PB+6,SCR.PB+4(8$: MOV R4,R2 ; PTR,BACKUP.PTR 2767! INC (SP) ; NODE.COUNT 2768  BR 1$ ; 2624(9$: MOV R2,R4 ; BACKUP.PTR,PTR 2779)10$: MOV R4,R2 ; PTR,BACKUP.PTR 2797,'11$: MOVB (R4)+,R1 ; PTR,CHAR 2806B CMP R4,R3 ; PTR,END.PTR BHI 14$ ; 2809 JSR PC,CH$CLASSIFY ; 2813 ASL R0R# ADD P.AAC(R0),PC ; Case dispatchS"13$: MOV R4,R0 ; PTR,* 2830 SUB R2,R0 ; BACKUP.PTR,* CMP R0,#1 BLOS 14$ * MOV R2,SCR.PB+12 ; BACKUP.PTR,* 2837 MOV R0,SCR.PB+10 ; 2838 BIS #200,SCR.PB+2 ; 2839P TSTB SCR.PB+44 ; 2841 BNE 15$ MOVB #2,SCR.PB+44 ; 2843U BR 15$ ; 2830M)14$: MOV R2,R4 ; BACKUP.PTR,PTR 2864M)15$: MOV R4,R2 ; PTR,BACKUP.PTR 2890,# MOVB (R4)+,R1 ; PTR,CHAR 2892  CMP R4,R3 ; PTR,END.PTR  BHI 30$ CLR R5 ; BRACKET 2894 CMP R1,#133 ; CHAR,* 2899 BNE 16$# MOV #135,R5 ; *,BRACKET 2904R#16$: CMP R1,#74 ; CHAR,* 2906C BNE 17$" MOV #76,R5 ; *,BRACKET 2911 17$: TST R5 ; BRACKET 2914 BEQ 32$ CLR (SP) ; STATE 2921 '18$: MOVB (R4)+,R1 ; PTR,CHAR 2930  CMP R4,R3 ; PTR,END.PTR3 BHI 30$ JSR PC,CH$CLASSIFY ; 2932 ASL R0M# ADD P.AAD(R0),PC ; Case dispatch'20$: MOVB (R4)+,R1 ; PTR,CHAR 2948P CMP R4,R3 ; PTR,END.PTRI BHI 30$ CMP R1,#56 ; CHAR,* 2950, BNE 21$# MOVB (R4)+,R1 ; PTR,CHAR 29525 CMP R4,R3 ; PTR,END.PTR: BHI 30$ CMP R1,#56 ; CHAR,* 2954 BNE 30$ BR 22$ ; 2956121$: DEC R4 ; PTR 29629 BR 18$ ; 200Zvvt__DATADATADATADATA948 $22$: BIS #1000,SCR.PB+2 ; 2971 BR 18$ ; 2932 (23$: CMP R1,R5 ; CHAR,BRACKET 2978 BEQ 31$)24$: MOV R2,R4 ; BACKUP.PTR,PTR 2994D INC R4 ; PTR'25$: MOVB (R4)+,R1 ; PTR,CHAR 2999  CMP R4,R3 ; PTR,END.PTR, BHI 46$ JSR PC,CH$CLASSIFY ; 3001 ASL R0# ADD P.AAE(R0),PC ; Case dispatch $27$: BIS #1000,SCR.PB+2 ; 3016 BR 25$ ; 3001 !28$: COM (SP) ; STATE 3024  BNE 25$ BR 49$(29$: CMP R1,R5 ; CHAR,BRACKET 3033 30$: BNE 51$ TST (SP) ; STATE BEQ 49$.31$: MOV R2,SCR.PB+16 ; BACKUP.PTR,* 3052$ MOV R4,SCR.PB+14 ; PTR,* 3053" SUB R2,SCR.PB+14 ; BACKUP.PTR,* BIS #100,SCR.PB+2 ; 3054R% MOV R4,R2 ; PTR,BACKUP.PTR 3055332$: CLR R5 ; STATE 3072R% MOV R2,R4 ; BACKUP.PTR,PTR 3077'33$: MOVB (R4)+,R1 ; PTR,CHAR 3085: CMP R4,R3 ; PTR,END.PTR0 BHI 35$ CMP R1,#42 ; CHAR,* 3087  BNE 34$ COM R5 ; STATE 3089 BR 33$ ; 3087R34$: TST R5 ; STATE 3091T BNE 33$$35$: MOV #-1,R5 ; *,STATE 3094 DEC R4 ; PTR 30952% CMP R4,R2 ; PTR,BACKUP.PTR 3097 BEQ 36$* MOV R2,SCR.PB+22 ; BACKUP.PTR,* 3104$ MOV R4,SCR.PB+20 ; PTR,* 3105" SUB R2,SCR.PB+20 ; BACKUP.PTR,* BIS #2006,SCR.PB+2 ; 3106 BR 45$ ; 30973'36$: MOVB (R4)+,R1 ; PTR,CHAR 3114C CMP R4,R3 ; PTR,END.PTRB BHI 43$ JSR PC,CH$CLASSIFY ; 3116 ASL R0C# ADD P.AAF(R0),PC ; Case dispatch 38$: TST R5 ; STATE 3136A BGE 39$ MOV #40,R0 ; 3135R BR 40$S39$: MOV #20,R0C!40$: BIS R0,SCR.PB+2 ; 3134  BR 36$ ; 3116941$: INC R5 ; STATE 3146  BNE 43$ MOV R4,R0 ; PTR,* 3149 SUB R2,R0 ; BACKUP.PTR,* MOV R0,SCR.PB+20P DEC SCR.PB+20 BEQ 42$* MOV R2,SCR.PB+22 ; BACKUP.PTR,* 3152 BIS #4,SCR.PB+2 ; 31531)42$: MOV R4,R2 ; PTR,BACKUP.PTR 3155 DEC R2 ; BACKUP.PTR  BR 36$ ; 3146P43$: DEC R4 ; PTR 3172 MOV R4,R0 ; PTR,* 3178 SUB R2,R0 ; BACKUP.PTR,* TST R5 ; STATE 3174# BGE 44$ MOV R0,SCR.PB+20 ; 3178 BEQ 45$* MOV R2,SCR.PB+22 ; BACKUP.PTR,* 3181 BIS #4,SCR.PB+2 ; 3182  BR 45$ ; 3174,.44$: MOV R2,SCR.PB+26 ; BACKUP.PTR,* 3188 MOV R0,SCR.PB+24 ; 3189 BIS #2,SCR.PB+2 ; 3190)45$: MOV R4,R2 ; PTR,BACKUP.PTR 3196,# MOVB (R4)+,R1 ; PTR,CHAR 3197R CMP R4,R3 ; PTR,END.PTR  BHI 55$ CMP R1,#56 ; CHAR,* 3202 BEQ 47$ CMP R1,#73 ; CHAR,*S 46$: BNE 55$47$: CLR R0 ; STATE 3212 '48$: MOVB (R4)+,R1 ; PTR,CHAR 3220  CMP R4,R3 ; PTR,END.PTRC BHI 53$ CMP R1,#60 ; CHAR,* 3225C BLO 50$ CMP R1,#71 ; CHAR,*  BHI 50$ INC R0 ; STATE 3230K BNE 48$ 49$: BR 55$R#50$: CMP R1,#55 ; CHAR,* 3232. BNE 52$ TST R0 ; STATE 3239 51$: BNE 55$ INC R0 ; STATE 3241P BR 48$ ; 3222R#52$: CMP R1,#52 ; CHAR,* 3244P BNE 53$ TST R0 ; STATE 3251 BNE 55$ COM R0 ; STATE 3253 BR 48$ ; 3222 53$: DEC R4 ; PTR 3266; TST R0 ; STATE 32723 BGE 54$ BIS #10,SCR.PB+2!54$: BIS #1,SCR.PB+2 ; 3274B* MOV R2,SCR.PB+32 ; BACKUP.PTR,* 3275$ MOV R4,SCR.PB+30 ; PTR,* 3276" SUB R2,SCR.PB+30 ; BACKUP.PTR,*% MOV R4,R2 ; PTR,BACKUP.PTR 3277;)55$: MOV R2,R4 ; BACKUP.PTR,PTR 3292;" MOV R2,SCR.PB+36 ; BACKUP.PTR,*# MOV R3,R5 ; END.PTR,LEN 32933 SUB R4,R5 ; PTR,LEN  MOV R5,SCR.PB+34 ; LEN,* MOV SCR.PB+2,R0 ; 3295B BEQ 56$ BIT #-5,R03 BNE 56$ MOVB #1,SCR.PB+44 ; 3297S56$: MOV #1,SCR.PB ; 32990 TST (SP)+ ; 2518 RTS PC;8; Routine Size: 341 words, Routine Base: $CODE$ + 7012.; Maximum stack depth per invocation: 6 words .PSECT $PLIT$, RO , D +P.AAB: ; CASE Table for FSS+0044 2624 2$: .WORD 160 ; [9$] .WORD -22 ; [1$] .WORD 160 ; [9$] .WORD -22 ; [1$] .WORD -22 ; [1$] .WORD 160 ; [9$] .WORD 44 ; [6$]M .WO00bvtibjbkb a a aRD 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 2813 12$: .WORD 46 ; [14$] .WORD -20 ; [11$]$ .WORD 46 ; [14$] .WORD -20 ; [11$]F .WORD -20 ; [11$]R .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 2932 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 3001026$: .WORD 472 ; [55$]. .WORD 472 ; [55$]. .WORD 472 ; [55$]f .WORD -20 ; [25$]: .WORD 472 ; [55$]. .WORD 10 ; [28$] .WORD 472 ; [55$]. .WORD 472 ; [55$]. .WORD 16 ; [29$] .WORD 0 ; [27$] .WORD 472 ; [55$]. .WORD 472 ; [55$]O .WORD 472 ; [55$]D .WORD 472 ; [55$]- .WORD -20 ; [25$]0 .WORD 472 ; [55$]0+P.AAF: ; CASE Table for FSS+0662 3116037$: .WORD 66 ; [43$] .WORD -20 ; [36$]  .WORD 66 ; [43$] .WORD -20 ; [36$]4 .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'; 3301 1 %SBTTL 'Classify character'; 3302 1 GLOBAL_FOR_DEBUG8; 3303 1 ROUTINE ch$classify (char) : ch$classify_l = ; 3304 1 ; 3305 1 !++ ; 3306 1 ! %; 3307 1 ! FUNCTIONAL DESCRIPTION:6 ; 3308 1 !.I; 3309 1 ! Classify the character into one of the types of interest to $; 3310 1 ! the parseing routines. ; 3311 1 ! ; 3312 1 ! FORMAL PARAMETERS: ; 3313 1 !.0; 3314 1 ! char - Character to be classified. ; 3315 1 !S; 3316 1 ! ROUTINE VALUE:; 3317 1 ! COMPLETION CODES:c ; 3318 1 ! 7; 3319 1 ! The character classification is returned. ; 3320 1 !s; 3321 1 !--4 ; 3322 1 ; 3323 2 BEGIN ; 3324 2 ; 3325 2 LITERALR; 3326 2 ctb = %C'"', ; 3327 2 cte = %C'z' + 1; ; 3328 2 ; 3329 2 OWNtF; 3330 2 char_types : VECTOR [cte - ctb, BYTE, SIGNED] PRESET (; 3331 2 ! "alpha"s $; 3332 2 [%C'A'-ctb] = ch_alpha,$; 3333 2 [%C'B'-ctb] = ch_alpha,$; 3334 2 [%C'C'-ctb] = ch_alpha,$; 3335 2 [%C'D'-ctb] = ch_alpha,$; 3336 2 [%C'E'-ctb] = ch_alpha,$; 3337 2 [%C'F'-ctb] = ch_alpha,$; 3338 2 [%C'G'-ctb] = ch_alpha,$; 3339 2 [%C'H'-ctb] = ch_alpha,$; 3340 2 [%C'I'-ctb] = ch_alpha,$; 3341 2 [%C'J'-ctb] = ch_alpha,$; 3342 2 [%C'K'-ctb] = ch_alpha,$; 3343 2 [%C'L'-ctb] = ch_alpha,$; 3344 2 [%C'M'-ctb] = ch_alpha,$; 3345 2 [%C'N'-ctb] = ch_alpha,$; 3346 2 [%C'O'-ctb] = ch_alpha,$; 3347 2 [%C'P'-ctb] = ch_alpha,$; 3348 2 [%C'Q'-ctb] = ch_alpha,$; 3349 2 [%C'R'-ctb] = ch_alpha,$; 3350 2 [%C'S'-ctb] = ch_alpha,$; 3351 2 [%C'T'-ctb] = ch_alpha,$; 3352 2 [%C'U'-ctb] = ch_alpha,$; 3353 2 [%C'V'-ctb] = ch_alpha,$; 3354 2 [%C'W'-ctb] = ch_alpha,$; 3355 2 [%C'X'-ctb] = ch_alpha,$; 3356 2 [%C'Y'-ctb] = ch_alpha,$; 3357 2 [%C'Z'-ctb] = ch_alpha, ; 3358 2 $; 3359 2 [%C'a'-ctb] = ch_lower,$; 3360 2 [%C'b'-ctb] = ch_lower,$; 3361 2 [%C'c'-ctb] = ch_lower,$; 3362 2 [%C'd'-ctb] = ch_lower,$; 3363 2 [%C'e'-ctb] = ch_lower,$; 3364 2 [%C'f'-ctb] = ch_lower,$; 3365 2 [%C'g'-ct00jvvt__DATADATADATADATAb] = ch_lower,$; 3366 2 [%C'h'-ctb] = ch_lower,$; 3367 2 [%C'i'-ctb] = ch_lower,$; 3368 2 [%C'j'-ctb] = ch_lower,$; 3369 2 [%C'k'-ctb] = ch_lower,$; 3370 2 [%C'l'-ctb] = ch_lower,$; 3371 2 [%C'm'-ctb] = ch_lower,$; 3372 2 [%C'n'-ctb] = ch_lower,$; 3373 2 [%C'o'-ctb] = ch_lower,$; 3374 2 [%C'p'-ctb] = ch_lower,$; 3375 2 [%C'q'-ctb] = ch_lower,$; 3376 2 [%C'r'-ctb] = ch_lower,$; 3377 2 [%C's'-ctb] = ch_lower,$; 3378 2 [%C't'-ctb] = ch_lower,$; 3379 2 [%C'u'-ctb] = ch_lower,$; 3380 2 [%C'v'-ctb] = ch_lower,$; 3381 2 [%C'w'-ctb] = ch_lower,$; 3382 2 [%C'x'-ctb] = ch_lower,$; 3383 2 [%C'y'-ctb] = ch_lower,$; 3384 2 [%C'z'-ctb] = ch_lower,; 3385 2 ! numbers"; 3386 2 [%C'0'-ctb] = ch_oct,"; 3387 2 [%C'1'-ctb] = ch_oct,"; 3388 2 [%C'2'-ctb] = ch_oct,"; 3389 2 [%C'3'-ctb] = ch_oct,"; 3390 2 [%C'4'-ctb] = ch_oct,"; 3391 2 [%C'5'-ctb] = ch_oct,"; 3392 2 [%C'6'-ctb] = ch_oct,"; 3393 2 [%C'7'-ctb] = ch_oct,$; 3394 2 [%C'8'-ctb] = ch_8and9,$; 3395 2 [%C'9'-ctb] = ch_8and9,!; 3396 2 ! special characters]%; 3397 2 [%C'$'-ctb] = ch_dollar,=$; 3398 2 [%C'_'-ctb] = ch_under,"; 3399 2 [%C'.'-ctb] = ch_dot,$; 3400 2 [%C','-ctb] = ch_comma,$; 3401 2 [%C':'-ctb] = ch_colon,#; 3402 2 [%C'-'-ctb] = ch_dash,3$; 3403 2 [%C'"'-ctb] = ch_quote,#; 3404 2 [%C'*'-ctb] = ch_wild, #; 3405 2 [%C'%'-ctb] = ch_wild, #; 3406 2 [%C';'-ctb] = ch_misc,[#; 3407 2 [%C'['-ctb] = ch_misc,C"; 3408 2 [%C']'-ctb] = ch_dir,#; 3409 2 [%C'<'-ctb] = ch_misc,!$; 3410 2 [%C'>'-ctb] = ch_dir ); ; 3411 2 ; 3412 2 BUILTIN ; 3413 2 R0;e ; 3414 2 ; 3415 2 R0 = .char - ctb;4 ; 3416 2 !; 3417 2 IF .R0 GEQU cte - ctb:; 3418 2 THEN; 3419 3 BEGINt ; 3420 3 "; 3421 3 SELECTONE .char OF; 3422 3 SET ; 3423 3 ; 3424 3 [0, 9, %C' '] :!; 3425 3 RETURN ch_space;; ; 3426 3 ; 3427 3 [OTHERWISE] :!; 3428 3 RETURN ch_other;-; 3429 3 TES; ; 3430 3 ; 3431 2 END; ; 3432 2 %; 3433 2 RETURN .char_types [.R0]; ; 3434 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 .BYTE 3 .BYTE 166 .BYTE 164 .BYTE 6 .BYTE 17 .BYTE 17  .BYTE 0 .BYTE 10- .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 4 .BYTE 4 .BYTE 4 .BYTE 17Y .BYTE 0 .BYTE 10Y .BYTE 0 .BYTE 15Y .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 .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  .NLIST .ENABL LSBY .LIST CH$CLASSIFY: MOV R1,-(SP) ; 3303 MOV R1,R0 ; CHAR,R0 34154 SUB #42,R0 ; *,R0 CMP R0,#131 ; R0,* 3417. BLO 4$ TST R1 ; CHAR 3424 BEQ 1$1 CMP R1,#11 ; CHAR,*Y BEQ 1$Y CMP R1,#40 ; CHAR,* BNE 2$1$: MOV #2,R1 ; 3421 BR 3$ 2$: CLR R13$: MOV R1,R0 ; 3419 BR 5$-4$: MOVB CHAR.TYPES(R0),R0 ; *(R0),* 3433E5$: MOV (SP)+,R1 ; 3303B RTS PCA8; Routine Size: 25 words, Routine Base: $CODE$ + 10264.; Maximum stack depth per invocation: 2 words .NLIST .DSABL LSB, .NLIST BIN,LOC  .LISTL; 3435 1 %SBTTL 'Copy, upcase, and compress a string and return a status'; 3436 1 GLOBAL_FOR_DEBUGR; 3437 1 ROUTINE ch$copy (len, in_ptr, out_ptr_p; out_ptr) 00rvtibjbkb a a a: ch$copy_l NOVALUE= ; 3438 1 ; 3439 1 !++ ; 3440 1 ! %; 3441 1 ! FUNCTIONAL DESCRIPTION:E ; 3442 1 !0J; 3443 1 ! The input string is copyed to the output string. During the:; 3444 1 ! copy operation it is upcased and compressed. ; 3445 1 !n ; 3446 1 ! FORMAL PARAMETERS: ; 3447 1 !O/; 3448 1 ! len - Length of the input string ,; 3449 1 ! in_ptr - Input buffer pointer/; 3450 1 ! out_ptr_p - Output buffer pointerh ; 3451 1 !pE; 3452 1 ! out_ptr - Points to end of string in the output buffer ; 3453 1 ! ; 3454 1 !-- ; 3455 1 ; 3456 2 BEGIN4 ; 3457 2 ; 3458 2 MAPu5; 3459 2 in_ptr : REF VECTOR [, BYTE, SIGNED], 6; 3460 2 out_ptr : REF VECTOR [, BYTE, SIGNED]; ; 3461 2 ; 3462 2 LOCALO:; 3463 2 state, ! Quote state, zero is unquoted; 3464 2 char; ; 3465 2 F; 3466 2 out_ptr = .out_ptr_p; ! Discard the input parameter now4; 3467 2 state = 0; ! Quote state to unquoted ; 3468 2 ); 3469 2 INCRU i FROM 0 TO .len - 1 DO ; 3470 3 BEGIN $; 3471 3 char = .in_ptr [.i]; ; 3472 3 ; 3473 3 IF .state EQLU 0; 3474 3 THEN; 3475 4 BEGIN ; 3476 4 9; 3477 4 CASE ch$classify (.char) FROM 0 TO ch_max OFO; 3478 4 SET ; 3479 4 ; 3480 4 [ch_other] : ; 3481 4 ; 3482 4 ! ?; 3483 4 ! Characters other than the valid set that aren'tm(; 3484 4 ! quoted won't be upcased.; 3485 4 !t; 3486 5 BEGIN "; 3487 5 out_ptr [0] = .char;$; 3488 5 out_ptr = out_ptr [1];; 3489 4 END; ; 3490 4 ; 3491 4 [ch_quote] :t; 3492 5 BEGIN ; 3493 5 ; 3494 5 ! ?; 3495 5 ! If quote, change the state and output characterx; 3496 5 ! !; 3497 5 state = NOT .state; "; 3498 5 out_ptr [0] = .char;$; 3499 5 out_ptr = out_ptr [1];; 3500 4 END; ; 3501 4 ; 3502 4 [ch_lower] :d ; 3503 4 ; 3504 4 ! (; 3505 4 ! Upcase lowercase letters; 3506 4 !a; 3507 5 BEGIN_*; 3508 5 char = .char AND NOT %O'40';"; 3509 5 out_ptr [0] = .char;$; 3510 5 out_ptr = out_ptr [1];; 3511 4 END; ; 3512 4 ; 3513 4 [ch_space] :a ; 3514 4 ; 3515 4 ! ; 3516 4 ! Remove spacesO; 3517 4 !4; 3518 4 ; ; 3519 4 ; 3520 4 [INRANGE] : ; 3521 4 ; 3522 4 !1'; 3523 4 ! Output valid characters ; 3524 4 !4; 3525 5 BEGIN "; 3526 5 out_ptr [0] = .char;$; 3527 5 out_ptr = out_ptr [1];; 3528 4 END;; 3529 4 TES; ; 3530 4 ; 3531 4 END; 3532 3 ELSE; 3533 4 BEGIN ; 3534 4 ; 3535 4 !2; 3536 4 ! If quoted, output it no matter what; 3537 4 !9; 3538 4 IF .char EQLU %C'"' THEN state = NOT .state; ; 3539 4 !; 3540 4 out_ptr [0] = .char;#; 3541 4 out_ptr = out_ptr [1];5; 3542 3 END;l ; 3543 3 ; 3544 2 END; ; 3545 2 ; 3546 2 ! ?; 3547 2 ! Allow unbalanced quoted strings if there is room. ; 3548 2 !;; 3549 2 IF .state NEQU 0; 3550 2 THEN1; 3551 2 IF (.len + 1) LEQU file_spec_size; 3552 2 THEN; 3553 3 BEGIN!; 3554 3 out_ptr [0] = %C'"';h#; 3555 3 out_ptr = out_ptr [1];c; 3556 2 END; ; 3557 1 END; .NLIST5 .LIST BIN,LOC .LIST? .SBTTL CH$COPY Copy, upcase, and compress a string and return  .NLIST .ENABL LSB .LIST!CH$COPY:MOV R4,-(SP) ; 34376 MOV R5,-(SP)7 TST -(SP) MOV R2,-(SP)e MOV R1,2(SP)e CLR R5 ; STATE 3467 MOV R1,-(SP) ; 3469 DEC (SP)  CLR R4 ; I BR 8$1$: MOV R4,R2 ; I,* 3471 ADD 2(SP),R2  MOVB (R2),R1 ; *,CHAR TST R5 ; STATE 3473' BNE 4$ JSR PC,CH$CLASSIFY ; 3477 ASL R0 # ADD P.AAG(R0),PC ; Case dispatch"3$: BIC #40,R1 ; *,CHAR 3508 BR 6$ ; 3509"4$: CMP R1,#42 ; CHAR,* 3538 BNE 6$.5$: COM R5 ; STATEC*6$: MOVB00zvvt__DATADATADATADATA R1,(R3)+ ; CHAR,OUT.PTR 35407$: INC R4 ; I 34698$: CMP R4,(SP) ; I,* BLOS 1$ TST R5 ; STATE 3549  BEQ 9$9 MOV 4(SP),R1 ; 3551 INC R1 CMP R1,#377 BHI 9$ % MOVB #42,(R3)+ ; *,OUT.PTR 3554 9$: ADD #6,SP ; 3437A MOV (SP)+,R5B MOV (SP)+,R4, RTS PCF8; Routine Size: 48 words, Routine Base: $CODE$ + 10346.; Maximum stack depth per invocation: 7 words .PSECT $PLIT$, RO , D /P.AAG: ; CASE Table for CH$COPY+0050 34772$: .WORD 16 ; [6$] .WORD 0 ; [3$] .WORD 20 ; [7$]  .WORD 16 ; [6$]  .WORD 16 ; [6$]T .WORD 16 ; [6$]3 .WORD 16 ; [6$]4 .WORD 14 ; [5$] .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 .LISTL; 3558 1 %SBTTL 'Convert parse block from kernel virtual to user virtual'; 3559 1 GLOBAL_FOR_DEBUGQ; 3560 1 ROUTINE convert_parse (parse_block, k_virtual, u_virtual) : NOVALUE = ; 3561 1 ; 3562 1 !++1 ; 3563 1 !.%; 3564 1 ! FUNCTIONAL DESCRIPTION: ; 3565 1 !;D; 3566 1 ! Convert parse block address fields from kernel virtual; 3567 1 ! to user virtual. ; 3568 1 ! ; 3569 1 ! FORMAL PARAMETERS: ; 3570 1 !L6; 3571 1 ! parse_block - Address of the parse block?; 3572 1 ! k_virtual - Address of string in executive buffertH; 3573 1 ! u_virtual - Address of corresponding string in user buffer ; 3574 1 !t; 3575 1 !-- ; 3576 1 ; 3577 2 BEGIN2 ; 3578 2 ; 3579 2 MAP5>; 3580 2 parse_block : REF BLOCK FIELD (parse_block_f); ; 3581 2 ; 3582 2 LOCALs; 3583 2 p : REF VECTOR; ; 3584 2 (; 3585 2 p = parse_block [node_addr]; ; 3586 2 6; 3587 2 WHILE .p LEQA parse_block [access_addr] DO; 3588 3 BEGIN2 ; 3589 3 O; 3590 3 IF .p [0] NEQU 0 THEN p [0] = .p [0] - .k_virtual + .u_virtual;c ; 3591 3 ; 3592 3 p = p [2];; 3593 2 END; ; 3594 2 ; 3595 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 ; 3560l( MOV 14(SP),R1 ; PARSE.BLOCK,P 3585 ADD #6,R1 ; *,P_( MOV 14(SP),R2 ; PARSE.BLOCK,* 3587 ADD #42,R291$: CMP R1,R2 ; P,* BHI 3$E TST (R1) ; P 3590. BEQ 2$  MOV (R1),R0 ; P,*1 SUB 12(SP),R0 ; K.VIRTUAL,* ADD 10(SP),R0 ; U.VIRTUAL,* MOV R0,(R1) ; *,P2$: ADD #4,R1 ; *,P 3592 BR 1$ ; 35873$: RTS PC ; 35608; Routine Size: 24 words, Routine Base: $CODE$ + 10506.; Maximum stack depth per invocation: 4 words .NLIST .DSABL LSBV .NLIST BIN,LOCR .LIST1; 3596 1 %SBTTL 'Save parse block and zero it'R; 3597 1 GLOBAL_FOR_DEBUGA; 3598 1 ROUTINE save_parse (out_ptr) : save_parse_l NOVALUE =B ; 3599 1 ; 3600 1 !++ ; 3601 1 ! %; 3602 1 ! FUNCTIONAL DESCRIPTION:R ; 3603 1 !,M; 3604 1 ! Copy the parse block to a specified save area and then zero it. M; 3605 1 ! The operation is done in such a manner that it can be zeroed by 2; 3606 1 ! specifying the output as the scr_pb. ; 3607 1 !V ; 3608 1 ! FORMAL PARAMETERS: ; 3609 1 !L:; 3610 1 ! out_ptr - Address of the output parse block ; 3611 1 ! ; 3612 1 ! IMPLICIT OUTPUTS:v ; 3613 1 !U"; 3614 1 ! Scratch parse block. ; 3615 1 ! ; 3616 1 !--U ; 3617 1 ; 3618 2 BEGIN ; 3619 2 ; 3620 2 LOCALe$; 3621 2 in_ptr : REF VECTOR; ; 3622 2 ; 3623 2 MAP %; 3624 2 out_ptr : REF VECTOR; ; 3625 2 ; 3626 2 in_ptr = scr_pb; ; 3627 2 0; 3628 2 DECR i FROM parse_block_size TO 1 DO; 3629 3 BEGIN9*; 3630 3 out_ptr [0] = .in_ptr [0];&; 3631 3 out_ptr = out_ptr [1];; 3632 3 in_ptr [0] = 0;$; 3633 3 in_ptr = in_ptr [100vtibjbkb a a a];; 3634 2 END; ; 3635 2 ; 3636 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 3626 MOV #23,R0 ; *,I 3628p,1$: MOV (R2),(R1)+ ; IN.PTR,OUT.PTR 3630 CLR (R2)+ ; IN.PTR 3632 SOB R0,1$ ; I,* 3628 RTS PC ; 3598 7; Routine Size: 8 words, Routine Base: $CODE$ + 105666.; Maximum stack depth per invocation: 0 words .NLISTt .DSABL LSB6 .NLIST BIN,LOC  .LIST,; 3637 1 %SBTTL 'Find Equivalence String'q; 3638 1 ROUTINE find_something (logical_addr, logical_len ; equiv_addr, equiv_len) : find_equivalence_l =B ; 3639 1 ; 3640 1 !++# ; 3641 1 ! %; 3642 1 ! FUNCTIONAL DESCRIPTION:, ; 3643 1 !M; 3644 1 ! Find the equivalence string for the input logical name. Return3S; 3645 1 ! status. If the input logical name starts with an '_' then return thet=; 3646 1 ! string less the '_' and the status of terminal., ; 3647 1 ! ; 3648 1 ! FORMAL PARAMETERS: ; 3649 1 ! 9; 3650 1 ! logical_addr - Address of the logical name_?; 3651 1 ! logical_len - Length of the logical name in bytes ; 3652 1 !+<; 3653 1 ! equiv_addr - Address of the equivalence string:; 3654 1 ! equiv_len - Length of the equivalence string ; 3655 1 !a; 3656 1 ! ROUTINE VALUE: ; 3657 1 !h); 3658 1 ! success, terminal, or errorn ; 3659 1 ! ; 3660 1 !--g ; 3661 1 ; 3662 2 BEGIN ; 3663 2 ; 3664 2 !:; 3665 2 ! Define the LNB fields used in this routine.; 3666 2 !; 3667 2 FIELD; 3668 2 lnb_f =; 3669 2 SEToB; 3670 2 logical_link = [0, 0, 16, 0], ! Link to the next lnbB; 3671 2 logical_table = [1, 0, 8, 0], ! Logical table numberD; 3672 2 logical_type = [1, 8, 8, 0], ! Logical name block typeB; 3673 2 logical_status = [2, 0, 8, 0], ! Logical name statusH; 3674 2 terminal_logical = [2, 0, 1, 0],! Set for terminal logicalI; 3675 2 creator_group_number = [2, 8, 8, 0], ! Creator group numbero?; 3676 2 creator_ucb = [3, 0, 16, 0], ! Creator UCB (user)f?; 3677 2 creator_tcb = [3, 0, 16, 0], ! Creator TCB (task)]K; 3678 2 logical_length = [4, 0, 8, 0], ! Logical name length in bytesaO; 3679 2 equivalence_length = [4, 8, 8, 0], ! 32 word block offset of baseyH; 3680 2 logical_name_start = [5, 0, 16, 0] ! Start of logical name; 3681 2 TES; ; 3682 2 ; 3683 2 LITERAL@; 3684 2 lnb_size = 5; ! Size of the fixed part of the ; 3685 2 ! LNB in words ; 3686 2 ; 3687 2 LOCALE; 3688 2 logical_descriptor : BLOCK [logical_descriptor_size]eL; 3689 2 FIELD (logical_descriptor_f), ! Logical name descriptor block<; 3690 2 lnb_base, ! Base physical address of LNBF; 3691 2 lookup_len; ! The length that we actually look up ; 3692 2 ; 3693 2 OWN8; 3694 2 log_buf : VECTOR [ logical_size, BYTE]; ; 3695 2 ; 3696 2 BIND g; 3697 2 lnb = apr6_v : BLOCK [lnb_size] FIELD (lnb_f); ! Logical name descriptor block address ; 3698 2 ; 3699 2 LABEL; 3700 2 zero_compress;e; 3701 2 !K; 3702 2 ! Check for an underscore. If there is one return the logical L; 3703 2 ! name less the underscore as the equivalence string along with&; 3704 2 ! the status of terminal.; 3705 2 !#; 3706 2 IF .logical_len GEQU 1l; 3707 2 THENo; 3708 3 BEGIN4; 3709 3 IF .(.logical_addr)<0,8> EQLU %C'_'8; 3710 3 THEN IF .logical_len EQLU 1 !PKW111+; 3711 3 THEN RETURN error !PKW1119 ; 3712 3 ELSE !PKW111; 3713 4 BEGIN0; 3714 4 equiv_addr = .logical_addr + 1;.; 3715 4 equiv_len = .logical_len - 1;!; 3716 4 RETURN terminal;v; 3717 3 END;h ; 3718 3 D; 3719 3 ! Unfortunately it is possible to call this routineE; 3720 3 ! specifying that a lun00vvt__DATADATADATADATA is not to be assigned. That F; 3721 3 ! means that the zero compression method of assigningC; 3722 3 ! the lun and then doing a GLUN won't always work.H; 3723 3 ! So we have to do the zero compression by hand. GACK.H; 3724 3 ! We also need to strip off any colons before we do theL; 3725 3 ! lookup. Note that zero compression is only done if thereB; 3726 3 ! is exactly one colon on the end of the logical. ; 3727 3 P; 3728 3 ch$copy (.logical_len, .logical_addr, log_buf [0]; lookup_len);8; 3729 3 lookup_len = .lookup_len - log_buf [0];9; 3730 3 IF .log_buf [.lookup_len - 1] EQLU %C':'o; 3731 3 THEN!; 3732 4 BEGIN +; 3733 4 lookup_len = .lookup_len - 1; T; 3734 4 IF .log_buf [.lookup_len - 1] EQLU %C':' ! If two colons it's a node/; 3735 4 THEN lookup_len = .lookup_len - 1e; 3736 4 ELSE ; 3737 4 zero_compress:; 3738 5 BEGIN7; 3739 5 MACRO$; 3740 5 !N; 3741 5 ! NEXT_CHAR gets the next character and returns true if success; 3742 5 !; M 3743 5 next_char =; M 3744 5 BEGIN'; M 3745 5 char = .(.ptr)<0, 8, 1>; ; M 3746 5 ptr = .ptr + 1;!; M 3747 5 .ptr LEQA .end_ptr ; 3748 5 END %;. ; 3749 5 ; 3750 5 REGISTER; 3751 5 char; ; 3752 5 ; 3753 5 LOCAL ; 3754 5 ptr,E; 3755 5 end_ptr,c; 3756 5 zero_count,; 3757 5 status,; 3758 5 i; ; 3759 5 7; 3760 5 ptr = log_buf [0]; ! Start of scant/; 3761 5 end_ptr = .ptr + .lookup_len;n ; 3762 5 g; 3763 5 IF NOT next_char THEN LEAVE zero_compress; ! The first two characters must be letters /; 3764 5 status = ch$classify (.char); H; 3765 6 IF (.status NEQU ch_alpha) AND (.status NEQU ch_lower)+; 3766 5 THEN LEAVE zero_compress;rg; 3767 5 IF NOT next_char THEN LEAVE zero_compress; ! The first two characters must be letters /; 3768 5 status = ch$classify (.char); H; 3769 6 IF (.status NEQU ch_alpha) AND (.status NEQU ch_lower)+; 3770 5 THEN LEAVE zero_compress;E!; 3771 5 zero_count = 0;t<; 3772 5 WHILE next_char DO ! Now look for zeros#; 3773 5 IF .char EQLU %C'0' .; 3774 5 THEN zero_count = .zero_count+1; 3775 5 ELSE EXITLOOP;LX; 3776 5 IF .zero_count EQLU 0 THEN LEAVE zero_compress; ! If none, then leave.P; 3777 5 IF .ptr GTRU .end_ptr THEN ! If no following characters,:; 3778 6 BEGIN ! Then just lop off the zeros6; 3779 6 lookup_len = .lookup_len - .zero_count;#; 3780 6 LEAVE zero_compress;t; 3781 5 END; 5; 3782 5 DO ! Now look for octal digits32; 3783 5 IF ch$classify (.char) NEQU ch_oct ?; 3784 5 THEN LEAVE zero_compress ! Anything else, exit6"; 3785 5 WHILE next_char;A; 3786 5 ptr = log_buf [2]; ! Now chop out the zeros.6; 3787 5 end_ptr = log_buf [2] + .zero_count;9; 3788 5 lookup_len = .lookup_len - .zero_count;r7; 3789 5 DECR i FROM (.lookup_len - 2) TO 0 DO;; 3790 6 BEGIN6; 3791 6 (.ptr)<0, 8, 1> = .(.end_ptr)<0, 8, 1>;; 3792 6 ptr = .ptr + 1;&; 3793 6 end_ptr = .end_ptr + 1;; 3794 5 END; ; 3795 4 END;; 3796 3 END; ; 3797 3 ; 3798 3 !C; 3799 3 ! Settup the input logical name length and addresscD; 3800 3 ! in the logical descriptor block. Then attempt toE; 3801 3 ! do the translation. The block_type, table_number,7H; 3802 3 ! address_base, matching_tcb_ucb fields and $TONYL were0; 3803 3 ! settup during initialization.; 3804 3 ! ; 3805 3 ;; 3806 3 logical_descriptor [length] = .lookup_len;DZ; 3807 3 logical_descriptor [address_disp_apr6] = log_buf [0] + (apr6_v - apr5_v);I; 3808 3 $TONYL = .saved_inhibit_mask; ! Settup the inhibit mask Y; 00vtibjbkb a a a 3809 3 logical_descriptor [block_type] = .init_logical_descriptor [block_type];.]; 3810 3 logical_descriptor [table_number] = .init_logical_descriptor [table_number];$]; 3811 3 logical_descriptor [address_base] = .init_logical_descriptor [address_base];e; 3812 3 logical_descriptor [matching_tcb_ucb] = .init_logical_descriptor [matching_tcb_ucb];e ; 3813 3 O; 3814 3 IF TBSRC_BLI (logical_descriptor; lnb_base) THEN RETURN error;; ; 3815 3 C; 3816 3 KISAR6 = .lnb_base; ! Map the logical name blocknK; 3817 3 equiv_len = .lnb [equivalence_length]; ! Return the lengthb ; 3818 3 ; 3819 3 !T; 3820 3 ! The equivalence string follows the logical name string in the lnb; 3821 3 !O; 3822 3 equiv_addr = lnb [logical_name_start] + .lnb [logical_length];l ; 3823 3 ; 3824 3 !,; 3825 3 ! Return terminal if it is.; 3826 3 !N; 3827 3 RETURN IF .lnb [terminal_logical] THEN terminal ELSE success; ; 3828 3 ; 3829 3 END; 3830 2 ELSEv8; 3831 2 RETURN error; ! No logical comming in7; 3832 1 END; ! End of routine find_equivalenceu .NLISTs .LIST BIN,LOC .LIST .PSECT $OWN$, D  .EVENLOG.BUF:.BLKB 3772LNB= -400000 .SBTTL FIND.EQUIVALENCE Find Equivalence String .PSECT $CODE$, RO  .NLIST .ENABL LSB  .LISTFIND.EQUIVALENCE:. MOV R3,-(SP) ; 3638 MOV R4,-(SP)R MOV R5,-(SP)i SUB #16,SPT MOV R2,R4 ; *,LOGICAL.LEN  MOV R1,R0 ; *,LOGICAL.ADDR TST R4 ; LOGICAL.LEN 3706 BNE 1$  JMP 15$,1$: CMPB (R0),#137 ; LOGICAL.ADDR,* 3709 BNE 4$r% CMP R4,#1 ; LOGICAL.LEN,* 3710I BNE 2$C CLR R1 ; 3713O BR 3$)2$: MOV #1,(SP) ; *,EQUIV.ADDR 3714 ) ADD R0,(SP) ; LOGICAL.ADDR,EQUIV.ADDR . MOV R4,2(SP) ; LOGICAL.LEN,EQUIV.LEN 3715 DEC 2(SP) ; EQUIV.LEN MOV #3,R1 ; 37133$: MOV R1,R0 ; 3710, BR 14$M(4$: MOV R4,R1 ; LOGICAL.LEN,* 3728 MOV R0,R2 ; LOGICAL.ADDR,* MOV #LOG.BUF,R3 JSR PC,CH$COPYC) SUB #LOG.BUF,R3 ; *,LOOKUP.LEN 3729B1 CMPB LOG.BUF-1(R3),#72 ; *(LOOKUP.LEN),* 3730P BNE 12$ DEC R3 ; LOOKUP.LEN 3733C1 CMPB LOG.BUF-1(R3),#72 ; *(LOOKUP.LEN),* 3734  BNE 5$V DEC R3 ; LOOKUP.LEN 3735  BR 12$ ; 3734 &5$: MOV #LOG.BUF,R2 ; *,PTR 3760) MOV R3,R5 ; LOOKUP.LEN,END.PTR 3761# ADD R2,R5 ; PTR,END.PTR1# MOVB (R2)+,R1 ; PTR,CHAR 3763  CMP R2,R5 ; PTR,END.PTR7 BHI 12$ JSR PC,CH$CLASSIFY ; 3764 CMP R0,#4 ; STATUS,* 3765 BEQ 6$3 CMP R0,#1 ; STATUS,* BNE 12$ ; 3766&6$: MOVB (R2)+,R1 ; PTR,CHAR 3767 CMP R2,R5 ; PTR,END.PTR3 BHI 12$ JSR PC,CH$CLASSIFY ; 3768 CMP R0,#4 ; STATUS,* 3769 BEQ 7$E CMP R0,#1 ; STATUS,* BNE 12$ ; 3770"7$: CLR R4 ; ZERO.COUNT 3771&8$: MOVB (R2)+,R1 ; PTR,CHAR 3772 CMP R2,R5 ; PTR,END.PTR  BHI 9$  CMP R1,#60 ; CHAR,* 3773  BNE 9$N INC R4 ; ZERO.COUNT 3774S BR 8$ ; 3773"9$: TST R4 ; ZERO.COUNT 3776 BEQ 12$# CMP R2,R5 ; PTR,END.PTR 3777 BLOS 10$O, SUB R4,R3 ; ZERO.COUNT,LOOKUP.LEN 3779 BR 12$ ; 37781$10$: JSR PC,CH$CLASSIFY ; 3783 CMP R0,#3 BNE 12$ ; 3784# MOVB (R2)+,R1 ; PTR,CHAR 3785E CMP R2,R5 ; PTR,END.PTR4 BLOS 10$C% MOV #LOG.BUF+2,R2 ; *,PTR 3786,) MOV R4,R5 ; ZERO.COUNT,END.PTR 3787! ADD R2,R5 ; LOG.BUF+2,END.PTR , SUB R4,R3 ; ZERO.COUNT,LOOKUP.LEN 3788$ MOV R3,R0 ; LOOKUP.LEN,I 3789 SUB #2,R0 ; *,I7 BLT 12$-11$: MOVB (R5)+,(R2)+ ; END.PTR,PTR 3791  DEC R0 ; I 3789O BGE 11$612$: MOV R3,4(SP) ; LOOKUP.LEN,LOGICAL.DESCRIP 38068 MOV #LOG.BUF+20000,10(SP) ; *,LOGICAL.DESCRIP+4 3807) MOV SAVED.INHIBIT.MASK,$TONYL ; 3808RB MOVB INIT.LOGICAL.DESCRIPTOR+7,13(SP); *,LOGICAL.DESCRIP+6 3809B MOVB INIT.LOGICAL.DESCRIPTOR+6,12(SP); *,LOGICAL.DESCRIP+6 3810A MOV INIT.LOGICAL.DESCRIPTOR+200vvt__DATADATADATADATA,6(SP) ; *,LOGICAL.DESCRIP+2 3811M) MOV INIT.LOGICAL.DESCRIPTOR+10,14(SP) ; ,# ; *,LOGICAL.DESCRIP+10 3812) MOV #4,R0 ; 3814! ADD SP,R0 ; LOGICAL.DESCRIP,*B JSR PC,TBSRC.BLI, BLO 15$% MOV R3,KISAR6 ; LNB.BASE,* 3816#! CLR 2(SP) ; EQUIV.LEN 3817E$ MOVB @#140011,2(SP) ; *,EQUIV.LEN! CLR (SP) ; EQUIV.ADDR 3822G$ MOVB @#140010,(SP) ; *,EQUIV.ADDR! SUB #37766,(SP) ; *,EQUIV.ADDRD BIT #1,@#140004 ; 3827E BEQ 13$ MOV #3,R0 BR 16$A13$: MOV #1,R014$: BR 16$ ; 3831 15$: CLR R0 ; 3638E!16$: MOV 2(SP),R2 ; EQUIV.LEN,*O MOV (SP)+,R1 ; EQUIV.ADDR,* ADD #14,SP MOV (SP)+,R50 MOV (SP)+,R4E MOV (SP)+,R3P RTS PCL9; Routine Size: 168 words, Routine Base: $CODE$ + 10606S/; Maximum stack depth per invocation: 13 words  .NLISTV .DSABL LSBP .NLIST BIN,LOC  .LIST+; 3833 1 %SBTTL 'Convert RAD50 to ASCII'6z; 3834 1 ROUTINE RAD50_to_ASCII (ascii_len, ascii_addr, rad50_addr; return_ascii_addr) : RAD50_to_ASCII_l NOVALUE = ; 3835 1 ; 3836 1 !++3 ; 3837 1 !2%; 3838 1 ! FUNCTIONAL DESCRIPTION: ; 3839 1 !*K; 3840 1 ! Convert a RAD50 string to ASCII. Trailing blanks suppressed. ; 3841 1 !1; 3842 1 !-- ; 3843 2 BEGIN; 3844 2 MAP -; 3845 2 ascii_addr : REF VECTOR [,BYTE],S4; 3846 2 return_ascii_addr : REF VECTOR [,BYTE],%; 3847 2 rad50_addr : REF VECTOR; ; 3848 2 ; 3849 2 LOCALa4; 3850 2 t : VECTOR [2], ! Temporary for divide; 3851 2 char,; 3852 2 control; ; 3853 2 3; 3854 2 return_ascii_addr = ascii_addr [0];8 ; 3855 2 ; 3856 2 ! 3; 3857 2 ! Move the string to output buffer.; 3858 2 ! 2; 3859 2 control = 0; ! Initialize control ; 3860 2 .; 3861 2 DECR i FROM .ascii_len TO 1 DO; 3862 3 BEGIN; 3863 3 BUILTIN; 3864 3 EDIV; ; 3865 3 ; 3866 3 IF .control EQL 0; 3867 3 THEN8; 3868 4 BEGIN; 3869 4 t [1] = 0;8); 3870 4 t [0] = .rad50_addr [0];8-; 3871 4 rad50_addr = rad50_addr [1];i!; 3872 4 control = 40*40;6; 3873 3 END; ; 3874 3 0; 3875 3 IF .t [0] GTRU (39*40 + 39)*40 + 39; 3876 3 THENo; 3877 3 char = '?'; 3878 3 ELSE8; 3879 4 BEGIN0; 3880 4 EDIV (control, t, char, t [0]); ; 3881 4 $; 3882 4 SELECTONEU .char OF; 3883 4 SETl ; 3884 4 ; 3885 4 [0] :8; 3886 4 EXITLOOP; ; 3887 4 ; 3888 4 [1 TO 26] :.+; 3889 4 char = .char + %C'A' - 1; ; 3890 4 ; 3891 4 [27] :,; 3892 4 char = .char + %C'$' - 27; ; 3893 4 ; 3894 4 [28] :,; 3895 4 char = .char + %C'.' - 28; ; 3896 4 ; 3897 4 [29] :,; 3898 4 char = .char + %C'?' - 29; ; 3899 4 ; 3900 4 [OTHERWISE] : ,; 3901 4 char = .char + %C'0' - 30;; 3902 4 TES;; 3903 3 END;8 ; 3904 3 +; 3905 3 return_ascii_addr [0] = .char;7; 3906 3 return_ascii_addr = return_ascii_addr [1];r#; 3907 3 control = .control/40;1; 3908 2 END; ! DECR ; 3909 2 ); 3910 1 END; ! RAD50_to_ASCII  .NLIST  .LIST BIN,LOC .LIST- .SBTTL RAD50.TO.ASCII Convert RAD50 to ASCII2 .NLIST .ENABL LSB  .LISTRAD50.TO.ASCII:; MOV R1,-(SP) ; 3834 MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP)r CMP -(SP),-(SP) CLR R5 ; CONTROL 3859% MOV R1,-(SP) ; ASCII.LEN,I 3861r BLE 8$i1$: TST R5 ; CONTROL 3866  BNE 2$s CLR 4(SP) ; T+2 3869) MOV (R3)+,2(SP) ; RAD50.ADDR,T 3870# MOV #3100,R5 ; *,CONTROL 38729&2$: CMP 2(SP),#174777 ; T,* 3875 BLOS 3$ MOV #77,R4 ; *,CHAR 3877 BR 7$ ; 3875!3$: MOV 2(SP),R1 ; T,* 3880  MOV 4(SP),R0 ; T,* DIV R5,R0 ; CONTROL,*( MOV R0,R4 ; *,CHAR MOV R1,2(SP) ; *,T  TST R4 ; CHAR 3885 BEQ 8$ ; 3886N CMP R4,#32 ; CHAR,* 3888S BHI 4$ ADD #100,R4 ; *,00vtibjbkb a a aCHAR 3889 BR 7$ ; 3882"4$: CMP R4,#33 ; CHAR,* 3891 BNE 5$3 ADD #11,R4 ; *,CHAR 3892 BR 7$ ; 3882"5$: CMP R4,#34 ; CHAR,* 3894 BEQ 6$ ; 3895B CMP R4,#35 ; CHAR,* 3897  BNE 6$B ADD #42,R4 ; *,CHAR 3898, BR 7$ ; 3882"6$: ADD #22,R4 ; *,CHAR 390117$: MOVB R4,(R2)+ ; CHAR,RETURN.ASCII.AD 3905P! MOV R5,R1 ; CONTROL,* 39078 SXT R08 DIV #50,R08 MOV R0,R5 ; *,CONTROL  DEC (SP) ; I 38610 BNE 1$ 8$: ADD #6,SP ; 3834 MOV (SP)+,R5 MOV (SP)+,R4R MOV (SP)+,R3E MOV (SP)+,R1R RTS PCC8; Routine Size: 71 words, Routine Base: $CODE$ + 11326/; Maximum stack depth per invocation: 11 words  .NLIST .DSABL LSBE .NLIST BIN,LOC  .LIST ; 3911 1 (; 3912 1 END ! End of module ; 3913 1 ; 3914 0 ELUDOM .NLISTR .LIST BIN,LOC .LIST; OTS external references .GLOBL $SAVE5, $SAVE3, $SAVE2 .PSECT $OWN$, D ( .EVEN; PSECT SUMMARY ;$!; Psect Name Words ; AttributesP1; $OWN$ 747 ; RW , D , LCL, REL, CONR2; $CODE$ 2482 ; RO , I , LCL, REL, CON2; $PLIT$ 100 ; RO , D , LCL, REL, CON; Library StatisticsS; 9; -------- Symbols -------- Pages Processing 9; File Total Loaded Percent Mapped TimeL;M\; SYS$COMMON:[SYSLIB]RSX11M.L16;1 1554 5 0 99 00:00.3[; SYS$COMMON:[SYSLIB]FCS11.L16;1 396 32 8 42 00:00.2i; Compilation Complete , .SBTTL Assign the LUN;EB; This routine is called to assign the LUN. This is a duplication;; of the code in DRASG. DRASG should be moved into the 4th3; directive common so that this code may be common.o;s; #; R3=ADDRESS OF THE LUN IN THE DPB.r/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.],; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; R0=Device name; R1=Unit number; R2=Terminal logical flag;3?; Outputs: The address of a routine to call to return status iso; returned in R0;,&; 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 address 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 C00vvt__DATADATADATADATAMPB 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 R2,-(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! ;(0XXBIAS: .WORD 0 ;XX DRIVER BIAS AND RETURN ADDRESS FOR RETURN*XXALRT: .WORD 0 ;FROM A FAILED ALLOCATION; ; LOCAL DATA;L;****TEMPORARY TPR1=2+ TPR2=4+ TPR3=6+ KXCSRD=177530 KXCSRF=00vvt__DATADATADATADATA177534 KXJQIR=177532;****TEMPORARY<RNGBAS: .WORD 0 ;APR BIAS OF RINGS (ALSO OF BASE OF CPRBUF)=CSR: .WORD 0 ;WE SAVE THE CSR - WE DON'T HAVE IT WHEN CALLEDR6SNDRNG: .WORD 140000 ;CURRENT RSX TO VMS RING ADDRESS2PRVSND: .WORD 0 ;PREVIOUS RSX TO VMS RING ADDRESS4FRSTSN: .WORD 140000 ;FIRST RSX TO VMS RING ADDRESS6WRAPSN: .WORD 0 ;ADDRESS JUST PAST RSX TO VMS RINGS - ;INDICATES WRAPL1RCVRNG: .WORD 0 ;CURRENT VMS TO RSX RING ADDRESS=2PRVRCV: .WORD 0 ;PREVIOUS VMS TO RSX RING ADDRESS/FRSTRC: .WORD 0 ;FIRST VMS TO RSX RING ADDRESSR6WRAPRC: .WORD 0 ;ADDRESS JUST PAST VMS TO RSX RINGS - ;INDICATES WRAPE9BUFFWT: .WORD 0 ;COUNT OF TASKS WAITING FOR BUFFER SPACE 0MAXBUF: .WORD 0 ;MAXIMUM CPRBUF ALLOCATION SIZE,TOPRSX: .WORD 0 ;END OF RSX CONTROLLED AREA*XXWAIT: .WORD 0 ;XX DRIVER WAIT FLAG WORD"XXR5: .WORD 0 ;XX DRIVER SAVED R5.XXUCB: .WORD 0 ;XX DRIVER GENERIC UCB ADDRESS6XXNET: .WORD 0 ;XX DRIVER GENERIC NETWORK UCB ADDRESS-UNITBL: .BLKW 128. ;MAKE SURE WE HAVE ENOUGHC;W; DRIVER DISPATCH TABLER; D DDT$ KX,1,,,,NEW=Y ;GENERATE DISPATCH TABLE - ALWAYS ONE CONTROLLER .PAGE1 .SBTTL KXKRB - CONTROLLER INITIALIZATION ROUTINER;F+; KXKRB - CONTROLLER INITIALZATION ROUTINE.A;CF; THIS ROUTINE ASSUMES THAT THE TOP FOUR WORDS OF PHYSICAL MEMORY HAVE(; BEEN SET UP WITH THE FOLLOWING VALUES:;;<; +-------------------------------------------------------+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 +-------------------------------------------------------+-;-; FOR THE KXJ CASE:-;-:; THIS ROUTINE SENDS AN INTERRUPT TO VMS NOTIFYING IT THATC; 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.;-H; THE FIFTH WORD FROM THE TOP OF SHARED MEMORY IS SET UP AS THE APR BIASH; OF THE BASE OF CURRENTLY SHARED MEMORY, WHICH VMS USES TO CHECK ACCESS;S; INPUTS;S; R4 = DCB ADDRESS; R3 = CTB ADDRESS; R2 = KRB ADDRESS1; 0(SP) = RETURN ADDRESS FOR IMMEDIATE COMPLETION3; 2(SP) = RETURN ADDRESS FOR CALLER OF EXEC ROUTINE (; C = 1 TRANSITION TO OFF-LINE REQUESTED'; C = 0 TRANSITION TO ON-LINE REQUESTEDV=; SUCCESS ASSUMED, $SCERR FILLED IN WITH ERROR CODE IF NEEDEDNKXKRB::  BCC 1$ ;IF CC ONLINE REQUEST + MOVB #IE.DNR,$SCERR ;SET DEVICE NOT READYA RETURN 1$: MOV #128.,R0 ; NUMBER OF UNITS MOV #UNITBL,R1 ; UNIT TABLE "2$: CLR (R1)+ ; CLEAR UNIT TABLE SOB R0,2$ ; ALL WORDS$ MOV K.CSR(R2),R4 ; NOW GET THE CSR3 MOV R4,CSR ; SAVE THE CSR-WE DON'T HAVE IT LATERN= MOV @#KISAR5,$KXBAS ; SAVE DRIVER BASE ADDRESS FOR THE EXEC-;RK;The following commented out lines enable buffering within the CPR packet. O;This code is disabled by the CLR instruction. There is a bug in the buffering O;somewhere, such that buffered writes copy the data into another random portionNO;of RSX memory. Since there is little if any performance improvement gained byEP;the buffering in the KXJ case (it was originally written for the network case),$;the code is simply 00vvibjbkb a a abeing disabled. ;V, CLR $CPMXB ; DISABLE CPR PACKET BUFFERING+; MOV #512.,$CPMXB ; ASSUME NETWORK SYSTEMo8; BIT #F5.NRT,$FMSK5 ; IS THIS A REMOTE NETWORK SYSTEM?; BNE 15$ ; IF NE, YES0; MOV #128.,$CPMXB ; CATCH TERMINAL QIOS ANYWAY;m@; FIRST TELL VMS THAT THE TOP FOUR WORD HAVE BEEN SET UP, AND IT; CAN INITIALIZE ITS POINTERSn9 BIS #10010,@#KXCSRD ; ENABLE INTERRUPTS TO AND FROM VMS< MOV #RI$RIN,TPR2(R4) ; INDICATE THAT THIS IS A SYNC REQUEST MOV $KXVC1,R0 ; GET THE VECTOR+ ADD #4,R0 ; WE WANT THE ALTERNATE VECTORI9 MOV R0,@#KXJQIR ; INTERRUPT VMS AT THE ALTERNATE VECTORT010$: TST TPR2(R4) ; HAS VMS RECEIVED INTERRUPT? BNE 10$ ; IF NE NO ; ; NOW SET UP THE BUFFER AREAS,;M15$:- MOV $SYSIZ,@#KISAR6 ; GET THE END OF MEMORYS" DEC @#KISAR6 ; BACK UP ONE BLOCK, MOV $SYSIZ,RNGBAS ; GET THE SIZE OF MEMORY MOV #140100,R4 ; TOP OF MEMORY9 SUB -(R4),RNGBAS ; SUBTRACT THE # OF BLOCKS TO GET BASEE. MOV -(R4),R2 ; # OF RSX -> VMS COMMAND RINGS. MOV -(R4),R1 ; # OF VMS -> RSX COMMAND RINGS4 MOV -(R4),R0 ; SIZE OF RSX CONTROLLED BUFFER SPACE3 MOV R0,MAXBUF ; SAVE SIZE OF RSX CONTROLLED SPACEI/ MOV RNGBAS,@#KISAR6 ; NOW MAP CPRBUF IN APR 6 6 MOV #140000,R4 ; VIRTUAL ADDRESS TO ACCESS THE RINGS; ; INITIALIZE THE RING POINTERS;R220$: 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,20$ ; LOOP FOR ALL THE RINGS7 MOV R4,WRAPSN ; THIS IS THE WRAP VALUE FOR THE RINGS,R5 MOV R4,FRSTRC ; THE BEGINNING OF THE RECEIVE RINGS,E. MOV R4,RCVRNG ; AND THE CURRENT RECEIVE RING330$: 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,30$ ; 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 RNGBAS,TOPRSX ; COPY RING BASE TO TOPRSX# ADD R4,TOPRSX ; ADD THE RING AREAG6 ADD R0,TOPRSX ; AND THE SIZE OF RSX CONTROLLED SPACE1 DEC TOPRSX ; BACK OFF ONE SO SUBTRACTION WORKSI. MOV @#KISAR6,$CPRBF ; SET UP BUFFER LISTHEAD# CLR 140000 ; CLEAR THE LINK WORDO2 MOV R0,140002 ; PUT # OF BLOCKS INTO SECOND WORD RETURN ; CONTROLLER IS READY .PAGE' .SBTTL KXUCB - UNIT ONLINE ENTRY POINTN;O&; ** - KXUCB - UNIT ONLINE ENTRY POINT;IE; THE ONLY THING THAT THIS ROUTINE DOES IS TO SET UP K.OWN IN THE KRBO;R ; INPUTS: ;R$; R3=CONTROLLER INDEX (S.KRB .NE. 0); R4=ADDRESS OF SCB ; R5=ADDRESS OF UCBO(; C = 1 TRANSITION TO OFF-LINE REQUESTED'; C = 0 TRANSITION TO ON-LINE REQUESTEDC;F ; OUTPUTS:;E; K.OWN SET UP IN KRB ; KXUCB:: BCC 10$ ;IF CC ONLINE REQUEST+ MOVB #IE.DNR,$SCERR ;SET DEVICE NOT READYN RETURNS10$:% MOV S.KRB(R4),R2 ;RETRIEVE KRB ADDR ; MOV R5,K.OWN(R2) ;MARK THIS UNIT AS OWNING THE CONTROLLER RETURNY .PAGE* .SBTTL $KXINT - INTERRUPT SERVICE ROUTINE;R); ** - $KXINT - INTERRUPT SERVICE ROUTINEE;S7; WE CAN GET INTERRUPTED BY VMS FOR ONE OF TWO REASONS:; ;; 1) OUR SEND RING HAS TRANSITIONED FROM NOT EMPTY TO EMPTYN;N>; 2) OUR RECEIVE RING HAS TRANSITIONED FROM EMPTY TO NOT EMPTY;:); WE CHECK BOTH CASES FOR EVERY INTERRUPT ;.;, .ENABLE LSB2CPRRCV: ;ENTRY POINT IF POOL BECOMES AVAILABLE" SAVNR ;SAVE VOLATILE REGISTERS BR 5$ ;CONTINUE IN COMMON$KXINT::) INTSV$ KX,PR5,1 ;;;INTERRUPT SAVE MACRO- ;;;R5 = UCB ADDRESS6 MOV U.SCB(R5),R4 ;;;POINT TO CONTROLLER STATUS BLOCK' TST S.FRK+2(R4) ;;;FORK BLOCK IN USE?T& BEQ 2$ ;;;IF EQ, NO, FORK THIS TIME RETURN ;;;RETURN)2$: CALL $FORK ;;;CREATE SYSTEM PROCESSA9 CLR S.FRK+2(R4) ;FREE FORK BLOCK FOR FURTHER INTERRUPTS '5$: MOV #140000,R3 ;GET A BASE ADDRESSB$ MOV RNGBAS,@#KISAR6 ;MAP THE RINGS2 MOV RCVRNG,R2 ;GET THE CURRENT RECEIVE RING BASE2 TST (R2) ;DO WE HAVE A RECEIVE RING TO PROCESS?1 BPL 60$ ;NO, ALL DONE. SEE IF ANY PACK00vvt__DATADATADATADATAETS AREU ;WAITING TO BE SENT.R;;"; WE HAVE AN INPUT RING TO PROCESS;T0 MOV R$ADDR(R2),@#KISAR6 ;MAP THE HEADER IN APR6, BIT #HF$RSP,H$FLAG(R3) ;IS THIS A RESPONSE? BNE 10$ ;YES, PROCESS ITA1 CALL VMSINI ;COMMANDS HAVE SEPARATE PROCESSINGO BR 20$ ;CONTINUE IN COMMON *10$: MOV @#KISAR6,R0 ;GET THE PACKET BIAS$ MOV #$CPOUT,R1 ;GET QUEUE LISTHEAD& CALL SENRSP ;SEND BACK THE RESPONSE$20$: BCC 40$ ;IF SUCCESS, CONTINUE/30$: RETURN ;WE'LL BE CALLED LATER AT CPRRCVE*40$: MOV RNGBAS,@#KISAR6 ;REMAP THE RINGS- CLR @RCVRNG ;WE'RE DONE WITH THIS RING NOW;V;INTERRUPT IF NECESSARY ; $ TST @PRVRCV ;SHOULD WE INTERRUPT? BPL 50$ ;NO, JUST CONTINUE$6 BIT #F5.NRT,$FMSK5 ;IS THIS A REMOTE NETWORK SYSTEM?2 BNE 45$ ;IF NE YES, DON'T DO KXJ SPECIFIC STUFF( MOV $KXVC1,@#KXJQIR ;INTERRUPT THE VAX BR 50$ ;CONTINUE IN COMMONT(45$: MOV $ACTHD,R0 ;GET THE CPRNET TCB  BIC #TS.STP,T.STAT(R0) ;UNSTOPO4 BIC #T2.STP*2!T2.STP,T.ST2(R0) ;CLEAR ALL STOP BITS, CALL $SETCR ;REQUEST SCHEDULING OF CPRNET;;NOW MOVE TO THE NEXT RING; >50$: MOV RCVRNG,PRVRCV ;CURRENT RING IS NOW THE PREVIOUS RING/ ADD #R$SIZE,RCVRNG ;MOVE POINTER TO NEXT RINGI( CMP RCVRNG,WRAPRC ;DO WE NEED TO WRAP?" BNE CPRRCV ;NOPE, GET NEXT RING+ MOV FRSTRC,RCVRNG ;START AT THE BEGINNINGC BR CPRRCV;TO; WE'RE DONE WITH THE RECEIVE RINGS. SEE IF THERE ARE ANY SEND RINGS AVAILABLEE6; AND IF SO IF THERE ARE ANY PACKETS QUEUED TO BE SENT;.-60$: CLR $CPPOL ;NO LONGER WAITING FOR POOLR0 TST @SNDRNG ;IS THERE ANOTHER RING AVAILABLE? BMI 80$ ;NOPE, EXIT NOW1 MOV $CPWAT,R1 ;GET FIRST WAITING PACKET ADDRESSI BEQ 80$ ;NONE, JUST CONTINUEI! MOV R1,@#KISAR6 ;MAP THE PACKETP* MOV H$LINK(R3),$CPWAT ;MOVE THE LINK DOWN! BNE 70$ ;IF NO OTHER PACKET...G) CLR $CPWAT+2 ;CLEAR BOTH WORDS OF QUEUE70$: MOVB (R3),R4 ;GET LENGTHG$ ASH #6,R4 ; MAKE INTO BYTE LENGTH CLR R0 ;NO FLAGS  CALL SENPKT ;SEND THE PACKETO BR 60$ ;GO TRY FOR ANOTHER 80$: RETURNI .DSABL LSBR .PAGE' .SBTTL SENRSP - RETURN RESPONSE PACKET?;B:; THIS ROUTINE RETURNS THE RESPONSE PACKET TO IT'S ORIGIN.;C ; INPUTS:I;B; R0 PACKET BIAS>; R1 LISTHEAD OF QUEUE CONTAINING PACKET (USUALLY $CPOUT) OR 0; IF PACKET NOT QUEUEDO; R3 140000 (APR6 BASE)E;A; PACKET MAPPED IN APR6;;A ; OUTPUTS:; C; CARRY CLEAR IF SUCCESSFUL, CARRY SET IF NO POOL AVAILABLE FOR ASTT; RESPONSE RETURNED TO SENDER;LSENRSP: ' MOV R1,-(SP) ;SAVE THE QUEUE LISTHEAD 9 BIT #HF$UNB,H$FLAG(R3) ;SHOULD WE JUST UNBLOCK THE TASK?P( BEQ 10$ ;YES, DON'T REMOVE FROM QUEUE CALL 160$ ;UNBLOCK THE TASK7 BIC #HF$UNB!HF$BLK,H$FLAG(R3) ;DON'T UNBLOCK NEXT TIME  TST (SP)+ ;CLEAN STACKN BR 150$ ;AND EXIT10$:5 BITB #HF$AST,H$FLAG(R3) ;DO WE NEED TO QUEUE AN AST?E BNE 50$ ;YES, GO DO ITR;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 RETURNAP; WILL HAVE H$RET=0. IF IT IS A DETACHED RETURN, UNBLOCK THE TASK IF NECESSARY,N; 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$= CMPB #HT$LST,H$TYPE(R3) ;IS THIS A LOST PACKET NOTIFICATION? , BEQ 20$ ;YES, DON'T UNBLOCK OR RESCHEDULE+ CALL 160$ ;UNBLOCK THE TASK IF NECESSARYH 20$: MOV (SP)+,R1 ;GET LISTHEAD CALL 90$ ;REMOVE FROM QUEUE2 MOV H$BIAS(R3),-(SP) ;SAVE THE APR5 BIAS FOR CALL" MOV H$RET(R3),-(SP) ;AND ADDRESS. BEQ 30$ ;IF NONE, THIS IS A DETACHED RETURN5 CALL $MPPRO ;CALL THE OTHER ROUTINE AS A COROUTINEB BR 150$ ;COMMON EXIT POINTR;R; DETACHED RETURN PROCESSING;:&30$: CMP (SP)+,(SP)+ ;CLEAN THE STACK4 CMP #HT$RUN,H$TYPE(R3) ;WAS THIS A TASK INITIATION? BNE 40$ ;NO, JUST CONTINUEO MOV H$TCB(R3),R5 ;GET THE TCBC0 MOVB P$TKI(R3),T.TKI(R5) ;SET UP THE TASK INDEX440$: MOV @#KISAR6,R0 ;GET THE ADDRESS OF THE PACKET% CALL CPRDEA ;DEALLOCATE THE HEADER BR 150$;)L;AST PROCESSING- ALLOCAT00vvibjbkb a a aE AN AST BLOCK, FILL IT IN, AND QUEUE IT TO THE TASKP;IF ALLOCATION FAILURE, RETURN WITH CARRY SET, WE WILL BE CALLED LATER AT CPRRCV; 050$: MOV #12,R1 ;GET THE SIZE OF OUR AST BLOCK CALL $ALOCB ;GET IT BCC 60$ ;WE GOT ITW! INC $CPPOL ;WE NEED POOL LATER$' TST (SP)+ ;GET RID OF SAVED LISTHEAD  SEC ;COULDN'T COMPLETE RETURN(160$: MOV R0,R2 ;GET A COPY OF THE BLOCK ADDRESST TST (R2)+ ;SKIP THE LINK WORD< MOV #AK.GBI!100,(R2)+ ;GENERAL BUFFERED I/O AST ENTRY POINT MOV $KXBAS,(R2)+ ;OUR MAPPING 4 MOV #CPRAST,(R2)+ ;THE AST SERVICE ROUTINE ADDRESS2 MOV @#KISAR6,(R2) ;GET THE ADDRESS OF THE BUFFER;VM; QUEUE THE AST. CALL THE ROUTINE TO UNBLOCK THE TASK AND REQUEST SCHEDULING;C# MOV H$TCB(R3),R2 ;GET TCB ADDRESS ' ADD #T.ASTL,R2 ;POINT TO AST LISTHEADF- MOV (R2),(R0) ;LINK PACKET TO FRONT OF LISTR BNE 70$ ; MOV R0,2(R2) ;70$: MOV R0,(R2) ; CALL 160$ ;UNBLOCK THE TASK; ;; IF THIS TASK STARTED A P0 IMAGE, CLEAR THE BIT IN THE TCBP;T4 CMPB #HT$VMS,H$TYPE(R3) ;DID THIS START A P0 IMAGE? BNE 80$ ;NO, CONTINUE MOV H$TCB(R3),R5 ;GET THE TCBT- BIC #T4.P0,T.ST4(R5) ;CLEAR THE P0 IMAGE BIT.;A$; SET UP TO REMOVE PACKET FROM QUEUE;Q$80$: MOV (SP)+,R1 ;GET THE LISTHEAD1 MOV @#KISAR6,R0 ;GET THE CURRENT PACKET ADDRESST;SJ; REMOVE THE PACKET FROM THE QUEUE. THIS IS CALLED AS A SUBROUTINE IN THEK; CASE OF DETACHED RETURNS AND EXEC RETURNS, BUT MUST BE CALLED LAST IN THEIL; CASE WHERE AN AST MUST BE QUEUED IN CASE WE HAVE TO EXIT BECAUSE OF A POOL; ALLOCATION FAILURE; (90$: TST R1 ;IS THERE A QUEUE ADDRESS? BEQ 150$ ;NOPE, JUST EXIT) CMP R0,(R1) ;FIRST OUTSTANDING PACKET?- BNE 100$ ;NOPE, WE'LL HAVE TO KEEP LOOKING0# MOV H$LINK(R3),(R1) ;FIX THE LINKM BNE 150$ ;EXITT+ CLR 2(R1) ;CLEAR THE LAST PACKET POINTERE/ BR 150$ ;CONTINUE, PACKET REMOVED FROM QUEUEO.100$: MOV (R1),R2 ;GET FIRST PACKET IN QUEUE;E; SEARCH FOR THE PACKET ;T110$:I! MOV R2,@#KISAR6 ;MAP THE PACKETD BNE 120$ ;E CRASH ;RESPONSE NOT IN QUEUE120$:F( MOV H$LINK(R3),R2 ;GET THE NEXT PACKET CMP R0,R2 ;NEXT PACKET OURS?S BNE 110$ ;NOPE, GET NEXT ONES;D; FOUND THE PACKET; /130$: MOV @#KISAR6,R2 ;GET LAST PACKET ADDRESS(( MOV H$LINK(R3),@#KISAR6 ;MAP OUR PACKET$ MOV H$LINK(R3),-(SP) ;GET NEXT LINK$ MOV R2,@#KISAR6 ;REMAP LAST PACKET$ MOV (SP)+,H$LINK(R3) ;FIX THE LINKS2 BNE 140$ ;IF LINK WAS NON-ZERO, NOT LAST PACKET2 MOV R2,2(R1) ;LISTHEAD POINTS TO NEW LAST PACKET2140$: MOV R0,@#KISAR6 ;REMAP THIS RESPONSE PACKET150$: CLC ;OK EXITN RETURN ;TM; UNBLOCK THE TASK IF HF$BLK SET. THIS NEEDS TO BE A SUBROUTINE FOR THE SAME O; REASON THAT REMOVING IT FROM THE QUEUE DOES - IT SHOULDN'T BE DONE IF THERE'S(J; A RESOURCE FAILURE ON THE AST BLOCK ALLOCATION. IT IS SEPARATE FROM THEJ; ROUTINE TO REMOVE AN ELEMENT FROM THE QUEUE BECAUSE IT IS ALSO CALLED IFE; HF$UNB IS SET AND ALL THAT NEEDS DOING IS UNBLOCKING OF THE TASK. ;I160$:P3 CMPB #HT$TKN,H$TYPE(R3) ;IS THIS TASK TERMINATION?A- BEQ 180$ ;IF EQ YES, DON'T RESCHEDULE TASK. CMPB #HT$REM,H$TYPE(R3) ;IS THIS TASK REMOVE?- BEQ 180$ ;IF EQ YES, DON'T RESCHEDULE TASK , CMPB #HT$DSB,H$TYPE(R3) ;DELETE SUBPROCESS? BEQ 180$ ;YES, DON'T SCHEDULE MOV H$TCB(R3),R0 ;GET THE TCBL. BIT #HF$BLK,H$FLAG(R3) ;WAS THE TASK BLOCKED? BEQ 170$ ;NO, JUST RETURN BIC #TS.RSW,T.STAT(R0) ;UNBLOCK,170$: BIC #TS.RDN,T.STAT(R0) ;TEMPORARY HACK CALL $SETCR ;SCHEDULE IT /180$: MOV @#KISAR6,R0 ;GET PACKET MAPPING BACKA RETURNA .PAGE/ .SBTTL VMSINI - PROCESS VMS INITIATED COMMANDSP;H"; WE HAVE A VMS INITIATED COMMAND.; ; INPUTS: ; ; R2 BASE OF CURRENT INPUT RINGC; R3 140000 (APR6 BASE)E;E; PACKET MAPPED IN APR6 ;S ; OUTPUTS:;E; PACKET DISPATCHED;#; RESPONSE RING SENT IF APPROPRIATE G; CARRY SET INDICATES FAILURE TO COMPLETE REQUEST - EITHER NO SEND RING(.; OR POOL ALLOCATION FAILURE ON ABORT REQUEST.;RVMSINI:C; 5; DISPATCH ACCORDING TO TYPE OF VMS INITIATED COMMANDK;M/ CMPB H$TYPE(R3),#HT$UCA ;UNSOL.00vvt__DATADATADATADATA CHARACTER AST?- BNE 10$ ;IF NE, NOC JMP 130$ ;GO PROCESS AST &10$: CMPB H$TYPE(R3),#HT$P0R ;P0 READ? BNE 20$ ;IF NE NO JMP 210$ ;GO PROCESS P0 READE'20$: CMPB H$TYPE(R3),#HT$P0W ;P0 WRITE?U BNE 30$ ;IF NE NO JMP 210$ ;GO PROCESS P0 WRITE30$:+ MOV #IS.SUC,H$STAT(R3) ;ASSUME SUCCESS M5 BIS #HF$RSP,H$FLAG(R3) ;MARK THAT THIS IS A RESPONSEI;F%; NOW DISPATCH TO THE CORRECT ROUTINE;1 CMPB #HT$GRI,H$TYPE(R3) ;GET RSX INFORMATION? N BNE 40$ ;IF NE NO  JMP 240$ ; 540$: CMPB #HT$CTC,H$TYPE(R3) ;CONTROL C NOTIFICATION?C BNE 401$ ;NOPE  JMP 50$ ;IF EQ YESR)401$: CMPB #HT$ABA,H$TYPE(R3) ;ABORT ALL?  BNE 402$ ;NOPE0! JMP 80$ ;DISPATCH TO ABORT ALLE+402$: CMPB #HT$RSX,H$TYPE(R3) ;MCR COMMAND?C BEQ 403$ ;YES, CONTINUE JMP 70$ ;NO, ERROR 403$: ;ML; COMMAND IS A QUEUE COMMAND LINE REQUEST. THE DDS STRING IS UPDATED IF IT (; IS AN IMMEDIATE MODE COMMAND FROM VMS.;Y9 BIT #HF$DIR,H$FLAG(R3) ;DOES IT INCLUDE VMS DEFAULT DIR? BEQ 44$ ;NO. CONTINUEP CLR R5 ;GET A REGISTERO$ BISB H$UNIT(R3),R5 ;TI UNIT NUMBER ASL R5 ;MAKE INTO WORD OFFSET$ MOV UNITBL(R5),R5 ;GET UCB ADDRESS! BEQ 70$ ;IF NO UCB, CAN'T SENDT MOV #120000+P$BLEN+4,R2: ADD P$BLEN(R3),R2 ;DIRECTORY STRING DISPLACEMENT IN APR5 CLR R0 ;CLEAR TOP HALF OF R0$2 MOVB <20000-2>(R2),R0 ;LENGTH OF DIRECTORY STRING# MOV KISAR6,R1 ;MAP PACKET TO APR5S( CALL $CRCTX ;CREATE DDS CONTEXT BLOCK BCS 70$ ;FAILED TO CREATE DDS1 MOV U.CTX(R5),R1 ;OLD DDS CONTEXT BLOCK POINTERP$ BEQ 41$ ;DON'T DEALLOCATE IF NONE, CALL $DLCTX ;DEALLOCATE OLD CONTEXT BLOCK41$:. MOV R3,U.CTX(R5) ;PUT NEW CTX POINTER IN UCB MOV KISAR6,-(SP) ;SAVE MAPPING" MOV R3,KISAR6 ;MAP CONTEXT BLOCK2 MOV #C.DDS+140001,R0 ;POINT TO FIRST CHAR OF DDS MOV R5,-(SP) ;SAVE UCB ADDRESS0 CALL CNTB ;CONVERT DDS TO BINARY, IF POSSIBLE# MOV (SP)+,R5 ;RESTORE UCB ADDRESSR# MOV (SP)+,KISAR6 ;RESTORE MAPPINGT" BCC 42$ ;IF CC, CONVERSION DONE< MOV U.LUIC(R5),U.UIC(R5) ;SET DEFAULT UIC = PROTECTION UIC BR 43$O=42$: MOV R1,U.UIC(R5) ;SET DEFAULT UIC = BINARY EQUIV OF DDSB43$:# MOV #140000,R3 ;RESTORE APR6 BASE 44$: CLR R1 ;GET A CLEAN REGISTERE9 BISB P$BLEN(R3),R1 ;GET THE LENGTH OF THE STRING BUFFER4< ADD #C.CTXT+77,R1 ;ADD FIXED AREA AND ROUND TO 32 WD BLOCK0 ASH #-6,R1 ;MAKE INTO A 32 WORD BLOCK ADDRESS" CALL $ALSEC ;GET SECONDARY POOL$ BCS 70$ ;NO POOL, SEND BACK ERROR;A,; FILL IN FIELDS IN THE COMMAND BUFFER BLOCK;U CLR R2 ;GET A REGISTERE% BISB H$UNIT(R3),R2 ;GET UNIT NUMBER2 ASL R2 ;MAKE INTO WORD OFFSET& TST UNITBL(R2) ;IS THIS UNIT ONLINE? BEQ 70$ ;IF EQ, NO64 MOV R0,R3 ;MOVE THE ADDRESS WHERE $BLXIO NEEDS IT MOV #140000,R4 ;APR 6 BIAS. MOV KISAR6,-(SP) ;SAVE THE CPR BLOCK MAPPING CLR R0 ;GET A CLEAN REGISTERO( BISB P$BLEN(R4),R0 ;LENGTH OF TRANSFER1 MOV H$STAT+2(R4),-(SP) ;BOGUS FORCE MCR FLAG BITS( MOV H$FLAG(R4),-(SP) ;PACKET FLAGS WORD MOV UNITBL(R2),-(SP) ;TI: UCB6 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 UCBS MOV R0,(R4) ;CHARACTER COUNT04 DEC (R4)+ ;THAT INCLUDED THE TERMINATOR CHARACTER# CLR (R4)+ ;ASSUME NORMAL COMMANDR$ BIT #HF$EXP,(SP)+ ;IS IT EXPLICIT? BEQ 45$ ;NOT IF ZERO+7 MOV #CC.TTD,-2(R4) ;MAKE MCR THINK THIS IS FROM TTDRV(*45$: BIT #1,(SP)+ ;IS THIS FORCED TO MCR? BEQ 46$ ;NOPE, LEAVE IT ALONE$ BIS #CC.MCR,-2(R4) ;SEND IT TO MCR!46$: CLR (R4)+ ;STARTING OFFSET4% MOVB R2,(R4)+ ;TERMINATOR CHARACTERM MOVB R1,(R4)+ ;SIZE OF PACKET ;P1; NOW MOVE THE STRING TO THE SECONDARY POOL BLOCK;;R$ MOV #120000+P$BLEN+2,R2 ;APR 5 BIAS% MOV (SP),R1 ;BIAS OF HEADER PACKET+# CALL $BLXIO ;AND MOVE THE STRINGE0 MOV R3,R1 ;GET THE BIAS WHERE $QCPKT NEEDS IT$ MOV (SP)+,KISAR6 ;REMAP THE HEADER+ CALL $QCPKT ;QUEUE THE PACKET TO THE CLIS+ BR 60$ ;COMMON CODE WITH ^C NOTIFICATION ;A; HT$CTC;C,; SEND T00vvibjbkb a a aHE ^C NOTIFICATION PACKET TO THE CLI;T+50$: MOV #CC.CTC!CC.CLI,R1 ;^C NOTIFICATIONH CLR R2 ;GET A REGISTERS BISB H$UNIT(R3),R2 ;TI UNITT ASL R2 ;MAKE INTO WORD OFFSET MOV UNITBL(R2),R2 ;TI: UCB BEQ 70$ ;IF NONE, ERROR+ CALL $QCNTP ;QUEUE CONTROL PACKET TO CLI;%60$: BCC 120$ ;IF SUCCESS, CONTINUE + BEQ 120$ ;IF EQ, CLI WAS ACTIVE, SUCCESSS. MOV #140000,R3 ;RESTORE THE OFFSET TO PACKET570$: MOV #IE.UPN,H$STAT(R3) ;NOTIFY VMS OF BAD STATUST BR 120$ ;AND EXIT;; HT$ABA;EL; ABORT ALL TASKS FOR THIS TI, COMPLETING WITH ERROR ANY OUTSTANDING PACKETSE; AND DISABLING THEIR T.TKI SO THEY CAN'T SEND ANY MORE CPR REQUESTS.L; 80$: CLR R5 ;GET A REGISTERU BISB H$UNIT(R3),R5 ;TI UNIT$ ASL R5 ;MAKE INTO WORD OFFSET MOV UNITBL(R5),R5 ;GET TI: UCB BEQ 120$ ;NO UCB ADDRESSN. MOV $ACTHD,R1 ;GET FIRST TASK IN ACTIVE LIST BEQ 120$ ;IF NONE, EXIT!90$: CMP T.UCB(R1),R5 ;THIS UCB?# BNE 110$ ;NO, TRY NEXT ONEF MOV #S.CTKN,R0 ;QUIET ABORTX MOV R1,-(SP) ;SAVE TCB ADDRESS CALL $ABTSK ;ABORT THE TASK# MOV (SP)+,R1 ;RESTORE TCB ADDRESSN0100$: MOV @#KISAR6,-(SP) ;SAVE THE ABORT PACKET4 CALL CPRABO ;WRECK TASK INDEX AND CLEAN UP QUEUES+ MOV (SP)+,@#KISAR6 ;RESTORE ABORT MAPPINGK'110$: MOV T.ACTL(R1),R1 ;GET NEXT TASKG BNE 90$ ;IF THERE, CHECK IT;R; SEND THE RESPONSE PACKET;T.120$: MOV @#KISAR6,R1 ;GET THE PACKET ADDRESS) MOV RCVRNG,R2 ;GET RECEIVE RING ADDRESS1. MOV #140000,R3 ;RESTORE THE OFFSET TO PACKET$ MOV RNGBAS,@#KISAR6 ;MAP THE RINGS% MOV 2(R2),R4 ;GET THE PACKET LENGTHM# MOV R1,@#KISAR6 ;REMAP THE PACKET0 CALL SENPKT ;SEND IT OFF " CLC ;MAKE SURE WE SHOW SUCCESS RETURNI;X"; UNSOLICITED CHARACTER AST PACKET;R130$:T* MOV H$TCB(R3),R0 ;GET USER'S TCB ADDRESS;E; GET THE CORRECT UCB ADDRESSE; . BIT #PF$NET,P$ASF(R3) ;IS THIS A NETWORK AST? BEQ 140$ ;IF EQ NOE' MOV XXNET,R5 ;GET NETWORK UCB ADDRESSR BNE 160$ ;IF NE GOT IT# MOV #"NS,R4 ;LOOK FOR ITT CALL GETUCB ;" MOV R5,XXNET ;STORE IT FOR LATER BR 160$140$:H, BIT #PF$TI,P$ASF(R3) ;IS AST FOR USER'S TI? BNE 150$ ;IF NE YES* MOV XXUCB,R5 ;GET GENERIC HT UCB ADDRESS BNE 160$ ;IF NE GOT ITO MOV #"HT,R4 ;LOOK FOR IT CALL GETUCB ;" MOV R5,XXUCB ;STORE IT FOR LATER BR 160$150$:O% MOV T.UCB(R0),R5 ;UCB IS USER'S TI:A160$:;;T; FIND AST CONTROL BLOCK; $ ADD #U.RAST,R5 ;POINT TO LIST HEAD& MOV R5,R1 ;GET ADDRESS OF LIST HEAD+170$: MOV R1,R4 ;SAVE ADDRESS OF PREVIOUSE MOV (R4),R1 ;GET NEXT ACB- BEQ 200$ ; IF ACB NOT FOUND, RETURN ERROR.$& CMP A.PRM+14(R1),R0 ;DOES TCB MATCH? BNE 170$ ;IF NE NOU3 CMPB A.PRM+16(R1),P$LUN(R3) ;DO LUN NUMBERS MATCH?E BNE 170$ ;IF NE NO ;O; DEQUEUE AST CONTROL BLOCK;V$ MOV (R1),(R4) ;TAKE IT OUT OF LIST BNE 180$ ;IF NE NO NEW LAST! MOV R4,2(R5) ;POINT TO NEW LASTI180$:C;R; FILL IN AST CONTROL BLOCK ;O: MOV KISAR6,A.PRM+12(R1) ;FILL IN HEADER BIAS FOR RESPONSE= MOVB P$APM(R3),A.PRM(R1) ;GET CHARACTER - NOTHING IF NETWORK ? MOV A.PRM+10(R1),A.AST(R1) ;ASSUME NO CONTROL C AST SPECIFIEDP8 TST A.PRM+6(R1) ;WAS IT SPECIFIED? - NEVER FOR NETWORK BEQ 190$ ;IF EQ NOR2 CMPB A.PRM(R1),#3 ;IS THE CHARACTER A CONTROL C? BNE 190$ ;IF NE NOO8 MOV A.PRM+6(R1),A.AST(R1) ;USE THIS AST ADDRESS INSTEAD190$:I;E ; QUEUE AST CONTROL BLOCK TO TCB;O1 CALL $QASTT ;INSERT IT IN QUEUE AND RESCHEDULE  CLC RETURNR200$:+6 MOV #IE.ABO,H$STAT(R3) ; THE TASK MUST BE GOING AWAY.0 MOV @#KISAR6,R1 ; TELL SENPKT WHERE PACKET IS.* MOV #H$SIZE+6,R4 ; PASS LENGTH IN BYTES.# CALL SENPKT ; SEND THE RESPONSE.) CLC RETURNF;?; P0 READ OR P0 WRITE REQUESTS;I210$:R;C; ALLOCATE AN I/O PACKET;R* MOV #I.LGTH,R1 ;GET LENGTH OF I/O PACKET CALL $ALOCB ;ALLOCATE ITS BCC 220$ ;IF CC, OKAY RETURN ;RETURN WITH FAILURE 220$:O;B; FILL IN I/O PACKET FIELDSI;N& MOV R0,R1 ;GET PACKET ADDRESS IN R13 CLR I.PRI(R1) ;CLEAR PRIORITY FIELD AND EFN FIELDI7 MOV H$TCB(R3),I.TCB(R1) ;FILL IN TCB OF OFFSPRING TASK.600vvt__DATADATADATADATA CLR I.LN2(R1) ;NO LUN NUMBER, NEVER CHECKED IN VTDRV CLR R5 ;GET A REGISTER% BISB H$UNIT(R3),R5 ;GET UNIT NUMBERT ASL R5 ;MAKE INTO WORD OFFSET$ MOV UNITBL(R5),R5 ;GET UCB ADDRESS MOV R5,I.UCB(R1) ;FILL IN UCBL$ MOV #IO.WLB,I.FCN(R1) ;ASSUME WRITE( CMPB H$TYPE(R3),#HT$P0W ;IS IT A WRITE? BEQ 230$ ;IF EQ YES2 MOV #IO.RLB,I.FCN(R1) ;FILL IN READ FUNCTION CODE' CMPB H$TYPE(R3),#HT$P0R ;IF IT A READ?I BEQ 230$ ;IF EQ YES3 MOV #IO.WLB,I.FCN(R1) ;FILL IN WRITE FUNCTION CODEG=230$: MOV KINAR5,I.IOSB+2(R1) ;FILL IN BIAS OF RETURN ROUTINE> MOV #P0CMPL!1,I.IOSB+4(R1) ;FILL IN OFFSET OF RETURN ROUTINE CLR I.AST(R1) ;NO AST ADDRESSS- MOV KISAR6,I.PRM(R1) ;FILL IN BIAS OF BUFFERR; MOV #H$SIZE+2+140000,I.PRM+2(R1) ;FILL IN OFFSET OF BUFFERI6 MOV H$SIZE(R3),I.PRM+4(R1) ;FILL IN LENGTH OF REQUEST5 MOV H$STAT(R3),I.PRM+6(R1) ;FILL IN 1ST WORD OF VFCT0 MOV H$STAT+2(R3),I.PRM+10(R1) ;FILL IN 2ND WORD;B; CALL THE VT DRIVER;V# MOV U.SCB(R5),R4 ;GET SCB ADDRESSC. CALL $DRQRQ ;QUEUE THE PACKET TO THE DRVIER CLC RETURN ; V*; PROCESS GET RSX INFORMATION PACKET ; E240$: + MOV #IS.SUC,H$STAT(R3) ;ASSUME SUCCESS ' ADD #H$SIZE,R3 ;POINT TO ITEM LIST ,9 CMPB #II$LOF,I$ID(R3) ;IS THIS GET LOGGED OFF BIT ITEM? R BEQ 260$ ;IF EQ OKAY Q250$: (0 SUB #H$SIZE,R3 ;POINT TO BEGINNING OF PACKET ' MOV #0,H$STAT(R3) ;INDICATE ERROR D% BR 280$ ;GO TO SEND PACKET BACK S260$: C& MOV I$BUF(R3),R1 ;GET UNIT NUMBER , MOV #$DEVHD,R0 ;GET ADDRESS OF FIRST DCB %270$: MOV (R0),R0 ;GET NEXT DCB K& BEQ 250$ ;IF EQ NOT FOUND, ERROR * CMP #"HT,D.NAM(R0) ;IS THIS AN HT DCB " BNE 270$ ;IF NE GET NEXT ONE 5 CMPB #377,D.UNIT(R0) ;IS THIS THE GENERIC HT UCB? F BEQ 270$ ;IF EQ, NOT IT 9 MUL D.UCBL(R0),R1 ;GET OFFSET OF UCB WE'RE LOOKING FOR G) ADD D.UCB(R0),R1 ;GET ADDRESS OF UCB DD MOVB U.CW2+1(R1),I$BUF(R3) ;GET LOGGED OFF BIT IN LOW BIT OF WORD 280$: R( MOV @#KISAR6,R1 ;GET PACKET ADDRESS  SUB #H$SIZE,R3 ;RESTORE R3) MOV #H$SIZE+4,R4 ;GET SIZE OF PACKET B! CALL SENPKT ;SEND RESPONSE CLC A RETURN ; 6; CNTB - CONVERT A NAMED DIRECTORY TO A BINARY WORD IF#; IN THE FORM OF [G,M] OR [GGGMMM]F;B; INPUTS: R0 = BUFFER POINTER;D#; OUTPUTS: IF CC, R1 = BINARY WORDE3; IF CS, INDICATES NAMED DIRECTORY NOT CONVERTEDB;DCNTB:.% CLR -(SP) ; USE STACK FOR FLAG WORDT( MOV #3,R4 ; NUMBER OF CHARS TO CONVERT" CLR R1 ; CLEAR ACCUMULATED VALUE MOVB #',,R2 ; STOP ON A COMMA CALL 100$ ; CONVERT  BCS 20$ ; BR IF INVALIDE 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?U BNE 10$ ; IF NE, NOR TSTB (R0)+ ; SKIP THE COMMAI INC (SP) ; INDICATE COMMA SEEN%10$: MOVB #'],R2 ; STOP ON A BRACKETN CALL 100$ ; CONVERT  BCS 20$ ; BR IF INVALID#' SWAB R3 ; PUT GROUP CODE IN HIGH BYTER BIS R3,R1 ; PUT INTO RESULTM BEQ 20$ ; IF EQ, INVALID! CMPB #'],(R0)+ ; ENDING BRACKET?$ BNE 20$ ; IF NE, ERROR TST (SP) ; DID WE SEE A COMMA? BNE 15$ ; IF NE, YES# TST R4 ; VERIFY WE PARSED 3 CHARSR BNE 20$ ; IF NE, - ERROR/15$: TST (SP)+ ; CLEAN STACK, INDICATE SUCCESS1# BR 30$ ; RETURN TO CALLER WITH CC 20$: TST (SP)+ ; CLEAN STACKT) SEC ; INDICATE DIRECTORY NOT CONVERTED $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 RESULTP SOB R4,100$ ; GO AGAIN-110$: CMP #377,R1 ; NUMBER GREATER THAN 377?  RETURN ; RETURN TO ABOVEC115$: TSTB -(R0) ; BACK UPR$ CMP #3,R4 ; DID WE PARSE ANYTHING? BNE 110$ ; IF NE, YES - OK*120$: SEC ; INVALID CHARACTER TO CONVERT RETUR00vvibjbkb a a aN ; RETURN TO ABOVEB .PAGE;F6; P0CMPL - COMPLETION ROUTINE FOR P0 READ AND P0 WRITE;I ; INPUT -A; R3 - ADDRESS OF I/O PACKETG;SP0CMPL:B* MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS MOV KISAR6,-(SP) ;SAVE MAPPING! MOV I.PRM(R3),KISAR6 ;MAP PACKET0* MOV I.PRM+6(R3),140000+H$STAT ;SET STATUS# MOV I.PRM+10(R3),140000+H$STAT+2 ;N CLR R0 ;GET LENGTH- MOVB 140000,R0 ; ASH #6,R0 ;( CPSEN$ #SN$RSP,KISAR6,R0 ;SEND RESPONSE# MOV (SP)+,KISAR6 ;RESTORE MAPPINGE- MOV (SP)+,R0 ;RESTORE I/O PACKET ADDRESS% MOV #I.LGTH,R1 ;LENGTH OF PACKETN' JMP $DEACB ;DEALLOCATE AND RETURNA; #; GETUCB - FIND GENERIC UCB ADDRESSM;B"; INPUT - R4 ASCII FOR DEVICE NAME;D; OUTPUT - R5 UCB ADDRESSA;MGETUCB:M MOV #$DEVHD,R5 ;GET LIST HEAD 10$: MOV (R5),R5 ;GET NEXT DCB CMP R4,D.NAM(R5) ;IS THIS IT?0 BNE 10$ ;IF NE NO. CMPB #377,D.UNIT(R5) ;IS IT THE GENERIC ONE? BNE 10$ ;IF NE NO MOV D.UCB(R5),R5 ;GET UCB( RETURN ;DONE .PAGE/ .SBTTL CPRABO - ABORT TASK AND CLEAN UP QUEUES; ; CPRABO;,K; WRECK TASK INDEX SO THIS TASK CANNOT ISSUE FURTHER REQUESTS, AND COMPLETEB5; ANY PACKETS LEFT IN THE OUTSTANDING OR WAIT QUEUES.R;V ; INPUTS:D; ; R1 TCB OF TASK BEING ABORTED;B ; OUTPUTS:;D$; ALL PACKETS IN QUEUES ARE RETURNED; TASK INDEX IS SET TO -1.; R1 AND R5 REGISTERS PRESERVED ;FCPRABO:C MOV R5,-(SP) ;SAVE R5I MOV R1,-(SP) ;SAVE TCB ADDRESS MOV #140000,R3 ;GET APR6 BASEC MOV R1,R2 ;MOVE THE TCB8 CMPB T.TKI(R2),$RMTSK ;IS THIS A REMOTE PERMANENT TASK?+ BLOS 10$ ;IF LOS, YES, DON'T TRASH INDEX ( MOVB #-1,T.TKI(R2) ;FIX THE TASK INDEX-10$: MOV #2,R4 ;WE NEED TO CHECK TWO QUEUESI$ MOV #$CPOUT,R1 ;GET QUEUE LISTHEAD/20$: MOV (R1),@#KISAR6 ;MAP OUTSTANDING PACKETL BEQ 50$ ;NONE,30$: CMP H$TCB(R3),R2 ;PACKET FOR THIS TCB? BNE 40$ ;NOPE, TRY NEXT ONE CLR R0 ;GET A REGISTER ) BISB H$UNIT(R3),R0 ;GET THE UNIT NUMBERS ASL R0 ;MAKE INTO WORD OFFSET( MOV UNITBL(R0),R0 ;GET THE UCB ADDRESS6 CMP T.UCB(R2),R0 ;CORRECT UCB? (MIGHT NOT BE IF MCR) BNE 40$ ;NOPE, TRY NEXT ONE1 BITB #HT$SYS,H$TYPE(R3) ;IS THIS PKT FOR CPRSYS?M. BNE 40$ ;YES, DON'T COMPLETE THE PACKET NOW ;...CPRSYS IS STILL RUNNING;M'; COMPLETE THE PACKET WITH ERROR STATUSL;B% MOV @#KISAR6,R0 ;GET PACKET ADDRESS;) MOV #IE.PRI,H$STAT(R3) ;SET ABORT STATUS  MOV R1,-(SP) ;SAVE LISTHEAD, MOV R4,-(SP) ; COUNT, # MOV R0,-(SP) ; AND PACKET MAPPINGK! CALL SENRSP ;SEND THE RESPONSE,- MOV (SP)+,@#KISAR6 ;RESTORE PACKET MAPPING,O MOV (SP)+,R4 ; COUNT,I MOV (SP)+,R1 ; AND LISTHEADE MOV (SP),R2 ;RESTORE TCBR# MOV #140000,R3 ;RESTORE APR6 BASE$ BCS 70$ ;IF FAILURE, RETURN-40$: MOV H$LINK(R3),@#KISAR6 ;GET NEXT PACKET ! BNE 30$ ;ANOTHER ONE, CHECK ITU.50$: MOV #$CPWAT,R1 ;MAP FIRST WAITING PACKET SOB R4,20$ ;DO BOTH QUEUESO60$: CLC70$: MOV (SP)+,R1 ;RESTORE TCB MOV (SP)+,R5 ;RESTORE R5 RETURNP .PAGE+ .SBTTL CPRAST - KERNAL AST SERVICE ROUTINEO;,+; ** - CPRAST - KERNAL AST SERVICE ROUTINEG;H; THIS ROUTINE RETURNS CONTROL TO THE TASK OR DIRECTIVE ROUTINE WITH THE; FOLLOWING REGISTER CONTENTS:;T-; R0 ADDRESS OF BUFFER - TO BE USED IN AN APR;: ; INPUTS:(;,; R3 ADDRESS OF AST BLOCK;EH; CONTROL IS TRANSFERED TO THE TASK COMPLETION ROUTINE USING THE ROUTINE+; $MPPRO. THIS ROUTINE EXPECTS THE INPUTS:C;0; (SP) RETURN ADDRESS; 2(SP) ROUTINE ADDRESS TO CALL5; 4(SP) APR5 BIAS OF ROUTINE;AD; BY PUTTING THE APR BIASES AND THE CALLING ADDRESS UNDER THE RETURNA; ADDRESS THAT IS CURRENTLY ON THE STACK, WE CAN JUMP TO THE TASKE); 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, ! MOV R0,@#KISAR6 ;MAP THE BUFFER$ MOV #140000,R1 ;GET A BASE ADDRESS1 MOV H$RET(R1),-(SP) ;SET UP THE ROUTINE ADDRESSE* MOV 2(SP),-(SP) ;MOVE THE RETURN ADDRESS* MOV H$BIAS(R1),4(SP) ;PUT I00vvt__DATADATADATADATAN THE APR BIAS3 BEQ 20$ ;NO BIAS, GET THE MAPPING FROM USER APRSE/ BIT #HF$DSW,H$FLAG(R1) ;SHOULD WE SET THE DSW?P' BEQ 30$ ;NOPE, JUST CALL THE ROUTINEA- BIC #1,$UMPS ;BE OPTIMISTIC; ASSUME SUCCESSR2 MOV H$STAT(R1),-(SP) ;PUT THE STATUS ON THE STACK) BPL 10$ ;IF SUCCESS, LEAVE CARRY ALONEA BIS #1,$UMPS ;SET USER'S CARRY10$:+ MTPD$ @#H.DSW ;SET DIRECTIVE STATUS WORDM BR 30$R420$: MOV @#UINAR5,4(SP) ;GET MAPPING FROM USER TASK$ MOV @#UISAR6,@#KISAR6 ;MAP APR6 TOO MOV @#UINAR6,@#KINAR6 ;I&DI*30$: JMP $MPPRO ;AND GO BACK TO THE TASK .PAGE/ .SBTTL CPRCON - CONNECT TI: UCB TO VMS CP: UCBW;); CPRCON - CONNECT TI: UCB TO VMS CP: UCBB;#J; THIS ROUTINE IS CALLED BY THE $$DRV UNIT ONLINE ENTRY POINT FOR EACH TI:I; UCB. IF CARRY IS CLEAR, THIS IS AN ONLINE REQUEST, PUT THE UCB ADDRESS F; INTO OUR UCB TABLE AT THE CORRECT ADDRESS AND PUT THE UNIT NUMBER ATH; U.CPUN. NOTE THAT THIS UNIT NUMBER IS THE UNIT NUMBER OF THE VMS CP: I; UNIT, AND THOUGH IT MATCHES U.UNIT FOR HT: DEVICES, IT IS DIFFERENT FORR ; VT: UNITS.;TH; IF CARRY IS SET, THIS IS AN OFFLINE REQUEST, CLEAR THE UNIT OUT OF THE ; UCB TABLEN;T;: ; INPUTS: ; ; R5 TI: UCB ADDRESS;I ; OUTPUTS:; ; ALL REGISTERS PRESERVED.; UCB TABLE UPDATED.&; U.CPUN FILLED IN FOR ONLINE REQUESTS;ECPRCON:  BCS 30$ ;OFFLINE REQUESTT SAVNR ;SAVE R4 AND R5 % MOV R3,-(SP) ;GET ONE MORE REGISTERN* CLR R3 ;CLEAR AND BIS SO NO SIGN EXTEND) BISB U.UNIT(R5),R3 ;GET THE UNIT NUMBERC# MOV U.DCB(R5),R4 ;GET DCB ADDRESSF, CMP D.NAM(R4),#"VT ;IS THIS A VT TERMINAL? BNE 10$ ;IF NE NO( ADD $RMTTT,R3 ;SKIP OVER HT TERMAINALS DEC R3 ;VT1: IS FIRST10$:& MOVB R3,U.CPUN(R5) ;SET THE CP: UNIT ASL R3 ;MAKE INTO WORD OFFSET* MOV R5,UNITBL(R3) ;SET UCB IN UNIT TABLE MOV (SP)+,R3 ;RESTORE R3) MOV TOPRSX,R4 ;GET THE TOP OF RSX SPACEV# SUB U.CPKT(R5),R4 ;GET THE PACKET - CMP R4,MAXBUF ;IS IT LESS THAN CURRENT MAX?S BGE 20$ ;NOPE, EXIT! MOV R4,MAXBUF ;NEW MAXIMUM SIZEV 20$: RETURN 30$: SAVNR ;SAVE R4 AND R5#. CLR R4 ;CLEAR AND USE BIS SO NO SIGN EXTEND& BISB U.CPUN(R5),R4 ;GET THE CP: UNIT ASL R4 ;MAKE INTO WORD OFFSET- CLR UNITBL(R4) ;CLEAR OUT UCB IN UNIT TABLEL RETURNK .PAGE* .SBTTL CPRALO - BUFFER ALLOCATION ROUTINE;T$; CPRALO - BUFFER ALLOCATION ROUTINE;TF; THIS ROUTINE IS USED TO ALLOCATE RESOURCES TO SEND DATA FROM THE RSXD; SYSTEM TO THE VMS SYSTEM. IF THE RESOURCES ARE NOT AVAILABLE, THEF; 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 AREH; AVAILABLE. IF AL$XXD IS NOT SET, THE TASK IS BLOCKED PENDING RESOURCEG; AVAILABILITY. IF AL$BCK IS SET, THEN THE TASK'S PC IS BACKED UP OVERID; THE EMT INSTRUCTION SO THAT WHEN IT IS RESCHEDULED IT WILL REENTERJ; SYSTEM STATE. IF AL$BCK IS NOT SET, THE ROUTINE RETURNS WITH CARRY SET.;I; IF RESOURCES ARE AVAILABLE, THE BUFFER SPACE IS ALLOCATED. IF THE FLAGLC; AL$IMP IS SET, AND THE TASK INDEX IN THE TCB IS NOT FILLED IN, AN D; IMPLICIT TASK START REQUEST IS ISSUED. CPRALO WILL RETURN AS IF AH; RESOURCE WAS UNAVAILABLE, CAUSING THE TASK TO RESCHEDULE AND CALL THISD; ROUTINE AGAIN. THIS ROUTINE IS CALLED FROM $CPALO IN THE EXEC. ; ; INPUTS:M;N; R0 OPERATION FLAGS:I,; AL$BCK - BACK UP PC IF ALLOCATION FAILURE3; AL$IMP - DO IMPLICIT TASK START IF NO TASK INDEXA'; AL$NBL - DON'T BLOCK TASK IF FAILUREE); AL$XXD - REQUEST IS FROM THE XX DRIVERA:; AL$NVR - (DIRECTIVES) - RETURN C SET IF BUFFER > CPRBUF3; R1 LENGTH OF BUFFER NECESSARY (IN 32 WORD BLOCKS).;P ; OUTPUTS:;N7; R0 ADDRESS OF BUFFER ALLOCATED - TO BE USED IN AN APR ; R1 ACTUAL LENGTH ALLOCATED;N;; THE LENGTH IS ALSO STORED IN THE FIRST BYTE OF THE BUFFER;NCPRALO:N SAVNR ;SAVE R4 AND R5  SEC ;ASSUME FAILUREL TST R1 ;IS THERE A LENGTH?O BEQ 20$ ;NOPE, JUST EXITS% CMP R1,MAXBUF ;WILL THIS EVER WORK?I BGT NEVER ;NOPE, GET OUT 00wvibjbkb a a a/ MOV @#KISAR6,-(SP) ;SAVE CURRENT APR6 MAPPING)" MOV R0,-(SP) ;SAVE THE FLAG WORD* MOV #$CPRBF,R2 ;SET UP THE POOL LISTHEAD) BIT #AL$IMP,R0 ;DO IMPLICIT TASK START?O( BEQ 10$ ;NO, JUST ALLOCATE THE BUFFER MOV $TKTCB,R5 ;GET THE TCB( TSTB T.TKI(R5) ;IS THERE A TASK INDEX?2 BEQ IMPST ;NO, WE HAVE TO DO THE IMPLICIT START,10$: CALL $ALSC1 ;ALLOCATE A BLOCK OF POOL BCS NOPOOL ;NO POOL0 TST (SP)+ ;WE SUCCEEDED, SO DUMP FAILURE FLAG MOV R0,@#KISAR6 ;MAP THE BLOCK# MOVB R1,140000 ;PUT IN THE LENGTHP* MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING 20$: RETURNF .PAGE. .SBTTL CPR BUFFER ALLOCATION FAILURE ROUTINES;LJ; THIS ROUTINE IS CALLED WHEN THE ALLOCATION REQUESTED IS LARGER THAN THE H; LARGEST AVAILABLE CPRBUF SEGMENT, AND THUS WILL NEVER SUCCEED. IF THEG; DIRECTIVE THINKS THIS MIGHT HAPPEN, IT SETS AL$NVR IN THE FLAGS WORD.L<; (CURRENTLY ONLY RMS 21.5 ELP DOES). RETURN WITH CARRY SET;SNEVER:9 BIT #AL$NVR,R0 ;SHOULD WE TELL THEM IT WILL NEVER WORK?M" BEQ NOPOOL ;NO, THEY DIDN'T ASK SEC ;TELL THEM THE BAD NEWS6 RETURN;:K; THIS ROUTINE IS CALLED WHEN CPRALO FAILS TO ALLOCATE A RESOURCE. SEE THESM; COMMENTS AT THE BEGINNING OF CPRALO FOR A DESCRIPTION OF THE ACTIONS TAKEN. ;I;L/NOPOOL: MOV (SP)+,R0 ;RESTORE FLAG FOR FAILUREF* MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING5 MOV #T4.LBW,R1 ;THE TASK IS BLOCKED FOR BUFFER WAITM ;FALL THROUGH TO ALFAILALFAIL:;F; FIRST CHECK TO SEE IF THIS IS FROM XXDRV, WHICH IS HANDLED SPECIALLY;P- BIT #AL$XXD,R0 ;IS THIS REQUEST FROM XXDRV?T$ BEQ 10$ ;NO, GO BLOCK IT NORMALLY INC XXWAIT ;MARK A FAILURES$ MOV R5,XXR5 ;SAVE THE UCB ADDRESS$ ADD #16,SP ;SKIP THE XXDRV RETURN RETURN ;AND EXIT"10$: BIT #AL$NBL,R0 ;NO BLOCKING? BEQ 20$ ;NO, BLOCK IT SEC ;SHO ERROR. RETURN ;IF WE'RE NOT BLOCKING IT, WE DON'T+ ;WANT TO BACK UP THE PC OR RESCHEDULE, ;EITHER20$:;LP; SET THE BLOCKING BITS, INCREMENT BLOCKING COUNTS, BACK UP THE PC IF NECESSARY,; AND REQUEST RESCHEDULING;; MOV $TKTCB,R5 ;GET THE TCB- BIS #TS.RSW,T.STAT(R5) ;SET THE BLOCKING BITI TST R1 ;ANY WAIT FLAG?R BEQ 30$ ;NO, JUST EXITE3 BIS R1,T.ST4(R5) ;BIT TO TELL WHY TASK IS BLOCKED;* INC BUFFWT ;INCREMENT BUFFER WAIT COUNT/30$: BIT #AL$BCK,R0 ;SHOULD WE BACK UP THE PC? BNE 40$ ;IF NE, YES% CALL $DRWSE ;SCHEDULE ANOTHER TASKA SEC RETURN 40$:! SUB #2,$UMPC ;BACK UP USER'S PCE. MOV #$STACK-22,SP ;ALLOCATE? WHAT ALLOCATE? JMP $DRWSEC .PAGE# .SBTTL IMPST - IMPLICIT TASK START;VO; THIS ROUTINE IS CALLED FROM CPRALO WHEN A TCB IS DETECTED WITH NO TASK INDEX. J; IN THIS CASE, THE TASK START PACKET IS CREATED AND SENT, AND CPRALO THENJ; BLOCKS THE TASK AND RETURNS AS IF THERE WERE AN ALLOCATION FAILURE. THEK; PACKET IS SENT AS A PSEUDO REQUEST, AND THE DETACHED RETURN PROCESSING INW6; KXINT FILLS IN THE TASK INDEX AND UNBLOCKS THE TASK.;,7; THE IMPLICIT START REQUEST PACKET HAS THE PARAMETERS:?; +------------+------------+; | TASK UIC |; +------------+------------+; |DEF DIR LEN | # OF LUNS |; +------------+------------+; | DEFAULT DIRECTORY STRING| ; | |;CIMPST:;S1; FIRST FIGURE OUT HOW BIG OF A BLOCK TO ALLOCATE ;I5 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 BLOCKI; 2 MOV R0,R3 ;WE'LL NEED THE BIAS IN R3 FOR $BLXIO- MOV R4,R0 ;AND WE'LL NEED THE LENGTH IN R07 MOV T.PCB(R5),R2 ;GET THE PCBE& MOV P.HDR(R2),R4 ;GET HEADER ADDRESS" BNE 20$ ;IF EQ, EXTERNAL HEADER' MOV P.REL(R2),@#KISAR6 ;MAP IT IN APR6R# MOV #140000,R4 ;GET ADDRESS IN R4..20$: MOVB H.NLUN(R4),-(SP) ;GET NUMBER OF LUNS. M00 wvt__DATADATADATADATAOV H.CUIC(R4),-(SP) ;GET TASK PROTECTION UIC" MOV T.UCB(R5),R4 ;ADDRESS OF TCB6 CMP U.LUIC(R4),(SP) ;TERMINAL PROTECTION EQUAL TASK?, BNE 25$ ;NO. SEND TASK PROTECTION TO CPR. CLR (SP) ;YES. FLAG FOR CPR TO USE VMS UIC25$:+ MOV U.UIC(R4),-(SP) ;Terminal default UICB) MOV R3,@#KISAR6 ;MAP THE COMMAND HEADER;) MOV #140000,R4 ;GET PACKET BASE ADDRESSR$ MOVB R1,(R4) ;SET THE PACKET SIZE& MOVB #HT$RUN,H$TYPE(R4) ;SET THE TYPE' CLRB H$ICNT(R4) ;CLEAR THE ITEM COUNT;( ADD #P$UIC,R4 ;START OF PARAMETER AREA;TN; If we are in nonamed mode, include the terminal's default UIC after the DDS.P; We always put the default UIC at offset 6 in the packet. If we are in nonamedN; mode, it will follow the DDS ("[]"). If we are in named mode, we don't care:; about it, and in fact it will be overwritten by the DDS.;M. MOV (SP)+,6(R4) ;Default UIC goes after "[]"! MOV (SP)+,(R4)+ ;Protection UICV" MOVB (SP)+,(R4)+ ;NUMBER OF LUNS' MOVB R0,(R4)+ ;SIZE OF DEFAULT STRING& MOV T.CTX(R5),R1 ;CONTEXT BLOCK BIAS# BEQ 30$ ;IF EQ, NO CONTEXT BLOCKc2 MOV #120000+C.DDS,R2 ;DEFAULT STRING DISPLACEMENT+ MOV R0,-(SP) ;SAVE SIZE OF DEFAULT STRINGe' CALL $BLXIO ;MOVE THE DEFAULT STRINGt. MOV (SP)+,R0 ;RESTORE SIZE OF DEFAULT STRING2 CMP R0,#2 ;Are we in nonamed mode (DDS = "[]")? BNE 30$ ;If NE, no, continue8 ADD R0,R0 ;Else, include default UIC in packet length,30$: ADD #H$SIZE+4,R0 ;GET THE TOTAL LENGTH* MOV R3,R2 ;CAN'T PASS A PARAMETER IN R3 CPSEN$ #SN$PSR,R2,R0R" MOV (SP)+,R0 ;GET BACK FLAG WORD* MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING" CLR R1 ;NOT WAITING ON A BUFFER BR ALFAIL ;EXIT .PAGE* .SBTTL CPRDEA - DEALLOCATE BUFFER SPACE;T'; ** - CPRDEA - DEALLOCATE BUFFER SPACE ;AE; THIS ROUTINE DEALLOCATES AND RETURNS TO THE CPR POOL A BUFFER BLOCK$;; ; INPUTS:c;i'; R0 ADDRESS OF BLOCK TO BE DEALLOCATED ; =; THE FIRST BYTE OF THE BLOCK IS THE LENGTH IN 32 WORD BLOCKS;V>; THE CORE BLOCK IS MERGED INTO THE FREE CORE CHAIN BY ADDRESS2; AND MERGED WITH ANY BORDERING BLOCKS IF POSSIBLE;S; R3, R4, R5 PRESERVED;CPRDEA: ' MOV @#KISAR6,-(SP) ;SAVE APR6 MAPPINGX MOV R0,@#KISAR6 ;MAP THE BLOCK MOVB 140000,R1 ;GET THE LENGTH% MOV (SP)+,@#KISAR6 ;RESTORE MAPPING& MOV #$CPRBF,R2 ;SET UP POOL LISTHEAD4 CALL $DESC1 ;DEALLOCATE THE POOL BLOCK AND RETURN;AL; FIRST CHECK IF ANY TASKS ARE WAITING FOR BUFFER SPACE. 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 TASKM;@210$: TST BUFFWT ;ANY TASKS WAITING FOR A BUFFER? BEQ 60$ ;NO, CHECK XXDRVR4 CLR -(SP) ;FLAG TO TELL IF $SETCR HAS BEEN CALLED* MOV $ACTHD,R0 ;GET THE FIRST ACTIVE TASK.20$: BIT #T4.LBW,T.ST4(R0) ;THIS TASK WAITING? BEQ 40$ ;NO, TRY THE NEXT ONE- BIC #T4.LBW,T.ST4(R0) ;CLEAR THE WAITING BIT - BIC #TS.RSW,T.STAT(R0) ;AND THE BLOCKING BITT' TST (SP) ;HAVE WE CALLED $SETCR YET? $ BNE 30$ ;YES, DON'T CALL IT AGAIN% CALL $SETCR ;CALL FOR A RESCHEDULE " INC (SP) ;MARK THAT WE DID THIS&30$: DEC BUFFWT ;DECREMENT THE COUNT BEQ 50$ ;IF IT'S ZERO, EXIT140$: MOV T.ACTL(R0),R0 ;GET THE NEXT ACTIVE TASKE BR 20$ ;AND GO CHECK AGAINT,50$: TST (SP)+ ;POP THE FLAG OFF THE STACK660$: TST XXWAIT ;WAS XXDRV WAITING FOR BUFFER SPACE? BEQ 70$ ;IF EQ NO, JUST EXIT $ CLR XXWAIT ;CLEAR THE BUFFER WAIT5 CMP XXBIAS,4(SP) ;WAS THIS A CPDEA CALL FROM XXDRV?T BNE 80$ ;NO, GO CALL XXDRVT370$: RETURN ;CALL WAS FROM XXDRV, JUST RETURN TO ! ;AVOID MULTIPLE CALL NESTINGS;0!; SET UP AND JUMP TO THE XXDRIVERT;B280$: MOV (SP),R5 ;GET THE CURRENT RETURN ADDRESS- MOV XXBIAS,(SP) ;SET UP THE BIAS FOR $MPPROG* MOV XXALRT,-(SP) ;AND THE RETURN ADDRESS7 MOV R5,-(SP) ;MOVE ORIGINAL RETURN ADDRESS FOR $MPPROF MOV XXR5,R5 ;RESTORE R5 JMP $MPPRO ;CALL THE DRIVER .PAGE( .SBTTL CPRSEN - SEND RING ENTRY TO VMS;H&; ** - CPRSEN - SEND RING ENTRY TO VMS;OF; TH00wvibjbkb a a aIS ROUTINE FILLS IN COMMON FIELDS IN THE HEADER AND THEN SENDS THE(; FILLED-IN HEADER-ITEM BUFFER TO VMS. ; ?; THE BITS IN THE OPCODE FIELD DETERMINE THE FOLLOWING ACTIONS:R; ; BIT ACTION;V8; 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 HEADER B; SF$IRT DON'T STORE RETURN ADDRESS IN HEADER, RETURN IMMEDIATELY(; SF$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 EXITINGDB; SF$NRS NO RESPONSE EXPECTED TO THIS PACKET - SET FLAG IN HEADER*; SF$DSW SET TASK DSW WHEN PACKET RETURNS9; SF$TCB THE TCB IS ALREADY IN R5, DON'T GET FROM $TKTCBH;E$; THE FOLLOWING OPCODES ARE DEFINED:;I9; SN$TSK SF$BLK!SF$HDR!SF$AST CALLED BY PRIVILEGED TASKSEG; SN$DIR SF$BLK!SF$HDR!SF$BIA!SF$AST!SF$DRF!SF$DSW CALLED BY DIRECTIVESDI; SN$IMP SF$BLK!SF$HDR!SF$BIA!SF$AST!SF$DSW CALLED BY IMPLICIT DIRECTIVESC4; SN$QIO SF$AST!SF$BIA!SF$HDR!SF$TCB CALLED BY XXDRV>; SN$PSR SF$BLK!SF$HDR!SF$IRT PSEUDO REQUEST BY OTHER ROUTINE0; SN$RSP SF$RSP!SF$IRT RESPOND TO VMS COMMANDS8; SN$NOT SF$NRS!SF$IRT NOTIFY VMS - NO RESPONSE NEEDED(; SN$DET SF$IRT!SF$HDR DETACHED RETURN;L ; INPUTS:E;RG; THIS ROUTINE IS CALLED BY THE MACRO CPSEN$ WHICH SETS UP THE STACK INE; THE FOLLOWING MANNER:S;I-; (SP) RETURN ADDRESS TO CPCALL EXEC MODULE ,; 2(SP) CALLING ROUTINE'S D SPACE APR5 BIAS,; 4(SP) CALLING ROUTINE'S I SPACE APR5 BIAS); 6(SP) CALLING ROUTINE'S RETURN ADDRESSR; 10(SP) OPCODE$; 12(SP) BUFFER ADDRESSH; 14(SP) BUFFER LENGTH8; 16(SP) ALTERNATE RETURN ADDRESS (FOR IMMEDIATE RETURN); ; OUTPUTS:;O; THE RING IS SENT TO VMSSCPRSEN:R;D%; FILL IN COMMON FIELDS IN THE HEADERH;R% MOV 12(SP),@#KISAR6 ;MAP THE BUFFERI& MOV #140000,R3 ;USE R2 TO MAP HEADER) BIT #SF$RSP,10(SP) ;IS THIS A RESPONSE?C BEQ 10$ ;NO) BIS #HF$RSP,H$FLAG(R3) ;SET RESPONSE BIT  BR 20$ ;CONTINUE IN COMMONS/10$: BIT #SF$NRS,10(SP) ;NO RESPONSE EXPECTED?T BEQ 20$ ;NO, BIS #HF$NRS,H$FLAG(R3) ;SET NO RESPONSE BIT:20$: BIT #SF$HDR,10(SP) ;SHOULD WE FILL IN HEADER FIELDS? BNE 25$ ;YES, FILL THEM IN:2 JMP 130$ ;NO, JOIN COMMON CODE TO SEND THE RING025$: CLR H$FLAG(R3) ;CLEAR THE HEADER FLAG WORD, BIT #SF$TCB,10(SP) ;SHOULD WE GET THE TCB?" BNE 27$ ;NO, IT'S ALREADY IN R5$ MOV $TKTCB,R5 ;GET THE CURRENT TCB627$: BIT #T3.PRV,T.ST3(R5) ;IS THIS A PRIVILEGED TASK? BEQ 30$ ;IF EQ NO1 BIS #HF$PVT,H$FLAG(R3) ;SET PRIVILEGED TASK FLAGE#30$: MOV T.PCB(R5),R2 ;GET THE PCBH/ MOV P.REL(R2),@#KISAR6 ;MAP THE HEADER IN APR61( MOV H.CUIC(R3),R2 ;GET THE CURRENT UIC' MOV 12(SP),@#KISAR6 ;REMAP THE PACKET ' BIT #174000,R2 ;IS THIS A SYSTEM UIC?( BNE 35$ ;IF ANY OF THOSE BITS SET, NO/ BIS #HF$SYS,H$FLAG(R3) ;SET THE SYSTEM UIC BITC735$: BIT #SF$AST,10(SP) ;WILL WE NEED TO QUEUE AN AST?G BEQ 40$ ;NOPE, JUST CONTINUEP, BIS #HF$AST,H$FLAG(R3) ;SET THE HEADER FLAG640$: BIT #SF$DSW,10(SP) ;WILL WE NEED TO SET THE DSW? BEQ 50$ ;NOPE, JUST CONTINUER, BIS #HF$DSW,H$FLAG(R3) ;SET THE HEADER FLAG950$: BIT #SF$BLK,10(SP) ;ARE WE GOING TO BLOCK THE TASK?U BEQ 60$ ;NOPE( BIS #HF$BLK,H$FLAG(R3) ;MARK AS BLOCKED! BIS #TS.RSW,T.STAT(R5) ;BLOCK IT$$ CALL $DRWSE ;REQUEST ANOTHER TASK60$:) MOV R5,H$TCB(R3) ;PUT TCB IN THE HEADER:- MOVB T.TKI(R5),H$TKI(R3) ;GET THE TASK INDEXA MOV T.UCB(R5),R2 ;GET TI: UCBI' TST U.RED(R2) ;UNIT REDIRECTED (CO:)?A BEQ 70$ ;NOPE% MOV U.RED(R2),R2 ;GET THE REAL UNITH470$: MOVB U.CPUN(R2),H$UNIT(R3) ;GET THE UNIT NUMBER( CLRB H$UNIT+1(R3) ;CLEAR RESERVED BYTE' CLR H$BIAS(R3) ;ASSUME NO BIAS STOREDH6 BIT #SF$BIA,10(SP) ;DO WE WANT TO SAVE THE APR BIAS? BEQ 80$ ;NO, IT'S A TASKS) MOV 4(SP),H$BIAS(R3) ;SAVE THE APR5 BIAS -80$: CLR H$RET(R3) ;ASSUME NO RETURN ADDRESS ' BIT #SF$IRT,10(SP) ;IMMEDIATE RETURN? * BNE 90$ ;YES, DON'T SAVE RETURN ADDRESS. MOV 6(SP),H$RET(R00wvt__DATADATADATADATA3) ;SAVE THE RETURN ADDRESS590$: BITB #HT$SYS,H$TYPE(R3) ;IS THIS PKT FOR CPRSYS?L/ BNE 100$ ;YES, DON'T DO LOST PACKET CHECKINGU; L; WE ONLY SHOW LOST PACKET FOR PACKETS GOING TO THE USER'S AME. REQUESTS TO; CPRSYS ALWAYS GO THROUGH.(; , CMPB #-1,H$TKI(R3) ;WAS THE TASK INDEX -1? BNE 110$ ;NO, IT'S OK;)J; THIS TASK NO LONGER HAS AN ASSOCIATED AME. SET THE STATUS TO IE.PRI ANDL; RETURN THE PACKET. AFTER THE PACKET HAS BEEN RETURNED, ALLOCATE A 1-BLOCKO; CPR PACKET FOR THE LOST PACKET NOTIFICATION. IF A BLOCK CANNOT BE ALLOCATED,$N; JUST EXIT - IT'S NOT CRUCIAL THAT EVERY LOST PACKET BE REPORTED. IF A BLOCKM; IS ALLOCATED, INSERT THE TASK NAME AND REQUEST TYPE AND SEND THE PACKET TO E; VMS WITH A DETACHED RETURN.U;(7 MOV @#KISAR6,R0 ;GET THE PACKET BIAS IN R0 FOR SENRSP1 CLR R1 ;PACKET IS NOT QUEUEDS7 MOV #IE.PRI,H$STAT(R3) ;SET PRIVILEGE VIOLATION STATUSP? MOVB H$TYPE(R3),-(SP) ;SAVE THE PACKET TYPE -CAN'T BE NEGATIVE - CALL SENRSP ;RETURN THE PACKET TO THE USERA' MOV (SP)+,R4 ;RESTORE THE PACKET TYPEA CLR R0 ;NO FLAGS FOR $CPALO MOV #1,R1 ;GET ONE BLOCKC CALL CPRALO ;TRY FOR IT* BCS 150$ ;IF NONE AVAILABLE, FORGET IT.! MOV R0,@#KISAR6 ;MAP THE PACKETE# MOV #140000,R3 ;APR6 BASE ADDRESS+ MOV #HT$LST,H$TYPE(R3) ;IT'S A LOST PACKETF! CLR H$FLAG(R3) ;CLEAR THE FLAGST" CLR H$RET(R3) ;NO RETURN ADDRESS CLR H$TCB(R3) ;CLEAR THE TCB$ CLRB H$UNIT(R3) ;SEND TO CPRSX$SYS( CLRB H$UNIT+1(R3) ;CLEAR RESERVED BYTE MOV R3,R0 ;COPY THE APR6 BASE) ADD #H$SIZE,R0 ;START OF PARAMETER AREAC$ MOV R4,(R0)+ ;MOVE THE PACKET TYPE0 BIT #SF$TCB,10(SP) ;IS THE TCB ALREADY SET UP? BNE 99$ ;YES, LEAVE R5 ALONEO MOV $TKTCB,R5 ;GET THE TCB999$: MOV T.NAM(R5),(R0)+ ;GET THE FIRST WORD OF THE NAME#/ MOV T.NAM+2(R5),(R0)+ ;GET SECOND WORD OF NAMEA' MOV @#KISAR6,R1 ;GET PACKET BIAS BACK  MOV #H$SIZE+6,R4 ;GET SIZE( BR 140$ ;AND SEND THIS PACKET INSTEAD100$:R$ CLRB H$UNIT(R3) ;SEND TO CPRSX$SYS( CLRB H$UNIT+1(R3) ;CLEAR RESERVED BYTE;P; MAKE SURE THAT THE PACKET IS AS BIG AS THE LENGTH SPECIFIED AS A SANITY CHECK.K; IF THE TASK IS STARTING A P0 IMAGE, MAKE SURE THAT THE PACKET CONTAINS ANLE; EXTRA BLOCK FOR A POTENTIAL P0 ABORT, AND SET THE P0 BIT IN THE TCBF;T110$:F MOV 14(SP),R1 ;GET THE LENGTH+" ADD #77,R1 ;ROUND TO NEXT BLOCK ASH #-6,R1 ;GET # OF BLOCKS< CMPB #HT$VMS,H$TYPE(R3) ;IS THIS GOING TO START A P0 IMAGE? BNE 120$ ;NO, CONTINUE  INC R1 ;ONE EXTRA BLOCK, BIS #T4.P0,T.ST4(R5) ;SET P0 BIT IN THE TCB.120$: CMPB R1,(R3) ;DO WE HAVE ENOUGH SPACE? BLE 130$ ;YUP, IT'S OKT( MOV #IE.ADP,H$STAT(R3) ;MARK AS NO ROOM" MOV @#KISAR6,R0 ;GET PACKET BIAS) CLR R1 ;SHOW THAT PACKET IS NOT QUEUEDA% CALL SENRSP ;SEND THE RESPONSE NOWT BR 150$ ;AND EXIT,130$: MOV 12(SP),R1 ;GET THE PACKET ADDRESS& MOV 14(SP),R4 ;GET THE PACKET LENGTH+140$: CALL SENPKT ;SEND THE PACKET TO VMSS;TB; NOW WE HAVE TO FIX THE STACK, AND RETURN. THERE ARE FOUR CASES:;BB; 1) A DIRECTIVE. PULL EVERYTHING OFF THE STACK BUT THE DSW, CALLC; $DRFIN TO FINISH THE DIRECTIVE, AND CALL $DRWSE TO RESCHEDULE.AC; 2) A $SWSTK CALL. PULL EVERYTHING OFF THE STACK AND CALL $DRWSE. E; 3) A PSEUDO REQUEST. PULL THE PARAMETERS OFF THE STACK AND RETURN.T>; 4) AN ALTERNATE RETURN. TREAT JUST LIKE AN IMMEDIATE RETURN;E0150$: BIT #SF$IRT,10(SP) ;SHOULD WE RETURN NOW?/ BNE 170$ ;IF NE, YES, GO PULL THE PARAMETERS , TST 16(SP) ;IS THERE AN ALTERNATE RETURN?( BNE 180$ ;YES, RETURN TO THAT ADDRESS" BIT #SF$DRF,10(SP) ;CALL $FINDR?( BNE 160$ ;IF NE, YES, SET UP AND CALL7 MOV #$STACK-22,SP ;GET RID OF EVERYTHING ON THE STACK  RETURNR160$:O6 MOV #$STACK-24,SP ;GET RID OF EVERYTHING BUT THE DSW JMP $FINDR ;GO TO $DRFINT>170$: MOV 6(SP),16(SP) ;THE TOP FOUR ELEMENTS ON THE STACK...1180$: MOV 4(SP),14(SP) ;...NEED TO BE MOVED DOWNL MOV 2(SP),12(SP) ;...0 MOV (SP),10(SP) ;...3 ADD #10,SP ;AND THEN SKIP THE REST OF THE PARAMSE RETURN .PAGE> .SBTTL SENPKT - SEND PACKET TO VMS OR QUEUE F00"w'wibjbkb a a aOR LATER SENDING;J; QUEUE THE PACKET, EITHER TO THE OUSTANING QUEUE, OR TO THE WAITING QUEUE/; SEND PACKET TO VMS AND MOVE TO THE NEXT RING.S;K ; INPUTS:T;D; R1 PACKET TO BE SENT ; R3 140000D; R4 PACKET LENGTH;7; PACKET MAPPED IN APR6E;P ; OUTPUTS:;OH; PACKET SENT TO VMS IF RING AVAILABLE AND INSERTED IN APPROPRIATE QUEUE;)=SENPKT: CLR H$LINK(R3) ;THIS WILL BE THE LAST PACKET IN LIST ; MOV #$CPOUT+2,R2 ;ASSUME PACKET TO BE IN OUSTANDING QUEUEPA BIT #HF$RSP!HF$NRS,H$FLAG(R3) ;WILL THIS REQUEST GET A RESPONSE? ! BEQ 10$ ;YES, QUEUE THE PACKETU" CLR R2 ;PACKET NOT TO BE LINKED(10$: MOV RNGBAS,@#KISAR6 ;MAP THE RINGS$ TST @SNDRNG ;IS A RING AVAILABLE?, BPL 20$ ;YUP, PUT IT IN OUTSTANDING QUEUE7 MOV #$CPWAT+2,R2 ;PUT PACKET IN WAITING QUEUE INSTEAD !20$: TST R2 ;QUEUE THIS PACKET?E BEQ 50$ ;NO, JUST SEND IT3 MOV (R2),-(SP) ;SAVE THE LAST PACKET IN THE QUEUEN- MOV R1,(R2) ;PUT NEW PACKET AT END OF LIST 2 MOV (SP)+,@#KISAR6 ;MAP THE PREVIOUS LAST PACKET3 BNE 30$ ;IF PACKET EXISTS, LINK NEW PACKET TO IT,4 MOV R1,-(R2) ;QUEUE EMPTY - PUT PACKET IN LISTHEAD BR 40$V330$: MOV R1,H$LINK(R3) ;LINK PACKET TO END OF LISTA! TST -(R2) ;BACK UP TO LISTHEADP.40$: MOV RNGBAS,@#KISAR6 ;MAP THE RINGS AGAIN/ CMP R2,#$CPWAT ;WAS THIS RING HELD FOR LATER? " BEQ 70$ ;YUP, DON'T SEND IT NOW; ; FILL IN THE RING;,050$: MOV SNDRNG,R2 ;GET THE ADDRESS OF THE RING CLR (R2)+ ; SYNCH WORD  MOV R4,(R2)+ ; LENGTH@ MOV R1,(R2)+ ; ADDRESS6 BIS #RF$SYN,@SNDRNG ;TELL VMS THAT THIS ONE IS READY; ;INTERRUPT IF NECESSARYU; $ TST @PRVSND ;SHOULD WE INTERRUPT? BMI 60$ ;NO, JUST CONTINUEN6 BIT #F5.NRT,$FMSK5 ;IS THIS A REMOTE NETWORK SYSTEM?2 BNE 55$ ;IF NE YES, DON'T DO KXJ SPECIFIC STUFF( MOV $KXVC1,@#KXJQIR ;INTERRUPT THE VAX BR 60$ ;CONTINUE IN COMMONT(55$: MOV $ACTHD,R0 ;GET THE CPRNET TCB  BIC #TS.STP,T.STAT(R0) ;UNSTOPE4 BIC #T2.STP*2!T2.STP,T.ST2(R0) ;CLEAR ALL STOP BITS, CALL $SETCR ;REQUEST SCHEDULING OF CPRNET;F;NOW MOVE TO THE NEXT RING;I>60$: MOV SNDRNG,PRVSND ;CURRENT RING IS NOW THE PREVIOUS RING/ ADD #R$SIZE,SNDRNG ;MOVE POINTER TO NEXT RINGI( CMP SNDRNG,WRAPSN ;DO WE NEED TO WRAP? BNE 70$ ;NOPE, EXIT+ MOV FRSTSN,SNDRNG ;START AT THE BEGINNINGF 70$: RETURN,KXINI::IKXCAN::TKXOUT::BKXPWF::C RETURNN .ENDT(55$: MOV $ACTHD,R0 ;GET THE CPRNET TCB  BIC #TS.STP,T.STAT(R0) ;UNSTOPE4 BIC #T2.STP*2!T2.STP,T.ST2(R0) ;CLEAR ALL STOP BITS, CALL $SETCR ;REQUEST SCHEDULING OF CPRNET;F;N .TITLE MLOCK; .IDENT /04.03/ ;T1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.c; All rights reservedt; A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDt9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.u;r;n$; RICHARD H. ECKHOUSE, JR. 5-MAR-75; ; MODIFIED BY:;M; J. M. LAWLER 07-JUL-83 04.01;c*; JL167 -- MAKE PATCH SPACE UNCONDITIONAL;k; J. W. BERZLE 08-SEP-83 04.02;C2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES;o$; Modified for RSX-11M-PLUS V4.6 by:; ; D. Carroll 18-Oct-1995 04.03<; DC404 -- Include PSECT definition to allow ICB pool to be!; fully extended during sysgenD;A;C$; MULTIPROCESSOR LOCKING SUBROUTINES;N; MACRO LIBRARY CALLSR;O" .MCALL HWDDF$,BGCK$A ;DC404- HWDDF$ ;DEFINE HARDWARE REGISTERS ;DC404 ;DC404/ .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404E ;**-1k .IF DF M$$PRO ;**-2C; ; LOCK WORDS ARE OF THE FORM:Y;D/; BYTE 0 = LOCK VALUE (0 IF LOCKED, 1 IF FREE)6; BYTE 1 = IF BYTE 0 EQUAL:"; 0, THEN BYTE 1 = OWNER OF LOCK"; 1, THEN BYTE 1 = COMPLEMENT OF; PREVIOUS OWNERu>; BYTE 2,3 = SECONDARY LOCK WORD (FORMAT ABOVE) FOR WAIT MASK.(; BYTE 4,5 = MASK OF WAITING PROCESSORS.;C+; NOTE: BYTES 4+5 ARE REFERENCED AS A WORD.R;S;+2; **-$MLOCK-MULTIPROCESSOR WAIT-LOCK LOCK ROUTINE.;EE; THIS ROUTINE WILL USE THE ASRB INSTRUCTION TO LOCK A DATA STRUCTURE-?; OR CODE SEGMENT. IT OPERATES ON LOCK BLOCKS DESCRIBED ABOVE.EG; IT I00*wvt__DATADATADATADATAS CALLED FROM AN INVOCATION OF THE LOCK$ MACRO WHEN THE LOCK TYPEEE; IS "WAIT". IT WILL ATTEMPT THE LOCK, AND IF IT FAILS WILL POST THE I; FACT THAT THIS PROCESSOR IS WAITING, THEN PLACE ITSELF IN A WAIT STATE.YB; 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.;-'$MLOCK::MOV R4,-(SP) ;SAVE R4 FOR LATER  MFPS -(SP) ;SAVE PRIORITYS. MTPS #PR7 ;DON'T WANT TO BE INTERRUPTED HERE .IF DF P$$D70% MOV $URMST,R4 ;;;GET ONLINE BUS RUNSE# BIC $CPMSK,R4 ;;;MAKE IT CPUS ONLY" BIC $CPBIT,R4 ;;;IGNORE OURSELVES1 BEQ 5$ ;;;IF EQ DON'T BOTHER TO FLUSH OR BYPASS4 BIS #BYPASS,@$MPCSR+6 ;;;FLUSH AND BYPASS THE CACHE5$: ;;;REFERENCE LABELC .ENDC;A; CURRENT STACK CONTENTS: ;E; 0(SP) = SAVED PRIORITY.V; 2(SP) = SAVED R4 FROM ENTRY.#; 4(SP) = RETURN ADDRESS TO CALLER.A&; 6(SP) = ADDRESS OF LOCK BLOCK.;T! MOV 6(SP),R4 ;;;GET LOCK ADDRESSE .IF DF L$$DBG$ CMPB 1(R4),$PROCN ;;;DO WE OWN LOCK. BEQ ERR5 ;;;IF EQ YES -- CRASH, NO WALK THRU .ENDC#10$: ASRB (R4) ;;;ATTEMPT THE LOCK; BCS 20$ ;;;IF CS WE NOW OWN IT;E; WE HAVE ATTEMPTED TO LOCK THE LOCK BYTE, AND FAILED TO GAIN ACCESS.E0; WE WILL NOW POST THE FACT THAT WE ARE WAITING.;S, 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 LOCKM- ASRB (R4) ;;;ATTEMPT THE PRIMARY LOCK AGAIN$& BCS 30$ ;;;IF CS WE GOT IT THIS TIME/ MTPS (SP) ;;;LOWER PRIORITY TO ENTRANCE VALUEH, TST $PWRFL ;;;SEE IF POWERFAIL FLAG IS SET* BNE 15$ ;;;IF SET, SKIP WAIT INSTRUCTION) BIT @$CPURM,$URMST ;;;ARE WE ONLINE YET?B$ BEQ 15$ ;;;IF EQ NO -- NO IIST YET! WAIT ;;;WAIT FOR ANY INTERRUPT 215$: MTPS #PR7 ;;;WE DON'T WANT TO BE INTERRUPTED" BR 10$ ;;;TRY PRIMARY LOCK AGAIN;A#; WE HAVE GAINED ACCESS TO THE LOCK,;N20$: ;;;REFERENCE LABEL .IF DF L$$DBG930$: CACHE$ BYPASS ;;;NEED TO CHECK OUT SOME REAL VALUESI- TSTB 1(R4) ;;;DOES LOCK ALREADY SHOW OWNED?C0 BPL ERR4 ;;;IF PL YES -- SOMEHOW WE BROKE LOCK& MOVB $PROCN,1(R4) ;;;SHOW US AS OWNER .IFTF- CACHE$ RESTOR ;;;THRU WITH CHANGABLE VALUES1 .IFF 30$: ;;;REFERENCE LABEL .ENDC MTPS (SP)+ ;;;RESTORE PRIORITY MOV (SP)+,R4 ;RESTORE R4T$ MOV (SP)+,(SP) ;MOVE RETURN ADDRESS CACHE$ FLUSH ;FLUSH CACHES RETURNL;ERR4: BGCK$A BF.MP,BE.OCP,FATAL ;OTHER CPU SHOWED OWNERSHIP0:ERR5: BGCK$A BF.MP,BE.WTL,FATAL ;ATTEMPT TO WALK THRU LOCK;+7; **-$MULCK-MULTIPROCESSOR WAIT LOCK UNLOCK SUBROUTINE.P;EB; 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.;O ; INPUTS:(;+!; 0(SP)=RETURN ADDRESS OF CALLER.M; 2(SP)=ADDRESS OF LOCK BLOCK.;; ; OUTPUTS:;R4; LOCK IS UNLOCKED. ANY WAITING PROCESSORS HAVE BEEN; INTERRUPTED.;R:; PRIORITY IS PRESERVED AT EXIT, BUT MAY GO TO ZERO DURING; THIS ROUTINES EXECUTION.;W; CACHE IS UNBYPASSED.;P; ALL REGISTERS ARE PRESERVED.;-$MULCK::MOV R5,-(SP) ;SAVE R5I 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! CMPB 1(R4),$PROCN ;DO WE OWN IT?R BNE ERR1 ;IF NE NO -- CRASHT ASRB (R4) ;IS LOCK LOCKED?% BCS ERR3 ;NO - WE JUST GOT IT, OOPSR COMB 1(R4) ;CLEAR WHO DONE ITE .ENDC;M!; SEE IF ANY PROCESSOR IS WAITINGE;X6 LOCK$ 2(R4),SPIN ;;;LOCK SECONDARY LOCK IN LOCK BLOCK/ MOV 4(R4),R5 ;;;GET MASK OF WAITING PROCESSORSR/ CLR 4(R4) ;;;CLEAR MASK OF WAITING PROCESSORSD;OD002w6wibjbkb a a a; 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.R;TF;******************************* IIST DEBUGGING CODE ***************** BR 4$ ;ENTER NEW CODEI BR 6$ ;DON'T ENTER NEW CODEYF;******************************* END IIST DEBUGGING CODE *************+4$: MOV R5,-(SP) ;GET SOME SPACE TO WORK ING' MOV $IIPND,-(SP) ;CALC $IIPND .AND. R5F/ COM (SP) ;CREATE MASK OF CPUS NOT HAVING WORKI8 BIC (SP)+,R5 ;R5=CPUS WHICH HAVE WORK AND WILL BE INTED# BEQ 5$ ;IF EQ DON'T BOTHER $IICPUI* 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 ;D&; WE HAVE A MASK OF WAITING PROCESSORS;  MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP)W MOV R2,-(SP)A MOV R3,-(SP)D) MOV R5,R1 ;SET UP PARAMETERS FOR $IIXMTC CALL $IIXMT MOV (SP)+,R3 ;RESTORE R3B MOV (SP)+,R2H MOV (SP)+,R1P MOV (SP)+,R0F610$: MTPS (SP)+ ;RESTORE PRIORITY TO SAME AS INCOMING MOV (SP)+,R4 ;RESTORE R4# MOV (SP)+,R5C0 MOV (SP)+,(SP) ;SLIDE RETURN ADDRESS DOWN STACK RETURNN>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 VALUE-ERR3: BGCK$A BF.MP,BE.LNS,FATAL ;LOCK NOT SET,CERR6: BGCK$A BF.MP,BE.MLK,FATAL ;ATTEMPT MADE TO EXIT MULTIPLE LOCKC .IFTF ; DF M$$PRO"$PATCH::.BLKW 40. ;PATCHING SPACE .ENDC .END+,R0F610$: MTPS (SP)+ ;RESTORE PRIORITY TO SAME AS INCOMING MOV (SP)+,R4 ;RESTORE R4# MOV (SP)+,R5C0 MOV (SP)+,(SP) ;SLIDE RETURN ADDRESS DOWN STACK RETURNN>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 CO .TITLE IISRV  .IDENT /03.11/ ;+ S1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.A; All rights reservedU;IA; This software is furnished under a license and may only be used9; or copied in accordance with the terms of such license.F; ; ; K. E. Kinnear 11-Nov-77; ; Modified by:; ; J. W. Berzle 08-Sep-83 03.00E; 3; JWB047 -- Add bugcheck facility and error codesT; %; D. T. Carroll November, 1989 03.10E;L6; Tally CPU ticks/per mode during sanity timer update;B%; D. T. Carroll September, 1990 03.20;S7; Include support in IIOPN to disable auxillary sanityl$; timers during offline processing.;s; D. Carroll 18-Oct-1995 03.21>; DC404 - Include PSECT statement to allow ICB pool expansion;l;n.; Interprocessor Interrupt Service subroutines;i; Macro library callsB;l .IF DF M$$PRO .MCALL HWDDF$,BGCK$A,ACNDF$% HWDDF$ ; Define hardware registers % ACNDF$ ; Define accounting offsets . .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404;&; IIST CSR definitions and status bits;.PGTE=0 ; Program generated transmit enables!PGCS=1 ; Program generated CSRpGO=1 ; Pgcs go bitrIE=4 ; Pgcs interrupt enable-!IP=10 ; Pgcs interrupt pendingC)RDY=4000 ; Pgcs ready to accept commandI%ERR=100000 ; Pgcs error summary bitr(STTE=2 ; Sanity timer transmit enableSTCS=3 ; Sanity timer CSRENB=1 ; Stcs enable countSTP=2 ; Stcs stop count+LKE=4 ; Stcs lockup processor if timeoutE/IMSK=4 ; Interrupt mask register - 1=disables,PGF=5 ; Program generated interrupt flags0STF=6 ; Sanity timer interrupt flags register%DCF=7 ; DCLO / Disconnect registersEXC=10 ; Exception register(MTC=15 ; Maintenance control register1B.CPAT = B.RLOD+4 ; Define offset for CPA's infor i% .SBTTL $IISTM, Set IIST enable masks ;+E; **-$IISTM- Set all Interprocessor Interrupt enable interrupt masks. ;;K; This routine will reset the interrupt mask in the IIST for this processor H; and noti00:wvt__DATADATADATADATAfy all others that their interrupt masks must also be changed.B; when the routine returns, all processors have reset their masks.; ; Inputs: ;c4; $IIMSK=desired interrupt mask for all processors.;= ; Outputs:;a?; R2=mask of processors who didn't reset their masks (if any).A;i; No registers are preserved.I;-*$IISTM::CALL $IISLM ; Set the local masks* MOV #MP.RSM,R2 ; Set reset masks function1 CALLR $IISFA ; Send function to all online CPUs " ; And wait for acknowledgement i7 .SBTTL $IINIT, Interprocessor Interrupt Initializationn;+4; **-$IINIT- Interprocessor Interrupt initialization8; **-$IIPWF- Interprocessor Interrupt powerfail service.;p?; This routine will validate the existance of an IIST, and thenc9; Set the local interrupt masks and the interrupt enable.g;e ; Inputs:e;d; None.;S ; Outputs:; ; None.;c; No registers are preserved.;-$IINIT:: ; Reference label0$IIPWF::CALL $IISLM ; Set local interrupt masks$ CALL $IISIE ; Set interrupt enable, CALL $IIKRB ; Get current IIST KRB address% CALL $SGFIN ; Disable Nxm traps ...p+ MOV (R4),R5 ; get the Primary CSR addressn6 BIC #KS.EXT,K.STS(R4) ; not parallel (secondary IIST) MFPS -(SP) ; save current PSWt- BISB K.PRI(R4),PS ; raise to device priorityn' MOVB 5(R5),R5 ;;; get the IIST self-IDN& BCS 20$ ;;; if CS, CSR doesn't exist+ BIC #^C<3>,R5 ;;; isolate the self-ID bits $ CMPB R5,$PROCN ;;; correct ID word?( BNE 20$ ;;; nope, not a secondary IIST8 BIS #KS.EXT,K.STS(R4) ;;; flag secondary IIST available' MOV (R4),R5 ;;; extract the CSR again / BIS #100000,4(R5) ;;; reset the secondary IIST )20$: MTPS (SP)+ ;;; restore previous PSWe( RETURN ; to caller, function complete n8 .SBTTL $IISLM, Set local Interprocessor interrupt masks;+6; **-$IISLM- Set local Interprocessor Interrupt masks.;R@; This routine will set the local interprocessor interrupt masks; To the value in $IIMSK;w ; Inputs:2; 0; $IIMSK=desired value of local interrupt mask.;R ; Outputs:;o; None.;a#; R0, R1, R2, and R3 are preserved.h;-:$IISLM::CALL $IIKRB ; Get IIST KRB if online, else return MFPS -(SP) ; Save priority, CACHE$ BYPASS ; Make sure we get right one, MOV $IIMSK,-(SP) ; Get desired mask setting CACHE$ RESTOR ; Unbypass# MOV (SP),-(SP) ; Copy top of stackc" COM (SP) ; Change state for IIST+ BIC #177760,(SP) ; Make it processors onlyr# BIS #7400,(SP) ; Don't allow boots MOV (R4),R5 ; Get CSR addressi8 BISB K.PRI(R4),@#PS ; Increase priority, don't decrease+ MOV #DCF,(R5) ; Get disconnected CPU flagsd$ MOV 2(R5),-(SP) ; Into top of stack0 SWAB (SP) ; Put disconnect flags in lower byte5 BIC $CPMSK,(SP) ; Only processors that we care about5 BIS (SP),2(SP) ; Disallow interrupts from these CPUsE6 MOV (SP)+,K.CRQ(R4) ; Save mask of broken connections2 MOV #IMSK,(R5) ;;; Select interrupt mask register) MOV (SP)+,2(R5) ;;; Load interrupt masksP' BIC #177760,(SP) ;;; Make it just CPUse, MOV (SP),-(SP) ;;; Duplicate stack contents% MOV #1,R4 ;;; Initialize odd parityR# CLC ;;; Set up initial carry bitV" ROR (SP) ;;; Check low order bit BEQ 20$ ;;; If EQ eq# ADC R4 ;;; Accumulate parity bitsS'10$: ASR (SP) ;;; Get next bit in word BEQ 20$ ;;; End of all bitsr# ADC R4 ;;; Accumulate parity bitsC BR 10$ ;;; Go back for moren 20$: ADC R4 ;;; Add in last bit% BIC #177776,R4 ;;; Get only last bit2$ ASL R4 ;;; Put it in correct place) MOV #STCS,(R5) ;;; Select register againP MOV R4,2(R5) ;;; Set parity bit$ TST (SP)+ ;;; Get rid of zero word0 MOV #STTE,(R5) ;;; Get transmit enable register& MOV (SP)+,2(R5) ;;; Load the register MTPS (SP)+ ;;; Reset priorityl RETURNy S3 .SBTTL $IISIE, Set Interprocessor Interrupt Enable ;+1; **-$IISIE- Set Interprocessor Interrupt enable.t;H; This routine will clear out the status registers of the interprocessor5; interrupt device and then set the interrupt enable.c;e ; Inputs:M;#; None.; ; Outputs:; ; None.;R-; Registers R0, R1, R200Bw6wibjbkb a a a, and R3 are preserved. ;-<$IISIE::CALL $IIKRB ; Get IIST KRB addr if onl, else return MFPS -(SP) ; Save priority3 BISB K.PRI(R4),@#PS ; Raise, don't lower, priorityy& MOV (R4),R4 ;;; Get IIST CSR address& MOV #PGCS,(R4) ;;; Select program CSR CLR 2(R4) ;;; Clear it out5 MOV #177777,R5 ;;; Set word to clear out status bitsg, MOV #EXC,(R4) ;;; Select exception register MOV R5,2(R4) ;;; Clear it out( 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 CSR' MOV #IE,2(R4) ;;; Set interrupt enable4! MTPS (SP)+ ;;; Restore priorityt RETURN( 4) .SBTTL $DISAN, Disable all sanity timers ;+&; **-$DISAN- Disable all sanity timers;tB; This routine clears $stenb and then $STTIC, disabling the sanityC; Timer for the CPU on which it is called. it should be called fromtD; Each processor before doing a long non-interruptible sequence such ; As crash or parity error stop.;a ; Inputs:s; NoneV;, ; Outputs:; Nonet;M; All registers are preserved;-8$DISAN::CALL $SAVNR ; Save registers that get clobbered( CLR $STENB ; Set to disable all timers i1 .SBTTL $STTIC, Sanity timer interrupt processinga;+/; **-$STTIC- Sanity timer interrupt processing.d;eC; This routine is designed to be called at every tick on every CPU.lB; It will update the sanity timer on the particular processor, and#; will stop the timer if necessary.s;a ; Inputs:y;r<; This routine is designed to be called from code executing<; at a priority as high as or higher than that of the IIST.;v ; Outputs:;t; None.;d); Registers R0, R1, R2, and R3 preserved.;-$STTIC:: ; Reference label8 CACHE$ SAVE,BYPASS ; Bypass cache to look at real flags .IF DF X$$ACC&A$$CNT&XA$$MD;+7; Handle clock interrupt processing of CPU activitiesl; 0; The layout of the processor mode counters are:; Word 0,1: Kernel mode; 2,3: Super/User mode; 4,5: Idle loop activity 4; 6,7: Waiting for executive lock (mutex wait);-# MOVB $PROCN,R4 ; get the CPU indexf) ASH #4,R4 ; and create the right offsetd9 ADD #140002+B.CPAT,R4 ; adjust to our CPU specific block ' MOV #2*4,R5 ; index for idle countersy( TSTB $IDLFL ; are we in the idle loop?$ BGT 3$ ; if GT, yes, handle it ...' MOV @#PS,R5 ; get the current PS wordl? BIC #^C<10000>,R5 ; clean down to the previous mode super/user,5 ASH #-10.,R5 ; shift the status down to the low bits,* BNE 3$ ; if NE, we're in User/super mode;+@; See if we're pending for $EXECL, if so flag waiting for lock;-: BIT $CPBIT,$EXECL+4 ; see if we are waiting for exec lock, BEQ 3$ ; nope, normal kernel mode activity. MOV #3*4,R5 ; indicate waiting for exec lock,3$: ADD R5,R4 ; and select the correct word MOV R0,-(SP) ; save R0' MOV R4,R0 ; shift info for accounting5 CALL $ACINC ; have accounting do the increments ...p .ENDC ; X$$ACC&A$$CNT&XA$$MDh75$: TST $STFLG ; Any reason to process sanity timers ?U BEQ 30$ ; If EQ eq910$: CALL $IIKRB ; Get IIST KRB addr if onl, else returnkG; ******************************* IIST debugging code *****************;;pC; Find out if the IIST is locked up. to do this we will see if therA; IP!IE bits are set for 10 times in a row. If they are, we willR; toggle the IE bit.;R#15$: MOV (R4),R5 ; Get CSR addressC MOV #PGCS,(R5) ; Select CSR( MOV #IE!IP,-(SP) ; See if both bits set% BIC 2(R5),(SP)+ ; Are they both set?  BNE 16$ ; If NE ne2 INC K.CRQ(R4) ; Show one more time that ie!ip set 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.;-% MOV #PGCS,(R5) ; Select the registere CLR 2(R5) ; Clear IE+ MOV #PGCS,(R5) ; Select the register againe BIS #IE,2(R5) ; Set IE againR/16$: CLR K.CRQ(R4) ; Start the count over againS18$: ; Reference labelEG; ******************************* end of IIST debugging code **********B00Jwvt__DATADATADATADATA MOV (R4),R4 ; Get CSR address;% MOV #STCS,(R4) ; Select sanity timerP= BIT $CPBIT,$STENB ; Should we update and enable sanity timeri ; On this CPU? BEQ 20$ ; If EQ eq4 BIC #4,2(R4) ; Turn off sanity timer lockout always1 MOV #STCS,(R4) ; Re-select sanity timer register#8 MOV #177401,-(SP) ; Set mask for longest timer interval7 BIT $CPBIT,$STALR ; Should we enable alarm and lockoutg BEQ 19$ ; If EQ eq* 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 RETURNB.20$: BIC #5,2(R4) ; Clear sanity timer counter0 BIC $CPBIT,$STFLG ; Clear timer processing flag030$: CACHE$ UNSAVE ; Reset prior state of cache RETURNV S9 .SBTTL $IIOPN, Open up the IIST to the rest of the world);+6; **-$IIOPN- Enable the IIST to the rest of the world.;o@; This routine will perform a master clear of the IIST when this?; processor goes offline. This will allow another processor toaB; boot and interrupt this one at a later time. It will also place-; the IIST KRB offline in the running system.a;a ; Inputs:c;t; none.;I ; Outputs:;r; none.;s-; Registers R0, R1, R2, and R3 are preserved.t;-<$IIOPN::CALL $IIKRB ; Get IIST KRB addr if onl, else return$ MFPS -(SP) ; Save current priority- BIS #KS.OFL,K.STS(R4) ; Put IIST KRB offlineo6 BISB K.PRI(R4),@#PS ; Raise priority to highest point. MOV (R4),-(SP) ; extract the IIST CSR address6 BIT #KS.EXT,K.STS(R4) ; do we have an auxillary IIST?+ BEQ 20$ ; if EQ, nope, don't reset it ...h< BIC #KS.EXT,K.STS(R4) ; clear out the secondary IIST status: BIS #100000,@(SP) ; Clear out the primary IIST completely, ADD #4,(SP) ; adjust to the secondary IIST420$: BIS #100000,@(SP)+ ; Clear out IIST completely! MTPS (SP)+ ; Restore priorityB RETURNL S' .SBTTL $IIKRB, Get address of IIST KRBR;+,; **-$IIKRB- Get IIST KRB address if online.;4F; 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.;S ; Inputs:y;#; 0(SP)= Return address to caller.r,; 2(SP)= Return address to caller's caller.;T ; Outputs:;M"; If IIST for this CPU is online:; R4 = KRB address.B; return to caller.R; Else ; R4 = undefined.R; return to caller's caller.;u; R4 is destroyed. ;-=$IIKRB::MOVB $PROC2,R4 ; Get this processors processor number 2 MOV $IICTB(R4),R4 ; Get KRB address for this IIST& BIT #KS.OFL,K.STS(R4) ; Is it online? BEQ 10$ ; If EQ eq# TST (SP)+ ; Remove callers return 10$: RETURN : .SBTTL $IINOT, Interrupt all online CPUs and wait for ack. .SBTTL $IISFA, Send function and wait for ack;+D; **-$IINOT- Interrupt all online CPUs and wait for acknowledgement.H; **-$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 functionTC; passed as an argument, while $IINOT will send a nop function just ;; to make sure that the other processors can hear this one.n;r ; Inputs:i;C$; R2 = Function code ($IISFA only).;d ; Outputs:;a<; R2 = Processors who didn't acknowledge function (if any).;o; R4 and R5 are preserved.F;-)$IINOT::MOV #MP.NOP,R2 ; Set NOP functiond-$IISFA::MOV $URMST,R1 ; Get online processorsp# BIC $CPMSK,R1 ; Make it CPU's only BIC $CPBIT,R1 ; Not ourselves0 BNE $IIWAK ; If NE, we have someone to send to CLR R2 ; Show everything is ok RETURNo c. .SBTTL $IIWAK, Send function and wait for ack;+8; **-$IIWAK- Send function and wait for acknowledgement.;d8; This routine will use $IIFNX to transmit a function to?; a number of processors, and it will wait a specified intervale<; of time for those processors to clear out the function bit:; from their function table. if they do not clear out the5; func00Rw6wibjbkb a a ation within that time, this routine will returnB=; a error status, and the processor mask(s) for the CPUs that ; haven't done their jobs.;c ; Inputs:I;K'; R1 = Mask of processors to function.*; R2 = Function mask.;w ; Outputs:;e); Processors have received the function.X; 2; R2 = CPUs who didn't ack the function (if any).;t); Registers R1, R4, and R5 are preserved. ;--$IIWAK::MOV R2,-(SP) ; Save the function mask7 CALL $IIFNX ; Transmit the function to the other CPUse/ MOV (SP)+,R3 ; Restore the function mask to r3r" MOV R4,-(SP) ; Save r4 for caller. CLR -(SP) ; Create timeout counters on stack) CLR -(SP) ; Timeout is double precision ' MOV R1,R2 ; Copy interrupted CPU mask ;+9; Outer loop -- Set up to scan thru the whole table again ;-810$: MOV #$MPTAB,R0 ; Initialize pointer to top of table# MOV #1,R4 ; Set up clear bit mask ;+G; Inner loop -- Loop through $MPTAB to see if processor has cleared bitI;-/20$: CACHE$ BYPASS ; Look at value of real bitV9 MOV (R0)+,-(SP) ; Get value of switch table for next CPU + CACHE$ RESTOR ; Go back to fAST executionm( BIT R3,(SP)+ ; Has CPU cleared bit yet?6 BNE 30$ ; If NE, no processor has not acked function BIC R4,R2 ; Clear out CPU bite BEQ 40$&30$: ASL R4 ; Move bit clear bit left$ BIC $CPMSK,R4 ; Only deal with CPUs& BNE 20$ ; If NE, more CPU's to check0 ADD #1,2(SP) ; Count of failures to communicate- ADC (SP) ; High order word of dbl precision0& CMP #1,(SP) ; Should we give up now?$ BGT 10$ ; If GT, nope, check again640$: CMP (SP)+,(SP)+ ; Clean timeout counter off stack% MOV (SP)+,R4 ; Restore R4 for caller 50$: RETURNi .DSABL LSB$ 8 .SBTTL $IISVC, Process function, and interrupt next CPU;+:; **-$IISVC- Interprocessor Interrupt pending URM service.;e@; This routine is used to take the pending URM interrupt mask in>; $IIPND and convert them to pending CPU interrupts in $IICPU.>; It will then interrupt the next processor round robin, using ; $IINXT. ;e ; Inputs:B;1:; $IIPND contains mask bits for all URMs needing service.;m ; Outputs.;f>; 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 the; selected CPU.;s; No registers are preserved.;- .ENABL LSBt.$IISVC::CACHE$ BYPASS ; Figure out work to do% MOV $IIPND,R1 ; Get pending URM maskn4 BIC $IICPU,R1 ; Clear out those already interrupted CACHE$ RESTOR, TST R1 ; Any work not already interrupted? BEQ 80$ ; If EQ eq8 MOV #$URMTB,R0 ; Start scan thru CPU URM connection tbl- CLR R3 ; Clear out accumulator for CPU bitsi510$: BIT R1,(R0)+ ; Are any pending runs on this CPU?t5 BEQ 20$ ; If EQ, no, don't interrupt this processors7 BIS $BTMSK-$URMTB-2(R0),R3 ; Yes -- set this CPU's bitN420$: CMP #$URMTB+,R0 ; Is it end of table? BHI 10$ ; If GT gt! TST R3 ; Any CPU's to interrupt15 BNE 25$ ; If NE, yes, process the functions pending;+-; No CPUs to interrupt. We shouldn't be here8;-# BIC $CPMSK,R1 ; is this a CPU URM?c- BEQ 80$ ; if EQ, powerfail on external bussr: BGCK$A BF.MP,BE.UNP,FATAL ; Some URM not connected to CPU;+; Interrupt next CPU in order.;f@; Special note: $IINXT contains a pointer into $BTMSK. It is a;; common pointer, yet is both read without bypass (possbily,<; 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.n;-<25$: MOV $IINXT,R2 ; Get pointer into $BTMSK for round robin330$: BIT (R2)+,R3 ; Does this CPU need an interrupta0 BNE 40$ ; If NE, yes, interrupt this processor* CMP #$BTMSK+,R2 ; End of table?) BHI 30$ ; If HI, nope, pointer is valid - MOV #$BTMSK,R2 ; Start at top of table again  BR 30$ ; Go back00Zwvt__DATADATADATADATA040$: MOV -(R2),R1 ; Get the CPU's bit for $IIXMT7 MOV R2,$IINXT ; Save pointer into $BTMSK for rnd robinp MFPS -(SP) ; Save priority$ MTPS #PR7 ; Raise priority to lock LOCK$ $FORKL,SPIN= BIS $URMTB-$BTMSK(R2),$IICPU ;;; Show these URMs interruptedT ULOCK$ $FORKL,SPIN  MTPS (SP)+ ; Restore priority  N( .SBTTL $IINXT, IIST Interrupt transmit;+/; **-$IIXMT- Interprocessor Interrupt transmit.,;p>; This routine will interrupt the CPU specified by bit mask in); R1, using the interprocessor interrupt.R; ; Inputs:';i7; R1=processor bit mask for processor(s) to interrupt.o;n ; Outputs:; ; None.; ,; R1, R4, and R5 are preserved across call.;-1$IIXMT::MOVB $PROC2,R0 ; Get processor number * 2 * MOV $IICTB(R0),R3 ; Get KRB address of II6 BIT #KS.OFL,K.STS(R3) ; Is IIST for this CPU offline?6 BNE 80$ ; If NE, yes, don't interrupt this processor;+*; Calculate parity for the processor mask.;-& MOV R1,R2 ; Duplicate processor mask) MOV #1,R0 ; Initialize odd parity in r0r CLC ; Clean out carry1 ROR R2 ; Put first bit in carry -- dont sign exr BEQ 60$ ; No bits left! ADC R0 ; Bump parity count$50$: ASR R2 ; Put next bit in carry& BEQ 60$ ; If EQ, end of accumulation ADC R0 ; Accumulate parity BR 50$ ; Go back for more bits60$: ADC R0 ; Add in last bit$ BIC #177776,R0 ; We want parity bit% ASL R0 ; Justify in parity positiont+ BIS #,R0 ; Add other important bits,# MOV (R3),R2 ; Get CSR of the IIST# MFPS -(SP) ; Save priority2 BISB K.PRI(R3),@#PS ; Raise, don't lower priority+ CLR R3 ; Initialize infinite loop counter * MOV #PGTE,(R2) ;;; Select device register MOV R1,2(R2) ;;; Set it upi%70$: MOV #PGCS,(R2) ;;; Select ii CSRc2 ADD #1,R3 ; Count number of times we have looped( BCS 75$ ; If overflow, forget the IIST BIT #RDY,2(R2) ;;; Is it ready  BEQ 70$ ;;; If EQ eq/ MOV #PGCS,(R2) ;;; Yes -- find register and go,- MOV R0,2(R2) ;;; Yes -- load function and go 1 TALLY$ B.IPSN,XA$$IP,CPU ; Count an IP Intr sentB#75$: MTPS (SP)+ ; Restore priority 80$: RETURNR ;, .SBTTL $IBXMT, Interprocessor boot transmit;+*; **-$IBXMT- Interprocessor boot transmit.; A; This routine will boot the processors specified by the bit masko; in R1.; ; Inputs:v;o1; R1 = Processor bit mask of processors to boot.T;D ; Outputs:;i; None.;Q,; R1, R4, and R5 are preserved across call.;-.$IBXMT::SWAB R1 ; Place bits in correct place& CALL $IIXMT ; Transmit boot requests) SWAB R1 ; Restore R1 to original purityP RETURN;;+,; Misc. interrupt service special processing;-;+; Jump off to processor entry.;-1$CPBGN::NOP ; Let operator continue (debugging)i# JMP $PENT ; Go to processor entry ;+&; Error sensed in IIST flag registers.;-8ERROR: BGCK$A BF.MP,BE.FHW,FATAL ; Can't handle this yet;+,; No errors or interrupts -- why are we here;-8NOINT: BGCK$A BF.MP,BE.NIN,FATAL ; No implementation yet .DSABL LSB  T: .SBTTL $IIINT, Interprocessor Interrupt interrupt service;+9; **-$IIINT- Interrprocessor Interrupt interrput service.r;s>; This routine accepts incomming interrupts from the IIST. It>; will, if the proper bit is clear in $IIWAT, report reception9; Of the interrupt to all waiting processors and load its.:; Interrupt masks. otherwise, it will simply exit throughB; $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!r;t ; Inputs:s;i$; PS=controller id in lower 4 bits.;r ; Outputs:;s; None.;B; Executes at interrupt level, and at exec level. Observes proper(; register conventions for those levels.;- .ENABL LSB 0$IIINT::MFPS -(SP) ;;; Save condition code bits;+>; 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, thenn>; its IIST vector points to this routine. S00bw6wibjbkb a a aince the bootstrap?; turns off mapping prior to enabling interrupts, the fact thatA; the mapping is turned off is a signal to this routine that this?; is a CPU startup, and we should jump to $CPBGN (and thence toI ; $PENT).S;-$ BIT #1,SR0 ;;; Is mapping enabled?5 BEQ $CPBGN ;;; If EQ, no, must be processor startupe/ MTPS (SP)+ ;;; Restore PS condition code bitst2 INTSV$ II,PR6,M$$PRO ;;; Do normal interrupt save) MOV (R5),R4 ;;; Get CSR address of IISTI;+F; If a secondary IIST is present, we will check for an intr pending,I; and if so, call the primary service, and return back to do it again ...s;s9; Note: if the interrupt is pending, the stack will be:e;o; 4(SP) - Return to $INTXT; 2(SP) - KRB address*; 0(SP) - Return to process secondary IIST;-7 BIT #KS.EXT,K.STS(R5) ;;; do we have a secondary IIST? ) BEQ 3$ ;;; If EQ, nope, don't check ...V1 MOV #PGCS,4(R4) ;;; check the secondary IIST CSR(+ MOV 6(R4),-(SP) ;;; get the secondary PGCS 3 BIC #^C,(SP) ;;; clear all but desired bitsi* CMP (SP)+,# ;;; are both bits set?4 BNE 3$ ;;; if NE, nothing pending on the secondary& MOV R5,-(SP) ;;; save the KRB address2 CALL 3$ ;;; process the primary controller intr.) MOV (SP),R5 ;;; restore the KRB addresss- MOV (R5),R4 ;;; get the primary CSR addressd) ADD #4,R4 ;;; select the secondary IISTI) INC (SP) ;;; and flag as secondary IIST4% BR 4$ ;;; and process the interrupt43$: TALLY$ B.IPRC,XA$$IP,CPU ; Count an IP Intr RcvdG; ********************************* IIST debugging code ***************b/ CLR K.CRQ(R5) ;;; Clear out counter for $STTICeG; ********************************* end IIST debugging code *********** - MOV R5,-(SP) ;;; Save KRB on stack for latere/4$: MOV #EXC,(R4) ;;; Select exception register  MOV 2(R4),R5 ;;; Get all bits, MOV #EXC,(R4) ;;; Select exception register$ MOV R5,2(R4) ;;; Clear all received4 BIC #177400,R5 ;;; Clear out all but the rte errors& BEQ 5$ ;;; If EQ, no errors observed. MOV (SP),R5 ;;; Get KRB address for IIST krb0 INC K.CRQ+2(R5) ;;; Increment rte error counter35$: MOV #DCF,(R4) ;;; Select DC / lo flags register* MOV 2(R4),R5 ;;; Get all bits0 MOV #DCF,(R4) ;;; Select DC / lo flags register MOV R5,2(R4) ;;; Clear all bits- BIT #1,(SP) ;;; is this the secondary IIST? 0 BNE 10$ ;;; if NE, yes, don't adjust any masks3 BIC #177400,R5 ;;; Use only the DCF bits (not brk)7 BEQ 10$ ;;; If no DCF changes # MOV R4,-(SP) ;;; Save CSR on stackr/ CALL $IISLM ;;; Set the local interrupt maskso MOV (SP)+,R4 ;;; Restore R4810$: MOV #STF,(R4) ;;; Select sanity timer flag register MOV 2(R4),R5 ;;; Get flagsM( MOV #STF,(R4) ;;; Select register again MOV R5,2(R4) ;;; Clear them out6 BEQ 20$ ;;; If EQ, interrupt not due to sanity timer& BIC #177760,R5 ;;; Make it CPU's only* ROR (SP)+ ;;; primary or secondary IIST?! BCC 15$ ;;; if CC, primary IISTt6 BGCK$A BF.SAN,BE.IDC,DIRECT2 ;;; Sanity timer errorF15$: BGCK$A BF.SAN,BE.FHW,DIRECT2 ;;; Crash with sanity timer message920$: MOV #PGF,(R4) ;;; Select interrupt received mask regS3 MOV 2(R4),R5 ;;; Get mask of those who interruptede# MOV #PGF,(R4) ;;; Select PGF againe4 MOV R5,2(R4) ;;; Clear those bits to show reception. BEQ 30$ ;;; if EQ, nothing in the flags byte, BIT #1,(SP) ;;; is this the secondary IIST0 BEQ 30$ ;;; if EQ, nope, process the PGF flags- DEC (SP) ;;; reset R4 to be the KRB addressD$ MOV R5,-(SP) ;; save our mask field) MOV 2(SP),R5 ;;; restore our KRB addressh) MOV (R5),R4 ;;; extract the CSR addressR/ ADD #4,R4 ;;; point to the secondary IIST CSR26 BIT #KS.POE,K.STS(R5) ;;; parallel operation enabled?0 BNE 32$ ;;; if NE, yes, treat function as real5 BIT #KS.UOP,K.STS(R5) ;;; is some task handling PGF?i( BEQ 37$ ;;; if EQ, nope, just reset IE;+5; Dispatch the PGF flags to the requesting task ...e;-7 SWAB (SP) ;;; save interrupting CPUs in the high byter& CLRB (SP) ;;; and clear the low byte' CALL 38$ ;;; re-enable interrupts ...r#00jwvt__DATADATADATADATA BR 35$ ;;; and rejoin common code 030$: MOV R5,-(SP) ;;; Save those who interrupted<32$: CALL 38$ ;;; reset the interrupt enable, after cleanup CACHE$ BYPASS$ MOV @$MPSWT,R5 ; Get function table CACHE$ RESTOR< BIC #MP.INT,R5 ; Only processor those to be done at int lvl, BEQ 35$ ; If EQ, not an interrupt function) MOV (SP),R4 ; Get those who interruptedA! CALL $IIFNC ; Execute functionsi&35$: MOV (SP)+,R5 ; Get interrupt mask& MOV (SP)+,R4 ;;; Get KRB address back+ TST K.FRK+2(R4) ;;; Have we a fork queued?m& BEQ 40$ ;;; If EQ, nope, go fork ...4 BIS R5,K.FRK+4(R4) ;;; Add our CPUs to current fork RETURNa+37$: CMP (SP)+,(SP)+ ;;; clean up the stackT;+-; Nothing is pending for our CPU, just cleanI1; up and return, after resetting interrupt enable;-038$: MOV #PGCS,(R4) ;;; Select IIST CSR register CLR 2(R4) ;;; Clear it out, MOV #PGCS,(R4) ;;; Select IIST CSR register' MOV #IE,2(R4) ;;; Set interrupt enableM RETURN ;;; to callerd;+; Queue fork block;-/40$: ADD #K.FRK+6,R4 ;;; Point to last word + 2,( CALL $FORK1 ;;; Exit thru fork routine;+; Executive level service.;-% CACHE$ BYPASS ; Force cache bypassu' SUB #,R3 ; Create KRB addresso> MTPS K.PRI(R3) ; Raise priority to block II interrupt service/ CLR K.FRK+2(R3) ;;; Show fork block not in useS; BIS K.FRK+4(R3),R5 ;;; Get any additional bits from window  MTPS #0 ;;; Lower priority CLR R4 ; Create an accumulator1 BISB R5,R4 ; Put interrupt mask in proper placeo4 SWAB R5 ; Get the high byte, and process if needed1 BIC #177400,R5 ; Isolate only secondary activity3 BEQ 45$ ; if EQ, nothing to notify task about ...r/ MOV $VERTK,R0 ; do we have a task to queue to?d& BEQ 45$ ; if EQ, nope, skip this ...& TST T.STAT(R0) ; is the task running?. BMI 45$ ; if MI, nope, don't do anything ...;+G; Call the processing task, and allow it to process the remote systemo; interrupt, if desired ...a;-1 MOV $NXTLK,KISAR5 ; Map to the task bias desired  .IF DF,K$$DAS( MOV $NXTLK,KINAR5 ; and also in I-space .ENDC ;DF,K$$DAS 3 MOV R4,-(SP) ; save our primary IIST mask word ...n1 CALL @$NXTLK+2 ; and call the desired subroutine;- MOV (SP)+,R4 ; restore the primary IIST maskf'45$: MOV @$MPSWT,R5 ; Get function mask  CACHE$ RESTOR TST R5 ; Process functions* BEQ 50$ ; If EQ, no functions to process CALL $IIFNC 50$: RETURNt .DSABL LSB  o/ .SBTTL $IIFNC, Execute interprocessor functionV;+-; **-$IIFNC- Execute Interprocessor Function.F;,>; This routine will take a function mask in R5 and execute all?; functions corresponding to the bits set in the mask. It willL; use the jump table at $MPDSP.d;b ; Inputs:M;(0; R4=processors that have interrupted this one.'; R5=function mask for this processor.E;E ; Outputs:;;;; All of the functions specified in the function mask haves; been executed.:;T ; R0, R1, R2, R3 are preserved.;-$IIFNC::MOV R3,-(SP) ; Save R3) MOV R4,-(SP) ; Save R4 for our use latero# MOV #100000,R4 ; Set up clear mask ) MOV #$MPDSP,R3 ; Set start of jump table.10$: ASL R5 ; Pick up next bit from left side/ BCC 20$ ; If CC, don't dispatch this function;+"; We found a function for this bit;- MOV R5,-(SP) ; Save R5R MOV R4,-(SP) ; Save R4p MOV R3,-(SP) ; Save R3:;+/; Call function subroutine from dispatch table. ;k;; The function subroutines called from interrupt level havee;; R3, R4, and R5 available for use. Those called from execR%; level have all registers available. ; ; Inputs:s;*; R4=mask of processors that interrupted.;-2 MOV 6(SP),R4 ; Put processor interrupt mask in R42 CALL @(R3) ; Call subroutine from dispatch table MOV (SP)+,R3 ; Restore R3 MOV (SP)+,R4 ; Restore R4 MFPS -(SP) ; Save priority/ MTPS #PR7 ; Don't get interrupted during lockt. LOCK$ $IIFNL,SPIN ;;; Lock the function table* BIC R4,@$MPSWT ;;; Clear out our function1 ULOCK$ $IIFNL,SPIN ;;; Unlock the function tableo% MTPS (SP)+ ;;; Restore the priorityr MOV (SP)+,R5 ; 00rwxwibjbkb a a aRestore R5320$: BEQ 30$ ; If EQ, no more functions to processe% TST (R3)+ ; Bump jump table pointern% ROR R4 ; Point at next bit to clear / BNE 10$ ; If NE, bit hasn't shifted into CC-Ce0 ; (This will never fall thru - R5 = 0 first)730$: MOV (SP)+,R4 ; Restore R4 (not really necessary --i MOV (SP)+,R3 ; Restore R3 RETURN ;+.; **-$IIFNX- Interprocessor function transmit.;c=; This routine will load the bit in the function mask for the ;; appropriate processor and will interrupt the processor(s)?; directly if the function can be processed at interrupt level, A; otherwise the processor will be interrupted to go to exec level; and process the function. ;f ; Inputs:-;%; R1=mask of processors to function. ; R2=function mask.;R ; Outputs:;(); Processors have recieved the function.e;r); Registers R1, R4, and R5 are preserved.c;-+$IIFNX::MOV R1,R0 ; Duplicate process word MOV #$MPTAB,R3 ; Point to table*10$: CLC ; Make following ror work write$ ROR R0 ; Put next CPU bit in carry3 BCC 20$ ; If CC, don't need to interrupt this CPU ;+H; We have found a CPU bit on. Place the function mask into his function; word. ;- MFPS -(SP) ; Save priority. MTPS #PR7 ; Dont get interrupted during lock. LOCK$ $IIFNL,SPIN ;;; Lock the function table" BIS R2,(R3) ;;; Set the function1 ULOCK$ $IIFNL,SPIN ;;; Unlock the function table:! MTPS (SP)+ ;;; Restore priority & TST R0 ; Set the condition code bits#20$: BEQ 30$ ; If EQ, nothing lefte2 TST (R3)+ ; Point to next word in function table BR 10$ ; Go back for moret730$: BIC #MP.INT,R2 ; Special interrupt level function?n5 BEQ 40$ ; If EQ, nope, fork to process the function ;+C; This function is one of those which is processed in the interrupt$B; 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.n;-$ CALL $IIXMT ; Interrupt processors RETURNr;+C; In the following case, the processors must be in the executive to E; process the function. We consider this another reason to interrupto<; the processor in the normal, round robin scheme of things.;- 40$: MFPS -(SP) ; Save priority0 MTPS #PR7 ; No interrupts during locked period) LOCK$ $FORKL,SPIN ;;; Lock the fork lists5 BIS R1,$IIPND ;;; Set the CPU's we want to interrupte, ULOCK$ $FORKL,SPIN ;;; Unlock the fork list! MTPS (SP)+ ;;; Restore priority  RETURN  .ENDC .END;+C; In the following case, the processors must be in the executive to E; process the function. We consider this another reason to interrupto<; the processor in the normal, round robin scheme of things.;- 40$: MFPS -(SP) ; Save priority0 MTPS #PR7 ; No interrupts during locked period) LOCK$ $FORKL,SPIN ;;; Lock the fork lists5 BIS R1,$IIPND ;;; Set the CPU's we want to interrupte, ULOCK$ $FORKL,SPIN ;;; Unlock the fork list .TITLE DRCRV2 .IDENT /04.03/];R1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.,; All rights reservedl;-;-<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;P; MODIFIED FOR M-PLUS V2.0 BY:;2; J. M. LAWLER; T. M. MARTIN; D. R. DONCHIN +; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:&;C; J. R. KAUFFMAN;3+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:I;; B. S. MCCARTHY; L. B. MCCULLEY; +; MODIFIED FOR RSX-11M-PLUS VERSION 4.1 BY:];R ; K. L. NOEL; ; MODIFIED FOR CPRSX V1.1 BY:A;%; K. L. NOEL 29-December-1989 V4.02S;W>; KLN137 - Fix status returned for create VT on CPR and don't; clobber r5 during deavt;F%; Paul K. M. Weiss 29-Jan-1990 V4.03U;2>; PKW190 - Link VT unit into data base before sending "Create0; Subprocess" packet so unit is not re-used.;RE; THIS MODULE CONTAINS THE DIRECTIVE ROUTINES AND PRIMARY SUBROUTINESS1; WHICH PROVIDE PARENT-OFFSPRING TASKING S00zwvt__DATADATADATADATAUPPORT.X;M; MACRO LIBRARY CALLS;1 .MCALL ABODF$,DCBDF$,HDRDF$,TCBDF$,UCBDF$,CPRDF$ K . ABODF$ ;DEFINE ABORT CODES. DCBDF$ ;DEFINE DEVICE CONTROL BLOCK SYMBOLS% HDRDF$ ;DEFINE TASK HEADER SYMBOLSi, TCBDF$ ;DEFINE TASK CONTROL BLOCK SYMBOLS9 UCBDF$ ,,TTDEF,SYSDEF ;DEFINE UNIT CONTROL BLOCK SYMBOLSs1 CPRDF$ ;DEFINE CPR PACKETS OFFSETS AND SYMBOLS ;e; LOCAL SYMBOL DEFINITIONS;I T"D$LGTH=D.PCB+2 ;LENGTH OF VT DCB& .IF DF C$$RTK ;REMOTE SYSTEM SUPPORT)U$LGTH=U.VNAM+10-U.UAB ;LENGTH OF VT UCB  .IFF(U$LGTH=U.PTCB+2-U.UAB ;LENGTH OF VT UCB .ENDC ;REMOTE SYSTEM SUPPORT $MAP6=140000 ;FIRST ADDRESS OF APR6 E;+(; **-$DRCRV-CREATE VIRTUAL TERMINAL UNIT;KB; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE A VIRTUAL TERMINAL-; UNIT AND RETURN THE UNIT NUMBER IN THE DSW.Y;L ; DPB FORMAT:D;N#; WD. 00 -- DIC(149.),DPB SIZE(5.).&; WD. 01 -- INPUT AST ROUTINE ADDRESS.'; WD. 02 -- OUTPUT AST ROUTINE ADDRESS.D'; WD. 03 -- ATTACH AST ROUTINE ADDRESS.U*; WD. 04 -- MAXIMUM ALLOWED BUFFER LENGTH.;G ; INPUTS:-;A@; 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)D;N-; 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 BNE 1$ ;IF NE YEST JMP 100$ ;REPORT ERROR1$::$ .IF DF C$$RTK ;REMOTE TASK SUPPORT, BIT #F5.RTK,$FMSK5 ;REMOTE TASKS TURNED ON? BEQ 10$ ;IF EQ NO ( MOV #1,R1 ;SET FOR 1 BLOCK FROM CPRBUF9 MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT STARTF MOV R3,R5 ;SAVE R3% CALL $CPALO ;GET BUFFER FROM CPRBUF MOV R5,R3 ;RESTORE R3S MOV $TKTCB,R5 ; AND R5T MOV R0,-(SP) ;SAVE BUFFER BIASL10$: .IFTF ;C$$RTK4 MOV #D$LGTH+U$LGTH,R1 ;PICK UP SIZE OF VT DATA BASE$ CALL $ALOCB ;ALLOCATE VT DATA BASE BCC 15$ ;IF CC OKAYE .IFT ;C$$RTK , BIT #F5.RTK,$FMSK5 ;REMOTE TASKS TURNED ON? BEQ 14$ ;IF EQ NOU TST (SP)+ ;POP STACK14$: .ENDC ;C$$RTK JMP 90$ ;ALLOCATION FAILUREV15$: 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 BASES. CMP R2,#$VTDCB+D$LGTH+U$LGTH ;DONE WITH COPY? BLO 20$ ;IF LO NO1 SUB #U$LGTH+U.UAB,R0 ;POINT BACK TO START OF UCBK) MOV R0,D.UCB(R1) ;SET UCB POINTER IN DCBL- MOV R1,(R0) ;SET DCB POINTER IN UCB (U.DCB).5 MOV R0,U.RED(R0) ;SET UP REDIRECTION POINTER (U.RED)D3 BIT #T3.PRV,T.ST3(R5) ;IS ISSUING TASK PRIVILEGED?4 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 O. 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 5 MOV H.DUIC(R4),(R0)+ ;INITIALIZE DEFAULT UIC (U.UIC)3. 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 LENGTHI& CMP R2,#V$$TLM ;GREATER THAN MAXIMUM? BLOS 40$ ;IF LOS NOA= BIS #U3.DBF,U.CW3-U.PTCB(R0) ;DISABLE INTERMEDIATE BUFFERINGE00wxwibjbkb a a a*40$: MOV #$VTDCB,R0 ;POINT TO DCB FOR VT0:-60$: MOV R0,R2 ;COPY POINTER TO PREVIOUS DCB+ 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 YES70$: .IF DF C$$RTK, BIT #F5.RTK,$FMSK5 ;REMOTE TASKS TURNED ON? BEQ 80$ ;IF EQ NOF;SH; WE HAVE TO LINK THIS IN NOW IN CASE SOMEONE ELSE TRIES TO CREATE A VT:;V( MOV R0,(R1) ;LINK NEW UNIT TO NEXT ONE, MOV R1,(R2) ;LINK PREVIOUS UNIT TO NEW ONE( MOV D.UCB(R1),R5 ;GET UCB ADDRESS IN R5; MOVB D.UNIT(R1),U.UNIT(R5) ;GIVE VT A PHYSICAL UNIT NUMBER#" CLC ;INDICATE ONLINE TRANSITION+ CALL $CPCON ;DO CROSS INDEX WITH CPDRIVER.' CLRB U.OCNT(R5) ;CLEAR OFFSPRING COUNT? MOV (SP)+,KISAR6 ;MAP PACKET.$ MOV #MAP6,R3 ;GET ADDRESS OF HEADER3 MOVB #HT$CSB,H$TYPE(R3) ;CREATE SUBPROCESS REQUESTE CLRB H$ICNT(R3) ;NO ITEMS( ADD #H$SIZE,R3 ;POINT TO PARAMETER AREA CLR (R3) ;GET UNIT NUMBERN& MOVB D.UNIT(R1),(R3) ;GET UNIT NUMBER9 ADD $RMTTT,(R3) ;ADD IN OFFSET OF NUMBER OF HT TERMINALS  DEC (R3)+ ;VT0: IS JUST PROTOG MOV R1,(R3) ;SAVE THE DCB# CPSEN$ #SN$DIR,KISAR6,#H$SIZE+2 MOV R0,KISAR6 ;MAP PACKET% MOV MAP6+P$DPB+2,R1 ;RESTORE THE DCBA/ CMP #IS.SUC,MAP6+H$STAT ;WAS SUCCESS RETURNED?. BNE 75$ ;IF NE NO ' MOV D.UCB(R1),R3 ;GET VT'S UCB ADDRESS;, MOV U.CPUN(R3),MAP6+H$UNIT ;SET UNIT NUMBER# CLR H$FLAG+MAP6 ;INDICATE NO FLAGSA' CLR H$RET+MAP6 ; AND NO RETURN ADDRESSNB MOV KISAR6,U.RAST(R3) ;STORE PACKET BIAS IN UCB FOR HT$DSB PACKET CLR -(SP) ;CLEAR WORD ON STACK/ MOVB D.UNIT(R1),(SP) ;SET UNIT NUMBER ON STACKS. MTPD$ @#H.DSW ;SET UNIT NUMBER IN USER'S DSW, MOV $TKTCB,R5 ;GET TASK'S TCB ADDRESS AGAIN BR 85$ ;JOIN COMMON CODE P75$:+ MOV #$VTDCB,R0 ;GET POINTER TO VT DATABASE7"76$: CMP (R0),R1 ;IS OUR VT NEXT? BEQ 77$ ;YES, REMOVE ITV MOV (R0),R0 ;GET NEXT DCBU BR 76$ ;TRY AGAINA,77$: MOV (R1),(R0) ;UNLINK FROM THE DATABASE( MOV MAP6+H$STAT,-(SP) ;GET ERROR STATUS MOV R1,R0 ;GET DCB ADDRESS0 MOV #D$LGTH+U$LGTH,R1 ;GET LENGTH OF ALLOCATION% CALL $DEACB ;DEALLOCATE DCB AND UCBB0 MOV KISAR6,R0 ;GET ADDRESS OF CPRBUF ALLOCATION' CALL $CPDEA ;DEALLOCATE CPRBUF PACKETB D) MTPD$ @#H.DSW ;SET STATUS IN USER'S DSW5 BIS #1,$UMPS ;SET CARRY BIT R RETURN ;780$: .ENDC ;C$$RTK( 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 **O;T; SPM HOOKPOINT NUMBER 23.;E); DO NOT CHANGE THE INSTRUCTION FOLLOWINGL; LABEL WITHOUT CHECKING SPM;-+$SPH23==. ;SPM CHANGES THE INSTRUCTION ATC ;THE LOCATION OF THIS LABELD85$:' INC T.RDCT(R5) ;INC TASK RUNDOWN COUNTT RETURN ;E%90$: DRSTS D.RS1 ;ALLOCATION FAILURE6100$: DRSTS D.RS6 ;VIRTUAL TERMINAL DRIVER NOT LOADED ;++; **-$DRELV-ELIMINATE VIRTUAL TERMINAL UNITS;I@; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ELIMINATE THE SPECIFIED; VIRTUAL TERMINAL UNIT.;O ; DPB FORMAT:K;N#; WD. 00 -- DIC(151.),DPB SIZE(2.). ); WD. 01 -- VIRTUAL TERMINAL UNIT NUMBER.C;G ; INPUTS:;H@; 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 ;INVA00wvt__DATADATADATADATALID 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 COUNT 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 .IF DF C$$RTK ;REMOTE TASKSV U, BIT #F5.RTK,$FMSK5 ;REMOTE TASKS TURNED ON? BEQ 115$ ;IF EQ NO% MOV D.UCB(R0),R3 ;GET ADDRESS OF UCB " MOV U.RAST(R3),KISAR6 ;MAP PACKET/ CLR U.RAST(R3) ;GET RID OF REFERENCE TO PACKETG MOV #MAP6,R3 ;POINT TO PACKET0 MOVB #HT$DSB,H$TYPE(R3) ;DELE00wwibjbkb a a aTE SUBPROCESS TYPE MOV R0,-(SP) ;SAVE R0 CPSEN$ #SF$IRT,KISAR6,#H$SIZE MOV (SP)+,R0 ;RESTORE R0F115$:  .ENDC ;C$$RTK. MOV #D$LGTH+U$LGTH,R1 ;SET SIZE TO DEALLOCATE* CALLR $DEACB ;DEALLOCATE DATA STRUCTURES $;+,; **-$CVTLN-CLEAR VIRTUAL TERMINAL LUN WORDS; D; THIS ROUTINE IS CALLED TO CLEAR (DEASSIGN) ANY LUN ENTRIES FOR THEA; CURRENT TASK WHICH POINT TO THE SPECIFIED VIRTUAL TERMINAL UCB.T;D ; INPUTS:C;O!; R0=VIRTUAL TERMINAL UCB ADDRESSA;T ; OUTPUTS:;,; 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$ ;R .TITLE DRQIOE .IDENT /15.06/.;D1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.M; All rights reservedU; ;<; 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 8-OCT-73R;P+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:R;U; J. R. KAUFFMAN; J. M. LAWLER ; T. LEKASS; B. S. MCCARTHY;U+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:I;L ; H. HUANG ; S. C. ADAMSP; S. M. THOMAS; J. W. BERZLE; B. S. MCCARTHY; L. B. MCCULLEY; ; MODIFIED BY:;1; K. L. NOEL 06-JAN-87 V15.00; ); KLN032 -- ADD IMPLICIT LUN ASSIGNMENTSS;R; K. L. NOEL 05-MAR-87 V15.01B;S,; KLN036 -- ADD SUPPORT FOR REMOTE OVERLAYS; ; K. L. NOEL 11-MAR-87 V15.02U;R<; KLN038 -- BYPASS CHECKS FOR NON-MOUNTED MOUNTABLE DEVICES; ON REMOTE SYSTEMS.; ; K. L. NOEL 6-APR-87 V15.03;C-; KLN040 -- FIX IMPLICIT ALUN CALL TO A JUMP ; ; K. L. NOEL 16-JUN-87 V15.04D;P:; KLN054 -- ALLOCATE CPRBUF PACKET FOR KILL I/O FUNCTIONS;U"; ERIC POSTPISCHIL 20-JUL-87 15.05=; edp057 -- REMOVE CORRECT NUMBER OF ITEMS FROM KERNEL STACKI ; WHEN BACKING UP TASK'S PC.;V!; Paul K. M. Weiss 2-May-90 15.06T-; PKW195 -- Treat overlays correctly for CPR7;5; MACRO LIBRARY CALLSB;S8 .MCALL F11DF$,HWDDF$,PKTDF$,SHDDF$,TCBDF$,PCBDF$,UCBDF$ .MCALL BGCK$A .MCALL CPRDF$ 0 F11DF$ ;DEFINE FILES-11 CONTROL BLOCK OFFSETS$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS* SHDDF$ ;DEFINE SHADOW RECORDING OFFSETS, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS , UCBDF$ ;DEFINE UNIT CONTROL BLOCK OFFSETS) CPRDF$ ;DEFINE COPROCESSOR DEFINITIONSo;l; LOCAL SYMBOLS ;7 MAP6 = 140000;+; **-$DRQIO-QUEUE I/O REQUESTF'; **-$DRQIW-QUEUE I/O REQUEST AND WAIT.C; C; THESE DIRECTIVES INSTRUCT THE SYSTEM TO PLACE AN I/O REQUEST IN AOC; QUEUE OF PRIORITY ORDERED REQUESTS FOR A DEVICE-UNIT SPECIFIED BYAB; A LOGICAL UNIT NUMBER. IN ADDITION, IF THE DIRECTIVE IS QIO ANDH; WAIT AND AN EVENT FLAG IS SPECIFIED, THE TASK IS PUT INTO A WAIT STATE; FOR THE SPECIFIED EVENT FLAG.N;C ; DPB FORMAT:F;S%; WD. 00 -- DIC(1./3.),DPB SIZE(12.).I; WD. 01 -- I/O FUNCTION CODE. ; WD. 02 -- LUN AND UNUSED BYTE.A; WD. 03 -- EVENT FLAG NUMBER AND PRIORITY (PRIORITY IS IGNORED).(; WD. 04 -- ADDRESS OF I/O STATUS BLOCK.+; WD. 05 -- ADDRESS OF AST SERVICE ROUTINE.T; WD. 06 -- PARAMETER 1.; WD. 07 -- PARAMETER 2.; WD. 10 -00wvt__DATADATADATADATA- PARAMETER 3.; WD. 11 -- PARAMETER 4.; WD. 12 -- PARAMETER 5.; WD. 13 -- PARAMETER 6.;T ; INPUTS:P;I9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.P1; R3=ADDRESS OF THE I/O FUNCTION CODE IN THE DPB.)/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.U,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)S;F-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.S&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.D7; DIRECTIVE STATUS OF 'D.RS5' IS RETURNED IF SPECIFIED-; LUN IS NOT ASSIGNED.;- .ENABL LSB/$DRQIO::MOV (R3)+,-(SP) ;SAVE I/O FUNCTION CODEO% CALL $MPLUN ;MAP LUN TO UCB ADDRESSO BCC 10$ ;IF CC LUN ASSIGNEDD/ .IF DF C$$DFB&C$$RTB ;RUN TIME BINDING OF LUNSK3 BIT #T4.DFB,T.ST4(R5) ;TASK HAVE DEFERRED BINDING?  BEQ 5$ ;IF EQ NO T5 BIT #F5.RTB,$FMSK5 ;SYSTEM SUPPORT RUN TIME BINDING?  BEQ 5$ ;IF EQ NO0 TST (SP)+ ;REMOVE I/O FUNCTION CODE FROM STACK JMP $IMASG ;DO IMPLICIT ALUN .ENDC ;C$$DFB&C$$RTB '5$: DRSTS D.RS5 ;SET DIRECTIVE STATUS G10$: # .IF DF R$$AMD ;AUTOMOUNT/DISMOUNT , CMP $VERTK,R5 ;QIO FROM VERIFICATION TASK ?. BEQ 14$ ;IF EQ, YES - BREAKTHROUGH STALL I/O ASSUME US.SIO,200) TSTB U.ST2(R2) ;STALL I/O IN PROGRESS ?4' BMI 13$ ;IF MI, YES - DON'T QUEUE I/OG  .ENDC ; DF R$$AMD# BIT #1,(R1) ;OPERATION PENDING ?  BEQ 14$ ;IF EQ NOB13$:9 ADD #12,SP ; REMOVE FUNCTION, RETURN AND +1 FROM STACK.A0135$: SUB #2,$UMPC ;BACKUP TASK PC TO RE-EXECUTE) CALLR $TKWSE ;WAITFOR SIGNIFICANT EVENTE14$:$ .IF DF C$$RTK ;REMOTE TASK SUPPORT, BIT #F5.RTK,$FMSK5 ;REMOTE TASKS TURNED ON? BEQ 145$ ;IF EQ NO+ CMPB 1(SP),#IO.KIL/256. ;IS THIS I/O KILL? BNE 145$ ;IF NE NO/ CMP (R2),$XXLOW ;IS I/O KILL FOR A GENERIC UCB  BLO 145$ ;IF LO, NOU/ CMP (R2),$XXHGH ;IS I/O KILL FOR A GENERIC UCBO BHI 145$ ;IF HI, NOB MOV R3,-(SP) ;SAVE R3 MOV R0,-(SP) ; AND R0 MOV R1,-(SP) ; AND R1* MOV #AL$SWS,R0 ;CALL IS FROM SYSTEM STATE" MOV #1,R1 ;ONE BLOCK TO ALLOCATE CALL $CPALO ;GET PACKET4" BCC 143$ ;IF CC, ALLOCATION OKAY* ADD #14,SP ;GET RID OF JUNK ON THE STACK" BR 135$ ;GO TO BACK UP USER'S PC+143$: MOV R0,$CPPKT ;SAVE ADDRESS OF PACKET1 MOV (SP)+,R1 ;RESTORE R1, MOV (SP)+,R0 ; AND R0 MOV (SP)+,R3 ; AND R3 CLR $CPLUN ;6 MOVB -2(R3),$CPLUN ;STORE LUN NUMBER TO KILL I/O ON .ENDC ;C$$RTK145$: . BIT #DV.ISP!DV.OSP,U.CW1(R2) ;SPOOLED DEVICE? BEQ 16$ ;IF EQ NO#1 CMP U.ATT(R2),R5 ;IS ISSUING TASK THE DESPOOLER?O) BEQ 155$ ;IF EQ YES, I/O TO REAL DEVICEC1 BITB #US.MNT,U.STS(R2) ;SPOOLED DEVICE MOUNTED ?42 BNE 15$ ;IF NE NO (US.MNT IS DEVICE NOT MOUNTED)2 CMP U.ACP(R2),R5 ;ISSUING TASK THE DEVICE'S ACP ?) BEQ 155$ ;IF EQ YES, I/O TO REAL DEVICEB15$: CMPB 1(SP),#IO.WLB/256. ;WRITE LOGICAL FUNCTION NOT BY DSPLR? BNE 16$ ;IF NE NOS# DRSTS D.RS16 ;PRIVILEGE VIOLATIONN2155$: 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?D BNE 17$ ;IF NE YES# DRSTS D.RS6 ;SET DIRECTIVE STATUST&17$: MOV R0,-(SP) ;SAVE POINTER TO UCB. MOV R1,-(SP) ;SAVE POINTER TO SECOND LUN WORD( MOVB (R3),-(SP) ;SAVE EVENT FLAG NUMBER( CALL $CEFNG ;CONVERT EVENT FLAG NUMBER. BIC #1,R1 ;CLR GRP GLOBAL 2ND WORD INDICATOR) BIC R0,(R1) ;CLEAR SPECIFIED EVENT FLAG6 MOV R3,-(SP) ;SAVE ADDRESS OF I/O STATUS BLOCK ADDRES6 MOV (R3),R0 ;GET ADDRESS OF I/O STATUS BLOCK ADDRESS1 BEQ $DQLM2 ;IF EQ NO I/O STATUS BLOCK SPECIFIED;)$DQLM1::CLR -(SP) ;ZERO I/O STATUS BLOCKY MTPD$ (R0)+ ; CLR -(SP) ;S MTPD$ (R0) ;,$DQLM2::CALL $ALPKT ;ALLOCATE AN I/O PACKET .IF DF A$$CNT" MOV R0,-(SP) ;SAVE PACKET ADDRESS3 MOV T.ACN(R5),R0 ;LOCATE ACCOUNTING BLOCKS OF TASKU' BEQ 20$ ;IF EQ, NO ACCOUNTING ON TASKD) MOV #B.QIO,R1 ;OFFSET TO QIO COUNT FIELDE" CALL $ADAT1 ;INCREMENT QIO COUNT/20$: MOV (SP)+,R0 ;RESTORE PACKET ADDRESS TO R0A .ENDC? TALLY$ B.QIOC,XA$$IO,CPU ;COUNT AN I/O INITIATION FOR THIS CPUP .IF DF S$$HDW8 MOV00wwibjbkb a a a #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).;V MOV 6(SP),R1 ;GET UCB ADDRESS$ BIC U.CW1(R1),R3 ;ARE ALL BITS SET? BNE 23$ ;IF NE NO -- EXITN, 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 UMBO;C; THE REPLACEMENT CONTROL TASK MUST BE SPECIAL CASED FOR SHADOWING.IC; IT IS THE ONLY TASK THAT MAY READ OR WRITE EITHER THE PRIMARY OR P;; THE SECONDARY DEVICE WITHOUT ITS FUNCTION BEING SHADOWED.T;U( CMP $RCTPT,R5 ;IS THIS I/O FROM RCT...? BEQ 23$ ;IF EQ YES# CMP 6(SP),M.UCBS(R1) ;PRIMARY UCB?C BEQ 21$ ;IF EQ YES$ CALL $DEPKT ;DEALLOCATE I/O PACKET# DRSTS D.RS16 ;PRIVILEGE VIOLATIONA;?A; DEVICE SUPPORTS SHADOW RECORDING AT THIS TIME. ALLOCATE THE ML(; NODE AND LINK IT IN THE LIST AT M.LHD.;M521$: BIT #MS.MDA,M.STS(R1) ;CAN WE ALLOCATE NEW ONES?  BNE 23$ ;IF NE NOH& MOV R0,-(SP) ;SAVE CURRENT I/O PACKET MOV R1,-(SP) ;SAVE UMB ADDRESSO& MOV #ML.LGH,R1 ;SET LENGTH OF ML NODE CALL $ALOCB ;GET PACKET  BCC 22$ ;IF CC GOT SPACE;S=; NOT ENOUGH SPACE FOR THE ML NODE IN THE SYSTEM POOL. SEEMSC=; A SHAME TO KILL THE I/O AFTER GETTING THE FIRST PACKET, ANDI=; NOT THE SECOND. MAYBE THE FINAL ANSWER IS TO LET THE FIRST.=; GO THRU AND ONLY CONSIDER IT A PROBLEM IF IT WAS A WRITE ORM>; 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).;VC; FOR THE TIME BEING, IF WE CAN'T GET THE RESOURCES NOW, FORGET IT.2;  TST (SP)+ ;REMOVE UMB ADDRESSH% MOV (SP)+,R0 ;GET I/O PACKET ADDRESSO$ CALL $DEPKT ;DEALLOCATE I/O PACKET! DRSTS D.RS1 ;ALLOCATION FAILUREI%22$: MOV R0,R1 ;COPY ML NODE ADDRESSE CLR (R0)+ ;CLEAR LINK WORD' MOVB #ML.LGH,(R0)+ ;ML.LEN SET LENGTHW% MOVB #MT.PKT,(R0)+ ;ML.TYP SET TYPEF) CLR (R0)+ ;ML.DNC/UNUSED SET DONE COUNTH8 MOV 2(SP),(R0)+ ;ML.PRI SET PRIMARY I/O PACKET ADDRESS MOV (SP)+,R0 ;GET UMB ADDRESS4 MOV M.LHD(R0),(R1) ;LINK NEW NODE TO PREVIOUS FIRST- MOV R1,M.LHD(R0) ;POINT LISTHEAD TO NEW NODE & MOV (SP)+,R0 ;GET OLD I/O PACKET BACK23$: ;REFERENCE LABEL .ENDC .IF DF R$$LKL5 CLR I.PRM+16(R0) ;INITIALLY CLEAR LOCK ENTRY POINTER  .ENDC9 ADD #I.AADA,R0 ;POINT TO ATTACHEMENT DESCRIPTOR POINTERSL0 MOV R0,$ATTPT ;SAVE POINTER FOR $CKBFX ROUTINES% CLR (R0)+ ;CLEAR FIRST ATT DESC PTRH CLR (R0) ;SECOND4 SUB #I.AADA+2,R0 ;POINT BACK TO START OF I/O PACKET, INCB T.IOC(R5) ;INCREMENT I/O REQUEST COUNT6 MOV (SP)+,R3 ;RETRIEVE ADDRESS OF I/O STATUS BLOCK AD+ CMPB -10(R3),#3 ;IS FUNCTION QIO AND WAIT?P BNE 25$ ;IF NE NOR" MOV R0,-(SP) ;SAVE PACKET ADDRESS) MOVB 2(SP),R0 ;PICK UP EVENT FLAG NUMBERC BEQ 24$ ;IF EQ NONE SPECIFIEDC. CALL $CEFI ;CONVERT FLAG TO MASK AND ADDRESS% CALL $DRWFS ;PUT TASK IN WAIT STATEP .IF DF G$$GEF7 INC @$GEFPT ;KEEP GRP GLOBALS AROUND FOR WAITFOR TEST . INCB @$GFTCB ;INC GRP GBL USE COUNT FOR TASK .ENDC ; DF G$$GEF)24$: MOV (SP)+,R0 ;RESTORE PACKET ADDRESS($25$: MOV R0,R4 ;COPY PACKET ADDRESS+ TST (R4)+ ;POINT TO SECOND WORD IN PACKET 7 MOVB T.PRI(R5),(R4)+ ;PRIORITY IS THAT OF ISSUING TASKK+ MOVB (SP)+,(R4)+ ;INSERT EVENT FLAG NUMBERG! MOV R5,(R4)+ ;INSERT TCB ADDRESSC3 MOV (SP)+,(R4)+ ;INSERT POINTER TO SECOND LUN WORDS# MOV (SP)+,R5 ;RETRIEVE UCB ADDRESST! MOV R5,(R4)+ ;INSERT UCB ADDRESST) MOV (SP)+,(R4) ;INSERT I/O FUNCTION CODE 3 CLR -(SP) ;SET FLAG TO QUEUE TO DRIVER (NE 0=ACP).) MOV R0,-(SP) ;SAVE ADDRESS OF I/O PACKETO4 CLR -(SP) ;CLEAR ADDRESS OF SECONDARY CONTROL BLOC" MOV SP,$TEMP0 ;MARK STACK ADDRESS( MOV (R4)+,-(SP) ;SAVE I/O FUNCTION CODE. CLR R1 ;ASSUME NO I/O STATUS BLOCK SPECIFIED. CLR R2 ;ASSUME NO I/O STATUS BLOCK SPECIFIED. MOV (R3)+,R0 ;GET ADDRESS OF I/O STATUS BLOCK BEQ 30$ ;IF EQ NONE SPECIFIEDR0 CALL $RELOC ;RELOCATE I/O STATUS BLOCK ADDRESS:30$: MOV R0,(R4)+ ;INSERT VIRTUAL ADDRESS OF I/O STATUS 00wvt__DATADATADATADATABL% MOV R1,(R4)+ ;INSERT RELOCATION BIASE* MOV R2,(R4)+ ;INSERT DISPLACEMENT ADDRESS .IF DF S$$LIB. MOV (R3)+,R2 ;GET AST SERVICE ROUTINE ADDRESS) CALL $CALTA ;CALCULATE ADDRESS TO STORES' MOV R2,(R4)+ ;STORE PROPER AST ADDRESSU .IFF 4 MOV (R3)+,(R4)+ ;INSERT AST SERVICE ROUTINE ADDRESS .ENDC) MOV (SP),R2 ;RETRIEVE I/O FUNCTION CODEB CLRB R2 ;CLEAR MODIFIER FLAGSF- SWAB R2 ;SWAP FUNCTION CODE INTO RIGHT BYTEA BNE 33$ ;IF NOT ZERO - OKS JMP FCKIL ;KILL I/O FUNCTION33$: ;REFERENCE LABEL .IF DF M$$MUP) TST U.CW1(R5) ;IS THIS MOUNTABLE DEVICE?2 BMI 35$ ;BRANCH IF YES -- ACCESS VALIDATED LATER' MOV U.OWN(R5),R0 ;IS THE DEVICE OWNED?A BEQ 35$ ;IF EQ NOV/ BITB #US.PUB,U.ST2(R5) ;PUBLIC ACCESS ALLOWED? BNE 35$ ;IF NE YES+ MOV $TKTCB,R1 ;POINT TO CURRENT TASK'S TCB0 CMP T.UCB(R1),R0 ;DEVICE OWNED BY CURRENT TASK? BEQ 35$ ;IF EQ YES0 BIT #T3.PRV,T.ST3(R1) ;CURRENT TASK PRIVILEGED? BNE 35$ ;IF NE YES% JMP IEPRI ;ELSE PRIVILEGE VIOLATIONI35$: ;ACCESS ALLOWEDB .ENDC& CMP R2,#31. ;FUNCTION CODE IN RANGE? BHI $IEIFC ;IF HI NO( MOV (R5),R1 ;GET ADDRESS OF DEVICE DCB3 ADD #D.MSK,R1 ;ASSUME FUNCTION CODE IN 0-15. RANGE # CMP R2,#15. ;0-15. FUNCTION CODE?P BLOS 40$ ;IF LOS YES& ADD #10,R1 ;POINT TO SECOND MASK SET# SUB #16.,R2 ;REDUCE FUNCTION CODEB#40$: ASL R2 ;CONVERT TO WORD INDEX?* 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 IT/ BITB #US.OFL,U.ST2(R5) ;IS UNIT REALLY OFFLINES BEQ 42$ ;IF EQ NO# JMP IEOFL ;UNIT IS OFFLINE442$: MOV $TKTCB,-(SP) ;CHECK TO SEE IF TASK IS PRIV.- ADD #T.ST3,(SP) ;POINT TO STATUS WORD IN TCBO0 BIT #T3.PRV,@(SP)+ ;IS CURRENT TASK PRIVILEGED? BNE 452$ ;IF NE YESV JMP IEOFL ;OFFLINE ERROR452$:,. BIT #IQ.UMD,(SP) ;IS THI DIAGNOSTIC FUNCTION? BNE 453$ ;IF NE YESB JMP IEOFL ;OFFLINE ERROR453$:!645$: BIT R2,(R1)+ ;IS THIS FUNCTION A CONTROL FUNCTION BEQ 454$ ;IF EQ NO JMP FCCTL ;CONTROL FUNCTIONT454$:I" BIT R2,(R1)+ ;IS FUNCTION NOP'ED? BEQ 455$ ;IF EQ, NOU JMP ISSUC ;IF NE YES455$:,! TST U.CW1(R5) ;MOUNTABLE DEVICE?. BPL 80$ ;IF PL NOO3 MOVB U.STS(R5),R0 ;GET STATUS BYTE FOR TESTS BELOWU .IF DF R$$AMD BIT R2,(R1) ;ACP FUNCTION ?P BEQ 46$ ;IF EQ NOR* CMP #IO.APV,(SP) ;MOUNT OR DISMOUNT QIO ?% BEQ 48$ ;IF EQ YES, DOESN'T HAVE TOJ ;BE MOUNTEDE .ENDC ; R$$AMD:;RK; ON REMOTE SYSTEMS, IF DEVICE IS ONE OF OUR GENERIC TYPES, THEY WILL NEVERLH; BE MOUNTED. BYPASS ALL CHECKS HERE. WE STILL NEED TO PROCESS OVERLAYS; % .IF DF C$$RMT ;REMOTE HOST SUPPORT$  BIT #HF.RMT,$HFMSK ;TURNED ON?. BEQ 46$ ;IF EQ NOO* CMP (R5),$XXLOW ;DCB LOWER THAN GENERICS? BLO 46$ ;IF LO YES' CMP (R5),$XXHGH ;HIGHER THAN GENERICS?B BHI 46$ ;IF LOS NO, ALLOW I/O() CMP #IO.LOV,(SP) ;LOAD OVERLAY FUNCTION?  BEQ FCLOV ;IF EQ YES1 CMP #IO.LDO,(SP) ;LOAD D-SPACE OVERLAY FUNCTION?R BEQ FCLOV ;IF EQ YES BR FCTRN ;ALLOW TRANSFER .ENDC ;C$$RMT=46$: BITB #US.MNT!US.FOR,R0 ;VOLUME MOUNTED AND NOT FOREIGN ? ' BNE 60$ ;IF NE NOT MOUNTED OR FOREIGNS BIT R2,(R1) ;ACP FUNCTION? BEQ 70$ ;IF EQ NOB.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 INDEXC3 MOV R5,-(SP) ;SAVE UCB ADDRESS FOR POLISH ROUTINES MOV R5,R0 ;P8 MOV I.LN2-I.PRM(R4),R1 ;SAVE ADDRESS OF SECOND LUN WORD" MOV R1,-(SP) ;FOR POLISH ROUTINES0 MOV $FCDSP(R2),R5 ;GET ADDRESS OF POLISH VECTOR$ JMP @(R5)+ ;EXECUTE POLISH ROUTINE;B; REGISTERS AT POLISH DISPATCH;G ; R0 - UCB; R1 - ADDRESS 2ND LUN WORD$; R2 - NORMALIZED FCTN CODE,6; R3 - POINTER TO PARAMETERS, INITIALLY -> PARAMETER 12; R4 - POINTER INTO I/O PACKET, INITIALLY -> I.PRM;N; SP-> 2ND LUN WORD ADDRESS ; UCB ADDRESS; FUNCTION CODE0; $TEMP0->SECONDARY CONTROL BLOCK ADDRESS (OR 0); I/O PACKET ADDRESS ; Q00wwibjbkb a a aUEUE FLAG (0=DRIVER; NE=ACP);(K; TASK HEADER IS ASSUMED TO BE MAPPED FOR ALL OF THE THREADED CODE ROUTINESJ;@; &; DEVICE TABLE MASK WORD INCONSISTANCY;TE50$: 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; DEVICE NOT MOUNTED; ALLOW TRANSFER FUNCTION IF(; THE LOADR TASK IS DOING LOGICAL I/O IN+; VIRGIN SYSTEMS WITH THE DISK NOT MOUNTED.=;); ACP FUNCTIONS ARE ILLEGALD; " BITB #US.VV,R0 ;VOLUME VALID SET? BEQ 75$ ;IF EQ NO  BIT R2,(R1) ;ACP FUNCTION? BNE 75$ ;IF NE YES BR FCTRN ;ALLOW TRANSFER;C; MOUNTED FOREIGNN#; CHECK VOLUME MOUNTED TO THIS USERT; IF ACP FUNCTION:; ERROR IF NO ACP%; INCREMENT VOLUME TRANSACTION COUNTN.; COPY PARAMETERS 1-6 (NO POLISH IF FOREIGN).; QUEUE TO ACP UNLESS UC.QUE ALSO SET (U.CTL); IF TRANSFER FUNCTION:K6; ADDRESS CHECK AND RELOCATE BUFFER ADDRESS IN PARM 1,; MAP ADDRESS TO 18/22 BIT PHYSICAL ADDRESS; COPY PARAMETERS 2-6; QUEUE TO DRIVER;Q 65$: ;Q .IF DF M$$MUP/ CALL CXMOU ;CHECK VOLUME MOUNTED BY THIS USER; BCS 75$ ;ERROR .ENDC BIT R2,(R1) ;ACP FUNCTION? BEQ FCTRN ;NOT ACP-TRANSFERN$ TST U.ACP(R5) ;MOUNTED WITH AN ACP? BEQ 75$ ;IF EQ NO % INC 6(SP) ;SET FLAG TO QUEUE TO ACPI MOV U.VCB(R5),R1 ;GET VCB ADDRN BEQ FCXOP ;BR IF NO VCB) INC (R1) ;INCR VOL TRANS COUNT! BR FCXOP ;INSERT PARAMETERS 1-6E;AF; FUNCTION IS AN ILLEGAL FUNCTION-DECLARE ILLEGAL FUNCTION CODE STATUS;0$IEIFC::MOV #IE.IFC&377,R4 ;SET ILLEGAL FUNCTION JMP IECMN;;5; DEVICE MOUNTED AND NOT FOREIGN BUT NOT ACP FUNCTION;N-70$: CMP #IO.LOV,(SP) ;LOAD OVERLAY FUNCTION?N BEQ FCLOV ;IF EQ YES1 CMP #IO.LDO,(SP) ;LOAD D-SPACE OVERLAY FUNCTION?  BEQ FCLOV ;IF EQ YES2 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$$PROA? CMPB #IO.WLB/400,1(SP) ;IS IT A WRITE LOGICAL BLOCK FUNCTION ?T" BNE FCTRN ;IF NE NO, OK TO ISSUE/ BITB #US.LAB,U.STS(R5) ;ANSI MAGTAPE MOUNTED ?I# BNE FCTRN ;IF NE YES, OK TO ISSUEP1 MOV 6(R3),-(SP) ;SAVE FIRST HALF OF BLOCK NUMBERA% BIS 10(R3),(SP)+ ;BOTH HALVES ZERO ?C .ENDC ; DF R$$PRO) BNE FCTRN ;IF NE NOT LBN 0, OK TO ISSUEQ( CMP $RCTPT,R0 ;IS THE CURRENT TASK RCT?- BEQ FCTRN ;IF EQ, YES, ALLOW WRITE TO LBN 0I$75$: JMP IEPRI ;PRIVILEGE VIOLATION;O; INTERMEDIATE TO FCKILA;)76$: BR FCKIL ;BRANCH TO HANDLE KILL I/OL;K; DEVICE IS NOT MOUNTABLEI;E 80$: BIT R2,(R1) ;ACP FUNCTION? BEQ FCTRN ;IF EQ NON;IH; FUNCTION IS A FILE STRUCTURE FUNCTION FOR A NONFILE STRUCTURED DEVICE.H; INITION THIS MUST BE A READ OR WRITE VIRUTAL SINCE ALL OTHER FUNCTIONSH; HAVE BEEN EITHER ILLEGAL OR NOP'ED. MAP FUNCTION TO IT LOGICAL COUNTER;R> MOV #IO.WLB,I.FCN-I.PRM(R4) ;ASSUME FUNCTION IS WRITE VIRTUAL0 CMPB #IO.WVB/400,1(SP) ;WRITE VIRTUAL FUNCTION? BEQ FCTRN ;IF EQ YES@ MOV #IO.RLB,I.FCN-I.PRM(R4) ;SET FUNCTION TO READ LOGICAL BLOCK' BR FCTRN ;GO TRANSLATE BUFFER ADDRESSF .DSABL LSBQ;N@; FUNCTION IS A TRANSFER FUNCTION-ADDRESS CHECK AND MAP TRANSFER;FFCLOV: ;REFERENCE LABEL .IF DF U$$DAS!A$$CNTW2 CALL FACHL ;ADDRESS CHECK LOAD OVERLAY IN USER I BR FCTR1 ;ENTER COMMON CODEC .ENDC ; DF U$$DAS!A$$CNTR)FCTRN: CALL FACHK ;PERFORM ADDRESS CHECKT2FCTR1: CALL $MPPHY ;MAP TO 18/22 BIT PHYS ADDRESS2 CALL FCXR1 ;INSERT RELOC DISP & BIAS; & PARM 2-6 BR FCXTR ;;)B; FUNCTION IS A KILL I/O FUNCTION-FLUSH I/O QUEUE OF TASK REQUESTS;D.FCKIL: MOV (SP),$TEMP2 ;SAVE I/O FUNCTION CODE CALL $IOKL2 ;FLUSH I/O QUEUE;ND; FUNCTION IS A NOP'ED FUNCTION-DECLARE SUCCESSFUL COMPLETION STATUS;L9ISSUC: MOV #IS.SUC&377,R4 ;SET SUCCESSFUL COMPLETION CODENIECM1: JMP IECOM ;.;;; SPECIFIED DEVICE IS OFFLINEL;A4IEOFL: MOV #IE.OFL&377,R4 ;SET DEVICE OFFLINE STATUS BR IECM1 ;;A;S6; FUNCTION IS A CONTROL FU00wvt__DATADATADATADATANCTION-COPY REMAINDER OF DPB;C'FCCTL: TST U.CW1(R5) ;MOUNTABLE DEVICE?T BPL 10$ ;IF PL NOF) MOV $TKTCB,R0 ;POINT TO CURRENT TASK TCB2@ BITB #US.MNT!US.FOR,U.STS(R5) ;DEVICE MOUNTED AND NOT FOREIGN ? BNE 5$ ;IF NE NO& BITB #US.LAB,U.STS(R5);ANSI MAGTAPE ? BEQ 6$ ;IF EQ NO44$: BIT #T3.PRV,T.ST3(R0) ;ISSUING TASK PRIVILEGED ?% BNE 10$ ;IF NE YES - ISSUE FUNCTION )45$: JMP IEPRI ;NO - PRIVILEGE VIOLATIONL5$: ;REFERENCE LABELN;T7; IF THE EXEC HANDLES VV VS CTL FUNCTIONS, IT GOES HEREC;N%6$: TST U.OWN(R5) ;DEVICE ALLOCATED ?T BEQ 10$ ;IF EQ NO 9 CMP U.OWN(R5),T.UCB(R0) ;DEVICE ALLOCATED TO THIS USER ?R% BNE 4$ ;IF NE NO, CHECK PRIVILEGED.S10$: ;REFERENCE SYMBOLN)FCXOP: CALL FCXP1 ;INSERT PARAMETERS 1-6.FCXTR: ;REFERENCE SYMBOL2 BITB #IQ.UMD,(SP) ;IS THIS A DIAGNOSTIC FUNCTION? BEQ 10$ ;IF EQ NO8 BIT #DV.UMD,U.CW1(R5) ;DOES DEVICE SUPPORT DIAGNOSTICS? BEQ 10$ ;IF EQ NOO5 CMPB 1(SP),#IO.ATT/256. ;IS THIS AN ATTACH FUNCTION? % BEQ 10$ ;IF EQ YES, SKIP RELOCATION4 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?* BEQ IEPRI ;IF EQ NO, PRIVILEGE VIOLATION. MOV (R4),R0 ;PICK UP REGISTER BUFFER ADDRESS" MOV #40.*2,R1 ;PICK UP MAX LENGTH/ CALL $CKBFW ;CHECK AND LOCK DIAGNOSTIC BUFFER' BCS IESPC ;IF CS ADDRESS CHECK FAILEDR' CALL $RELOC ;RELOCATE REGISTER BUFFERQ MOV R1,(R4)+ ;STORE KISAR6 BIAS! MOV R2,(R4) ;STORE DISPLACEMENTN(10$: MOV (SP)+,R1 ;RESTORE FUNCTION CODE0 CMP #IO.LOV,R1 ;IS THIS AN I-SPACE LOAD OVERLAY BEQ 15$ ;IF EQ YES/ CMP #IO.LDO,R1 ;IS THIS A D-SPACE LOAD OVERLAY  BNE FCXIT ;IN NE NOI15$:" TST U.CW1(R5) ;MOUNTABLE DEVICE? BPL FCXIT ;IF PL NOS2 MOV $TKTCB,R3 ;GET ADDRESS OF TCB OF CURRENT TASK ' .IF DF C$$RTK ;IF REMOTE TASK SUPPORTB4 BIT #F5.RTK,$FMSK5 ;REMOTE TASK SUPPORT TURNED ON? BEQ 20$ ;IF EQ NOI" MOV T.LDV(R3),R0 ;GET UCB ADDRESS( CALL @#$MPLND ;FOLLOW REDIRECT POINTERS1 CMP (R0),$XXLOW ;IS THIS ONE OF OUR GENERIC DCBS# BLO 20$ ;IF LO NO $ CMP (R0),$XXHGH ;CHECK FOR TOO HIGH! BHI 20$ ;IF HIGHER, NOT GENERICS3 BR FCXIT ;BYPASS MOUNTED CHECK AND LBN CONVERSIONU20$:  .ENDC ; C$$RTK4 BIT #T4.LDD,T.ST4(R3) ;WAS LOAD DEVICE DISMOUNTED ?" BNE IEPRI ;IF NE YES, REJECT I/O;KF; IF THIS IS A FIXED TASK WITHOUT A TASK IMAGE SAVE SET T.LBN TO ZERO.G; NO LEGIT TASK SHOULD HAVE A ZERO T.LBN BECAUSE BLOCK ZERO IS RESERVEDCB; FOR THE BOOT BLOCK. SUCH A TASK (FIXED WITH NO IMAGE) SHOULD NOT%; PERFORM DISK OVERLAY LOAD REQUESTS.O;  .IF DF F$$NIM( MOVB T.LBN(R3),R0 ;GET HIGH BYTE OF LBN9 BIS T.LBN+1(R3),R0 ;MERGE IN LOW BYTE, TEST FOR ALL ZERON" BEQ IEPRI ;IF EQ YES, REJECT I/O .ENDC ; DF F$$NIM1 MOV T.LDV(R3),R0 ;GET UCB ADDRESS OF LOAD DEVICEE;+; ** W A R N I N G **T; ; SPM HOOKPOINT NUMBER 25.;I); DO NOT CHANGE THE INSTRUCTION FOLLOWINGS; LABEL WITHOUT CHECKING SPM;-+$SPH25==. ;SPM CHANGES THE INSTRUCTION AT  ;THE LOCATION OF THIS LABEL ) CALL @#$MPLND ;MAP TO ACTUAL UCB ADDRESSS1 CMP R0,R5 ;LOAD DEVICE UCB MATCH SPECIFIED UCB?E BNE IEOVR ;IF NE NOS L7 ADD T.LBN+1(R3),-(R4) ;ADD IN LOW PART OF TASK LOGICALI ADC -(R4) ;BLOCK NUMBERO; MOVB T.LBN(R3),R0 ;GET HIGH BYTE OF TASK LOGICAL BLOCK NUMO .IF NDF U$$DAS ADD R0,(R4) ;ADD IN HIGH PARTO .IFF ; NDF U$$DAS ADD R0,(R4)+ ;ADD IN HIGH PARTO( SUB T.ISIZ(R3),(R4) ;ADJUST TO START OF SBC -(R4) ;REAL D-SPACES .ENDC ; NDF U$$DAS FCXIT: TST (SP)+ ;CLEAN STACK- MOV (SP)+,R1 ;RETRIEVE ADDRESS OF I/O PACKETP TST (SP)+ ;QUEUE TO DRIVER# BEQ DRQRQ ;IF EQ YES, IF NE Q ACPN/ BITB #UC.QUE,U.CTL(R5) ;IF SET QUEUE TO DRIVERF! BNE DRQRQ ;EVEN IF ACP FUNCTIONN;+; ** W A R N I N G **;; ; SPM HOOKPOINT NUMBER 20.; ); DO NOT CHANGE THE INSTRUCTION FOLLOWINGA; LABEL WITHOUT CHECKING SPM;-+$SPH20==. ;SPM CHANGES THE INSTRUCTION ATT ;THE LOCATION OF THIS LABELF MOV U.ACP(R5),R0 ;P S .IF DF R$$AMD; E; IF THE VOLUME IS NOT MOUNTED OR MOUNTED FO00wwibjbkb a a aREIGN, THEN U.ACP POINTERIA; IS STILL ZERO. FOR THESE CASES, QUEUE IO.APV TO THE DEFAULT ACPF; * BNE 10$ ;IF NE DEVICE ALREADY HAS AN ACP0 MOV $ACPTK,R0 ;GET DEFAULT FILES-11 ACP POINTER10$: .ENDC ; DF R$$AMD) CALLR $EXRQP ;INSURE FILE SYSTEM ACTIVEC; 4; DESCRIPTION OF QUEUING AND INTERLOCKING INTERFACES; FOR MOUNTABLE DEVICESM;A:; I. NOT MOUNTED - ALLOW XFER FCTNS IF 'VOLUME VALID' SET/; (NEEDED FOR STARTUP). ACP FCTNS ARE ILLEGAL. (; ADDRESS CHECK & MAP BUFFER ADDRESS IN; PARAMETER 1.; QUEUE TO DRIVER.I;Z ; II. MOUNTEDC7; A. ALL CASES - IF 'UC.QUE' SET IN 'U.CTL' THEN QUEUE -; TO DRIVER. (NECESSARY TO SUPPORT EXISTINGE(; DRIVERS THAT ARE REALLY LIKE ACP'S).;C; B. MOUNTED FOREIGN$(; 1. XFER FCTN - ADDRESS CHECK AND MAP(; BUFFER ADDRESS IN PARAMETER 1. COPY%; PARAMETERS 2-6. QUEUE TO DRIVER.A2; 2. ACP FCTN - ERROR IF NO ACP. COPY PARAMETERS'; 1-6. NO POLISH ROUTINE PROCESSING.T(; INCREMENT VOLUME TRANSACTION COUNT.; QUEUE TO ACP.;A; C. MOUNTED NOT FOREIGNV/; 1. XFER FCTN - EITHER OVERLAY OR PRIVILEGEDC$; TASK I/O. ADDRESS CHECK AND MAP(; BUFFER ADDRESS IN PARAMETER 1. COPY%; PARAMETERS 2-6. QUEUE TO DRIVER.S3; 2. DECNET ACP - I/O FUNCTION CODES ARE DISJOINTD,; 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 TO -; MTAACP. NO BLOCK LOCKING. ACCESS/DEACCES); INTERLOCK BUT NO WINDOW TURN PENDINGB,; COUNT BECAUSE EVERYTHING QUEUED TO ACP.); INCREMENT VOLUME TRANSCACTION COUNT. 2; 4. FILES-11 DISK ACP (F11ACP) - POLISH ROUTINE-; PROCESSING. TABLE BELOW DESCRIBES QUEUINP-; AND INTERLOCKING. LEGEND: A=QUEUE TO ACPQ(; D=QUEUE TO DRIVER; I=INTERLOCK LUN;+; P=INCREMENT WINDOW TURN PENDING COUNT.1*; VOLUME TRANSACTION COUNT INCREMENTED.-; SEE COMMENT LOCATED NEAR CKRAC AND CKWACT+; FOR DESCRIPTION OF WINDOW TURN PENDINGC; COUNT ALGORITHM.T; DRQRQ: ;REFERENCE LABEL; 2; CHECK SOFTWARE WRITE LOCK BEFORE GOING TO $DRQRQ; - BIT #DV.MSD,U.CW1(R5) ;MASS STORAGE DEVICE?( BEQ 20$ ;IF EQ NOI/ BIT #DV.SWL,U.CW1(R5) ;SOFTWARE WRITE LOCKED?P BEQ 20$ ;IF EQ NON7 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?E BEQ 20$ ;IF EQ YES8 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 CODESE! BIC #7,R0 ;GET RID OF MODIFIERS-10$: CMP (R4)+,R0 ;IS THIS THE FUNCTION CODE?A BEQ IEWLK ;IF EQ YES TST (R4) ;END OF TABLE?M BNE 10$ ;IF NE NOT20$: JMP $DRQRQ ;QUEUE I/O REQUESTB; &; WRITE ATTEMPTED TO WRITE LOCKED UNIT; /IEWLK: MOV #IE.WLK&377,R4 ;SET WRITE LOCK ERRORR BR IECMN ; A;U@; ILLEGAL BUFFER ADDRESS SPECIFIED-DECLARE ILLEGAL BUFFER STATUS;E.I2SPC: CLR -(R4) ;ERASE LAST ATTRIBUTE NUMBER2IESPC: MOV #IE.SPC&377,R4 ;SET ILLEGAL BUFFER CODEIECOM: BR IECMN ;;G; ILLEGAL LOAD OVERLAY UCB-DECLARE ILLEGAL LOAD OVERLAY FUNCTION STATUSO;O8IEOVR: MOV #IE.OVR&377,R4 ;SET ILLEGAL LOAD OVERLAY CODE BR IECMN ;;9; ILLEGAL BYTE COUNT OR ALIGNMENT-DECLARE ODD BYTE STATUSE;O.IEBYT: MOV #IE.BYT&377,R4 ;SET ODD BYTE STATUS BR IECMN ;;O:; 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 FILE00wvt__DATADATADATADATA ACCESSED STATUS .IF DF,R$$LKL BR IECOM ;;:2; EXPLICIT UNLOCK PERFORMED OR BLOCK LOCKING ERROR; STATUS IN R0;VIELCK: MOV R0,R4 ;STATUS IN R0T .ENDC;; COMMON ERROR EXIT3;R)IECMN: MOV $TEMP0,SP ;RESET STACK POINTER;6 MOV (SP)+,R0 ;RETRIEVE ADDRESS OF SECONDARY CONTROL B BEQ 10$ ;IF EQ NONE1 CALL $DEATR ;DEALLOCATE SECONDARY CONTROL BLOCKD10$: .IF DF C$$RTK ;REMOTE TASKS , BIT #F5.RTK,$FMSK5 ;REMOTE TASKS TURNED ON? BEQ 20$ ;IF EQ NON( MOV (SP),R3 ;GET ADDRESS OF I/O PACKET1 CMPB I.FCN+1(R3),#IO.KIL/256. ;IS THIS I/O KILL?  BNE 20$ ;IF NE NOC% MOV $CPPKT,R0 ;GET ADDRESS OF PACKET: BEQ 20$ ;IF EQ, NONE CALL $CPDEA ;DEALLOCATE IT .ENDC ;C$$RTK20$: M! MOV R4,R0 ;SET FINAL I/O STATUS& CLR R1 ;CLEAR SECOND I/O STATUS WORD- MOV (SP)+,R3 ;RETRIEVE ADDRESS OF I/O PACKETD TST (SP)+ ;CLEAN STACK' MOV I.UCB(R3),R5 ;RETRIEVE UCB ADDRESSR( CALLR $IOFIN ;FINISH OFF I/O OPERATION;K; BUILD AN I/O PACKET ; 3$BDPKT::INC 12(SP) ;QUEUE PACKET TO ACP NOT DRIVERP* MOV #2*2,R1 ;SET LENGTH OF FILE ID BLOCK+ CALL OPPRM ;INSERT OPTIONAL FILE ID BLOCK / BEQ ATRBK ;IF EQ NO PARAMETER BLOCK SPECIFIED ;A; BUILD ATTRIBUTE POINTER BLOCKK;0=ATRBK: MOV (R3)+,(R4)+ ;ATTRIBUTE DESCRIPTOR BLOCK SPECIFIED?I BEQ MOVE3 ;IF EQ NOP, MOV R3,-(SP) ;SAVE ADDRESS OF NEXT DPB WORD6 MOV #I.ATRL,R1 ;SET LENGTH OF SECONDARY CONTROL BLOCK/ CALL $ALOCB ;ALLOCATE SECONDARY CONTROL BLOCK' BCS IENOD ;IF CS NO STORAGE AVAILABLE:8 MOV R0,@$TEMP0 ;SAVE ADDRESS OF SECONDARY CONTROL BLOCK+ CLR (R0) ;INITIALIZE NUMBER OF ATTRIBUTES;' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGK6 MOV -(R4),R3 ;RETRIEVE ADDRESS OF ATTRIBUTE DESCRIPTO5 MOV R0,(R4)+ ;SET POINTER TO SECONDARY CONTROL BLOCKT6 MOV R4,-(SP) ;SAVE ADDRESS OF NEXT WORD IN I/O PACKET3 MOV R0,R4 ;SET ADDRESS OF FIRST ATTRIBUTE POINTERM6 MOV #6,-(SP) ;SET MAXIMUM NUMBER OF ATTRIBUTE POINTER810$: MOV R3,R0 ;SET ADDRESS OF NEXT ATTRIBUTE DESCRIPTO- MOV #4,R1 ;SET SIZE OF ATTRIBUTE DESCRIPTOR 1 CALL $ACHCK ;ADDRESS CHECK ATTRIBUTE DESCRIPTOR ( BCS IESPC ;IF CS ADDRESS CHECK FAILURE4 CALL $RELOM ;RELOCATE AND MAP ATTRIBUTE DESCRIPTOR/ ADD #4,R3 ;POINT TO NEXT ATTRIBUTE DESCRIPTOR)* MOVB (R0)+,(R4)+ ;INSERT ATTRIBUTE NUMBER2 BEQ 20$ ;IF EQ END OF ATTRIBUTE DESCRIPTOR BLOCK( CLR R1 ;PICKUP SIZE OF ATTRIBUTE BLOCK BISB (R0)+,R1 ;0 MOVB R1,(R4)+ ;INSERT LENGTH OF ATTRIBUTE BLOCK BNE 15$ ;IF NE LENGTH OKAY) MOV #256.*2,R1 ;SET LENGTH FOR ZERO CASE 115$: MOV (R0),R0 ;GET ADDRESS OF ATTRIBUTE BLOCKA .IF DF X$$HDR' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGS" MOV 6(SP),KISAR6 ;MAP TASK HEADER .ENDC* CALL IOBUF ;ADDR CHECK AND INC I/O COUNT .IF DF X$$HDR5 MOV (SP)+,KISAR6 ;RESTORE MAPPING TO ATTRIBUTE BLOCKQ $ .ENDC( BCS I2SPC ;IF CS ADDRESS CHECK FAILURE4 MOV R1,(R4)+ ;SAVE ADDRESS OF ATTACHMENT DESCRIPTOR/ CALL $RELOC ;RELOCATE ATTRIBUTE BLOCK ADDRESSB% MOV R1,(R4)+ ;INSERT RELOCATION BIAS2- MOV R2,(R4)+ ;INSERT ATTRIBUTE BLOCK ADDRESS0, DEC (SP) ;ANY MORE SPACE IN POINTER BLOCK? BGT 10$ ;IF GT YES20$: TST (SP)+ ;CLEAN STACK6 MOV (SP)+,R4 ;RETRIEVE ADDRESS OF NEXT WORD IN I/O PA* MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING3 MOV (SP)+,R3 ;RETRIEVE ADDRESS OF NEXT WORD IN DPBR; 6; MOVE EXTEND AND ACCESS CONTROL WORDS INTO I/O PACKET;U3MOVE3: MOV (R3)+,(R4)+ ;INSERT EXTEND CONTROL WORDSR MOV (R3)+,(R4)+ ;, MOV (R3)+,(R4)+ ;INSERT ACCESS CONTROL WORD;R ; INSERT OPTIONAL FILENAME BLOCK;S2FILNM: MOV #13.*2,R1 ;SET LENGTH OF FILENAME BLOCK, CALL OPPRM ;INSERT OPTIONAL FILENAME BLOCK, BEQ 10$ ;IF EQ NO FILENAME BLOCK SPECIFIED10$: JMP @(R5)+ ;;D"; INTERPRET REQUIRED BLOCK ADDRESS;C .ENABL LSB.RQPRM: MOV SP,R2 ;SET REQUIRED PARAMETER FLAG BR 10$ ;;E"; INTERPRET OPTIONAL BLOCK ADDRESS;/-OPPRM: CLR R2 ;CLEAR REQUIRED PARAMETER FLAGT/10$: MOV (R3)+,R0 ;GET ADDRESS OF CONTROL BLOCK+ BEQ 20$ ;IF EQ NONE SPECIFIEDD) CALL $CKBFW ;CHECK AND LOCK USER BUFFERS$ BCC 15$ ;IF CC, ADDRESS CHECK OKAY(00wwibjbkb a a a JMP IESPC ;OTHERWISE FINISH WITH ERROR&15$: MOV R1,-(SP) ;SAVE ATT DESCR ADDR& CALL $RELOC ;RELOCATE BUFFER ADDRESS% MOV R1,(R4)+ ;INSERT RELOCATION BIASK# MOV R2,(R4)+ ;INSERT BLOCK ADDRESSM% MOV (SP)+,R1 ;RESTORE ATT DESCR ADDR BR 30$ ;&20$: MOV R2,(R4)+ ;PARAMETER REQUIRED? BEQ 25$ ;IF EQ NO ( JMP IEBAD ;OTHERWISE FINISH WITH ERROR"25$: CLR (R4)+ ;CLEAR SECOND WORD30$: RETURN ;I .DSABL LSBC;D:; FILL DISCONNECT PARAMETER BUFFER AND INTERLOCK LUN USAGE;  .IF DF M$$NET .ENABL LSBH;$CKDIS::MOV (R3)+,(R4)+ ;COPY FIRST PARAMETER TO I/O PACKETD BR 10$ ;FINISH IN COMMON CODER;E ; CHECK CONNECT PARAMETER BUFFER;B0$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?D BHIS 20$ ;IF HIS YES' JMP IEBAD ;RETURN BAD PARAMETER ERROR .ENDC $CKCON:: ;/2$: MOV 2(R3),R1 ;GET LENGTH OF BUFFER IN BYTESE BNE 5$ ;IF NE NON ZERO LENGTHI JMP IESPC ;ZERO LENGTH*5$: CALL RQPRM ;INSERT REQUIRED PARAMETER#10$: CALL FCXP2 ;INSERT PARAMETERSN20$: JMP @(R5)+ ; .DSABL LSBR .ENDC; &; CHECK FOR VOLUME MARKED FOR DISMOUNT;S .ENABL LSBS;$CKDMO::BITB #US.MDM,U.STS(R0) ;VOLUME MARKED FOR DISMOUNT?I BNE 15$ ;IF NE YES JMP @(R5)+ ;;I#; CHECK VOLUME MOUNTED BY THIS USERP;B .IF DF M$$MUP$CKMOU:: ;REFERENCE LABEL  .IF DF R$$AMD0 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?C BCS 15$ ;IF CS NO  MOV (SP)+,R5 ;RESTORE REGISTER2$: JMP @(R5)+ ;O;B2; SUBROUTINE TO SEARCH MOUNT LIST TO SEE IF VOLUME; REALLY MOUNTED BY THIS USER ;#CXMOU: MOV R1,-(SP) ;SAVE REGISTERSE MOV R2,-(SP) ;F' BITB #US.PUB,U.ST2(R5) ;PUBLIC DEVICE?E BNE 8$ ;PUBLIC DEVICE OK# MOV $TKTCB,R1 ;IS TASK PRIVILEGED?Q BIT #T3.PRV,T.ST3(R1) BNE 8$ ;PRIVILEGED TASK OK. MOV T.UCB(R1),R1 ;GET USER TI: UCB ADDR AS ID MOV #$MOULS,R2 ;GET MOUNT LIST 5$: SEC ;ASSUME FAIL# MOV (R2),R2 ;GET MOUNT LIST ENTRY BEQ 9$ ;NONE=DONE=FAIL. CMPB #MT.MLS,M.TYPE(R2) ;RIGHT TYPE OF ENTRY? BNE 5$ ;BR NOT MOUNT ENTRY# CMP M.DEV(R2),R5 ;SAME DEVICE UCB?  BNE 5$ ;BR DIFFERENT DEVICEV" CMP M.TI(R2),R1 ;SAME USER AS TI? BNE 5$ ;BR DIFFERENT USERE8$: CLC ;SUCCESS#9$: MOV (SP)+,R2 ;RESTORE REGISTERS  MOV (SP)+,R1 ;T RETURNT .ENDC;R@; CHECK FOR READ ACCESS PRIVILEGES AND EXIT TO TRANSFER FUNCTION;V1$CKRAC::MOV #WI.RDV,R2 ;SET READ ACCESS MASK WORDL BR 10$ ;;GA; CHECK FOR WRITE ACCESS PRIVILEGES AND EXIT TO TRANSFER FUNCTIONE;)2$CKWAC::MOV #WI.WRV,R2 ;SET WRITE ACCESS MASK WORD-10$: BIT R2,@(R1)+ ;DESIRED ACCESS PERMITTED?; BNE 20$ ;IF NE YES$15$: JMP IEPRI ;PRIVILEGE VIOLATION;54; ADDRESS CHECK & INSERT RELOC BIAS, DISP & PARM 2-6;) 20$: MOV R0,R5 ;GET UCB ADDRESS# CALL FACHK ;PERFORM ADDRESS CHECK CALL FCXR1 ;INSERT PARAMETERSL .IF DF,M$$NET) CMPB #IO.WVB/400,5(SP) ;DECNET FUNCTION?2 BGE CKLCK ;IF GE NOW" MOV U.SCB(R5),R0 ;GET SCB ADDRESS5 BIT #S2.XHR,S.ST2(R0) ;NEW I.LN2 HANDLING SUPPORTED? BNE 50$ ;IF NE YES$ MOV $TKTCB,R0 ;GET TASK TCB ADDRESS; MOV T.ATT(R0),R0 ;GET TASK PARTITION ATTACHMENT DESCRIPTORE8 INCB A.IOC-A.TCBL(R0) ;LOCK DOWN THE HEADER FOR THE I/O4 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 THE I/O PACKET ADDRESS BR 55$ ;JOIN COMMON CODE .ENDC;."; DO RMS BUCKET LOCKING PROCESSING;C+CKLCK: BITB #US.LAB,U.STS(R5) ;ANSI MAGTAPEA BNE 30$ ;IF NE YES& 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 ;R22$: ;REFERENCE LABEL .ENDC CALL $MPPKT ;MAP VBN TO LBNV BCS00wvt__DATADATADATADATA 30$ ;MAP FAILURE TST R0 ;ALL BLOCKS MAPPED??  BEQ 40$ ;IF EQ YES30$: 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 ADDRESS8 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 FUNCTION2 TST (SP)+ ;CLEAN STACK% MOV (SP)+,R5 ;RESTORE TO UCB ADDRESSN TST (SP)+ ;CLEAN STACKCKJXT: JMP FCXIT ; .DSABL LSB$;P(; CHECK FOR FILE ALREADY ACCESSED ON LUN;Q($CKALN::TST (R1) ;FILE ACCESSED ON LUN? BEQ CKJR5 ;IF EQ NO  JMP IEALN ;ERROR;I ; CHECK FOR FILE ACCESSED ON LUN;T($CKNLN::TST (R1) ;FILE ACCESSED ON LUN? BNE CKJR5 ;IF NE YES JMP IENLN ;ERROR;E:; SET UP REGISTERS FOR UNLOCK AND EXIT TO CONTROL FUNCTION;N .IF DF R$$LKL;$UNLXT::TST (R4)+ ;SKIP FIRST WORD OF "ADDRESS DOUBLEWORD"  MOV R0,R5 ;SETUP UCB POINTER CALL FCXP1 ;COPY PARAMETERSF BR CKLCK ; .ENDC; ; SET ACCESS/DEACCESS INTERLOCKN;N9$CKRLK::INC @(SP) ;SET ACCESS/DEACCESS PENDING INTERLOCK ;Q; EXIT POLISH TO FUNCTION EXIT;H5$CKXIT::TST (SP)+ ;REMOVE ADDRESS OF SECOND LUN WORDL# MOV (SP)+,R5 ;RETRIEVE UCB ADDRESSE TST (SP)+ ;ADJUST STACK PTR MOV U.VCB(R5),R1 ;GET VCB ADDR  BEQ CKJXT ;BR IF NO VCBN# INC (R1) ;INCR VOLUME TRANS COUNTR BR CKJXT ;EXIT POLISH"0$CKPKT::MOV #$FCPKT,R5 ;JOIN COMMON ACP REQUESTSCKJR5: JMP @(R5)+ ;;T9; INCREMENT WINDOW I/O COUNT FOR MOUNTED FILES-11 DEVICES ;E*$CKIWN::MOV @(SP),R0 ;GET CONTENTS OF LUT2) BIC #1,R0 ;CLEAR LUN INTERLOCK, WINDOW?L BEQ 10$ ;IF EQ NO& INCB W.IOC(R0) ;BUMP WINDOW I/O COUNT10$: JMP @(R5)+ ;;V+; LOCK HEADER IN MEMORY DURING ACP FUNCTION ;J3$CKLHD::MOV $TKTCB,R0 ;GET CURRENT TASK TCB ADDRESSC, 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) MOV 10(SP),R0 ;GET ADDRESS OF I/O PACKETO; BISB #200,I.EFN(R0) ;FLAG REQUEST AS A VIRTUAL I/O REQUESTR JMP @(R5)+ ;;$0; SUBROUTINES TO COPY PARAMETERS INTO I/O PACKET; ; INPUTS:R; FCXR1 - R1 RELOCATION BIASM; R2 DISPLACEMENT BIAS; R3 PARAMETER PTR; R4 I/O PACKET PTRS%; COPIES R1, R2, AND PARAMETERS 2-6A;C; FCXP2 - R3, R4I; COPIES PARAMETERS 2-6I;C; FCXP1 - R3, R4N; COPIES PARAMETERS 2-6;; ; OUTPUTS: R3, R4 UPDATED PTR'SO;0+FCXR1: MOV R1,(R4)+ ;INSERT RELOCATION BIAS ' MOV R2,(R4)+ ;INSERT DISPLACEMENT BIASR 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  RETURN;X6; SUBROUTINE TO PERFORM ADDRESS CHECK AND MAP TRANSFER;,FACHL: .IF DF A$$CNT, MOV KISAR6,-(SP) ;SAVE CURRENT EXEC MAPPING/ MOV $TKTCB,R0 ;GET TCB ADDRESS OF CURRENT TASKM2 MOV T.ACN(R0),KISAR6 ;MAP TO TAB (OR OTHER BLOCK) BEQ 10$ ;IF EQ NO BLOCKM- CMPB #BT.TAB,@#B.TYP+140000 ;IS THIS A TAB ?( BNE 10$ ;IF NE NOR* ADD #1,@#B.OVLY+2+140000 ;INCREMENT COUNT! ADC @#B.OVLY+140000 ;SECOND HALFT/10$: MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING( .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 YES6 MOV #$RELUI,-(SP) ;PUSH ADDRESS OF RELOCATION ROUTINE6 MOV #$CKBFI,-(SP) ;AND ADDRESS OF ADDR. CHECK ROUTINE BR FACH1 ;ENTER COMMON CODE  .IFTF ; DF U$$DASFACHK: ;REFERENCE LABEL .IFT ; DF U$$DAS 6 MOV #$RELOC,-(SP) ;PUSH ADDRESS OF RELOCATION ROUTINE .ENDC ; DF U$$DAS6 MOV #$CKBFR,-(SP) ;AND ADDRESS OF ADDR. CHECK ROUTINE4 CMPB I.FCN+1-I.PRM(R4),#IO.WLB/400 ;WRITE LOGICAL ? BEQ FACH1 ;IF EQ YES N4 CMPB I.FCN+1-I.PRM(R4),#IO.WVB/400 ;WRITE VIRTUAL ? BEQ FACH1 ;IF EQ YES. MOV #$CKBFB,(SP) ;SET READ/WRITE BUFFER CHECK/FACH1:00wwibjbkb a a a MOV (R3)+,R0 ;GET ADDRESS OF USER BUFFERE$ MOVB U.CTL(R5),R1 ;GET CONTROL BYTE' BPL 10$ ;IF PL BYTE ALIGNMENT ALLOWEDF$ BIT #1,R0 ;IS BUFFER BYTE ALIGNED?$ BNE 30$ ;IF NE YES-ALIGNMENT ERROR910$: BIC #^C,R1 ;CLEAR ALL BUT LENGTH MODULO BITS)0 BIT R1,(R3) ;DOES LENGTH HAVE CORRECT MODULUS?$ BNE 30$ ;IF NE NO-ALIGNMENT EERROR, MOV (R3),R1 ;GET LENGTH OF BUFFER IN BYTES BEQ 40$ ;IF EQ ILLEGAL BUFFERL,15$: CALL @(SP)+ ;ADDRESS CHECK USER BUFFER% BCS 40$ ;IF CS ADDRESS CHECK FAILEDV .IF DF U$$DAS CALLR @(SP)+ ;RELOCATE BUFFER( .IFF ; DF U$$DASY, CALLR $RELOC ;RELOCATE USER BUFFER ADDRESS .ENDC ; DF U$$DAS30$: JMP IEBYT ; '40$: JMP IESPC ;ILLEGAL BUFFER ADDRESSU;RG; ADDRESS CHECK I/O BUFFER AND INCREMENT COUNT IN ATTACHMENT DESCRIPTORR; .ENABL LSB3)IOBUF: CALL $ACHCK ;ADDRESS CHECK BUFFER1# BCS 10$ ;IF CS ADDR CHECK FAILUREQ3IOBF2: MOV (R2),R1 ;POINT TO PCB OF BUFER (W.BPCB)D/ INCB P.IOC(R1) ;INDICATE I/O THROUGH PARTITIONC6 MOV W.BATT(R2),R1 ;POINT TO ATTACHMENT DESC OF BUFFER$ INCB A.IOC(R1) ;INCREMENT I/O COUNT10$: RETURN ;O .DSABL LSBF .ENDS .ENDC ; DF U$$DAS30$: JMP IEBYT ; '40$: JMP IESPC ;ILLEGAL BUFFER ADDRESSU;RG; ADDRESS CHECK I/O BUFFER AND INCREMENT COUNT IN ATTACHMENT DESCRIPTORR; .ENABL LSB3)IOBUF: CALL $ACHCK ;ADDRESS CHECK BUFFER1# BCS 10$ ;IF CS ADDR CHECK FAILUREQ3IOBF2: MOV (R2),R1 ;POINT TO PCB OF BUFER (W.BPCB)D/ INCB P.IOC(R1) ;INDICATE I/O THROUGH PARTITIONC6 MOV W/ .TITLE XXDRV - GENERAL DEVICE INTERFACE DRIVER .IDENT /2.04/;C1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reserved$;S;5; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAYD5; BE USED AND COPIED ONLY IN ACCORDANCE WITH THET5; TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THEO5; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER 5; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISEC5; MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TOO5; AND OWNERSHIP OF THE SOFTWARE IS HEREBY I; TRANSFERRED.;.5; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TOI5; 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; Modified for CPRSX V2.0 by:V;A; K. L. Noel 15-May-1989 2.00>; KLN141 - Make xxdrv return success for all QIOs before the ; remote bit has been setI;R#; Paul K. M. Weiss 12-Jun-1989 2.01 .; PKW177 - Change H$TIUC and H$VUCB to H$UNIT;O#; Paul K. M. Weiss 19-Jun-1989 2.02T?; PKW181 - Buffer small QIOs and ACP QIOs in single cpr packetL; ; K. L. Noel 28-Aug-1989 2.03O2; KLN144 - Map task header at beginning of driver;B; Modified after CPRSX V1.1 by:N;A"; Paul K. M. Weiss 2-May-1990 2.04:; PKW194 - Wouldn't it be an interesting idea to actually; process D-space overlays?; MACRO LIBRARY CALLS ; 1 .MCALL HWDDF$,PKTDF$,SCBDF$,UCBDF$,CPRDF$,TCBDF$-$ HWDDF$ ;DEFINE HARDWARE REGISTERS SCBDF$ ,,1 ;SCB DEFINITIONS ( UCBDF$ ,,1 ;UNIT CONTROL BLOCK OFFSETS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS# CPRDF$ ;CPR SPECIFIC DEFINITIONSe! TCBDF$ ;TCB OFFSET DEFINITIONSa;a; DEVICE DISPATCH TABLE ;v DDT$ XX,1,,,,NEW=Y,,,SNX=YES; ; LOCAL SYMBOLSK;. MAP6 = 140000;4 ; IMPURE DATAo;nSNDCOD::2 .BLKW 1 ; FUNCTION CODE TO USE TO SEND CPR PACKET .PAGE- .SBTTL XXCHK - SEND NEXT COMMAND ENTRY POINT$,; ** - XXCHK - SEND NEXT COMMNAD ENTRY POINT;FF; XXCHK IS A POOR NAME, BUT THAT'S WHAT DDT$ GENERATES, SO HERE IT IS.F; THIS ROUTINE JUST SENDS THE PACKET THAT WAS ALLOCATED AT UNIT ONLINE&; TIME TO VMS. NO RETURN IS EXPECTED.;B;FXXCHK:" CPSEN$ #SN$NOT,U.CPKT(R0),#H$SIZE RETURND .PAGE' .SBTTL XXUCB - UNIT ONLINE ENTRY POINT&; ** - XXUCB - UNIT ONLINE ENTRY POINT;D; FOR TT: UCBS WHICH ARE IN THE GENERIC DATA BASE, CALL TH00wvt__DATADATADATADATAE ROUTINE E; $CPRCN TO ASSOCIATE THE TT: UCB WITH A CORRESPONDING VMS CP: UCB: E!; FOR ALL OTHER UCBS, JUST RETURN ;A*; SET UNIT MOUNTED (IF A MOUNTABLE DEVICE);H ; INPUTS:; S; R5 UCB ADDRESS; C=1 TRANSITION TO OFFLINE; C=0 TRANSITION TO ONLINE;. ; OUTPUTS:;E/; IE.DNR IS SET IN $SCERR IF OFFLINE TRANSITIONR;#XXUCB::R BCC 3$ ;IF CC ONLINE REQUEST + MOVB #IE.DNR,$SCERR ;SET DEVICE NOT READYI' MOV U.DCB(R5),R0 ;GET THIS UNIT'S DCBW+ CMPB #377,D.UNIT(R0) ;IS IT A GENERIC DCBO( BEQ 10$ ;IF EQ YES - DON'T DISCONNECT SEC ;SHOW OFFLINE CALL4 CALL $CPCON ;CALL CPCON TO CLEAR UCB OUT OF TABLE BR 10$ ;AND RETURNU3$:DI; CHECK FOR UNIT ALREADY ONLINE SO WE DON'T DO THE CONNECT MORE THAN ONCEE; - BITB #US.OFL,U.ST2(R5) ;UNIT ALREADY ONLINE?  BEQ 10$ ;IF EQ YES ;FM; ONLY CALL THE CONNECT ROUTINE IF THE UNIT IS A REAL UNIT, NOT A GENERIC ONE,;E*5$: MOV U.DCB(R5),R0 ;GET THIS UNIT'S DCB+ CMPB #377,D.UNIT(R0) ;IS IT A GENERIC DCB0% BEQ 10$ ;IF EQ YES - DON'T CONNECTF" MOV #AL$NBL,R0 ;DON'T BLOCK TASK MOV #1,R1 ;ALLOCATE ONE BLOCK CALL $CPALO! BCC 6$ ;IF WE GOT IT, CONTINUE & MOVB #IE.IDU,$SCERR ;FAIL THE ONLINE BR 10$ ;AND RETURN'6$: / MOV R0,U.CPKT(R5) ;SAVE THE PACKET IN THE UCBT( CALL $CPCON ;CALL THE CONNECT ROUTINE' MOV @#KISAR6,-(SP) ;SAVE APR6 MAPPING ! MOV R0,@#KISAR6 ;MAP THE PACKET / MOV #MAP6+1,R1 ;APR6 BASE ADDRESS - SKIP SIZET CLRB (R1)+ ;CLEAR SECOND BYTE MOV #H$SIZE,R2 ;SIZE OF HEADER ASR R2 ;CUT IT IN HALFO" DEC R2 ;FIRST WORD ALREADY DONE%7$: CLR (R1)+ ;CLEAR OUT THE HEADERK SOB R2,7$ ;% MOV #MAP6,R1 ;GET BASE ADDRESS BACKV+ MOVB #HT$SNX,H$TYPE(R1) ;SEND NEXT COMMAND 0 MOVB U.CPUN(R5),H$UNIT(R1) ;SET THE UNIT NUMBER! MOV (SP)+,@#KISAR6 ;REMAP APR 6; 10$: RETURNE .PAGE5 .SBTTL XXKRB - CONTROLLER ONLINE/OFFLINE ENTRY POINTI3; ** - XXKRB- CONTROLLER ONLINE/OFFLINE ENTRY POINTR; ; INPUTS:T; R; R2 KRB ADDRESS; C=1 TRANSITION TO OFFLINE; C=0 TRANSITION TO ONLINE;I ; OUTPUTS:;C/; IE.DNR IS SET IN $SCERR IF OFFLINE TRANSITIONC;RXXKRB::H BCC 10$ ;IF CC ONLINE REQUEST+ MOVB #IE.DNR,$SCERR ;SET DEVICE NOT READY$ RETURN;10$:' MOV @#KISAR6,-(SP) ;SAVE APR6 MAPPING ( MOV $KXBAS,@#KISAR6 ;MAP THE KX DRIVER7 MOV @#KISAR5,MAP6+14 ;PUT THE XX BIAS IN THE KX DRIVERO= MOV #ALFAIL,MAP6+16 ;AND THE ALLOCATION FAILURE ENTRY POINTR* MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING RETURN $XXINT:: .PAGE( .SBTTL XXINI - INITIATE I/O ENTRY POINT'; ** - XXINI - INITIATE I/O ENTRY POINTI;E ; INPUTS: ; ; R1 = I/O PACKET R; R4 = SCB ADDRESS ; R5 = UCB ADDRESS ;M ; OUTPUTS:;E;; IF RESOURCES ARE AVAILABLE, THE REQUEST IS DEQUEUED AND P); PROCESSED ACCORDING TO THE DEVICE TYPE.6;MXXINI:: ;V6; MAP TASK HEADER SO REFERENCES TO LUT WILL BE CORRECT;O MOV $TKTCB,R0 ;GET TCB ADDRESS# MOV T.PCB(R0),R0 ;GET PCB ADDRESS(( MOV P.REL(R0),KISAR6 ;MAP TASK'S HEADER; +; CHECK FOR FUNCTIONS SENT TO US FROM DREIFI;E/ CMP #IO.CLN!1,I.FCN(R1) ;CLOSE LUN FROM DREIF?O BEQ 10$ ;IF EQ YES , CMP #IO.DET!1,I.FCN(R1) ;DETACH FROM DREIF? BNE 45$ ;IF NE NO10$:( CLRB I.FCN(R1) ;DON'T NEED BIT ANYMORE;E.; GET RID OF STACK CONTEXT AND SET RUNDOWN BIT;O- MOV #$STACK-22,SP ;GET RID OF STACK CONTEXTK# MOV I.TCB(R1),R0 ;GET TCB ADDRESSC3 MOV T.ASTL(R0),R2 ;GET ADDRESS OF FIRST AST BLOCKP BEQ 40$ ;IF EQ NONES TSTB A.CBL(R2) ;KERNAL AST?T1 BMI 50$ ;IF MI YES, RUNDOWN BIT MIGHT DEADLOCKF40$: I) BIS #TS.RDN,T.STAT(R0) ;SET RUN DOWN BIT ! BR 50$ ;NO DIRECTIVE TO FINISH 45$:;#; FINISH DIRECTIVE - A;F, MOV #$STACK-24,SP ;POINT SP AT STATUS WORD; F; (NOTE TO BENNY: THE FOLLOWING CODE WAS STOLEN FROM $DRFIN IN DRDSP);OA; INCREMENT GROUP GLOBAL USE COUNTS (OR SCRATCH WORD IF DIRECIVEST; DON'T USE GROUP GLOBALS);M .IF DF G$$GEF0 INC @$GEFPT ;INCREMENT GROUP GLOBAL USE COUNT2 INCB @$GFTCB ;INC GRP GLOBAL USE COUNT FOR TASK .ENDC ; DF G$$GEF;G'; WRITE DIRECTIVE STATUS BACK INTO TASK(; +00wwibjbkb a a a MTPD$ @#H.DSW ;SET DIRECTIVE STATUS WORDO;NH; GET USER STACK POINTER AND UPDATE TO REMOVE DPB OR ADDRESS OF DPB FROM ; THE STACK.; " MFPI SP ;GET USER STACK POINTER/ ADD $BTRMV,(SP) ;REMOVE BYTES FROM USER STACKM& MTPI SP ;RESTORE USER STACK POINTER50$:;IM; CALL PARAMETER CHECKING ROUTINE. THIS MUST BE CALLED BEFORE THE PACKET IS RM; QUEUED SINCE THE CONTEXT MUST BE OF THE ISSUING TASK. TERMINAL QIOS HAVE AA"; SEPARATE PRE-PROCESSING ROUTINE.;I- MOV #XXPRE,-(SP) ;ASSUME NOT A TERMINAL QIOD2 BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL DEVICE? BEQ 60$ ;IF EQ NO, USE XXPREP$ MOV #XXTTI,(SP) ;USE XXTTI INSTEAD+60$: CALL @(SP)+ ;DO PACKET PREPROCESSINGD" BCC TSTQUE ;GO DEQUEUE A PACKET+ JMP IOFIN ;IF CS ERROR - STATUS IN R0,R1T;L; TSTQUE IS ONLY BRANCHED TO WHEN WE KNOW WE HAVE AT LEAST ONE PACKET IN THEK; QUEUE. IF THERE IS MORE THAN ONE, IT MEANS THAT A PREVIOUS ONE MUST HAVE K; FAILED TO ALLOCATE A CPR PACKET. IN THAT CASE, JUST RETURN, WE'LL TRY TOU; SEND IT WHEN KXDRV CALLS BACKT;U2TSTQUE: TST @(R4) ;MORE THAN ONE ENTRY IN QUEUE? BEQ ALPKT ;IF EQ NO #& RETURN ;ALREADY WAITING FOR BUFFER;("; ALLOCATE A CPRBUF REQUEST PACKET;T$; WE DO NOT DO IMPLICIT TASK START!G; THE TASK HAS ALREADY BOUND THE LUN WITH ITS AME. THIS MEANS THAT THEEP; IMPLICIT TASK START HAD TO HAVE ALREADY HAPPENED. SINCE WE MAY NOT BE RUNNINGP; UNDER THE CONTEXT OF THE SAME TASK THAT ISSUED THE QIO, THE VALUE IN $TKTCB ISP; NOT VALID. THE KXDRIVER USES $TKTCB TO SEE IF IT NEEDS TO DO AN IMPLICIT TASK'; START ONLY IF THE AL$IMP BIT IS SET. U;L; THE KXDRIVER WILL NOT RETURN FROM THE CPALO CALL IF IT FAILS TO ALLOCATE AN; BLOCK OF CPRBUF. SINCE WE DO NOT NECESSARILY HAVE THE TASK CONTEXT AND WE DOM; NOT WANT TO REISSUE THE QIO, WHEN RESOURCES BECOME AVAILABLE, THE KXDRIVER H; WILL CALL US BACK AT ALFAIL (SET UP BY XXKRB) TO REISSUE THE REQUEST. ; ;TL; IF THE HIGH BIT OF I.LN2 IS SET, I.PRM CONTAINS A PRE-ALLOCATED CPR PACKET*ALFAIL: MOV U.SCB(R5),R4 ;RESTORE THE SCBALPKT:! MOV (R4),R0 ;GET AN I/O PACKETH/ BEQ 20$ ;SHOULDN'T BE NONE, BUT JUST IN CASEO. TST I.LN2(R0) ;IS A CPR PACKET PREALLOCATED? BPL 10$ ;NOPE, ALLOCATE ONE2 MOV I.PRM(R0),-(SP) ;USE THE PREALLOCATED PACKET BR 31$ ;CONTINUE IN COMMONI#10$: CLR R0 ;ASSUME NO CPR PACKETH2 BIT #HF.RMT,$HFMSK ;ARE WE A REMOTE SYSTEM, YET?& BEQ 30$ ;IF NOT, DON'T GET A PACKET7 MOV #AL$XXD,R0 ;INDICATE NO BLOCKING AND NO PC BACKUPR MOV #1,R1 ;ALLOCATE 1 BLOCK. CALL $CPALO ;CALL ALLOCATE ROUTINE IN KXDRV;,"; 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 PARTICULAR CONTROLLER IS TOO BUSY.N; SINCE WE ACCEPT ANY PACKET, WE WILL ALWAYS GET THE FIRST PACKET IN THE QUEUE;R$30$: MOV R0,-(SP) ;SAVE BUFFER BIAS131$: MOV #20$,R2 ;ADDRESS OF ACCEPTANCE ROUTINEE" CALL $GSPKT ;DEQUEUE I/O PACKET# MOV (SP)+,R0 ;RESTORE BUFFER BIASV' BCC 40$ ;IF CC, WE GOT AN I/O PACKETO;;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 ;I( BEQ 20$ ;IF ZERO, DON'T HAVE A PACKET8 CALLR $CPDEA ;DEALLOCATE THE CPRBUF PACKET AND RETURN;PG; THIS IS THE DRIVER ACCEPTANCE ROUTINE FOR $GSPKT - WE ACCEPT ANYTHING0(20$: CLC ;CLEAR CARRY FOR GSPKT$ CALL RETURN ; U; ; AFTER CALL TO $GSPKT;;; R0 = CPR PACKET BIAS; R1 = ADDRESS OF I/O PACKET; R2 = PHYSICAL UNIT #; R3 = CONTROLLER INDEX ; R4 = SCB ADDRESS;E40$:2 BIT #HF.RMT,$HFMSK ;ARE WE A REMOTE SYSTEM, YET? BNE 42$ ;IF SO, KEEP GOINGE;S6; WE ARE NOT A REMOTE SYSTEM YET, JUST RETURN SUCCESS ;K$ MOV I.TCB(R1),R5 ; GET TCB ADDRESS, BIC #TS.RSW,T.STAT(R5) ; CLEAR BLOCKING BIT% MOV R1,R5 ; GET I/O PACKET ADDRESSC" MOV #1,-(SP) ; PUSH STATUS WORDS MOV #0,-(SP) ; A CLR R0 ; SHOW NO CPR PACKET+ TST I.LN2(R1) ; PACKET ALREADY ALLOCATED?  BPL 41$ ; NOPE, NO PACKET/ MOV I.P00wvt__DATADATADATADATARM(R1),R0 ; GET THE PREALLOCTED PACKET 41$: JMP CMPLIO ; COMPLETE I/O42$:;F@; WE HAVE A PACKET. SET THE DEFAULT CODE TO BE USED TO SEND IT.;S/ MOV #SN$QIO,SNDCOD ; DEFAULT IS A NORMAL QIO.U;S; CHECK FOR OVERLAY QIO'S;;T" MOV I.UCB(R1),R5 ;GET UCB ADRESS" TST U.CW1(R5) ;MOUNTABLE DEVICE?/ BPL 50$ ;IF PL NO, CAN'T BE OVERLAY FUNCTION % MOV I.FCN(R1),R2 ;GET FUNCTION CODE 1 CMP #IO.LOV,R2 ;IS IT THE I-SPACE LOAD OVERLAY?R BEQ 45$ ;IF EQ YES41 CMP #IO.LDO,R2 ;IS IT THE D-SPACE LOAD OVERLAY?E BNE 50$ ;IF NE NO45$: JMP OVERLD ;O50$:;O.; CHECK FOR ATTACH OR NETWORK SPECIFY AST QIO.;D MOV (R5),R3 ;GET DCB' CMPB I.FCN+1(R1),#IO.ATT/256. ;ATTACH?O BEQ 55$ ;IF EQ YES * CMP D.NAM(R3),#"NS ;IS THIS THE NETWORK? BNE 57$ ;IF NE NO# CMP I.FCN(R1),#16420 ;NETWORK SPA?$ BNE 57$ ;IF NE NO, TST I.PRM(R1) ;IS AN AST ADDRESS SPECIFIED* BEQ 57$ ;NO, IT'S DELETING THE REQUEST.55$:  MOV R0,-(SP) ;SAVE R0  MOV R1,-(SP) ; AND R1O MOV R4,-(SP) ; AND R4O6 CALL XXATT ;DO ATTACH (CARRY SET IF ERROR DETECTED)& MOV R0,R2 ;SAVE ERROR CODE, IF ANY. MOV (SP)+,R4 ;RESTORE R4 MOV (SP)+,R1 ; AND R1. MOV (SP)+,R0 ; AND R0T* BCC 57$ ;CONTINUE NORMALLY IF NO ERROR.$ MOV R2,-(SP) ;PRESERVE ERROR CODE., MOV R1,-(SP) ;PRESERVE I/O PACKET ADDRESS.# CALL $CPDEA ;RELEASE CPR PACKET.P+ MOV (SP)+,R1 ;RESTORE I/O PACKET ADDRESS.$# MOV (SP)+,R0 ;RESTORE ERROR CODE.5 MOV I.TCB(R1),R3 ;GET TCB.9 BIC #TS.RSW,T.STAT(R3) ;THERE IS NO WAIT FOR THIS ERROR.L+ MOV R1,R3 ;IOFIN WANTS I/O PACKET IN R3.C( CLR R1 ;CLEAR TOP HALF OF ERROR CODE.2 JMP IOFIN ;COMPLETE THIS I/O WITH ERROR STATUS.57$:2 BIT #DV.TTY,U.CW1(R5) ;IS THIS A TERMINAL DEVICE?% BEQ 575$ ;NO, FORGET ABOUT SF.GMC.S4 CMP #IO.GTS,I.FCN(R1) ;IS THIS GET SUPPORT REQUEST?! BEQ 573$ ;YES, WE BLOCK THOSE.P6 CMP #SF.GMC,I.FCN(R1) ;HOW ABOUT GET CHARACTERISTICS?& BNE 575$ ;NOPE, LET IT GO NORMALLY.573$:T7 BIS #SF$BLK,SNDCOD ;INDICATE TASK IS BLOCKED FOR THISO ; OPERATION.L575$:R 3;;,; START FILLING IN THE CPRBUF REQUEST PACKET;T@; THE FOLLOWING PARAMETERS ARE INSERTED AFTER THE PACKET HEADER:;A ; | | | %; +---------------+---------------+L); | BUFFER FLAGS | LUN NUMBER | P$LUNG%; +---------------+---------------+E; | RESERVED | P$LUN+2%; +---------------+---------------+F; | I.FCN | P$LUN+4%; +---------------+---------------+N; | I.PRM | P$LUN+6%; +---------------+---------------+T; | I.PRM+2 | P$LUN+10%; +---------------+---------------+U; | I.PRM+4 | P$LUN+12%; +---------------+---------------+ ; | I.PRM+6 | P$LUN+14%; +---------------+---------------+L; | I.PRM+10 | P$LUN+16E%; +---------------+---------------+-; | I.PRM+12 | P$LUN+20|%; +---------------+---------------+-; | I.PRM+14 | P$LUN+22L%; +---------------+---------------+-; | I.PRM+16 | P$LUN+246&; +---------------+---------------+; | SCB | P$LUN+26%; +---------------+---------------+- ; | I/O PACKET | P$LUN+30%; +---------------+---------------+ .; | USER BUFFER BIAS-SMALL READS | P$LUN+32%; +---------------+---------------+P.; | USER BUFFER OFFSET-SMALL READS| P$LUN+34%; +---------------+---------------+N;|N; THE FLAGS BYTE IS A BITMAP FOR I/O BUFFERS. EACH BIT SET CORRESPONDS TO THEN; BEGINNING OF A BIAS/OFFSET/LENGTH TRIPLET IN THE 8-WORD I.PRM AREA. IF THE @; HIGH BIT IS SET, THEN I.PRM CONTAINS A PREALLOCATED CPR PACKET;-! MOV R0,@#KISAR6 ;MAP THE PACKET # MOV #MAP6,R2 ;POINT TO THE HEADER-4 MOVB #HT$QIO,H$TYPE(R2) ;ASSUME REGULAR QIO REQUEST CLRB H$ICNT(R2) ;NO ITEMS-, ADD #P$LUN,R2 ;POINT TO THE PARAMETER AREA;EJ; FINISH FILLING IN THE I/O PACKET, WE ASSUME THERE CAN NOT BE MORE THAN 8; PARAMETER WORDS =60$: MOV I.LN2(R1),(R2)+ ;FILL IN P$LUN FIELD AND FLAGS WORDI TST (R2)+ ;RESERVED WORDR0 MOV I.FCN(R1),(R2)+ ;FILL IN I/O FUNCTION CODE MOV R1,R3+ ADD #I.PRM,R100xwibjbkb a a a ;POINT TO THE PARAMTER LIST .REPT 8.," MOV (R1)+,(R2)+ ;COPY PARAMETERS .ENDR, MOV R4,(R2)+ ;COPY SCB ADDRESS INTO PACKET' MOV R3,(R2)+ ;COPY I/O PACKET ADDRESST- CMP (R2)+,(R2)+ ;SKIP PAST USER BIAS/OFFSET  MOV R3,R1 ;RESTORE PKT TO R1I, TST I.LN2(R1) ;IS THE PACKET PREALLOCATED? BPL SENPKT ;NOPE, LEAVE NOW; CMPB #IO.RLB/256.,I.FCN+1(R3) ;IS THIS READ LOGICAL BLOCK?S/ BEQ SENPKT ;YES, DON'T COPY THE EMPTY BUFFERN< CMPB #IO.RVB/256.,I.FCN+1(R3);HOW ABOUT READ VIRTUAL BLOCK?, BEQ SENPKT ;SAME, DON'T COPY EMPTY BUFFER6 MOVB MAP6,R2 ;GET SIZE IN BLOCKS - SEND WHOLE THING# ASH #6,R2 ;MAKE INTO BYTE OFFSETM ADD #MAP6,R2 ;ADD BASE OFFSETR;T; SEND QIO REQUEST TO AMEA;U#SENPKT: MOV R5,-(SP) ;SAVE THE UCBR9 MOV I.TCB(R1),R5 ;GET THE TCB - MAY NOT BE CURRENT TASK# SUB #MAP6,R2 ;GET SIZE OF REQUEST  CPSEN$ SNDCOD,R0,R2,#SNDRET; ; GET RETURN PACKET;Q MOV R0,@#KISAR6 ;MAP PACKETE) MOV #MAP6,R2 ;POINT TO HEADER OF PACKET)- MOV P$PARM+22(R2),R1 ;GET I/O PACKET ADDRESSS# MOV I.UCB(R1),R5 ;GET UCB ADDRESS6 MOV (R5),R3 ;GET DCB : CMPB #IO.ATT/256.,I.FCN+1(R1) ;IS THIS AN ATTACH REQUEST? BEQ 7$ ;YES, CHECK IT OUT.' CMPB I.FCN+1(R1),#IO.DET/256. ;DETACH?T BEQ 8$ ;YES, DO DETACH.* CMP D.NAM(R3),#"NS ;IS THIS THE NETWORK? BNE 10$ ;NO, SKIP DETACH./ CMP I.FCN(R1),#16410 ;IS THIS A NETWORK CLOSE?# BEQ 8$ ;YES, CANCEL THE AST.8 CMP I.FCN(R1),#IO.CLN*400 ;IS THIS A NETWORK CLOSE LUN? BEQ 8$ ;YES, CANCEL THE AST.+# CMP I.FCN(R1),#16420 ;NETWORK SPA? BNE 10$ ;NO, SKIP DETACH., TST I.PRM(R1) ;IS AN AST ADDRESS SPECIFIED BEQ 8$ ;NO, EMULATE DETACH. ;YES, CHECK FOR SUCCESS. 7$: ' CMP H$STAT(R2),#1 ;DID ATTACH SUCCEED; BEQ 10$ ;IF EQ YESS8$:D+ MOV I.UCB(R1),R5 ;GET UCB ADDRESS OF UNITW;?; DEALLOCATE ACB K;D MOV R0,-(SP) ;SAVE R06 MOV R2,-(SP) ;AND R2) CALL XXDET ;DEQUEUE AND DEALLOCATE ACBC MOV (SP)+,R2 ;RESTORE R2 MOV (SP)+,R0 ;AND R0-10$: MOV P$PARM+20(R2),R4 ;SAVE SCB ADDRESS R/ MOV P$PARM+22(R2),R5 ;SAVE I/O PACKET ADDRESST- MOV H$STAT(R2),-(SP) ;GET FIRST STATUS WORDI0 MOV H$STAT+2(R2),-(SP) ;AND SECOND STATUS WORD;F/; CONVERT LUN NUMBER BACK INTO POINTER INTO LUTC;UCMPLIO: & MOVB I.LN2(R5),R3 ;GET LUN NUMBER" DEC R3 ;LUN NUMBERS START AT 10 ASL R3 ;MULTIPLY BY 4 (4 BYTES PER LUN ENTRY) ASL R3 ;P, ADD #,R3 ;GET OFFSET INTO LUT8 MOV R3,I.LN2(R5) ;RETURN TO LUN FIELD IN I/O PACKET;; COMPLETE I/O;0$ MOV R5,R3 ;GET I/O PACKET ADDRESS$ MOV I.UCB(R3),R5 ;GET UCB ADDRESS J; XXFIN USES THE FIRST I/O STATUS WORD, AT 4(SP), INCLUDING RETURN ADDRESS; WE ARE ABOUT TO GENERATE.7 CALL XXFIN ;DO FINISH WORK FOR NON TERMINAL DEVICESL& ;XXFIN: PRESERVES R4,R5 AND STACK- MOV (SP)+,R1 ;SETUP STATUS WORDS FOR $IODSA  MOV (SP)+,R0 ;;Y6; COMMON POINT TO ALL I/O TO FINISH - SUCCESS OR ERROR;G; R0,R1 - STATUS; R3 - I/O PACKET; R5 - UCB ADDRESSI;/IOFIN:9 CLR I.PRM+16(R3) ;MAKE IOFIN KNOW WE DON'T HAVE A BLOCKE ;LOCKINGRF; $IODSA WILL FORK USING THE I/O PACKET AS THE FORK BLOCK IF THERE IS #; ANOTHER I/O PACKETS IN OUR QUEUE.E?; THIS WILL ENSURE THAT THE KX DRIVER WILL GET TO COMPLETE ITS I&; RING PROCESSING AS SOON AS POSSIBLE.;A+ CALL $IODSA ;CALL I/O COMPLETION ROUTINES;R&; SEE IF ANYTHING ELSE IS IN OUR QUEUE;I.NEMORE: MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESS% TST (R4) ;ANOTHER PACKET IN QUEUE? BNE 10$ ;YES, CHECK IT OUTI RETURNI10$: JMP ALPKT.SNDRET: MOV (SP)+,R5 ;RESTORE THE UCB ADDRESS/ BR NEMORE ;SEE IF THERE ARE ANY MORE TO SENDE R;+; 1; OVERLD - HANDLE LOAD OVERLAY REQUESTS TO CPRSYS;H(; INPUT: R0 - BIAS OF THE REQUEST PACKET; R1 - ADDRESS OF I/O PACKET;N;-OVERLD:P; $; FILL IN THE CPRBUF REQUEST PACKET ;T! 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 ITEMSB- MOV R4,P$PARM+20(R2) ;SAVE THE SCB ADDRESSP4 MOV R1,P$PARM+22(R2) ;SAVE THE I/O 00 xvt__DATADATADATADATAPACKET ADDRESS, ADD #P$IID,R2 ;POINT TO THE PARAMETER AREA;N; LOAD PARAMETERSV;D6 MOV I.TCB(R1),R4 ;GET TCB ADDRESS OF REQUESTING TASK0 MOV T.IID(R4),(R2)+ ;FILL IN IMAGE INDEX FIELD$ 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$;E; SEND QIO REQUEST TO CPRSYS; , JMP SENPKT ;AND GO SEND THE PACKET TO VMSXXOUT::HXXPWF::R RETURNV .PAGE% .SBTTL XXCAN- CANCEL I/O ENTRY POINTS$; ** - XXCAN- CANCEL I/O ENTRY POINT;RK; CANCEL I/O FOR ALL OUTSTANDING I/O ON THE UNIT SPECIFIED BY THE UCB IN R5T; K; FIRST SCAN THE DRIVER'S QUEUE FOR I/O PACKETS WHICH HAVEN'T BEEN SHIPPED +J; 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; 0 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 ENTRYI BEQ 100$ ;IF EQ, NONE;B!; FOUND AN ENTRY IN THE SCB QUEUER;ON; - THIS IS A VERY STRANGE CASE SINCE THE GENERIC DRIVER ONLY HOLDS ONTO I/Os; IF RESOURCES ARE LACKINGTO; - TO HANDLE THIS SITUATION, WE WILL MAKE ONLY 2 CHECKS. IF THE I/O HAS COME N; FROM THIS TASK AND IF THE LUN NUMBERS ARE THE SAME. THE OTHER SITUATIONSO; WHICH SHOULD BE HANDLED, I/O FROM THIS TASK WITH DIFFERENT LUN NUMBERS ANDMK; THE SAME UCB ADDRESS CAN'T BE HANDLE WITHOUT MUCH PAIN BECAUSE OF THE XE; GENERIC UCB STRUCTURE. THIS IS NOT A TERRIBLE RESTRICTION. IF UM; RESOURCES ARE LACKING, THIS CANNOT BE AN IO.KIL QIO SINCE DRQIO DOES NOTTM; LET THE QIO COME THROUGH UNLESS A CPRBUF PACKET IS AVAILABLE. IF WE AREMK; BEING CALLED BECAUSE OF AN ALUN OR PFCS DIRECTIVE, SOMETHING IS REALLYNG; STRANGE BECAUSE THE DIRECTIVE MADE IT TO CPRAME BUT THE I/O PACKET ; COULDN'T.;W- CMP R1,I.TCB(R3) ;REQUEST FOR CURRENT TASK?C BNE 10$ ;IF NE NO2 TST $CPLUN ;IS KILL FOR ALL UNITS? (FROM DREIF) BEQ 50$ ;IF EQ YESN2 MOV I.LN2(R3),R0 ;GET POINTER TO SECOND LUN WORD+ SUB #H.LUN+2+MAP6,R0 ;CALCULATE LUN NUMBERQ ASR R0 ;DIVIDE BY 4 ASR R0 ;H$ CMP R0,$CPLUN ;IS IT THE SAME LUN?$ BNE 10$ ;IF NE NO - DON'T KILL IT;S; REMOVE I/O PACKET FROM QUEUE;E50$: MOV (R3),(R2) ;CLOSE UP LIST BNE 60$ ;IF NE NO NEW LASTE' MOV R2,2(R4) ;SET ADDRESS OF NEW LAST;P ; COMPLETE I/O WITH ABORT STATUS;A60$:/ MOV #IE.ABO&377,R0 ;SET FINAL STATUS TO ABORTR+ TSTB $TEMP2 ;SUBFUNCTION SET FOR IO.KIL?E BMI 70$ ;IF MI YES 3 CLR I.AST(R3) ;MAKE SURE THERE IS NO AST DECLAREDR'70$: CLR R1 ;CLEAR SECOND STATUS WORDD" CALL $IOFIN ;FINISH I/O REQUEST;I/; GO BACK TO SCAN SCB LIST FOR MORE I/O PACKETSK; ( MOV U.SCB(R5),R4 ;GET SCB ADDRESS BACK2 MOV $TKTCB,R1 ;GET CURRENT TASK TCB ADDRESS BACK JMP XXCAN ;SCAN QUEUE AGAIN;;!; PUT PACKET TOGETHER TO KILL I/OP;E100$:T% MOV $CPPKT,@#KISAR6 ;MAP THE PACKET3! BEQ 200$ ;IF EQ DON'T KILL I/O# MOV #MAP6,R2 ;POINT TO THE HEADERO% MOVB #HT$QIO,H$TYPE(R2) ;QIO REQUESTA CLRB H$ICNT(R2) ;NO ITEMSO# MOVB $CPLUN00xxibjbkb a a a,P$LUN(R2) ;FILL IN LUNS CLRB P$FLG(R2) ;NO BUFFERS. MOV #IO.KIL,P$FUNC(R2) ;FILL IN FUNCTION CODE; K; SEND QIO REQUEST TO AME WITH IMMEDIATE RETURN - PACKET WILL BE DEALLOCATEV; ON DETATCHED RETURN BY KXDRV ;R+ MOV R1,R5 ;SET UP TCB FOR PSEUDO REQUEST CPSEN$ #SN$PSR,KISAR6,#H$SIZE+60 CLR $CPPKT ;INDICATE THAT I/O HAS BEEN KILLED200$:2 RETURN  .ENDT KILL I/O# MOV #MAP6,R2 ;POINT TO THE HEADERO% MOVB #HT$QIO,H$TYPE(R2) ;QIO REQUESTA CLRB H$ICNT(R2) ;NO ITEMSO# MOVB $CPLUN .TITLE DRMKTL .IDENT /08.01/$;(1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.F; All rights reservedD;O;Q<; 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 5-SEP-73 ;$; PREVIOUSLY MODIFIED BY:R;P; B. S. MCCARTHY; J. W. BERZLE; C. B. PETROVIC; J. R. KAUFFMAN;/; MODIFIED BY:;;"; Eric Postpischil 22-JAN-90 08.01;; edp081 -- Copy context block so that tasks in clock queue ; have separate UICs.;N;0; MARK TIME AND RUN DIRECTIVES;9; MACRO LIBRARY CALLSA; .MCALL CLKDF$ D .IF DF N$$DIRS .MCALL LNMDF$' LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETSP  .ENDC ;DF N$$DIRW3 CLKDF$ ;DEFINE CLOCK QUEUE CONTROL BLOCK OFFSETSP;+; **-$DRMKT-MARK TIMEE;YI; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DECLARE A SIGNIFICANT EVENT AT AN$; SPECIFIED INTERVAL FROM INSSUANCE.;h ; DPB FORMAT:.;"; WD. 00 -- DIC(23.),DPB SIZE(5.).6; 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.;CC; IF AN EVENT FLAG IS SPECIFIED, THEN IT IS CLEARED AT ISSUANCE ANDF+; SET AT THE TIME OF THE SIGNIFICANT EVENT.T; ?; IF AN AST ENTRY POINT IS SPECIFIED, THEN AN ASYNCHRONOUS TRAPE>; WILL OCCUR AT THE TIME OF THE SIGNIFICANT EVENT. PS, PC, THE<; DIRECTIVE STATUS WORD, AND THE SPECIFIED EVENT FLAG NUMBER:; ARE PUSHED ONTO THE TASK STACK WHEN THE AST IS EFFECTED.;F ; INPUTS: ;B; R0=EVENT FLAG MASK WORD.; R1=EVENT FLAG MASK ADDRESS.I9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.C*; R3=ADDRESS OF THE THIRD WORD IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.T,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;N:; OUTPUTS: (DIRECTIVE STATUS AND PS WORD RETURNED TO TASK); -; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.I&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.T:; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF INSUFFICIENT4; CORE IS AVAILABLE TO ALLOCATE CLOCK QUEUE ENTRY.;- .ENABL LSBE0$DRMKT::MOV -2(R3),-(SP) ;SAVE EVENT FLAG NUMBER+ MOV R1,-(SP) ;SAVE EVENT FLAG MASK ADDRESS 2 BIC #1,R1 ;CLR GRP GLOBAL EFN 2ND WORD INDICATOR BIC R0,(R1) ;CLEAR EVENT FLAGT! MOV R0,R4 ;SAVE EVENT FLAG MASKT* CALL $CVRTM ;CONVERT TIME TO CLOCK TICKS+ MOV R0,-(SP) ;SAVE HIGH ORDER PART OF TIME * MOV R1,-(SP) ;SAVE LOW ORDER PART OF TIME# MOV R4,-(SP) ;SAVE EVENT FLAG MASKI' CLR R4 ;SET TYPE OF CLOCK QUEUE ENTRYF E  .IF DF S$$LIB L* MOV (R3),R2 ;GET AST ENTRY POINT ADDRESS0 CALL $CALTA ;CALCULATE PROPER ADDRESS TO STORE+ MOV R2,-(SP) ;SAVE AST ENTRY POINT ADDRESS  R .IFFB #- MOV (R3),-(SP) ;SAVE AST ENTRY POINT ADDRESSB R .ENDC E E T .IF DF A$$CNT 3 CALL $ALCLK ;ALLOCATE A CLOCK QUEUE CONTROL BLOCKO BR 25$ ; M .IFF( BR 20$ ; R .ENDC M ;+; **-$DRRUN-RUN TASK;AE; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO GENERATE A CLOCK QUEUE ENTRY @; TO CAUSE A TASK TO BE REQUESTED AT A SPECIFIED DELTA TIME FROM=; ISSUANCE AND TO OPTIONALLY REPEAT THE REQUEST PERIODICALLY.S;O ; DPB FORMAT:,;P$; WD. 00 -- DIC(17.),DPB SIZE (11.).$; WD. 01 -- FIRST HALF OF TASK NAME.%; WD. 02 -- SECOND HALF OF TASK NAME.E=; WD. 03 -- PARTITION NAME-NOT SUPPORTED BUT MUST BE PRESENT. =; WD. 04 -- PARTITION NAME-NOT SUPPORTED BUT MUST BE PRESENT.N?; WD. 05 -- REQUEST PRIORITY-NOT SUPPORTED BUT MUST BE PRESENT.R; WD. 06 -- REQUEST UIC.!; WD. 07 -- DELTA TIME MAG00xvt__DATADATADATADATANITUDE.A; WD. 10 -- DELTA TIME UNITS.I*; WD. 11 -- RESCHEDULE INTERVAL MAGNITUDE.&; WD. 12 -- RESCHEDULE INTERVAL UNITS.;O ; INPUTS:M;,5; 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.E9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.E.; 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.;-5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)D;0-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.I&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.M:; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF INSUFFICIENT4; CORE IS AVAILABLE TO ALLOCATE CLOCK QUEUE ENTRY.;; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF AN ATTEMPT IS 3; MADE TO ACTIVATE A TASK WHOSE NAME BEGINS WITH .-; "..." (IF EXECUTIVE-LEVEL DISPATCHING). K9; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF A NONPRI- P2; VILEGED TASK SPECIFIES ANOTHER UIC (IF MULTI- ; USER PROTECTION). C ; ;- MAP5=120000 MAP6=140000$DRRUN:: ;  .IF DF R$$DSP 7 CMP T.NAM(R0),#^R... ;MULTI-USER TASK NAME SPECIFIED? C BEQ 40$ ;IF EQ YES, ILLEGAL  .ENDC - MOV R0,R5 ;SAVE TCB ADDRESS OF TASK TO RUN I* 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 R32 CALL $UISET ;ESTABLISH DEFAULT AND CURRENT UIC'S MOV (SP)+,R3 ;RESTORE R3D/ BCS 30$ ;IF CS NONPRV TASK SPECIFIED DIFF UIC  MOV R1,-(SP) ;SAVE CURRENT UICT .IFF#$ MOV (R3)+,-(SP) ;SAVE SPECIFIED UIC .ENDC0 CALL $CVRTM ;CONVERT DELTA TIME TO CLOCK TICKS+ MOV R0,-(SP) ;SAVE HIGH ORDER PART OF TIME * MOV R1,-(SP) ;SAVE LOW ORDER PART OF TIME+ MOV #C.SSHT,R4 ;ASSUME SINGLE SHOT REQUESTM1 MOV (R3)+,R0 ;ANY RESCHEDULE INTERNAL SPECIFIED?  BEQ 10$ ;IF EQ NOC3 CMP -(R3),-(R4) ;ADJUST DPB ADDRESS AND ENTRY TYPEF9 CALL $CVRTM ;CONVERT RESCHEDULE INTERNAL TO CLOCK TICKS$/10$: MOV R0,-(SP) ;SAVE HIGH ORDER PART OF TIME,* MOV R1,-(SP) ;SAVE LOW ORDER PART OF TIME720$: CALL $ALCLK ;ALLOCATE A CLOCK QUEUE CONTROL BLOCKM C E .IF DF A$$CNT O' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGP) MOV $TKTCB,R1 ;LOCATE CURRENT TASK'S TCB + MOV T.ACN(R1),KISAR6 ;MAP ACCOUNTING BLOCKS% BEQ 24$ ;IF EQ, NO ACCOUNTING BLOCKD-22$: CMPB #BT.UAB,@#B.TYP+140000 ;IS IT A UAB BEQ 23$ ;IF EQ YES5 MOV @#B.PNT+140000,KISAR6 ;MAP NEXT ACCOUNTING BLOCKR BR 22$ ;-23$: INCB @#B.USE+140000 ;INCREMENT USE COUNT 724$: MOV KISAR6,C.UAB(R0) ;PUT UAB ADDRESS IN CLQ BLOCKA+ MOV (SP)+,KISAR6 ;RESTORE ORIGINAL MAPPINGC25$: ;MERGE POINT C .ENDC D $8 MOV (SP)+,C.RSI(R0) ;INSERT AST ADDRESS/LOW PART OF RSI8 MOV (SP)+,C.RSI+2(R0) ;INSERT EFN MASK/HIGH PART OF RSI. MOV (SP)+,R2 ;RETRIEVE DELTA TIME TICKS COUNT MOV (SP)+,R1 ; .IF NDF N$$DIR# MOV (SP)+,C.UIC(R0) ;INSERT UIC I .IFF ;NDF N$$DIRP$ TST R4 ;IS THIS MARKTIME DIRECTIVE BNE 26$ ;IF NE, NO- MOV (SP)+,C.UIC(R0) ;INSERT EFN MASK ADDRESS: BR 29$ ;BR AROUND $26$: MOV (SP)+,R3 ;GET UIC OFF STACK MOV R1,-(SP) ;SAVE R1' MOV KISAR6,-(SP) ; SAVE APR 6 MAPPING. MOV R4,-(SP) ; SAVE REGISTERS.R MOV R3,-(SP) ;D MOV R2,-(SP) ;R MOV R0,-(SP) ;R# CLR R0 ; ASSUME NO CONTEXT BLOCK.F MOV $TKTCB,R1 ;GET TI: UCB % MOV T.CTX(R1),R1 ;GET CONTEXT BLOCK 0 BEQ 27$ ; THERE IS NONE, CREATE A DUMMY BLOCK.' MOV R1,KISAR6 ; MAP THE CONTEXT BLOCK. > MOVB C.DDSL+MAP6,R0 ; GET THE LENGTH OF THE DIRECTORY STRING.D MOV #C.DDS+MAP5,R2 ; POINT TO DIRECTORY STRING WITH PAGE 5 ADDRESS.27$:# CALL $CRCTX ;CREATE CONTEXT BLOCKV$ BCS 50$ ;IF CS, ALLOCATION FAILURE) MOV R3,R1 ; MOVE BIAS OF CONTEXT BLOCK." MOV (SP)+,R0 ; RESTORE REGISTERS. MOV (SP)+,R2 ; MOV (SP)+,R3 ;  MOV (SP)+,R4 ;F@ MOV R1,C.CTX(R0) ; INSERT CONTEXT BLOCK ADDRESS IN CLOCK BLOCK.+ MOV R1,KISAR6 ; MAP THE NEW CONTEXT BLOCK.M; MOVB 00"x$xibjbkb a a a#1,C.REF+MAP6 ; MAKE NOTE OF OUR NEW REFERENCE TO IT.DD MOV R3,C.CUIC+MAP6 ; STORE THE UIC, THE WHOLE REASON FOR THIS COPY.- MOV (SP)+,KISAR6 ; RESTORE PREVIOUS MAPPING.R MOV (SP)+,R1 ;RESTORE R1C3 BIS #100000,R4 ;INDICATE SCHEDULE REQUEST WITH DDSI29$: .ENDC ;DF N$$DIRA+ MOVB (SP)+,C.EFN(R0) ;INSERT EFN/ZERO BYTEE% CALLR $CLINS ;INSERT IN CLOCK QUEUE  .IF DF M$$MUP'30$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONA .ENDC .IF DF R$$DSP 6 340$: DRSTS D.RS7 ;MULTI-USER TASK NAME SPECIFIED F  .ENDC  M .IF DF N$$DIR%50$: DRSTS D.RS1 ;ALLOCATION FAILUREV .ENDC ;DF N$$DIRR .DSABL LSB( .ENDRESTORE R1C3 BIS #100000,R4 ;INDICATE SCHEDULE REQUEST WITH DDSI29$: .ENDC ;DF N$$DIRA+ MOVB (SP)+,C.EFN(R0) ;INSERT EFN/ZERO BYTEE% CALLR $CLINS ;INSERT IN CLOCK QUEUE  .IF DF M$$MUP'30$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONA .ENDC .IF DF R$$DSP 6 340$: DRSTS D.RS7 ;MULTI .TITLE TTICH  .IDENT /10.00/ ; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reservedL;T; <; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;D;; 23-JAN-78 PETER WANNHEDEN;V; PREVIOUSLY MODIFIED BY:F;E; P. WANNHEDEN ; C. F. SPITZE; D. R. DONCHIN ; T. LEKAS ; J. KAUFFMAN: ; S. C. ADAMS;; R. S. PHILPOTT ; L. M. KOGAN; L. B. MCCULLEY; M. W. ZAHAREE ; :$; MODIFIED FOR RSX-11M-PLUS V4.4 BY:;D; L. KOGAN 22-MAY-1990 10.00<; LK757 - FIX THE PROBLEM WITH DELETING CSI ESCAPE SEQUENCE; ;;+; ****** T T I C H ******R;LI; THIS MODULE CONTAINS THE ROUTINES WHICH MAKE UP THE "PRE-INPUT PROCESS"CM; AND THE "INPUT PROCESS" OF THE TERMINAL DRIVER. THE "PRE-INPUT" PROCESS ISFO; MODELLED AS RECEIVING CHARACTERS FROM A TERMINAL INTERFACE. THESE CHARACTERS:M; ARE INTERPRETED PRIOR TO BEING MOVED TO EITHER A TYPE-AHEAD BUFFER OR TO ANAK; OUT-OF-BAND CHARACTER BUFFER. THE "INPUT PROCESS" IS MODELLED AS READING0O; CHARACTERS FROM THE TYPE-AHEAD BUFFER, PROCESSING THEM, AND THEN WRITING THEM+L; TO AN INPUT BUFFER. THE PROCESSING INVOLVES RECOGNIZING ESCAPE SEQUENCES,L; EDIT CHARACTERS, AND TERMINATORS AND INITIATING THE ECHO PROCESSING OF THEI; CHARACTER. AN INPUT BUFFER CAN BE A USER TASK BUFFER, "BUFFERED INPUT" .; BUFFERS, OR UNSOLICITED INPUT (CLI) BUFFERS.;-;E& .SBTTL .MCALLS AND SYMBOL DEFINITIONS .IF DF R$$MPL .MCALL KRBDF$ KRBDF$ ;DEFINE KRB SYMBOLS .IFF ;R$$MPLL .MCALL SCBDF$$ SCBDF$ ,,SYSDEF ;DEFINE SCB SYMBOLS .ENDC ;R$$MPL .MCALL PKTDF$ PKTDF$ ;DEFINE PACKET SYMBOLS .IF DF T$$TSA .MCALL EVNDF$* EVNDF$ ;DEFINE TSA EVENT PACKET OFFSETS .ENDC ;T$$TSA .PSECT MAP5.6.PAGE ) .SBTTL TERMINAL DRIVER PRE-INPUT PROCESSA@ .SBTTL . ICHAR1 - INITIALIZATION AND SPECIAL CHARACTER CHECKING;U;+A; **-ICHAR1 - PROCESS AN INPUT CHARACTER BEFORE TYPE-AHEAD BUFFERL;M; THIS ROUTINE INITIATES PROCESSING OF A CHARACTER ON THE "OUTSIDE" (HARDWARECM; SIDE) OF THE TYPE-AHEAD BUFFER. ANY OF THE FOLLOWING ACTIONS MAY BE TAKEN:$;=; 1. IF THE UNIT IS OFFLINE OR WAITING FOR CARRIER, THE INPUTV; CHARACTER IS IGNORED.,; 2. PERFORM AUTOBAUD DETECTION IF REQUIRED.B; 3. CHECK FOR USER REQUEST TO SWITCH TO TERMINAL MANAGEMENT MODE.A; 4. DISPATCH TO ONE OF THE "PRE-INPUT PROCESS" SPECIAL CHARACTERU9; HANDLING ROUTINES (^S, ^Q, ^O, ^X, ^C, ^V). NOTE THATA:; THESE CHARACTERS ARE NOT INTERPRETED IF "PASSTHRU" OR A0; "READ WITH SPECIAL TERMINATORS" IS IN EFFECT.-; 5. PERFORM OUT-OF-BAND CHARACTER DETECTION.I8; 6. TRANSFER CONTROL TO "I1DEF" FOR FURTHER PROCESSING.;G ; INPUTS:3; R2 = CHARACTER (LOW BYTE) AND STATUS (HIGH BYTE)A"; R5 => U.TSTA OF THE TERMINAL UCB;E ; OUTPUTS:E0; R2 = CHARACTER (IF CONTROL PASSED TO "I1DEF");S!; REGISTERS ALTERED: R2, R3, R4E;-;CICHAR1:: .IF DF T$$MODC BITB #US.CRW,U.STS-U.TSTA(R5) ;;;IS THIS UNIT WAITING FOR CARRIER? ( BNE I1RET ;;;IF NE, 00*xvt__DATADATADATADATAYES...IGNORE INPUT .ENDC ;T$$MOD .IF DF R$$CON7 BITB #US.OFL,U.ST2-U.TSTA(R5) ;;;IS THIS UNIT OFFLINE?.( BNE I1RET ;;;IF NE, YES...IGNORE INPUT .ENDC ;R$$CON .IF DF T$$SPL9 MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;;;MAP THE UCBX AND TABUFO .ENDC ;T$$SPL;*; PERFORM AUTOBAUD DETECTION IF NECESSARY.;S .IF DF D$$M11!D$$ZMD!D$$VMD ASSUME S5.ABP,100000-= TST U.TST5-U.TSTA(R5) ;;;IS AUTO-BAUD DETECTION IN PROGRESS?R BPL 10$ ;;;IF PL, NO...SKIPC1 CALL SETSPD ;;;DETERMINE THE CALLER'S BAUD RATE1 BEQ I1RET ;;;IF EQ, DID NOT FIND SPEED...RETURN,0 ;;;ELSE, THE INPUT CHARACTER IN R2 IS A 10$: .ENDC ;D$$M11!D$$ZMD!D$$VMD .IF DF T$$ACDA BIS #UA.ACC!UA.PRO!UA.ECH,U.AFLG-U.TSTA(R5) ;;;SET DEFAULT FLAGS # BIC #UA.TYP,U.AFLG-U.TSTA(R5) ;;;F8 TST U.ACB-U.TSTA(R5) ;;;DOES THIS TERMINAL HAVE AN ACD?' BEQ 20$ ;;;IF EQ, NO...SKIP ACD STUFF. MOV R0,-(SP) ;;;SAVE REGISTER NEEDED FOR CALL: MOV #A.RECE,R0 ;;;SPECIFY CHARACTER RECEPTION ENTRY POINT CALL $SWACD ;;;CALL ACD ! MOV (SP)+,R0 ;;;RESTORE REGISTERI8 BIT #UA.ACC,U.AFLG-U.TSTA(R5) ;;;ACCEPT THIS CHARACTER?) BEQ I1RET ;;;IF EQ, NO...JUST IGNORE ITDB BIT #UA.TYP,U.AFLG-U.TSTA(R5) ;;;FORCE THIS CHARACTER INTO TABUF?% BNE I1BUFR ;;;IF NE, YES...GO DO IT ; BIT #UA.PRO,U.AFLG-U.TSTA(R5) ;;;INTERPRET THIS CHARACTER?  BEQ I1DEF ;;;IF EQ, NO...SKIP220$: .ENDC ;T$$ACD;TK; CHECK FOR HARD RECEIVE ERRORS ON THE INPUT CHARACTER. IT IS ASSUMED THATIJ; THE ERROR BITS PASSED FROM THE HARDWARE MATCH THE FLAG VALUES IN THE UCB; STATUS WORD (U.TST5).B;# .IF DF T$$RED> BIC #^C,R2 ;;;CLEAR EXTRANEOUS BITS= BIT #S5.BCC!S5.DAO!S5.VER,R2 ;;;HARD RECEIVE ERROR DETECTED?T5 BNE I1DEF ;;;IF NE, YES...DON'T INTERPRET CHARACTER .IFF ;T$$REDL= BIT #S5.BCC!S5.DAO!S5.VER,R2 ;;;HARD RECEIVE ERROR DETECTED? 0 BNE I1BEEP ;;;IF NE, YES...RESPOND WITH A BELL .ENDC ;T$$RED. BIT #S3.8BC,4(R5) ;;;PASS 8 BITS TO THE USER? BNE 40$ ;;;IF NE, YES...SKIP. BIC #200,R2 ;;;OTHERWISE, CLEAR THE HIGH BIT40$:;U;; CHECK FOR POTENTIAL SWITCH INTO TERMINAL MANAGEMENT MODE.E;7 .IF DF T$$SCA; CALL TMMCHK ;;;SEE IF INPUT PUTS US IN TERMINAL MGMT MODEO9 BCS I1RET ;;;IF CS, ONE OF SWITCH CHARS SEEN...ALL DONEH .ENDC ;T$$SCA;EH; SCAN PRE-INPUT PROCESS CHARACTER RECOGNITION TABLE AND THE OUT-OF-BAND8; CHARACTER DEFINITIONS FOR THE CURRENT INPUT CHARACTER.;D1 MOV #I1CRT,R3 ;;;GET CHARACTER RECOGNITION TABLE? CMPB R2,(R3)+ ;;;CONTROL-S?, BEQ 50$ ;;;IF EQ, YES...CHECK TTSYNC STATE CMPB R2,(R3)+ ;;;CONTROL-Q?0 BNE 60$ ;;;IF NE, NO...SKIP TO CONTINUE CHECKS50$:2 BIT #S1.TSY,(R5) ;;;TERMINAL HAVE TTSYNC ENABLED? BEQ 60$ ;;;IF EQ, NO...SKIPS3 ASR R3 ;;;CONTROL-S (ASSUMES I1CRT WORD-ALIGNED)?H% BCS I1CTS ;;;IF CS, YES...HANDLE ITP0 BR I1CTQ ;;;ELSE, IT WAS CONTROL-Q...HANDLE IT60$:3 BIT #S1.PTH,(R5) ;;;TERMINAL SET TO PASSTHRU MODE?R BNE I1DEF ;;;IF NE, YES...SKIP .IF DF T$$OOB MOV R0,-(SP) ;;;SAVE REGISTER0 CALL OOBCHK ;;;SEE IF CHARACTER IS OUT-OF-BAND$ BCC 70$ ;;;IF CARRY CLEAR, NOT OOB: CALL OOBCK2 ;;;DO FURTHER CHECKING AND PROCESSING OF OOB! MOV (SP)+,R0 ;;;RESTORE REGISTERB% BCS I1DEF ;;;IF CS THEN OOB INCLUDEA BR I1RET ;;;ELSE, NOT INCLUDED%70$: MOV (SP)+,R0 ;;;RESTORE REGISTER 2 ;;;ELSE, CHARACTER NOT OOB OR IS "OOB INCLUDE"@ 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...PROCESS CONTROL-C" ;;;ELSE, FALL THROUGH TO I1DEF.PAGE - .SBTTL . I1DEF - NORMAL CHARACTER PROCESSING;V;+N; **-I1DEF - HANDLE INPUT CHARACTER THAT HAS NO PRE-INPUT PROCESS SIGNIFICANCE; H; THIS ROUTINE ACCEPTS A CHARACTER FROM "ICHAR1" AND DOES THE FOLLOWING:;PB; 1. IF THE 002x$xibjbkb a a aTYPE-AHEAD BUFFER IS EMPTY, CALL "IPROC" TO SEE IF THE@; CURRENT CHARACTER CAN BE PROCESSED IMMEDIATELY (BY "ICHAR2").C; 2. IF THE TYPE-AHEAD BUFFER IS NOT EMPTY OR "IPROC" INDICATES THE;; CURRENT CHARACTER CANNOT BE PROCESSED NOW, THE CHARACTERF); IS PLACED INTO THE TYPE-AHEAD BUFFER.EB; 3. IF AN ERROR WAS PREVIOUSLY DETECTED, OR THE TYPE-AHEAD BUFFER<; IS FULL, THE CHARACTER IS DISCARDED AND A BELL IS ECHOED.;R ; INPUTS:); R2 = CURRENT CHARACTER TO BE PROCESSEDO"; R5 => U.TSTA OF THE TERMINAL UCB;F ; OUTPUTS: 4; R2 = CHARACTER (IF CONTROL IS PASSED TO "ICHAR2")C; THE CHARACTER IS PLACED IN THE TABUF IF "ICHAR2" CANNOT BE CALLED ;N; REGISTERS MODIFIED: R3, R4;-;CI1DEF: .IF DF T$$SPL. MOV #120000+U.TTBF,R3 ;;;SET POINTER TO TABUF .IFF ;T$$SPLU. MOV U.TTAB-U.TSTA(R5),R3 ;;;GET TABUF POINTER" BEQ I1DEF1 ;;;IF EQ, NONE...SKIP0 BIT #1,R3 ;;;IS THIS A SINGLE-CHARACTER TABUF?9 BNE I1BEEP ;;;IF NE, YES...TABUF IS FULL SO RING A BELLO .ENDC ;T$$SPL0 TSTB 2(R3) ;;;ANY CHARACTERS ALREADY BUFFERED?9 BNE I1BUFR ;;;IF NE, YES...SKIP TO BUFFER THIS ONE ALSOP;EE; I1DEF1 - NOTHING IS CURRENTLY BUFFERED. CHECK TO SEE IF WE NEED TO:5; REQUEST A FORK FOR AN INPUT COUNT STATE TRANSITION.0;UI1DEF1:; .IF DF T$$ICS ASSUME S1.IBY,200% TSTB (R5) ;;;IS INPUT ALREADY BUSY?B0 BMI 10$ ;;;IF MI, YES...WON'T NEED TO SEND ICS7 BIT #S3.ICE,4(R5) ;;;IS INPUT COUNT STATE AST ENABLED?E5 BEQ 10$ ;;;IF EQ, NO...TRY TO PROCESS CHARACTER NOWN .IF DF T$$SCA@ BIT #S5.TMM,U.TST5-U.TSTA(R5) ;;;TERMINAL IN TERM. MANGT. MODE?) BNE 10$ ;;;NE -> YES= -> DON'T SENT ICS  .ENDC ;T$$SCA? MOV #FR.ICS,R3 ;;;SET REQUEST FOR INPUT COUNT STATE TRANSITIONK CALL FORK ;;;REQUEST THE FORKI8 BR I1BUFR ;;;CAN'T PROCESS CHARACTER NOW, SO BUFFER IT10$: .ENDC ;T$$ICS;E?; CHECK TO SEE IF CURRENT CHARACTER CAN BE PROCESSED RIGHT AWAYT;31 CALL IPROC ;;;CAN WE PROCESS THE CHARACTER NOW?B% BCC ICHAR2 ;;;IF CC, YES...GO DO ITH;CO; I1BUFR - CHARACTER CANNOT BE PROCESSED NOW. PUT IT IN THE TYPE-AHEAD BUFFER. ;GI1BUFR: .IF DF T$$REDD BIT #S5.BCC!S5.DAO!S5.VER,U.TST5-U.TSTA(R5) ;;;PREVIOUS HARD ERROR?2 BNE I1BEEP ;;;IF NE, YES...REJECT THIS CHARACTER0 MOV R2,-(SP) ;;;COPY CHARACTER PLUS ERROR FLAGS8 CLRB (SP) ;;;CLEAR LOW BYTE - LEAVE FLAGS IN HIGH BYTEC BIS (SP)+,U.TST5-U.TSTA(R5) ;;;SAVE ERROR FLAGS (IF ANY) FOR LATER3 .ENDC ;T$$RED; CALL PCTAB ;;;PUT THIS CHARACTER IN THE TYPE-AHEAD BUFFER.9 BCS I1BEEP ;;;IF CS, TYPE-AHEAD BUFFER FULL...RING BELLWI1RET: RETURN ;;;ALL DONEF; <; SOME EVENT REQUIRES ECHOING A BELL AT THE USER'S TERMINAL.;TI1BEEP:A2 CALLR BELL ;;;SOME ERROR REQUIRES ECHOING A BELL.PAGER/ .SBTTL . SPECIAL CHARACTER PROCESSING ROUTINESC% .SBTTL . I1CTS - CONTROL-S HANDLINGE;L7; I1CTSL - LOCK OUT INTERRUPTS AND STOP TERMINAL OUTPUTS;RI1CTSL:E! CALL LOCKI ;LOCK OUT INTERRUPTSI1CTS:( BIS #S2.CTS,2(R5) ;;;SET CONTROL-S FLAG. MOV #CT.STP,R2 ;;;SET INDEX FOR "STOP OUTPUT"1 CALLR CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINER% .SBTTL . I1CTQ - CONTROL-Q HANDLINGQ;E9; I1CTQL - LOCK OUT INTERRUPTS AND RESUME TERMINAL OUTPUTL;BI1CTQL::! CALL LOCKI ;LOCK OUT INTERRUPTSPI1CTQ:* BIC #S2.CTS,2(R5) ;;;CLEAR CONTROL-S FLAG0 MOV #CT.RES,R2 ;;;SET INDEX FOR "RESUME OUTPUT"@ BITB #US.OIU,U.STS-U.TSTA(R5) ;;;EXPECTING AN OUTPUT INTERRUPT?$ BNE I1RET ;;;IF NE, NO...JUST EXITI1CTRD:1 CALLR CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINES.PAGES% .SBTTL . I1CTO - CONTROL-O HANDLING ;;I; I1CTO - PROCESS OUTPUT DISCARD REQUEST. IF TASK OUTPUT IS IN PROGRESS,QA; IT IS ABORTED. IF THE TERMINAL IS ATTACHED, THE OUTPUT DISCARDB>; STATE FLAG IS COMPLEMENTED TO ENABLE/DISABLE FURTHER OUTPUT.;SI1CTO:2 TST U.ATT-U.TSTA(R5) ;;;IS THE TERMINAL ATTACHED?2 BEQ 10$ ;;;IF EQ, NO...JUST ABORT CURRENT OUTPUT8 BIT #S2.CTO,2(R5) ;;;IS OUTPUT ALREADY BEING DISCARDED?7 BNE 30$ ;;;IF NE, YES...SKIP TO ENABLE FURTHER OUTPUT 8 BIS #S2.CTO,2(R5) ;;;SET FLAG TO DISABLE FURTHER OUTPUT10$: .IF D00:xvt__DATADATADATADATAF T$$SPL* MOV #120000,R4 ;;;SET POINTER TO THE UCBX .IFF ;T$$SPLS3 MOV U.TUX-U.TSTA(R5),R4 ;;;GET POINTER TO THE UCBXO+ BEQ 40$ ;;;IF EQ, NONE...IGNORE CONTROL-OT .ENDC ;T$$SPL. MOV U.TCO(R4),R3 ;;;GET CURRENT OUTPUT PACKET4 BEQ 40$ ;;;IF EQ, NOT DOING TASK OUTPUT...ALL DONE@ BITB #US.OIU,U.STS-U.TSTA(R5) ;;;EXPECTING AN OUTPUT INTERRUPT?! BNE 40$ ;;;IF NE, NO...ALL DONE  .IF DF T$$RPR2 TST U.TFPB(R4) ;;;IS OUTPUT FROM A READ W/PROMPT?8 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-O20$:4 INC (R3) ;;;SET OUTPUT COMPLETION STATUS TO IS.SUC CALL ABOX ;;;ABORT OUTPUTO) CALLR ODONE ;;;SIMULATE FINAL INTERRUPT ;K%; EXIT FROM THE OUTPUT DISCARD STATE.-;S30$:/ BIC #S2.CTO,2(R5) ;;;CLEAR OUTPUT DISCARD FLAGI40$: RETURND.PAGE% .SBTTL . I1CTC - CONTROL-C HANDLING ;PH; I1CTC - FLUSH TYPE-AHEAD BUFFER, THEN PASS CONTROL-C TO INPUT PROCESS.;NI1CTC: .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 TABUF/ CALL I1CTQ ;;;RESUME OUTPUT IF IT WAS STOPPEDI% MOVB #CH.CTC,R2 ;;;RESTORE CHARACTERP' BR I1DEF1 ;;;GO PROCESS THE CONTROL-CO% .SBTTL . I1CTX - CONTROL-X HANDLING:;RL; I1CTXL - FLUSH TYPE-AHEAD BUFFER AND ENABLE UNSOLICITED ASTS IF NECESSARY.;AI1CTXL::! CALL LOCKI ;LOCK OUT INTERRUPTSCI1CTX:I1CTX1: .IF DF T$$REDA BIC #S5.BCC!S5.DAO!S5.VER,U.TST5-U.TSTA(R5) ;;;CLEAR ERROR FLAGSF .ENDC ;T$$RED; =; UNLOCK UNSOLICITED INPUT AST CONTROL BLOCK IF THERE IS ONE.F;H .IF DF T$$CCA .IF DF T$$SPL? MOV 120000+U.TAST,R3 ;;;GET UNSOLICITED INPUT AST BLOCK IF ONE1 .IFF ;T$$SPLS$ MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX BEQ 10$ ;;;IF EQ, NONE...SKIP-< MOV U.TAST(R4),R3 ;;;GET UNSOLICITED INPUT AST BLOCK IF ONE .ENDC ;T$$SPL BEQ 10$ ;;;IF EQ, NONE...SKIPCC BICB #AF.LCK,A.PRM+5(R3) ;;;UNLOCK AST BLOCK IN CASE IT WAS LOCKEDU10$: .ENDC ;T$$CCA;OJ; FLUSH THE TYPE-AHEAD BUFFER BY RESETTING THE FILL AND RETRIEVAL POINTERSH; AND THE NUMBER OF ACTIVE BYTES. ALSO CALL SNDXON WHICH WILL OUTPUT AN+; XON IF WE HAVE PREVIOUSLY OUTPUT AN XOFF.K;  .IF DF T$$SPL. MOV #120000+U.TTBF,R3 ;;;SET POINTER TO TABUF .IFF ;T$$SPLO. MOV U.TTAB-U.TSTA(R5),R3 ;;;GET TABUF POINTER+ BEQ 20$ ;;;IF EQ, NONE...NOTHING TO RESETB0 BIT #1,R3 ;;;IS THIS A SINGLE-CHARACTER TABUF?2 BEQ 30$ ;;;IF EQ, NO...SKIP TO RESET LARGE TABUF6 CLR U.TTAB-U.TSTA(R5) ;;;FLUSH SINGLE-CHARACTER TABUF20$: RETURN ;;;ALL DONE 30$: .ENDC ;T$$SPL6 CLR (R3)+ ;;;INITIALIZE STORE AND RETRIEVAL POINTERS+ CLRB (R3) ;;;CLEAR NUMBER OF ACTIVE BYTEST* CALLR SNDXON ;;;SEND AN XON IF NECESSARY.PAGET% .SBTTL TERMINAL DRIVER INPUT PROCESS = .SBTTL . ICHAR2 - INITIALIZATION AND INPUT STATE RECOGNITIONQ;$ ;;+5; **-ICHAR2 - INITIATE PROCESSING OF INPUT CHARACTER.S;LL; THIS ROUTINE INITIATES PROCESSING OF A CHARACTER ON THE "INSIDE" (SOFTWAREL; SIDE) OF THE TYPE-AHEAD BUFFER. IT IS ENTERED FROM "I1DEF" ABOVE AND FROMJ; "NXTIC" IN MODULE TTODN WHEN A CHARACTER HAS BEEN REMOVED FROM THE TYPE-J; AHEAD BUFFER FOR PROCESSING. AN ALTERNATE ENTRY POINT "ICH2A" IS CALLEDE; DURING POST-FORK PROCESSING (ROUTINE "FPPFP" IN MODULE TTCIS). THE.%; FOLLOWING ACTIONS MAY BE PERFORMED:U;TF; 1. IF RECEIVER ERROR DETECTION IS SUPPORTED (T$$RED) AND THE CURRENT=; CHARACTER CAUSED AN ERROR, THE PENDING INPUT IS TERMINATEDA); WITH AN APPROPRIATE COMPLETION STATUS.TC; 2. CONVERSION FROM LOWER TO UPPER CASE IS PERFORMED IF NECESSARY.N@; 3. THE CHARACTER IS SAVED IN THE SINGLE-CHARACTER ECHO BUFFER.0; 4. THE INTER-CHARACTER ARRIVAL TIMER IS RESET.D; 5. DISPATCH TO A PROCESSING ROUTINE DEPENDING ON THE CURRENT INPUT2; STATE OR THE TYPE OF CHARACTER BEING PROCESSED.C; 6. PASS CONTROL TO "I2ECHO" TO INITIATE NECESSARY ECHOING FOR THEE; INPUT CHARACTER.R;T ; INPUT00Bx$xibjbkb a a aS:; R2 = CHARACTER "; R5 => U.TSTA OF THE TERMINAL UCB:; IF THE CHARACTER WILL NEED ECHOING, OUTPUT MUST BE IDLE.;L ; OUTPUTS: 1; R2 = CHARACTER (IF CONTROL PASSED TO "I2ECHO")R; R4 => UCBX FOR THE TERMINALE;C!; REGISTERS ALTERED: R2, R3, R4R;-;LICHAR2:: .IF DF T$$SPL* MOV #120000,R4 ;;;SET POINTER TO THE UCBX .IFF ;T$$SPLS, MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX POINTER4 BEQ I1RET ;;;IF EQ, NONE...RETURN (COULD HAPPEN...- ;;; ...WHEN CTRL-C IS TYPED ON AN IDLE...P( ;;; ...SLAVED TERMINAL, FOR EXAMPLE) .IFTF ;T$$SPL .IF DF T$$RED;LJ; EXAMINE THE INPUT CHARACTER TO DETECT A HARD RECEIVE ERROR. IF THERE IS>; ONE, TERMINATE THE CURRENT INPUT WITH AN APPROPRIATE STATUS.;9 BIT #S5.BCC!S5.DAO!S5.VER,R2 ;;;ANY HARD RECEIVE ERRORS?F, BEQ 20$ ;;;IF EQ, NO...SKIP ERROR CHECKING7 MOV #IE.DAO&377,R3 ;;;ASSUME ERROR DUE TO DATA OVERRUN; ASSUME S5.DAO,40000 ROL R2 ;;;DATA OVERRUN?R& BMI 10$ ;;;IF MI, YES...RETURN ERROR4 MOV #IE.BCC&377,R3 ;;;ASSUME FRAMING ERROR OCCURRED ASSUME S5.BCC,S5.DAO/2F ROL R2 ;;;FRAMING ERROR?& BMI 10$ ;;;IF MI, YES...RETURN ERROR7 MOV #IE.VER&377,R3 ;;;ELSE, ERROR MUST BE PARITY ERRORA10$: ASSUME U.TCI,0T" MOV R3,@(R4)+ ;;;STORE ERROR CODE' JMP IDONE ;;;FINISH THE INPUT REQUESTV20$: .ENDC ;T$$RED .IFT ;T$$SPL @ MOVB R2,U.TECO-U.TSTA(R5) ;;;SAVE THE CHARACTER BEING PROCESSED .IFF ;T$$SPLD9 MOVB R2,U.TECB(R4) ;;;SAVE THE CHARACTER BEING PROCESSED. .ENDC ;T$$SPL;E*; RESET THE INTER-CHARACTER ARRIVAL TIMER.;A .IF NE T$$UTO2 MOVB #T$$UTO,U.TITI(R4) ;;;INITIALIZE INPUT TIMER .ENDC ;T$$UTO ASSUME S1.USI,100000;- TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?M BMI 30$ ;;;IF MI, YES...SKIP ASSUME U.TCI,0J1 MOV (R4),R3 ;;;GET CURRENT INPUT REQUEST PACKETN= MOVB I.PRM+6(R3),U.TITI(R4) ;;;INIT USER-DEFINED TIMER VALUEA30$:;A-; DETERMINE ACTION DEPENDENT ON U.TSTA FLAGS.V;2 .IF DF T$$ACDA BIS #UA.PRO!UA.ECH!UA.PUT,U.AFLG-U.TSTA(R5) ;;;SET DEFAULT FLAGS 0 BIC #UA.SPE!UA.COM!UA.CAL,U.AFLG-U.TSTA(R5) ;;;( BIT #S1.RNE,(R5) ;;;DOING READ NO ECHO? BEQ 35$ ;;;BR IF NO;2 BIC #UA.ECH,U.AFLG-U.TSTA(R5) ;;;INDICATE NO ECHO35$:8 TST U.ACB-U.TSTA(R5) ;;;DOES THIS TERMINAL HAVE AN ACD?, BEQ 40$ ;;;IF EQ, NO...SKIP ACD PROCESSING2 MOV R0,-(SP) ;;;SAVE REGISTER NEEDED FOR ACD CALL7 MOV #A.PROC,R0 ;;;SET CHARACTER PROCESSING ENTRY POINTC CALL $SWACD ;;;CALL ACDA! MOV (SP)+,R0 ;;;RESTORE REGISTER#? BIT #UA.PRO,U.AFLG-U.TSTA(R5) ;;;PROCESS THIS CHARACTER AS IS?C2 BEQ I2ECHO ;;;IF EQ, NO...TREAT AS READ-PASS-ALL40$: .ENDC ;T$$ACD* BIT #S3.RUB,4(R5) ;;;RUB-OUT IN PROGRESS? BEQ 50$ ;;;SKIP IF NON" JMP I2RUB1 ;;;DO RUBOUT SEQUENCE50$: .IF DF T$$ESC+ BIT #S1.ESC,(R5) ;;;IN AN ESCAPE SEQUENCE?S BEQ 60$ ;;;IF EQ, NO...SKIPP1 JMP I2ESC2 ;;;CONTINUE WITH THE ESCAPE SEQUENCEC60$: .IFTF ;T$$ESC .IF DF T$$OOB" MOV R4,-(SP) ;;;SAVE REGISTERS.... MOV R0,-(SP) ;;;THAT ARE DESTROYED BY OOBCHK % CALL OOBCHK ;;;WAS THIS CHAR. OOB? A" MOV (SP)+,R0 ;;;RESTORE REGISTERS MOV (SP)+,R4 ;;;...- BCS I2ECHO ;;;CS->OOB->NO SPECIAL FUNCTIONS; .ENDC ;T$$OOB0 BIT #S1.RST,(R5) ;;;READ WITH TERMINATOR TABLE?: BEQ 70$ ;;;IF EQ, NOT DOING READ-WITH-TERMINATORS...SKIP .IFT ;T$$ESCU@; IF THIS IS NOT AN EXTENDED I/O, CHECK FOR SPECIAL TERMINATORS.>; IF THIS IS EXTENDED I/O, AND THE CHARACTER IS AN ESCAPE WITHA; ESCAPE SEQUENCES RECOGNIZED, ALLOW THIS TO START AN ESCAPE SEQE; RATHER THAN TERMINATE A READ.  .IF DF T$$EIO& BIT #S6.EIO,U.TST6-U.TSTA(R5) ;;;EIO?. BEQ 65$ ;;;EQ, NOT EIO, CHECK FOR TERMINATORD BIT #U2.ESC,U.CW2-U.TSTA(R5) ;;;DOES TERMINAL GENERATE ESCAPE SEQ.?! BEQ 65$ ;;;IF EQ, CHECK FOR RST;5 BIT #S1.RES,(R5) ;;;DOES TASK WANT ESCAPE SEQUENCES? ( BEQ 65$ ;;;IF EQ,NO .. CHECK FOR RST & CMPB R2,#CH.ESC ;;;IS THIS AN ESCAPE?' BEQ 70$ ;;;IF ESC, SKIP CHECK FOR RSTI' CMPB R2,#233 ;;;IS THIS A CSI ESCAPE?G' BEQ 70$ ;;;IF CSI, SKIP CHECK FOR RSTE65$: .ENDC ;T$$EIO .ENDC ;T$$ESC. CALL I2RST ;;;CHECK 00Jxvt__DATADATADATADATAFOR A SPECIAL TERMINATOR1 ;;;IF WE RETURN, CHARACTER WAS NOT TERMINATORR) ;;;IF TERMINATOR, STATUS HAS BEEN SETM70$:+ BIT #S1.PTH,(R5) ;;;TERMINAL IN PASSTHRU ? 2 BNE I2ECHO ;;;IF NE, YES...PROCESS CHARACTER NOW4 BIT #S1.RSP,(R5) ;;;TERMINAL IN SPECIAL PROCESSING?3 BNE CASCHK ;;;NE => YES CHECK FOR CASE CONVERSION;9 .SBTTL . ICH2A - DISPATCH DEPENDING ON CURRENT CHARACTER ;AJ; ICH2A - DETERMINE ACTION DEPENDENT ON CHARACTER. SPECIAL CHARACTERS ARED; DIVIDED INTO TWO DISPATCH TABLES. IF THE CURRENT CHARACTER IS NOTA; IN THE FIRST TABLE, THE DISPATCH WILL BE TO "EDDEF". HERE, THETC; EDIT CHARACTER (OTHER THAN ^R, ^U, AND DELETE) DISPATCH TABLE IS B; CHECKED. IF NOT IN THAT TABLE, PROCESSING CONTINUES AT "I2DEF".;5 .ENABL LSB  .IF DF T$$EIO ?8 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$$EIOICH2A::N; MOV #EDCRT,R3 ;;;POINT TO EDIT CHARACTER RECOGNITION TABLEN. CMPB R2,#CH.SP ;;;IS CHARACTER IN THIS TABLE?( BLO 10$ ;;;IF LO, YES...SCAN THE TABLE0 CMPB R2,#CH.RUB ;;;ELSE, IS CHARACTER A RUBOUT?7 BNE I2DEF ;;;IF NE, NO...MUST BE A "NORMAL" CHARACTER " BR 10$ ;;;COULD BE IN THIS TABLE;IG; EDDEF - CHARACTER IS NOT IN FIRST RECOGNITION TABLE. SEE IF IT IS AN18; ENABLED EDIT CHARACTER (OTHER THAN ^R, ^U, OR RUBOUT).; EDDEF:: 4 MOV #I2CRT,R3 ;;;ASSUME WE WANT TO SCAN FIRST TABLE10$:1 CALLR CHRDSP ;;;DISPATCH ACCORDING TO CHARACTERE .DSABL LSBN;CP; I2DEF - IF THE TERMINAL DOES NOT SUPPORT LOWERCASE, SEE IF THE INPUT CHARACTERD; IS ONE OF THE ALTERNATE ESCAPE CHARACTERS (RIGHT BRACE AND TILDE).; G; EKDEF - COME HERE TO ECHO TERMINATOR IN READ WITH SPECIAL TERMINATORSE;IEKDEF:: I2DEF:: ) CMPB R2,#233 ;;;SPECIAL CASE CSI ESCAPEI BNE CASCHK ;;;BRANCH AROUNDT/ JMP I2ESC ;;;TO ALLOW IT TO START ESCAPE SEQ.CASCHK:R .IF DF T$$EIO= BIT #S6.RLU,U.TST6-U.TSTA(R5) ;;;DOING CONVERT TO UPPERCASE?R BNE 5$ ;;;BR IF YES. .ENDC ;T$$EIOA BIT #U2.LWC,U.CW2-U.TSTA(R5) ;;;DOES TERMINAL SUPPORT LOWERCASE?C5 BNE I2ECHO ;;;IF NE, YES...SKIP OTHER ESCAPE CHECKSR5$: 4 BIT #S1.RSP,(R5) ;;;TERMINAL IN SPECIAL PROCESSING?: BNE I2CASE ;;;NE => YES => NOT TERM BUT NEEDS CONVERSION/ CMPB R2,#CH.RBR ;;;IS CHARACTER A RIGHT BRACE?I, BEQ 10$ ;;;IF EQ, YES...TREAT AS AN ESCAPE) CMPB R2,#CH.TLD ;;;IS CHARACTER A TILDE?K6 BNE I2CASE ;;;IF NE, NO...SKIP TO DO CASE CONVERSION' ;;;OTHERWISE, TREAT IT AS AN ESCAPE;10$:6 JMP I2ESC1 ;;;PROCESS ESCAPE CHARACTER AS TERMINATOR;D3; I2CASE - CONVERT LOWER TO UPPER CASE IF REQUIRED.N;YI2CASE: 1 CMPB R2,#340 ;;;EIGHT-BIT LOWER CASE CHARACTER?R: BHI 10$ ;;;IF HIS, YES...CONVERT TO EIGHT-BIT UPPER CASE' CMPB R2,#CH.LCZ ;;;UPPER END GRAPHICS?H* BHI I2ECHO ;;;IF HI, YES...DON'T CONVERT& CMPB R2,#CH.LCA ;;;LOWER CASE LETTER?) BLO I2ECHO ;;;IF LO, NO...DON'T CONVERT10$:; BICB #40,R2 ;;;CONVERT CHARACTER FROM LOWER TO UPPER CASER .IF DF T$$SPL9 MOVB R2,U.TECO-U.TSTA(R5) ;;;UPDATE SAVED CHARACTER ALSO .IFF ;T$$SPL 2 MOVB R2,U.TECB(R4) ;;;UPDATE SAVED CHARACTER ALSO .ENDC ;T$$SPL;4J; FALL THRU TO "I2ECHO" TO PROCESS CHARACTER WITHOUT SPECIAL SIGNIFICANCE.;I.PAGE 6 .SBTTL . I2ECHO - INITIATE ECHO OF AN INPUT CHARACTER;I;-M; **-I2ECHO - PUT CHARACTER IN INPUT BUFFER AND INITIATE ECHOING IF NECESSARYI;HL; THIS ROUTINE PROCESSES A CHARACTER THAT HAD NO SPECIAL SIGNIFICANCE DURINGG; PROCESSING IN "ICHAR2" AND "ICH2A". THE FOLLOWING ACTIONS MAY OCCUR:;;A9; 1. THE CHARACTER IS PLACED IN THE CURRENT INPUT BUFFER.CA; 2. IF ECHO IS SUPPRESSED, A TRANSFER IS MADE TO THE "ECHO DONE"L5; PROCESSING ROUTINES TO CHECK FOR INPUT COMPLETION.S>; 3. ECHO OF THE CHARACTER OR AN EXPANSION OF THE CHARACTER IS ; INITIATED.R;I ; INPUTS:; R2 = CHARACTER ; R4 => UCBX FOR THE TERMINALE"; R5 => U.TSTA OF THE TERMINAL UCB.; IF ECHOING IS REQUIRED, OUTPUT MUST BE FREE.;I; OUTPUTS: NONER;S; REGISTERS MODIFIED: R2, R3;-;OI2ECHO:O .IF DF T$$ACD@ BIT #UA.P00Rx$xibjbkb a a aUT,U.AFLG-U.TSTA(R5) ;;;PUT CHARACTER IN INPUT BUFFER? BEQ 10$ ;;;IF EQ, NO...SKIPR .IFTF ;T$$ACD6 BIT #S1.RST,(R5) ;;;DOING READ W/ SPECIAL TERMINATORS, BEQ 5$ ;;;IF NOT, THIS SHOULD GO IN BUFFER I ASSUME U.TCI,0E# TST @(R4) ;;;HAS STATUS BEEN SET? - BNE 10$ ;;;IF IT HAS, THIS WAS A TERMINATORE5$:5. CALL PUTNIC ;;;PUT CHARACTER IN INPUT BUFFER10$: .IFT ;T$$ACDE9 BIT #UA.SPE,U.AFLG-U.TSTA(R5) ;;;SPECIAL ECHO REQUESTED?2 BEQ I2ECHA ;;;IF EQ, NO...SKIPI2SPE:1 MOV U.ACB-U.TSTA(R5),R2 ;;;GET ACD CONTROL BLOCKN? ADD #A.IMAP,R2 ;;;POINT TO INTERRUPT BUFFER PARAMETERS OFFSETS9 MOV (R2)+,U.TOP(R4) ;;;SET ECHO BUFFER APR BIAS (A.IMAP)B1 MOV (R2)+,R3 ;;;SET ECHO BUFFER ADDRESS (A.IBUF)S0 MOV (R2),R2 ;;;SET ECHO BUFFER LENGTH (A.ILEN)9 CALLR MECHO ;;;OUTPUT THE SPECIAL ECHO USING MULTI-ECHOCI2ECHA:C5 BIT #UA.ECH,U.AFLG-U.TSTA(R5) ;;;ECHO THE CHARACTER?C4 BEQ ECHD2 ;;;IF EQ, NO...PRETEND AN ECHO COMPLETED .ENDC ;T$$ACD( BIT #S1.RNE,(R5) ;;;IS ECHO SUPPRESSED?5 BNE ECHD2 ;;;IF NE, YES...PRETEND AN ECHO COMPLETEDP2 BIT #S1.PTH,(R5) ;;;IS TERMINAL IN PASSTHRU MODE?5 BNE I2ECHC ;;;IF NE, YES...ECHO CHARACTER AS ITSELFM;BP; I2EXPC - PERFORM CHARACTER EXPANSION AND INITIATE ECHO OF CHARACTER OR STRING.;RI2EXPC:A; CALL EXPCHR ;;;EXPAND CHARACTER TO GET PROPER ECHO STRINGE7 BEQ I2ECHC ;;;IF EQ, SKIP TO ECHO CHARACTER AS ITSELFE7 BCC 10$ ;;;IF CC, NO DEFERRED ECHO IS REQUIRED...SKIPC5 BIS #S1.DEC,(R5) ;;;INDICATE DEFERRED ECHO IS NEEDEDC10$:4 CALLR ECHSTR ;;;ECHO STRING DESCRIBED BY R2 AND R3;PI; I2ECHC - ECHO THE CHARACTER STORED IN THE SINGLE-CHARACTER ECHO BUFFER.;;NI2ECHC:E .IF DF T$$SPL2 MOV R5,R3 ;;;SET UP R3 TO POINT TO THE SINGLE...> ADD #U.TECO-U.TSTA,R3 ;;; ...CHARACTER ECHO BUFFER IN THE UCB .IFF ;T$$SPLR2 MOV R4,R3 ;;;SET UP R3 TO POINT TO THE SINGLE...8 ADD #U.TECB,R3 ;;; ...CHARACTER ECHO BUFFER IN THE UCBX .ENDC ;T$$SPL< CALLR ECHCHR ;;;ECHO THE SINGLE CHARACTER POINTED TO BY R3.PAGEE; .SBTTL . ECHD1 - COMPLETE PROCESSING OF AN INPUT CHARACTER3;P;+>; **-ECHD1 - PROCESS COMPLETION OF A CHARACTER OR STRING ECHO.;FG; THIS ROUTINE IS ENTERED WHEN AN ECHO IS DONE. IT PERFORMS ONE OF THE =; FOLLOWING ACTIONS (LISTED FROM HIGHEST TO LOWEST PRIORITY):B;E>; 1. IF DEFERRED PROCESSING IS REQUIRED, PICK UP THE CHARACTER8; SAVED IN THE SINGLE-CHARACTER ECHO BUFFER AND PROCESS; IT FROM THE BEGINNING.N@; 2. IF DEFERRED ECHO IS REQUIRED, JUST ECHO THE CHARACTER SAVED'; IN THE SINGLE-CHARACTER ECHO BUFFER.EE; 3. IF THE CURRENT INPUT HAS COMPLETED, REQUEST A FORK TO HANDLE IT.LF; 4. DISPATCH ON THE CURRENT INPUT STATE VARIABLE (U.TISV). THIS WILL?; EITHER CONTINUE ECHOING OF SPECIAL CASES (E.G. ^R AND ^U) ORLB; WILL MAKE A FORK REQUEST TO GET THE NEXT AVAILABLE I/O REQUEST.N; THE ALTERNATE ENTRY POINT "ECHD2" IS ENTERED WHEN PROCESSING FOR A CHARACTER*; IS COMPLETED AND NO ECHOING IS REQUIRED.; ; INPUTS:; R4 => UCBX FOR THE TERMINALO"; R5 => U.TSTA OF THE TERMINAL UCB; S1.OBY = 0 (OUTPUT IDLE);. ; OUTPUTS:N; UCB UPDATED AS REQUIREDE;A; REGISTERS MODIFIED: R2, R3;-;TECHD1::T4 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...SKIPE MOV R0,-(SP) ;;;SAVE REGISTER1 MOV #A.CALL,R0 ;;;SET ECHO CALL BACK ENTRY POINTT CALL $SWACD ;;;CALL THE ACDN! MOV (SP)+,R0 ;;;RESTORE REGISTER41 BR I2SPE ;;;BRANCH BACK TO CONTINUE ECHO OUTPUTE10$: .ENDC ;T$$ACD .IF DF T$$SPLE MOVB U.TECO-U.TSTA(R5),R2 ;;;RETRIEVE CHARACTER (IN CASE DEFERRED...2* ;;; ...PROCESSING OR ECHO IS REQUIRED) .IFF ;T$$SPLS> MOVB U.TECB(R4),R2 ;;;RETRIEVE CHARACTER (IN CASE DEFERRED...* ;;; ...PROCESSING OR ECHO IS REQUIRED) .ENDC ;T$$SPL@ BIC #S1.DPR!S1.DEC,(R5) ;;;CLEAR DEFERRED PROCESSING/ECHO FLAGS ASSUME S1.DPR,400) ROR R3 ;;;DEFERRED PROCESSING REQUIRED?R$ BCS ICH2A ;;;IF CS, YES...GO DO IT ASSUME S1.DEC,S1.DPR*2C# ROR R3 ;;;DEFERRED ECHO REQUIRED?00Zxvt__DATADATADATADATA% BCS I2EXPC ;;;IF CS, YES...GO DO IT5;2C; ECHD2 - CHECK TO SEE IF THE CURRENT INPUT BUFFER HAS BEEN FILLED.R;HECHD2:;)F; EKESC,EKAES - ESCAPE OR ALTERNATE ESC WAS SEEN AS SPECIAL TERMINATOR;FEKESC::EKAES::. .IF DF T$$ACD1 BIT #UA.COM,U.AFLG-U.TSTA(R5) ;;;COMPLETE INPUT?E BEQ 10$ ;;;IF EQ, NO...SKIPS1 MOV U.ACB-U.TSTA(R5),R3 ;;;GET ACD CONTROL BLOCKE2 MOV A.IOS(R3),@(R4)+ ;;;SET I/O COMPLETION STATUS$ BR IDONE ;;;FORK TO COMPLETE INPUT10$: .ENDC ;T$$ACD ASSUME U.TCI,0S2 TSTB @(R4)+ ;;;HAS A COMPLETION STATUS BEEN SET?6 BNE IDONE ;;;IF NE, YES...FORK TO COMPLETE THE INPUT/ TST U.TIC-2(R4) ;;;IS THE CURRENT BUFFER FULL?E BNE 20$ ;;;IF NE, NO...SKIPE1 BIT #S1.IBF,(R5) ;;;ARE WE DOING BUFFERED INPUT?5 BEQ IDONE ;;;IF EQ, NO...FORK TO COMPLETE THE INPUTB;1E; WE ARE DOING BUFFERED INPUT, AND JUST FILLED UP THE CURRENT BUFFER.LD; SEE IF THERE IS ANOTHER BUFFER LINKED TO THE CURRENT (COULD BE THED; CASE IF THE OPERATOR DID RUBOUT OR CTRL-U, OR IF WE ARE PROCESSINGE; CTRL-R ECHO). IF THERE IS, UPDATE UCB. IF THERE IS NOT, FORK TO GETE; ANOTHER BUFFER.P;E ASSUME U.TIP,U.TCI+221 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 BUFFERJ6 BEQ IDONE1 ;;;IF EQ, NOT ONE...WE ARE DONE AFTER ALL' CMP -(R4),-(R4) ;;;POINT BACK TO U.TIP ;TN; CONSULT INPUT STATE VARIABLE TO SEE WHAT TO DO NEXT. NOTE THAT IN AN ESCAPEN; SEQUENCE, THE STATE VARIABLE IS USED WHEN THE NEXT CHARACTER OF THE SEQUENCEL; ARRIVES...NOT WHEN A PREVIOUS CHARACTER HAS BEEN ECHOED, WHERE WE ARE NOW.L; SO IF WE ARE IN AN ESCAPE SEQUENCE, JUST FORK FOR THE NEXT REQUEST PACKET.;T20$:( TST -(R4) ;;;POINT BACK TO TOP OF UCBX .IF DF T$$ESC; H; THE FOLLOWING ASSUMES THAT THE FIRST ENTRY IN THE INPUT STATE DISPATCHG; TABLE POINTS TO "CFGRQ", WHICH WILL FORK TO GET A NEW REQUEST PACKET.I;E+ CLR R2 ;;;SET UP FOR STATE TABLE DISPATCHA@ BIT #S1.ESC,(R5) ;;;ARE WE IN THE MIDDLE OF AN ESCAPE SEQUENCE?7 BNE NXSTA1 ;;;IF NE, YES...SKIP NORMAL STATE DISPATCHE .ENDC ;T$$ESC;EP; NXSTAT - DISPATCH ON THE CURRENT VALUE OF THE INPUT STATE VARIABLE. THIS WILLL; SEQUENCE THROUGH THE INPUT STATES UNTIL IT FORKS FOR A NEW REQUEST PACKET.;NXSTAT: ) MOVB U.TISV(R4),R2 ;;;GET STATE VARIABLEH ASL R2 ;;;MAKE WORD INDEXLNXSTA1:T4 CALLR @ISDSP(R2) ;;;DISPATCH ON CURRENT INPUT STATEA .SBTTL . IDONE - QUEUE FORK REQUEST FOR INPUT REQUEST COMPLETION5;;H; IDONE - QUEUE A FORK REQUEST BECAUSE A TERMINATOR CHARACTER WAS SEEN.F; THE LINK WORD IN THE PACKET CONTAINS THE COMPLETION STATUS (IF IT IS:; A SOLICITED READ). THE INPUT STATE FLAGS ARE ALSO RESETK; IDONE1 - QUEUE A FORK REQUEST BECAUSE THE (CURRENT) INPUT BUFFER IS FULL.E;IDONE::T5 CALL IRESET ;;;RESET THE TERMINAL INPUT STATE FLAGS IDONE1:W; MOV #FR.IRD,R3 ;;;FORK TO PROCESS INPUT REQUEST COMPLETIONT CALLR FORK ;;;DO IT .PAGE ? .SBTTL . SPECIAL INPUT STATE AND CHARACTER PROCESSING ROUTINES-0 .SBTTL . I2RST - READ WITH SPECIAL TERMINATORS;W;-9; **-I2RST - READ WITH SPECIAL TERMINATORS IS IN PROGRESS ;TL; THIS ROUTINE CHECKS THE CURRENT CHARACTER AGAINST THE PRE-DEFINED "SPECIALH; TERMINATORS" OR AGAINST THE CURRENT USER-SPECIFIED TERMINATOR TABLE TOJ; SEE IF THE CURRENT INPUT REQUEST SHOULD BE COMPLETED. IF SO, AND IF THEP; TERMINATOR IS NOT TO BE ECHOED, THE RETURN ADDRESS (FROM "ICHAR2") IS DELETED L; AND THE INPUT IS TERMINATED. IF THE TERMINATOR NEEDS TO BE ECHOED, STATUSP; IS SET AND A RETURN TO ICHAR2 IS EXECUTED FOR ECHO AND TERMINATION. OTHERWISE,'; THE CHARACTER IS RETURNED UNMODIFIED.T; ; INPUTS:; R2 = CHARACTER ; R4 => UCBX FOR THE TERMINALE"; R5 => U.TSTA OF THE TERMINAL UCB;H; OUTPUTS: NONE;I; REGISTERS MODIFIED: NONE;-;CI2RST:2 MOV R3,-(SP) ;;;SAVE REGISTER USED BY THE ROUTINE6 TST U.TRTT(R4) ;;;USER-SPECIFIED TERMINATORS PRESENT? BEQ 10$ ;;;IF EQ, NO...SKIPN;H5; CHECK CHARACTER AG00bx$xibjbkb a a aAINST USER-DEFINED TERMINATOR SETC;D0 MOV R2,R3 ;;;GET A COPY OF THE TYPED CHARACTER2 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$$EIS6 ADD U.TRTT(R4),R3 ;;;ADD TABLE BASE ADDRESS TO OFFSET' MOV R2,-(SP) ;;;SAVE CURRENT CHARACTERE5 BIC #177760,R2 ;;;THIS TIME LOOK AT LOW ORDER 4 BITSM- ASL R2 ;;;CONVERT FROM BYTE TO WORD OFFSETN? BIT $BTMSK(R2),(R3) ;;;SEE IF MATCHES AGAINST TERMINATOR TABLE5 BEQ 30$ ;;;IF EQ, IT DOESN'T...PROCESS NORMAL CHAR.#" MOV (SP)+,R2 ;;;RESTORE CHARACTER% BR 20$ ;;;CHARACTER IS A TERMINATORR;;7; CHECK CHARACTER AGAINST NORMAL "SPECIAL TERMINATORS". ;10$:- CMPB R2,#CH.SP ;;;IS IT A CONTROL CHARACTER?U, BLO 20$ ;;;IF LO, YES...IT IS A TERMINATOR/ CMPB R2,#CH.RBR ;;;IS IT A "NORMAL" CHARACTER?C0 BLO 40$ ;;;IF LO, YES...IT IS NOT A TERMINATOR# CMPB R2,#CH.RUB ;;;IS IT A RUBOUT?O, BEQ 20$ ;;;IF EQ, YES...IT IS A TERMINATOR9 CMPB R2,# ;;;EIGHT-BIT NON-CONTROL CHARACTER?N2 BHIS 40$ ;;;IF HIS, YES...IT IS NOT A TERMINATOR. CMPB R2,#200 ;;;EIGHT-BIT CONTROL CHARACTER?. BHIS 20$ ;;;IF HIS, YES...IT IS A TERMINATOR< BIT #U2.LWC,U.CW2-U.TSTA(R5) ;;;TERMINAL SUPPORT LOWERCASE?7 BNE 40$ ;;;IF NE, YES...175-176 ARE NORMAL CHARACTERSR;CH; TERMINATOR FOUND - SET COMPLETION STATUS TO IS.SUC WITH THE TERMINATORJ; IN THE HIGH BYTE. ** NOTE ** THE CHARACTER IS NOT STORED IN THE BUFFER.;Q20$:$ MOV R2,R3 ;;;GET COPY OF CHARACTER( SWAB R3 ;;;GET TERMINATOR IN HIGH BYTE CLRB R3 ;;;CLEAR LOW BYTE." INC R3 ;;;SET IS.SUC IN LOW BYTE ASSUME U.TCI,0T MOV R3,@(R4) ;;;STORE STATUSH MOV (SP)+,R3 ;;;RESTORE R3( TST (SP)+ ;;;GET RID OF RETURN ADDRESS2 BIT #S1.TNE!S1.RNE,(R5) ;;;SHOULD THIS BE ECHOED? BNE 25$ ;;;IF NO ECHO BR< MOV #EKCRT,R3 ;;;CHARACTER RECOGNITION TABLE FOR TERM.ECHO. CALLR CHRDSP ;;;AND DISPATCH25$:/ BR IDONE ;;;REQUEST FORK FOR INPUT COMPLETION.30$:" MOV (SP)+,R2 ;;;RESTORE CHARACTER40$:! MOV (SP)+,R3 ;;;RESTORE REGISTERG50$: RETURN ;;;BACK TO CALLERT.PAGER; .SBTTL . I2ESC* - ESCAPE SEQUENCE AND TERMINATOR HANDLING(; ;-H; **-I2ESC - REAL ESCAPE CHARACTER SEEN; POSSIBLY START ESCAPE SEQUENCE5; **-I2AES - ALTERNATE ESCAPE CHARACTER WAS DETECTEDE0; **-I2ESC1 - TERMINATE INPUT WITH IS.ESC STATUS:; **-I2ESC2 - CONTINUE PROCESSING OF INPUT ESCAPE SEQUENCE;;I; THESE ROUTINES HANDLE ESCAPE AND ESCAPE SEQUENCE PROCESSING AS FOLLOWS::;M?; 1. UPON ENTRY AT I2ESC, IF THE TERMINAL IS SET UP TO GENERATER:; ESCAPE SEQUENCES AND THE ATTACHED TASK CAN ACCEPT THEM,7; ESCAPE SEQUENCE MODE IS ESTABLISHED. OTHERWISE, THE 4; ESCAPE TERMINATES THE CURRENT INPUT VIA "I2ESC1".?; 2. ENTRY AT I2AES OCCURS IF AN ALTERNATE ESCAPE CHARACTER WASR; (OCTAL 37) WAS DETECTED. B; 3. ENTRY AT I2ESC1 WILL CAUSE THE CURRENT INPUT TO BE TERMINATED; WITH A STATUS OF IS.ESC.;F; 4. I2ESC2 IS ENTERED TO PROCESS SUBSEQUENT CHARACTERS OF THE CURRENT>; ESCAPE SEQUENCE. SYNTAX RULES ARE CHECKED DEPENDING ON THE<; INPUT STATE VARIABLE, U.TISV. WHEN THE LAST CHARACTER OF<; A VALID SEQUENCE IS RECEIVED, THE INPUT IS COMPLETED WITH; THE STATUS IS.ESQ.TB; 5. A "RUBOUT" CHARACTER WILL CAUSE ALL CHARACTERS RECEIVED SINCE;; AN ESCAPE CHARACTER TO BE REMOVED FROM THE INPUT BUFFER. D; 6. A SYNTAX ERROR WILL TERMINATE THE INPUT WITH THE STATUS IE.IES.;W ; INPUTS: ; R2 = CURRENT INPUT CHARACTER ; R4 => UCBX FOR THE TERMINALT"; R5 => U.TSTA OF THE TERMINAL UCB; ; OUTPUTS: NONEH;E"; REGISTERS MODIFIED: R2, R3, R4;-;,I2ESC::  .IF DF T$$ESCD BIT #U2.ESC,U.CW2-U.TSTA(R5) ;;;DOES TERMINAL GENERATE ESCAPE SEQ.?+ BEQ I2ESC1 ;;;IF EQ, NO...TERMINATE INPUTC5 BIT #S1.RES,(R5) ;;;DOES TASK WANT ESCAPE SEQUENCES?A BEQ I2ESC1 ;;;IF EQ, NO...SKIP ASSUME S1.USI,100000A- TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT? 0 BMI I2ESCU ;;;IF MI, YES...TERMINATE THE INPUT10$:/ BIS #S1.ESC,(R5) ;;;ENTER ESCAPE SEQUENCE MODE  TSTB R2 ;;;IS THIS CSI00jxvt__DATADATADATADATA ESC? BPL I2ESC3 ;;;BR IF NO; MOVB #17,U.TISV(R4) ;;;ESTABLISH OFFSET FOR CSI ESC. SEC. + BR I2ESC3 ;;;STORE THE CHARACTER AND EXITE;E2; I2AES - ALTERNATE ESCAPE CHARACTER WAS DETECTED.;.1 .IFTF ;T$$ESC ;;;LABEL SHOULD ALWAYS BE DEFINEDNI2AES::Q .IFT ;T$$ESCED BIT #U2.ESC,U.CW2-U.TSTA(R5) ;;;TERMINAL GENERATE ESCAPE SEQUENCES?9 BEQ J2EDDF ;;;IF EQ, NO...PROCESS AS A NORMAL CHARACTERI .IFTF ;T$$ESC;B6; I2ESC1 - TERMINATE CURRENT INPUT WITH STATUS IS.ESC.;;I2ESC1:C3 BIT #S1.RST,(R5) ;;;READ WITH SPECIAL TERMINATORS?R BNE I2ESC3 ;;;BR IF SO (NE)  ASSUME U.TCI,02I2ESCU:S6 MOV #IS.ESC,@(R4)+ ;;;SET COMPLETION STATUS TO IS.ESC2 BR IDONE ;;;REQUEST A FORK TO COMPLETE THE INPUT .IFT ;T$$ESCL;B?; I2ESC2 - PROCESS SUBSEQUENT CHARACTERS OF AN ESCAPE SEQUENCE.T;(I2ESC2:R, CMPB R2,#37 ;;;IS CHARACTER IN RANGE 0-37?0 BLO 50$ ;;;IF LO, YES...THIS IS A SYNTAX ERROR2 CMPB R2,#CH.RUB ;;;IS CURRENT CHARACTER A RUBOUT?: BEQ RUBESC ;;;IF EQ, YES...DELETE ENTIRE ESCAPE SEQUENCE. MOVB U.TISV(R4),R3 ;;;GET CURRENT SYNTAX RULE0 BNE 10$ ;;;IF NE, NOT FIRST TIME THRU; SO SKIP2 CMPB U.TTYP-U.TSTA(R5),#T.VT61 ;;;IS THIS A VT61? BNE 10$ ;;;IF NE, NO...SKIP 2 MOV #-6,R3 ;;;SET UP TO ALLOW CERTAIN EXCEPTIONS10$:; ADD #ESCST,R3 ;;;SET POINTER INTO ESCAPE SYNTAX RULE TABLE220$:2 CMPB R2,(R3)+ ;;;IS THE INPUT CHARACTER IN RANGE?) BLO 30$ ;;;IF LO, NO...CHECK NEXT RANGEC CMPB R2,(R3)+ ;;;IN RANGE?C) BHI 40$ ;;;IF HI, NO...CHECK NEXT RANGEY@ MOVB (R3),U.TISV(R4) ;;;CHARACTER IS OK - SAVE NEXT SYNTAX RULE: BNE I2ESC3 ;;;IF NE, NOT DONE YET...STORE CHAR. AND EXIT;K2; ESCAPE SEQUENCE IS COMPLETE - SET STATUS IS.ESQ.;, MOV #IS.ESQ,@U.TCI(R4) ;;;SET RETURN STATUS& BR 60$ ;;;FINISH OFF ESCAPE SEQUENCE;P; CHARACTER DIDN'T MATCH CURRENT RANGE - GET NEXT RANGE FOR CURRENT SYNTAX RULE.;;30$: INC R3 ;;;UPDATE POINTER40$:. TSTB (R3)+ ;;;ANY MORE RANGES FOR THIS RULE?+ BNE 20$ ;;;IF NE, YES...LOOP FOR NEXT ONEC;KI; THE INPUT CHARACTER IS INVALID IN THE ESCAPE SEQUENCE PROCESSED SO FAR.UE; COMPLETE THE CURRENT INPUT REQUEST WITH COMPLETION STATUS "IE.IES".S;E50$:/ MOV #IE.IES&377,@U.TCI(R4) ;;;SET ERROR STATUSS60$:0 CALL I2ESCX ;;;GET OUT OF ESCAPE SEQUENCE MODE;FH; I2ESC3 - STORE THE CURRENT CHARACTER OF THE ESCAPE SEQUENCE AND SEE IF*; THE CURRENT INPUT REQUEST HAS COMPLETED.;  .IFTF ;T$$ESCI2ESC3:T8 CALL PUTNIC ;;;STORE CHARACTER AND DON'T ECHO ANYTHING8 JMP ECHD2 ;;;CHECK FOR COMPLETION OF THE INPUT REQUEST .IFT ;T$$ESC ;EL; RUBESC - DELETE THE ENTIRE ESCAPE SEQUENCE FROM INPUT BUFFER AND EXIT FROM; ESCAPE SEQUENCE MODE.E;0RUBESC::' CALL GETPIC ;;;GET PREVIOUS CHARACTERS' CMPB R2,#CH.ESC ;;;IS THIS THE ESCAPE?E BEQ I2ESCX ;;;YES & CMPB R2,#233 ;;;CHECK FOR CSI ESCAPE0 BNE RUBESC ;;;IF NE, NO...LOOP TILL WE FIND ITI2ESCX: + BIC #S1.ESC,(R5) ;;;GET OUT OF ESCAPE MODE3( CLRB U.TISV(R4) ;;;CLEAR STATE VARIABLE RETURN ;;;RETURNJJ2EDDF: ; JMP I2DEF ;;;CONTINUE INPUT CHARACTER THROUGH INPUT LOGIC  .ENDC ;T$$ESC.PAGEH8 .SBTTL . I2CR - TERMINATE INPUT DUE TO CARRIAGE RETURN;SN; I2CR - CARRIAGE RETURN HAS BEEN INPUT. TERMINATE INPUT WITH STATUS "IS.CR".; .ENABL LSB;I2CR::4 CLR -(SP) ;;;ZERO THE ECHO STRING ADJUSTMENT COUNT3 MOV #IS.CR,-(SP) ;;;SET COMPLETION STATUS TO IS.CRP BR 10$ ;;;SKIP TO COMMON CODE#3 .SBTTL . I2CTZ - TERMINATE INPUT DUE TO CONTROL-Z);;J; I2CTZ - CONTROL-Z HAS BEEN INPUT. TERMINATE INPUT WITH STATUS "IE.EOF".;NI2CTZ::C4 MOV #2,-(SP) ;;;SET ^Z ECHO STRING ADJUSTMENT COUNT9 MOV #IE.EOF&377,-(SP) ;;;SET COMPLETION STATUS TO IE.EOFS10$:2 BIT #S1.RST,(R5) ;;;WAS THIS READ W/ SPEC. TERMS?- BEQ 12$ ;;;IF EQ, NO. THIS IS A TERMINATOR:;CK; COME HERE IF DOING RST. WE HAVE 2 CASES; EITHER THIS IS NOT A TERMINATORCD; AND IS AN INPUT CHARACTER (FIRST PASS THROUGH THIS CODE) OR ELSE,G; THIS IS THE SECOND TIME THROUGH...WE ARE DOING DEFERRED PROCESSING OFAJ; A TERMINATOR. WE END UP HERE FROM ECHD1 AND HAVE BYPASSED THE RST TES00rx$xibjbkb a a aT.3; IF THIS IS THE CASE, A STATUS WILL HAVE BEEN SET.E;F TST (SP)+ ;;;GET RID OF STATUS TST @(R4) ;;;STATUS SET?$ BNE 15$ ;;;NE => YES => TERMINATOR6 CALL PUTNIC ;;;AND PUT THIS NON-TERMINATOR IN BUFFER& BIT #S1.RNE,(R5) ;;;ECHO SUPPRESSED?% BEQ 15$ ;;;JOIN COMMON CODE TO ECHO 0 TST (SP)+ ;;;CLEAN STRING ADJUSTMENT OFF STACK" JMP ECHD2 ;;;AND GET OUT OF HERE12$: ASSUME U.TCI,0E$ MOV (SP)+,@(R4) ;;;ELSE, SET STATUS, BIT #S1.RNE!S1.TNE,(R5) ;;;ECHO SUPPRESSED?* BNE 30$ ;;;GO SET STATUS AND COMPLETE IO BR 15$ ;LI; EKCR AND EKCTZ - OR ^Z WAS SPECIAL TERMINATOR. COME HERE TO ECHO U;EEKCR::0 CLR -(SP) ;;;ZERO ECHO STRING ADJUSTMENT COUNT BR 15$ ;;;JOIN COMMON CODEEKCTZ::R4 MOV #2,-(SP) ;;;SET ^Z ECHO STRING ADJUSTMENT COUNT15$:( CALL EXCR1 ;;;EXPAND A CARRIAGE RETURN1 BCC 20$ ;;;IF CC, NO LEADING LF REQUIRED...SKIPT: BIS #S1.DPR,(R5) ;;;ELSE DEFER PROCESSING OF CR OR CTRL-Z$ CLR (SP) ;;;CLEAR ADJUSTMENT COUNT20$:. ADD (SP),R2 ;;;ADJUST COUNT OF BYTES TO ECHO& SUB (SP)+,R3 ;;;ADJUST BUFFER POINTER& BR C2ECHS ;;;SKIP TO ECHO THE STRING30$: TST (SP)+ ;;;CLEAN STACK) JMP IDONE ;;;COMPLETE THE CURRENT INPUTT .DSABL LSB;.PAGEC2 .SBTTL . CONTROL-U AND CONTROL-R ECHO PROCESSING, .SBTTL . EDCTU - INITIALIZE AND ECHO "^U";AH; EDCTU - CONTROL-U HAS BEEN INPUT. INITIALIZE ECHO PROCESSING TO BEGIN1; ECHO OF "^U " OR "^U ". ;L .ENABL LSB EDCTU:: 5 MOVB #SV.CU1,U.TISV(R4) ;;;INITIALIZE STATE VARIABLEF# MOV #ASCTU,R3 ;;;GET CTRL-U STRINGS .IF DF T$$CTR BR 20$ ;;;ECHO ^UE, .SBTTL . EDCTR - INITIALIZE AND ECHO "^R";H; EDCTR - CONTROL-R HAS BEEN INPUT. INITIALIZE ECHO PROCESSING TO BEGIN%; ECHO OF "^R " ORC+; "^R ".H;^EDCTR:: ( BIT #S1.RNE,(R5) ;;;IS ECHO SUPPRESSED?7 BEQ 10$ ;;;IF EQ, NO...WE CAN PERFORM THE ^R FUNCTION<; CALLR CFGRQ ;;;ELSE, IGNORE AND PROCESS AN OUTPUT REQUEST.10$:9 MOV U.TIP+2(R4),U.TTOC(R4) ;;;SAVE POS. OF LAST BYTE + 1E5 MOVB #SV.CR1,U.TISV(R4) ;;;INITIALIZE STATE VARIABLE^# MOV #ASCTR,R3 ;;;GET CTRL-R STRINGA .ENDC ;T$$CTR20$: BIT #S2.FLF,2(R5) ;;;FORCE LF?I BEQ 30$ ;;;IF EQ, NO...SKIP/ BIT #S1.RNE,(R5) ;;;YES, BUT...IS NO ECHO SET?>% BEQ 25$ ;;;NOPE, DO FORCED LINEFEED? BIC #S2.FLF,2(R5) ;;;NO ECHO THUS NO LINEFEED, JUST CLEAR FLAGI BR 30$ ;;;AND FINISH UPH525$: BIS #S1.DPR,(R5) ;;;DEFER PROCESSING OF ^U OR ^R : CALL EXPCHR ;;;EXPAND CHARACTER IN R2 (JUST TO FORCE LF)5 BR C2ECHS ;;;MAKE CALL TO ECHO THE EXPANSION STRINGN30$:, MOV R3,-(SP) ;;;SAVE ADDRESS OF ECHO STRING ASSUME U.TCI,0N) MOV (R4)+,R3 ;;;GET CURRENT INPUT PACKETO, MOV #UPUNB,-(SP) ;;;ASSUME UNBUFFERED INPUT1 BIT #S1.IBF,(R5) ;;;ARE WE DOING BUFFERED INPUT?2+ BEQ 40$ ;;;IF EQ, NO...CORRECT ASSUMPTIONF$ ADD #U.TFIB-2,R4 ;;;POINT TO U.TFIB' MOV (R4),R2 ;;;GET FIRST INPUT BUFFERH- MOV #FPSUI1,(SP) ;;;ASSUME UNSOLICITED INPUT^ ASSUME S1.USI,100000;& TST (R5) ;;;DOING UNSOLICITED INPUT?, BMI 40$ ;;;IF MI, YES...CORRECT ASSUMPTION@ MOV I.PRM+4(R3),-(R4) ;;;SOLICITED INPUT - GET TOTAL BYTE COUNT MOV #NXTIB,(SP) ;;;40$:; CALL @(SP)+ ;;;CALL UPUNB, FPSUI1, OR NXTIB TO UPDATE UCBN .IF DF T$$SPL' MOV #120000,R4 ;;;RESTORE UCBX POINTERP .IFF ;T$$SPL;0 MOV U.TUX-U.TSTA(R5),R4 ;;;RESTORE UCBX POINTER .ENDC ;T$$SPL) MOV (SP)+,R3 ;;;POINT TO ^U OR ^R STRING% BIT #S1.RNE,(R5) ;;;ECHO SUPPRESSED? % BNE I2CTUE ;;;Y - JUMP (MUST BE ^U)T( MOV #2,R2 ;;;LENGTH OF ^U OR ^R STRING; J; DON'T WORRY ABOUT UPDATING CURRENT HORIZONTAL POSITION FOR 2 CHARACTERS.>; WE ARE GOING TO DO A CARRIAGE RETURN IMMEDIATELY AFTER THEM.; 8 BR C2ECHS ;;;GO ECHO THE STRING DESCRIBED BY R2 AND R3.PAGE1 .SBTTL . I2CTU1/I2CTR1 - ECHO AND FILLERS ;$?; I2CTU1/I2CTR1 - "^R" OR "^U" HAS BEEN ECHOED. SET UP TO ECHOC#; A CARRIAGE-RETURN (PLUS FILLERS). ;OI2CTU1::I2CTR1::/ INCB U.TISV(R4) ;;;UPDATE INPUT STATE VARIABLE; ASSUME S1.USI,100000- TST (R5) ;;;ARE WE DOING UNSOLIC00zxvt__DATADATADATADATAITED INPUT?  .IF DF R$$MPL!A$$CLIG BPL 50$ ;;;IF PL, NO...SKIP2;AI; IN ALTERNATE CLI SYSTEMS, THE CLI PROMPT IS NOT ASSUMED TO START WITH A J; CARRIAGE RETURN, SO DO NOT OUTPUT ONE. RATHER, GO ON TO THE NEXT STATE.; J2NXST:C1 JMP NXSTAT ;;;DON'T GIVE GRATIS CARRIAGE RETURN 50$: .IFF ;R$$MPL!A$$CLI# BMI 70$ ;;;IF MI, YES...ECHO P .ENDC ;R$$MPL!A$$CLI1 .IF DF T$$RPR- TST U.TFPB(R4) ;;;READ W/PROMPT IN PROGRESS?S/ BNE 70$ ;;;IF NE, YES...DON'T SKIP NEXT STATES .ENDC ;T$$RPR60$:. INCB U.TISV(R4) ;;;BYPASS THE NEXT ECHO STATE70$:( CALL EXCR1 ;;;EXPAND A CARRIAGE-RETURNC2ECHS: ( CALLR ECHSTR ;;;ECHO STRING AND RETURN* .SBTTL . I2CTU2 - SET UP TO ECHO PROMPT;XJ; I2CTU2 - "^U " HAS BEEN ECHOED. SEE IF PROMPT BUFFER NEEDS ECHOING.;:I2CTU2:: ASSUME S1.USI,1000007- TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?L- BPL I2CTR2 ;;;IF PL, NO...START PROMPT ECHO;4 CLRB U.TFPB(R4) ;;;SET UP TO USE THE DEFAULT PROMPTA TSTB U.TFPB+1(R4) ;;;DID THE UNSOLICITED INPUT INTERRUPT A READ?) .IF DF T$$SER0 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$$SER4 BEQ I2CTR2 ;;;IF EQ, NO...START ECHOING THE PROMPT80$: .IF DF R$$MPL!A$$CLIE2 INCB U.TISV(R4) ;;;BYPASS CLI PROMPT OUTPUT STATE .ENDC ;R$$MPL!A$$CLII, BR 60$ ;;;SKIP TO OUTPUT A CARRIAGE RETURN* .SBTTL . I2CTR2 - SET UP TO ECHO PROMPT;PH; I2CTR2 - "^R " HAS BEEN ECHOED. INITIALIZE TO START OUTPUT OF THED; CURRENT PROMPT BUFFER. THIS CODE IS ALSO ENTERED DURING CONTROL-U; ECHO PROCESSING.;BI2CTR2::) INCB U.TISV(R4) ;;;UPDATE STATE VARIABLEO;SJ; RESET THE CURRENT HORIZONTAL POSITION TO THE INITIAL HORIZONTAL POSITIONN; FOR THE READ PORTION OF AN IO.RPR. WE DON'T CARE ABOUT INCORRECT HORIZONTALM; POSITION DURING THE ECHO OF THE PROMPT STRING. FURTHERMORE, IT IS POSSIBLENL; THAT THE ORIGINAL PROMPT STARTED AT A POSITION OTHER THAN FIRST COLUMN. IFI; SO, WE CAN ONLY HOPE THAT THE PROMPT BUFFER CONTAINS AN EXPLICIT CURSORHI; POSITIONING COMMAND. IF NOT, THE HORIZONTAL POSITION WILL BE INCORRECT; WHILE DOING THE NEXT READ.;VK; AT THIS INPUT STATE, WE KNOW THAT THE LAST CHARACTER THAT WAS EXPANDED BYAM; "EXPCHR" WAS A CARRIAGE RETURN, SO THE FORCE-LINE-FEED FLAG (S2.FLF) IS NOW I; SET. IF THE INITIAL HOR. POS. IS NOT COLUMN 1, WE MUST CLEAR THE FLAG.I;S? MOVB U.TIHP(R4),U.TCHP-U.TSTA(R5) ;;;RESET HORIZONTAL POSITIONR9 BEQ 90$ ;;;IF EQ, WE ARE AT COLUMN 1...LEAVE S2.FLF SETM? BIC #S2.FLF,2(R5) ;;;OTHERWISE, CLEAR FLAG TO PREVENT EXTRA LFF90$: .IF DF T$$RPR ASSUME S1.USI,100000- TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?U/ BMI 100$ ;;;IF MI, YES...ECHO THE CLI PROMPT  .IF DF R$$MPL!A$$CLIW2 INCB U.TISV(R4) ;;;BYPASS CLI PROMPT OUTPUT STATE .ENDC ;R$$MPL!A$$CLIT9 MOV U.TFPB(R4),U.TFOB(R4) ;;;GET THE FIRST PROMPT BUFFERI0 CALLR STAXL ;;;START ECHO OF THE PROMPT STRING;I ; PREPARE FOR CLI PROMPT OUTPUT.; 100$:A .ENDC ;T$$RPR .IF DF T$$SPC5 TST U.TFPB(R4) ;;;CLI CONTINUATION LINE IN PROGRESS?L BPL 110$ ;;;IF PL, NO...SKIP? MOV #ASCLC,R3 ;;;OTHERWISE, OUTPUT SPECIAL CONTINUATION PROMPTT4 MOV #4,R2 ;;;LENGTH IS 4 BYTES INCLUDING CR AND LF. BR C2ECHS ;;;GO ECHO THE CONTINUATION STRING110$:C .ENDC ;T$$SPC .IF DF R$$MPL!A$$CLI$3 MOV U.MUP-U.TSTA(R5),R3 ;;;GET POINTER TO CLI WORDM. BIC #^C,R3 ;;;CLEAR ALL BUT CLI INDEX/ MOV $CPTBL(R3),R3 ;;;POINT TO CLI PARSER BLOCK.0 MOVB C.PDPL(R3),R2 ;;;GET DEFAULT PROMPT LENGTH1 ADD #C.PRMT,R3 ;;;POINT TO DEFAULT PROMPT STRINGE- TSTB U.TFPB(R4) ;;;WHICH PROMPT DO WE ISSUE?L2 BNE 120$ ;;;IF NE, SKIP TO ISSUE FULL CLI PROMPT! TST R2 ;;;CHECK FOR NULL LENGTHS+ BR 130$ ;;;EITHER PROMPT OR FORGET IT ALLT120$:I> MOVB C.PCPL-C.PRMT(R3),-(SP) ;;;GET LENGTH OF FULL CLI PROMPT. ADD R2,R3 ;;;POINT TO FULL CLI PROMPT STRING MOVB (SP)+,R2 ;;;GET ITS LENGTH130$:A/ BEQ 140$ ;;;IF EQ, NULL LENGTH...DON'T PROMPTC4 MOV R3,U.TSHP(R4) ;;;SAVE CLI PROMPT STRING00x$xibjbkb a a a ADDRESS4 MOVB R2,U.TVFC(R4) ;;;SAVE CLI PROMPT STRING LENGTH ;;;FALL INTO NEXT STATE;4 .SBTTL . I2CTU3/I2CTR3 - OUTPUT CLI PROMPT BUFFER;IO; I2CTU3/I2CTR3 - OUTPUT CLI PROMPT BUFFER BY EXPANDING EACH CHARACTER IN TURN.M;OI2CTU3::I2CTR3::3 MOV U.TSHP(R4),R3 ;;;GET ADDRESS OF NEXT CHARACTERF+ MOVB U.TVFC(R4),R2 ;;;GET REMAINING LENGTHC& BNE 150$ ;;;IF NE, MORE TO DO...SKIP140$:G) INCB U.TISV(R4) ;;;UPDATE STATE VARIABLEH BR J2NXST ;;;GO TO NEXT STATER150$:A) MOVB (R3)+,R2 ;;;GET CHARACTER TO EXPANDF( CALL EXPCHR ;;;GET CHARACTER EXPANSION8 BNE 160$ ;;;IF NE, CHARACTER ECHOES AS A STRING - SKIP. MOV U.TSHP(R4),R3 ;;;SET POINTER TO CHARACTER MOV #1,R2 ;;;SET LENGTH % BR 170$ ;;;UPDATE POINTER AND COUNT160$::4 BCS 180$ ;;;IF CS, NEED TO PRESENT CHARACTER AGAIN170$:E* INC U.TSHP(R4) ;;;POINT TO NEXT CHARACTER DECB U.TVFC(R4) ;;;KEEP COUNT180$:.2 BR C2ECHS ;;;ECHO EXPANSION OF CURRENT CHARACTER .IFF ;R$$MPL!A$$CLI0 MOV #ASCLP,R3 ;;;ASSUME ECHO ANGLE BRACKET ONLY- MOV #2,R2 ;;;TWO BYTES LENGTH (INCLUDES LF)E, TSTB U.TFPB(R4) ;;;DID WE ASSUME CORRECTLY?4 BEQ C2ECHS ;;;IF EQ, YES...SKIP TO ECHO THE STRING .IF DF M$$CLI. MOV U.CLI-U.TSTA(R5),R3 ;;;GET POINTER TO CLI! TST (R3)+ ;;;POINT PAST CLI TCB;' MOV R3,R2 ;;;COPY POINTER TO CLI NAME190$:7 TSTB (R2)+ ;;;SEARCH FOR END OF ASCIZ NAME AND PROMPTR% BNE 190$ ;;;IF NE, NOT THERE...LOOP;' SUB R3,R2 ;;;GET LENGTH OF CLI PROMPT. BR C2ECHS ;;;ECHO CLI PROMPT .IFF ;M$$CLIH0 MOV #ASCLI,R3 ;;;GET ADDRESS OF FULL CLI PROMPT MOV #5,R2 ;;;GET PROMPT LENGTH BR C2ECHS ;;;ECHO CLI PROMPT .ENDC ;M$$CLI .ENDC ;R$$MPL!A$$CLI .DSABL LSBD.PAGEI0 .SBTTL . I2CTU4 - FINISH CONTROL-U PROCESSING;TH; I2CTU4 - COMPLETE PROCESSING OF CONTROL-U INPUT. IF CONTROL-U WAS FORC; AN UNSOLICITED INPUT, "IS.TMO+1" IS SET AS A COMPLETION STATUS SOBA; THAT "FPIRD" WILL KNOW THE DIFFERENCE BETWEEN A USER HITTING ^UC-; AND A FAKED ^U BECAUSE OF AN INPUT TIMEOUT..; I2CTU4::I2CTUE:S2 CLRB U.TISV(R4) ;;;RESET THE INPUT STATE VARIABLEE MOVB U.TCHP-U.TSTA(R5),U.TIHP(R4) ;;;SET INITIAL HOR. POS. = CURRENTI ASSUME S1.USI,100000L- TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?-5 BPL C2CFRQ ;;;IF PL, NO...SKIP TO DO A FORK REQUESTR ASSUME U.TCI,0OB MOV #IS.TMO+1,@(R4)+ ;;;OTHERWISE, SHOW A TIMEOUT ^U HAS FINISHED) JMP IDONE ;;;COMPLETE THE INPUT REQUEST"3 .SBTTL . I2CTR4 - INITIATE ECHO OF CURRENT INPUT^;L; I2CTR4 - SET UP THE INPUT STATE TO RE-ECHO THE INPUT BUFFER. THIS IS DONEC; BY "RECYCLING" ALL CHARACTERS THAT HAVE BEEN INPUT SO FAR THROUGH,; THE INPUT LOGIC.;AI2CTR4::) INCB U.TISV(R4) ;;;UPDATE STATE VARIABLE 2 .SBTTL . I2CTR5 - RECYCLE NEXT INPUT CHARACTER ;PO; I2CTR5 - ECHO THE NEXT INPUT CHARACTER BY SENDING IT THROUGH THE INPUT LOGIC.H;II2CTR5::: MOV U.TIP+2(R4),R3 ;;;GET POINTER TO NEXT BYTE TO PROCESS CMP R3,U.TTOC(R4) ;;;ALL DONE?I! BEQ I2CTR6 ;;;IF EQ, YES...SKIP' CALL GETRIC ;;;GET THE NEXT CHARACTERC4 CALLR ICHAR2 ;;;RECYCLE CHARACTER THRU INPUT LOGIC0 .SBTTL . I2CTR6 - FINISH CONTROL-R PROCESSING;HG; I2CTR6 - COMPLETE PROCESSING OF CONTROL-R. RESET THE INPUT STATE ANDL9; CONDITIONALLY FORK TO START ANY PENDING OUTPUT REQUEST.P; I2CTR6::2 CLRB U.TISV(R4) ;;;RESET THE INPUT STATE VARIABLEC2CFRQ:H< CALLR CFGRQ ;;;CONDITIONALLY FORK TO GET AN OUTPUT REQUEST.PAGEO% .SBTTL . I2CTC - CONTROL-C HANDLING;QN; I2CTC - CONTROL-C IS BEING PROCESSED. START (OR RESTART) UNSOLICITED INPUT.;HI2CTC::E .IF DF T$$SCA5 BIT #S3.TME,4(R5) ;;;IS TERMINAL MANAGEMENT ENABLED?R BEQ 5$ ;;;IF EQ NO5 JMP I2ECHO ;;;IF NE, YES...DON'T DO CONTROL-C STUFFT5$:N .ENDC ;T$$SCA ASSUME U2.SLV,200* TSTB U.CW2-U.TSTA(R5) ;;;SLAVED TERMINAL?0 BMI I2RET ;;;IF MI, YES...IGNORE THE CONTROL-C .IF DF T$$IDO0 TST $MCRPT ;;;IS THE MCR DISPATCHER INSTALLED? BNE 10$ ;;;IF NE, YES...SKIP;RG; THE FORK ROUTINE WHICH STARTS UNSOLICITED INPUT WILL QUEUE THE AST TOS; C$CTEX IF APPROPRIATE.2 MOV #FR.S00xvt__DATADATADATADATAUI,R3 ;;;FORK/START OF UNSOLICITED INPUT" CALLR FORK ;;;QUEUE FORK REQUEST10$: .ENDC ;T$$IDO .IF DF T$$SPC4 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 BIT/ CALLR FORK ;;;REQUEST FORK TO KILL THIS INPUTD20$:5 TST U.TFPB(R4) ;;;CLI CONTINUATION LINE IN PROGRESS? BPL 30$ ;;;IF PL, NO...SKIPB BIS #UM.KIL,U.MUP-U.TSTA(R5) ;;;ELSE, SEND KILL PACKET ON NEXT ^C30$: .ENDC ;T$$SPC7 MOVB R2,U.TFPB(R4) ;;;ECHO A FULL CLI PROMPT FOR ^U/^RI" ADD #U.TFIB,R4 ;;;POINT TO U.TFIB MOV R1,-(SP) ;;;SAVE REGISTER1 CALL FPSUI1 ;;;SET UP UCB FOR UNSOLICITED INPUTS; 9; FILL THE INPUT BUFFER WITH THE FOLLOWING PROMPT STRING:R.; " \ XXX>";UF; WHERE " \" TAKES THE TERMINAL OUT OF HOLD-SCREEN MODE (INSERTEDF; ONLY IF TERMINAL IS IN HOLD-SCREEN MODE); AND "XXX" IS THE CLI NAME.;T ASSUME U.TIP+2,U.TIC-2P/ MOV -(R4),R1 ;;;GET START OF THE OUTPUT BUFFER 5 BIT #U2.HLD,U.CW2-U.TSTA(R5) ;;;IN HOLD-SCREEN MODE?D BEQ 40$ ;;;IF EQ, NO...SKIP: MOV (PC)+,(R1)+ ;;;INSERT \ - EXIT HOLD SCREEN MODE .BYTE CH.ESC,CH.BSL7 BIC #U2.HLD,U.CW2-U.TSTA(R5) ;;;CLEAR HOLD-SCREEN FLAG 40$:;B; 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.?; 2. ELSE, THE FIRST CR EXPANDS AS LF AND THE SECOND ONE AS CR.H?; IN THIS CASE, THE FLAG S2.FLF WILL BE SET AFTER THE SECOND #; EXPANSION AND MUST BE CLEARED.;MI; THE CARRIAGE RETURN AND LINE FEED ARE NOT OUTPUT HERE FOR ALTERNATE CLIBI; SYSTEMS SINCE THE CLI MAY NOT WANT THEM. IF IT DOES, THEN THEY MUST BEO+; PART OF THE CLI PROMPT STRING IN THE CPB.F;O .IF DF T$$SPC? TST U.TFPB-(R4) ;;;CLI CONTINUATION LINE IN PROGRESS?E2 BPL 70$ ;;;IF PL, NO...DON'T INCLUDE GRATIS CRLF .ENDC ;T$$SPC .IIF NDF A$$CLI,NOACLI=0E .IF DF T$$SPC!NOACLII( CALL EXCR1 ;;;EXPAND A CARRIAGE RETURN50$: MOVB (R3)+,(R1)+ ;;;INSERTM SOB R2,50$ ;;;LOOP CALL EXCR1 ;;;EXPAND CR AGAINE60$: MOVB (R3)+,(R1)+ ;;;INSERT  SOB R2,60$ ;;;LOOP .ENDC ;T$$SPC!NOACLI.70$:, BIC #S2.FLF,2(R5) ;;;DON'T FORCE ANOTHER LF .IF DF T$$SPC? TST U.TFPB-(R4) ;;;CLI CONTINUATION LINE IN PROGRESS?N BPL 90$ ;;;IF PL, NO...SKIPB@ MOVB ASCLC+2,(R1)+ ;;;INSERT FIRST CHAR. OF CONTINUATION PROMPT4 MOVB ASCLC+3,(R1)+ ;;;INSERT SECOND CHAR. OF PROMPT6 MOVB #2,U.TCHP-U.TSTA(R5) ;;;SET UP CURRENT HOR. POS.6 MOVB #2,U.TIHP-(R4) ;;;SET INITIAL HOR. POS. BR 170$ ;;;OUTPUT THE PROMPT .ENDC ;T$$SPC .IF DF M$$CLI3 MOV U.CLI-U.TSTA(R5),R3 ;;;GET POINTER TO CLI NAME#, ADD #4,R3 ;;;ADD IN LENGTH OF THE CLI NAME80$: MOVB (R3)+,(R1)+ ;;;INSERT( BNE 80$ ;;;LOOPT .ENDC ;M$$CLI .IF DF R$$MPL!A$$CLI 90$:: MOV U.MUP-U.TSTA(R5),R3 ;;;GET POINTER TO CLI STATUS WORD3 BIC #^C,R3 ;;;CLEAR ALL BUT CLI INDEX BITSO/ MOV $CPTBL(R3),R3 ;;;POINT TO CLI PARSER BLOCKR8 ADD #C.PDPL,R3 ;;;POINT TO DEFAULT PROMPT STRING LENGTH ASSUME C.PCPL,C.PDPL+1;6 CLR -(SP) ;;;WORD TO GET BYTE VALUE OF PROMPT LENGTH0 BISB (R3)+,(SP) ;;;GET LENGTH OF DEFAULT PROMPT ASSUME C.PRMT,C.PCPL+1I* MOVB (R3)+,R2 ;;;GET LENGTH OF CLI PROMPT+ ADD (SP)+,R3 ;;;POINT TO CLI PROMPT STRINGC TST R2 ;;;ANYTHING THERE?$2 BEQ I2RET ;;;IF EQ, NO...RETURN TO FORGET IT ALL6 MOV R1,-(SP) ;;;GET CURRENT POSITION IN OUTPUT BUFFER7 SUB (R4),(SP) ;;;GET NUMBER OF CHARACTERS IN IT SO FARR2 MOV R2,-(SP) ;;;SAVE UNEXPANDED CLI PROMPT LENGTH100$:N/ MOVB (R3)+,R2 ;;;GET A CHARACTER OF THE PROMPT;/ MOV R3,-(SP) ;;;SAVE ADDRESS OF NEXT CHARACTERR3 CALL EXPCHR ;;;GET EXPANSION OF CURRENT CHARACTERR* BNE 120$ ;;;IF NE, IT IS A STRING...SKIP- CMP 4(SP),#T$$BFL ;;;BUFFER LENGTH EXCEEDED?M! BHIS 110$ ;;;IF HIS, YES...SKIPE= MOVB R2,(R1)+ ;;;CHARACTER EXPANDS AS ITSELF - PUT IN BUFFERR0 INC 4(SP) ;;;SHOW ONE MORE CHARACTER IN BUFFER BR 150$ ;;;CHECK IF DONE110$:R ADD #6,00x$xibjbkb a a aSP ;;;CLEAN STACK2 BR 170$ ;;;ECHO WHATEVER COULD FIT IN THE BUFFER120$: 9 BCC 130$ ;;;IF CC, DON'T PRESENT CHARACTER AGAIN...SKIP;" DEC (SP) ;;;ELSE, BACKUP POINTER INC 2(SP) ;;;AND FIX COUNT130$:N' ADD R2,4(SP) ;;;SHOW NEW BUFFER LENGTHA- CMP 4(SP),#T$$BFL ;;;BUFFER LENGTH EXCEEDED?N2 BHI 110$ ;;;IF HI, YES...ECHO WHAT WE COULD COPY140$:2. MOVB (R3)+,(R1)+ ;;;PUT EXPANSION INTO BUFFER SOB R2,140$ ;;;LOOPS150$: ' MOV (SP)+,R3 ;;;RESTORE PROMPT POINTERE DEC (SP) ;;;MORE TO DO?,* BNE 100$ ;;;IF NE, YES...LOOP UNTIL DONE160$:D CMP (SP)+,(SP)+ ;;;CLEAN STACK1 .ENDC ;R$$MPL!A$$CLIE .IF NDF R$$MPL&A$$CLI&M$$CLI( MOVB #'M,(R1)+ ;;;INSERT MI MOVB #'C,(R1)+ ;;; CT MOVB #'R,(R1)+ ;;; R; MOVB #'>,(R1)+ ;;; > .ENDC ;NDF R$$MPL&A$$CLI&M$$CLI .IF NDF R$$MPL&A$$CLI6 MOVB #4,U.TCHP-U.TSTA(R5) ;;;SET UP CURRENT HOR. POS.6 MOVB #4,U.TIHP-(R4) ;;;SET INITIAL HOR. POS. .ENDC ;NDF R$$MPL&A$$CLIR170$:O5 MOV (R4),R3 ;;;GET START OF PROMPT STRING (U.TIP+2);( CMP -(R4),-(R4) ;;;RESTORE UCBX POINTER1 MOV R1,R2 ;;;COPY CURRENT PROMPT STRING POINTERL' SUB R3,R2 ;;;GET LENGTH OF THE STRINGM! MOV (SP)+,R1 ;;;RESTORE REGISTER'7 BIC #U2.HLD,U.CW2-U.TSTA(R5) ;;;CLEAR HOLD-SCREEN FLAG)ECHOS1:( CALLR ECHSTR ;;;ECHO THE PROMPT STRING.PAGER; .SBTTL . I2CT* - MISCELLANEOUS CONTROL CHARACTER HANDLINGH; $; CTRL-Q, CTRL-S, CTRL-O AND CTRL-X.A; IF ANY OF THESE CHARACTERS IS RECEIVED WHEN AN IO.RAL OR IO.RSTVB; IS ACTIVE, STORED IN THE TYPE-AHEAD BUFFER (FOR EXAMPLE, BECAUSE?; ECHO IS REQUIRED AND OUTPUT IS BUSY), THE READ TERMINATES ANDN@; THE NEXT READ IS AN IO.RLB, THEN THESE SPECIAL CHARACTERS WILL<; APPEAR HERE. WE DON'T WANT TO PASS THEM TO THE TASK, SO WE; JUST IGNORE THEM.C;1D; THE SAME IS DONE FOR CTRL-C FROM A SLAVED TERMINAL, AND FOR CTRL-R+; IN A SYSTEM THAT DOES NOT SUPPORT CTRL-R.;I2CTQ:: I2CTS::T, BIT #S1.TSY,(R5) ;IS TERMINAL SYNC ENABLED?& BEQ JI2EC ;IF NE, YES,KEEP CHARACTERI2CTX::VI2CTO::N .IF NDF T$$CTRFEDCTR::M .ENDC ;T$$CTRI2RET: RETURN ;;;IGNORES?JI2EC: JMP I2ECHO ;;;ELSE, PROCESS AS A NORMAL INPUT CHARACTERT.PAGEI, .SBTTL . EDRUB - RUBOUT CHARACTER HANDLING;T#; EDRUB - PROCESS RUBOUT CHARACTER.T;NEDRUB::C4 CALL GETPIC ;;;GET (AND REMOVE) PREVIOUS CHARACTER0 BCS I2RET ;;;IF CS, NONE THERE...IGNORE RUBOUT( BIT #S1.RNE,(R5) ;;;IS ECHO SUPPRESSED?8 BNE I2RET ;;;IF NE, YES...DON'T ECHO DELETED CHARACTER* TSTB U.TCHP-U.TSTA(R5) ;;;AT LEFT MARGIN?2 BEQ I2RET ;;;IF EQ, YES...CAN'T ECHO AROUND WRAP .IF DF T$$RUB5 BIT #U2.CRT,U.CW2-U.TSTA(R5) ;;;IS TERMINAL A SCOPE?A. BEQ 70$ ;;;IF EQ, NO...START RUBOUT SEQUENCE;BJ; ECHO THE STANDARD CRT RUBOUT SEQUENCE. HORIZONTAL TAB ECHOS AS A NUMBERI; (1-8) OF BACKSPACES. ANYTHING ELSE ECHOS AS BACKSPACE-SPACE-BACKSPACE. ;I) CMPB R2,#CH.HT ;;;RUBOUT HORIZONTAL TAB?R BEQ 10$ ;;;IF EQ, YES...SKIP( BITB #140,R2 ;;;NON-SPACING CHARACTER?4 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 STRING#= DECB U.TCHP-U.TSTA(R5) ;;;UPDATE CURRENT HORIZONTAL POSITIONI! BR ECHOS1 ;;;GO ECHO THE STRINGB; (; FIND THE PREVIOUS HORIZONTAL POSITION.;O10$:A MOVB U.TCHP-U.TSTA(R5),-(SP) ;;;SAVE CURRENT HORIZONTAL POSITIONSC MOVB U.TIHP(R4),U.TCHP-U.TSTA(R5) ;;;RESET CURRENT TO INITIAL POS.L- MOV R3,-(SP) ;;;SAVE R3 (POINTS TO THE HTAB)1 ASSUME U.TCI,0C8 MOV (R4),R3 ;;;GET CURRENT PACKET (IF SOLICITED INPUT)/ MOV I.PRM+2(R3),R3 ;;;GET START OF TASK BUFFER ;IM; NOTE - THE 2 INSTRUCTIONS ABOVE ASSUME THAT THE CURRENT INPUT IS UNBUFFEREDRK; SOLICITED INPUT. OF COURSE, "I.PRM+2(R3)" MAKES NO SENSE IF THE INPUT ISP1; UNSOLICITED, BUT NO ADDRESSING ERROR CAN OCCUR.P;T- CLR -(SP) ;;;SET UP A VERY LARGE LOOP COUNTO1 BIT #S1.IBF,(R5) ;;;ARE WE DOING BUFFERED INPUT?R. BEQ 30$ ;;;IF EQ, NO...SKIP TO EXPAND BUFFER, MOV U.TFIB(R4),R3 ;;;GET FIRST INPUT BUFFER20$:/ CMP (R3)+,(R3)+ ;;;POINT TO START OF DATA AREAV. MOV #T$$BFL-4,(SP) 00xvt__DATADATADATADATA;;;SET MAX BYTES IN BUFFER; I; THE FOLLOWING IS A LOOP THAT GOES THROUGH ALL CHARACTERS THAT HAVE BEENRE; INPUT SO FAR AND EXPANDS THEM. THE PURPOSE IS TO UPDATE THE CURRENTPB; HORIZONTAL POSITION (U.TCHP) TO THE VALUE IT HAD BEFORE THE LAST ; CHARACTER (THE TAB) WAS INPUT.;O30$:6 CMP R3,2(SP) ;;;POINTING TO THE RUBBED-OUT CHARACTER?% BEQ 50$ ;;;IF EQ, YES...WE ARE DONEF40$:3 CALL GETRIC ;;;GET THE CHARACTER POINTED TO BY R3P MOV R3,-(SP) ;;;SAVE R3% CALL EXPCHR ;;;EXPAND THE CHARACTER  MOV (SP)+,R3 ;;;RESTORE R3 : BCS 40$ ;;;IF CS, EXPAND CHARACTER AGAIN (DEFERRED ECHO) INC R3 ;;;UPDATE POINTER" DEC (SP) ;;;DECREMENT LOOP COUNT7 BNE 30$ ;;;IF NE, MORE IN THIS BUFFER...LOOP FOR MORETC MOV -T$$BFL(R3),R3 ;;;LOOP COUNT RAN OUT - THIS CAN ONLY HAPPEN...0 ;;; ...IF WE ARE DOING BUFFERED INPUT, SO...0 ;;; ...GET LINK TO NEXT BUFFER (MUST BE ONE) BR 20$ ;;;BIG LOOP; D; WE ARE BACK AT WHERE WE STARTED - U.TCHP CONTAINS NEW (BACKSPACED); HORIZONTAL POSITION.;R50$: CMP (SP)+,(SP)+ ;;;CLEAN STACKB, MOV (SP),R2 ;;;GET OLD HORIZONTAL POSITION; MOVB U.TCHP-U.TSTA(R5),(SP) ;;;GET NEW HORIZONTAL POSITIONN8 SUB (SP)+,R2 ;;;CALCULATE NUMBER OF BACKSPACES REQUIRED BGT 60$ ;;;IF GT, OUTPUT THEM 7 MOV #8.,R2 ;;;THE TAB WE WANT TO RUB OUT CAUSED AN... 1 ;;; ...AUTO CR-LF - SPACE BACK TO LEFT MARGIN.60$:1 MOV #ASBSP,R3 ;;;POINT TO STRING WITH BACKSPACESO BR ECHOS1 ;;;ECHO THE STRING .ENDC ;T$$RUB;AJ; PROCESS A RUBOUT FOR A HARDCOPY TERMINAL. THE ECHO SEQUENCE STARTS WITHJ; A BACKSLASH FOLLOWED BY EACH CHARACTER THAT IS RUBBED OUT. WHEN NO MOREM; CHARACTERS ARE TO BE RUBBED OUT, A TERMINATING BACKSLASH IS ECHOED FOLLOWED 6; BY THE CHARACTER THAT TERMINATED THE RUBOUT PROCESS.;M70$: .IF DF T$$SPL7 MOVB R2,U.TECO-U.TSTA(R5) ;;;SAVE RUBBED-OUT CHARACTERC .IFF ;T$$SPLR0 MOVB R2,U.TECB(R4) ;;;SAVE RUBBED-OUT CHARACTER .ENDC ;T$$SPL1 BIT #S3.RUB,4(R5) ;;;ALREADY IN RUBOUT SEQUENCE?R3 BNE 80$ ;;;IF NE, YES...ECHO RUBBED-OUT CHARACTERU8 BIS #S1.DEC,(R5) ;;;SET RUBOUT AND DEFERRED ECHO FLAGS BIS #S3.RUB,4(R5)- BR I2RUB2 ;;;SKIP TO ECHO A BACKSLASH FIRSTU80$:= CALLR I2EXPC ;;;EXPAND & ECHO CHAR. IN R2 & U.TECB (U.TECO)A;E); I2RUB1 - WE ARE ALREADY IN RUBOUT MODE..;DI2RUB1:* CMPB R2,#CH.RUB ;;;IS THIS ALSO A RUBOUT?4 BEQ EDRUB ;;;IF EQ, YES...CONTINUE RUBOUT SEQUENCE2 BIC #S3.RUB,4(R5) ;;;ELSE, GET OUT OF RUBOUT MODE1 BIS #S1.DPR,(R5) ;;;SET DEFERRED PROCESSING FLAG3 ;;;FALL THROUGH TO ECHO A TERMINATING BACKSLASH;SM; I2RUB2 - OUTPUT LEADING OR TRAILING BACKSLASH FOR HARDCOPY RUBOUT SEQUENCE.2;2I2RUB2: 8 MOV #ASBSL,R3 ;;;POINT TO BACKSLASH CHARACTER TO OUTPUT5 INCB U.TCHP-U.TSTA(R5) ;;;UPDATE HORIZONTAL POSITIONW3 CALLR ECHCHR ;;;ECHO 1 CHARACTER POINTED TO BY R32.PAGEB .SBTTL TTICH SUBROUTINES6 .SBTTL . SETSPD - FIND AND SET THE CALLER'S BAUD RATE;#;+@; SETSPD - DETERMINE THE INCOMING CALLER'S BAUD RATE AND SET IT.;F ; INPUTS:; R2 = CHARACTER RECEIVED"; R5 => U.TSTA OF THE TERMINAL UCB;S ; OUTPUTS:O2; R2 = IF THE LINE SPEED IS FOUND AND SET UP4; = 0 IF THE LINE SPEED COULD NOT BE DETERMINED@; THE CONTROLLER DEPENDENT ROUTINE FOR SETTING THE LINE SPEED IS2; CALLED AS EACH RANGE OF LINE SPEEDS IS CHECKED.;TA; REGISTERS MODIFIED: R3, R4 (BY CONTROLLER DEPENDENT ROUTINES) ;-;- .IF DF D$$M11!D$$ZMD!D$$VMDSETSPD:+; CLR -(SP) ;;;SET UP RETURN VALUE FOR R2 = SPEED NOT FOUNDT4 MOV R1,-(SP) ;;;SAVE REGISTERS USED BY THIS ROUTINE MOV R0,-(SP) ;;;E@ MOV U.CW4-U.TSTA(R5),R0 ;;;GET THE CURRENT SPEED AND FLAGS WORD+ BIC #^C<37>,R0 ;;;CLEAR ALL BUT SPEED BITSC? BIC #^C<377>,R2 ;;;CLEAR ALL BUT EIGHT BITS OF INPUT CHARACTERT> CMPB R2,#CH.CR ;;;IS IT A CARRIAGE RETURN (SPEED IS CORRECT)?- BEQ 60$ ;;;IF EQ, YES...EXIT AUTOBAUD STATE(B CMPB R2,# ;;;8-BIT CARRIAGE RETURN (SPEED IS CORRECT)?- BEQ 60$ ;;;IF EQ, YES...EXIT AUTOBAUD STATENC BIT #U4.CR,U.CW4-U.TSTA(R5) ;;;EXPECTING TO SEE A CARRIAGE RETURN?D6 BNE 20$ ;;;IF NE, YES...WE DIDN'T 00x$xibjbkb a a aGET 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?8 BNE 30$ ;;;IF NE, NO...SEARCH HIGH BAUD RATE TABLE NOW; MOV #S.300,R0 ;;;SEARCH THE LOW BAUD SPEED RANGE NEXT TIMER8 BR 50$ ;;;CHANGE THE SPEED AND WAIT FOR NEXT CHARACTER; K; THE PREVIOUS INPUT CHARACTER DID NOT MATCH ANYTHING IN THE HIGH BAUD RATENO; RANGE. WE HAVE A NEW CHARACTER TO CHECK AGAINST THE LOW BAUD RATE TABLE NOW. ;10$:5 MOV #ABLOW,R1 ;;;SET ADDRESS OF LOW BAUD SPEED TABLE?< CALL TBLCHK ;;;LOOK FOR A MATCH AGAINST RECEIVED CHARACTER6 BEQ 40$ ;;;IF CC, FOUND MATCH...SET SPEED FROM TABLE; 0; WE COME HERE IN EITHER OF THE FOLLOWING CASES:D; 1. AN INPUT CHARACTER COULD NOT BE MATCHED WITH THE HIGH BAUD RATEF; TABLE ENTRIES; THE LINE SPEED WAS CHANGED FOR LOW SPEED CHECKING;B; AND THE NEXT CHARACTER DID NOT MATCH THE LOW BAUD RATE TABLE.E; 2. A MATCH WAS FOUND IN EITHER THE LOW OR HIGH SPEED TABLE, AND THE0=; NEXT CHARACTER WAS EXPECTED TO BE A CARRIAGE RETURN (FORL8; VALIDATION). HOWEVER, IT WASN'T A CARRIAGE RETURN.;Q20$:1 INCB U.CW4+1-U.TSTA(R5) ;;;INCREMENT ERROR COUNT 1 CMPB U.CW4+1-U.TSTA(R5),#5 ;;;REACHED THRESHOLD?.+ BLT 70$ ;;;IF LT, NO...KEEP PRESENT SPEED 5 MOV #S.4800,R0 ;;;RESET SPEED, ERROR COUNT AND FLAGSW/ BR 50$ ;;;TRY AGAIN WITH ORIGINAL RANGE CHECKN; O; SEARCH THE HIGH BAUD RATE TABLE FOR A MATCH WITH THE CURRENT INPUT CHARACTER.R;E30$:7 MOV #ABHIGH,R1 ;;;SET ADDRESS OF HIGH BAUD SPEED TABLEE< CALL TBLCHK ;;;LOOK FOR A MATCH AGAINST RECEIVED CHARACTER1 BNE 70$ ;;;IF NE, NO MATCH...KEEP PRESENT SPEEDW;-J; 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$:/ MOVB (R1)+,R0 ;;;GET CALLER'S SPEED FROM TABLE = BIS #U4.CR,R0 ;;;VALIDATE THIS SPEED ON NEXT INPUT CHARACTER ;D6; SET THE LINE TO A NEW LINE SPEED AS SPECIFIED BY R0.;50$:9 MOV R0,U.CW4-U.TSTA(R5) ;;;SET NEW SPEED VALUE AND FLAGSE5 BR 70$ ;;;SET UP CONTROLLER AND WAIT FOR NEXT INPUTA;TI; SINCE WE JUST RECOGNIZED A REAL CARRIAGE RETURN AS THE INPUT CHARACTER,IF; WE ARE NOW AT THE CORRECT SPEED. EXIT AUTOBAUD-IN-PROGRESS MODE ANDE; SET UP TO PROCESS THE CARRIAGE RETURN WHICH WILL GIVE A CLI PROMPT.);060$:A BIC #S5.ABP,U.TST5-U.TSTA(R5) ;;;CLEAR AUTO-BAUD IN PROGRESS BIT 8 MOV #80.,U.CW4-U.TSTA(R5) ;;;RESET CORRECT BUFFER WIDTH6 MOV R2,4(SP) ;;;SAVE CARRIAGE RETURN WE JUST DETECTED;RO; CALL THE CONTROLLER DEPENDENT ROUTINE TO SET THE LINE TO THE SPECIFIED SPEED.N; 70$:+ BIC #^C<37>,R0 ;;;CLEAR ALL BUT SPEED BITSA7 BIS #4000,R0 ;;;SET AUTO-BAUD DETECT BIT FOR SET SPEEDO8 MOV #CT.PRM,R2 ;;;SET INDEX FOR CHANGING LINE PARAMETER0 CLR R1 ;;;SET FLAG FOR NOT FLOW-CONTROL CHANGE' CALL CTRD ;;;GO CHANGE THE LINE SPEEDT( MOV (SP)+,R0 ;;;RESTORE SAVED REGISTERS MOV (SP)+,R1 ;;;.: MOV (SP)+,R2 ;;;GET BACK RETURN STATUS (EITHER OR 0) RETURN ;;;ALL DONE ;JD; TBLCHK - CHECK CURRENT SPEED TABLE FOR A MATCHING INPUT CHARACTER.; TBLCHK:E7 CMPB R2,(R1)+ ;;;RECEIVED CHARACTER MATCH TABLE ENTRY?T+ BEQ 10$ ;;;IF EQ, YES...RETURN WITH ENTRYD INC R1 ;;;BUMP PAST SPEEDV TSTB (R1) ;;;END OF THE TABLE?( BNE TBLCHK ;;;IF NE, NO...KEEP LOOKING! CLZ ;;;SHOW NO MATCH WAS FOUNDT10$: RETURN ;;;DONE WITH SCANM .ENDC ;D$$M11!D$$ZMD!D$$VMD.PAGEM? .SBTTL . TMMCHK - CHECK FOR SWITCH TO TERMINAL MANAGEMENT MODE ;>C; **-TMMCHK - CHECK FOR POSSIBLE SWITCH TO TERMINAL MANAGEMENT MODEB;FM; THIS ROUTINE CHECKS THE CURRENT INPUT STATE AND THE CURRENT INPUT CHARACTERTJ; TO SEE IF A SWITCH TO TERMINAL MANAGEMENT MODE IS NECESSARY. ONE OF THE:; FOLLOWING ACTIONS IS PERFORMED (IN DECREASING PRIORITY):;T;; 1. IF TERMINAL MANAGEMENT MODE IS NOT ENABLED, JUST EXIT.AG; 2. IF WE HAVE NOT SEEN THE FIRST SWITCH CHARACTER, SEE IF THE CURRENTV@; INPUT CHARACTER IS IT. IF SO, UPDATE THE TERMINAL MANAGEMENT; STATE FLAGS AND EXIT.C; 3. IF WE HAVE ALRE00xvt__DATADATADATADATAADY SEEN THE FIRST SWITCH CHARACTER, SEE IF THEH:; CURRENT INPUT CHARACTER IS THE FINAL ONE. IF SO, CLEAR:; THE TYPE-AHEAD BUFFER AND REQUEST A FORK TO SWITCH INTO; TERMINAL MANAGEMENT MODE.C; 4. OTHERWISE, SAVE THE CURRENT INPUT CHARACTER, RECYCLE THE FIRST.>; SWITCH CHARACTER THROUGH THE INPUT LOGIC, AND EXIT. IF THE=; USER ENTERED THE FIRST SWITCH CHARACTER TWICE, ONLY ONE OFN*; THEM IS PASSED BACK TO THE INPUT LOGIC.;E ; INPUTS:; R2 = CURRENT INPUT CHARACTER."; R5 => U.TSTA OF THE TERMINAL UCB@; U.TSCA => AST CONTROL BLOCK/TSA EVENT PACKET IF TMM IS ENABLED4; S5.SW1/S5.TMM = CURRENT TERMINAL MANAGEMENT STATE;D ; OUTPUTS:RE; CC-C = 0 IF INPUT CHARACTER WAS NOT A SWITCH CHARACTER AND MUST BEE; PROCESSED UPON EXIT.C; CC-C = 1 IF INPUT CHARACTER WAS ONE OF THE SWITCH CHARACTERS ANDE ; SHOULD BE IGNORED UPON EXIT.;S; REGISTERS MODIFIED: R3, R4;-; .IF DF T$$SCATMMCHK:  .IF DF T$$SPL5 MOV 120000+U.TSCA,R4 ;;;GET SWITCH CHARACTER TEP/ACBS .IFF ;T$$SPLL/ MOV U.TUX-U.TSTA(R5),R4 ;;;GET TERMINAL'S UCBXT9 BEQ 40$ ;;;IF EQ, NO UCBX...SKIP SWITCH CHARACTER CHECKA2 MOV U.TSCA(R4),R4 ;;;GET SWITCH CHARACTER ACB/TEP .ENDC ;T$$SPL6 BEQ 40$ ;;;IF EQ, NO SWITCH CHARACTERS SET UP...SKIP@ BIT #S5.TMM,U.TST5-U.TSTA(R5) ;;;ALREADY IN TERMINAL MGMT MODE?8 BNE 40$ ;;;IF NE, YES...SKIP SWITCH CHARACTER CHECKING9 MOV A.PRM+6(R4),R3 ;;;GET USER-DEFINED SWITCH CHARACTERSFD BIT #S5.SW1,U.TST5-U.TSTA(R5) ;;;ALREADY SEEN 1ST SWITCH CHARACTER?) BEQ 10$ ;;;IF EQ, NO...CHECK FOR IT NOW41 SWAB R3 ;;;SWAP CHARACTERS TO CHECK FOR 2ND ONEB10$:1 CMPB R2,R3 ;;;DOES THIS SWITCH CHARACTER MATCH?E4 BNE 30$ ;;;IF NE, NO...NO SWITCH TO TERM MGMT MODE ASSUME S5.SW1,1 ASSUME S5.TMM,S5.SW1+1.< INC U.TST5-U.TSTA(R5) ;;;UPDATE SWITCH CHARACTER STATE BITS< BIT #S5.TMM,U.TST5-U.TSTA(R5) ;;;SEEN 2ND SWITCH CHARACTER?0 BEQ 20$ ;;;IF EQ, NO...WAIT FOR NEXT CHARACTER;H/; FORK TO PUT USER IN TERMINAL MANAGEMENT MODE.L;D/ CALL I1CTX1 ;;;GO FLUSH THE TYPE-AHEAD BUFFER # CALL I1CTQ ;;;ALSO RESTART OUTPUTA< MOV #FR.SCA,R3 ;;;REQUEST FORK FOR SWITCH TO TERM MGMT MODE CALL FORK ;;;DO IT20$:, SEC ;;;INDICATE SWITCH CHARACTER WAS SEEN RETURN ;;;ALL DONE1;N; INPUT IS NOT A SWITCH CHARACTER - SEE IF NEED TO RECYCLE PREVIOUS CHARACTER.;I30$:B BIT #S5.SW1,U.TST5-U.TSTA(R5) ;;;DID WE SEE 1ST SWITCH CHARACTER?7 BEQ 40$ ;;;IF EQ, NO...JUST PROCESS CURRENT CHARACTERU ASSUME S5.SW1,1: DEC U.TST5-U.TSTA(R5) ;;;CLEAR FLAG SAYING WE SAW 1ST ONE2 SWAB R3 ;;;SWAP TO GET 1ST SWITCH CHARACTER BACK6 CMPB R2,R3 ;;;DID USER ENTER 1ST SWITCH CHAR. TWICE?7 BEQ 40$ ;;;IF EQ, YES...JUST PASS ONE OF THEM THROUGHS' MOV R2,-(SP) ;;;SAVE CURRENT CHARACTERL6 MOV 2(SP),-(SP) ;;;DUPLICATE RETURN ADDRESS FOR LATER2 CLR R2 ;;;PREPARE FOR BYTE COPY (AND CLEAR CC-C)- BISB R3,R2 ;;;GET 1ST SWITCH CHARACTER BACKC1 CALL @(SP)+ ;;;FEED IT THROUGH INPUT PROCESSING , MOVB (SP)+,R2 ;;;GET BACK CURRENT CHARACTER40$: CLC ;;;CLEAR RETURN STATUSE8 RETURN ;;;RETURN TO FEED IT THROUGH THE INPUT PROCESS .ENDC ;T$$SCA.PAGE > .SBTTL . OOBCHK - CHECK OUT-OF-BAND MASKS FOR INPUT CHARACTER;P;+A; **-OOBCHK - DETERMINE IF CURRENT INPUT CHARACTER IS OUT-OF-BANDV;S;- ; INPUTS:; R2 = CHARACTERS"; R5 => U.TSTA OF THE TERMINAL UCB;E ; OUTPUTS:E#; CC-C = 0 IF CHARACTER IS NOT OOBT; = 1 IF CHARACTER IS OOB ;F ; REGISTERS ALTERED: R0, R3, R4;-;S;-;; .IF DF T$$OOB .ENABL LSB0OOBCHK:; CLR R4 ;;;ASSUME NOT OOB0 CMPB R2,#CH.SP ;;;IS INPUT A CONTROL CHARACTER?/ BHIS 60$ ;;;IF HIS, NO...NOT SUPPORTED AS OOB- .IF DF T$$SPL8 MOV 120000+U.TOBA,R3 ;;;GET OUT-OF-BAND ACB/TEP POINTER .IFF ;T$$SPLC, MOV U.TUX-U.TSTA(R5),R3 ;;;GET UCBX POINTER2 BEQ 60$ ;;;IF EQ, NOT ONE...CAN'T BE OOB SO SKIP5 MOV U.TOBA(R3),R3 ;;;GET OUT-OF-BAND ACB/TEP POINTERT .ENDC ;T$$SPL1 BEQ 60$ ;;;IF EQ, OUT-OF-BAND NOT SET UP...SKIP4# MOV R3,R4 ;;;COPY ACB/TEP POINTER.2 ADD #A.PRM+6,R4 ;;;POINT TO START OF OOB BITMASKS00x$xibjbkb a a a% ;;;ASSUME THIS IS AN ACB, NOT TEPH .IF DF R$$IIC ASSUME A.CBL,E.VSIZ TST A.CBL(R3) ;;;ACB OR TEP?S BEQ 5$ ;;;IF EQ, ACB .IF DF T$$SCA@ BIT #S5.TMM,U.TST5-U.TSTA(R5) ;;;IS USER IN TERMINAL MGMT MODE?. BNE 12$ ;;;IF NE, YES... DON'T DO OOB CHECKS .ENDC ;T$$SCA@ 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 BITMASKS5$:  .ENDC ;R$$IIC! MOV R2,R0 ;;;COPY THE CHARACTERO2 CMPB #16.,R0 ;;;IS CHARACTER IN FIRST MASK WORD?+ BHI 10$ ;;;IF HIS, YES...SKIP TO CHECK IT/ SUB #16.,R0 ;;;MAKE CHARACTER RELATIVE TO 16.,6 TST (R4)+ ;;;POINT TO SECOND HALF OF DOUBLEWORD MASK10$:- ASL R0 ;;;CONVERT CHARACTER FOR WORD OFFSETE5 BIT $BTMSK(R0),(R4)+ ;;;IS CHARACTER IN THE BITMASK?M BNE 60$ ;;;IF NE, OOB: 12$: CLR R4 ;;;INDICATE NOT OOB BR 60$ ;;;DONE;+?; **-OOBCK2 - DETERMINE WHETHER AN OOB CHARACTER IS INCLUDE AND.<; PROCESS OOB CHARACTER BY INSERTING IT IN OOB BUFFER.8; IF THERE'S NO ROOM IN THE BUFFER, GO DIRECTLY TO6; WARN THE USER. OTHERWISE, CHECK FOR CLEAR AND<; PERFORM ASSOCIATED FUNCTION. SET STATUS AND SET UP ; FORK FOR OOB.;L?; NOTE: THIS ROUTINE IS DESIGNED TO BE CALLED IMMEDIATELY AFTER 9; OOBCHK AND SHOULD BE CALLED ONLY IF THE CHAR. IS OOB.<; VALUES FOR R0, R3 AND R4 (INPUT TO OOBCK2) ARE ESTABLISHED:; BY CALLING OOBCHK. ALSO NOTE THAT IT IS ASSUMED THAT R07; WAS SAVED ON THE STACK PRIOR TO CALLING THIS ROUTINE.E; ; INPUTS:; R0 ESTABLISHED BY OOBCHKO; R2 = CHARACTER ; R3 ESTABLISHED BY OOBCHKE; R4 ESTABLISHED BY OOBCHKR"; R5 => U.TSTA OF THE TERMINAL UCB;S ; OUTPUTS: .; CC-C = 0 IF CHARACTER IT NOT TO BE INCLUDED*; = 1 IF CHARACTER IS TO BE INCLUDED;C ; REGISTERS ALTERED: R0, R3, R4;-; OOBCK2: - ADD #E.VHDR,R3 ;;;POINT TO OOB BUFFER HEADERE$ ;;;ASSUME THIS IS A TEP, NOT ACBC ASSUME E.VHDR,A.PRM+16 ;;;NOTE:CODE ASSUMES OOB HEADER IMMEDIATELYL' ;;;FOLLOWS OOB BIT MASKS IN THE AST  ASSUME A.CBL,E.VSIZ% TST E.VSIZ-E.VHDR(R3) ;;;ACB OR TEP?  BNE 15$ ;;;IF NE, TEPL& ADD #4,R3 ;;;POINT TO ACB OOB HEADER15$:% MOV R4,-(SP) ;;;SAVE BITMASK POINTERC+ CALL PCBUF ;;;PUT CHARACTER IN OOB BUFFERF) MOV (SP)+,R4 ;;;GET BACK BITMASK POINTERE! BCC 17$ ;;;CC -> ROOM IN BUFFERO+ TST (SP)+ ;;;ELSE, POP OFF RETURN ADDRESSR MOV (SP)+,R0 ;;;RESTORE R0I2 CALLR I1BEEP ;;;WARN USER THAT NO ROOM IN BUFFER17$:. TST (R4)+ ;;;SKIP TO NEXT BITMASK DOUBLEWORD4 BIT $BTMSK(R0),(R4)+ ;;;IS CHARACTER A "CLEAR" OOB?, BNE 20$ ;;;IF NE, NO...CHECK FOR "INCLUDE" MOV R2,-(SP) ;;;SAVE CHARACTER;+ CALL I1CTX1 ;;;CLEAR OOB MUST CLEAR TABUF # CALL I1CTQ ;;;ALSO RESTART OUTPUT ( MOV (SP)+,R2 ;;;RESTORE CHARACTER TO R2 .IF DF T$$SPL$ MOV #120000,R3 ;;;GET UCBX POINTER .IFF ;T$$SPLT, MOV U.TUX-U.TSTA(R5),R3 ;;;GET UCBX POINTER .ENDC ;T$$SPL ASSUME U.TCI,0 * TST (R3) ;;;DO WE HAVE A CURRENT PACKET? BEQ 30$ ;;;BR IF NON MOV R2,-(SP) ;;;GET CHARACTER SWAB (SP) ;;;INTO HIGH BYTE < MOVB #IS.OOB,(SP) ;;;INDICATE THAT THIS WILL TERMINATE READ MOV (SP)+,@(R3) ;;;SET STATUS5 BR 30$ ;;;SKIP SINCE "CLEAR" OOB CAN'T BE "INCLUDE"T20$:. TST (R4)+ ;;;SKIP TO NEXT BITMASK DOUBLEWORD9 BIT $BTMSK(R0),(R4) ;;;IS CHARACTER OUT-OF-BAND INCLUDE? 6 BNE 40$ ;;;IF NE, YES...SKIP TO FINISH OOB CHARACTER30$:. CLR R4 ;;;INDICATE CHARACTER IS NOT INCLUDED40$:8 MOV #FR.OOB,R3 ;;;SET REQUEST TYPE FOR OUT-OF-BAND FORK MOV R4,-(SP) ;;;SAVE R4 CALL FORK ;;;REQUEST THE FORKI MOV (SP)+,R4 ;;;V60$:. TST R4 ;;;CLEAR CARRY AND SEE IF OOB OR INCL* BEQ 70$ ;;;IF EQ, NOT OOB OR NOT INCLUDE" SEC ;;;SET CARRY IF OOB OR INCL70$: RETURN ;;;ALL DONE .DSABLE LSB .ENDC ;T$$OOB.PAGES@ .SBTTL . IPROC - SEE IF AN INPUT CHARACTER CAN BE PROCESSED NOW; ;+F; **-IPROC - DETERMINE WHETHER AN INPUT CHARACTER CAN BE PROCESSED NOW; ; INPUTS:; R2 = CHARACTER "; R5 => U.TSTA OF THE TERMINAL UCB;K ; OUTPUTS:P7; CC-C = 0 IF THE I00xvt__DATADATADATADATANPUT CHARACTER CAN BE PROCESSED NOW+1; = 1 IF CHARACTER CAN NOT BE PROCESSED NOWO;O1; CC-Z = 1 IF THE CHARACTER IS TO BE THROWN AWAY;C ; REGISTERS ALTERED: R2, R3, R4;-;T .ENABL LSBDIPROC::S2 BIT #S1.DSI,(R5) ;;;IS INPUT PROCESSING DISABLED?- BNE RETCS ;;;IF NE, YES...CAN'T PROCESS NOWD .IF DF B$$MAP$ CALL RSDPRC ;;;IO.RSD OUTSTANDING?( CLZ ;;;DON'T THROW THE CHARACTER AWAY* BCC RETCS ;;;Y - CAN'T PROCESS NOW, JUMP .ENDC ;B$$MAP? CMP R2,#CH.CTC ;;;IS CHARACTER ^C (AND NO HARD RECEIVE ERROR)?O BNE 70$ ;;;IF NE, NO...SKIPN! .SBTTL . CHARACTER IS CONTROL-C1;F; CHARACTER IS CTRL-C ;O .IF DF T$$SCA G1 BIT #S3.TME,4(R5) ;;;IS TERMINAL MANG'T ENABLED?2 BNE 70$ ;;;IF NE, YES, CTL C IS NORMAL CHARACTER .ENDC ;T$$SCA ASSUME S1.IBY,200 TSTB (R5) ;;;IS INPUT BUSY?M BMI 30$ ;;;IF MI, YES...SKIP;AJ; CHARACTER IS CONTROL-C AND INPUT IS NOT BUSY. SEE IF IT SHOULD CAUSE AN; UNSOLICITED INPUT AST.;$ .IF DF T$$CCA .IF DF T$$SPL+ TST U.ATT-U.TSTA(R5) ;;;TERMINAL ATTACHED?  BEQ 60$ ;;;BR IF NO. MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPLO4 MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX IF THERE IS ONE* BEQ 60$ ;;;IF EQ, THERE ISN'T ONE...SKIP .ENDC ;T$$SPL3 MOV U.TAST(R4),R3 ;;;GET AST BLOCK IF THERE IS ONER( 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...SKIP 10$:7 TST A.PRM+6(R3) ;;;NEED TO CHECK FOR LOCKED AST BLOCK?1 BEQ 100$ ;;;IF EQ, YES...CHECK THAT POSSIBILITYQ? BITB #AF.QUE,A.PRM+5(R3) ;;;IS ACB CURRENTLY IN THE AST QUEUE?X0 BNE RETCS ;;;IF NE, YES...CAN'T PROCESS ^C NOW+ BR 110$ ;;;OTHERWISE, SKIP TO TRIGGER AST 20$: .IFTF ;T$$CCAA BIT #S3.PTH!S3.RAL,4(R5) ;;;TERMINAL IN PASSTHRU OR BINARY MODE?N7 BNE RETCS ;;;IF NE, YES...PUT ^C IN TYPE-AHEAD BUFFERC0 BR 60$ ;;;OTHERWISE, SEE IF TERMINAL IS SLAVED;B+; CHARACTER IS CONTROL-C AND INPUT IS BUSY.M?; 1. IF DOING IO.RAL OR IO.RST, OR IF ALREADY DOING UNSOLICITEDE@; INPUT, TRY TO PROCESS IMMEDIATELY (DEPENDENT ON OUTPUT BUSY; AND ECHOING REQUIREMENT).8; 2. ELSE, IF TERMINAL IS SLAVED, DISCARD THE CHARACTER.>; 3. ELSE, IF AN AST IS NOT SPECIFIED, FORK TO ABORT SOLICITED); INPUT AND START AN UNSOLICITED INPUT.P; 4. ELSE, QUEUE AN AST;E30$:C BIT #S1.PTH!S1.RSP,(R5) ;;;DOING READ WITH SPEC. PROC.OR PASSTHRU?, 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 NOWO .ENDC ASSUME S1.USI,100000O- TST (R5) ;;;ARE WE DOING UNSOLICITED INPUT?. BPL 40$ ;;;IF PL, NO...SKIPI;R;; CHARACTER IS CONTROL-C, AND AN UNSOLICITED INPUT IS BUSY. ?; 1. IF OUTPUT IS NOT BUSY ACCEPT CTRL-C WHICH WILL RESTART THE ; UNSOLICITED INPUT.EF; 2. ELSE, CANNOT PROCESS NOW SINCE UNLIKE THE PROCESSING OF ALL OTHER@; 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?9 BEQ RETCC ;;;IF EQ, NO...^C STARTS AN UNSOLICITED INPUTURETCS:3 SEC ;;;SET INDICATION WE CAN'T PROCESS CHARACTERR RETURN ;;;ALL DONE ;U7; CHARACTER IS CONTROL-C AND A SOLICITED INPUT IS BUSY.C; 40$: .IFT ;T$$CCAR .IF DF T$$SPL. MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPLE$ MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX .ENDC ;T$$SPL3 MOV U.TAST(R4),R3 ;;;GET AST BLOCK IF THERE IS ONE - BEQ 60$ ;;;IF EQ, ASTS NOT SPECIFIED...SKIP1, BITB #TF.XCC,A.PRM+5(R3) ;;;PASS ^C TO AST? BNE 60$ ;;;IF NE, NO...SKIPI6 BITB #AF.QUE,A.PRM+5(R3) ;;;IS AN AST ALREADY QUEUED?- BEQ 10$ ;;;IF EQ, NO...ASTS MAY BE POSSIBLE  .ENDC ;T$$CCA50$:7 TST (SP)+ ;;;POP RETURN ADDRESS TO TOSS THE CHARACTER+ RETURN ;;;RETURN BACK TO CALLER'S CALLERR60$: ASSUME U2.SLV,2004 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$$CTC < BIT #S3.CTC,4(R5) ;;;DOES00x$xibjbkb a a a THIS TERMINAL EXPECT NOTIFICATION8 BEQ 130$ ;;;IF EQ, NO..CONTINUE WITH NORMAL PROCESSING> MOV U.MUP-U.TSTA(R5),R3 ;;;GET THIS CLI OFFSET INTO CPB TABLE1 BIC #^CUM.CLI,R3 ;;;ELIMINATE ALL BUT THE OFFSETN4 MOV $CPTBL(R3),R3 ;;;POINT TO CPB FOR THIS TERMINALE BIT #CP.CTC,C.PSTS(R3) ;;;DOES THIS CLI ACCEPT NOTIFICATION PACKET?09 BEQ 130$ ;;;IF EQ, NO...CONTINUE WITH NORMAL PROCESSING 4 MOV #FR.KIL,R3 ;;;FORK TO QUEUE NOTIFICATION PACKET8 CALL FORK ;;;QUEUE FORK REQUEST - THIS CODE ASSUMES..., ;;; ...THAT FPKIL IS ENTERED WITH BIT..." ;;; ...UM.KIL CLEARED IN U.MUP1 CALL GCTAB ;;;CHECK FOR ^C IN TYPE-AHEAD BUFFERH" BCS 50$ ;;;IF CS BUFFER IS CLEAR* CMPB R2,#CH.CTC ;;;MAKE SURE IT IS THE ^C3 BNE 50$ ;;;IF NE, IT ISN'T...IGNORE THE CHARACTERL7 CALL RCTAB ;;;REMOVE CHARACTER FROM TYPE-AHEAD BUFFERC. BR 50$ ;;;RETURN FOR NEXT FORK QUEUE ROUTINE .IFF ;A$$CLI&C$$CTC BR 130$ ;;;N - JUMPR .ENDC ;A$$CLI&C$$CTCA.PAGEL% .SBTTL . CHARACTER IS NOT CONTROL-CD;S; CHARACTER IS NOT CONTROL-C;S70$: ASSUME S1.IBY,200 TSTB (R5) ;;;IS INPUT BUSY? BPL 90$ ;;;IF PL, NO...SKIP ;E/; CHARACTER IS NOT CONTROL-C AND INPUT IS BUSY:R3; 1. IF ECHO IS REQUIRED AND OUTPUT IS BUSY, RETURN$8; WITH CC-C = 1 (CHARACTER CAN NOT BE PROCESSED NOW).=; 2. IF OUTPUT IS BUSY WITH THE PROMPT OF A READ WITH PROMPT,N9; THE READ HAS NOT STARTED YET SO RETURN WITH CC-C = 1 ); (CHARACTER CANNOT BE PROCESSED NOW).A@; 3. ELSE, RETURN WITH CC-C =0 (CHARACTER CAN BE PROCESSED NOW).;S80$:! BIT #S1.OBY,(R5) ;;;OUTPUT BUSY?2, 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 NOWR .ENDC ;T$$RPRRETCC: CLC ;;;CLEAR CARRY  RETURN ;;;RETURN ;H3; CHARACTER IS NOT CONTROL-C AND INPUT IS NOT BUSY:AF; 1. IF UNSOLICITED INPUT ASTS ARE SET UP, REQUEST A FORK TO GIVE ONE.E; NOTE A SPECIAL CASE - IF THE AST BLOCK IS "LOCKED", DO NOT FORK.OF; THE AST BLOCK IS LOCKED WHEN IT IS STILL IN THE TASK'S AST QUEUE,E; OR WHEN TF.NOT WAS SPECIFIED AT ATTACH AND THE TASK HAS NOT DONET.; A READ SINCE THE PREVIOUS AST WAS QUEUED./; 2. ELSE, IF THE TERMINAL IS ATTACHED, RETURN...; 3. ELSE, FORK TO START AN UNSOLICITED INPUT.;TF; IN ALL OF THE ABOVE CASES, RETURN WITH CC-C = 1 TO INDICATE THAT THE-; CHARACTER CAN NOT BE PROCESSED IMMEDIATELY.R;E90$:2 TST U.ATT-U.TSTA(R5) ;;;IS THE TERMINAL ATTACHED? .IF DF T$$CCA BEQ 120$ ;;;IF EQ, NO...SKIP .IF DF T$$SPL. MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPLC: MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX (TERMINAL IS ATTACHED ;;;SO THERE MUST BE ONE) .ENDC ;T$$SPL+ MOV U.TAST(R4),R3 ;;;GET AST BLOCK ADDRESSS* BEQ RETCS ;;;IF EQ, NONE...NO AST SET UP3 TST A.PRM+10(R3) ;;;ASTS WANTED FOR OTHER THAN ^C?T! BEQ RETCS ;;;IF EQ, NO...RETURNS100$:D< BITB #AF.LCK!AF.QUE,A.PRM+5(R3) ;;;IS ACB LOCKED OR QUEUED?0 BNE RETCS ;;;IF NE, YES...CAN'T REQUEST IT NOW110$:K .IF DF T$$REDA BIT #S5.BCC!S5.DAO!S5.VER,R2 ;;;WAS HARD RECEIVE ERROR DETECTED?C. BNE 50$ ;;;IF NE, YES...THROW AWAY CHARACTER .ENDC ;T$$RED; MOV #FR.AST,R3 ;;;SET UP TO FORK FOR UNSOLICITED INPUT AST( BR 140$ ;;;SKIPL .IFF ;T$$CCAQ: BNE RETCS ;;;IF NE, TERMINAL IS ATTACHED...CAN'T PROCESS .ENDC ;T$$CCA120$:C4 TSTB U.CW2-U.TSTA(R5) ;;;IS THIS A SLAVED TERMINAL?* BPL 125$ ;;;DO NOT DISCARD THE CHARACTER= BIT #4,$TTPRM ;;;CHECK IF WE USE TYPEAHEAD BUFFER FOR SLAVED1 ;;;TERMINALS% BEQ 50$ ;;;THROW THE CHARACTER AWAY;0 BR RETCS ;;;MOVE CHARACTER IN TYPEAHEAD BUFFER125$: ;;;REFERENCE LABELT .IF DF T$$SER= BIT #UM.CMD,U.MUP-U.TSTA(R5) ;;;COMMAND ALREADY IN PROGRESS?- BNE RETCS ;;;IF NE, YES...CAN'T PROCESS NOWT .ENDC ;T$$SER .IF DF T$$IDO0 TST $MCRPT ;;;IS THE MCR DISPATCHER INSTALLED?0 BEQ RETCS ;;;IF EQ, YES...CAN'T PROCESS IT NOW .ENDC ;T$$I00xvt__DATADATADATADATADO130$:E .IF DF T$$MOD0 BITB #US.DSB,U.STS-U.TSTA(R5) ;;;LINE DISABLED?7 BNE 50$ ;;;IF NE, YES...DON'T START UNSOLICITED INPUTA .ENDC ;T$$MOD5 MOV #FR.SUI,R3 ;;;FORK TO START AN UNSOLICITED INPUTC140$:T% CALL FORK ;;;QUEUE THE FORK REQUESTM8 BR RETCS ;;;RETURN TO INDICATE WE CAN'T PROCESS IT NOW .DSABL LSB..PAGE 4 .SBTTL . PCTAB - PUT CHARACTER IN TYPE-AHEAD BUFFER;$;+8; **-PCTAB - PUT A CHARACTER INTO THE TYPE-AHEAD BUFFER.; F; THIS ROUTINE PLACES A CHARACTER INTO A TERMINAL'S TYPE-AHEAD BUFFER.; ; INPUTS:; R2 = CHARACTER;"; R5 => U.TSTA OF THE TERMINAL UCB;E ; OUTPUTS:R6; CC-C = 0 IF CHARACTER SUCCESSFULLY STORED IN BUFFER:; = 1 IF CHARACTER WAS NOT STORED DUE TO FULL BUFFER;;; REGISTERS MODIFIED: R3, R4;-;; .ENABL LSBIPCTAB: .IF DF T$$SPL+ MOV #120000+U.TTBF,R3 ;;;SET TABUF POINTERU .IFF ;T$$SPLP. MOV U.TTAB-U.TSTA(R5),R3 ;;;GET TABUF POINTER& BNE 10$ ;;;IF NE...THERE IS A BUFFERA MOVB R2,U.TTAB+1-U.TSTA(R5) ;;;STORE CHAR. IN SINGLE-CHAR. TABUF7 INCB U.TTAB-U.TSTA(R5) ;;;MARK THE TABUF AS BEING FULL  CLC ;;;SHOW SUCCESS STATUS RETURN ;;;ALL DONER10$:1 BIT #1,R3 ;;;IS THIS A SINGLE CHARACTER BUFFER?W5 SEC ;;;ASSUME IT IS (AND IN USE) SO SET ERROR FLAGF- BNE 20$ ;;;IF NE, IT IS...RETURN WITH ERROR. .ENDC ;T$$SPL' CALL PCBUF ;;;PUT CHARACTER IN BUFFER" BCS 20$ ;;;IF CS, BUFFER IS FULL/ CALL SNDXOF ;;;SEE IF WE NEED TO SEND AN XOFFE( CLC ;;;RETURN WITH SUCCESS INDICATION RETURN ;;;ALL DONE .PAGEH; .SBTTL . PCBUF - PUT CHARACTER INTO STANDARD FORMAT BUFFERG;L;+:; **-PCBUF - PUT A CHARACTER INTO A STANDARD FORMAT BUFFER;BE; THIS ROUTINE PLACES A CHARACTER INTO A BUFFER FORMATTED AS FOLLOWS:S;N#; +---------------+---------------+$#; | RETRIEVAL PTR | STORE PTR |.#; +---------------+---------------+;#; | BUFFER SIZE | CHARACTER CNT |;#; +---------------+---------------+ #; | CHARACTER BUFFER |C#; \ \N#; +-------------------------------+;B ; INPUTS:; R2 = CHARACTERO%; R3 => TOP OF STANDARD FORMAT BUFFERP;F ; OUTPUTS:A6; CC-C = 0 IF CHARACTER SUCCESSFULLY STORED IN BUFFER:; = 1 IF CHARACTER WAS NOT STORED DUE TO FULL BUFFER;-; REGISTERS MODIFIED: R4;-; PCBUF:% CLR R4 ;;;PREPARE FOR BYTE TRANSFER-9 BISB (R3)+,R4 ;;;GET OFFSET WHERE TO STORE THE CHARACTER ' INC R3 ;;;SKIP OVER RETRIEVAL POINTER7 CMPB (R3)+,(R3)+ ;;;IS THE BUFFER FULL (COUNT = SIZE)? ' SEC ;;;ASSUME YES AND SET ERROR FLAG-- BEQ 20$ ;;;IF EQ, YES...RETURN ERROR STATUSO7 ADD R3,R4 ;;;SET POINTER IN BUFFER TO STORE CHARACTERA! MOVB R2,(R4) ;;;STORE CHARACTERU" INC -(R3) ;;;COUNT THE CHARACTER# INC -(R3) ;;;UPDATE STORE POINTER = CMPB 3(R3),(R3) ;;;TIME TO WRAP (STORE = SIZE)? (CLEAR CC-C) ! BNE 20$ ;;;IF NE, NO...ALL DONES3 CLRB (R3) ;;;ELSE, SET POINTER AT START OF BUFFER 20$: RETURN ;;;ALL DONEE .DSABL LSBC.PAGE,< .SBTTL . GCTAB - GET A CHARACTER FROM THE TYPE-AHEAD BUFFER;S;+5; GCTAB - GET A CHARACTER FROM THE TYPE-AHEAD BUFFER.R;A ; INPUTS:"; R5 => U.TSTA OF THE TERMINAL UCB; ; OUTPUTS:M5; CC-C = 0 IF CHARACTER WAS OBTAINED FROM THE BUFFERT#; = 1 IF THE BUFFER WAS EMPTYTD; R2 = CHARACTER RETRIEVED FROM THE BUFFER (NOTE THAT THE CHARACTER#; IS NOT REMOVED FROM THE BUFFER!)DF; IF THERE IS ANY UNPROCESSED DEFAULT INPUT, RETURN THE NEXT CHARACTERD; OF IT IN R2 AND WITH CC-C = 0 BEFORE CHECKING THE TYPEAHEAD BUFFER;C!; REGISTERS ALTERED: R2, R3, R4;-;C .PSECT MAP5GCTAB::T .IF DF T$$EIO ASSUME S6.RDI,10000054 TST U.TST6-U.TSTA(R5) ;;;LOOKING FOR DEFAULT INPUT? BPL 3$ ;;;N - JUMP .IF DF T$$SPL. MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPLE$ MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX .IFTF ;T$$SPL8 CLR R2 ;;;PREVENT FUTURE SIGN EXTENSION AND CLEAR CC-C. BIT #S1.IBF,@R5 ;;;IS DEFAULT INPUT BUFFERED? BNE 1$ ;;;Y - JUMP .IFT ;T$$SPLN9 MOV U.TDIP(R4),KISAR6 ;;;MAP USER'S DEFAULT INPUT BUFFER1 BIS00x$xibjbkb a a aB @U.TDIP+2(R4),R2 ;;;GET A CHARACTER FROM ITE .IFF ;T$$SPLR5 MOV U.TDIP+2(R4),R3 ;;;GET POINTER TO NEXT CHARACTERL< 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 DRIVER7 RETURN ;;;RETURN WITH CHARACTER IN R2 AND CC-C CLEAR F1$: BISB @U.TDIP+2(R4),R2 ;;;GET A CHARACTER FROM DEFAULT INPUT BUFFER7 RETURN ;;;RETURN WITH CHARACTER IN R2 AND CC-C CLEAR4 .ENDC ;T$$EIO3$: ;;;REFERENCE LABELB .IF DF T$$SPL; MOV #120000+U.TTBF+1,R2 ;;;POINT TO TABUF RETRIEVE POINTER+% CLR R3 ;;;PREPARE FOR BYTE TRANSFERE> BISB (R2)+,R3 ;;;GET RETRIEVE POINTER & POINT TO ACTIVE COUNT .IFF ;T$$SPL;. MOV R5,R3 ;;;POINT TO CELL CONTAINING THE...E ADD #U.TTAB-U.TSTA,R3 ;;; ...ADDRESS OF THE TABUF (ALSO CLEARS CC-C)-" MOV (R3),R2 ;;;GET TABUF POINTER5 BEQ 5$ ;;;IF EQ, NOT ONE...INDICATE BUFFER IS EMPTY 5 BITB #1,(R3)+ ;;;IS THIS THE SINGLE CHARACTER TABUF?C BNE 10$ ;;;IF NE, YES...SKIP% INC R2 ;;;POINT TO RETRIEVE POINTER0> MOVB (R2)+,R3 ;;;GET RETRIEVE POINTER & POINT TO ACTIVE COUNT .IFTF ;T$$SPL# TSTB (R2)+ ;;;IS THE TABUF EMPTY?P3 BNE 7$ ;;;IF EQ, YES...RETURN WITH THAT INDICATEDM 5$: JMP RETCSI7$: % ADD R2,R3 ;;;MAKE POINTER IN BUFFERT/ INC R3 ;;;POINT TO NEXT CHARACTER TO RETRIEVEC .IF DF T$$RED* CMPB -(R2),#1 ;;;LAST CHARACTER IN TABUF? BNE 10$ ;;;IF NE, NO...SKIP 9 MOV U.TST5-U.TSTA(R5),R2 ;;;GET HARD RECEIVE ERROR FLAGSB: BIC #^C,R2 ;;;CLEAR IRRELEVANT BITS8 BR 20$ ;;;RETURN WITH FLAGS AND CC-C CLEAR (FROM CMPB) .ENDC ;T$$RED10$: CLR R2 ;;;CLEAR R2 AND CC-CE20$:+ BISB (R3),R2 ;;;PUT CHARACTER IN LOW BYTEH" RETURN ;;;RETURN WITH CHARACTER.PAGE,? .SBTTL . RCTAB - REMOVE A CHARACTER FROM THE TYPE-AHEAD BUFFERE;O;+8; RCTAB - REMOVE A CHARACTER FROM THE TYPE-AHEAD BUFFER.:; MUST BE CALLED ONLY IF THERE IS A CHARACTER TO REMOVE!!!G; IF THERE IS UNPROCESSED DEFAULT INPUT, DECREMENT CHARACTER COUNT LEFTE;R ; INPUTS:"; R5 => U.TSTA OF THE TERMINAL UCB; ; OUTPUTS: NONER;R; REGISTERS ALTERED: R3, R40;-;R .PSECT MAP5.6RCTAB:: .IF DF T$$EIO ASSUME S6.RDI,100000W4 TST U.TST6-U.TSTA(R5) ;;;LOOKING FOR DEFAULT INPUT? BPL 3$ ;;;N - JUMP: INC U.TDIP+2(R4) ;;;POINT TO NEXT DEFAULT INPUT CHARACTER9 DEC U.TDIC(R4) ;;;ONE LESS DEFAULT INPUT CHARACTER TO GO  BEQ 1$ ;;;BRANCH IF ALL DONE: BIT #S1.IBF,@R5 ;;;ARE DEFAULT INPUT CHARACTERS BUFFERED? BEQ 2$ ;;;N - RETURN7 DEC U.TDIP(R4) ;;;REDUCE COUNT OF CHARACTERS IN BUFFERB* BNE 2$ ;;;BUFFER IS NOT YET EMPTY - JUMPD MOV #T$$BFL-4,U.TDIP(R4) ;;;BUFFER IS EMPTY - RESET CHARACTER COUNTD MOV U.TDIP+2(R4),R3 ;;;GET POINTER ONE CHARACTER PAST END OF BUFFER. SUB #T$$BFL,R3 ;;;BACK UP TO BUFFER LINK WORD. MOV @R3,U.TDIP+2(R4);;;SET NEW CURRENT BUFFER: ADD #4,U.TDIP+2(R4) ;;;POINT TO FIRST CHARACTER WITHIN IT RETURN;D1$: BIC #S6.RDI,U.TST6-U.TSTA(R5);;;NO MORE DEFAULT INPUT TO PROCESS 2$: RETURN .ENDC ;T$$EIO3$: ;;;REFERENCE LABELC .IFT ;T$$SPLT; MOV #120000+U.TTBF+1,R3 ;;;POINT TO TABUF RETRIEVE POINTERV .IFF ;T$$SPL(/ MOV U.TTAB-U.TSTA(R5),R3 ;;;GET START OF TABUFV2 BIT #1,R3 ;;;IS THIS THE SINGLE CHARACTER TABUF? BNE 20$ ;;;IF NE, YES...SKIP% INC R3 ;;;POINT TO RETRIEVE POINTERU .ENDC ;T$$SPL& INCB (R3) ;;;UPDATE RETRIEVE POINTER( CMPB (R3)+,1(R3) ;;;DID WE WRAP AROUND? BNE 10$ ;;;IF NE, NO...SKIPT7 CLRB -1(R3) ;;;ELSE, RESET POINTER TO START OF BUFFER10$:% CALL SNDXON ;;;POSSIBLY SEND AN XON0 DECB (R3) ;;;UPDATE COUNT OF BYTES LEFT TO GET .IF DF T$$RED1 BEQ 30$ ;;;IF EQ, LAST CHARACTER REMOVED...SKIPR .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$$REDI30$:A BIC #S5.BCC!S5.DAO!S5.VER,U.TST5-U.TSTA(R5) ;;;CLEAR ERROR FLAGSN .ENDC ;T$$RED RETURN ;;;ALL DONE1.PAGE;@ .SBTTL . SNDXOF - SEND XOFF IF TYPE-AHEAD BUFFER IS NEARLY FULL;I00xvt__DATADATADATADATA;+?; SNDXOF - SEND XOFF IF HOSTSYNC ENABLED AND TABUF NEARLY FULL.;F ; INPUTS: ; R3 => TOP OF TYPE-AHEAD BUFFER"; R5 => U.TSTA OF THE TERMINAL UCB;; OUTPUTS: NONEN;; REGISTERS ALTERED: R4;-;T .ENABL LSB)SNDXOF:N3 BIT #S4.HSY,6(R5) ;;;HOST SYNCHRONIZATION ENABLED?$ BEQ 20$ ;;;IF EQ, NO...JUST RETURN .IF DF T$$SPL; MOVB U.TBSZ-U.TSTA(R5),R4 ;;;GET SIZE OF TYPE-AHEAD BUFFER < SUB #XHIPNT,R4 ;;;COMPUTE CHAR. COUNT AT WHICH TO SEND XOFF8 CMPB 2(R3),R4 ;;;DID WE REACH THE HIGH THRESHOLD POINT? .IFF ;T$$SPLA= CMPB 2(R3),#XHIPNT ;;;DID WE REACH THE HIGH THRESHOLD POINT?  .ENDC ;T$$SPL( BNE 20$ ;;;IF NE, NO...DON'T SEND XOFFD BIS #S5.OXF!S5.XOF,U.TST5-U.TSTA(R5) ;;;REQUEST XOFF OUTPUT & STATE BR 10$ ;;;JOIN COMMON CODE@ .SBTTL . SNDXON - SEND XON IF TYPE-AHEAD BUFFER IS NEARLY EMPTY;D;+C; SNDXON - SEND XON IF XOFF PREVIOUSLY SENT AND TABUF NEARLY EMPTY.;B ; INPUTS:8; R3 => TABUF ACTIVE BYTE COUNT BEFORE BEING DECREMENTED"; R5 => U.TSTA OF THE TERMINAL UCB; ; OUTPUTS: NONE$;A; REGISTERS ALTERED: R4D;-;ESNDXON:I< BIT #S5.OXF,U.TST5-U.TSTA(R5) ;;;PREVIOUSLY OUTPUT AN XOFF?! BEQ 20$ ;;;IF EQ, NO...ALL DONES= CMPB (R3),#XLOPNT+1 ;;;DID WE REACH THE LOW THRESHOLD POINT? + BHI 20$ ;;;IF HI, NO...DON'T SENT XON YETN3 BIC #S5.OXF,U.TST5-U.TSTA(R5) ;;;RESET XOFF STATUS 4 BIS #S5.XON,U.TST5-U.TSTA(R5) ;;;SET XON STATUS BIT10$:9 MOV R2,-(SP) ;;;SAVE REGISTERS DESTROYED BY CTRD ROUTINEO MOV R3,-(SP) ;;;D) MOV R4,-(SP) ;;;DESTROYED BY PORT DRIVER  ASSUME CT.STA,0( CLR R2 ;;;SET INDEX FOR "START OUTPUT"0 CALL CTRD ;;;CALL CONTROLLER DEPENDENT ROUTINE MOV (SP)+,R4 ;;;( MOV (SP)+,R3 ;;;RESTORE SAVED REGISTERS MOV (SP)+,R2 ;;;I20$: RETURN ;;;ALL DONEP .DSABL LSB$.PAGEI4 .SBTTL . ABOX/ABOXL - ABORT CURRENT TERMINAL OUTPUT;);+F; ABOXL - LOCK OUT INTERRUPTS AND CALL CONTROLLER-DEPENDENT ROUTINE TO; ABORT THE CURRENT OUTPUT. ;-;R .PSECT MAP5ABOXL::T! CALL LOCKI ;LOCK OUT INTERRUPTS(ABOX:D/ MOV #CT.ABO,R2 ;;;SET INDEX FOR "ABORT OUTPUT"R ;;;FALL THRU TO "CTRD"2 .SBTTL . CTRD - CALL CONTROLLER DEPENDENT ROUTINE;;++; CTRD - CALL CONTROLLER DEPENDENT ROUTINE.D;G ; INPUTS:; R2 = ROUTINE INDEX:; 0 - START OUTPUT; 2 - ABORT OUTPUTG; 4 - RESUME OUTPUT; 6 - STOP OUTPUT; 10 - POWER-UP (RSX-11M); 12 - MODEM TIMER (RSX-11M)A); 14 - GET/SET LINE PARAMETERS (RSX-11M) "; 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)T"; 22 - UNIT ONLINE (RSX-11M-PLUS)#; 24 - UNIT OFFLINE (RSX-11M-PLUS)I.; 26 - GET/SET LINE PARAMETERS (RSX-11M-PLUS); R5 => U.TSTA OF TERMINAL UCB;T ; OUTPUTS:R2; THE CONTROLLER DEPENDENT ROUTINE IS CALLED WITH:A; R2 = PHYSICAL UNIT NUMBER * 2 (ONLY IF MULTIPLEXERS IN SYSTEM)M-; R3 => CSR ADDRESS FOR TERMINAL'S CONTROLLERP; R4 => UCBX FOR THE TERMINALU$; R5 => U.TSTA OF THE TERMINAL'S UCB;R!; REGISTERS ALTERED: R2, R3, R4L;-;XCTRD:: .IF DF R$$MPL0 MOV U.SCB-U.TSTA(R5),R3 ;;;GET SCB FOR THIS UCB MOV S.KRB(R3),R3 ;;;GET KRB) MOVB K.PRM(R3),R4 ;;;GET CONTROLLER TYPEP? ADD CTBL(R4),R2 ;;;POINT TO DISPATCH TABLE FOR CONTROLLER TYPEO MOV (R3),R3 ;;;GET CSR .IFF ;R$$MPLE1 MOVB U.CTYP-U.TSTA(R5),R4 ;;;GET CONTROLLER TYPEN? ADD CTBL(R4),R2 ;;;POINT TO DISPATCH TABLE FOR CONTROLLER TYPES# MOV U.SCB-U.TSTA(R5),R3 ;;;GET SCBR MOV S.CSR(R3),R3 ;;;GET CSR .ENDC ;R$$MPL .IF DF T$$SPL. MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPLU6 MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX (IF THERE IS ONE) .ENDC ;T$$SPL .IF DF T$$MUX' MOV (R2),-(SP) ;;;PUSH ROUTINE ADDRESS 6 MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET PHYSICAL UNIT NUMBER ASL R2 ;;;MULTIPLY BY 2) CALLR @(SP)+ ;;;CALL ROUTINE AND RETURNL .IFF ;T$$MUXB) CALLR @(R2)+ ;;;CALL ROUTINE AND RETURNO .ENDC ;T$$MUX.PAGET; .SBTTL . GETPIC - GET PREVIOUS CHARACTER FROM INPUT00x$xibjbkb a a a BUFFER;;M;+3; GETPIC - GET PREVIOUS CHARACTER FROM INPUT BUFFERD;S ; INPUTS:; R4 => UCBX FOR THE TERMINALT"; R5 => U.TSTA OF THE TERMINAL UCB;) ; OUTPUTS:$+; CC-C = 0 IF THERE IS A PREVIOUS CHARACTERP#; = 1 IF THERE IS NO CHARACTERT; R2 = CHARACTERH%; R3 => CHARACTER IN THE INPUT BUFFERY/; U.TIP, U.TIP+2, U.TIC AND U.TTIC "DOWN-DATED"L3; (CHARACTER LOGICALLY REMOVED FROM INPUT BUFFER)A;R; REGISTERS ALTERED: R2, R3G;-;BGETPIC:C" MOV R4,-(SP) ;;;SAVE UCBX POINTER ASSUME U.TCI,08 MOV (R4)+,R3 ;;;GET CURRENT PACKET (IF SOLICITED INPUT) ASSUME U.TIP,U.TCI+2X7 MOV (R4)+,R2 ;;;GET CURRENT BUFFER (IF BUFFERED INPUT))* ADD #4,R2 ;;;POINT AT START OF DATA AREA* BIT #S1.IBF,(R5) ;;;DOING BUFFERED INPUT? BNE 10$ ;;;IF NE, YES...SKIP7 MOV I.PRM+2(R3),R2 ;;;GET START ADDRESS OF TASK BUFFER 10$:8 MOV (R4),R3 ;;;GET CURRENT CHARACTER POINTER (U.TIP+2)5 CMP R3,R2 ;;;POINTING AT START OF (CURRENT) BUFFER?G+ BHI 50$ ;;;IF HI, NO...ALL IS OK, SO SKIPC* BIT #S1.IBF,(R5) ;;;DOING BUFFERED INPUT?7 BEQ 30$ ;;;IF EQ, NO...RETURN WITH INPUT BUFFER EMPTY,6 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 ERRORE? CLR U.TIC-U.TIP(R4) ;;;CLEAR U.TIC (SWITCHING BACK TO PREVIOUSG& ;;;BUFFER, WHICH IS FULL JUST NOW), ADD -(R2),U.TTIC-U.TIP(R4) ;;;UPDATE U.TTIC;.I; SCAN LIST OF INPUT BUFFERS UNTIL THE BUFFER PREVIOUS TO THE ONE POINTED;; TO BY R2 IS FOUND.;O20$:) CMP (R3),(R4) ;;;POINTING TO OUR BUFFER?? BEQ 40$ ;;;IF EQ, YES...SKIP- MOV (R3),R3 ;;;ELSE GET POINTER TO NEXT ONE2 BR 20$ ;;;LOOP; 6; NO CHARACTERS ARE IN THE BUFFER - EXIT WITH CC-C = 1;30$:% MOV (SP)+,R4 ;;;RESTORE UCBX POINTERC SEC ;;;RETURN WITH CC-C = 1 RETURN ;;;ALL DONEE;U); PREVIOUS BUFFER FOUND - R3 POINTS TO IT;D40$:- MOV R3,(R4)+ ;;;MAKE THIS THE CURRENT BUFFERL8 ADD #T$$BFL,R3 ;;;POINT JUST AFTER LAST CHAR. IN BUFFER;ND; WE NOW HAVE R3 POINTING JUST AFTER THE LAST CHARACTER IN THE INPUTE; BUFFER. THE UCBX IS UPDATED IF WE HAD TO GO TO THE PREVIOUS BUFFER.O;E50$:! DEC R3 ;;;STEP BACK 1 CHARACTERO MOV R3,(R4)+ ;;;UPDATE U.TIP+2X INC (R4) ;;;UPDATE U.TIC% MOV (SP)+,R4 ;;;RESTORE UCBX POINTER ;;;FALL THRU TO "GETRIC".PAGER/ .SBTTL . GETRIC - GET A RANDOM INPUT CHARACTER3;I;+'; GETRIC - GET A RANDOM INPUT CHARACTERH;T ; INPUTS:!; R3 => CHARACTER TO BE RETRIEVEDS; R4 => UCBX FOR THE TERMINALN; ; OUTPUTS:3; R2 = CHARACTERR ; CC-C = 0;C; REGISTERS ALTERED: R2 ;-;XGETRIC:E CALL MAPIB ;;;MAP INPUT BUFFER7 CLR R2 ;;;PREPARE TO RECEIVE CHARACTER AND CLEAR CC-CM< BISB (R3),R2 ;;;GET CHARACTER WITHOUT SIGN EXTEND PROBLEMS RETURN ;;;RETURN TO CALLERN.PAGE 5 .SBTTL . PUTNIC - PUT NEXT INPUT CHARACTER IN BUFFERG;A;+-; PUTNIC - PUT NEXT INPUT CHARACTER IN BUFFERR;O ; INPUTS:; R2 = CHARACTER TO BE STORED; R4 => UCBX FOR THE TERMINAL4"; R5 => U.TSTA OF THE TERMINAL UCB;U ; OUTPUTS: #; CHARACTER STORED IN INPUT BUFFER.E; U.TIP+2 AND U.TIC UPDATED.;E; REGISTERS ALTERED: R3 ;-;PUTNIC:;, MOV U.TIP+2(R4),R3 ;;;GET CHARACTER POINTER$ CALL MAPIB ;;;MAP THE INPUT BUFFER% MOVB R2,(R3) ;;;STORE THE CHARACTERR CALL @(SP)+ ;;;RESTORE MAPPING, INC U.TIP+2(R4) ;;;UPDATE CHARACTER POINTER( DEC U.TIC(R4) ;;;UPDATE CHARACTER COUNT RETURN ;;;ALL DONEI.PAGE& .SBTTL . MAPD - MAP DRIVER DATA SPACE;X;+; MAPD - MAP DRIVER DATA SPACE;-;E .IF DF T$$COMMAPD:: .IF NDF T$$SPLD- MOV #0,KDSAR5 ;;;MAP TTCOM IN D-SPACE APR 53PAR5S==.-4 ;;;FILLED IN AT VIRGIN INITIALIZATIONV .ENDC ;NDF T$$SPL' MOV #0,KINAR6 ;;;MAP TOP 4K OF DRIVER 3PAR6I==.-4 ;;;FILLED IN AT VIRGIN INITIALIZATION BR RESM ;;; .ENDC ;T$$COM" .SBTTL . MAPIB - MAP INPUT BUFFER;T;+; MAPIB - MAP INPUT BUFFER;T ; INPUTS:; R4 => UCBX FOR THE TERMINAL.!; R5 = U.TSTA OF THE TERMINAL UCBE;X ; OUTPUTS:-; INPUT BUFFER MAPPED IN KISAR64; CALLER CALLED BACK AS A COROUTINE - WI00xxt__DATADATADATADATATH CC-C = 0.9; "RETURN" LEADS BACK TO THIS ROUTINE WHICH THEN RESTORESF<; KISAR6 AND RETURNS TO CALLER'S CALLER WITH CC-C PRESERVED.;#M; NOTE - WHEN THE CALLER IS CALLED AS COROUTINE, THE UCBX MAY NOT BE MAPPED!L;T; REGISTERS ALTERED: NONEC;-;MMAPIB: CLC ;;;ASSUME WANT CC-C CLEAR* BIT #S1.IBF,(R5) ;;;DOING BUFFERED INPUT?. BNE 10$ ;;;IF NE, YES...DON'T CHANGE MAPPING( MOV U.TIP(R4),KISAR6 ;;;MAP TASK BUFFER10$:! CALL @(SP)+ ;;;CALL CALLER BACKL .IF NDF T$$COM MAPD:: .ENDC ;NOT T$$COMRESM:A$ MOV $DALED,KISAR6 ;;;RESTORE KISAR6 RETURN ;;;RETURN TO CALLER  .ENDCLER WITH CC-C PRESERVED.;#M; NOTE - WHEN THE CALLER IS CALLED AS COROUTINE, THE UCBX MAY NOT BE MAPPED!L;T; REGISTERS ALTERED: NONEC;-;MMAPIB: CLC ;;;ASSUME WANT CC-C CLEAR* BIT #S1.IBF,(R5) ;;;DOING BUFFERED INPUT?. BNE 10$ ;;;IF NE, YES...DON'T CHANGE MAPPING( MOV U.TIP(R4),KISAR6 ;;;MAP TASK BUFFER10$:! CALL @(SP)+ ;;;CALL CALLER BACKL .IF NDF T$$COM MAPD:: .TITLE TTINIC .IDENT /09.00/V;A1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.O; All rights reserved ;H;-<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;C;-; 02-FEB-78 PETER WANNHEDENE;N; PREVIOUSLY MODIFIED BY:(; ; P. WANNHEDEN ; C. F. SPITZ1; D. R. DONCHIN. ; T. LEKAS ; S. C. ADAMSV; R. S. PHILPOTT ; L. KOGAN ; S. C. ADAMSC; T. SCHOELLER; B. S. MCCARTHY ; K. L. NOEL; M. W. ZAHAREE;.$; MODIFIED FOR RSX-11M-PLUS V4.4 BY:;y; L. KOGAN 10-JUL-90 09.00A; LK760 -- SET UCBX ADDRESS IN R4 BEFORE RELEASING DEFAULT INPUT S; BUFFER FOR IO.EION;A;+;B; ****** T T I N I ******C;DA; THIS MODULE CONTAINS THE ROUTINES TO INITIATE A NEW I/O REQUESTNJ; FOR A TERMINAL. THERE ARE THREE PARTS TO THIS. FIRST, THE I/O REQUESTSG; ARE VALIDATED PRIOR TO PLACING THEM IN THE DEVICE'S I/O PACKET QUEUE.NG; THIS MUST OCCUR WHILE THE USER TASK WHICH ISSUED THE REQUEST IS STILL I; THE CURRENT TASK. NEXT, THE REQUEST IS PLACED IN THE REQUEST QUEUE FOR0I; THE TERMINAL. FINALLY, ANY REQUEST IN THE QUEUE WHICH CAN BE INITIATEDD; IS DEQUEUED AND PASSED TO A FUNCTION-DEPENDENT INITIATION ROUTINE.;-;  .MCALL PKTDF$ PKTDF$E .PSECT MAP5.PAGE B .SBTTL TTINI - TERMINAL DRIVER I/O REQUEST INITIATION ENTRY POINT; ;+,; **-TTINI - REQUEST INITIATION ENTRY POINT.;NK; THIS ROUTINE IS CALLED FROM "DRQIO" WHEN A TASK HAS ISSUED AN I/O REQUEST K; FOR A TERMINAL. THE CALL IS MADE PRIOR TO QUEUEING THE I/O PACKET TO THEDK; SCB QUEUE SINCE TERMINALS HAVE THE "UC.QUE" BIT SET IN THEIR UCB'S. THISEJ; IS DONE WHILE THE TASK CONTEXT IS STILL VALID, SINCE MANY FUNCTIONS WILLK; NEED ADDITIONAL PARAMETER CHECKS NOT DONE BY THE EXECUTIVE. THIS ROUTINEH; WILL MAP THE DRIVER DATA AREA (SINCE WE WERE CALLED FROM THE EXEC) AND<; DISPATCH ON THE FUNCTION CODE TO VALIDATE THE I/O REQUEST.;E ; INPUTS:*; R1 => I/O REQUEST PACKET TO BE PROCESSED&; R4 => SCB FOR THE REQUESTED TERMINAL&; R5 => UCB FOR THE REQUESTED TERMINAL;D; OUTPUTS: NONE.;M"; REGISTERS MODIFIED: R0, R1, R3;-;BTTINI::E! CALL MAPD ;MAP DRIVER DATA AREAI$ MOV R1,R3 ;COPY I/O PACKET POINTER/ MOVB I.FCN+1(R3),R0 ;GET THE I/O FUNCTION CODEY$ ASL R0 ;CONVERT IT TO A WORD INDEX .IF DF R$$IIC3 CALLR @QPDSP(R0) ;DISPATCH TO PROCESS THIS REQUESTP .IFF ;R$$IICI5 CALLR @QPDSP-2(R0) ;DISPATCH TO PROCESS THIS REQUEST1 .ENDC ;R$$IIC .IF DF T$$EIO&T$$OVL=D;HERE IS THE STUB FOR TRANSFERING TO THE OVERLAY. QPEIO IS IN TTATT.QPEIO::T* CALLR QPETRA ;BRANCH TO TRANSFER IN APR6 .ENDC ;T$$EIO&T$$OVLE.PAGEA; .SBTTL FPGRQ - GET A REQUEST PACKET FROM THE REQUEST QUEUET;;+2; FPGRQ - GET A REQUEST PACKET FROM THE I/O QUEUE.?; THIS SUBROUTINE IS ENTERED EITHER FROM THE REQUEST INITIATOR,(; OR FROM THE FORK DISPATCHER.;S; INPUT:; R5 POINTER TO U.TSTA); S1.DSI 1 TO PREVENT PROCESSING OF INPUT1; ; OUTPUT:I8; IF THERE IS AN IO.WBT PACKET IN THE QUEUE, A CTRL-Q IS ; SI00x$xibjbkb a a aMULATED.;O6; AS MANY PACKETS AS CAN BE DEQUEUED FROM THE IO QUEUE; ARE STARTED.;I#; REGISTERS ALTERED: R0,R1,R2,R3,R4P;-;.;T .ENABL LSB FPGRQ:: ? BIT #FR.PFP,U.TFRQ-U.TSTA(R5) ;POST-FORK PROCESSING REQUESTED?A- BNE FPRET ;IF NE, YES...MUST DO THAT FIRST.EGRQPKT:E .IF NDF T$$SPLI= MOV #DEUCBX,-(SP) ;IF TSTRQ OR $GSPKT FAILS, DEALLOCATE UCBXI .IFTF ;NDF T$$SPL) CALL TSTRQ ;TEST IF ANYTHING TO DEQUEUEU1 ;IF NOT, DEALLOCATE UCBX AND RETURN TO CALLER,. MOV R3,-(SP) ;SAVE FLAGS IN CASE $GSPKT FAILS+ MOV #GRQAC,R2 ;POINT TO ACCEPTANCE ROUTINE & SUB #U.TSTA,R5 ;POINT TO START OF UCB" MOV R5,-(SP) ;SAVE POINTER TO UCB CALL $GSPKT ;GET A PACKETR% MOV (SP)+,R5 ;RESTORE POINTER TO UCBE3 BCC 10$ ;IF CC, SUCCESSFULLY GOT A REQUEST...SKIPE;M; NOPKDQ - NO PACKET CAN CURRENTLY BE DEQUEUED. EITHER THERE WERE NO PACKETSEI; OR THE ACCEPTANCE ROUTINE ABBORTED THE SCAN AND BRANCHED HERE DIRECTLY.E;UNOPKDQ:I) ADD #U.TSTA,R5 ;POINT TO UCB STATUS WORD,7 BIC (SP)+,2(R5) ;CLEAR FLAGS THAT WE SHOULD NOW IGNORERFPRET: RETURN ;ALL DONEO; G; FOUND A REQUEST PACKET THAT CAN BE PROCESSED. IT'S ADDRESS IS IN R1.U;10$: .IFT ;NDF T$$SPLR= CMP (SP)+,(SP)+ ;CLEAN STACK OF FLAGS AND DEALLOCATE ROUTINES .IFF ;NDF T$$SPL.! TST (SP)+ ;CLEAN STACK OF FLAGSC .ENDC ;NDF T$$SPL .IF DF T$$BTW% MOV U.SCB(R5),R3 ;GET POINTER TO SCB 20$:6 MOV (R3),R3 ;GET POINTER TO NEXT I/O PACKET IN QUEUE BEQ 30$ ;IF EQ, NONE...SKIPT/ CMP I.UCB(R3),R5 ;IS THAT PACKET FOR THIS UCB? ' BNE 20$ ;IF NE, NO...SKIP THIS PACKETL; CMPB I.PRI(R3),#251. ;IS REQUEST FOR A BREAKTHROUGH WRITE? * BEQ 40$ ;IF EQ, YES...ACCEPT THE REQUEST30$:C BIC #S2.BRQ,U.TSTA+2(R5) ;OTHERWISE, SHOW NO MORE IO.WBTS IN QUEUEN40$: .ENDC ;T$$BTW+ ADD #U.TSTA,R5 ;POINT TO FIRST STATUS WORDC MOV R1,R3 ;COPY PACKET POINTER: CLR (R3) ;CLEAR LINK WORD USED TO HOLD COMPLETION STATUS? 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$$SPL=0 .IF DF T$$MOD!N$$SPL.;TC; NOTE - HERE WE ASSUME NUMERIC VALUES FOR FUNCTION CODES ACCORDINGE'; TO WHAT IS DESCRIBED IN MODULE TTDAT!W;5 CMP R1,#IO.RPR/400 ;IS REQUEST ONE OF THE FOLLOWING:3- ; IO.RPR, IO.RTT, IO.EIO, IO.RSD, IO.WSD?W9 BHIS 50$ ;IF HIS, YES...REQUIRE UCBX AND DO MODEM CHECKE0 CMP R1,#IO.ATT/400 ;IS IT ONE OF THE FOLLOWING:% ; IO.DET, IO.GTS, SF.GMC, SF.SMC?S6 BHI 91$ ;IF HI, YES...DON'T NEED UCBX OR MODEM CHECK4 ;OTHERWISE, REQUEST IS IO.ATT, IO.WLB, OR IO.RLB .ENDC ;T$$MOD!N$$SPL. .IF DF T$$MOD8 BEQ 60$ ;IF EQ, IO.ATT...NEED UCBX BUT NOT MODEM CHECK .IFTF ;T$$MOD50$: .IFT ;T$$MODA BITB #US.DSB!US.CRW,U.STS-U.TSTA(R5) ;IS THE LINE DISABLED OR...R0 ; ...WAITING FOR CARRIER (CHECKED ONLY ON...0 ; ...IO.RLB, IO.WLB, IO.RPR, IO.RTT, IO.EIO,% ; ...IO.RSD, AND IO.WSD REQUESTS)W+ BEQ 60$ ;IF EQ, NO...REQUEST CAN CONTINUE, BIT #S4.DLO,6(R5) ;IS THIS A DIAL-OUT LINE?0 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 REQUEST60$: .ENDC ;T$$MOD .IFF ;T$$SPL. CALL ALUCBX ;ALLOCATE UCBX IF IT ISN'T THERE. BCS 105$ ;IF CS, NO FREE POOL...RETURN ERROR .ENDC ;T$$SPL .IF DF T$$EIO6 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 LIST70$:< CMP I.XIOP(R2),R3 ;IS THIS IOPX FOR THE CURRENT I/O PACKET?% BEQ 73$ ;IF EQ, YES...EXIT THE LOOPC ASSUME I.XLNK,0' MOV (R2),R2 ;GET POINTER TO NEXT IOPX4 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 NON< MOV I.XDBL(R2),U.TDIC(R4) ;SAVE DEFAULT INPUT BUFFER LENGTH4 MOV R1,-(SP) ;SAVE R1 IN CASE THIS IS USER TASK EIO= CALL $TSTBF ;SHOULD WE ATT00xxt__DATADATADATADATAEMPT TO BUFFER THE DEFAULT INPUT?S BCS 77$ ;IF CS NO;PF; ATTEMPT ALLOCATING AND FILLING TTDRV BUFFERS WITH DEFAULT INPUT DATA; ' BIS #S1.IBF,@R5 ;ASSUME BUFFERED INPUT1 MOV R2,-(SP) ;SAVE IOPX POINTER ACROSS ALTB CALL 5 CALL ALTB ;ALLOCATE A BUFFER TO STORE DEFAULT INPUTB* MOV R2,R0 ;PASS THE BUFFER ADDRESS TO R0) MOV (SP)+,R2 ;RESTORE IOPX ADDRESS TO R2I/ BCS 77$ ;IF CS, NO BUFFER IS AVAILABLE - JUMPE; MOV R0,U.TDIF(R4) ;SAVE FIRST DEFAULT INPUT BUFFER ADDRESSC= MOV #T$$BFL-4,U.TDIP(R4) ;SET SIZE OF DATA PORTION OF BUFFERB; MOV R0,U.TDIP+2(R4) ;SET DATA POINTER TO FIRST DATA BUFFERV= ADD #4,U.TDIP+2(R4) ;POINT PAST BUFFER HEADER TO DATA ITSELFB'74$: CLR (R0)+ ;CLEAR BUFFER LINK WORDP3 MOV R0,R1 ;SAVE POINTER TO BUFFER CHARACTER COUNTFE MOV #T$$BFL-4,(R0)+ ;SET MAXIMUM DATA THAT CAN BE STORED IN 1 BUFFER975$: MOV I.XDBF(R2),KISAR6 ;MAP USER DEFAULT INPUT BUFFERS; MOVB @I.XDBF+2(R2),-(SP) ;GET CHARACTER FROM USER'S BUFFERR MOV $DALED,KISAR6 ;REMAP DRIVER3 MOVB (SP)+,(R0)+ ;INSERT CHARACTER INTO OUR BUFFERF4 INC I.XDBF+2(R2) ;UPDATE POINTER INTO USER'S BUFFER) DEC I.XDBL(R2) ;ONE LESS CHARACTER TO GON BEQ 79$ ;IF EQ ALL DONEA; DEC (R1) ;MORE CHARACTERS YET TO GO - IS OUR BUFFER FULL?18 BNE 75$ ;IF NE NO - INSERT MORE CHARACTERS INTO BUFFER7 MOV R2,-(SP) ;YES - SAVE IOPX POINTER ACROSS ALTB CALL; CALL ALTB ;ALLOCATE ANOTHER BUFFER TO STORE DEFAULT INPUTM* MOV R2,R0 ;PASS THE BUFFER ADDRESS TO R0) MOV (SP)+,R2 ;RESTORE IOPX ADDRESS TO R2R3 BCS 76$ ;IF CS, NO ADDITIONAL BUFFER IS AVAILABLEF) MOV R0,-(R1) ;LINK OLD BUFFER TO NEW ONEO* BR 74$ ;STUFF CHARACTERS INTO NEW BUFFER;CL; COME HERE IF NOT ENOUGH TTDRV BUFFERS COULD BE ALLOCATED TO CONTAIN ALL OF,; THE CHARACTERS OF THE USER'S DEFAULT INPUT;E676$: MOV R2,-(SP) ;SAVE IOPX POINTER ACROSS DELTB CALL7 MOV U.TDIF(R4),R2 ;GET ADDRESS OF FIRST OF OUR BUFFERSN CALL DELTB ;DEALLOCATE THEMN# MOV (SP)+,R2 ;RESTORE IOPX POINTERD;S6; SAVE POINTERS TO USER'S DEFAULT INPUT BUFFER IN UCBX;$>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 ALLOCATEDR( BIC #S1.IBF,(R5) ;DO NON-BUFFERED INPUT; ,; PROCESS AN IO.RTT (TF.RTT) REQUEST, IF ANY;M79$: MOV (SP)+,R1 ;RESTORE R1R80$:; BIT #TF.RTT,I.XMOD(R2) ;READ W/TERMINATOR TABLE SPECIFIED?F1 BEQ PKTDSP ;IF EQ, NO...SKIP TO DISPATCH PACKET H MOV I.XTTB(R2),I.PRM+10(R3) ;COPY 1.ST ADDRESS DOUBLE WORD OF NEW TABLEJ 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 CODEU .ENDC ;T$$EIO90$:7 CMP R1,#IO.RTT/400 ;IS THIS A READ W/TERMINATOR TABLE?+ BEQ 92$ ;IF EQ YES91$:& BR PKTDSP ;DISPATCH ON FUNCTION CODE92$:$ MOV #32.,R0 ;COPY A 32. BYTE TABLE100$:I MOV R0,-(SP) CALL ALTB ;ALLOCATE A TABLE; MOV (SP)+,R0S8105$: BCS 900$ ;IF CS, ALLOCATION FAILED...RETURN ERROR1 MOV R2,U.TRTT(R4) ;SAVE TERMINATOR TABLE ADDRESSV110$:(* MOV I.PRM+10(R3),KISAR6 ;MAP USER'S TABLE4 MOVB @I.PRM+16(R3),-(SP) ;RETRIEVE AN ENTRY FROM IT* MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING0 MOVB (SP)+,(R2)+ ;COPY ENTRY TO ALLOCATED TABLE& INC I.PRM+16(R3) ;POINT TO NEXT ENTRY SOB R0,110$ ;LOOP TIL DONE( MOV U.TRTT(R4),R0 ;FORM REMAINING COUNT ADD #32.,R0 ;... SUB R2,R0 ;... BEQ PKTDSP ;ALL DONE IF ZERO115$:M CLRB (R2)+ ;ZERO REST OF TABLE SOB R0,115$ ;... .&; BR PKTDSP ;FALL THROUGH TO "PKTDSP".PAGEA> .SBTTL PKTDSP - DISPATCH ON FUNCTION CODE TO INITIATE REQUEST;B;+;; **-PKTDSP - DISPATCH ON FUNCTION CODE TO INITIATE REQUESTA;-;APKTDSP:R- ASL R1 ;CONVERT FUNCTION CODE TO WORD INDEX  .IF DF T$$ACD< BIS #UA.ALL,U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING FLAGS7 MOV U.ACB-U.TSTA(R5),R0 ;GET ACD CONTROL BLOCK ADDRESS2$ BEQ 120$ ;IF EQ, NONE THERE...SKIP MOV R1,R2 ;COPY FUNCTION CODEC1 CMPB R2,#30. ;FUNCTION CODE IN FIRST MASK WORD?. BLOS 1100y$xibjbkb a a a7$ ;Y - JUMPR7 TST (R0)+ ;BUMP ACB POINTER TO CHECK SECOND MASK WORDN# SUB #32.,R2 ;REDUCE FUNCTION CODE+G117$: BIT $BTMSK(R2),A.MAS(R0) ;IS THE ACD INTERESTED IN THIS FUNCTION?K BEQ 120$ ;IF EQ, NO...SKIP3 MOV #A.DEQU,R0 ;SET I/O PACKET DEQUEUE ENTRY POINTA CALL $SWACD ;CALL THE ACDE7 BIT #UA.ALL,U.AFLG-U.TSTA(R5) ;ALLOW THIS I/O REQUEST? $ BNE 120$ ;IF NE, YES...CONTINUE ON= MOV U.ACB-U.TSTA(R5),R0 ;GET ACD CONTROL BLOCK ADDRESS AGAIN 7 MOV A.IOS(R0),R0 ;GET I/O ERROR CODE TO RETURN TO TASK  BR 910$ ;FINISH I/O 120$:C .ENDC ;T$$ACD .IF DF T$$OVL7 MOV PPDSP-2(R1),R1 ;GET ADDRESS TO WHICH TO DISPATCH )# ASL R1 ;CONVERT TO A REAL ADDRESST, BCS 130$ ;AND SEE IF ROUTINE IS IN OVERLAY" CALL MPEXT ;MAP AND CALL ROUTINE BR 140$ ;N130$:L$ CALL (R1) ;IT'S NOT IN THE OVERLAY140$:- .IFF ;T$$OVL ( CALL @PPDSP-2(R1) ;DO OR START FUNCTION .ENDC ;T$$OVL2 JMP GRQPKT ;LOOP TO DEQUEUE ANYTHING ELSE WE CAN; 0; ERROR HANDLING FOR REQUEST INITIATION ROUTINE.;T900$:BA MOV #IE.NOD&377,R0 ;RETURN ERROR FOR INSUFFICIENT DYNAMIC MEMORY910$:D .IF DF T$$EIO' CMP R1,#IO.EIO/400 ;IS THIS AN IO.EIO?O9 BNE 990$ ;IF NE, NO...JUST FINISH OFF PACKET WITH ERROR ! MOV R0,-(SP) ;SAVE RETURN STATUSA$ MOV R5,R0 ;GET COPY OF UCB POINTER> ADD #U.TIXL-U.TSTA,R0 ;MAKE POINTER TO U.TIXL (IOPX LISTHEAD)980$:D5 MOV R0,R1 ;CURRENT IOPX POINTER BECOMES BACKPOINTERP ASSUME I.XLNK,0! MOV (R1),R0 ;POINT TO NEXT IOPXO@ CMP I.XIOP(R0),R3 ;DOES THIS IOPX BELONG TO CURRENT I/O PACKET?+ BNE 980$ ;IF NE,NO...LOOP TILL WE FIND ITM ASSUME I.XLNK,0% MOV (R0),(R1) ;REMOVE IOPX FROM LISTI# MOV R3,-(SP) ;SAVE POINTER TO IOPX,! MOV #I.XLEN,R1 ;GET SIZE OF IOPXR CALL $DEACB ;DEALLOCATE IOPX( MOV (SP)+,R3 ;RESTORE POINTER FOR IOFIN .IF NDF T$$SPLU- MOV U.TUX-U.TSTA(R5),R4 ;GET ADDRESS OF UCBX BEQ 986$ ;IF NO UCBX =>986$P .ENDC ;T$$SPL9 MOV U.TDIF(R4),R2 ;GET DEFAULT INPUT BUFFER LIST POINTERE% CALL DELTB ;DEALLOCATE THEM, IF ANY 986$:N! MOV (SP)+,R0 ;RESTORE ERROR CODE;990$:O L .ENDC ;T$$EIO$ CALL IOFIN ;FINISH THE I/O REQUEST% JMP GRQPKT ;TRY FOR ANOTHER REQUESTP .DSABL LSB .PAGE, .SBTTL TTINI SUBROUTINES @ .SBTTL . GRQAC - $GSPKT ACCEPTANCE ROUTINE FOR GET RQST (FPGRQ);T;+O; **-GRQAC - $GSPKT ACCEPTANCE ROUTINE FOR GETTING A NEW REQUEST PACKET (FPGRQ)B;-; GRQAC:> CMP I.UCB(R1),G$$SPA(SP) ;IS THIS PACKET FOR THE CURRENT UCB? SEC ;ASSUME ERROR) BNE 10$ ;IF NE, NO...ASSUMPTION CORRECTN ASSUME S2.IRQ,S1.IBYP ASSUME S2.ORQ,S1.OBYD9 BITB I.PRM+7(R1),U.TSTA(R5) ;CAN WE PROCESS THIS PACKET?I3 BNE 20$ ;IF NE, NO...SKIP TO CHECK FOR SCAN ABORTK; IF TERMINAL IS IN TERMINAL MANAGEMENT MODE AND THE REQUEST IS AN INTERNALPH; I/O REQUEST, REJECT THIS PACKET. THIS IS A BIT OF A HACK. WHEN TIME J; PERMITS, WE COULD USE EVENT PACKETS TO TELL THE NET TO STOP SENDING I/O.;R .IF DF T$$SCA & R$$IICC> BIT #S5.TMM,U.TST5(R5) ;IS TERMINAL IN TERM. MANAGEMENT MODE?! BEQ 5$ ;IF NOT, SO FAR, SO GOOD26 BIT #1,I.IOSB+4(R1) ;IF TMM, IS IT ALSO INTERNAL I/O?( BNE 10$ ;REJECT.. SEC STILL FROM ABOVE5$:2 .ENDC ;T$$SCA & R$$IICC .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 PACKET1 BIT #S1.IBY!S1.OBY,U.TSTA(R5) ;IS ANYTHING BUSY? * BEQ 10$ ;IF EQ, NO...ACCEPT THIS REQUEST;/J; THE LINE IS NOT IN FULL DUPLEX MODE, AND EITHER INPUT OR OUTPUT IS BUSY.M; IN THIS CASE, THE ONLY PACKET WE CAN ACCEPT IS IO.WBT. IO.WBT PACKETS HAVE)K; PRIORITY 251., AND ALL OTHERS HAVE LOWER PRIORITY. IF THIS PACKET IS NOTN; AN IO.WBT, WE KNOW THAT THERE ARE NO IO.WBT'S FURTHER DOWN THE QUEUE EITHER,; SO WE ABORT THE SCAN.U;D= CMPB I.PRI(R1),#251. ;IS THIS AN IO.WBT? (CLEAR CC-C IF YES)A% BNE 30$ ;IF NE, NO...ABORT THE SCANS;Y;NK; DON'T BEGIN AN IO.WBT FUNCTION IF A READ IS ACTIVE THAT SPECIFIED TF.XOF.NJ; THIS IS NECESSARY TO PREVENT A COLLISION BETWEEN THE IO.WBT DATA AND THE; XOF CHARACTER OUTPUT. ;I7 BIT #S100 yxt__DATADATADATADATA.USI,U.TSTA(R5) ;UNSOLICITED INPUT IN PROGRESS?H 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$$SPLOB MOV U.TUX(R5),R2 ;GET UCBX (THERE MUST BE ONE SINCE LINE IS BUSY) .ENDC ;T$$SPL: TSTB U.TISV(R2) ; CHECK IF ^R AFTER IO.WBT IS IN PROGRESS* BNE 30$ ; YES DO NOT TAKE ANOTHER IO.WBT& MOV @R2,R2 ;GET CURRENT INPUT PACKET BEQ 10$ ;NONE - ACCEPT IO.WBTT: BIT #TF.XOF,I.FCN(R2) ;READ IS ACTIVE - TF.XOF SPECIFIED?8 BNE 30$ ;Y - REJECT IO.WBT AND STOP SCAN AT THIS POINT; $; ACCEPT THE CURRENT REQUEST PACKET.;M .IFF ;T$$BTWA/ CLC ;RETURN WITH CC-C CLEAR TO ACCEPT PACKETF .ENDC ;T$$BTW10$: RETURN ;ALL DONEE;SF; IF PACKET REQUIRES BOTH INPUT AND OUTPUT TO BE FREE, ABORT THE SCAN.>; OTHERWISE JUST REJECT THE PACKET BY RETURNING WITH CC-C SET.;N ASSUME S2.ORQ,100 ASSUME S2.IRQ,20020$:> CMPB I.PRM+7(R1),#S1.IBY!S1.OBY ;ARE BOTH INPUT AND OUTPUT.... ; ...REQUIRED TO BE FREE FOR THIS REQUEST?6 BLO 10$ ;IF LO, NO...RETURN TO REJECT THIS PACKET..., ; ...CC-C WAS SET BY COMPARE INSTRUCTION;$N; WE FOUND A PACKET THAT REQUIRES BOTH INPUT AND OUTPUT TO BE FREE. ABORT THEJ; SCAN SO THE PACKET WILL GET A CHANCE TO BE DEQUEUED ONCE ALL REQUESTS IN; FRONT OF IT ARE DONE.;T30$: ADD #G$$SPA,SP ;FLUSH STACK% MOV (SP)+,R5 ;RESTORE POINTER TO UCBO* CLR (SP) ;DON'T CHANGE FLAGS IN U.TSTA+23 JMP NOPKDQ ;FINISH AS THOUGH NO PACKET TO DEQUEUE.PAGE.@ .SBTTL . KILAC - $GSPKT ACCEPTANCE ROUTINE FOR KILL I/O (QPKIL); ;+3; **-KILAC - KILL I/O ACCEPTANCE ROUTINE FOR $GSPKTE;SJ; "$GSPKT" CALLS THIS ROUTINE WITH AN I/O PACKET TO BE CHECKED AGAINST THE; KILL I/O ACCEPTANCE CRITERIA:AD; 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; S ; INPUTS:3; R1 => I/O REQUEST PACKET TO BE ACCEPTED/REJECTED.A(; G$$SPA(SP) => UCB OF PACKETS TO ACCEPT'; G$$SPA+2 => I/O KILL REQUEST PACKETM;H ; OUTPUTS: '; CC-C = 0 IF PACKET IS TO BE ACCEPTEDR'; = 1 IF PACKET IS TO BE REJECTED;.; REGISTERS MODIFIED: R2, R3;-;, .IF DF R$$IICKILAC:> 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?S& BNE 30$ ;IF NE, NO...DON'T ACCEPT IT6 MOVB I.FCN(R3),R3 ;GET KILLER PACKET SUBFUNCTION CODE2 MOVB I.FCN+1(R1),R2 ;GET PACKET SUBFUNCTION CODE  .IF DF T$$EIO= CMPB #IO.EIO/400,R2 ;IS THIS PACKET AN EXTENDED I/O REQUEST?G BNE 5$ ;IF NOT, BRC;WARNING: THIS ASSUMES THAT IO.RLB/400,TF.RLB AND IO.WLB/400,TF.RLBH> MOVB I.FCN(R1),R2 ;GET NON-EXTENDED I/O REQUEST FUNCTION CODE5$: .ENDC ;T$$EIO6 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?. BNE 20$ ;IF NE, NO...SKIP 10$:5 MOVB #TF.RLB,R2 ;MAKE THESE LOOK LIKE STRAIGHT READSN20$:1 CLC ;ASSUME WE ARE GOING TO ACCEPT THIS PACKET , BITB R3,R2 ;IS THIS A PACKET TO BE KILLED?! BNE 40$ ;IF NE, YES...ACCEPT ITT30$: SEC ;DON'T ACCEPT THIS PACKET40$: RETURN ;ALL DONE; .ENDC ;R$$IIC.PAGET1 .SBTTL I/O REQUEST PRE-QUEUE PROCESSING ROUTINES.+ .SBTTL . QPKIL - INTERNAL I/O KILL REQUEST;Q;+/; **-QPKIL - INTERNAL I/O KILL REQUEST (IO.KIL)H;AI; THIS ROUTINE PROCESSES AN I/O REQUEST WITH A FUNCTION CODE OF ZERO. AN,K; I/O PACKET WILL ONLY HAVE THIS FUNCTION CODE IF IT IS AN INTERNAL (SYSTEMOK; STATE) I/O REQUEST. IT PERFORMS FUNCTIONS SIMILAR TO THE DRIVER'S CANCEL J; I/O ENTRY POINT "TTCAN". HOWEVER, IF CAN BE SPECIFIED THAT ONLY READ ORI; ONLY WRITE REQUESTS ARE TO BE CANCELLE00y$xibjbkb a a aD. 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.; ; INPUTS:; R3 => I/O KILL REQUEST PACKETT; R4 => SCB FOR THE TERMINAL; R5 => UCB FOR THE TERMINAL; I.FCN = TF.WLB OR TF.RLB 7; I.TCB => TCB OF TASK WHOSE REQUESTS ARE TO BE ABORTED;N ; OUTPUTS:E7; SPECIFIED I/O REQUESTS ARE ABORTED WITH STATUS IE.ABO;O"; REGISTERS MODIFIED: R0, R1, R2;-;A .IF DF R$$IICQPKIL:: .IF DF M$$PRO/ BIT S.URM(R4),@$CPURM ;ALREADY ON CORRECT CPU?I BNE 5$ ;IF NE YES, CONTINUEE7; CONVERT 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 .IF DF A$$CHK .ENABL LSBSCKBFRW:V. BIT #1,R0 ;DOES BUFFER START ON ODD ADDRESS?4 BNE 910$ ;IF NE, YES...RETURN INVALID BUFFER ERRORCKBFR::O .IF DF R$$MPL5 MOV #$CKBFR,-(SP) ;SET UP CALL FOR READ-ACCESS CHECKE BR 10$ ;SKIP TO COMMON CODEF .IFTF ;R$$MPLCKBFB::A .IFT ;R$$MPLS6 MOV #$CKBFB,-(SP) ;SET UP CALL FOR WRITE-ACCESS CHECK10$: .IFTF ;R$$MPL TST R1 ;IS BUFFER SIZE VALID?P3 BEQ 900$ ;IF EQ, NO...RETURN INVALID BUFFER ERRORG6 CMP R1,#20000-100 ;IS BUFFER BIGGER THAN 8128. BYTES?5 BHI 920$ ;IF HI, YES...RETURN BAD BUFFER SIZE ERROR .IFT ;R$$MPL0 .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 HEADER; .IFTF ;X$$HDR3 CALL @(SP)+ ;CALL REQUESTED ADDRESS CHECK ROUTINEO .IFT ;X$$HDRE+ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGE .ENDC ;X$$HDR .IFF ;R$$MPLN) CALL $ACHKB ;DO NORMAL ADDRESS CHECKING0 .ENDC ;R$$MPL+ BCS 910$ ;IF CS, IT FAILED...RETURN ERRORS .IFF ;A$$CHKF00yxt__DATADATADATADATACKBRW:CKBFR::.CKBFB::P .IFTF ;A$$CHK9 CALL $RELOC ;RELOCATE ADDRESS AND CONVERT TO DOUBLEWORDT RETURN ;ALL DONEP .IFT ;A$$CHKX900$:G6 .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS910$:A MOV #IE.SPC&377,R0 ;SET COMPLETION ERROR CODE FOR INVALID BUFFERD BR 990$ ;SKIPK920$:R6 .IIF DF R$$MPL, TST (SP)+ ;POP OFF CO-ROUTINE ADDRESS; MOV #IE.BAD&377,R0 ;SET COMPLETION ERROR CODE FOR BAD SIZEM990$:B SEC ;RETURN WITH ERROR FLAG RETURN ;ALL DONEA .DSABL LSB: .ENDC ;A$$CHK.PAGEF? .SBTTL . TSTRQ - CHECK I/O REQUEST QUEUE FOR PACKET TO DEQUEUEL;R;+$; SUBROUTINE TSTRQ - TEST I/O QUEUE.;; INPUT:; R5 POINTER TO U.TSTA;; ; OUTPUT:R:; IF THERE IS (POTENTIALLY) A PACKET IN THE I/O QUEUE THAT; CAN BE PROCESSED:L>; RETURN TO CALLER WITH R3 = MASK OF BITS TO CLEAR IN U.TSTA+2 ; IF NO PACKET COULD BE DEQUEUED;V ; IF NOT:7; RETURN TO CALLER'S CALLER.;R; REGISTERS ALTERED: R3 ;-;NTSTRQ::O- MOV (R5),R3 ;GET FIRST TERMINAL STATUS WORD COM R3 ;INVERT ITGA BIC #^C,R3 ;CLEAR ALL TO SEE WHAT CAN BE DEQUEUEDL/ BIS #S2.SRQ,R3 ;OR WITH "SPECIAL REQUEST" FLAG: BIT R3,2(R5) ;IS ANYTHING IN QUEUE THAT CAN BE PROCESSED?6 BEQ 10$ ;IF EQ, NO...POP OUR WAY OUT OF THIS ROUTINEA BIT #S2.BRQ,2(R5) ;IS THERE A "BREAKTHROUGH WRITE" IN THE QUEUE?R4 BNE 20$ ;IF NE, YES...IT CAN POSSIBLY BE PROCESSED ASSUME S3.FDX,200) TSTB 4(R5) ;USER ON A FULL DUPLEX LINE? 4 BMI 20$ ;IF MI, YES...IT CAN POSSIBLY BE PROCESSED7 BIT #S1.IBY!S1.OBY,(R5) ;IS ANYTHING BUSY ON THE LINE?Y2 BEQ 20$ ;IF EQ, NO...RETURN TO PROCESS A REQUEST10$:; TST (SP)+ ;POP RETURN ADDRESS SO WE WON'T PROCESS REQUESTI20$: RETURN ;ALL DONEC.PAGEQ .PSECT MAP5.6" .SBTTL . WRITE REQUEST PROCESSING% .SBTTL . QPWSB - WRITE SPECIAL DATAU;W;+(; **-QPWSD - WRITE SPECIAL DATA (IO.WSD);-;P .IF DF B$$MAPQPWSD::M9 BIC #^C,I.FCN(R3) ;CLEAR DISALLOWED BITS( 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...CONTINUEO6 BR EQPBAD ;ELSE, RETURN REQUEST WITH BAD PARAMENTERS .ENDC ;B$$MAP& .SBTTL . QPWLB - WRITE LOGICAL BLOCK;;+*; **-QPWLB - NORMAL WRITE REQUEST (IO.WLB);-;SQPWLB::B .IF DF T$$CUP@ MOV I.PRM+6(R3),I.PRM+10(R3) ;SAVE VFC/CURSOR-CONTROL FOR LATER .ENDC ;T$$CUPQPWLB1:P7 MOV #S2.ORQ,R4 ;A WRITE MUST BLOCK IF OUTPUT IS ACTIVEW .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?K' BNE 10$ ;IF NE, YES...DO BREAKTHROUGHS, CMP T.UCB(R0),R5 ;IS THE IO.WBT TO OWN TI:?$ BNE EQPPRI ;IF NOT, DON'T ALLOW IT10$: .ENDC ;M$$MUP6 MOVB #251.,I.PRI(R3) ;CHANGE REQUEST TO PRIORITY 251.= BIS #TF.CCO,I.FCN(R3) ;BREAKTHROUGH IMPLIES CANCEL CONTROL-O D MOV #S2.ORQ!S2.BRQ,R4 ;FLAG BREAKTHROUGH REQUEST AND WAIT FOR WRITE .ENDC ;T$$BTW6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST.PAGE ! .SBTTL . READ REQUEST PROCESSINGV$ .SBTTL . QPRSD - READ SPECIAL DATA;A;+/; **-QPRSD - READ SPECIAL DATA REQUEST (IO.RSD)P;-;R .IF DF B$$MAPQPRSD:: 8 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 PARAMETERSL< 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: .IF DF T$$RPRQPRPR::.: MOV I.PRM+10(R3),R0 ;GET VIRTUAL ADDRESS OF PROMPT BUFFER, MOV I.PRM+12(R3),R1 ;GET PROMPT BUFFER SIZEC MOV #S2.IRQ!S2.ORQ,R4 ;PROMPT MUST BLOCK IF INPUT OR OUTPUT ACTIVEB: CALL CKBFR ;00"y$xibjbkb a a aCHECK READ ACCESS AND RELOCATE PROMPT BUFFER9 BCC 10$ ;IF CC, OK...GO STORE ADDRESS AND QUEUE REQUESTS: BR IOFIN ;CHECK FAILED...COMPLETE REQUEST WITH THE ERROR .ENDC ;T$$RPR- .SBTTL . QPRTT - READ WITH TERMINATOR TABLE-;A;+8; **-QPRTT - READ WITH TERMINATOR TABLE REQUEST (IO.RTT);-;RQPRTT::P? MOV #S2.IRQ,R4 ;READ W/TERMINATORS MUST BLOCK IF INPUT ACTIVE F; BIT #TF.PTT,I.FCN(R3) ;WANT TO USE PREVIOUSLY SPECIFIED TERM. TABLE?;; BNE CKBFLN ;IF NE, YES...DON'T BOTHER CHECKING PARAMETER 5 MOV I.PRM+10(R3),R0 ;GET ADDRESS OF TERMINATOR TABLEC4 MOV #32.,R1 ;LENGTH OF TABLE IS FIXED AT 32. BYTES; CALL CKBFRW ;CHECK READ ACCESS AND RELOCATE TABLE ADDRESSR8 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+16(R3) ;SAVE SECOND WORD OF ADDRESS DOUBLE WORDN6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST .DSABL LSBE% .SBTTL . QPRLB - READ LOGICAL BLOCK.;O;+); **-QPRLB - NORMAL READ REQUEST (IO.RLB)3;-;EQPRLB:: 6 MOV #S2.IRQ,R4 ;NORMAL READ MUST WAIT FOR ACTIVE READ6 BR CKBFLN ;CHECK BUFFER LENGTH AND QUEUE THE REQUEST.PAGEC .SBTTL . ERROR HANDLING;N,; EQPPRI - RETURN PRIVILEGE VIOLATION ERROR.;0EQPPRI:R; MOV #IE.PRI&377,R0 ;SET ERROR CODE FOR PRIVILEGE VIOLATIONR; BR IOFIN ;FINISH I/O REQUEST (NO NEED TO RESTORE MAPPING) ;F+; EQPBAD - RETURN ERROR FOR BAD PARAMETERS.T;EQPBAD::: MOV #IE.BAD&377,R0 ;SET ERROR FOR BAD PARAMETER SPECIFIED .IF DF A$$CHK5 BR EQPFIN ;FINISH REQUEST (REMAP DRIVER ON THE WAY)R; @; EQPSPC - RETURN ERROR BECAUSE OF INVALID BUFFER SPECIFICATION.;QEQPSPC:R? MOV #IE.SPC&377,R0 ;SET ERROR FOR ILLEGAL BUFFER SPECIFICATIONR8; BR EQPFIN ;RETURN THE ERROR (REMAP DRIVER ON THE WAY) .ENDC ;A$$CHKEQPFIN:: .IF DF T$$EIO* MOV $DALED,KISAR6 ;RESTORE DRIVER MAPPING .ENDC ;T$$EIOIOFIN::T# CLR R1 ;CLEAR SECOND WORD OF IOSBQ$ CALLR $IOFIN ;FINISH IO AND RETURN.PAGED, .SBTTL . CKBFLN - FINAL BUFFER LENGTH CHECK;F=; CKBFLN - CHECK THAT BUFFER LENGTH IS WITHIN (1,8K-64) BYTESR;RCKBFLN:E .IF DF A$$CHK3 MOV I.PRM+4(R3),R1 ;GET LENGTH OF TRANSFER REQUEST 4 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 ERROR, .ENDC ;A$$CHK< .SBTTL QUEUE - PLACE I/O REQUEST PACKET INTO TERMINAL QUEUE;W?; R4 NOW CONTAINS FLAGS TO BE USED BY THE ACCEPTANCE ROUTINE FOT>; GETTING PACKETS FROM THE QUEUE VIA $GSPKT. SAVE THE FLAGS IN; I.PRM+7 OF THE I/O PACKET.;4QUEUE::; ADD #U.TSTA,R5 ;POINT UCB POINTER TO THE FIRST STATUS WORDN .IF DF T$$ACD6 BIS #UA.ALL,U.AFLG-U.TSTA(R5) ;SET DEFAULT PROCESSING! MOV U.ACB-U.TSTA(R5),R0 ;GET ACBI BEQ 10$ ;THERE IS NONE - JUMPA' MOVB I.FCN+1(R3),R1 ;GET FUNCTION CODEO! ASL R1 ;CONVERT TO A WORD INDEXU1 CMPB R1,#30. ;FUNCTION CODE IN FIRST MASK WORD?W BLOS 5$ ;Y - JUMPL7 TST (R0)+ ;BUMP ACB POINTER TO CHECK SECOND MASK WORDA# SUB #32.,R1 ;REDUCE FUNCTION CODE E5$: BIT $BTMSK(R1),A.MAS(R0) ;IS THE ACD INTERESTED IN THIS FUNCTION?R BEQ 10$ ;N - JUMPT> MOV #A.ACCE,R0 ;Y - SET TO I/O REQUEST ACCEPTANCE ENTRY POINT CALL $SWACD ;CALL ACD 7 BIT #UA.ALL,U.AFLG-U.TSTA(R5) ;ALLOW THIS I/O REQUEST?  BNE 10$ ;Y - JUMPA* SUB #U.TSTA,R5 ;POINT TO BEGINNING OF UCB MOV U.ACB(R5),R0 ;GET ACB7 MOV A.IOS(R0),R0 ;GET I/O ERROR CODE TO RETURN TO TASKW BR IOFIN ;FINISH I/O10$: .ENDC ;T$$ACD. ASSUME ,0. MOVB R4,I.PRM+7(R3) ;SAVE FLAGS IN I/O PACKET% BNE 20$ ;PACKET CANNOT BE PROCESSEDI ;IMMEDIATELY - JUMPT .IF DF T$$GTS!T$$GMCT< 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$$OVL0 MOV #PPSPC1,R1 ;GET ADDRESS OF ROUTINE IN TTEXT" CALLR MPEXT ;MAP IT AND CALL IT .IFF ;T$$OVLS# CALLR PPSPC1 ;PROCESS IMMEDIATELYO .ENDC ;T$$OVL15$: .ENDC ;T$$GTS!T$$GMC; .IF DF T$$OVL/ MOV #PPHNG,R1 ;GET ADDRES00*yxt__DATADATADATADATAS OF ROUTINE IN TTEXTP" CALLR MPEXT ;MAP IT AND CALL IT .IFF ;T$$OVL " CALLR PPHNG ;PROCESS IMMEDIATELY .ENDC ;T$$OVL20$:C BICB #S2.SRQ!S2.BRQ,I.PRM+7(R3) ;CLEAR SRQ AND BRQ FLAGS IN PACKETR0 MOV U.SCB-U.TSTA(R5),R0 ;GET I/O QUEUE LISTHEAD MOV R3,R1 ;GET PACKET POINTERT CALL $QINSP ;INSERT PACKET; BIT #S2.SRQ,R4 ;SPECIAL FUNCTION (IO.ATT, IO.DET, IO.SMC)?R BEQ 30$ ;N - JUMPE) MOV #S2.SRQ,R4 ;Y - CLEAR ALL OTHER BITS$30$:- BISB R4,2(R5) ;SET FLAGS TO INDICATE WHAT WE  ;PUT IN THE QUEUET' ;NOTE - MUST BE DONE A F T E R WE ;PUT PACKET IN THE QUEUE!! .IF DF M$$PRO# MOV #FR.GRQ,R3 ;COME BACK AT FPGRQS# CALL SWCPU ;SWITCH TO CORRECT CPUN;R9; IF WE FALL THRU HERE, WE ARE ALREADY ON THE CORRECT CPU ;T .ENDC ;M$$PRO' CALL SETDSI ;DISABLE INPUT PROCESSING , FRKBIT BIS,#FR.GRQ ;POST "GET REQUEST" FORK. RETURN ;LET SETDSI DISPATCH IT. THAT'S WHAT ;IT GETS PAID FOR..PAGEB. .SBTTL . QPATT/QPDET - ATTACH/DETACH REQUESTS;H;+-; **-QPATT - ATTACH TERMINAL REQUEST (IO.ATT) -; **-QPDET - DETACH TERMINAL REQUEST (IO.DET)E;!K; ENTRY POINT "QPATT" PERFORMS UNSOLICITED INPUT AST ADDRESS ADJUSTMENT FORTM; SUPERVISOR MODE LIBRARIES (IF SUPPORTED) AND THEN FALLS THROUGH TO "QPDET".PL; FROM QPDET, CONTROL IS TRANSFERRED TO THE PACKET QUEUEING ROUTINE WITH THEB; DEQUEUE BLOCKING FLAGS SET TO CHECK FOR ACTIVE INPUT AND OUTPUT.;I ; INPUTS:,; R3 => I/O PACKET FOR ATTACH/DETACH REQUEST; R5 => UCB FOR THE TERMINAL;U ; OUTPUTS:; R3 => I/O PACKET TO BE QUEUEDE&; R4 = REQUEST DEQUEUE BLOCKING FLAGS;R"; REGISTERS MODIFIED: R0, R1, R2;-; QPATT::U .IF DF S$$LIB: 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 MODEH" 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 MODER$ MOV R2,I.PRM+4(R3) ;AND PUT IT BACK .ENDC ;S$$LIBQPDET:: B MOV #S2.IRQ!S2.ORQ!S2.SRQ,R4 ;BLOCK REQUEST IF EITHER INPUT OR...3 ; ...OUTPUT ACTIVE AND MARK AS SPECIAL FUNCTION% JMP QUEUE ;QUEUE UP THE REQUEST NOW3.PAGEC$ .SBTTL . QPSPC - "SPECIAL" REQUESTS; ;+=; **-QPSPC - HANDLE "SPECIAL" REQUESTS (IO.GTS/SF.GMC/SF.SMC) ;LG; THIS ROUTINE CHECKS PARAMETERS FOR THE "GET TERMINAL SUPPORT" AND THEVJ; "GET/SET MULTIPLE CHARACTERISTICS" FUNCTIONS. THE USER BUFFER FOR THESEI; REQUESTS MUST BE WORD-ALIGNED. THE IO.GTS AND SF.GMC FUNCTIONS WILL BE:L; 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 = REQUEST DEQUEUE BLOCKING FLAGS;O"; REGISTERS MODIFIED: R0, R1, R2;-;M .IF DF T$$GTS!T$$GMC!T$$SMCQPSPC::  .IF DF R$$IIC * BIT #1,I.IOSB+4(R3) ;IS THIS INTERNAL I/O BNE 5$ ;IF NE YESS .ENDC ; R$$IICE) MOV I.PRM(R3),R0 ;GET ADDRESS OF BUFFER # MOV I.PRM+2(R3),R1 ;AND ITS LENGTHT0 MOV R1,I.PRM+4(R3) ;PUSH LENGHT DOWN ONE FIELD$ MOV #CKBFB,R2 ;ASSUME A WRITE CHECK5$:R .IF DF T$$GTS!T$$GMCC7 CLR R4 ;ASSUME REQUEST IS IO.GTS OR SF.GMC - IF SO... 3 ; ...IT IS PROCESSED SYNCHRONOUSLY (NOT QUEUED)O .ENDC ;T$$GTS!T$$GMC  .IF DF T$$GTSE CMP I.FCN(R3),#IO.GTS ;IO.GTS? ;GET TERMINAL DRIVER SUPPORT REQUEST?# .IF DF T$$GMC!T$$SMCN. BEQ 20$ ;IF EQ, YES...CHECK BUFFER ALIGNMENT .IFF ;T$$GMC!T$$SMC7 BNE EQPIFC ;IF NE, NO...RETURN ILLEGAL FUNCTION ERRORT .ENDC ;T$$GMC!T$$SMC; .ENDC ;T$$GTS .IF DF T$$GMC= CMP I.FCN(R3),#SF.GMC ;GET MULTIPLE CHARACTERISTICS REQUEST?R .IF DF T$$SMC. BEQ 20$ ;IF EQ, YES...CHECK BUFFER ALIGNMENT .IFF ;T$$SMCO7 BNE EQPIFC ;IF NE, NO...RETURN ILLEGAL FUNCTION ERROR$ .ENDC ;T$$SMC .ENDC ;T$$GMC .IF DF T$$SMC= C002y$xibjbkb a a aMP I.FCN(R3),#SF.SMC ;SET MULTIPLE CHARACTERISTICS REQUEST?I7 BNE EQPIFC ;IF NE, NO...RETURN ILLEGAL FUNCTION ERRORC) MOV I.TCB(R3),R2 ;GET ISSUING TASK'S TCBL, CMP T.UCB(R2),R5 ;IS THIS TERMINAL HIS TI:?( BEQ 10$ ;IF EQ, YES...REQUEST IS LEGAL/ BIT #T3.PRV,T.ST3(R2) ;IS THE TASK PRIVILEGED?Q BNE 10$ ;IF NE YES, OK5 JMP EQPPRI ;IF EQ, NO...CAN'T ALLOW USER TO DO THISF10$:C MOV #S2.IRQ!S2.ORQ!S2.SRQ,R4 ;SF.SMC MUST BLOCK IF INPUT OR OUTPUT.4 ; ...IS ACTIVE. ALSO FLAG AS "SPECIAL" FUNCTION& MOV #CKBFRW,R2 ;SET UP FOR READ CHECK .ENDC ;T$$SMC20$: .IF DF R$$IIC .* BIT #1,I.IOSB+4(R3) ;IS THIS INTERNAL I/O BNE 27$ ;IF NE YES .ENDC ; R$$IICU1 CALL (R2) ;ADDRESS CHECK BUFFER AND RELOCATE ITQ BCC 25$ ;IF CC, NO ERROR6 JMP IOFIN ;IF ERROR, FINISH UP WITH ERROR CODE IN R0-25$: MOV R1,I.PRM(R3) ;PUT BIAS IN I/O PACKETL' MOV R2,I.PRM+2(R3) ; AND DISPLACEMENTS27$: .IF DF A$$CHK* MOV I.PRM+2(R3),-(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?:/ BCC 30$ ;IF CC, BUFFER IS WORD-ALIGNED...SKIPI6 JMP EQPSPC ;RETURN ERROR FOR BUFFER NOT WORD-ALIGNED30$: .ENDC ;A$$CHK JMP QUEUE ;QUEUE REQUEST .ENDC ;T$$GTS!T$$GMC!T$$SMC;IM; EQPIFC - RETURN AN ERROR DUE TO ILLEGAL FUNCTION CODE OR INVALID MODIFIERS.B; # .IF DF T$$GTS!T$$GMC!T$$SMC!T$$EIOAEQPIFC::D MOV #IE.IFC&377,R0 ;SET ERROR FOR ILLEGAL FUNCTION CODE OR MODIFIER; JMP EQPFIN ;FINISH OFF THE REQUEST (RESTORE MAPPING ALSO)P# .ENDC ;T$$GTS!T$$GMC!T$$SMC!T$$EIOH.PAGEB .PSECT MAP5 .SBTTL . QPHNG - HANGUP REQUEST;E;+$; **-QPHNG - HANGUP REQUEST (IO.HNG);NH; THIS ROUTINE CHECKS AN IO.HNG REQUEST. A NON-PRIVILEGED TASK CAN HANGK; UP ONLY ITS "TI:" LINE. PRIVILEGED TASKS CAN HANG UP ANY LINE. A HANGUP L; REQUEST, LIKE AN IO.WBT OR GET CHARACTERISTICS, BREAKS THROUGH THE QUEUE. ;M ; INPUTS:"; R3 => I/O PACKET FOR THE REQUEST; R5 => UCB FOR THE TERMINAL;; ; OUTPUTS:E; R3 => I/O PACKET TO BE QUEUED&; R4 = REQUEST DEQUEUE BLOCKING FLAGS;P; REGISTERS MODIFIED: R0;-;NQPHNG::P" CALL PREQUE ;SET UP FOR QUEUEING" CLR R4 ;IO.HNG WAITS FOR NOTHING JMP QUEUE ;QUEUE THE REQUEST .IF DF T$$LTH< .SBTTL . QPORG - INITIATE A CONNECTION TO A TERMINAL SERVER; ;+'; **-QPORG - ORIGINATE REQUEST (IO.ORG)B;R*; THIS ROUTINE CHECKS AN IO.ORG REQUEST. ; ; INPUTS:"; R3 => I/O PACKET FOR THE REQUEST; R5 => UCB FOR THE TERMINAL;L ; OUTPUTS:U; R3 => I/O PACKET TO BE QUEUEDE&; R4 = REQUEST DEQUEUE BLOCKING FLAGS;S; REGISTERS MODIFIED: R0;-;-QPORG::N" CALL PREQUE ;SET UP FOR QUEUEING> MOV #S2.IRQ!S2.ORQ,R4 ;ORIGINATE MUST WAIT FOR READ AND WRITE JMP QUEUE ;QUEUE THE REQUEST .ENDC ;T$$LTHPREQUE:N) MOV I.TCB(R3),R0 ;GET ISSUING TASK'S TCBQ, 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?L' BEQ 5$ ;IF EQ NO, FORK TO CORRECT CPUI .IFTF ; DF M$$PRO RETURN  .IFT ; DF M$$PROJ=; CONVERT PARAMETER LIST PART OF I/O PACKET INTO A FORK BLOCKI>; (AND THE RETURN ADDRESS) FOR INTERPROCESSOR FORK. SINCE THIS@; IS A SUBROUTINE, WE MUST REMEMBER CALLER ADDRESS IN FORK BLOCK*; OR THE INTERPROCESSOR FORK DOES NOTHING.;;5$: ADD #I.PRM+14,R3 ;POINT PAST KISAR5 FIELD IN FORK BLOCK2( MOV (SP)+,(R3) ;REMEMBER RETURN ADDRESS: MOV KINAR5,-(R3) ;INSERT DRIVER I MAPPING IN KISAR5 FIELD# CLR -(R3) ;CLEAR R4 IN FORK BLOCKO7 MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCKF. 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 BLOCKS CALL MAPD ;RE-MAP DRIVER/ JMP @I.PRM+14(R3) ;DISPATCH TO ORIGINAL CALLERR .ENDC ; DF M$$PROJ2EQPR:$) TST (SP)+ ;POP RETURN ADDRESS OFF STACK . JMP E00:y;yt__DATADATADATADATAQPPRI ;RETURN PRIVILEGE VIOLATION ERROR .END MOV KINAR5,-(R3) ;INSERT DRIVER I MAPPING IN KISAR5 FIELD# CLR -(R3) ;CLEAR R4 IN FORK BLOCKO7 MOV S.URM(R4),-10(R3) ;SET URM OF DEVICE IN FORK BLOCKF. 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 BLOCKS CALL MAPD ;RE-MAP DRIVER/ JMP @I.PRM+14(R3) ;DISPATCH TO ORIGINAL CALLERR .ENDC ; DF M$$PROJ2EQPR:$) TST (SP)+ ;POP RETURN ADDRESS OFF STACK . JMP E .TITLE DRTBLP .IDENT /05.15/N;R1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.I; All rights reservedR;R<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;F; B. S. MCCARTHY 17-MAR-81;C!; MODIFIED FOR RSX-11M-PLUS V2.1: ;K; J. R. KAUFFMAN; T. M. MARTIN; B. S. MCCARTHYV;+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:E;; J. W. BERZLE; J. R. KAUFFMAN; J. M. LAWLER; B. S. MCCARTHY;T+; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:N;R; B. S. MCCARTHY ; K. L. NOEL;e2; MODIFIED FOR VAX-CoProcessor/RSX VERSION 1.0 BY:;F; PAUL K. M. WEISS;R+; MODIFIED FOR RSX-11M-PLUS VERSION 4.3 BY:I;C; B. S. MCCARTHY / K. L. NOEL ;E+; MODIFIED FOR RSX-11M-PLUS VERSION 4.3 BY:O;I!; B. S. MCCARTHY 9-JUL-90 05.15.; 6; BM430 -- ADD ABILITY TO USE UNIVERSAL RECEIVER TASK;D.; BM431 -- ADD SEND DATA AND UNSTOP DIRECTIVE;Z; DIRECTIVE DISPATCHER TABLE A;RB; THIS MODULE WAS SPLIT OUT OF DRTBL AND RESTRUCTURED TO ALLOW FORE; MORE DIRECTIVE FLAGS, STREAMLINE DIRECTIVE PROCESSING, AND TO ALLOWr2; THIS MODULE TO BE PLACED IN THE DIRECTIVE COMMON;I;D .PAGE;+.; DEFINE BITS FOR THE DIRECTIVE DISPATCH TABLE;-;I; THE DIRECTIVE DISPATCHER BITS OCCUPY A WORD FLAG TABLE. THERE ARE THREEU.; GROUPS OF BITS, SHOWN WITH SUBOPTIONS BELOW:;IF; ACHKDB - ADDRESS CHECK AND MAP PLAS DEFINITION BLOCK. THE DPB IS TWO<; WORDS, THE SECOND OF WHICH IS THE ADDRESS OF A REGION OR;; WINDOW DEFINITION BLOCK, 8 WORDS LONG. THE STURCTURE ISE@; ADDRESS CHECKE AND MAPPED, AND IF VALID IS PASSED IN LIEU OF%; THE DPB TO THE DIRECTIVE ROUTINE.N;IE; CEFNCL - CALL $CEFN. THE DPB CONTAINS AN EVENT FLAG NUMBER WHICH IS); CONVERTED TO A MASK WORD AND ADDRESS.Y;WE; CEFNMT - AN ERROR OF D.RS97 IS RETURNED IF THE EFN IN THE DPB ISN&; NULL (NO EVENT FLAG SPECIFIED).;DA; GEFUSE - IF THE SPECIFIED EVENT FLAG IS GROUP GLOBAL, DO NOTF; INCREMENT THE USE COUNT. ;D; SRSTCL - DIRECTIVE DEALS WITH A TCB, DPB CONTAINS NAME. DISPATCHER=; CALLS $SRSTD (OR SIMILAR) AND RETURNS ERROR D.RS2 IF TASKH*; SPECIFIED IN THE DPB IS NOT INSTALLED.;-D; DFCTSK - IF THE TASK NAME IN THE DPB IS NULL (BINARY ZERO), THE; CURRENT TASK IS USED.E; MUPCHK - MULTI-USER PROTECTION CHECKS. THE TARGET TASK MUST HAVEE<; THE SAME TI: AS THE ISSUING TASK, OR THE ISSUING TASK; MUST BE PRIVILEGEDTF; CRETCB - IPLIES THAT THE DIRECTIVE MAY CREATE A TCB FROM A PROTO-=; TYPE, AND THEREFORE SUPPRESSES THE SEARCH FOR A MULTI-H9; USER COPY OF THE TASK FROM THIS TERMINAL. (IMPLIESF; SECTCB)A; SECTCB - THIS DIRECTIVE MAY DEAL WITH TCBS IN SECONDARY POOLA@; USEURT - THIS DIRECTIVE CAN USE THE UNIVERSAL RECEIVER TASK-; IF ITS TARGET TASK IS NOT FOUNDS;H@; ANY SUB-FUNCTION BIT IMPLIES THE MAJOR FUNCTION BIT. THE THREE); MAJOR FUNCTIONS ARE MUTUALLY EXCLUSIVE.E;T>; THE POSITION OF THE BITS WITHIN THE FLAGS WORD IS AS FOLLOWS;RA; 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0HD; +---+---+----+---+---+---+---+---+---+---+---+---+---+---+---+---+D; | | | | | | | | | | | | | | | | |D; | A | S | DC | M | U | | C | G | S | C | | | | | | |D; | C | E | FR | U | S | | E | E | R | E | | | | | | |D; | H | C | CE | P | E | | F | F | S | F | | | | | | |D; | K | T | TT | C | U | | N | U | T | N | | | | | | |D; | D | C | SC | H | R | | M00By$xibjbkb a a a | S | C | C | | | | | | |D; | B | B | KB | K | T | | T | E | L | L | | | | | | |D; | | | | | | | | | | | | | | | | |D; +---+---+----+---+---+---+---+---+---+---+---+---+---+---+---+---+; |;|); SPECIAL NOTE REGARDING PLAS DIRECTIVES:E;R>; ALL DIRECTIVES SPECIFYING "ACHKDB" MUST BE BUILT IN THE PLASD; DIRECTIVE COMMON (OR RESIDENT IN THE EXEC) SINCE THAT BIT TRIGGERSB; THE REMAPPING OF THE DIRECTIVE COMMON. THESE DIRECTIVES MUST USE=; THE DIRP MACRO SO THAT THE ADDRESSES ARE STORED UNADJUSTED.| .PAGE ACHKDB = 100000 CEFNCL = 100 CEFNMT = 1000!CEFNCL| GEFUSE = 400!CEFNCL  SRSTCL = 200 SECTCB = 40000!SRSTCL+ DFCTSK = 20000!SRSTCL- CRETCB = 20000!SRSTCL!SECTCB MUPCHK = 10000!SRSTCLA USEURT = 4000!SRSTCL!SECTCB;+; LOCAL MACROS;-;E'; DEFINE DIRECTIVE DISPATCH TABLE ENTRYR;S; DIR ADDR,SIZE,MASK,COND,SCOND ;G; WHERE:;E?; ADDR=ADDRESS OF THE DIRECTIVE EXECUTION ROUTINE OR '.FALSE.'. 9; SIZE=SIZE OF THE DPB REQUIRED BY THE DIRECTIVE ROUTINE.;; MASK=CONTROL BITS TO BE USED BY THE DIRECTIVE DISPATCHER.0:; COND=EXPRESSION ON WHICH DIRECTIVE IS CONDITIONALIZED. A2; DEFAULT OF $DSTAB IS USED FOR CONVENIENCE (I.E.; UNCONDITIONAL).:; SCOND=CONDITIONAL EXPRESSION ON WHICH SIZE BYTE IS TO BE3; ZERO (VARIABLE-LENGTH DPB). A DEFAULT OF XXXXXXE2; IS USED FOR CONVENIENCE (I.E. SIZE IS NONZERO).;C .PAGE% .MACRO DIR ADDR,SIZE,MASK,COND,SCONDT .IF IDN ,<.FALSE.>E DIRC .FALSE.  T .IFFR# DIRC ADDR,0,SIZE,,COND,SCONDA .ENDC .ENDM DIR& .MACRO DIR2 ADDR SIZE,MASK,COND,SCOND( DIRC ADDR,100000,SIZE,,COND,SCOND .ENDM DIR2U& .MACRO DIRP ADDR SIZE,MASK,COND,SCOND& DIRC ADDR,REAL,SIZE,,COND,SCOND .ENDM DIRPH .PAGE8 .MACRO DIRC ADDR,COM,SIZE,MASK,COND=$DSTAB,SCOND=XXXXXX .IF EQ PASS-1 .BLKW 3 .IF DIF ,<.FALSE.>O .IF DF COND HI$DIC==<<.-$DSTAB>/6>-1, .GLOBL ADDR .ENDC ; DF COND .ENDC ; DIF ,<.FALSE.>E .IFF ; EQ PASS-1R .IF GT TB$SIZ-<.-$DSTAB>C .WORD 0$$$=. .=.+TB$SIZ-2. .WORD 0 .=.+TB$SIZ-2, .WORD 0 .=$$$ .IF DIF ,<.FALSE.>D .IF DF CONDDSPMK=0 .IF NB  .IRP X, DSPMK=DSPMK!XR .ENDM .ENDC ;NB D .IF DF SCONDMDSPSZ=0 .IFFE DSPSZ=SIZE*2 .ENDC ; DF SCOND,HI$DIC==<<.-$DSTAB>/2>-1.=.-2  .IF GT 28.-DSPSZ. .BYTE DSPSZ,-<2*DSPSZ> .IFF  .BYTE DSPSZ,0 .ENDC ; GT 28.-DSPSZB .=.+TB$SIZ-2D .IF DIF ,R .WORD <&77777>!COM- .IFF ; DIF , .WORD ADDR$ .ENDC ; DIF ,0 .=.+TB$SIZ-2 .WORD DSPMK .=$$$ .ENDC ; DF COND .ENDC ; DIF ADDR,<.FALSE.> .ENDC ; GT TB$SIZ-<.-$DSTAB> .ENDC ; EQ PASS-1 .ENDM .PAGE;+-; DEFINE SYMBOL INDICATING WHICH PASS THIS IS;- .IF NDF PASS PASS = 1- .IFF/ PASS = 2  .ENDC;+; DIRECTIVE DISPATCH TABLE;-+$DSTAB::DIR2 $DRQIO,12. ;001.-QUEUE I/OB- DIR2 $DRQIO,12. ;003.-QUEUE I/O AND WAIT= DIR2 $DRGLI, 3., ,,G$$DVI ;005.-GET LUN ASSIGNMENT ANDO ; GET DEVICE INFORMATION$ DIR $DRASG, 4. ;007.-ASSIGN LUN. DIR $DRATP, 4.,DFCTSK ;009.-ALTER PRIORITY4 DIR2 $DRREQ, 7.,CRETCB,,P$$OFF ;011.-REQUEST/SPAWN# DIR .FALSE. ;013.-INVALID DICI# DIR .FALSE. ;015.-INVALID DICI) DIR $DRRUN,11.,SRSTCL ;017.-RUN TASK/# DIR .FALSE. ;019.-INVALID DICV1 DIR2 $DRRRA, 2., ,P$$LAS ;021.-REC BY REF AST * DIR $DRMKT, 5.,CEFNCL ;023.-MARK TIME8 DIR $DRCSR, 3.,MUPCHK ;025.-CANCEL SCHEDULE REQUESTS5 DIR $DRCMS, 0. ;027.-CANCEL SELECTIVE MARK TIMESA3 DIR2 $DREXS, 2., ,P$$OFF ;029.-EXIT WITH STATUST6 DIR $DRCEF, 2., ;031.-CLEAR EVENT FLAG4 DIR $DRSEF, 2., ;033.-SET EVENT FLAG3 DIR $DRDSE, 1. ;035.-DECLARE SIGNIFICANT EVENTI5 DIR $DRREF, 2., ;037.-READ EVENT FLAGA8 DIR $DRRAF, 0. ;039.-READ ALL(EXTENDED) EVENT FLAGS6 DIR $DRWFS, 2.,CEFNMT ;041.-WFR SINGLE EVENT FLAG/ DIR $DRWFL, 3. 00Jy;yt__DATADATADATADATA ;043.-WAITFOR LOGICAL OR OFL ; EVENT FLAGSR+ DIR $DRSPN, 1. ;045.-SUSPEND EXECUTIONA6 DIR $DRRES, 3.,DFCTSK ;047.-RESUME TASK EXECUTION3 DIR $DRWSE, 1. ;049.-WAITFOR SIGNIFICANT EVENTG# DIR $DREXT, 1. ;051.-TASK EXIT3- DIR $DREIF, 2., ;053.-EXIT IFL4 DIRP $DRCRR, 2.,ACHKDB,P$$LAS ;055.-CREATE REGION4 DIRP $DRATR, 2.,ACHKDB,P$$LAS ;057.-ATTACH REGION4 DIRP $DRDTR, 2.,ACHKDB,P$$LAS ;059.-DETACH REGION- DIR $DRGTP, 0. ;061.-GET TIME PARAMETERS - DIR $DRGTK, 2. ;063.-GET TASK PARAMETERS 2 DIR $DRGPP, 4. ;065.-GET PARTITION PARAMETERS# DIR .FALSE. ;067.-INVALID DIC47 DIR $DRSRF, 5.,SECTCB,P$$LAS ;069.-SEND BY REFERENCEO .IF DF P$$OOL> DIR $DRSND, 0.,USEURT ;071.-SEND (AND VARIABLE SEND) DATA .IFF32 DIR $DRSND, 5.,SRSTCL ;071.-SEND DATA TO TASK .ENDC# DIR .FALSE. ;073.-INVALID DICA .IF DF P$$OOL/ DIR $DRREC, 0. ;075.-RECEIVE (AND VARIABLER ; REC) DATA 8 DIR $DRREC, 0. ;077.-REC (AND VAR REC) DATA OR EXIT .IFFD0 DIR $DRREC, 4. ;075.-RECEIVE DATA FROM TASK8 DIR $DRREC, 4. ;077.-RECEIVE DATA FROM TASK OR EXIT .ENDC# DIR .FALSE. ;079.-INVALID DICO7 DIRP $DRRRF, 2.,ACHKDB,P$$LAS ;081.-RCV BY REFERENCE + DIR $DRABO, 3.,MUPCHK ;083.-ABORT TASKL# DIR .FALSE. ;085.-INVALID DICC# DIR .FALSE. ;087.-INVALID DIC 3 DIR2 $DREXP, 3., ,E$$XPR ;089.-EXTEND PARTITION-# DIR .FALSE. ;091.-INVALID DIC # DIR .FALSE. ;093.-INVALID DIC-/ DIR $DRDCP, 1. ;095.-DISABLE CHECKPOINTING$. DIR $DRECP, 1. ;097.-ENABLE CHECKPOINTING1 DIR $DRDAR, 1. ;099.-DISABLE AST RECOGNITIONT0 DIR $DREAR, 1. ;101.-ENABLE AST RECOGNITION0 DIR $DRSDV, 3. ;103.-SPECIFY ODT SST VECTOR1 DIR $DRSTV, 3. ;105.-SPECIFY TASK SST VECTORT0 DIR2 $DRRCV, 2. ;107.-SETUP FOR RECEIVE AST9 DIR2 $DRPUT, 2., ,P$$RFL ;109.-SETUP FOR POWER UP AST 4 DIR2 $DRFEX, 2., ,F$$LPP ;111.-SETUP FOR FLP AST5 DIR $DRGMX, 2., ,P$$LAS ;113.-GET MAPPING CONTEXTR' DIR $DRATX, 1. ;115.-AST TRAP EXIT< DIRP $DRCRW, 2.,ACHKDB,P$$LAS ;117.-CREATE ADDRESS WINDOW? DIRP $DRELW, 2.,ACHKDB,P$$LAS ;119.-ELIMINATE ADDRESS WINDOWN9 DIRP $DRMAP, 2.,ACHKDB,P$$LAS ;121.-MAP ADDRESS WINDOW ; DIRP $DRUNM, 2.,ACHKDB,P$$LAS ;123.-UNMAP ADDRESS WINDOWT4 DIR $DRGSS, 1., ,G$$TSS ;125.-GET SENSE SWITCHES/ DIR2 $DRGCL, 0. ;127.-GET MCR COMMAND LINEU; DIR2 $DRCIN, 7., ,C$$INT ;129.-CONNECT TO INTERRUPT# DIR $DRSTP, 1. ;131.-STOP TASK + DIR $DRUNS, 3.,DFCTSK ;133.-UNSTOP TASKS1 DIR $DRSTS, 2.,CEFNMT ;135.-STOP FOR SNGL EFN.6 DIR $DRSTL, 3. ;137.-STOP FOR LOGICAL OR OF EFN'S .IF DF P$$OOL/ DIR $DRRCS, 0. ;139.-RECEIVE (AND VAR REC). ; DATA OR STOP .IFF.. DIR $DRRCS, 4. ;139.-RECEIVE DATA OR STOP .ENDC+ DIR2 $DRSRC, 0.,USEURT,P$$OFF ;141.-SDRCG6 DIR2 $DRCNC, 6.,SRSTCL,P$$OFF ;143.-CONNECT TO TASK9 DIR2 $DRLOG, 0., ,C$$RLG ;145.-ELP DIRECTIVES FOR CPR1. DIR2 $DREMS, 4., ,P$$OFF ;147.-EMIT STATUS9 DIR $DRCRV, 5., ,V$$TRM ;149.-CREATE VIRTUAL TERMINALF< DIR $DRELV, 2., ,V$$TRM ;151.-ELIMINATE VIRTUAL TERMINAL# DIR .FALSE. ;153.-INVALID DICR6 DIR $DRSCA, 3., ,S$$LIB ;155.-SUPERVISOR MODE CALL5 DIR $DRCRE, 2., ,G$$GEF ;157.-CREATE GROUP GLOBALE ; EVENT FLAGS8 DIR $DRELE, 0., ,G$$GEF ;159.-ELIMINATE GROUP GLOBAL ; EVENT FLAGS42 DIR $DRSAF, 2., ,M$$PRO ;161.-SPECIFY AFFINITY1 DIR $DRRMA, 1., ,M$$PRO ;163.-REMOVE AFFINITYO> DIR2 $DRPER, 2., ,P$$RTY ;165.-SET UP FOR PARITY ERROR AST8 DIR2 $DRREX, 0. ;167.-SET UP FOR REQUESTED EXIT AST? DIR2 $DRGIN, 0., ,R$$GIN ;169.-GET / PUT SYSTEM INFORMATIONR@ DIR2 $DRSMG, 0., ,E$$LOG ;171.-SEND MESSAGE TO ERROR LOGGING0 DIR2 $DRCLI, 0., ,A$$CLI ;173.-CLI DIRECTIVE. DIR $DRSWS, 3., ,S$$WST ;175.-SWITCH STATE9 DIR $DRFEA, 2., ,R$$FEA ;177.-FEAT$ TEST FEATURE MASKDC DIR $DRSND, 0.,SECTCB!USEURT ;179.-SEND (AND VARIABLE SEND) DATAM ; AND 00RyUyibjbkb a a aUNSTOP3 DIR .FALSE. ;181.-RESERVED RSX-11M FUTURE USEA3 DIR .FALSE. ;183.-RESERVED RSX-11M FUTURE USE 3 DIR .FALSE. ;185.-RESERVED RSX-11M FUTURE USE.3 DIR .FALSE. ;187.-RESERVED RSX-11M FUTURE USE$3 DIR .FALSE. ;189.-RESERVED RSX-11M FUTURE USEC- DIR .FALSE. ;191.-RESERVED FOR USER USER- DIR .FALSE. ;193.-RESERVED FOR USER USER- DIR .FALSE. ;195.-RESERVED FOR USER USES- DIR .FALSE. ;197.-RESERVED FOR USER USE(- DIR .FALSE. ;199.-RESERVED FOR USER USET; DIR $DRSMP, 2., ,S$$MAP ;201.-MODIFY SUPERVISOR MAPPINGR6 DIR $DRMVS, 4., ,S$$MAP ;203.-MOVE TO/FROM VARIOUS ; TASK SPACESR' DIR2 $DRCPC, 3., ,C$$PCR ;205.-CPCR7A DIR2 $DRLOG, 0., , ;207.-LOGICAL NAME DIRECTIVESX= DIR $DRTFE, 2., ,R$$FEA ;209.-TFEA$ TEST TASK FEATURER; DIR $DRBOM, 3. ;211.-BREAKPOINT OR MESSAGE.; DIRP $DRRRF, 2.,ACHKDB,P$$LAS ;213.-RECEIVE DATA OR STOPE4 DIR .FALSE. ;209.-RESERVED RSX-11M+ FUTURE USEA.=$DSTAB+<*6> ;TRUNCATE UNUSED PORTION OF TABLE AT ENDA TB$SIZ == <.-$DSTAB>/3S .END203.-MOVE TO/FROM VARIOUS ; TASK SPACESR' DIR2 $DRCPC, 3., ,C$$PCR ;205.-CPCR7A DIR2 $DRLOG, 0., , ;207.-LOGICAL NAME DIRECTIVESX= DIR $DRTFE, 2., ,R$$FEA ;209.-TFEA$ TEST TASK FEATURER; DIR $DRBOM, 3. ;211.-BREAKPOINT OR MESSAGE.; DIRP $DRRRF, 2.,ACHKDB,P$$LAS ;213.-RECEIVE DATA OR STOPE4 DIR .FALSE. ;209.-RESERVED RSX-11M+ FUTURE USEA.=$DST .TITLE DRDSP6 .IDENT /15.02/E;O1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reservedM;R;S<; 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 12-AUG-73; ); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:;R+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:O;E; J. R. KAUFFMAN; J. M. LAWLER ; T. LEKASC; B. S. MCCARTHY;D+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:E;E; B. S. MCCARTHY; L. B. MCCULLEY;.+; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:,;c; B. S. MCCARTHY;h+; MODIFIED FOR RSX-11M-PLUS VERSION 4.2 BY:I;D; B. S. MCCARTHY;M+; MODIFIED FOR RSX-11M-PLUS VERSION 4.4 BY:T;H ; B. S. MCCARTHY 27-JUL-88 15.02; 6; BM430 -- ADD ABILITY TO USE UNIVERSAL RECEIVER TASK; ; DIRECTIVE DISPATCHER;X; MACRO LIBRARY CALLSY;# .MCALL HDRDF$,HWDDF$,TCBDF$,WDBDF$   E% HDRDF$ ;DEFINE TASK HEADER OFFSETSF$ HWDDF$ ;DEFINE HARDWARE REGISTERS, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS/ WDBDF$ ;DEFINE USER WINDOW DEF BLOCK OFFSETSS;CH; DEFINE SIZE OF LARGEST DPB TO BE COPIED INTO EXEC. ANY CHANGES TO THIS?; ASSIGNMENT MUST BE REFLECTED IN THE DPB BUFFER SIZE IN SYSCM.S;C% DPBMAX = 16. ;RPOI IS 16 WORDS LONGD;+; **-$TRTRP-TRAP TRAPR;IH; THIS ROUTINE IS TRAPPED TO WHEN A TRAP INSTRUCTION IS EXECUTED. IF THEF; STACK DEPTH IS ZERO, THEN A DIRECTIVE STATUS IS TO BE RETURNED. ELSE=; CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE.F; ; INPUTS:L;O+; 2(SP)=PS WORD PUSHED BY TRAP INSTRUCTION. +; 0(SP)=PC WORD PUSHED BY TRAP INSTRUCTION.D;T ; OUTPUTS:;OB; IF THE STACK DEPTH IS ZERO, THEN A DIRECTIVE STATUS IS RETURNED.B; ELSE CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE.;- .ENABL LSB- .IF NDF D$$PARH($TRTRP::TST $STKDP ;;;STACK DEPTH ZERO? BNE $EMTRP ;;;IF NE NO4 MOV (SP)+,R0 ;;;GET ADDRESS + 2 OF TRAP INSTRUCTION( MFPI -(R0) ;;;PICK UP TRAP INSTRUCTION .IFF ; NDF D$$PAR2$TRTR1:: ;REFERENCE LABEL FOR DRSUB TRAP HANDLER .ENDC ; NDF D$$PARI+ MOVB (SP)+,R0 ;;;RETRIEVE DIRECTIVE STATUSD6 MOV (SP),PS ;;;RESTORE TRAP PS FOR CORRECT PREV MODE- MOV #$STACK-22,SP ;RELOAD EXEC STACK POINTERL$ MOV R0,-(SP) ;SAVE DIRECTIVE STATUS BPL 1$ ;IF PL OKAY AS IS S( INC @$USRPS ;SET CARRY IN USER PS WORD .IF DF G$$GEF* JMP 60$ ;IF ERROR SKIP GGEF COUNT UPDATE .ENDC ; DF G$$GEF&1$: JMP 59$ ;GO UPDATE GGEF USE COUNT R;+; **-$EMTRP-EMT TRAP;H; TH00Zy;yt__DATADATADATADATAIS ROUTINE IS TRAPPED TO WHEN AN EMT INSTRUCTION IS EXECUTED. IF THEC; STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED. ELSE A TEST IS;D; MADE TO SEE IF THE EMT INSTRUCTION HAD A CODE OF 377. IF NOT, THENF; CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE. ELSE THE$; APPROPRIATE DIRECTIVE IS EXECUTED.;I ; INPUTS:O;*; 2(SP)=PS WORD PUSHED BY EMT INSTRUCTION.*; 0(SP)=PC WORD PUSHED BY EMT INSTRUCTION.; ; OUTPUTS:;D@; IF THE STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED. ELSEE; CONTROL IS GIVEN TO THE EMT/TRAP SST ROUTINE OR A DIRECTIVE ROUTINE 1; DEPENDENT ON WHETHER THE EMT HAD A CODE OF 377.E;-;T>; DETERMINE IF LEGITIMATE ENTRY FROM USER STATE. IF NOT, CRASH;T .IF NDF D$$PARS0$EMTRP::TST $STKDP ;;;ARE WE AT STACK DEPTH +1? BGT 2$ ;;;IF GT YESI! JMP $CREMT ;;;ELSE CRASH SYSTEMO;@; DETERMINE IF ENTRY WAS VIA EMT 377. IF NOT PROCESS NON-RSX EMT;B/2$: DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITYS .IFF ; NDF D$$PAR2$EMTR1:: ;REFERENCE LABEL FOR DRSUB TRAP HANDLER .IF DF K$$DAS1 MOV $DRAPR,KDSAR5 ;MAP COMMON IN I-SPACE AS WELLH .ENDC ; DF K$$DAS .ENDC ; NDF D$$PARE 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?G BEQ 3$ ;IF EQ YES L$ JMP 80$ ;HANDLE NON-RSX EMT TRAP ;Y:; PUSH ASSUMED SUCCESFUL STATUS. DIRECTIVE PROCESSORS MAY:;;6; RETURN, IN WHICH CASE THE +1 IS THE DIRECTIVE STATUS=; OVERWRITE THE +1 AND RETURN, IN WHICH CASE THE NEW VALUE ISD ; THE STATUSV=; ISSUE A TRAP INSTRUCTION, IN WHICH CASE THE LOW BYTE OF THE$; TRAP IS THE RETURNED STATUS;V23$: MOV #1,(SP) ;SET SUCCESSFUL DIRECTIVE STATUS  S; 9; IN ACCOUNTING SYSTEMS, CHARGE THE TASK WITH A DIRECTIVE3;(  .IF DF A$$CNT B, MOV $TKTCB,R0 ;POINT TO TCB OF CURRENT TASK/ MOV T.ACN(R0),R0 ;LOCATE ITS ACCOUNTING BLOCKSU BEQ 5$ ;IF EQ, NO ACCOUNTING3 MOV #B.DIR,R1 ;GET OFFSET TO DIRECTIVE COUNT FIELDT( CALL $ADAT1 ;INCREMENT DIRECTIVE COUNT5$: ; W .ENDC  T;S5; POINT TO AND INITIALIZE DRDSP SCRATCH AREA IN DRTBLO;Y5 MOV #$USRPS,R5 ;POINT TO DISPATCH TABLE SCRATCH AREA & MOV R3,(R5)+ ;SAVE ADDRESS OF USER PS, BIC (SP),(R3)+ ;CLEAR CARRY IN USER PS WORD CLR (R5) ;INDICATE NO BYTES ;.E; BEGIN VALIDATION OF DPB. GET TOP WORD OF STACK, CHECK TO SEE IF THEA:; DPB IS ON THE STACK (ODD) OR POINTED TO BY STACK (EVEN).;CH; BETWEEN THE LABELS $DRLM1 AND $DRLM2, AN SST IN THE EXEC IS TREATED ASI; NON-FATAL AND IS CONVERTED TO A DIRECTIVE STATUS RETURN OF IE.ADP. THISOI; WAY WE CAN JUST ACCESS THE DPB WITHOUT THE EXPENSE OF ADDRESS CHECKING. ;P$ MFPI SP ;GET USER STACK POINTER  MOV (SP)+,R3 ;F3$DRLM1:: ;START OF AREA OF ALLOWED TRAPS IN SSTSRD- ;(BREAKPOINTS IN THIS AREA WILL NOT WORK)A/ MFPD$ (R3)+ ;GET FIRST WORD ON USER STACK ANDS! ;ADVANCE PAST IF DPB ON STACKO BIT #1,(SP) ;DPB ON STACK? BNE 10$ ;IF NE YES ;EF; DPB IS POINTED TO BY TOP OF STACK. SET $BTRMV TO 2 INDICATING REMOVEI; ONLY ADDRESS FROM STACK. REPLACE TOP WORD ON KERNEL STACK (DPB ADDRESS)S; WITH FIRST WORD OF DPB.E;P/ MOV #2,(R5) ;INDICATE DPB POINTED TO BY STACKE! MOV (SP)+,R3 ;SET ADDRESS OF DPBF1 MFPD$ (R3)+ ;GET FIRST WORD OF DPB AND POINT TOS ;SECONDA;I:; PICK UP FIRST DPB WORD FROM STACK, EXTRACT DIC, DPB SIZE; )10$: MOV (SP),R1 ;PICK UP FIRST DPB WORDB; G; INITIALIZE FLAG WHICH INDICATES DPB VALID/INVALID. IF THIS IS A VALIDSH; DIRECTIVE, WE WILL REPLACE THIS FLAG WITH THE ADDRESS OF THE DIRECTIVE; PROCESSING ROUTINE LATER.W; * CLR (SP) ;ASSUME ILLEGAL DIC OR DPB WORD MOV R1,R4 ;COPY FIRST DPB 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 ?  BNE 15$ ;IF NE NO + MOV R4,-2(R5) ;SET BYTES TO REMOVE ON EXIT/,15$: MOV R1,(R5)+ ;SAVE FIRST WORD IN $DICSV;L; WE NOW HAVE:;WB; R0 = DIRECTIVE IDENT00byUyibjbkb a a aIFICATION CODE (DIC) ZERO PADDED TO 16 BITS.?; R1 = DPB SIZE IN BYTES (NUMBER OF BYTES TO REMOVE FROM STACK)S+; R3 = VIRTUAL ADDRESS OF FIRST WORD IN DPB ; @; $DICSV = FIRST WORD OF DPB (SAVED COPY SO THAT COMMON ROUTINES/; CAN DETERMINE WHICH DIRECTIVE WAS EXECUTED);L; -; INITIALIZE GROUP GLOBAL EVENT FLAG POINTERS+;D .IF DF G$$GEF8 MOV #$GEFPT+2,$GEFPT ;INIT GRP GLOBAL USE COUNT POINTER7 MOV #$GEFPT+2,$GFTCB ;INIT GRP GLOBAL USER TCB POINTER  .ENDC ; DF G$$GEF;RD; VALIDATE DIC AND CONVERT TO POINTER INTO TABLE OF TWO WORD ENTRIES; FOR DIRECTIVES.R;  ASR R0 ;DIVIDE CODE BY 2 BCC 357$ ;IF CC ILLEGAL DICS% CMP R0,#HI$DIC ;IS DIC OUT OF RANGE?R BHI 357$ ;IF HI YES ( ASL R0 ;CONVERT TO DOUBLE WORD INDEX 2 ADD #$DSTAB+1,R0 ;POINT TO COMPLEMENT OF DPB SIZE;PE; GET NEGATIVE OFFSET INTO MOVE TABLE FROM DIRECTIVE TABLE. THIS USESE1; THE LEFTOVER BYTE AND SAVES A FEW INSTRUCTIONS.T;$* MOVB (R0),R2 ;GET COMPLEMENT OF LENGTH*4;NG; VALIDATE THAT EITHER DPB SIZE MATCHES THAT SHOWN IN THE TABLE OR THAT ?; THE DIRECTIVE CODE WILL VERIFY THE SIZE (SIZE IN TABLE = 0 ).Y; 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 YES4 TSTB (R0) ;DEFER CHECKING FOR VARIABLE LENGTH DPB?+346$: BNE 357$ ;IF NE NO, ILLEGAL DPB SIZEH MOV R4,R2 ;COPY SIZE IN BYTES ASL R2 ;CONVERT TO DOUBLEWORDS9 CMP #DPBMAX*4,R2 ;DPB SIZE BIGGER THAN TRANSFER VECTOR ?A' BLO 357$ ;IF LO YES, ILLEGAL DPB SIZEH NEG R2 ;CREATE JUMP INDEXT; E; REPLACE ZERO FLAG ON STACK WITH ADDRESS OF PROCESSING ROUTINE. THISP5; 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 DICD4 MOV 2*TB$SIZ(R0),R4 ;GET PROCESSING MASK FLAGS BYTE;I=; PROCESS " A C H K D B " FLAG - ADDRESS CHECK AND MAP 8 WORDA; PLAS DEFINITION BLOCK.;CE; FOR PLAS DIRECTIVES, WE TAKE THE ONE PARAMETER OUT OF THE DPB. THISFB; PARAMETER IS THE ADDRESS OF AN 8 WORD STRUCTURE (RDB OR WDB). WEE; VALIDATE READ/WRITE ACCESS TO THE BLOCK AND PASS THIS BLOCK, RATHERI4; THAN THE DPB, TO THE DIRECTIVE PROCESSING ROUTINE.;::; ON SYSTEMS SUPPORTING EXTERNAL TASK HEADERS, THE WDB/RDB7; IS COPIED INTO THE EXECUTIVE INTERMEDIATE BUFFER AREAC;; (STARTING ADDRESS $DICSV) SO THAT KERNEL APR6 CAN BE USEDAB; EXCLUSIVELY TO MAP THE ISSUING TASK HEADER. SINCE THE DIRECTIVE=; PROCESSING ROUTINES WILL NOT BE MANIPULATING THE USERS COPYIB; OF THE WDB/RDB, IT WILL BE NECESSARY TO RETURN ANY OUTPUT FIELDSA; OF THE WDB/RDB AT THE COMPLETION OF DIRECTIVE PROCESSING ALONG RB; WITH THE NORMAL DSW RETURN CODE. THE WORD CONTAINING THE NUMBER@; OF BYTES TO ADD TO THE USERS SP AT THE COMPLETION OF DIRECTIVE@; PROCESSING ($BTRMV) IS NEGATED TO INDICATE THAT THE ADDITIONAL@; OUTPUT FIELDS OF THE WDB/RDB MUST BE WRITTEN TO THE USER TASK.;E .IF DF P$$LAS S R& BPL 345$ ;IF PL NOT A PLAS DIRECTIVEF; PUSH ADDRESS OF INTERMEDIATE LINKAGE FOR DISPATCHER FOR INTERMEDIATEE; CALL TO THIRD DIRECTIVE COMMON (NOTE THAT FOR THIS CASE, DRTBL DOESV%; NOT HAVE THE ADDRESS SHIFTED RIGHT. 3 MOV #$DRCL3,-(SP) ;PUSH ADDRESS OF LINKAGE ROUTINEB1 MFPD$ (R3) ;PICK UP POINTER TO DEFINITION BLOCKC MOV (SP)+,R3 ;G. MFPD$ (R3) ;READ/WRITE ACCESS TO FIRST WORD? MTPD$ (R3) ;/ MFPD$ 16(R3) ;READ/WRITE ACCESS TO LAST WORD?T MTPD$ 16(R3) ; .IF DF X$$HDR9 NEG $BTRMV ;INDICATE ADDITIONAL OUTPUT FIELDS TO RETURND .ENDC ; DF X$$HDR" MOV #16.,R2 ;SET SIZE FOR $RELCD+ CALL $RELCD ;RELOCATE/MAP PLAS DEF. BLOCK  .IF DF X$$HDR- MOV R3,(R5)+ ;SAVE KERNEL VA OF USER WDB/RDB1 MOV KISAR6,(R5)+ ;SAVE KERNEL MAPPING TO WDB/RDBN  .REPT K2 MOV (R3)+,(R5)+ ;COPY USER WDB/RDB TO EXEC BUFFER $ .ENDR D, MOV #$DICSV+6,R3 ;POINT TO INTERNAL RDB/WDB. MOV $SAHDB,KISAR6 ;MAP TO CURRENT TASK HEADER .ENDC ; DF X$$HDR, BIC #WS.CRW!WS.UNM!WS.ELW!WS.RRF,W.NSTS(R3). MOV $TKTCB,R5 ;POINT TO TASK TCB FOR ROUT00jy;yt__DATADATADATADATAINES$ JMP 51$ ;JOIN COMMON DISPATCH CODE .ENDC ; DF P$$LAS F345$: ;REFERENCE LABEL;MD; HERE WE SPECIAL CASE THE GMCR$ DIRECTIVE AND ADDRESS CHECK THE DPBE; SINCE THE MFPD$ CHECKS WON'T WORK FOR DPB'S GREATER THAN 32. WORDS.;;Y+ CMP (PC)+,R1 ;MCR COMMAND LINE DIRECTIVE ? .BYTE 127.,41. ;DIC, DPB SIZE BNE 35$ ;IF NE NOA+ SUB #2,R3 ;POINT BACK TO BEGINNING OF DPBN+ ;(CAN'T USE TST, R3 NOT KERNEL ADDRESS)W) MOV #41.*2,R1 ;SET SIZE TO ADDRESS CHECKO5 CALL $ACHKP ;ADDRESS CHECK AND MAP BLOCK READ/WRITE 0 TST (R3)+ ;ADVANCE PASTFIRST WORD (TST OK NOW) BR 355$ ; ;EF; HERE WE "ADDRESS CHECK" THE DPB BY COPYING IT TO AN INTERNAL BUFFER.A; THIS IS FASTER THAN A REAL ADDRESS CHECK AND ELIMINATES SEVERAL.; MAPPING PROBLEMS.C;R-35$: JMP $DRLM2(R2) ;JUMP INTO TABLE OF MOVES1 .REPT DPBMAX) MFPD$ (R3)+ ;GET ONE WORD FROM USER DPB ( MOV (SP)+,(R5)+ ;AND PUT IT IN OUR COPY .ENDR;AD; THERE MUST BE EXACTLY TWO WORDS BETWEEN THE END OF THE MOVE VECTOR; AND THE LABEL $DRLM2.K;A( MOV #$DICSV+2,R3 ;POINT TO INTERNAL DPB; <; THIS IS THE END OF THE CODE WHICH IS PROTECTED FROM TRAPS.; .$DRLM2:: ;END OF AREA OF A ALLOWED TRAPS AND ;NO BREAKPOINTS.;SH; MAP THE CURRENT TASK HEADER IF EXTERNAL HEADER SUPPORT. IT WILL ETIHERG; STAY MAPPED THROUGH THE DIRECTIVE, OR BE REMAPPED TO SEC. POOL TCB IFE; THE DIRECTIVE CAN USE THEM.+;5 .IF DF X$$HDR. MOV $SAHDB,KISAR6 ;MAP TO CURRENT TASK HEADER .ENDC ; DF X$$HDR;FA; SET UP R5 TO POINT TO CURRENT TASK'S TCB FOR DIRECTIVE ROUTINESP;T355$: ;REFERENCE LABELS.357$: MOV $TKTCB,R5 ;POINT TO CURRENT TASK TCB;PE; SEE IF DIRECTIVE WAS LEGAL. IF NOT, SKIP FLAGS INTERPRETATION CODE.I;.# TST (SP) ;LEGAL DIC AND DPB SIZE?F BNE 37$ ;IF NE, YEST JMP 90$ ;IF EQ, ILLEGALP37$: ;REFERENCE LABEL; 7; BEGIN TO SET UP PARAMETERS FOR DISPATCHING TO ROUTINE ;M,; R5 = TCB ADDRESS OF TASK ISSUING DIRECTIVE;A SWAB R4 ;REARRANGE FLAGS TST R4 ;TEST FLAGS BEQ 50$ ;IF EQ NO OPTION CODEN$ BMI 40$ ;IF MI TASK ORIENTED FLAGS;=; PROCESS " C E F N C L " FLAG - CONVERT EVENT FLAG NUMBER TON; ADDRESS/BIT MASK PAIRC;EC; IF THE DIRECTIVE REQUIRES EVENT FLAG LOOKUP OR PROCESSING, DO SO.;;A- ROR R4 ;INCREMENT USE COUNT IF GRP GLOBAL ?P2 BCS 38$ ;IF CS DON'T INCREMENT GRP GBL USE COUNT3 CALL $CEFNG ;CONVERT EFN AND LOCK IF GROUP GLOBALT BR 39$ ;JOIN COMMON CODE38$: ;REF LABEL' CALL $CEFN ;CONVERT EVENT FLAG NUMBERT0 BIC #1,R1 ;CLR GROUP GLOBAL 2ND MASK INDICATOR)39$: BCC 50$ ;IF CC EVENT FLAG SPECIFIED; =; PROCESS " C E F N M T " FLAG - EVENT FLAG MUST BE SPECIFIED ;  ROR R4 ;EVENT FLAG REQUIRED ?T BCC 50$ ;IF CC NO, OKN;L#; REQUIRED EVENT FLAG NOT SPECIFIED;R$ DRSTS D.RS97 ;SET DIRECTIVE STATUS; ;; PROCESS " S R S T C L " FLAG - CALL $SRSTD TO LOOK UP TCB ;F; G; NOW PROCESS TASK LOOKUP OPTIONS. THE BEQ BELOW TAKES CARE OF BOTH THE D; CASE WHERE NO $SRSTD CALL IS SPECIFIED, AND THE CASE WHERE WE JUST"; FINISHED PROCESSING EVENT FLAGS.;:>; NOTE: ******************************************************; B; THIS SECTION SHOULD EVENTUALLY CALL $SRMUT EVEN IF $SRXXX FAILS.;E;TH; PROCESS " S E C T C B " FLAG - CALL $SRPRO TO LOOK UP TCB IN SECONDARY ; OR PRIMARY POOL TASK LISTS;/40$: ASLB R4 ;TASK ALLOW SECONDARY POOL TCBS ?T 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 TCB*+401$: CMP (R3)+,(R3)+ ;POINT PAST TASK NAMEN;L>; PROCESS " C R E T C B " FLAG - DIRECTIVE MAY CREATE TCB FROM; MULTI-USER TASK TCB.;O' ASLB R4 ;CAN DIRECTIVE CREATE A TCB ?P) BPL 43$ ;IF PL NO, DO MULTI-USER CHECKSO" BR 46$ ;ELSE YES, SKIP MU CHECKS;F?; $SRPRO OR $SRSTD COULD NOT FIND THE PROTOTYPE. SEE IF WE NEEDN1; TO SUBSTITUTE XXXTNN AND DO SO OR RETURN STATUSQ;1,402$: ASLB R4 ;CAN DIRECTIVE CREATE A TCB ?00ryUyibjbkb a a a' BMI 404$ ;IF MI YES, PROTO MUST EXISTM) ;(OR UNIVERSAL RECEIVER MUST BE USED))2403$: CMP (R3),#^R... ;TASK NAME FOLLOW MULTI-USER ;CONVENTION ? (...XXX)4 BNE 4035$ ;IF NE NO, PROTO MUST EXIST OR UNIVERSAL ;RECEIVER MUST BE TARGETED- MOV 2(R3),R1 ;SET FIRST HALF OF MU TASK NAMEK' MOV T.UCB(R5),R0 ;SET TERM UCB ADDRESSF( CMP (R3)+,(R3)+ ;ADVANCE PAST TASK NAME# MOV R3,-(SP) ;AND SAVE DPB POINTERT# CALL $SRMUT ;LOOK FOR MU TASK TCBQ" MOV (SP)+,R3 ;RESTORE DPB POINTER BCC 46$ ;IF CC MU TASK FOUND BR 404$ ;SKIP ENTRY POINT -4035$: CMP (R3)+,(R3)+ ;SKIP AROUND TASK NAME 5404$: BIT #40,R4 ;IS THIS DIRECTIVE ELIGIBLE TO USE E ;UNIVERSAL RECEIVER TASK?I BEQ 110$ ;IF PL NO. MOV $URTCB,R0 ;IS THERE A UNIVERSAL RECEIVER? BNE 46$ ;YES, USE IT BR 110$ ;ELSE ERRORK M;TC; PROCESS " D F C T S K " FLAG - TASK NAME DEFAULTS TO CURRENT TASKS;A3405$: ASLB R4 ;TASK NAME DEFAULT TO CURRENT TASK ?T BPL 41$ ;IF PL NO ' MOV R5,R0 ;PICK UP CURRENT TASK TCB 4 TST (R3) ;TASK NAME SPECIFIED? BEQ 42$ ;IF EQ NO 5-41$: CALL $SRSTD ;SEARCH STD FOR TASK NAME $$ BCS 403$ ;IF CS TASK NOT IN SYSTEM/42$: CMP (R3)+,(R3)+ ;ADVANCE PAST TASK NAME Q;0F; IF SPECIFIED TASK IS A MULTI-USER (...XXX) TASK, LOOK FOR LOCAL COPY;SC43$: CMP T.NAM(R0),#^R... ;DOES NAME FOLLOW MULTI-USER CONVENTION ?L BNE 46$ ;IF NE NO O" MOV R0,-(SP) ;SAVE TCB POINTER " MOV R3,-(SP) ;SAVE DPB POINTER < MOV T.NAM+2(R0),R1 ;PICK UP FIRST WORD OF COPY'S TASK NAME 8 MOV T.UCB(R5),R0 ;PICK UP TI: UCB FOR NAME CALCULATION 2 CALL $SRMUT ;SEARCH STD FOR MULTIUSER TASK COPY % MOV (SP)+,R3 ;RESTORE DPB POINTER T BCC 45$ ;IF CC COPY FOUND - MOV (SP),R0 ;RESTORE ORIGINAL TCB ADDRESS S 45$: TST (SP)+ ;CLEAN STACK 46$: ;REF LABEL ;PF; PROCESS " M U P C H K " FLAG - PERFORM MULTI-USER PROTECTION CHECKS.; 0 ASLB R4 ;PERFORM MULTI-USER PROTECTION CHECK ? BPL 49$ ;IF PL NO N2 BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED?  BNE 49$ ;IF NE YES 3 BIT #T3.SLV,T.ST3(R0) ;TARGET TASK A SLAVE TASK? L" BNE 120$ ;IF NE YES, DON'T ALLOW= CMP T.UCB(R5),T.UCB(R0) ;CURRENT AND TARGET TASK UCBS MATCH?I BNE 120$ ;IF NE NO;(4; SET UP PARAMETERS FOR DIRECTIVE PROCESSING ROUTINE; $49$: MOV R0,R1 ;COPY TCB ADDRESS , ADD #T.STAT,R1 ;POINT TO TASK STATUS WORD 50$: ;REFERENCE LABEL .IF DF D$$PAR1 ASL (SP) ;DIRECTIVE IN FIRST OR SECOND COMMON ?  BCC 51$ ;IF CC ITS IN FIRSTS3 MOV #$DRCL2,-(SP) ;PUSH ADDRESS OF LINKAGE ROUTINEY .ENDC ; DF D$$PAR751$: MOV R5,R2 ;SET POINTER TO SECOND TASK STATUS WORDE ADD #T.ST2,R2 ;;+; ** W A R N I N G **R; ; SPM HOOKPOINT NUMBER 01.;B); DO NOT CHANGE THE INSTRUCTION FOLLOWING ; LABEL WITHOUT CHECKING SPM;-+$SPH01==. ;SPM CHANGES THE INSTRUCTION AT# ;THE LOCATION OF THIS LABELO. MOV @#$SAHPT,R4 ;POINT TO CURRENT TASK HEADER;(6; CALL DIRECTIVE ROUTINE WITH THE FOLLOWING ARGUMENTS:; ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.3; R3=ADDRESS OF THE NEXT WORD IN THE DIRECTIVE DPB.R@; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.; R1=DEPENDENT ON DIRECTIVE.; R0=DEPENDENT ON DIRECTIVE.;)55$: CALL @(SP)+ ;CALL DIRECTIVE ROUTINE=  .IF DF D$$PAR4$DRFIN:: ;REFERENCE LABEL FOR COMMON LINK ROUTINES .ENDC ; DF D$$PAR;RA; INCREMENT GROUP GLOBAL USE COUNTS (OR SCRATCH WORD IF DIRECIVESN; DON'T USE GROUP GLOBALS);O59$: ;REFERENCE LABEL .IF DF G$$GEF/ INC @$GEFPT ;INCREMENT GROUP GLOBAL USE COUNTO1 INCB @$GFTCB ;INC GRP GLOBAL USE COUNT FOR TASKO .ENDC ; DF G$$GEF;R'; WRITE DIRECTIVE STATUS BACK INTO TASK ;E.60$: MTPD$ @#H.DSW ;SET DIRECTIVE STATUS WORD; D; IF THE NUMBER OF BYTES TO REMOVE FROM USER STACK IS NEGATIVE, THENE; WE HAVE JUST PROCESSED A PLAS DIRECTIVE. WE MUST RETURN THE OUTPUTNE; FIELDS TO THE USER TASK (RDB/WDB) FROM THE INTERMEDIATE BUFFER AREA ; ; OUTPUT FIELDS IN WDB/RDB;F6; W.NID W.NBAS W.NRID W.NLEN W.NOFF 00zyyt__DATADATADATADATAW.NSTS6; R.GID R.GSIZ R.GSTS;L E .IF DF X$$HDR. TST $BTRMV ;JUST FINISHED A PLAS DIRECTIVE ? BPL 65$ ;IF PLUS, NO NEG $BTRMV ;YES, TURN OFF FLAG4 MOV #$DICSV+2,R0 ;POINT TO INTERMEDIATE EXEC BUFFER+ MOV (R0)+,R1 ;RESTORE KERNEL VA OF WDB/RDB $ MOV (R0)+,KISAR6 ;MAP USERS WDB/RDB MOV (R0)+,(R1)+ ;W.NID R.GIDT MOV (R0)+,(R1)+ ;W.NBAS R.GSIZE& CMP (R0)+,(R1)+ ;W.NSIZ R.GNAM (SKIP) MOV (R0)+,(R1)+ ;W.NRID R.GNAM  MOV (R0)+,(R1)+ ;W.NOFF R.GPARF MOV (R0)+,(R1)+ ;W.NLEN R.GPAR  MOV (R0)+,(R1)+ ;W.NSTS R.GSTS65$: ;REFERENCE LABEL .ENDC ; DF X$$HDR; H; GET USER STACK POINTER AND UPDATE TO REMOVE DPB OR ADDRESS OF DPB FROM ; THE STACK.;2$ MFPI SP ;GET USER STACK POINTER . ADD $BTRMV,(SP) ;REMOVE BYTES FROM USER STACK% MTPI SP ;RESTORE USER STACK POINTER;VH; END OF DIRECTIVE PROCESSING, GO BACK TO SYSTEM ENTRANCE/EXIT ROUTINES.;+ RETURN ;EXIT FROM TRAP 0 .;D; EMT/TRAP SST ROUTINE TRANSFERF;G80$: ;REFERENCE LABEL .IF DF X$$HDR/ MOV $SAHPT,R5 ;GET ADDR OF CURRENT TASK HEADERL0 MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER .IFFU/ MOV $HEADR,R5 ;GET ADDR OF CURRENT TASK HEADERT .ENDC ;X$$HDR4 MOV H.WND(R5),R5 ;POINT TO NUMBER OF WINDOW BLOCKS / TST W.BLVR+2(R5) ;CURRENT TASK MAPPED TO EXEC?C BEQ 85$ ;IF EQ NO , 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 FAULTS;; ILLEGAL DIRECTIVEN;L(90$: DRSTS D.RS99 ;SET DIRECTIVE STATUS;R*; REQUIRED EVENT FLAG NUMBER NOT SPECIFIED;A)100$: DRSTS D.RS97 ;SET DIRECTIVE STATUS$;,1; SPECIFIED TASK NAME NOT FOUND IN TASK DIRECTORYH;(110$: DRSTS D.RS2 ;SET DIRECTIVE STATUS;O; PRIVILEGE VIOLATION ;R .IF DF M$$MUP)120$: DRSTS D.RS16 ;SET DIRECTIVE STATUS7 .ENDC ; ; ALLOCATION FAILURE ;  .IF DF R$$DSP C +130$: DRSTS D.RS1 ;SET DIRECTIVE STATUS S  .ENDC .DSABL LSBB .ENDECIFIED;A)100$: DRSTS D.RS97 ;SET DIRECTIVE STATUS$;,1; SPECIFIED TASK NAME NOT FOUND IN TASK DIRECTORYH;(110$: DRSTS D.RS2 ;SET DIRECTIVE STATUS;O; PRIVILEGE VIOLATION ;R .IF DF M$$MUP)120$: DRSTS D.RS16 ;SET DIRECTIVE STATUS7 .ENDC ; ; ALLOCATION FAILURE ;  .IF DF R$$DSP C +130$: DRSTS D.RS .TITLE DMDRVV .IDENT /15.01/; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.S; 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.;E; PREVIOUSLY MODIFIED BY:L; <; P. J. BEZEREDI ; B. S. MCCARTHY; G. MARIGOWDA; M. W. ZAHAREEO; $; MODIFIED FOR RSX-11M-PLUS V4.4 BY:; ; M. W. ZAHAREE 1-AUG-91 15.01<; MWZ017 RKWC ALSO IN ERROR WHEN DATA LATE DECLARED ON READ.; ; -; RK611-RK06/RK07 OVERLAPPED SEEK DISK DRIVERS;  .MCALL HWDDF$,PKTDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;Y; EQUATED SYMBOLS ; )RETRY= 8. ;CONTROLLER ERROR RETRY COUNTF(OFFTRY= 2 ;OFFSET POSITION RETRY COUNT1RMCNT= 22. ;NUMBER OF REGISTERS TO LOG ON ERROR)RCL= 1 ;RECALIBRATE IN PROGRESS (1=YES)$OFS= 2 ;OFFSET IN PROGRESS (1=YES)0XCT= 4 ;FUNCTION EXECUTION IN PROGRESS (1=YES)!OFM= 10 ;IN OFFSET MODE (1=YES)A%ADR= 40 ;ADDRESS BITS SETUP (1=YES) ;A; RK611 DEVICE REGISTER OFFSETSC; %RKCS1= 0 ;CONTROL STATUS REGISTER 1ERKWC= 2 ;WORD COUNTDRKBA= 4 ;BUS ADDRESSRKDA= 6 ;DISK ADDRESS &RKCS2= 10 ;CONTROL STATUS REGISTER 2RKDS= 12 ;DRIVE STATUSRKER= 14 ;ERROR REGISTER%RKOF= 16 ;OFFSET/ATTENTION REGISTERGRKDC= 20 ;DESIRED CYLINDERRKDB= 24 ;DATA BUFFER#RKMR1= 26 ;MAINTENANCE REGISTER 1RKECPS= 30 ;ECC POSITIONRKECPT= 32 ;ECC PATTERN1#RK00yUyibjbkb a a aMR2= 34 ;MAINTENANCE REGISTER 2 #RKMR3= 36 ;MAINTENANCE REGISTER 3;1; RKCS1 BIT ASSIGNMENTSC; "SD= 1 ;SELECT DRIVE & GET STATUSWRT= 2 ;WRITE OFFSETACK= 3 ;PACK ACKNOWLEDGEDC= 5 ;DRIVE CLEARUNL= 7 ;UNLOAD HEADSIE= 100 ;INTERRUPT ENABLE2RDY= 200 ;CONTROLLER READY!HMS= 113 ;IE + RECALIBRATE + GOAOFF= 115 ;IE + OFFSET + GOBLS= 117 ;IE + SEEK + GOREAD= 121 ;IE + READ + GO !RDH= 125 ;IE + READ HEADER + GO0"WDH= 127 ;IE + WRITE HEADER + GO!WCK= 131 ;IE + WRITE CHECK + GOR1CERR= 100000 ;CONTROLLER ERROR/CONTROLLER CLEARDI= 040000 ;DRIVE INTERRUPT 1DCPAR= 020000 ;DRIVE TO CONTROLLER PARITY ERRORR!CTO= 004000 ;CONTROLLER TIMEOUTD$CDT= 002000 ;CONTROLLER DRIVE TYPE;H; RKCS2 BIT ASSIGNMENTST;ADLT= 100000 ;DATA LATE WCE= 040000 ;WRITE CHECK ERRORUPE= 020000 ;UNIBUS PARITY NED= 010000 ;NON EXISTANT DISK"NEM= 004000 ;NON EXISTANT MEMORY PGE= 002000 ;PROGRAMMING ERROR$MDS= 001000 ;MULTIPLE DRIVE SELECTUFE= 000400 ;UNIT FIELD ERROR/OR= 000200 ;OUTPUT READY (SILO CONTAINS DATA)/SCLR= 000040 ;RESET CONTROLLER AND ALL DRIVES 0RLS= 000010 ;RELEASE PORT ;R; RKDS BIT ASSIGNMENTS; SVAL= 100000 ;STATUS VALID&PIP= 020000 ;POSITIONING IN PROGRESSDDT= 000400 ;DISK DRIVE TYPEDRDY= 000200 ;DRIVE READY0VV= 000100 ;VOLUME VALIDDRA= 000001 ;DRIVE AVAILABLE; ; RKER BIT ASSIGNMENTS;=DCK= 100000 ;DATA CHECK ERROR0UNS= 040000 ;DRIVE UNSAFET#OPI= 020000 ;OPERATION INCOMPLETER!DTE= 010000 ;DRIVE TIMING ERRORAWLE= 004000 ;WRITE LOCK ERROR $IDAE= 002000 ;INVALID DISK ADDRESS COE= 001000 ;CYLINDER OVERFLOW HVRC= 000400 ;HEADER VRC ERRORBSE= 000200 ;BAD SECTOR ERRORL$ECH= 000100 ;ERROR CORRECTION HARDDTYE= 000040 ;DISK TYPE ERRORYFMTE= 000020 ;FORMAT ERROR1CDPAR= 000010 ;CONTROLLER TO DRIVE PARITY ERRORE&NXF= 000004 ;NON-EXECUTABLE FUNCTIONSKI= 000002 ;SEEK INCOMPLETEILF= 000001 ;ILLEGAL FUNCTIONS; ; LOCAL DATA;E; CONTROLLER IMPURE DATA TABLES ,; THESE ARE INDEXED BY THE CONTROLLER NUMBER;R7RTTBL: .BLKW R$$611 ;RETRY COUNT FOR CURRENT OPERATIONC3OFFRTY: .BLKW R$$611 ;OFFSET RECOVERY RETRY COUNTSS;RGBLK: .BLKW R$$611*RMCNT ;CONTROLLER REGISTER STORAGE AREAO5OFFAD: .BLKW R$$611 ;ADDRESS OF CURRENT OFFSET VALUE =PRMSV: .BLKW R$$611*5 ;PARAMETER SAVE ARE FOR ERROR RECOVERY O ;AND WRITE CHECK FUNCTIONL.$DMOPT::.REPT R$$611 ;SEEK OPTIMIZATION TABLE/ .WORD 1 ;0=IMPLIED SEEK; 1=ALWAYS SEEK FIRST .ENDR O7SILOA: .BLKW R$$611 ;TABLE OF CURRENT SILO ADJUSTMENTSL;U; DIAGNOSTIC FUNCTION TABLE1;;$FUNTBL: .BYTE HMS, IO.HMS!IQ.UMD&377 .BYTE BLS, IO.BLS!IQ.UMD&377E .BYTE OFF, IO.OFF!IQ.UMD&377R .BYTE RDH, IO.RDH!IQ.UMD&377R .BYTE WDH, IO.WDH!IQ.UMD&377$ .BYTE WCK, IO.WCK!IQ.UMD&377 FUNTBE:R;.; OFFSET POSITIONING DATAV;R"OFFTB: ;POSITIONING VALUE TABLE! .BYTE 000 ;RETURN TO CENTERLINE6 .BYTE 020 ; +400 .BYTE 220 ; -400 .BYTE 040 ; +800 .BYTE 240 ; -800 .BYTE 060 ; +1200. .BYTE 260 ; -1200F(OFFTBE: .BYTE 000 ;RETURN TO CENTERLINE;F;DRIVER DISPATCH TABLE;L2 DDT$ DM,R$$611,,,,,,OPT ;GENERATE DISPATCH TABLE;+>; **-DMINI-RK611-RK06/RK07 DISK CARTRIDGE CONTROLLER INITIATOR;E; THIS IS THE DRIVER ENTRY POINT FROM THE QUEUE I/O DIRECTIVE WHEN ANRE; I/O REQUEST IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TOTF; 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,IE; THEN THE NEXT I/O OPERATION IS INITIATED AND A RETURN TO THE CALLERT; IS EXECUTED.;I ; INPUTS:0;K6; 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;-7DMINI: GTPKT$ DM,R$$611 ;GET NEXT I/O PACKET TO PR00yyt__DATADATADATADATAOCESSE;T1; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT:R; '; R1=ADDRESS OF THE I/O REQUEST PACKET.S-; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB.A; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.56; R5=ADDRESS OF THE UCB OF THE UNIT TO BE INITIALIZED.;U;; RK611-RK06/RK07 DISK CARTRIDGE I/O REQUEST PACKET FORMAT:Q;T!; WD. 00 -- I/O QUEUE THREAD WORDE/; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBERT4; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK<; WD. 03 -- POINTER TO 2ND LUN WORD IN REQUESTOR TASK HEADER4; WD. 04 -- CONTENTS OF FIRST LUN WORD (UCB ADDRESS); WD. 05 -- I/O FUNCTION CODEN/; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCKN/; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK<; WD. 10 -- I/O STATUS BLOCK ADDRESS (DISPLACEMENT + 140000)2; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE1; WD. 12 -- MEMORY EXTENSION BITS OF I/O TRANSFERD*; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER,; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED;; WD. 15 -- DIAGNOSTIC SUPPLIMENTAL PARAMETER ELSE NOT USEDS7; WD. 16 -- BITS <0:7> = HIGH LBN, BITS <8:15> NOT USEDR"; WD. 17 -- LOW LBN OF I/O REQUEST8; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REGISTER BLOCK:; WD. 21 -- DIAGNOSTIC REGISTER BLOCK ADDRESS DISPLACEMENT;T# 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 FUNCTIONU10$: JMP DMDONE ;EXIT;R); REQUEST CONTROLLER FOR PROPER OPERATIONA;E0DMRQC: MOV S.KRB(R4),R1 ;GET CURRENT KRB ADDRESS5 BIT #KS.POE,K.STS(R1) ;PARALLEL OPERATIONS ENABLED?Q BEQ DMRQC1 ;IF EQ NO. MOV S.PKT(R4),R3 ;RETRIEVE I/O PACKET ADDRESS= BITB #IQ.UMD!IQ.Q,I.FCN(R3) ;DIAGNOSTIC OR EXPRESS REQUEST?  BNE DMRQC1 ;IF NE YESL- MOVB K.CON(R1),R3 ;RETREIVE CONTROLLER INDEXS# TST $DMOPT(R3) ;WHICH SEEK METHOD?N" BNE 10$ ;IF NE ALWAYS SEEK FIRST3 BIT #KS.DIP,K.STS(R1) ;DATA TRANSFER IN PROGRESS?J+ BEQ DMRQC1 ;IF EQ NO, START DATA TRANSFERR210$: BISB #S3.SIP,S.ST3(R4) ;SET SEEK IN PROGRESS6 CALL $RQCNC ;REQUEST CONTROLLER FOR CONTROL FUNCTION BR DMINIO ;INITIATE THE SEEK;DMRQC1: BICB #S3.SIP,S.ST3(R4) ;SET SEEK ALREADY COMPLETED3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFERR;T ; **-DMUBMP-SETUP UNIBUS ADDRESS;.>; THIS SECTION OF CODE WILL DETERMINE IF THE UNIBUS ADDRESS IS@; ALREADY IN THE FORMAT FOR THE UNIBUS MAP ON 22-BIT PROCESSORS.=; IT WILL ALSO CONVERT THE I/O FUNCTION CODE TO IT'S HARDWARET ; EQUIVALENT.E;>; NOTE: AT THIS POINT THE REQUESTING UNIT MUST BE THE OWNER OF%; THE CONTROLLER FOR A DATA TRANSFER.I;9DMUBMP: BITB #ADR,U.CW2+1(R5);ADDRESS BITS ALREADY SETUP?) BNE DMINIO ;IF NE YESE. MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS5 CMP #IO.RDH!IQ.UMD,I.FCN(R1) ;READ HEADER FUNCTION?' BEQ 10$ ;IF EQ YES, NO NEED FOR UMR'ST' CALL $STMAP ;SETUP UNIBUS MAP ADDRESSR210$: ASL U.BUF(R5) ;POSITION MEMORY EXTENSION BITS ASL U.BUF(R5) ;...I ASL U.BUF(R5) ;...T ASL U.BUF(R5) ;...A5 CMP #IO.RDH!IQ.UMD,I.FCN(R1) ;READ HEADER FUNCTION?U' BEQ 20$ ;IF EQ YES, NO NEED FOR UMR'SA% CALL $MPUBM ;MAP UNIBUS TO TRANSFERD:20$: BISB #ADR,U.CW2+1(R5);INDICATE ADDRESS SETUP COMPLETE; 3; CONVERT I/O FUNCTION CODE TO HARDWARE EQUIVALENT.;P. MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS5 CMPB #IO.HMS/256.,I.FCN+1(R1) ;DIAGNOSTIC FUNCTION?M BNE 40$ ;IF NE NO . 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?  BNE 30$ ;IF NE NO 040$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION+ MOVB #READ,U.BUF(R5) ;ASSUME READ FUNCTIONV7 CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION?S& BHIS 50$ ;IF HIS FUNCTION IS ILLEGAL( MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS CALL DMSDC ;SELECT THE DRIVE JMP DMFIN1 ;FINISH I/O50$: BEQ 60$ ;IF EQ YES. ADD #WRT,U.BUF(R5) ;CONVERT TO WRITE FUNCTION+60$: MOV S.KRB(R4),R3 ;RETRIEVE KRB ADDRES00yUyibjbkb a a aSC- MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEXE$ MUL #5,R3 ;SETUP AN INDEX INTO ...' ADD #PRMSV,R3 ;... PARAMETER SAVE AREAS' MOV U.BUF(R5),(R3)+ ;SAVE PARAMETERS 5 MOV U.BUF+2(R5),(R3)+ ;... MOV U.CNT(R5),(R3)+ ;... MOV I.PRM+10(R1),(R3)+ ;...  MOV I.PRM+12(R1),(R3)+ ;...L;V%; **-DMINIO-INITIATE AN I/O OPERATIONC; ?; THIS ROUTINE WILL INITIATE EITHER A SEEK OR THE DATA TRANSFER :; OPERATION DEPENDING ON HOW THE CONTROLLER WAS REQUESTED.;: ; INPUTS:R;R; R4=ADDRESS OF THE SCB.; R5=ADDRESS OF THE UCB.;C;DMINIO: BICB #RCL!OFS,U.CW2+1(R5) ;RESET POSITIONING FLAGSR# MOV @S.KRB(R4),R2 ;GET CSR ADDRESSV. MOV S.PKT(R4),R3 ;RETREIVE I/O PACKET ADDRESS% MOV #CERR,(R2) ;CLEAR THE CONTROLLER+& MOVB U.UNIT(R5),R0 ;FETCH UNIT NUMBER# MOV R0,RKCS2(R2) ;SELECT THE DRIVE;*9; DETERMINE IF DRIVE'S PORT IS SEIZED BY THIS CONTROLLER. ;T' CALL DMSD ;ATTEMPT TO SEIZE THE DRIVE+ BIT #DRA,RKDS(R2) ;DID WE SEIZE THE DRIVE?A BNE 10$ ;IF NE YES( CALL DMCLR ;CLEAR THE CONTROLLER ERROR3 MOV #IE.DNR&377,R0 ;SET DRIVE NOT READY ERROR CODEW BR 40$ ;AND GO AWAYN; 1; CHECK IF THE HEADS ARE ON THE CORRECT CYLINDER.S;T-10$: CALL DMCLER ;CLEAR CONTROLLER AND DRIVER. BITB #S3.SIP,S.ST3(R4) ;ARE WE DOING A SEEK? BEQ 20$ ;IF EQ NO* CALL DMCYL ;GET CURRENT CYLINDER ADDRESS) CMP I.PRM+10(R3),R0 ;DO WE NEED TO SEEK? - BNE 30$ ;IF NE YES, BYPASS CONTROLLER SETUP # MOV #IE,(R2) ;RE-ENABLE INTERRUPTSE# JMP DMRQC1 ;GO REQUEST CONTROLLERY;.; LOAD CONTROLLER REGISTERS FOR DATA TRANSFER.;D"20$: ADD #RKCS2,R2 ;POINT TO RKCS26 MOV I.PRM+12(R3),-(R2) ;SET TRACK AND SECTOR ADDRESS1 MOV U.BUF+2(R5),-(R2) ;SET USER BUFFER ADDRESSR+ MOV U.CNT(R5),-(R2) ;SET BYTES TO TRANSFER,' ROR (R2) ;MAKE THAT WORDS TO TRANSFER$) NEG (R2) ;MAKE IT A NEGATIVE WORD COUNTI TST -(R2) ;POINT TO CSR(;,'; CHECK FOR DRIVE NOT READY CONDITIONS.E;S30$: CALL DMDC ;CLEAR DRIVE3 MOV #IE.DNR&377,R0 ;ASSUME SELECTED UNIT NOT READYR1 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?S BNE 40$ ;IF NE NOR! BIT #UNS,RKER(R2) ;DRIVE UNSAFE?V BEQ 60$ ;IF EQ NO 340$: BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP?A BEQ 45$ ;IF EQ NOA9 BITB #US.VV,U.STS(R5);WAS THE VOLUME PREVIOUSLY MOUNTED?, BEQ DMPWF1 ;IF EQ NO( BR DMPWF0 ;YES, WAIT FOR IT TO SPIN UP(45$: MOV R3,R1 ;COPY I/O PACKET ADDRESS1 CALL DMDINT ;TRY FOR DIAGNOSTIC DRIVE NOT READY  BCS 50$ ;IF CS IT WASM .IF DF S2.NRD6 BIT #S2.NRD,S.ST2(R4) ;IS THIS FIRST DRIVE NOT READY?! BNE 47$ ;IF NE NO, GO LOG ERROR6 BIS #S2.NRD,S.ST2(R4) ;INDICATE FIRST DRIVE NOT READY JMP DMPWF1 ;GO DO A RETRYB747$: BIC #S2.NRD,S.ST2(R4) ;CLEAR FIRST DRIVE NOT READY  .ENDC ; DF S2.NRD( CALL DMLERR ;LOG DRIVE NOT READY ERROR50$: JMP DMFIN ;FINISH I/O*60$: BIT #VV,R1 ;DID VOLUME VALID CHANGE?/ BEQ 65$ ;IF EQ NO (NOTE REVERSE STATUS OF VV)I. BITB #US.SPU,U.STS(R5) ;DID WE JUST SPIN UP? BEQ 40$ ;IF EQ NO, MOV #ACK,R0 ;GET PACK ACKNOWLEDGE FUNCTION CALL DMGO ;SET VVE0 BISB #US.VV,U.STS(R5);SET SOFTWARE VOLUME VALID165$: BIT #S2.MAD,S.ST2(R4) ;MULTI ACCESS DEVICE?P BEQ 80$ ;IF EQ NOR, CMP S.KRB(R4),S.KTB(R4) ;IS THIS PORT 'A'? BNE 70$ ;IF NE NON. BICB #S3.SPA,S.ST3(R4) ;YES, SHOW IT SPUN UP BR 75$ ;170$: BICB #S3.SPB,S.ST3(R4) ;IT MUST BE PORT 'B' 175$: BITB #S3.SPU,S.ST3(R4) ;BOTH PORTS SPUN UP?E BNE 85$ ;IF NE NOB580$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UP 285$: BITB #S3.SIP,S.ST3(R4) ;SHOULD WE DO A SEEK? BEQ 90$ ;IF EQ NOT;E; START EXPLICIT SEEK.;T% MOV #BLS,R0 ;GET SEEK FUNCTION CODED CALL DMXFR ;START THE SEEK( BR DMPWF3 ;RELEASE CONTROLLER AND EXIT;K; START DATA TRANSFER.;990$: CMPB U.BUF(R5),#BLS ;IS THIS A POSITIONING FUNCTION?T BHI DMDIP ;IF HI NO02 BISB #RCL!OFS,U.CW2+1(R5) ;SET POSITIONING FLAGS0 CMP #IO.OFF!IQ.UMD,I.FCN(R3) ;OFFSET FUNCTION? BNE DMDIP ;IF NE NO01 MOV I.PRM+6(R3),RKOF(R2) ;YES, SET OFFSET VALUE :00yyt__DATADATADATADATADMDIP: MOV U.BUF(R5),R0 ;GET FUNCTION CODE AND MEMORY BITS0DMDIP1: MTPS #PR5 ;;;EXECUTE AT DEVICE PRIORITY$ MOV S.KRB(R4),R3 ;;;GET KRB ADDRESS7 BIT #IQ.UMD,I.FCN(R1) ;;;IS IT A DIAGNOSTIC FUNCTION?L BEQ DMDIP2 ;;;IF EQ NO2 CMPB U.BUF(R5),#BLS ;;;IS IT A UMD SEEK FUNCTION? BLOS DMXFR ;;;IF LOS YES?DMDIP2: BIS #KS.DIP,K.STS(R3) ;;;SET DATA TRANSFER IN PROGRESSI'DMXFR: MTPS #PR5 ;;;DISABLE INTERRUPTS;' CLR S.FRK+2(R4) ;;;INIT FORK INTERLOCK- BIS #S2.ACT,S.ST2(R4) ;;;SHOW I/O IS ACTIVEU5 BISB #XCT,U.CW2+1(R5) ;;;SHOW FUNCTION HAS EXECUTEDR/ MOVB S.ITM(R4),S.CTM(R4) ;;;SET TIMEOUT COUNTR, CALL DMXCT ;;;SET CDT,LOAD FUNCTION AND GO MTPS #0 ;ALLOW INTERRUPTS ;+<; 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 HAVE)?; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANYNA; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESSC; 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?R BEQ DMPWF2 ;IF EQ NO9DMPWF0: MOVB #15.,S.STS(R4) ;WAIT A MAXIMUM OF ONE MINUTEI6DMPWF1: MOVB S.ITM(R4),S.CTM(R4) ;4 SECONDS AT A TIME5DMPWF2: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UP 5DMPWF3: CALLR $RLCN ;RELEASE CONTROLLER IF NECESSARYU;+5; **-$DMINT-RK611-RK06/RK07 DISK CARTRIDGE CONTROLLERA&; INTERRUPT AND ERROR SERVICE ROUTINES; ; HARD ERRORS ---> $IODON&; SOFT ERRORS ---> RETRY LAST FUNCTION9; DATA ERRORS ---> RETRY FUNCTION AND CORRECT IF POSSIBLEI;- .ENABL LSBU3$DMINT::BR DMFRK ;;;ENTRY POINT FOR DATA TRANSFERS(* 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 INTERRUPTS RETURN ;;;E*5$: CALL $FORK ;;;CREATE A SYSTEM PROCESS9DMFRK: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFERR* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS- MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEXS# MOV @S.KRB(R4),R2 ;GET CSR ADDRESSF' MOVB U.UNIT(R5),R0 ;GET UNIT TO SELECT." MOV R0,RKCS2(R2) ;SELECT THE UNIT# TSTB S.STS(R4) ;IS THIS UNIT BUSY?F 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 PORTA8 BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED& CLR S.FRK+2(R4) ;RESET FORK INTERLOCK# MOV #IE,(R2) ;RE-ENABLE INTERRUPTSD( BR DMPWF3 ;RELEASE CONTROLLER AND EXIT; @; INTERRUPT WAS FROM A BUSY UNIT. IF WE JUST DID A SEEK WE WILLA; GO AND START THE DATA TRANSFER OPERATION. IF THE DATA TRANSFERT>; TERMINATED, DETERMINE WHY. IF WE ARE SPINNING UP, RETRY THE ; OPERATION.;110$: BITB #US.SPU,U.STS(R5) ;ARE WE SPINNING UP?S BEQ 15$ ;IF EQ NO - BIT #S2.MAD,S.ST2(R4) ;MULTI-ACCESS DEVICE?  BEQ DMREST ;IF EQ NO, CMP S.KRB(R4),S.KTB(R4) ;IS THIS PORT 'A'? BNE 14$ ;IF NE NO2 BITB #S3.SPA,S.ST3(R4) ;IS PORT 'A' SPINNING UP? BNE DMREST ;IF NE YEST BR 15$ ;614$: BITB #S3.SPB,S.ST3(R4) ;IS PORT 'B' SPINNING UP? BNE DMREST ;IF NE YEST215$: MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS3 BIT #S2.EIP,S.ST2(R4) ;ERROR ALREADY IN PROGRESS?T BNE 20$ ;IF NE YES4 CALL DMPRM ;RESET RETRY AND OFFSET RECOVERY VALUES420$: BITB #S3.SIP,S.ST3(R4) ;DID WE JUST DO A SEEK? BEQ 30$ ;IF EQ NOR0 BICB #S3.SIP,S.ST3(R4) ;CLEAR SEEK IN PROGRESS' TST (R2) ;ANY ERRORS DURING THE SEEK?S BPL 70$ ;IF PL NOP) CALL DMSDC ;ISSUE SELECT DRIVE FUNCTIONE! CALL DMLERR ;LOG THE SEEK ERROR.( MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS! DECB RTTBL(R3) ;COUNT THIS RETRYR" CALL DMERL ;FINISH ERROR LOGGING* CALLR DMRCAL ;ISSUE RECALIBRATE FUNCTION;E; VALID INTERRUPT.;Y330$: MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFERU+ CALL DMDINT ;PROCESS DIAGNOSTIC INTERRUPT / BCS 100$ ;IF CS INTERRUPT 00yUyibjbkb a a aPROCESSING COMPLETE.2 BITB #RCL!OFS,U.CW2+1(R5) ;POSITIONING FUNCTION? BNE 40$ ;IF NE YES;B1; INTERRUPT WAS DUE TO A DATA TRANSFER OPERATION.E;N TST (R2) ;ANY ERRORS?G* BMI 35$ ;IF MI YES, FORGET STATUS UPDATE+ TST RKDS(R2) ;IS THE CURRENT STATUS VALID?E BMI 35$ ;IF MI YES) CALL DMSDC ;ISSUE SELECT DRIVE FUNCTIONE35$: TST (R2) ;ANY ERRORS?I BPL DMWCHK ;IF PL NO( CALL DMLERR ;YES, LOG THE DEVICE ERROR1 MOV RKER(R2),R1 ;COPY CONTENTS OF ERROR REGISTER, MOV #IE.WLK&377,R0 ;ASSUME WRITE LOCK ERROR BIT #WLE,R1 ;WRITE LOCK ERROR? BNE 50$ ;IF NE YES+ MOV #IE.BBE&377,R0 ;ASSUME BAD BLOCK ERROR  BIT #BSE,R1 ;BAD BLOCK ERROR?N BNE 50$ ;IF NE YES/ MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERROR9 BIT #UNS!DTE!IDAE!COE!DTYE!FMTE!NXF!ILF,R1 ;HARD ERROR?  BNE 50$ ;IF NE YES5 BIT #UPE!NED!NEM!PGE!MDS!UFE,RKCS2(R2) ;HARD ERROR?S BNE 50$ ;IF NE YES, FINISH UP & JMP DMSOFT ;TRY FOR SOFT/DATA ERRORS;E;2; PROCESS POSITIONING OPERATIONS;(40$: MOVB U.CW2+1(R5),R0 ;GET UNIT FLAGS COM R0 ;TOGGLE THEMI3 BIT #OFM!RCL,R0 ;IN OFFSET MODE AND DOING A RECAL?7 BNE 45$ ;IF NE NO CLR R0 ;GET READY FOR THE BISB1 BISB RTTBL+1(R3),R0 ;RETREIVE ERROR/SUCCESS CODEA( BICB #OFM!RCL,U.CW2+1(R5) ;CLEAR FLAGS CALLR DMFIN1 ;NOW SAY GOOD-BYE345$: MOV #IE.VER&377,R0 ;ASSUME UNRECOVERABLE ERRORG& TST (R2) ;ERRORS DURING POSITIONING? BPL 60$ ;IF PL NOI( CLR RKWC(R2) ;SHOW ALL BYTES TRANSFERED50$: JMP DMFIN ;FINISH I/OI060$: BITB #RCL,U.CW2+1(R5);RECALIBRATE FUNCTION? BEQ 65$ ;IF EQ NO * JMP DMRTRY ;YES, RETRY PREVIOUS FUNCTION.65$: BICB #OFS,U.CW2+1(R5) ;RESET OFFSET FLAG, CMP #OFFTBE,OFFAD(R3) ;FINAL OFFSET TRIED? BEQ 50$ ;IF EQ YES;S; RESTART THE I/O OPERATIONU;2/DMREST: MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESSD570$: JMP DMUBMP ;SETUP UNIBUS MAP AND RETRY FUNCTIONO; ; TEST FOR WRITE CHECK OPERATION;?0DMWCHK: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS; BITB #IO.WLC&377,I.FCN(R1) ;WRITE FOLLOWED BY WRITE CHECK?U BNE 80$ ;IF NE YES5 BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED BY MCR?T BEQ 100$ ;IF EQ NO480$: CMPB #READ,U.BUF(R5) ;WAS LAST FUNCTION A READ? BEQ 100$ ;IF EQ YESL6 CMPB #READ+WRT,U.BUF(R5) ;WAS LAST FUNCTION A WRITE? BNE 100$ ;IF NE NO CALL DMPRM ;RESET RETRY COUNT # MUL #5,R3 ;FORM AN INDEX INTO ... ' ADD #PRMSV,R3 ;... PARAMETER SAVE AREAT) MOV (R3)+,U.BUF(R5) ;RESTORE PARAMETERS  MOV (R3)+,U.BUF+2(R5) ;... MOV (R3)+,U.CNT(R5) ;... MOV (R3)+,I.PRM+10(R1) ;...E MOV (R3)+,I.PRM+12(R1) ;.... MOVB #WCK,U.BUF(R5) ;SET WRITE CHECK FUNCTION( BR DMREST ;START WRITE CHECK OPERATION8100$: CLR U.CNT(R5) ;NO ERRORS, SET ALL BYTES TRANSFERED BR DMFIN1 ;FINISH I/OU .DSABL LSBA;+@; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING REPEATEDC; UNLESS THE OPERATION WAS DIAGNOSTIC. TIMEOUTS ARE USUALLY CAUSEDE<; BY POWER FAILURE BUT MAY ALSO BE THE RESULT OF NO RESPONSE; FROM THE HARDWARE.;-7DMOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP?E BEQ 15$ ;;;IF EQ NO1/ BIT #S2.MAD,S.ST2(R4) ;;;MULTI-ACCESS DEVICE?U BEQ 10$ ;;;IF EQ NOA. CMP S.KRB(R4),S.KTB(R4) ;;;IS THIS PORT 'A'?) BNE 5$ ;;;IF NE NO, IT MUST BE PORT 'B'M4 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/ JMP DMRQC ;REQUEST CONTROLLER AND RESTART I/OM,15$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY+ MOV S.PKT(R4),R1 ;;;GET I/O PACKET ADDRESS) MOV (R2),I.PRM+6(R1);;;SAVE CSR CONTENTS MTPS #0 ;;;ALLOW INTERRUPTSP3 CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER 4 MOV #IE.DNR&377,R0 ;GET DEVICE NOT READY ERROR CODE) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS11 MOV I.PRM+6(R1),$DVSAV ;SAVE SAVED CSR CONTENTS4* MOV S.KRB(R4),R2 ;GET CURRENT KRB ADDRESS- MOVB K.CON(R2),R3 ;RETREIVE CONTROLLER INDEXJ MOV (R2),R2 ;GET CSR ADDRE00yyt__DATADATADATADATASS' MOVB U.UNIT(R5),R1 ;GET UNIT TO SELECTL" MOV R1,RKCS2(R2) ;SELECT THE UNIT) CALL DMSDC ;ISSUE SELECT DRIVE FUNCTION./ MOV S.PKT(R4),R1 ;PUT BACK THE I/O PKT ADDRESSW* CALL DMDINT ;TEST FOR DIAGNOSTIC TIMEOUT BCS DMFIN ;IF CS IT WASV! CALL DMLTMO ;LOG DEVICE TIMEOUTD0 BITB #S3.SIP,S.ST3(R4) ;TIMEOUT DURING A SEEK? BEQ 20$ ;IF EQ NOR4 CALL DMPRM ;RESET RETRY AND OFFSET RECOVERY VALUES;20$: BICB #S3.SIP,S.ST3(R4) ;ASSUME DATA TRANSFER FUNCTIONR- BICB #OFM,U.CW2+1(R5);CLEAR OFFSET MODE FLAGM8 BITB #RCL!OFS,U.CW2+1(R5) ;TIMEOUT DURING POSITIONING? BNE DMFIN ;IF NE YES4 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 READYM BR DMFIN ;AND EXIT;I%; CHECK FOR RETRY OF CURRENT FUNCTIONU;0DMRTRY: 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 NOF! JMP DMREST ;YES, RETRY FUNCTION);R; **-DMFIN-FINISH I/O OPERATIONS;CB; 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:I; ; R0=SUCCESS/ERROR CODET0; R2=ADDRESS OF CONTROLLER CSR OR REGISTER BLOCK; R4=ADDRESS OF THE SCB.; R5=ADDRESS OF THE UCBI; /DMFIN: MOV RKWC(R2),R1 ;GET RESIDUAL WORD COUNTN ASL R1 ;CONVERT TO BYTE COUNTJ- NEG R1 ;CONVERT TO POSITIVE BYTES REMAININGF:DMFIN0: MOV R1,U.CNT(R5) ;SAVE BYTES REMAINING TO TRANSFER/DMFIN1: MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESSG CALL DMDC ;CLEAR DRIVE.DMFIN3: MOV S.KRB(R4),R3 ;RETREIVE KRB ADDRESS- MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEX& 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 RECALIBRATE95$: BITB #S3.NRL,S.ST3(R4) ;SHOULD WE RELEASE THE DRIVE?L BNE 15$ ; IF NE NO- BIT #DRA,RKDS(R2) ;HAVE WE SEIZED THE DRIVE?A BEQ 10$ ;IF EQ NO1% BIS #RLS,RKCS2(R2) ;RELEASE THE PORTN2 CALL DMSD ;ISSUE SELECT FUNCTION TO RELEASE PORT<10$: BISB #S3.DRL,S.ST3(R4) ;SHOW DUAL ACCESS UNIT RELEASED515$: MOV #IE,(R2) ;RE-DISPATCH IF DRIVE INTERRUPT SET / MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTB6 BITB #XCT,U.CW2+1(R5) ;HAS A FUNCTION BEEN EXECUTED? BNE 20$ ;IF NE YES' MOV #RETRY,R2 ;SET MAXIMUM RETRY COUNTS320$: BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNT 5 BICB #S3.SIP,S.ST3(R4) ;RESET SEEK IN PROGRESS FLAGA CALL $RLCN ;RELEASE CONTROLLER0DMDONE: MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS1 MOV I.PRM+4(R1),R1 ;GET ACTUAL BYTES TO TRANSFER.6 SUB U.CNT(R5),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED/ CLR S.FRK+2(R4) ;CLEAR THE FORK INTERLOCK FLAGT+ MOV @S.KRB(R4),-(SP) ;GET THE CSR ADDRESST! MOV #IE,(SP)+ ;ENABLE INTERRUPTS # CALL $IODON ;FINISH I/O OPERATION! JMP DMINI ;PROCESS NEXT REQUESTO;6; **-DMSOFT-TEST FOR SOFT RECOVERABLE ERROR CONDITIONS; ; INPUTS:T;4; R0=IE.VER&377 ; R1=CONTENTS OF RKERR; R2=ADDRESS OF CSRL;.DMSOFT: BIT #WCE,RKCS2(R2) ;WRITE CHECK ERROR? BEQ 10$ ;IF EQ NOG/ MOV #IE.WCK&377,R0 ;SET WRITE CHECK ERROR CODEC+ BR DMRTRY ;AND ATTEMPT TO RETRY OPERATIONK$10$: TST RKCS2(R2) ;DATA LATE ERROR? BMI DMDLT ;IF MI YES9 BIT #DCPAR!CTO,(R2) ;CONTROLLER TIMEOUT OR PARITY ERROR? BNE DMRTRY ;IF NE YES 1 BIT #CDPAR,R1 ;CONTROLLER TO DRIVE PARITY ERROR? BNE DMRTRY ;IF NE YESF* 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 DRIVET;H; DO A RECALIBRATE OPERATION;.DMRCAL: MOV #HMS,R0 ;SET RECALIBRATE FUNCTION4 BISB #RCL,U.CW2+1(R5);INDICATE RECALIBRATE FUNCTION% CALLR DMDIP1 ;ISSUE THE RECALIBRATED;I!; **-DMECC-ATTEMPT ECC CORRECTIONT;LD; 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 RECOVERY4; IS00yUyibjbkb a a a REQUIRED, WE WILL DO IT.L;M ; INPUTS:R;N; R1=CONTENTS OF RKER; R2=ADDRESS OF CONTROLLER CSR;M6DMECC: CMPB #READ,U.BUF(R5) ;IS THIS A READ OPERATION? BNE DMRTRY ;IF NE NO. MOV S.PKT(R4),R3 ;RETREIVE I/O PACKET ADDRESS' BITB #IQ.X,I.FCN(R3) ;INHIBIT RETRIES?R BNE DMFIN ;IF NE YES' MOV S.KRB(R4),R3 ;RETREIVE KRB ADDRESSE- MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEXV" DECB RTTBL(R3) ;RE-READ THE DATA?* BLE 10$ ;IF LE NO, DO THE ECC CORRECTION) CALLR DMREST ;YES, RESTART THE TRANSFERQ,10$: MOVB #RETRY,RTTBL(R3);RESET RETRY COUNT3 MOV RKWC(R2),R0 ;GET NEGATIVE # OF WORDS REMAINING ASL R0 ;CONVERT TO BYTES6 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED. BEQ DMOFF ;IF EQ NONE TRANSFERED, TRY OFFSET2 BIC #^C,R1 ;ISOLATE IMPORTANT BITS% CMP #DCK,R1 ;ONLY DATA CHECK ERROR?E! BNE DMOFF ;IF NE NO, TRY OFFSET3* MOV RKECPS(R2),R1 ;GET ECC ERROR POSITION. MOV RKECPT(R2),R3 ;GET ECC CORRECTION PATTERN* MOV RKWC(R2),R2 ;GET REMAINING WORD COUNT$ CALL $ECCOR ;DO THE ECC CORRECTION/ CALL DMPRM0 ;RESET OFFSET RECOVERY PARAMETERSE( CALL DMCALC ;RE-CALCULATE DISK ADDRESS5 MOV #IS.SUC&377,R0 ;ASSUME NO MORE WORDS TO TRANSFERA+ TST U.CNT(R5) ;ANY MORE WORDS TO TRANSFER?F BNE 20$ ;IF NE YES CALLR DMFIN ;NO, FINISH I/O ,20$: MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS) CALL DMCLER ;CLEAR CONTROLLER AND DRIVE3" CALL DMERL ;FINISH ERROR LOGGING7 MOV U.BUF+2(R5),RKBA(R2) ;SET PREVIOUS BUFFER ADDRESS: MOV I.PRM+10(R1),RKDC(R2) ;SET PREVIOUS CYLINDER ADDRESS6 MOV I.PRM+12(R1),RKDA(R2) ;SET PREVIOUS DISK ADDRESS( CALLR DMDIP ;RESTART THE DATA TRANSFER;K; **-DMDLT-DATA LATE RECOVERYA;MI; THIS ROUTINE IS ENTERED IF A DATA LATE ERROR IS DETECTED. WE WILL NOW H; BACKUP THE WORD COUNT, BUS ADDRESS AND CYLINDER/TRACK/SECTOR ADDDRESS H; BY ONE BLOCK AND RETRY THE TRANSFER FROM THIS POINT. THIS IS DONE TO H; PREVENT THE DATA LATE CONDITION FROM RECURRING DUE TO A LONG TRANSFER.;E ; INPUTS:;V; R0=IE.VER&377C; R1=CONTENTS OF RKERI"; R2=ADDRESS OF REGISTER SAVE AREA;)4DMDLT: MOV S.PKT(R4),R3 ;RETRIEVE I/O PACKET ADDRESS& BITB #IQ.X,I.FCN(R3) ;INHIBIT RETRIES BEQ 20$ ;IF EQ NOH#10$: JMP DMFIN ;YES, FINISH UP I/OE+20$: MOV S.KRB(R4),R3 ;RETRIEVE KRB ADDRESSE- MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEXT" DECB RTTBL(R3) ;ANY RETRIES LEFT? BLE 10$ ;IF LE NOTH; FOR WRITE OPERATIONS, RKWC NEEDS TO BE ADJUSTED BY THE NUMBER OF WORDS; FOUND IN THE SILO.. MOV RKWC(R2),R0 ;GET NEGATIVE WORDS REMAINING2 CMPB #READ+WRT,U.BUF(R5) ; LAST FUNCTION A WRITE?1 BNE 30$ ;IF NE, ONLY MINOR ADJUSTMENT NECESSARYT7 SUB SILOA(R3),R0 ;ADJUST BY NUMBER OF WORDS FOUND WHEN$+ ;ERROR WAS LOGGED (SEE DMLERR & REGPAS) -30$: SUB #2, R0 ; RKWC CAN STILL BE OFF BY 2E/; FINALLY, CALCULATE WHERE TO RESTART OPERATIOND# ASL R0 ;CONVERT TO NEGATIVE BYTES16 ADD U.CNT(R5),R0 ;CALCULATE BYTES ACTUALLY TRANSFERED+ BGE 35$ ;OUT OF BOUNDS DUE TO ADJUSTMENT?T& CLR R0 ;OK, THEN NO BYTES TRANSFERED135$: BIC #777,R0 ;GET BLOCKS ACTUALLY TRANSFEREDF0 CALL DMCALC ;BACKUP TO START OF BLOCK IN ERROR& TST U.CNT(R5) ;LAST BLOCK TRANSFERED? BNE 40$ ;IF NE NOR, ADD R0,U.CNT(R5) ;YES, NORMALIZE BYTE COUNT240$: MOV #IE.VER&377,R0 ;ASSUME NO FURTHER RETRIES' JMP DMREST ;RESTART THE I/O OPERATIONE;E"; **-DMOFF-ATTEMPT OFFSET RECOVERY;O=; THIS ROUTINE IS CALLED WHENEVER WE NEED TO OFFSET THE HEADSR@; SOME DISTANCE FROM TRACK CENTERLINE TO PROPERLY READ THE DATA.;K ; INPUTS:Y; 6; R0=NUMBER OF BYTES ACTUALLY TRANSFERED TO THIS POINT; R3=CONTROLLER INDEX ;C)DMOFF: DECB OFFRTY(R3) ;ANY RETRIES LEFT?) BGT 10$ ;IF GT YES/5$: MOV #IE.VER&377,R0 ;SET UNRECOVERABLE ERROR  CALLR DMFIN ;FINISH I/OM,10$: MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS& TST R0 ;ANY GOOD SECTORS TRANSFERED? BEQ 40$ ;IF EQ NOT;T@; THE TRANSFER ENDED IN AN ECC HARD ERROR BUT THERE WERE SECTORS@; TRANSFERED THAT CONTAINED GOOD DATA. SINCE THE ECC HARD ERRORA; COULD HAVE BEEN CAUSED BY A CYLINDER CROSSING, THE GOOD DATA ISL<; SAVED AND THE TR00yyt__DATADATADATADATAANSFER IS RETRIED FROM THE POINT OF ERROR.;D, BIT #ECH,RKER(R2) ;WAS IT A HARD ECC ERROR? BEQ 15$ ;IF EQ NOI1 SUB #512.,R0 ;BACK UP TO START OF BLOCK IN ERRORN,15$: CALL DMCALC ;RE-CALCULATE DISK ADDRESS2 TST U.CNT(R5) ;ANY BYTES REMAIN TO BE TRANSFERED? BNE 20$ ;IF NE YES0 ADD R0,U.CNT(R5) ;NO, NORMALIZE BYTES REMAINING520$: CALL DMPRM1 ;RESET OFFSET TABLE ADDRESS POINTERD BR 50$I; ;; NO GOOD DATA WAS TRANSFERED SO CHECK TO SEE IF THE OFFSETO*; FROM TRACK CENTERLINE SHOULD BE CHANGED.;F&40$: DECB OFFRTY+1(R3) ;CHANGE OFFSET? BLE 45$ ;IF LE YES# JMP DMINIO ;RESTART THE OPERATION 945$: MOVB #OFFTRY,OFFRTY+1(R3) ;SET RECOVERY RETRY COUNTO)50$: INC OFFAD(R3) ;UPDATE OFFSET POINTERD( MOV @S.KRB(R4),R2 ;RETRIEVE CSR ADDRESS+ CMP #OFFTBE,OFFAD(R3) ;ALL OFFSETS TRIED?, BLT 5$ ;IF YES RETURN ERRORR* MOVB @OFFAD(R3),R0 ;GET NEXT OFFSET VALUE, BNE 60$ ;IF NE NOT RETURNING TO CENTERLINE8 MOVB #RETRY*2,OFFRTY+1(R3) ;TRY 16 TIMES AT CENTERLINE-60$: CALL DMCLER ;CLEAR CONTROLLER AND DRIVED% BIC #^C<377>,R0 ;ISOLATE OFFSET BITS4( MOV R0,RKOF(R2) ;LOAD NEXT OFFSET VALUE" MOV #OFF,R0 ;SET OFFSET FUNCTION5 BISB #OFS!OFM,U.CW2+1(R5) ;INDICATE OFFSET FUNCTION;' CALLR DMDIP1 ;EXECUTE OFFSET FUNCTION2;R&; RESET THE OFFSET RECOVERY PARAMETERS;A3DMPRM: MOV #RETRY,RTTBL(R3);SET INITIAL RETRY COUNTV?DMPRM0: MOVB #1,OFFRTY+1(R3) ;SET INITIAL RECOVERY COUNT TO ONER> MOVB #RETRY*2+OFFTRY*7+16.,OFFRTY(R3) ;SET TOTAL RETRY COUNT ;FOR OFFSET RECOVERY9DMPRM1: MOV #OFFTB-1,OFFAD(R3) ;SET OFFSET TABLE POINTERF RETURN ;M;K6; **-DMERL-FINISH ERROR LOGGING FOR MID TRANSFER ERROR;U@; THIS ROUTINE IS CALLED TO FINISH OFF THE ERROR LOGGING PROCESS8; DURING MID-TRANSFER IF WE HAVE SUCCESSFULLY RECOVERED.;S ; INPUTS: ;A; R3=CONTROLLER INDEXV;E#DMERL: MOV R2,-(SP) ;SAVE REGISTERS MOV R1,-(SP) ;.../ MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNTV/ BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNTT, MOV #IS.SUC&377,R0 ;RECOVERY WAS SUCCESSFUL+ CALL $FNERL ;FINISH ERROR LOGGING PROCESSO MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R2 ;.... BR DMPRM ;RESET RECOVERY PARAMETERS AND EXIT;A5; **-DMCALC-CALCULATE UPDATED DISK AND BUFFER ADDRESSM;T?; THIS ROUTINE WILL CALCULATE THE NEW DISK AND BUFFER ADDRESSES 3; BASED ON THE NUMBER OF BYTES ACTUALLY TRANSFERED. ;I ; INPUTS:V;,; R0=BYTES ACTUALLY TRANSFERED; ; OUTPUTS:;R; R0=UNCHANGED IF U.CNT(R5)=0M#; I.PRM+10(R1)=NEW CYLINDER ADDRESSS'; I.PRM+12(R1)=NEW TRACK/SECTOR ADDRESS (; U.BUF+1(R5)=NEW ADDRESS EXTENSION BITS; U.BUF+2(R5)=NEW BUS ADDRESS;V<DMCALC: 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 ADDRESSE6 ADCB U.BUF+1(R5) ;PROPAGATE CARRY INTO EXTENSION BITS' MOV S.KRB(R4),R1 ;RETREIVE KRB ADDRESSF& ADD K.OFF(R1),R1 ;POINT TO UMR AREA+2) ADD R0,-(R1) ;CALCULATE NEW REAL ADDRESS0 ADCB -(R1) ;...()5$: SWAB R0 ;CALCULATE THE NUMBER OF ...S ASR R0 ;... SECTORS TRANSFERED) MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESSO1 ADD I.PRM+12(R1),R0 ;UPDATE TRACK/SECTOR ADDRESSC$10$: CMPB #22.,R0 ;SECTOR OVERFLOW? BHI 20$ ;IF HI NOQ' SUB #22.,R0 ;NORMALIZE SECTOR ADDRESS5 ADD #400,R0 ;ADD IN A TRACKS CMP #3*400,R0 ;TRACK OVERFLOW?C BHI 10$ ;IF HI NOI' SUB #3*400,R0 ;NORMALIZE TRACK ADDRESSS* INC I.PRM+10(R1) ;UPDATE CYLINDER ADDRESS BR 10$ ;;20$: MOV R0,I.PRM+12(R1) ;SAVE UPDATED TRACK/SECTOR ADDRESSR30$: RETURN ; ;O(; **-DMVV-PROCESS VOLUME VALID FUNCTIONS;VB; HERE WE WILL PROCESS VOLUME VALID FUNCTIONS. IF THE FUNCTION ISB; RESET VOLUME VALID WE WILL FORCE AN UNLOAD OF THE DRIVE. IF THEB; 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 BYI6; PASSING THE CONTROLLER REGISTERS BACK TO THE CALLER.;P8DMVV: CALL $RQCND ;REQUEST CONTROLLER FOR DATA TRANSFER( MOV @S.KRB(R4),R2 ;RETREIVE CSR ADDRESS. CALL DMCLR ;CLEAR CONTROLLER AND SELECT UNIT CALL DMSDC ;SELECT THE DRIVE00yUyibjbkb a a a CALL DMDC ;CLEAR THE DRIVE. MOV S.PKT(R4),R1 ;RETREIVE I/O PACKET ADDRESS TST I.PRM+2(R1) ;SIZE THE DISK? BPL 10$ ;IF PL NOE* BIT #NED,RKCS2(R2) ;DOES THE DRIVE EXIST? BEQ 5$ ;IF EQ YESI" CALL DMCLR ;CLEAR THE CONTROLLER* MOV #IE.SZE&377,R0 ;UNABLE TO SIZE DEVICE) BICB #US.VV,U.STS(R5);RESET VOLUME VALIDE CALLR DMFIN3 ;EXIT55$: CALL DMRPAS ;PASS CONTROLLER REGISTERS TO CALLERR BR 30$ ;010$: BIT #VV$SET,I.PRM+2(R1) ;SET VOLUME VALID? BEQ 40$ ;IF EQ NOL7 MOV RKDS(R2),R1 ;GET CONTENTS OF DRIVE STATUS REGISTER COM R1 ;TOGGLE THEME0 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 CODE #20$: CALL DMGO ;ISSUE THE FUNCTIONV030$: MOV #IS.SUC&377,R0 ;SET SUCCESSFUL FUNCTION35$: CALLR DMFIN1 ;AND EXIT040$: 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 UNLOADINGO- MOV #UNL,R0 ;GET UNLOAD HEADS FUNCTION CODEY BR 20$ ;;+<; INITIATE A CONTROLLER/DRIVE CLEAR OR SELECT DRIVE FUNCTION"; AND WAIT FOR THE SERIAL MESSAGE.;7; NOTE: THE TIMING LOOP AT 20$ IS TO ALLOW TIME FOR THE 7; SERIAL MESSAGE TO BE SENT TO THE DRIVE AND THE STATUS34; TO BE RECEIVED BY THE RK611. AVERAGE TIME = 15US.;- .ENABL LSB#%DMCLER: CALL DMCLR ;CLEAR CONTROLLER!DMDC: MOV R0,-(SP) ;SAVE REGISTERS& MOV #DC,R0 ;GET CODE FOR DRIVE CLEAR BR 10$ ;3DMSDC: CLR RKDC(R2) ;CLEAR DESIRED CYLINDER ADDRESS DMSD: MOV R0,-(SP) ;' MOV #SD,R0 ;GET CODE FOR SELECT DRIVEE#10$: CALL DMGO ;ISSUE THE FUNCTIONN MOV (SP)+,R0 ;T RETURN DMGO: CALL DMXCT ;LOAD RKCS1G020$: TSTB (R2) ;WAIT FOR THE SERIAL MESSAGE ... BPL 20$ ;... TO DO ITS THING RETURN ;3'DMCLR: MOV #CERR,(R2) ;CLEAR CONTROLLER 0 MOVB U.UNIT(R5),-(SP) ;GET CURRENT UNIT NUMBER( MOV (SP)+,RKCS2(R2) ;RE-SELECT THE UNIT RETURNS/DMXCT: CMP #815.,U.PRM+2(R5) ;IS THIS AN RK07?  BNE 30$ ;IF NE NOD1 BIS #CDT,R0 ;YES, SET CONTROLLER DRIVE TYPE BIT0'30$: MOV R0,(R2) ;EXECUTE THE FUNCTIONC RETURN ;:0DMCYL: MOV #2,RKMR1(R2) ;SET MESSAGE SELECT CODE( CALL DMSD ;SELECT DRIVE TO GET MESSAGE' MOV RKMR3(R2),R0 ;GET MESSAGE CONTENTSS, ASH #-4,R0 ;RIGHT JUSTIFY CYLINDER ADDRESS3 BIC #^C<1777>,R0 ;ISOLATE CURRENT CYLINDER ADDRESSM RETURN ;) .DSABL LSBC;+5; **-DMLXXX-RK611-RK06/RK07 DISK CARTRIDGE CONTROLLER; ERROR LOGGING ROUTINES;PB; THIS ROUTINE IS CALLED WHENEVER A DEVICE ERROR OR DEVICE TIMEOUT:; OCCURS. A CORE BLOCK THE SIZE OF THE REGISTER BUFFER ISB; ALLOCATED AND THE REGISTERS (INCLUDING THE SIX EXTRA MAINTENANCE<; REGISTERS) ARE TRANSFERED INTO THE CORE BLOCK AND THEN THEB; APPROPRIATE EXECUTIVE ERROR LOGGING ROUTINE IS CALLED. THE COREA; BLOCK ADDRESS IS THEN USED AS A PSEUDO REGISTER BASE ADDRESS BYC; THE ERROR HANDLING ROUTINES. BEFORE THE NEXT FUNCTION IS ISSUED,R(; THE REAL CSR ADDRESS MUST BE RESTORED.;<; NOTE: IF ENTRY IS THE RESULT OF A DEVICE TIMEOUT THEN THIS>; ROUTINE IS EXECUTED AT THE RK611 DEVICE PRIORITY LEVEL (PR5)1; UNTIL THE EXEC ERROR LOGGING ROUTINE IS CALLED.S;E ; INPUTS:N; R2 = CSR ADDRESSE; R4 = SCB ADDRESSC; ; OUTPUTS:%; R2 = ADDRESS OF REGISTER SAVE AREAO; R4 = SCB ADDRESSE; "; R0,R3 ARE PRESERVED ACROSS CALL;- .ENABL LSBS;DMLTMO: MOV #$DVTMO,R1 ;;;GET ADDRESS OF OVERLAPPED TIMEOUTT BR 10$ ;;;;DMLERR: MOV #$DVERR,R1 ;GET ADDRESS OF DEVICE ERROR ROUTINE!10$: MOV R3,-(SP) ;SAVE REGISTERS  MOV R0,-(SP) ;...& MOV R1,-(SP) ;SAVE CO-ROUTINE ADDRESS* MOV S.KRB(R4),R3 ;GET CURRENT KRB ADDRESS- MOVB K.CON(R3),R3 ;RETRIEVE CONTROLLER INDEXU& MUL #RMCNT,R3 ;FORM AN INDEX INTO ...' ADD #RGBLK,R3 ;... REGISTER BLOCK AREA " MOV R3,R0 ;COPY REGISTER ADDRESS" MOV R0,-(SP) ;SAVE THIS FOR LATER' CALL REGPAS ;FILL AREA WITH REGISTERS - MOV (SP)+,R2 ;RETRIEVE REGISTER AREA ADDRESSE. CALL @(SP)+ ;CALL EXEC ERROR LOGGING ROUTINE MOV (SP)+,R0 ;RESTORE REGISTERS MOV (SP)+,R00yyt__DATADATADATADATA3 ;... RETURN ; .DSABL LSBP;+5; **-DMRPAS-RK611-RK06/RK07 DISK CARTRIDGE CONTROLLER)"; CONTROLLER REGISTER PASS ROUTINE;O;; THIS ROUTINE WILL TRANSFER THE CONTENTS OF THE CONTROLLER ;; REGISTERS (INCLUDING THE SIX EXTRA MAINTENANCE REGISTERS)V%; INTO A PREVIOUSLY ALLOCATED BUFFER.,;P ; INPUTS:S; R0 = BUFFER ADDRESSS; R1 = I/O PACKET ADDRESS ; R2 = CSR ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS ; OUTPUTS:; R2 = CSR ADDRESS; R3 = DESTROYED;-<DMRPAS: MOV I.PRM+14(R1),KISAR6 ;SET BUFFER RELOCATION BIAS1 MOV I.PRM+16(R1),R0 ;GET REGISTER BUFFER ADDRESSE:REGPAS: MOV #RKMR2/2,R3 ;NUMBER OF MAJOR REGISTERS TO PASS MOV R2,-(SP) ;SAVE CSR ADDRESST+10$: MOV (R2)+,(R0)+ ;TRANSFER THE REGISTERT+ SOB R3,10$ ;LOOP UNTIL ALL ARE TRANSFEREDA" MOV (SP)+,R2 ;RESTORE CSR ADDRESS! MOV R0,R3 ;SAVE BUFFER POSITION-; DETERMINE NUMBER OF WORDS CONTAINED IN SILO ' MOV S.KRB(R4),R0 ;RETRIEVE KRB ADDRESSP, MOVB K.CON(R0),R0 ;PICK UP CONTROLLER INDEX$ CLR SILOA(R0) ;ASSUME NO ADJUSTMENT. BIT #OR,RKCS2-RKMR2(R3) ; WAS DATA AVAILABLE?* BEQ 17$ ;IF EQ- NO ADJUSTMENT WAS NEEDED) INC SILOA(R0) ;COUNT RKDB ALREADY STOREDS812$: BIT #OR,RKCS2(R2) ;CHECK REAL CSR FOR ANY REMAINING BEQ 17$ ;IF EQ, NO- SILO EMPTY TST RKDB(R2) ;POP ANOTHER WORDA) INC SILOA(R0) ;COUNT RKDB ALREADY STOREDR BR 12$ ;UNTIL EMPTY!)17$: CALL DMCLR ;CLEAR CONTROLLER ERRORS * CALL DMCYL ;GET CURRENT CYLINDER ADDRESS7 MOV R0,RKDC-RKMR2(R3) ;STORE CURRENT CYLINDER ADDRESSC# MOV R3,R0 ;RESTORE BUFFER POINTERB CLR R3 ;CLEAR COUNT;"20$: CALL DMCLR ;CLEAR CONTROLLER. MOV R3,RKMR1(R2) ;SELECT DRIVE SERIAL MESSAGE/ CALL DMSD ;SELECT DRIVE TO GET PROPER MESSAGE;* MOV RKMR2(R2),(R0)+ ;SAVE CONTENTS OF MR2* MOV RKMR3(R2),(R0)+ ;SAVE CONTENTS OF MR3. INC R3 ;INCREMENT DRIVE SERIAL MESSAGE COUNT$ CMP R3,#4 ;DONE FOUR MESSAGES YET? BNE 20$ ;NO, LOOP 3 CALLR DMCLER ;CLEAR CONTROLLER AND DRIVE AND EXITR;+5; **-DMDINT-RK611-RK06/RK07 DISK CARTRIDGE CONTROLLERS; DIAGNOSTIC INTERRUPT HANDLER;N?; THIS SUBROUTINE HANDLES INTERUPTS FROM DIAGNOSTIC OPERATIONS.:; IF THE FUNCTION WAS DIAGNOSTIC THEN THE DEVICE REGISTERSE; ARE PASSED BACK TO THE DIAGNOSTIC TASK, THE CONTROLLER (VIA DMRPAS)T;; AND THE DRIVE ARE CLEARED AND THE I/O STATUS IS RETURNED. ;N ; INPUTS:V; R0 = I/O STATUS CODE; R1 = ADDRESS OF I/O PACKET; R2 = ADDRESS OF CSRL; R4 = ADDRESS OF SCBL; R5 = ADDRESS OF UCBE;D ; OUTPUTS:2; R1 = I/O PACKET ADDRESS (IF DIAGNOSTIC FUNCTION); R2 = ADDRESS OF CSRT; R4 = ADDRESS OF SCBH1; C = 1 IF INTERRUPT WAS FROM DIAGNOSTIC FUNCTIONR;O!; R0,R3 ARE PRESERVED ACROSS CALLT;-.DMDINT: CLC ;ASSUME NOT DIAGNOSTIC INTERRUPT. 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 CODED+ TSTB R0 ;WAS THIS A SUCCESSFUL INTERRUPT?A( BMI 20$ ;IF MI JUST PASS THE REGISTERS- CMP #IO.RDH!IQ.UMD,I.FCN(R3) ;READ HEADERS?= BNE 20$ ;NO, PROCESS NORMALS' CLR R0 ;CLEAR BYTE OFFSET INTO BUFFERI( CALL $RELOP ;RELOCATE PHYSICAL ADDRESS/ MOV RKDB(R2),(R1)+ ;TRANSFER FIRST HEADER WORD 0 MOV RKDB(R2),(R1)+ ;TRANSFER SECOND HEADER WORD/ MOV RKDB(R2),(R1)+ ;TRANSFER THIRD HEADER WORDM"20$: CALL DMSDC ;SELECT THE DRIVE$ MOV R3,R1 ;SAVE I/O PACKET ADDRESS, CALL DMRPAS ;PASS THE CONTROLLER REGISTERS' SEC ;SET DIAGNOSTIC INTERRUPT RETURNI& MOV (SP)+,R0 ;RESTORE I/O STATUS CODE' MOV (SP)+,R3 ;RESTORE CONTROLLER INDEXS 30$: RETURN ;+'; **-DMCKB-VALIDATE AND CONVERT THE LBNE;N9; THIS ROUTINE IS CALLED FROM $DRQRQ TO DO LBN PROCESSINGR9; FOR DEVICES WHICH SUPPORT QUEUE OPTIMIZATION. IF BLKC2R9; DETECTS AN ERROR IT WILL RETURN TO THE CORRECT PLACE INS; $DRQRQ AFTER CALLING $IOALT.;M ; INPUTS:T;E; R1=I/O PACKET ADDRESS ; R5=UCB ADDRESS;C ; OUTPUTS:;S4; IF THE CHECKS SUCCEEDS, THEN THE LBN IN THE PACKET=; IS REPLACED BY THE CYLINDER/TRACK/SECTOR. R1 IS PRESERVED.P;R:; IF THE CHECKS FAILS, THEN $IOALT IS ENTERED WITH A F00yyibjbkb a a aINAL8; 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;-;DMCHK: MOV I.FCN(R1),-(SP) ;PUT THE FUNCTION ONTO THE STACKI& CMPB #IO.ATT/256.,1(SP) ;IS IT ATTACH% BEQ 35$ ;IF EQ YES - LEAVE IT ALONEE' CMPB #IO.DET/256.,1(SP) ;IS IT DETACHA% BEQ 35$ ;IF EQ YES - LEAVE IT ALONES) BIC #7,(SP) ;CLEAR THE SUBFUNCTION BITSE- CMP #IO.STC,(SP) ;IS IT SET CHARACTERISTICS?E% BEQ 35$ ;IF EQ YES - LEAVE IT ALONEI TST (SP)+ ;CLEAN THE STACK) CALL $BLKC2 ;CHECK LOGICAL BLOCK NUMBERI0 CMPB #IO.WLB/256.,I.FCN+1(R3) ;WRITE FUNCTION? BNE 20$ ;IF NE NOO8 BITB #IO.WLT&377,I.FCN(R3) ;OK TO WRITE ON LAST TRACK? BNE 20$ ;IF NE YES/ MOV R0,I.PRM+6(R3) ;SAVE STARTING BLOCK NUMBERQ5 ADD #22.,I.PRM+12(R3) ;ADD 1 TRACK'S WORTH OF BLOCKST0 MOV R3,R1 ;RESTORE PACKET ADDRESS FOR THE CALL3 CALL $BLKC2 ;CHECK IF WRITE ON LAST TRACK OF DISKS; MOV I.PRM+6(R3),R0 ;RESTORE ORIGINAL STARTING BLOCK NUMBERL/20$: CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBERL3 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 ADDRESSS' MOV R3,R1 ;RESTORE THE PACKET ADDRESSK30$: RETURN ;EXIT. 35$: TST (SP)+ ;CLEAN THE STACK BR 30$ ;AND EXIT .ENDEACKET ADDRESS FOR THE CALL3 CALL $BLKC2 ;CHECK IF WRITE ON LAST TRACK OF DISKS; MOV I.PRM+6(R .TITLE PARTY3 .IDENT /10.03/. ,;A1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.A; All rights reservedT;EA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.Y; ; D. N. CUTLER 14-FEB-74+; $; MODIFIED FOR RSX-11M-PLUS V2.1 BY:;(; C. B. PUTNAM; J. R. KAUFFMAN; B. S. MCCARTHY; $; MODIFIED FOR RSX-11M-PLUS V3.0 BY:;D; J. W. BERZLE; J. R. KAUFFMAN; J. M. LAWLER; C. B. PUTNAM; #; MODIFIED FOR RSX-11M-PLUS V4.4 BYD; ; B. S. MCCARTHY 28-FEB-91 10.00;5+; BM432 -- ENHANCE COMMENTS IN PARITY CODEr;r; D. CARROLL 24-JULY-1992 10.01I;D5; DC140 -- CORRECT PROCESSING OF USER MODE ERRORS ONA/; NON-CACHE MACHINES (GIVE PRIORITY TO FATAL ; MEMORY ERRORS).;; D. CARROLL 14-DEC-1992 10.02;16; DC141 -- DON'T DISABLE NXM TRAPS ON KDJ11 CPUs WHEN'; THE INTENT IS TO DISABLE UB TRAPS.0;:$; Modified for RSX-11M-PLUS V4.6 by:; ; D. Carroll 18-Oct-1995 10.03;; DC404 - Include PSECT definition to allow ICB pool to be2 ; fully extended during sysgen;C;O"; MEMORY PARITY INTERRUPT HANDLING;L; MACRO LIBRARY CALLSD;  .IF DF P$$RTY6 .MCALL ABODF$, EPKDF$, HWDDF$, PCBDF$, TCBDF$, BGCK$A# ABODF$ ; DEFINE TASK ABORT CODESR' EPKDF$ ; DEFINE ERROR PACKET OFFSETS2% HWDDF$ ; DEFINE HARDWARE REGISTERSP2 PCBDF$ ; DEFINE PARTITION CONTROL BLOCK OFFSETS- TCBDF$ ; DEFINE TASK CONTROL BLOCK OFFSETS6;; PARITY VECTOR;c .ASECT3.=1144% .WORD $PARER ; POINT TO ENTRY POINTI .WORD PR7 ; AT PR7 .PSECTd .PAGE. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;DC404;+(; **-PARER-MEMORY PARITY ERROR INTERRUPT;BN; 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 TO THE SYSTEM STACK IS EXECUTED AND THE TASK IN WHICH./; THE PARITY ERROR OCCURED IS LOCKED IN MEMORY.O;- .ENABL LSB ; FIRST HANDLE RECURSION.+RECURS: JMP 60$ ;;; JUMP TO HALT PROCESSOR ,$PARER::INC $PARLV ;;; INTERRUPT RECURSION? BNE RECURS ;;; IF NE YES5; IF THEY EXIST, WE SAVE THE MEMORY SYSTEM REGISTERST&; IN THE SAVE AREA STARTING AT $MSTAT .IF DF P$$D70 MOV R0,-(SP) ;;; SAVE R0 MOV R1,-(SP) ;;; SAVE R1 - MOV #$MPCSR,R0 ;;; POINT TO PARITY CSR TABLEL1 MOV #$MSTAT,R1 ;;; POINT TO PARITY CSR SAVE AREA / MOV @(R0)+,(R1)+ ;;; SAVE LOW ADD00yyt__DATADATADATADATARESS REGISTERK0 MOV @(R0)+,(R1)+ ;;; SAVE HIGH ADDRESS REGISTER7 MOV #-1,(R1) ;;; ASSUME MEM PARITY ON NONCACHE MACHINES1 CMP (R0)+,#MPCSR-2 ;;; RUNNING ON CACHE MACHINE?? BNE 2$ ;;; IF NE NOE0 MOV @-(R0),(R1)+ ;;; SAVE MEMORY ERROR REGISTER0 TST (R0)+ ;;; POINT TO ADDRESS OF MEM CTRL REG2 MOV @(R0)+,(R1)+ ;;; SAVE MEMORY CONTROL REGISTER( MOV #3,@-2(R0) ;;; TURN CACHE TRAPS OFF2 BIT #HF.KDJ,$HFMSK ;;; IS THIS A KDJ11 PROCESSOR?/ BEQ 1$ ;;; IF EQ, NO, BIT1 = DISABLE UB TRAPS), MOV #1,@-2(R0) ;;; DISABLE ONLY CACHE TRAPS21$: MOV @(R0)+,(R1)+ ;;; SAVE MAINTENANCE REGISTER- MOV @(R0)+,(R1)+ ;;; SAVE CACHE HIT REGISTERP2$: MOV (SP)+,R1 ;;; RESTORE R1C MOV (SP)+,R0 ;;; RESTORE R0 .IFTF,; IF TRAP OCCURRED IN USER MODE, ALL ERRORS; ARE RECOVERABLE) BIT #CMODE,2(SP) ;;; PREVIOUS MODE USER?) BNE 4$ ;;; IF NE YES .IFTR3; TRAP WAS IN KERNEL MODE. IF THE ERROR WAS FATAL,J3; WE CRASH. IF IT WAS A CACHE PARITY ERROR, WE CANI5; DISABLE THE CORRECT PART OF THE CACHE AND CONTINUE &3$: TST $STAT ;;; FATAL MEMORY ERROR? BGT 301$ ;;; IF GT NO JMP 20$ ;;;@%301$: MOV R0,-(SP) ;;; SAVE REGISTERSP MOV R1,-(SP) ;;;;1 MOV #$ERTRK,R1 ;;; POINT TO ERROR TRACKING TABLEF& CALL 14$ ;;; EXECUTE CACHE ALGORITHM# MOV (SP)+,R1 ;;; RESTORE REGISTERST MOV (SP)+,R0 ;;;R RTI ;;; RETURN FROM TRAP; .IFFY)3$: BR 20$ ;;; FATAL MEMORY PARITY ERRORF .IFTF7; AT THIS POINT, WE HAVE A RECOVERABLE ERROR, I.E. ONEW3; WHICH DOESN'T IMPACT THE INTEGRITY OF THE SYSTEMC04$: DIRSV$ ;;; SAVE REGISTERS AND SET PRIORITY .IFT 5; IF IT'S A CACHE ERROR, WE JUST LOG IT AND PROCEED.V TST $STAT ; FATAL MEMORY ERROR* BMI 401$ ; IF MI, YES, MAIN MEMORY ERROR CALL LOG ; LOG CACHE ERROR JMP 11$ ; GO ONM1; FIND THE REGION WITH THE PARITY ERROR AND LOCK;; IT IN MEMORY.?401$: MOV @$MPCSR+2,R0 ; GET CONTENTS OF HIGH ERROR ADDRESS REGO7 MOV @$MPCSR,R1 ; GET CONTENTS OF LOW ERROR ADDRESS REGR5 ASHC #-6,R0 ; DOUBLE SHIFT R0 AND R1 RIGHT SIX BITSF4 MOV #$PARHD,R0 ; GET ADDRESS OF PARTITION LIST HEAD,5$: MOV (R0),R0 ; GET NEXT MAIN PCB ADDRESS BEQ 65$ ; IF EQ END OF LISTV3 CMP P.REL(R0),R1 ; DID ERROR OCCUR IN THIS REGION?I, BHI 65$ ; IF HI THERE IS NO PCB FOR REGION1 MOV P.REL(R0),R2 ; GET BASE ADDRESS OF PARTITIONT/ ADD P.SIZE(R0),R2 ; CALCULATE END OF PARTITION- CMP R2,R1 ; DID ERROR OCCUR IN THIS REGION?R BLOS 5$ ; IF LO NO-6$: MOV P.SUB(R0),R0 ; GET NEXT SUB PARTITION  BEQ 65$ ; IF EQ END OF LISTI3 CMP P.REL(R0),R1 ; DID ERROR OCCUR IN THIS REGION?D, BHI 65$ ; IF HI THERE IS NO PCB FOR REGION1 MOV P.REL(R0),R2 ; GET BASE ADDRESS OF PARTITION / ADD P.SIZE(R0),R2 ; CALCULATE END OF PARTITIONT- CMP R2,R1 ; DID ERROR OCCUR IN THIS REGION?  BLOS 6$ ; IF LO NO2 BIS #PS.PER!PS.NSF!PS.CHK,P.STAT(R0) ;LOCK REGION BIC #PS.FXD,P.STAT(R0) ;A& BR 76$ ; SKIP NON-CACHE MACHINE CODE65$: ; REFERENCE LABEL  .IFTF; 3; LOCK ALL OF THE CURRENT TASK'S REGIONS IN MEMORY 3; PS.FXD IS CLEARED IN THE TASK REGION PCB SO THATC6; THE TASK IS NO LONGER FIXED. THIS WILL ASSURE THAT=; WHEN THE TASK EXITS, IT WILL BE DETACHED FROM ITS REGIONS.;D1 MOV $TKTCB,R0 ; COPY TCB ADDRESS OF CURRENT TASK,' MOV T.PCB(R0),R1 ; GET TASK REGION PCBB( BIC #PS.FXD,P.STAT(R1) ; UNFIX THE TASK" ADD #T.ATT,R0 ; POINT TO ATT LIST<7$: MOV (R0),R0 ; GET ADDRESS OF NEXT ATTACHMENT DESCRIPTOR BEQ 10$ ; IF EQ END OF LISTF( TSTB A.MPCT-A.TCBL(R0) ; TASK MAPPED? BEQ 7$ ; IF EQ NO7 MOV A.PCB-A.TCBL(R0),R1 ; GET PCB ADDRESST3 BIS #PS.PER!PS.NSF!PS.CHK,P.STAT(R1) ; LOCK REGIONE' BIC #PS.FXD,P.STAT(R1) ;M BR 7$ ; GO AGAINM .IFT,<; IF THIS IS A UNIBUS PARITY ERROR, NOTIFY ALL MAPPED TASKS9; IF THIS IS A CPU PARITY ERROR, NOTIFY THE CURRENT TASKK8; IN EITHER CASE, TASKS WHICH ARE FIXED BECOME UNFIXED.?76$: CMP $MPCSR+4,#MEMERR ; IS THIS A NON-CACHE MACHINE HANDLER * BNE 10$ ; IF EQ, YES, DON'T PROCESS UBPE0 BIT #HF.KDJ,$HFMSK ; IS THIS A KDJ11 PROCESSOR?+ BNE 10$ ; YUP, THERE IS NO UBPE IN S00yyibjbkb a a aTATUSS) BIT #30000,$STAT ; UNIBUS PARITY ERROR?G BEQ 10$ ; IF EQ NO MOV R0,-(SP) ; SAVE R0! CALL LOG ; LOG THE PARITY ERROR MOV (SP)+,R0 ; RESTORE R04 ADD #P.ATT,R0 ; POINT TO PARTITION'S ATT DESCR LIST7 8$: MOV (R0),R0 ; POINT TO NEXT ATTACHMENT DESCRIPTOR, BEQ 101$ ; IF EQ END OF LIST( TSTB A.MPCT-A.PCBL(R0) ; TASK MAPPED? BEQ 8$ ; IF EQ NOE3 MOV A.TCB-A.PCBL(R0),R5 ; GET TCB OF ATTACHED TASK#6 MOV T.PCB(R5),R4 ; GET ADDRESS OF TASK REGION PCB) BIC #PS.FXD,P.STAT(R4) ; UNFIX THE TASK0/ MOV #AS.PEA,R4 ; GET CODE FOR PARITY ERROR AST % TST T.ASTL(R5) ; AST ALREADY QUEUED?  BEQ 9$ ; IF EQ NOO MOV T.ASTL+2(R5),R1 ;/ CMPB R4,A.CBL+1(R1) ; PARITY ERROR AST QUEUED?  BEQ 8$ ; IF EQ YES9$: MOV R0,-(SP) ; SAVE R03 CALL DASTT ; DECLARE AN AST FOR THE ATTACHED TASK MOV (SP)+,R0 ; RESTORE R0* BCC 8$ ; IF CC AST SUCCESSFULLY DECLARED TST $STAT ; CACHE ERROR? BGT 8$ ; IF GT, YESM2 BIT #T2.ABO,T.ST2(R5) ; ALREADY MARKED FOR ABORT? BNE 8$ ; IF NE YES MOV R0,-(SP) ; SAVE R0V MOV R5,R1 ; COPY TCB ADDRESS1 MOV #S.PRTY,R0 ; GET CODE FOR PARITY ERROR ABORT  CALL $ABTSK ; ABORT THE TASK901$: MOV (SP)+,R0 ; RESTORE R0R BR 8$ ; GO AGAIN .IFTF8; DECLARE AN AST FOR THE CURRENT TASK. IF PARITY ERROR(; AST IS NOT SPECIFIED, ABORT THE TASK.%10$: CALL LOG ; LOG THE PARITY ERROR;- MOV $TKTCB,R5 ; GET CURRENT TASK TCB ADDRESS / MOV #AS.PEA,R4 ; GET CODE FOR PARITY ERROR ASTA CALL DASTT ; DECLARE AST' BCC 11$ ; IF CC AST HAS BEEN DECLAREDV .IFT TST $STAT ; MAIN MEMORY ERROR?1 BGT 11$ ; IF GT, NOPE, CACHE ERROR, DON'T ABORT  .IFTF MOV R5,R1 ; COPY TCB ADDRESS1 MOV #S.PRTY,R0 ; GET CODE FOR PARITY ERROR ABORT" CALL $ABTSK ; ABORT CURRENT TASK-101$: MOV $FXRPT,R0 ; IS THE FIXER INSTALLED?P BEQ 11$ ; IF EQ NO! CALL $EXRQN ; REQUEST THE FIXERT8; CLEAR ALL PARITY REGISTERS AND REENABLE PARITY ERRORS*11$: CALL $CLPAR ; RESET ALL PARITY CSR'S .IFTA/ MOV #$ERTRK,R1 ; POINT TO ERROR TRACKING TABLED( TST $STAT ; WAS IT ONLY A CACHE ERROR? BGT 14$ ; IF GT YES BR 16$ ;;C; PDP-11/70 CACHE TRAP;F212$: MOV $TTNS-4,-(R1) ;;; SAVE TIME OF LAST ERROR'13$: TST (R1)+ ;;; POINT TO NEXT GROUP -14$: MOVB (R1)+,R0 ;;; GET CACHE DISABLE BITSR BEQ 16$ ;;; IF EQ END OF TABLE* BITB (R1)+,$STAT ;;; ERROR IN THIS GROUP? BEQ 13$ ;;; IF EQ NO, CMP (R1)+,$TTNS-4 ;;; OCCUR IN SAME MINUTE? BNE 12$ ;;; IF NE NO. BISB R0,$MPCTL ;;; DISABLE THAT PART OF CACHE BR 14$ ;;; PROCESS NEXT GROUPD:16$: MOVB $MPCTL,@$MPCSR+6 ;;; LOAD CACHE CONTROL REGISTER .ENDC3; AT THIS POINT EVERYTHING HAS BEEN CLEANED UP ANDT8; THE USER MAY INSERT CODE SPECIFIC TO HIS APPLICATION.E;********************************************************************B;1;; INSERT CODE HERE- IF PS[13:12] .NE. 0 ALL REGISTERS SAVEDI*; IF PS[13:12] .EQ. 0 R0,R1 ONLY SAVED;TE;******************************************************************** ; EXIT SYSTEM;R$ DEC $PARLV ; RESET RECURSION LEVEL RETURN ; EXIT FROM TRAP5; PARITY ERROR OCCURED WHILE IN EXEC CODE. THIS IS A 8; FATAL SITUATION AND THE SYSTEM IS SHUT DOWN. THE USER7; MAY INSERT CODE SPECIFIC TO HIS APPLICATION AT THIS* ; POINT.*20$: ;;; REF LABEL* .IF DF M$$PRO. CALL $DISAN ;;; DISABLE SANITY TIMERS/ALARMS .ENDC ; DF M$$PROE;;;*******************************************************************;;;*7;;; INSERT CODE HERE-ALL REGISTERS HAVE NOT BEEN SAVEDR;;;DE;;;******************************************************************P* MOV #60$,@#4 ;;; PLUG NONEX MEMORY VECTOR MOV R0,-(SP) ;;; SAVE R0D6 MOV #$EXMSG,R0 ;;; GET ADDRESS OF PARITY STOP MESSAGE*30$: MOVB (R0)+,TPS+2 ;;; OUTPUT NEXT BYTE BEQ 50$ ;;; IF EQ DONE40$: TSTB TPS ;;; OUTPUT DONE?D BPL 40$ ;;;IF PL NOY BR 30$ ;;; GO AGAINC 50$: MOV (SP)+,R0 ;;; RESTORE R0B60$: BGCK$A BF.PAR,BE.FHW,HALT ;;; PARITY ERROR WHILE IN EXEC CODE# BR 60$ ;;;IF CONTINUED HALT AGAINE .DSABL LSB .PAGE;+"; **-$CLPAR-CLEAR PARI00yyt__DATADATADATADATATY REGISTERS;*F; THIS ROUTINE CLEARS OUT ALL PARITY ERRORS IN THE MEMORY PARITY ERROR2; REGISTERS AND ENABLES PARITY ERROR NOTIFICATION.;P ; INPUTS:M;A; NONE.M; ; OUTPUTS:; ; NONE.X;Y@; 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 ANYP7; OTHER MEMORY ON THE SYSTEM MUST BE PARITY MEMORY ANDD9; 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.;-5$CLPAR::MOV #$PARTB+2,R0 ; POINT TO PARITY CSR VECTORO10$: ; REF LABEL .IF DF M$$K11# TST (R0) ; EVEN WORD CSR PRESENT?1 BPL 20$ ; IF PL NO5 MOV #21,@(R0)+ ; SET ENABLE AND SINGLE-BIT ECC ERRORE6 BIT #20,@-(R0) ; SINGLE-BIT ECC ERROR BIT SET (MK11)? BEQ 20$ ; IF EQ NO8 MOV #1,@(R0)+ ; SET ENABLE BIT AND CLR REST IN 1ST WORD4 BIC #100000,@(R0)+ ; CLEAR ERROR BIT IN SECOND WORD BR 30$ ;520$: MOV #1,@(R0)+ ; ENABLE PARITY ERROR NOTIFICATION1 .ENDC8 MOV #1,@(R0)+ ; ENABLE PARITY (OR UNIBUS MEM ECC) NOTIF)30$: CMP R0,#$PARTB+2+<16.*2> ; DONE YET? BLO 10$ ; IF LO NO .IF DF P$$D709 MOV @$MPCSR+4,-(SP) ; CLEAR MEMORY SYSTEM ERROR REGISTER  MOV (SP)+,@$MPCSR+4 ; .ENDC RETURN ;(;+4; THE FORMAT OF ERROR LOGGING PACKETS IS AS FOLLOWS:;O3; +-----------------------------------------------+ ; | |&; \ FIXED ERROR LOGGING INFORMATION \ ; | |3; +-----------------------------------------------+F2; | CACHE REGISTER EXISTENCE MASK (SEE BELOW) | 03; +-----------------------------------------------+1/; | PARITY CSR EXISTENCE MASK (SEE BELOW) | 2D3; +-----------------------------------------------+M;R; PARITY CSRS:;("; 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 | 42(3; +-----------------------------------------------+-;- ; CACHE CSRS:-;-3; +-----------------------------------------------+-3; | 177740 LOW ERROR ADDRESS 000001 | 44 3; +-----------------------------------------------+-3; | 177742 HIGH ERROR ADDRESS 000002 | 46-3; +-----------------------------------------------+\3; | 177744 CACHE ERROR REGISTER 000004 | 50E3; +-----------------------------------------------+-3; | 177746 CACHE CONTROL REGISTER 000010 | 5243; +-----------------------------------------------+-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;-0LOG: BIT #ES.LOG,$ERFLA ; ARE WE LOGGING ERRORS? BEQ 30$ ; IF EQ NO INC $ERRSQ ; COUNT THE ERROR: MOV #E$CMEM+,R0 ; GET CODE FOR PARITY ERROR7 MOV #<24.*2>,R1 ; GET SIZE OF DATA SUBPACKET-6 MOV #SM.HDR!SM.TSK!SM.DAT,R2 ; GET CONTROL MASK BITS( CLR R3 ; NO BEGINNING ADDRESS FOR DATA- MOV $TKTCB,R4 ; SET CURRENT TASK TCB ADDRESSO" CLR R5 ; INDICATE NO UCB ADDRESS+ CALL $CRPKT ; CREATE THE ERROR LOG PACKETE BCS 30$ ; IF CS NO PACKETS5 CMP (R1)+,(R1)+ ; SKIP OVER CACHE CSR AND PARITY CSR  ; EXISTENCE MASKS; FILL IN PARITY CSRS AND MASK;2 MOV #$MEMR1,R2 ; POINT TO MEMORY PARITY CSR TABLE CLR -(SP) ; SET PROTOTYPE MASK310$: MOV #-1,(R1)+ ; ASSUME REGISTER DOES NOT EXISTV' CMP #160000,(R2)+ ; REAL CSR ADDRESS ?M$ BHI 15$ ; IF HI NO, LEAV00yyibjbkb a a aE -1 THERE0 MOV @-2(R2),-2(R1) ; REPLACE -1 WITH REAL THING3 BIS $BTMSK-$MEMR1-2(R2),(SP) ; INDICATE CSR EXISTS -15$: CMP R2,#$MEMR1+<16.*2> ; DONE YET?$ BLO 10$ ; IF LO NO+8 MOV (SP)+,-44+2(R1) ; FILL IN PARITY CSR EXISTENCE WORD .IF DF P$$D70- MOV #$MPCSR,R2 ; POINT TO CACHE PARITY CSR'SO2 MOV #$MSTAT,R0 ; POINT TO SAVED CACHE PARITY CSRS CLR -(SP) ; SET PROTOTYPE MASK320$: MOV #-1,(R1)+ ; ASSUME REGISTER DOES NOT EXIST;' CMP #160000,(R2)+ ; REAL CSR ADDRESS ?O$ BHI 25$ ; IF HI NO, LEAVE -1 THERE- MOV (R0),-2(R1) ; REPLACE -1 WITH REAL THINGM3 BIS $BTMSK-$MPCSR-2(R2),(SP) ; INDICATE CSR EXISTSR)25$: TST (R0)+ ; POINT TO NEXT CSR VALUE CMP R2,#$MPCSR+<6*2>; DONE YET? BLO 20$ ; IF LO NO5 MOV (SP)+,-60(R1) ; FILL IN CACHE CSR EXISTENCE WORD  .IFF ; DF P$$D70T, CLR -44(R1) ; INDICATE NO CACHE CSRS EXIST .ENDC ; DF P$$D70* CALL $QUPKT ; QUEUE THE ERROR LOG PACKET30$: RETURN ;D .PAGE;+; DASTT0;(:; DECLARE A PARITY ERROR AST AND SET UP THE AST PARAMETERS;E ; INPUTS:,;R2; R4=CODE INDICATING WHICH AST SHOULD BE DECLARED.;; R5=ADDRESS OF THE TCB OF THE TASK TO DECLARE THE AST FOR.N;O ; 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.R<; THE AST PARAMETERS ARE MOVED TO THE AST CONTROL BLOCK.*; R1=ADDRESS OF THE AST CONTROL BLOCK.;-$DASTT: CALL $DASTT ; DECLARE AN AST- BCS 100$ ; IF CS AST HAS NOT BEEN SPECIFIEDR5 ADD #A.PRM,R1 ; POINT TO PARAMETER LIST IN AST BLOCK0 MOV -2(R1),(R1) ; MOVE NUMBER OF AST PARAMETERS0 ASL (R1)+ ; CALCULATE NUMBER OF BYTES ON STACK .IF DF M$$PRO% MOVB $PROCN,(R1)+ ; GET PROCESSOR IDT TSTB (R1)+ ; SKIP TO NEXT WORD .IFF. CLR (R1)+ ; CLEAR PROCESSOR ID .ENDC2 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? BLO 10$ ; IF LO NO4 MOV #$PARTB+2,R0 ; POINT TO MEMORY PARITY CSR TABLE620$: MOV @(R0)+,(R1)+ ; GET MEMORY PARITY CSR CONTENTS# CMP R0,#$PARTB+<16.*2> ; DONE YET?C BLO 20$ ; IF LO NO CLC ; INDICATE SUCCESS100$: RETURN ; .ENDC ; DF P$$RTY .END ; SKIP TO NEXT WORD .IFF. CLR (R1)+ ; CLEAR PROCESSOR ID .ENDC2 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? BLO 10$ ; IF LO NO4 MOV #$PARTB+2,R0 ; POINT TO MEMORY PARITY C .TITLE DRSPW .IDENT /14.09/;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; 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;A; THIS MODULE WAS ORIGINALLY WRITTEN BY T. J. MILLER ON 26-MAY-77&; AND HAS BEEN PREVIOUSLY MODIFIED BY:;; R. E. CALDWELL; B. S. MCCARTHY; T. J. MILLER; J. E. PROVINO;+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:;.; 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;C+; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:O;N; J. W. BERZLE ; P. K. M. WEISS;+; MODIFIED FOR RSX-11M-PLUS VERSION 4.2 BY: ;G; B. S. MCCARTHY;J+; MODIFIED FOR RSX-11M-PLUS VERSION 4.2 BY:U; ; B. S. MCCARTHY 9-JAN-92 14.09L; +; BM433 -- INTEGRATE DAVE CARROLL'S CHANGEN; (CORRECTS PASSAIC PROBLEM); E; THIS MODULE CONTAINS THE DIRECTIVE ROUTINES AND PRIMARY SUBROUTINES1; WHICH PROVIDE PARENT-OFFSPRING TASKING SUPPORT. ; ; MACRO LIBRARY CALLS ;Z# .MCALL DCBDF$,PKTDF$,TCBDF$,UCBDF$X M .IF DF N$$DIR .MCALL LNMDF$' LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETSD .ENDC ;DF N$$DIRS. DCBDF$ ;DEFINE DEVICE CONTROL BLOCK SYMBOLS, PKTDF$ ;DEFINE I/O PACKET AND OCB OFFSETS, TCBDF$ ;DEFINE TASK CONTROL BLOCK SYMBOLS, UCBDF$ ;DEFINE UNIT CONTROL BLOCK SYMBOLS;+J; **-$DRSRC-SEND REQUEST AND00yyt__DATADATADATADATA CONNECT / VARIABLE SEND REQUEST AND CONNECT /; SEND REQUEST AND PASS OCBT;F; SRDC$S;GE; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A SEND DATA PACKET FOR,E; THE SPECIFIED TASK, CONNECT TO THE TASK AND REQUEST IT IF IT IS NOTN; ALREADY ACTIVE.S;D; DPB FORMAT: (FOR SDRC$)D;F#; WD. 00 -- DIC(141.),DPB SIZE(7.).O-; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50.S.; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50.#; WD. 03 -- ADDRESS OF SEND BUFFER.S;; WD. 04 -- EFN, LENGTH OF ESB (0 = 1 WORD, >0 = 8. WORDS). ?; WD. 05 -- ADDRESS OF AST ROUTINE TO ENTER UPON STATUS RETURN.); WD. 06 -- ADDRESS OF EXIT STATUS BLOCK.E;S; VSRC$E;A@; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A VARIABLE LENGTHB; SEND DATA PACKET FOR THE SPECIFIED TASK, CONNECT TO THE TASK AND); REQUEST IT IF IT IS NOT ALREADY ACTIVE. ;E; DPB FORMAT: (FOR VSRC$)A;O$; WD. 00 -- DIC (141.),DPB SIZE(8.).-; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50.D.; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50.#; WD. 03 -- ADDRESS OF SEND BUFFER.;; WD. 04 -- EFN, LENGTH OF ESB (0 = 1 WORD, >0 = 8. WORDS).N"; WD. 05 -- LENGTH OF SEND BUFFER.?; WD. 06 -- ADDRESS OF AST ROUTINE TO ENTER UPON STATUS RETURN.E); WD. 07 -- ADDRESS OF EXIT STATUS BLOCK.A;T; SDRP$S;IE; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A SEND DATA PACKET FORCC; THE SPECIFIED TASK, UNLINK ALL OR A SELECTED OCB FROM THE CURRENTBD; TASK, LINK THE OCB(S) OFF THE SPECIFIED TASK, AND REQUEST IT IF IT; IS NOT ALREADY ACTIVE.; ; DPB FORMAT: (FOR SDRP$) ;S"; WD. 00 -- DIC(141.),DPB SIZE(9.),; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50-; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50S"; WD. 03 -- ADDRESS OF SEND BUFFER; WD. 04 -- EFN, FLAGS BYTES1; WD. 05 -- LENGTH OF SEND BUFFER (DEFAULT = 13.)DC; WD. 06 -- FIRST HALF OF NAME OF PARENT WHOSE OCB SHOULD BE PASSED -; WD. 07 -- SECOND HALF OF PARENT'S TASK NAMEO3; WD. 08 -- ADDRESS OF OCB TO PASS (CLI TASKS ONLY)F; ;K ; INPUTS:S;T+; R0=ADDRESS OF THE TCB OF THE TARGET TASK.O8; R1=ADDRESS OF THE TASK STATUS WORD OF THE TARGET TASK.@; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.3; R3=ADDRESS OF THE SEND BUFFER ADDRESS IN THE DPB.S/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.5,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.; ;-;; NOTE: ON SYSTEMS SUPPORTING NON RESIDENT TASK HEADERS AND 3; PROTOTYPE TCBS, KISAR6 MAY MAP THE PROTOTYPE TCB84; AT ENTRY AND THEREFORE WE CAN NOT ASSUME THAT THE; TASK HEADER IS MAPPED.S; 5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)S;U;O; FOR SDRC$ AND VSRC$;2-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.C&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.A4; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF A SEND*; PACKET, OFFSPRING CONTROL BLOCK , TASK2; CONTROL BLOCK OR PARTITION CONTROL BLOCK COULD; NOT BE ALLOCATED.T;; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF IT IS ILLEGALF; TO SEND TO THE TARGET TASK. 9; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN INVALIDA#; EVENT FLAG NUMBER IS SPECIFIED.O7; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE EXITY2; STATUS BLOCK IS NOT ENTIRELY WITHIN THE USER'S ; SPACE.;CB; THE SDRP$ DIRECTIVE CON RETURN ALL OF THE ABOVE ERRORS, PLUS THE; FOLLOWING THREE:;R9; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF A PARAMETERN5; RESERVED FOR A LCI ONLY IS USED BY A NON-CLI TASKS3; OR AN ATTEMPT IS MADE TO PASS ALL OCBS TO A CLIO7; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF THERE IS7$; NO OCB FROM THE SPECIFIED PARENT9; DIRECTIVE STATUS OR 'D.RS84' IS RETURNED IF A CLI TASK81; SPECIFIED BOTH A PARENT NAME AND OCB ADDRESS, -; AND THE TWO DO NOT IDENTIFY THE SAME OCB,H0; OR EITHER FIELD IS SUPPLIED WITH THE FLAG TO; PASS ALL OCBSL;-,$DRSRC::MOV R3,R1 ;COPY DPB ADDRESS TO SAVE5 MOV SP,$TEMP3 ;SAVE SP TO FACILITATE POSSIBLE UNWINDS7 CMPB $DICSV+1,#5 ;IS THIS ILLEGAL DPB LENGTH SPECIFIEDS3 BEQ ILLDPB ;IF EQ YES, NOTE THAT $DRSND VALIDATES ;DPB LENGTH FOR OTHER VALUES4 CALL ERRSV ;PUSH CONTE00zyibjbkb a a aXT 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 ADDRESST  .IFFS+ MOV $HEADR,R4 ;RESTORE TASK HEADER ADDRESS .ENDC% CALL $DRSND ;PERFORM SEND OPERATION" MOV 4(SP),R3 ;RESTORE DPB ADDRESS% TST (R3)+ ;POINT TO EVENT FLAG WORDI, CMPB $DICSV+1,#9. ;IS IT AN SDRP$ DIRECTIVE BEQ 20$ ;IF EQ YES$ BR CNRQT ;CONNECT AND REQUEST TASK;O:; CODE TO REMOVE SEND PACKET FROM RECEIVERS QUEUE ON ERROR;A710$: ADD #T.RCVL,R0 ;POINT TO TARGET TASK RECEIVE QUEUEA0 MOV 2(R0),R1 ;GET ADDRESS OF PACKET JUST QUEUED' CALL $GTSPK ;REMOVE IT FROM THE QUEUET# MOV R1,R0 ;COPY POINTER TO PACKETR MOV R0,KISAR6 ;MAP SEND PACKET* MOV @#140002,R1 ;GET NUMBER OF WORDS SENT/ ADD #<6.+37>,R1 ;ALLOW FOR EXTRA CONTROL WORDSI' ASH #-5,R1 ;CONVERT TO 32 WORD BLOCKS.% CALLR $DESEC ;DEALLOCATE THE PACKETI;Q,; LOCATE EXISTING OCB(S) FOR SDRP$ DIRECTIVE; 820$: MOVB 1(R3),R2 ;GET FLAGS BYTE, DOES IT FORCE EXIT?? BMI 30$ ;IF MI YES4 MOV #1,$TEMP3 ;DON'T FORCE EXIT, BUT IT IS AN SDRP$130$: CMP (R3)+,(R3)+ ;POINT TO PARENT NAME FIELDSR$ CALL LOCOCB ;LOCATE OCB(S) TO PASS MOV $TKTCB,R5 ;SET TCB ADDRESS, JMP STRTSK ;REQUEST TASK;+; **-$DRCNC-CONNECT TO TASK ;TD; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CONNECT THE ISSUING TASK TO%; THE SPECIFIED (ACTIVE) TARGET TASK.;;L ; DPB FORMAT:E;#; WD. 00 -- DIC(143.),DPB SIZE(6.).$-; WD. 01 -- FIRST WORD OF TASK NAME IN RAD50.Y.; WD. 02 -- SECOND WORD OF TASK NAME IN RAD50.+; WD. 03 -- EFN, LENGTH OF ESB (DEFAULT=2).N8; WD. 04 -- ADDRESS OF AST ROUTINE TO ENTER UPON STATUS.-; WD. 05 -- ADDRESS OF THE EXIT STATUS BLOCK.K;, ; INPUTS: ;R+; R0=ADDRESS OF THE TCB OF THE TARGET TASK.$8; R1=ADDRESS OF THE TASK STATUS WORD OF THE TARGET TASK.@; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.1; R3=ADDRESS OF THE EVENT FLAG NUMBER IN THE DPB.I/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;T5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)A;=-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.E&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.U:; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF AN OFFSPRING); CONTROL BLOCK COULD NOT BE ALLOCATED.G;; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF AN ATTEMPT ISC(; BEING MADE TO CONNECT TO A CLI TASK.8; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF THE TARGET; TASK IS NOT ACTIVE.E9; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN INVALIDV#; EVENT FLAG NUMBER IS SPECIFIED.=7; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE EXITC.; 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 NOA* BIT #T3.CLI,T.ST3(R0) ;TARGET TASK A CLI? BEQ CNRQT ;IF EQ NON% DRSTS D.RS2 ;CONNECTING TO CLI TASK ,10$: DRSTS D.RS7 ;SPECIFIED TASK NOT ACTIVE;+.; **-$DRREQ-REQUEST, SPAWN, OR CHAIN TO A TASK;RF; THIS ROUTINE INSTRUCTS THE SYSTEM TO REQUEST, SPAWN, OR CHAIN TO THEG; SPECIFIED TASK, DEPENDING ON THE DPB SIZE. IF THE DIRECTIVE IS RPOI$,E;; THE TASK IS CHAINED TO BY UNLINKING ALL OR A SELECTED OCB;@; FROM THE CURRENT TASK, AND LINKING IT TO THE TARGET TASK. THIS3; DIFFERS FROM SPWN$ IN THAT NO NEW OCB IS CREATED.A;T$; DPB FORMAT: (FOR SPAWN OR REQUEST);S/; WD. 00 -- DIC(11.),DPB SIZE(7., 13., OR 14.).R-; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50.E.; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50.9; WD. 03 -- FIRST WORD OF PARTITION NAME - NOT SUPPORTED.O:; WD. 04 -- SECOND WORD OF PARTITION NAME - NOT SUPPORTED.-; WD. 05 -- REQUEST PRIORITY - NOT SUPPORTED. ; WD. 06 -- REQUEST UIC.;; WD. 07 -- EFN, LENGTH OF ESB (0 = 1 WORD, >0 = 8. WORDS). 8; WD. 08 -- ADDRESS OF AST ROUTINE TO ENTER UPON STATUS.&; WD. 09 -- EXIT STATUS BLOCK ADDRESS.=; WD. 10 -- ADDRESS OF COMMAND LINE TO QUEUE FOR TARGET TASK.#; WD. 11 -- LENGTH OF COMMAND LINE.N1; WD. 12 -- VI00 zyt__DATADATADATADATARTUAL TERMINAL UNIT NUMBER FOR TI:.A.; WD. 13 -- ASCII DEVICE NAME (OPTIONAL FIELD);T; DPB FORMAT: (FOR RPOI$)E;D#; WD. 00 -- DIC (11.),DPB SIZE(16.)E-; WD. 01 -- FIRST HALF OF TASK NAME IN RAD50.D.; WD. 02 -- SECOND HALF OF TASK NAME IN RAD50.9; WD. 03 -- FIRST WORD OF PARTITION NAME - NOT SUPPORTED.R:; WD. 04 -- SECOND WORD OF PARTITION NAME - NOT SUPPORTED.-; WD. 05 -- REQUEST PRIORITY - NOT SUPPORTED.M; WD. 06 -- REQUEST UIC.D; WD. 07 -- FIRST HALF OF NAME OF PARENT,WHOSE OCB SHOULD BE PASSED.*; WD. 08 -- SECOND HALF OF NAME OF PARENT.3; WD. 09 -- ADDRESS OF OCB TO PASS (CLI TASK ONLY). &; WD. 10 -- ADDRESS OF COMMAND BUFFER.%; WD. 11 -- LENGTH OF COMMAND BUFFER.O0; WD. 12 -- UNIT NUMBER OF TASK TI:, FLAGS BYTE.&; WD. 13 -- ASCII DEVICE NAME FOR TI:.@; WD. 14 -- FIRST HALF OF NAME TO BE USED FOR NEW TASK IN RAD50.A; WD. 15 -- SECOND HALF OF NAME TO BE USED FOR NEW TASK IN RAD50.N; ; INPUTS:;D+; R0=ADDRESS OF THE TCB OF THE TARGET TASK.O8; R1=ADDRESS OF THE TASK STATUS WORD OF THE TARGET TASK.@; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.3; R3=ADDRESS OF THE PARTITION NAME WORD IN THE DPB.F/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.D,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;D5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)A;O-; 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 ALLOCATIOND0; FAILURE OCCURS ON A PARTITION CONTROL BLOCK,1; OFFSPRING CONTROL BLOCK, COMMAND LINE BUFFER,C; OR A TASK CONTROL BLOCK.;; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF AN ATTEMPT ISD2; 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 SPECIFIEDC/; TASK IS ALREADY ACTIVE (WITH EXCEPTION OF AS); SPAWN TO A COMMAND LINE INTERPRETER).S9; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF AN INVALIDO'; VIRTUAL TERMINAL UNIT IS SPECIFIED.T9; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN INVALIDR#; EVENT FLAG NUMBER IS SPECIFIED.D7; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE EXIT4; STATUS BLOCK OR THE COMMAND LINE IS NOT ENTIRELY#; IN THE TASK'S ADDRESSING SPACE. 9; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF AN ILLEGALP*; DPB SIZE IS SPECIFIED (NOT 7. OR 13.).;PI; THE ABOVE ERRORS ALSO APPLY TO THE RPOI$ DIRECTIVE, EXCEPT FOR 'D.RS97' A; WHICH IT CANNOT RETURN. THE RPOI$ DIRECTIVE CAN ALSO RETURN THES; FOLLOWING ERRORS.C;E9; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF A PARAMETERL5; RESERVED FOR A CLI ONLY IS USED BY A NON-CLI TASK84; OR AN ATTEMPT IS MADE TO PASS ALL OCBS TO A CLI.7; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF THERE ISS%; NO OCB FROM THE SPECIFIED PARENT. 9; DIRECTIVE STATUS OF 'D.RS84' IS RETURNED IF A CLI TASK71; SPECIFIED BOTH A PARENT NAME AND OCB ADDRESS,E0; AND THE TWO DO NOT IDENTIFY THE SAME OCB, OR*; EITHER FIELD IS SUPPLIED WITH THE FLAG%; REQUESTING ALL OCBS TO BE PASSED.;- .ENABL LSB 8$DRREQ::MOV SP,$TEMP3 ;SAVE CURRENT STACK TO EASE UNWIND' CALL ERRSV ;INITIALIZE ERROR RECOVERY ! .WORD NULL ;NO IMMEDIATE ACTIONC .WORD NULL ;NO RECOVERY ACTION% ADD #6,R3 ;POINT TO UIC WORD IN DPB 0 MOV (R3)+,R4 ;PICK UP SPECIFIED UIC FOR REQUEST- CMPB $DICSV+1,#7. ;IS THIS A SIMPLE REQUEST? BNE 5$ ;IF NE NO& MOV T.UCB(R5),R5 ;GET TARGET UCB ADDR CLR $TEMP3 ;NOT AN RPOI$" JMP RQST2 ;DO REQUEST PROCESSING45$: 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$M BNE 10$ ;IF NE NOD7 MOVB 13(R3),R2 ;GET FLAGS BYTE, SHOULD EXIT BE FORCED?D BMI 7$ ;IF MI YESR: MOV #1,$TEMP3 ;NO FORCED EXIT, BUT REMEMBER THIS IS RPOI$'7$: CALL LOCOCB ;LOCATE OCB(S) TO PASS 0 ADD #6,R3 ;POINT TO COMMAND BUFFER ADDR IN DPB BR 35$ ;JOIN COMMON CODE*10$: MOV (PC)+,R5 ;ASSUME ILLEGAL DPB SIZEILLDPB: DRST00zyibjbkb a a aS D.RS99 ;W E)15$: JMP ERROR ; PROCESS THE ERROR IN R5V;4.; CONNECT PROCESSING (CNCT, SDRC, SPWN, VSRC).;RF; COMMON CONNECT AND REQUEST PROCESSING BEGINS HERE FOR REQUEST/SPAWN,L; CONNECT, AND (VARIABLE) SEND REQUEST AND CONNECT DIRECTIVES. THE FOLLOWINGF; SECTION PERFORMS THE CONNECT PROCESSING. AN OFFSPRING CONTROL BLOCKH; IS ALLOCATED TO BE QUEUED TO THE OFFSPRING TASK'S OCB QUEUE. THEN THEE; EVENT FLAG AND EXIT STATUS BLOCK PARAMETERS ARE CHECKED AS THE OFF-EA; SPRING CONTROL BLOCK IS INITIALIZED. IF AN OCB IS SUCCESSFULLYSF; ALLOCATED, ITS ADDRESS IS STORED IN $TEMP1 AS A FLAG THAT IT MUST BE/; QUEUED TO THE TARGET TASK ON SUCCESSFUL EXIT.I;H; <; NOTE: ON SYSTEMS SUPPORTING NON RESIDENT TASK HEADERS AND3; PROTOTYPE TCBS, KISAR6 MAY MAP THE PROTOTYPE TCBS4; AT ENTRY AND THEREFORE WE CAN NOT ASSUME THAT THE; TASK HEADER IS MAPPED. ;T"; REGISTER CONTENTS AT THIS POINT:;E-; R3=PTR TO THE EVENT FLAG NUMBER IN THE DPB. ; 3CNRQT: CLR $TEMP3 ;NOT AN RPOI$ OR SDRP$ DIRECTIVEI! MOV #O.LGTH,R1 ;PICK UP OCB SIZE 4 CALL @(SP)+ ;ALLOCATE OCB WITH TRAIL TO DEALLOCATE* .WORD $ALOCB ;ALLOCATION ROUTINE ADDRESS+ .WORD DEOCB ;DEALLOCATION ROUTINE ADDRESST& BCC 20$ ;IF CC ALLOCATION SUCCESSFUL+ JMP ALLER ;ELSE REPORT ALLOCATION FAILURER120$: MOV R0,$TEMP1 ;STORE OCB ADDRESS FOR CONNECTA M .IF DF N$$DIRS E: CLR O.STAT+10(R0) ; INSURE THAT THE CONTEXT BLOCK IS ZERO0 ; SO ERROR RECOVERY DOESN'T DECREMENT RANDOM ; LOCATIONS IN MEMORYO .ENDC ;DF,N$$DIR  E/ MOV (PC)+,R5 ;ASSUME INVALID EVENT FLAG NUMBER  DRSTS D.RS97 ; MOV R0,R4 ;COPY OCB POINTER., MOVB (R3)+,R0 ;PICK UP SPECIFIED EVENT FLAG' CMP R0,#96. ;VALID EVENT FLAG NUMBER? BHI 15$ ;IF HI NOC/ CMP R0,#64. ;IS IT A GROUP GLOBAL EVENT FLAG?T .IF DF G$$GEF BLOS 25$ ;IF LOS NO  MOV R4,-(SP) ;SAVE R4 .IF DF X$$HDR+ MOV KISAR6,-(SP) ;SAVE KERNEL APR6 MAPPINGE0 MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER* MOV $SAHPT,R4 ;GET ADDRESS OF TASK HEADER .IFF;4 MOV $HEADR,R4 ;GET ADDRESS OF CURRENT TASK'S HEADER M .IFTF7 MOVB H.CUIC+1(R4),R4 ;GET CUURRENT TASK'S GROUP NUMBER, .IFTU P) MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPINGE .ENDC MOV R0,-(SP) ;SAVE R02 CALL $SRGEF ;SEARCH FOR GROUP GLOBAL EVENT FLAGS MOV (SP)+,R0 ;RESTORE R0  MOV (SP)+,R4 ;RESTORE R4(. BCS 15$ ;IF CS, INVALID EVENT FLAG SPECIFIED .IFF ; DF G$$GEF ' BHI 15$ ;INVALID EVENT FLAG SPECIFIEDE .ENDC ; DF G$$GEF425$: MOV $TKTCB,R5 ;PICK UP CURRENT TASK TCB ADDRESS% MOV R0,-(SP) ;SAVE EVENT FLAG NUMBER'5 CALL $CEFIG ;CONVERT EVENT FLAG TO MASK AND ADDRESSR. BIC #1,R1 ;CLR GRP GLOBAL 2ND WORD INDICATOR BIC R0,(R1) ;CLEAR EVENT FLAGE, TST (R4)+ ;SKIP OVER OCB LINK WORD (O.LNK)0 CLR (R4)+ ;INITIALLY CLR MCR LINE PTR (O.MCRL). MOV R5,(R4)+ ;SET PARENT TCB ADDRESS (O.PTCB), MOV #2,R1 ;ASSUME 1 WORD EXIT STATUS BLOCK CLR R0 ;DITTOG1 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 FLAGS127$: CMPB $DICSV+1,#8. ;IS THIS A VSRC$ DIRECTIVET BNE 28$ ;IF NE NOR* TST (R3)+ ;SKIP BUFFER SIZE FIELD IN DPB28$: ;REFERENCE LABEL .IF DF S$$LIB, MOV (R3)+,R2 ;PICK UP SPECIFIED AST ADDRESS+ CALL $CALTA ;CALCULATE PROPER AST ADDRESS- MOV R2,(R4)+ ;SET PROPER AST ADDRESS (O.AST) .IFF1) MOV (R3)+,(R4)+ ;SET AST ADDRESS (O.AST); .ENDC/ MOV (SP)+,(R4)+ ;SET EVENT FLAG NUMBER (O.EFN)Q& MOV R0,(R4) ;INDICATE 1/8 WORDS LONG0 MOV (R3)+,R0 ;PICK UP EXIT STATUS BLOCK ADDRESS, BIS R0,(R4)+ ;SET EXIT STATUS BLOCK ADDRESS5 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 UICL, CLR (R4) ;INITIALIZE CONTEXT BLOCK POINTER& TST R0 ;EXIT STATUS BLOCK SPECIFIED?) BEQ 30$ ;IF EQ NO, BYPASS ADDRESS CHECKD. CALL $ACHCK ;ADDRESS CHECK EXIT STATUS BLOCK! BCC 30$ ;IF CS ADDRESS CHECK OKV&29$: JMP ADCER ;ADDRESS CHECK FAILUREE30$: CMPB $DICSV,#141.00zyt__DATADATADATADATA ;IS DIRECTIVE A (VAR) SEND, REQUEST & CONNECT?T/ BEQ STRTSK ;IF EQ YES, BRANCH TO REQUEST TASKA% BLO 35$ ;IF LO IT IS SPAWN OR RPOI$R2 JMP SUCCESS ;IF HI IT IS CONNECT, RETURN SUCCESS-STRTSK: CLR R4 ;PROPAGATE ISSUING TASK'S UICC& MOV T.UCB(R5),R5 ;SET TI: UCB ADDRESS& JMP RQST1 ;GO TO COMMON REQUEST CODE35$: ;REFERENCE SYMBOLP;D7; TI: DETERMINATION AND COMMAND LINE PROCESSING (SPWN).O;E; HERE THE TARGET TASK'S TI: IS DETERMINED FOR THE SUBSEQUENT REQUESTU?; AND COMMAND LINE PROCESSING IS INITIATED. IF A TERMINAL UNITC?; HAS BEEN SPECIFIED, THEN IT IS VERIFIED AND ITS UCB IS FOUND.31; OTHERWISE THE ISSUING TASK'S UCB IS PROPAGATED. ;I"; REGISTER CONTENTS AT THIS POINT:;L3; R3=PTR TO COMMAND LINE BUFFER ADDRESS IN THE DPB.R ; R5=TCB ADDRESS OF CURRENT TASK;G*40$: MOV T.UCB(R5),R2 ;GET TI: UCB ADDRESS7 CMPB $DICSV+1,#14. ;CAN TI BE SOMETHING OTHER THAN VT?S BLT 45$ ;IF LT NOE$ TST 6(R3) ;WAS A DEVICE SPECIFIED? BEQ 45$ ;IF EQ NOE" CMP 6(R3),#"VT ;IS "VT" SPECIFIED BNE 64$ ;IF NE NO 45$: ;REFERENCE SYMBOLS .IF DF V$$TRM6 MOVB 4(R3),R1 ;WAS A VIRTUAL TERMINAL UNIT SPECIFIED?/ BEQ 80$ ;IF EQ NO, DO COMMAND LINE PROCESSINGE. MOV $VTDCB,R2 ;POINT TO FIRST CREATED VT: DCB450$: CMPB D.UNIT(R2),R1 ;IS THIS THE UNIT SPECIFIED? BEQ 60$ ;IF EQ YES% MOV (R2),R2 ;ELSE POINT TO NEXT DCBC2 CMP D.NAM(R2),#"VT ;IS IT A VIRTUAL TERMINAL DCB? BEQ 50$ ;IF EQ YES BR ILUER ;RETURN ERROR STATUSC'60$: MOV D.UCB(R2),R2 ;POINT TO VT: UCB#2 BIT #T3.CLI,T.ST3(R5) ;IS THE ISSUING TASK A CLI? BNE 80$ ;YES, LET IT THROUGHA CMP R2,T.UCB(R5) ;IS THE ISSUING TASK ALREADY RUNNING ON THE VT?B BEQ 80$ ;THAT'S OK TOO0 CMP U.PTCB(R2),R5 ;UNIT CREATED BY THIS PARENT? BNE ILUER ;IF NE NO: .ENDC ;V$$TRM) BR 80$ ;PERFORM COMMAND LINE PROCESSINGQ864$: MOV R3,R4 ;SAVE POINTER TO COMMAND LINE BUF IN DPB MOV 6(R3),R0 ;GET DEVICE NAME+ BEQ 45$ ;IF EQ, DEVICE NAME NOT SPECIFIEDN% MOV 4(R3),R1 ;GET DEVICE UNIT NUMBERP3 CALL $CVDVN ;CONVERT DEVICE NAME TO A UCB ADDRESSI# BCS ILUER ;IF CS DEVICE NOT FOUNDT( BITB #US.OFL,U.ST2(R2) ;DEVICE OFFLINE? BNE PRVER ;IF NE YES7 BIT #DV.TTY,U.CW1(R2) ;IS SPECIFIED DEVICE A TERMINAL?; BEQ ILUER ;IF EQ NOR2 CMP R2,T.UCB(R5) ;IS CURRENT TASK'S TI: SPECIFIED BEQ 70$ ;IF EQ YES4 BIT #T3.PRV!T3.CLI,T.ST3(R5) ;IS TASK PRIV OR A CLI BEQ PRVER ;IF EQ NOD070$: MOV R4,R3 ;GET ADDRESS OF COMMAND LINE BUF!80$: MOV R2,R5 ;COPY UCB ADDRESSV& BR CMLPR ;DO COMMAND LINE PROCESSING .DSABL LSBN;D; LOCAL ERROR RETURN ROUTINES.;IE; THE FOLLOWING ROUTINES INTERFACE TO $DRTHR AND $ERREC FOR DIRECTIVE?C; ERROR STATUS RETURNS AND ERROR RECOVERY. R5 IS USED TO STORE THE ; ERROR STATUS TRAP INSTRUCTION.;7ADCER: MOV (PC)+,R5 ;PICK UP ADDRESS CHECK ERROR STATUS$ DRSTS D.RS98 ;1ERROR: JMP $ERREC ;THREAD THROUGH ERROR RECOVERYB6ILUER: MOV (PC)+,R5 ;PICK UP ILLEGAL DEVICE UNIT ERROR DRSTS D.RS92 ; BR ERROR ;RETURN ERROR STATUS3PRVER: MOV (PC)+,R5 ;PICK PRIVILEGE VIOLATION ERROR DRSTS D.RS16 ; BR ERROR ;RETURN ERROR STATUSL@ILPARM: MOV (PC)+,R5 ;GET PARAMETER ILLEGAL FOR THIS TASK STATUS DRSTS D.RS8 ;S BR ERROR ;2NOTINS: MOV (PC)+,R5 ;GET TASK NOT INSTALLED ERROR DRSTS D.RS2 BR ERRORE; ;; DEOCB - DEALLOCATES THE CONTEXT BLOCK IN THE OCB (IF ANY) ; BEFORE DEALLOCATING THE OCB;HDEOCB: C .IF DF N$$DIRV C MOV R1,-(SP) ;SAVE SIZE OF OCBT( MOV O.STAT+10(R0),R1 ;GET CONTEXT BLOCK BEQ 10$ ;IF EQ, NONE" CALL $DLCTX ;DEALL CONTEXT BLOCK10$: MOV (SP)+,R1 ;RESTORE SIZE  .ENDC ;DF N$$DIRS JMP $DEACB ;P-; COMMAND LINE PROCESSING FOR SPWN$ AND RPOI$T;; REGISTERS AT THIS POINT ;-; R3=POINTER TO COMMAND BUFFER ADDRESS IN DPBR; R5=TARGET TASK UCB ADDRESS+CMLPR: MOV (R3),R0 ;COMMAND LINE SPECIFIEDN BEQ 80$ ;IF EQ NO $ MOV 2(R3),R1 ;GET LENGTH OF COMMAND$ BEQ 80$ ;IF EQ, EMPTY COMMAND LINE CMP #M$$XLN,R1 ;IS IT TOO LONGS BLOS ADCER ;IF LOS YES) CALL $ACHRO ;ADDRESS CHECK COMMAND LINEX) BCS ADCER ;IF CS, ADDRESS CHECK FAILURER00"zyibjbkb a a a% MOV R3,$TEMP4 ;SAVE POINTER INTO DPBJ* 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 BLOCKS4 CALL @(SP)+ ;ALLOCATE A BUFFER FROM SECONDARY POOL" .WORD $ALSEC ;ALLOCATION ROUTINE$ .WORD $DESEC ;DEALLOCATION ROUTINE BCC 10$ ;IF CC OKI JMP ALLER ;ALLOCATION FAILURE$37$: MOV (PC)+,R5 ;PICK UP COMMAND LINE ERROR STATUSL DRSTS D.RS2 ;S BR ERROR ;RETURN ERROR STATUS 110$: MOV KISAR6,-(SP) ;SAVE POTENTIAL TCB MAPPINGP! MOV $TEMP0,R2 ;GET OFFSPRING TCBT MOV T.ST3(R2),R2 ;SAVE T.ST3#1 MOV R0,KISAR6 ;MAP SEC POOL BLOCK JUST ALLOCATEDN2 MOV #140004,R4 ;SET VIRT. ADDR TO REFERENCE BLOCK' MOV R5,(R4)+ ;PUT UCB ADDRESS IN BLOCKR% MOV 2(R3),(R4)+ ;SET CHARACTER COUNTI CLR -(SP) ;INIT STATUS WORDN( BIT #T3.CLI,R2 ;IS OFFSPRING TASK A CLI BEQ 30$ ;IF EQ NO$ .IF DF A$$CLI) BIS #CC.CLI,(SP) ;SET CLI ONLY RETREIVALD .IFTF ;A$$CLI- MOV $TEMP1,R2 ;POINT TO OCB (IF ANY) TO PASS  BEQ 20$ ;IF EQ, NO OCB. MOV R0,O.MCRL(R2) ;PUT COMMAND ADDRESS IN OCB20$:( TST $TEMP3 ;IS THIS AN RPOI$ DIRECTIVE BEQ 25$ ;IF EQ NOA/ MOV $TKTCB,R2 ;GET TCB ADDRESS OF CURRENT TASKE; BIT #T3.CMD,T.ST3(R2) ;IS CURRENT TASK PART OF CLI COMMAND( BEQ 25$ ;IF EQ NOO6 BIS #CC.TTD,(SP) ;HAVE SYSTEM HANDLE AS IF FROM TTDRV25$: ;REFERENCE LABEL .IFT ;A$$CLI$2 CMP $TEMP0,$MCRPT ;IS COMMAND GOING TO DISPATCHER BNE 30$ ;IF NE NOF0 CMP #^RMCR,-22(R3) ;WAS MCR... TARGET TASK NAME# BNE 30$ ;IF NE NO (IT WAS CLI...)M' BIS #CC.MCR,(SP) ;SET FORCE TO MCR BITO .ENDC ;A$$CLI%30$: MOV (SP)+,(R4)+ ;SET STATUS WORD 2 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 ADDRESSY$ CALL $RELOC ;RELOCATE USER ADDRESS( SUB #20000,R2 ;CONVERT TO APR 5 MAPPING MOV 2(R3),R0 ;GET LENGTHG 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 LENGTH.40$: CMPB #33,-(R4) ;IS THIS CHAR A TERMINATOR BHIS 50$ ;IF HIS YES45$: SOB R1,40$ ;LOOP TST (SP)+ ;CLEAN STACK! BR 70$ ;NO EMBEDDED TERMINATORS1(50$: BEQ 60$ ;IF EQ, AN ESC IS EMBEDDED! CMPB #15,(R4) ;IS A CR EMBEDDED?C BNE 45$ ;IF NE NO 60$: DEC R1 ;ADJUST COUNTER) SUB R1,(SP) ;CALC DIFFERENCE IN LENGTHST; SUB (SP)+,@#C.CCT+140000 ;CALC NUMBER OF CHARS NOW PRESENTT1 BISB #200,(R4) ;FLAG TERMINATOR AS USER SUPPLIEDT- MOVB (R4),@#C.CTR+140000 ;SET NEW TERMINATORP) MOVB #15,(R4) ;FORCE TRAILING CHAR TO CR .70$: MOV R3,R1 ;GET ADDRESS OF SEC POOL BLOCK7 MOV (SP)+,KISAR6 ;RESTORE POTENTIAL TARGET TCB MAPPING 3 MOV #$CLICQ,R0 ;POINT TO LISTHEAD OF COMMAND QUEUEE5 CALL @(SP)+ ;PUSH ROUTINE TO REMOVE LINE FROM QUEUEE .WORD NULL ;NOTHING TO DO NOWD .WORD $GTSPK ;DEQUEUE ROUTINE 3 MOV $TEMP4,R3 ;GET BACK POINTER TO CMD ADDR IN DPBL6 MOV R1,$TEMP4 ;SAVE ADDRESS OF SEC POOL COMMAND BLOCK,80$: TST $TEMP4 ;IS A COMMAND LINE SUPPLIED BNE RQST ;IF NE YESA MOV $TEMP0,R0 ;GET TARGET TCB% BIT #T3.CLI,T.ST3(R0) ;IS TASK A CLIA+ BNE 7$ ;IF NE YES, LI MUST HAVE A COMMANDR;E; COMMON REQUEST PROCESSING;;MB; HERE IS THE COMMON REQUEST PROCESSING FOR ALL DIRECTIVES IN THISA; MODULE. THE DEFAULT AND PROTECTION UICS ARE DETERMINED, AND THE E; NAME OF THE TASK CALCULATED IF NECESSARY. FOR ALL DIRECTIVES EXCEPTR<; THE RPOI$, THIS IS BASED ON THE TARGET TASK NAME AT OFFSET:; 2 IN THE DPB. THE RPOI$ DIRECTIVE ALLOWS A SPECIFIC NAMEA; FOR THE OFFSPRING TO BE SPECIFIED. THIS CAN ONLY BE DONE IF THEC@; ORIGINAL TARGET HAD A NAME OF THE FORM ...XXX. IF THE NEW NAMEC; IS NOT OF THE ...XXX FORM, IT IS USED AS IS. IF THE NEW SPECIFIEDN>; NAME IS OF THE ...XXX FORM, THE APPROPRIATE FORM OF THE NAME/; FOR THE TASK'S TI:UCB IS CALCULATED AND USED. @; THE TASK IS THEN REQUESTED VIA $TSKRP, UNLESS IT IS A CLI WITHA; A NAME NOT IN THE ...XXX FORM. THESE CLI TASKS ARE REQUESTED BYT9; $EXRQN WHICH IS CALLED BY THE CO00*zyt__DATADATADATADATAMMAND QUEUEING ROUTINE.E; ; REGISTERS AT THIS POINTC;E'; R3=POINTER TO CMD TEXT ADDRESS IN DPBN; R5=TI:UCB ADDRESSO;H%RQST: MOV -10(R3),R4 ;GET REQUEST UICO,RQST1: MOV $TEMP0,R0 ;GET TARGET TCB ADDRESS7RQST2: TST $TEMP3 ;IS THIS AN RPOI$ OR SDRP$ DIRECTIVET BEQ 30$ ;IF EQ NO $ CMPB $DICSV,#141. ;IS THIS AN SDRP$ BEQ 30$ ;IF EQ YES+ ADD #10,R3 ;POINT TO SPECIFIED NAME FIELDL TST (R3) ;WAS A NAME SPECIFIED BEQ 30$ ;IF NE NOS;E!; HANDLE SPECIFIED NAME FOR RPOI$A;D .IF DF A$$CLI' BIT #T3.CLI,T.ST3(R0) ;IS TARGET A CLIO) BNE 10$ ;IF NE YES, CANNOT RENAME A CLII .ENDC ;A$$CLI/ CMP #^R...,T.NAM(R0) ;DOES TARGET HAVE MU NAMEI BEQ 15$ ;IF EQ YES)10$: JMP ILPARM ;ILLEGAL PARAMETER ERRORP 15$: ; % CMP #^R...,(R3) ;IS NEW NAME MU TYPE  BNE 20$ ;IF NE NOC' MOV R5,R0 ;SET ADDRESS OF DESIRED UCB  MOV 2(R3),R1 ;GET NEW NAMEO CALL $SRMUT ;CALC NEW NAME# BCC 25$ ;IF CC, IT ALREADY EXISTS  BR 40$ ;CREATE ITD,20$: CALL $SRSTD ;DOES SPECIFIED TASK EXIST BCS 40$ ;IF CS NOT625$: CMP $TKTCB,R0 ;DID WE FIND TASK ISSUING DIRECTIVE! BNE 60$ ;IF NE NO, USE THIS TCB: CMP #1,$TEMP3 ;IS CURRENT TASK GOING TO EXIT IN DIRECTIVE BNE 40$ ;IF NE YES JMP TSKACT ;TASK ACTIVE ERRORP;5J; CALCULATE TASK NAME FOR ALL CASES OTHER THAN RPOI$ WITH A SPECIFIED NAME;,830$: CMP #^R...,T.NAM(R0) ;DOES TARGET HAVE MU TYPE NAME BEQ 35$ ;IF EQ, YESL! CMP #140000,R0 ;TCB IN SEC POOL?R BHI 70$ ;IF HIGH, NO JMP NOTINS ;OTHERWISE, ERROR-35$: MOV T.NAM+2(R0),R1 ;GET HALF OF NEW NAME MOV R5,R0 ;GET DESIRED TI: UCB CALL $SRMUT ;CALC NEW NAME# BCC 60$ ;IF CC, IT ALREADY EXISTST;37; THE DESIRED TCB DOES NOT EXIST, SO IT MUST BE CREATEDI;E&40$: MOV #T.LGTH,R1 ;GET LENGTH OF TCB CALL $ALOCB ;ALLOCATE ONE  BCC 45$ ;IF CC, OK JMP ALER1 ;IF CS, NO POOL,-45$: MOV $TEMP0,R1 ;GET PROTOTYPE TCB ADDRESSU- CMP #120000,R1 ;IS PROTOTYPE IN PRIMARY POOL0 BHI 50$ ;IF HI YES$ MOV #$PTCPT+1,R1 ;POINT TO APR BIAS.50$: MOV R4,$TEMP0 ;PRESERVE REQUEST UIC AGAIN3 CALL @(SP)+ ;INSTALL NEW TCB WITH TRAIL TO REMOVE .WORD $TCBCP ;COPY AND INSTALL% .WORD $REMO1 ;REMOVE AND DEALLOCATE $ MOV $TEMP0,R4 ;GET REQUEST UIC BACK+60$: MOV R0,$TEMP0 ;USE NEW TCB FROM NOW ONT .IF DF A$$CLI1 INC R5 ;REMEMBER THAT ORIGINAL HAD MU TYPE NAMEA .IFTF ;A$$CLI;3; PUT TCB ADDRESS IN COMMAND BUFFER, AND START TASK#;0770$: MOV $TEMP4,KISAR6 ;MAP COMMAND BUFFER IF IT EXISTSS BEQ 72$ ;IF EQ, NO COMMAND3 MOV R0,@#C.CTCB+140000 ;PUT TCB ADDRESS IN COMMANDA72$: ;REFERENCE LABEL" .IF DF N$$DIR ;NAMED DIRECTORIES MOV R5,R1 ;COPY UCB ADDRESSD BIC #1,R1 ;INSURE UCB IS EVEN# CMPB $DICSV+1,#16. ;IS IT AN RPOI$ BEQ 80$ ;IF EQ YES( BIT #T3.CLI,T.ST3(R0) ;OFFSPRING A CLI? BEQ 80$ ;IF EQ, NO MOV $TEMP1,R2 ;GET OCB, IF ANY BEQ 80$ ;IF EQ, NO OCB MOV $TKTCB,R3 ;GET CURRENT TCB,: CMP R1,T.UCB(R3) ;SPAWNED TASK TI: SAME AS SPAWNING TASK? BEQ 73$ ;IF EQ, YESQ0 BIT #DV.PSE,U.CW1(R1) ;IS THIS A PSEUDO DEVICE? BNE 73$ ;IF NE, YESM. MOV U.CTX(R1),R1 ;USE CONTEXT FROM TARGET UCB BR 75$D373$: MOV T.CTX(R3),R1 ;USE CONTEXT FROM CURRENT TCB,775$: MOV R1,O.STAT+10(R2) ;PUT CONTEXT POINTER INTO OCBP" BEQ 80$ ;IF EQ, NO CONTEXT BLOCK' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING$& MOV R1,KISAR6 ;MAP THE CONTEXT BLOCK- INCB C.REF+140000 ;INCREMENT REFERENCE COUNT3" MOV (SP)+,KISAR6 ;RESTORE MAPPING .IFF ;DF N$$DIR# CMPB $DICSV+1,#16. ;IS IT AN RPOI$  BEQ 80$ ;IF EQ YES MOV $TEMP1,R2 ;GET OCB, IF ANY BEQ 80$ ;IF EQ, NO OCB/ CLR O.STAT+10(R2) ;CLEAR CONTEXT BLOCK POINTER  .ENDC ; DF N$$DIR 80$: MOV R4,R1 ;SET REQUEST UIC MOV R4,-(SP) ;SAVE REQUEST UICC CALL UISET ;CALC PROT/DEF UICS" MOV (SP)+,R4 ;RESTORE REQUEST UIC' BIT #T3.CLI,T.ST3(R0) ;OFFSPRING A CLI, BEQ 90$ ;IF EQ NOE .IFT ;A$$CLI. BIT #1,R5 ;MU NAME TYPE CLIO BNE 90$ ;IF NE YES .IFTF ;A$$CLI, TST R4 ;WAS UIC SPECIFIED IN ORIGINAL DPB? BEQ 85$ ;IF EQ NO8# MOV $TEMP1,R2 ;GET OCB ADDR IF ANYC BEQ 85$ ;IF EQ, NO OCB(002zyibjbkb a a a MOV R1,O.STAT+4(R2) ;SET PROTECTION UIC% MOV R3,O.STAT+6(R2) ;SET DEFAULT UICR$85$: MOV $TEMP4,R1 ;POINT TO COMMAND1 BEQ 90$ ;IF EQ, NO COMMAND FROM RQST$ DIRECTIVEC, 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 FAILUREE;$;I90$: .IFT ;A$$CLI$$ 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 T: CMP R5,T.UCB(R2) ;SPAWNED TASK TI: SAME AS SPAWNING TASK? BEQ 93$ ;IF EQ, YESP0 BIT #DV.PSE,U.CW1(R5) ;IS THIS A PSEUDO DEVICE? BNE 93$ ;IF NE, YESC2 MOV U.CTX(R5),$CTXPT ;USE CONTEXT FROM TARGET UCB BR 95$ 793$: MOV T.CTX(R2),$CTXPT ;PROPAGATE ISSUING TASK'S DDSD .ENDC ;DF N$$DIRL595$: CMP $TEMP3,#1 ;WILL THE CURRENT TASK BE EXITING?L BLOS 97$ ;IF LOS NOR5 BIS #T2.HLT,T.ST2(R2) ;PREVENT A POSSIBLE CHECKPOINT2$97$: MOV #100$,-(SP) ;ASSUME SUCCESS MOV R5,R2 ;GET TARGET UCB ADDR MOV R0,R5 ;SAVE TCB ADDRESST CALL $TSKRP ;REQUEST THE TASKB BCC 99$ ;IF CC, OK& BEQ 98$ ;IF EQ, ALLOCATION SUCCEEDED$ MOV #ALER1,(SP) ;ELSE PROCESS ERROR BR 99$ ;AFTER CLEANUPN*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$?P BEQ 99$ ;IF EQ, TASK ACTIVE OK) MOV #TSKACT,(SP) ;ELSE TASK ACTIVE ERROR#,99$: MOV $TKTCB,R1 ;GET ISSUER'S TCB ADDRESS/ BIC #T2.HLT,T.ST2(R1) ;RESET EXITING CONDITION, RETURNTK; BELIEVE IT OR NOT, THIS CODE REACHES DOWN INTO THE BOWELS OF THE RECOVERYBG; THREADS ON THE STACK AND CHECKS FOR A REFERENCE TO $REMOV TO INDICATERJ; SUCCESS. IT NOW LOOKS FOR $REMO1, BUT ANY FURTHER PROBLEMS IN THIS AREA,(; THIS IS A GOOD PLACE TO START LOOKING.(100$: CMP 6(SP),#$REMO1 ;WAS TCB CREATED BNE 110$ ;IF NE NO. 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 PROCESSINGI .ENABL LSBW3ALLER: ADD #6,SP ;POP THREAD TO DEALLOCATE ROUTINES6ALER1: MOV (PC)+,R5 ;PICK UP ALLOCATION FAILURE STATUS DRSTS D.RS1 ;  BR 10$ 6TSKACT: MOV (PC)+,R5 ;PICK UP TASK ACTIVE ERROR STATUS DRSTS D.RS7 ; $10$: JMP ERROR ;RETURN ERROR STATUS .DSABL LSBC;D; THE TARGET TASK HAS BEEN SUCCESSFULLY STARTED. FROM THIS POINT ON,@; NOTHING CAN GO WRONG. IRREVERSIBLE ACTIONS SUCH AS PROPOGATING?; PROMPT REQUEST BITS AND CHANGING OCB LINKAGES CAN NOW BE DONEFF; SINCE THEY CANNOT GENERATE AN ERROR, AND THE DIRECTIVE MUST SUCCEED.;A-SUCCES: MOV $TEMP0,R4 ;GET TARGET TCB ADDRESSA& ADD #T.OCBH,R4 ;POINT TO ITS OCB LIST# MOV $TEMP1,R1 ;POINT TO ANY OCB(S)I) MOV $TEMP3,R5 ;RPOI$ OR SDRP$ DIRECTIVE?7 BEQ 30$ ;IF EQ NO $ 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 YES6 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 NOU+10$: CALL PSPRMT ;PASS PROMPT CONTROL INFO /20$: CMP #1,R1 ;DETERMINE HOW TO HANDLE OCB(S)I BHI 70$ ;IF HI, NO OCB! BEQ 50$ ;IF EQ, PASS ALL OCB(S)I; CALL $QRMVA ;REMOVE OCB FROM CURRENT TASK (MUST BE THERE); BR 40$ ;30$: TST R1 ;ANY OCBR BEQ 80$ ;IF EQ NOI/ MOV O.PTCB(R1),R2 ;GET PARENT TASK TCB ADDRESSY( 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 EXISTC CLR (R0) ;FORICIBLY EMPTY LIST* MOV R0,2(R0) ;SET SECOND HALF OF LISTHEAD8 MOV R1,@2(R4) ;LINK AFTER PREVIOUS LAST OCB FROM TARGET060$: MOV R1,2(R4) ;SET POINTER TO NEW LAST ENTRY) MOV (R1),R1 ;POINT TO NEXT OCB IN QUEUEV4 BNE 60$ ;IF NE, THERE IS ANOTHER SO UPDATE POINTER570$: MOV $TEMP4,KISAR6 ;MAP COMMAND LINE IF IT EXISTST BEQ 75$ ;IF EQ NO COMMAND LINE9 BICB #200,@00:zyt__DATADATADATADATA#C.CTR+140000 ;ELIM USER TERMINATOR INDICATOR1,75$: CMP #1,R5 ;FORCE CURRENT TASK TO EXIT? BHIS 80$ ;IF HIS NOB5 MOV R5,SP ;POINT STACK BACK TO RETURN ADDR TO DRDSP0, MOV $TKTCB,R5 ;GET CURRENT TASK TCB ADDRESS* CALLR $DREXT ;FORCE CURRENT TASK TO EXIT80$: DRSTS +1 ;THE ENDI;+; **-$DREXS-EXIT WITH STATUS;IB; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO PASS A STATUS WORD TO ALL; PARENT TASKS AND EXIT.;I ; DPB FORMAT:N;I!; WD. 00 -- DIC(29.),DPB SIZE(2.)N; WD. 01 -- STATUS WORD.;C ; INPUTS: ;I;; R2=ADDRESS OF THE SECOND STATUS WORD OF THE CURRENT TASK.T+; R3=ADDRESS OF THE STATUS WORD IN THE DPB.,/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.M,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)H;N@; NO STATUS IS RETURNED TO THE ISSUING TASK SINCE THIS DIRECTIVE; TERMINATES ITS EXECUTION.T;-.$DREXS::BIT #T3.ACP,T.ST3(R5) ;IS THIS AN ACP? BNE 5$ ;IF NE YES0. MOV (R3),T.EFLG+2(R5) ;SET EXIT STATUS IN TCB%5$: CALLR $DREX2 ;INITIATE TASK EXITO;+; **-$DREMS-EMIT STATUS ;RB; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO EMIT A STATUS WORD TO ALL.; OR A SPECIFIED PARENT TASK WITHOUT EXITTING.;S ; DPB FORMAT:T;C#; WD. 00 -- DIC(147.),DPB SIZE(4.).V8; WD. 01 -- FIRST WORD OF PARENT TASK NAME OR 0 FOR ALL.,; WD. 02 -- SECOND WORD OF PARENT TASK NAME.; WD. 03 -- STATUS WORD.;T ; INPUTS:E;:@; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK.0; R3=ADDRESS OF THE PARENT TASK NAME IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.M,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;E5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)P;N-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.C&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.T;; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THE SPECIFIEDK-; TASK IS NOT A PARENT OF THE ISSUING TASK.E;-3$DREMS::MOV 4(R3),-(SP) ;SAVE SPECIFIED STATUS WORDR/ CMP (R3),#^R... ;IS SPECIFIED TASK MULTI-USER?I BNE 10$ ;IF NE NOE1 MOV T.UCB(R5),R0 ;PICK UP UCB ADDRESS FOR $SRMUTS4 MOV 2(R3),R1 ;PICK UP SECOND WORD OF SPECIFIED NAME3 CALL $SRMUT ;CALCULATE TASK NAME (IGNORING C-BIT)D'10$: MOV R3,R4 ;COPY TASK NAME POINTERD.20$: MOV R5,R0 ;COPY ISSUING TASK TCB POINTER# ADD #T.OCBH,R0 ;POINT TO OCB QUEUEA" MOV R0,R1 ;COPY LISTHEAD POINTER)30$: MOV (R1),R1 ;POINT TO NEXT IN QUEUES BEQ 60$ ;IF EQ THERE IS NONE TST (R4) ;TASK NAME SPECIFIED?, BEQ 40$ ;IF EQ YES (PASSING STATUS TO ALL)7 CMP (R4),O.STAT(R1) ;MATCH ON FIRST WORD OF TASK NAME?  BNE 30$ ;IF NE NOR; CMP 2(R4),O.STAT+2(R1) ;MATCH ON SECOND WORD OF TASK NAME?C BNE 30$ ;IF NE NOE#40$: CALL $QRMVA ;REMOVE THE ENTRYV, MOV (SP),R0 ;PICK UP SPECIFIED STATUS WORD6 MOV #S.CACT,R2 ;SET ABORT CODE OF "TASK STILL ACTIVE"+ CALL $QUEXT ;QUEUE THE OCB TO PARENT TASKP* TST (R4) ;PASSING STATUS TO ALL PARENTS? BEQ 20$ ;IF EQ YES50$: TST (SP)+ ;CLEAN STACK RETURN ;C*60$: TST (R4) ;WAS A TASK NAME SPECIFIED? BEQ 50$ ;IF EQ NO.3 DRSTS D.RS8 ;INCONSISTENT WITH CURRENT TASK STATE$; ; LOCAL ROUTINES.O;A;1A; ROUTINE TO INITIALIZE ERROR RECOVERY FOR CONNECT, REQUEST, SENDC!; REQUEST AND CONNECT, AND SPAWN.V;P-ERRSV: MOV R0,$TEMP0 ;SAVE TARGET TCB ADDRESST$ CLR $TEMP1 ;INITIALIZE OCB POINTER- CLR $TEMP4 ;INITIALIZE POINTER TO CMD BLOCKS1 JMP $DRTHR ;INITIALIZE ERROR RECOVERY THREADINGQ;I=; THIS ROUTINE CALCULATES THE DEFAULT AND PROTECTION UICS FOR(; THE CURRENT TASK;P ; INPUTS:B; R1=REQUEST UIC;D ; OUTPUTS:; R1=PROTECTION UICR; R3=DEFAULT UIC%; R4=ADDRESS OF CURRENT TASK'S HEADERO;N; R0 IS PRESERVEDO;E2UISET: MOV $TKTCB,R2 ;GET CURRENT TASK TCB ADDRESS) ADD #T.ST2,R2 ;POINT TO TASK STATUS WORDM .IF DF X$$HDR' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGI0 MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER* MOV $SAHPT,R4 ;GET ADDRESS OF TASK HEADER .IFFQ, MOV $HEADR,R4 ;POINT TO CURRENT TASK HEADER( CALLR $UISET ;CALCULATE DEF/PROT UICS  .IFT  U& CALL $UISET ;CALCULATE00Bzyibjbkb a a a DEF/PROT UICS+ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGA RETURN ;R .ENDC;OE; THIS ROUTINE PASSES THE PROMPTING CONTROL BIT (T3.MCR) AND THE CLI;BC; COMMAND EXECUTION INDICATOR BIT (T3.CMD) FROM THE CURRENT TASK TORB; THE TARGET. IT IS CALLED ONLY IF THE CURRENT TASK HAS PASSED ALLF; ITS OCBS TO THE TARGET, OR IF EITHER THE CURRENT OR TARGET IS A CLI.?; THE TERMINATOR CHARACTER IN THE COMMAND BUFFER (IF IT EXISTS)$C; IS SET TO A CARRIAGE RETURN IF THE T3.MCR BIT IS TURNED ON IN THEA ; TARGET TCB; ; INPUTS:K;RA; R0=ADDRESS OF OCB QUEUE LISTHEAD (T.OCBH) IN CURRENT TASK'S TCBS@; R4=ADDRESS OF OCB QUEUE LISTHEAD (T.OCBH) IN TARGET TASK'S TCB;O ; OUTPUTS:; 7; THE STATUS BITS ARE PROPOGATED TO THE TARGET TASK TCBA;T; ALL REGISTERS PRESERVEDC;E?PSPRMT: MOV T.ST3-T.OCBH(R0),-(SP) ;GET T.ST3 FROM CURRENT TASKC< BIC #^C,(SP) ;CLEAR ALL BUT BITS OF INTEREST8 BIC (SP),T.ST3-T.OCBH(R0) ;CLEAR BITS IN CURRENT TASK .IF DF A$$CLI3 BIT #T3.CLI,T.ST3-T.OCBH(R4) ;IS TARGET TASK A CLIR BNE 5$ ;IF NE YES  .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 TARGET'S BITS LIKE CURRENT WAS85$: BIT #T3.MCR,(SP)+ ;WILL CURRENT ISSUE PROMPT ON EXIT BEQ NULL ;IF EQ NO' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGE3 MOV $TEMP4,KISAR6 ;MAP COMMAND BUFFER IF IT EXISTSS BEQ 10$ ;IF EQ, NO COMMAND2 BITB #200,@#C.CTR+140000 ;WAS TERM USER SUPPLIED?% BNE 10$ ;IF NE YES, DON'T CHANGE IT#1 MOVB #15,@#C.CTR+140000 ;SET TERMINATOR TO BE CRE&10$: MOV (SP)+,KISAR6 ;RESTORE MAPPING NULL: RETURN;,E; THIS ROUTINE LOCATES THE OCB(S) TO BE PASSED BY THE RPOI$ AND SDRP$ ; DIRECTIVES.I;C ; INPUTS:; ; R2=FLAGS BYTE 1; R3=ADDRESS OF THE PARENT'S TASK NAME IN THE DPBE;O;M ; OUTPUTS:; =; $TEMP1 IS SET WITH THE ADDRESS OF THE OCB TO PASS, CLEAR IFI2; NO OCB IS TO BE PASSED, OR ONE TO PASS ALL OCBS;@?LOCOCB: MOV (SP)+,R4 ;RETURN ADDR TO ALLOW ERROR THREAD TO WORK  ASR R2 ;PASS ALL OCBS. BCS 5$ ;IF CS YESN! ASR R2 ;PASS NEXT OCB IN QUEUE?R BCS 80$ ;IF CS YES+ BR 10$ ;CHECK IF SPECIFIC PARENT IS NAMEDO5$: ;$ MOV $TEMP0,R2 ;POINT TO OBJECT TASK% BIT #T3.CLI,T.ST3(R2) ;IS TASK A CLIA BNE 100$ ;IF NE YES, ILLEGAL) MOV (R3),-(SP) ;WAS PARENT NAME SUPPLIEDP# BIS 4(R3),(SP)+ ;OR AN OCB ADDRESSD BNE 120$ ;IF NE YES, INC $TEMP1 ;INDICATE PASS ALLS BR 70$ ;ALL DONE/10$: MOV $TKTCB,R2 ;POINT TO CURRENT TASK'S TCB ! ADD #T.OCBH,R2 ;ITS OCB LISTHEADR .IF DF A$$CLI4 BIT #T3.CLI,T.ST3-T.OCBH(R2) ;IS ISSUING TASK A CLI BEQ 30$ ;IF EQ NOY+ TST (R3) ;WAS A SPECIFIC PARENT REQUESTEDE BNE 40$ ;IF NE YES) TST 4(R3) ;WAS AN OCB ADDRESS SPECIFIEDT 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 NOI BR 60$ ; .ENDC ;A$$CLI-30$: TST 4(R3) ;WAS AN OCB ADDRESS SPECIFIEDC BNE 100$ ;IF NE YESD+ TST (R3) ;WAS A SPECIFIC PARENT REQUESTED$ BEQ 70$ ;IF EQ NOT,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 NOF CMP O.STAT+2(R2),2(R3) ;MAYBE?? BNE 40$ ;IF NE NO ( TST 4(R3) ;HAS OCB ADDR BEEN SPECIFIED BEQ 60$ ;IF EQ NOR) CMP 4(R3),R2 ;DID THEY FIND THE SAME OCB  BNE 120$ ;IF NE NO,60$: MOV R2,$TEMP1 ;SAVE ADDR OF OCB TO PASS70$: JMP (R4) ;RETURN180$: MOV (R3),-(SP) ;GET PARENT NAME IF SPECIFIEDN+ BIS 4(R3),(SP)+ ;WAS OCB ADDRESS SPECIFIED(- BNE 120$ ;IF NE YES, CANNOT SPECIFIY EITHER;+ MOV $TKTCB,R2 ;TCB ADDRESS OF CURRENT TASK)7 MOV T.OCBH(R2),$TEMP1 ;GET ADDRESS OF NEXT OCB, IF ANYE JMP (R4) ;RETURN;,; ERROR HANDLING;46100$: 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 S3 DRSTS D.RS84 ;150$: JMP ERROR ;ISSUE ERROR)00JzKzt__DATADATADATADATA .END OCB ADDRESS SPECIFIED(- BNE 120$ ;IF NE YES, CANNOT SPECIFIY EITHER;+ MOV $TKTCB,R2 ;TCB ADDRESS OF CURRENT TASK)7 MOV T.OCBH(R2),$TEMP1 ;GET ADDRESS OF NEXT OCB, IF ANYE JMP (R4) ;RETURN;,; ERROR HANDLING;46100$: 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 S3 DRSTS D.RS84 ;150$: JMP ERROR ;ISSUE ERROR) .TITLE DRMAPD .IDENT /05.08/;E1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.K; All rights reservedC;E;T<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;T); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:O;P; B. S. MCCARTHY; J. M. LAWLER; +; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:R;R; J. R. KAUFFMAN; +; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:C;3; B. S. MCCARTHY;5*; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY; J. W. BERZLE; J. R. KAUFFMAN; B. S. MCCARTHY;M+; MODIFIED FOR RSX-11M-PLUS VERSION 4.1 BY:;; B. S. MCCARTHY;S+; MODIFIED FOR RSX-11M-PLUS VERSION 4.2 BY: ;C; B. S. MCCARTHY;N+; MODIFIED FOR RSX-11M-PLUS VERSION 4.4 BY:I;D; D. CARROLL 23-JUL-1992 05.08;PA; DC136 -- FIX OPTIMIZATION WHICH CAUSED WINDOW LENGTH OF 4K*n+1 *; TO LOAD BAD VALUES INTO THE LAST PDR.;O .PAGE;R&; **-CSM DISPATCHER-DISPATCH CSM ENTRY; D; THIS MODULE IS MAPPED AT SUPERVISOR MODE VIRTUAL ZERO ON DETECTINGG; THE PRESENCE OF THE FIRST SUPERVISOR MODE WINDOW IN A CONTEXT SWITCH.SF; THIS ALLOWS TASKS TO HAVE SUPER MODE LIBRARIES AT ARBITRARY STARTING*; ADDRESSES, DESPITE THE OPERATION OF CSM.;I$; * * * N O T E W E L L * * *;F; THIS CODE MUST BE AT VIRTUAL 0 IN SUPERVISOR MODE. SINCE WE JUST MAPH; THIS COMMON AS 32WORDS RO IN SYSXT, THIS CODE MUST BE AT THE BEGINNING; OF THIS COMMON. ;C4; THE ENTRY VECTOR TO SUPERVISOR MODE IS AS FOLLOWS:;P; MOV #COMPLETION-ROUTINE,-(SP)R; CSM #ROUTINE;HC; NOTE: IMMEDIATE MODE EMULATION OF THE CSM INSTRUCTION IS REQUIRED; IN THE EXECUTIVE.;VC; THE CSM INSTRUCTION TRANSFERS CONTROL TO THE ADDRESS CONTAINED INEH; SUPERVISOR MODE VIRTUAL 10. AT THIS POINT THE STACK IS THE FOLLOWING:; ; (SP) ROUTINE ADDRESS); 2(SP) PC (PAST END OF TRANSFER VECTOR)M(; 4(SP) PS WITH CONDITION CODES CLEARED#; 6(SP) COMPLETION-ROUTINE ADDRESSN; 10(SP) RETURN ADDRESSR; >; A ROUTINE ADDRESS OF 0 IS SPECIAL CASED TO SUPPORT RETURN TOE; SUPERVISOR MODE FROM A USER MODE DEBUGGING AID (ODT). IN THIS CASEN; STACK IS THE FOLLOWING:I;H ; (SP) ZEROV$; 2(SP) PC FROM CSM TO BE DISCARDED$; 4(SP) PS FROM CSM TO BE DISCARDED+; 6(SP) SUPER MODE PC SUPPLIED BY DEBUGGERS+; 10(SP) SUPER MODE PS SUPPLIED BY DEBUGGERA;E .IF DF S$$LIB .ENABL LSBS8; BASE ADDRESS USED FOR RELATIVE ADDRESSES WITHIN MODULEBASE:LA; DEBUGGER RETURN TO SUPER MODE ENTRY. MUST START AT VIRTUAL ZEROR. CMP (SP)+,(SP)+ ;CLEAN OFF PS AND PC FROM CSM;VC; THIS ENTRY POINT PERFORMS THE NECESSARY STACK MANAGEMENT TO ALLOWC;; AN RTI FROM SUPER MODE TO EITHER SUPER MODE OR USER MODE.M ; THE IS AS REQUIRED FOR AN RTI:;M; (SP) SUPER MODE PCS; 2(SP) SUPER MODE PSE$ TST 2(SP) ;RETURNING TO USER MODE? BR 70$ ;JOIN COMMON CODEE; CSM TRANSFER ADDRESS, THIS WORD MUST BE AT VIRTUAL 10 IN SUPER MODES( .WORD CSMSVR-BASE ;CSM DISPATCHER ENTRY; DISPATCH CSM ENTRYBCSMSVR: MOV 6(SP),2(SP) ;SET COMPLETION ROUTINE ADDRESS FOR RETURN4 JMP @(SP)+ ;TRANSFER TO SUPER MODE LIBRARY ROUTINE$; EXIT DISPATCHER FOR ODT AND $SRTI:70$: BPL 80$ ;IF PL YES3 MOV #6,-(SP) ;NUMBER OF BYTES FOR (SP), PS, AND PC ( ADD SP,(SP) ;COMPUTE CLEAN STACK VALUE( MTPI SP ;SET UP PREVIOUS STACK POINTER.80$: RTT ;RETURN TO PREVIOUS MODE AND CALLER .DSABL LSBE .ENDC ; DF S$$LIB .PAGE;1K; THE FOLLOWING DIRECTIVES RECEIVE AS INPUT POINTERS TO A WINDOW DEFINITIONMJ; BLOCK, WHICH SERVES AS A COMMUNICATION AREA BETWEEN THE ISSUING 00Rzyibjbkb a a aTASK AND>; THE EXECUTIVE. THE FORMAT OF THE WINDOW DEFINITION BLOCK IS:;S4; -------------------------------------------------; W.NID ! ! !M!; W.NAPR ! BASE APR ! WINDOW ID ! ; ! ! !4; !-----------------------------------------------! ; ! !R*; W.NBAS ! VIRTUAL BASE ADDRESS (BYTES) ! ; ! !B4; !-----------------------------------------------! ; ! !S&; W.NSIZ ! WINDOW SIZE (32W BLOCKS) ! ; ! ! 4; !-----------------------------------------------! ; ! !K; W.NRID ! REGION ID !F ; ! !W4; !-----------------------------------------------! ; ! !--; W.NOFF ! OFFSET IN PARTITION (32W BLOCKS) !! ; ! !I4; !-----------------------------------------------! ; ! !-(; W.NLEN ! LENGTH TO MAP (32W BLOCKS) ! ; ! !S4; !-----------------------------------------------! ; ! !-; W.NSTS ! STATUS WORD ! ; ! !O4; !-----------------------------------------------! ; ! !--; W.NSRB ! SEND/RECEIVE BUFFER ADDR (BYTES) !! ; ! ! 4; -------------------------------------------------;-; MACRO LIBRARY CALLS ; .IF DF P$$LAS# .MCALL HDRDF$,PCBDF$,TCBDF$,WDBDF$I1 HDRDF$ ;DEFINE HEADER AND WINDOW BLOCK OFFSETS-2 PCBDF$ ;DEFINE PCB AND ATTACHMENT DESCR OFFSETS TCBDF$ ;DEFINE TCB OFFSETS-1 WDBDF$ ;DEFINE WINDOW DEFINITION BLOCK OFFSETS  .PAGE;+!; **-$DRCRW-CREATE ADDRESS WINDOWO; J; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ALLOCATE AN ADDRESS WINDOW IN THEG; HEADER OF THE ISSUING TASK, UNMAPPING AND ELIMINATING ANY OVERLAPPING-A; ADDRESS WINDOWS OF THE SAME TYPE, AND OPTIONALLY TO MAP THE NEW ; WINDOW.L; ; DPB FORMAT:$;B"; WD. 00 -- DIC(117.),DPB SIZE(2.).; WD. 01 -- ADDRESS OF WINDOW DEFINITION BLOCK;N ; INPUTS:T;H9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ,; R3=ADDRESS OF THE WINDOW 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 WINDOW DEFINITION BLOCK ARE:; W.NAPR=BASE APR OF REGION.N); W.NSIZ=DESIRED SIZE OF ADDRESS WINDOW.MA; W.NRID=ID OF REGION TO MAP OR 0 FOR TASK REGION (IF WS.MAP=1).T4; W.NOFF=OFFSET WITHIN REGION TO MAP (IF WS.MAP=1).A; W.NLEN=LENGTH TO MAP OR 0 TO DEFAULT TO SMALLER OF WINDOW SIZEE,; OR SIZE LEFT IN PARTITION (IF WS.MAP=1).; W.NSTS=CONTROL INFORMATION.1; WS.SIS=1 IF WINDOW IS TO BE IN SUPER I SPACE. $; WS.MAP=1 IF MAPPING IS TO OCCUR.6; WS.WRT=1 IF MAPPING IS TO OCCUR WITH WRITE ACCESS.;F5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)W;I-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.D&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.W5; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE THE 0; DIRECTIVE FAILS IN THE MAPPING STAGE BECAUSE.; 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-1; WINDOW SIZE COMBINATION IS SPECIFIED OR IF AN9; INVALID REGION OFFSET-LENGTH COMBINATION IS SPECIFIEDC; IN THE MAPPING STAGE.E;; DIRECTIVE STATUS OF 'D.RS85' IS RETURNED IF THERE ARE NO'; AVAILABLE WINDOW BLOCKS.@; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF AN INVALID REGION); ID IS SPECIFIED IN THE MAPPING STAGE..; 3; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:I; W.NID=ASSIGNED WINDOW ID.); W.NBAS=VIRTUAL BASE ADDRESS OF WINDOW.'!; W.NLEN=LENGTH ACTUALLY MAPPED.P6; W.NSTS=INDICATION OF ANY CHANGES IN MAPPING STATUS.8; WS.CRW=1 IF ADDRESS WINDOW SUCCESSFULLY ESTABLISHED.4; WS.ELW=1 IF ANY ADDRESS WINDOWS WERE ELIMINATED.2; WS.UNM=1 IF ANY ADDRESS WINDOWS WERE UNMAPPED.;D9; NOTE: ON SYSTEMS SUPPORTING EXTERNAL TASK HEADERS, THE A3; DIRECTIVE DISPATCHER COPIES THE USER WDB INTO ANS4; INTERMEDIATE BUFFER AREA. ON EXIT, THE DIRECTIVE1; DISPATCHER WILL WRITE ANY OUTPUT FIELDS TO THE=; USER BUFFER. S; ;-1$DRCRW::MOV R4,-(SP) ;SAVE ADDRESS OF TASK00ZzKzt__DATADATADATADATA HEADERN3 MOV H.WND(R4),R4 ;POINT TO NUMBER OF WINDOW BLOCKSW. MOV (R4)+,R1 ;PICK UP NUMBER OF WINDOW BLOCKS .IF DF U$$DAS+ MOV R1,-(SP) ;SAVE NUMBER OF WINDOW BLOCKS1 .ENDC ; DF U$$DAS6 MOV (R3)+,R2 ;PICK UP APR NUMBER IN HIGH BYTE (W.NID) CLRB R2 ;CLEAR OUT LOW BYTEC" CMP R2,#7*256. ;LEGAL APR NUMBER? BLOS 3$ ; IF LOS YES JMP 40$ ;.3$:E/ ASR R2 ;CONVERT TO BASE ADDRESS IN 32W BLOCKSO2 MOV R2,(R3) ;STORE VIRTUAL BASE ADDRESS (W.NBAS)% ASR (R3) ;CONVERT TO BYTES (W.NBAS)A ASR (R3) ; SWAB (R3)+ ;% MOV R2,-(SP) ;CALCULATE HIGH ADDRESSV ADD (R3),(SP) ;(W.NSIZ) BCS 40$ ;IF CS ILLEGAL SIZED# CMP (SP),#2000 ;LEGAL TOP ADDRESS?I BHI 40$ ;IF HI NOC% MOV R1,-(SP) ;SAVE NUMBER OF WINDOWSA .IF DF U$$DAS2 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 ZEROS ;AND ONE ARE OFF LIMITS) .ENDC ; DF U$$DAS-5$: CMP -(R3),-(R3) ;POINT TO START OF WINDOW. ;BLOCK (W.NBAS) (W.NID)R1 MOV #WS.EDS,R0 ;GET NECESSARY BITS FOR SELECTIOND, BIC W.NSTS(R3),R0 ;ALL BITS SET IN W.NSTS ? BNE 10$ ;IF NE NO, LEAVE ALONE .IF DF U$$DAS6 BIC #WS.SIS,W.NSTS(R3) ;ALWAYS CLEAR SUPER I SINCE IT ;WAS JUST A FLAG BIT.< BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D SPACE ?- BNE 10$ ;IF NE YES, LEAVE WINDOW IN D SPACE(> BIC #WS.UDS,W.NSTS(R3) ;CLEAR USER DATA SPACE FOR I ONLY TASK .IFF ; DF U$$DAS: BIC #WS.EDS,W.NSTS(R3) ;ALWAYS LOOKS LIKE IT DEFAULTED TO" ;I SPACE ON NON I/D SYSTEMS .ENDC ; DF U$$DAS?10$: TST W.BSIZ(R4) ;POINTING TO AN ESTABLISHED ADDRESS WINDOW?  BEQ 20$ ;IF EQ NOE  F .IF DF S$$LIB #< BIT #WS.SIS,W.NSTS(R3) ;CREATING SUPERVISOR I SPACE WINDOW? BEQ 14$ ;IF EQ NOT7 TSTB W.BFPD(R4) ;LOOKING AT SUPERVISOR I SPACE WINDOW? BMI 30$ ;IF MI NO BR 15$ ; .IFTF ; DF S$$LIB14$: ;REFERENCE LABEL .IF DF U$$DAS7 BIT #WS.UDS,W.NSTS(R3) ;CREATING USER D SPACE WINDOW ?A BEQ 141$ ;IF EQ NO5 BIT #20,W.BFPD(R4) ;LOOKING AT USER D SPACE WINDOW ?C BEQ 30$ ;IF EQ NOT BR 15$ ;YESP141$: ;REFERENCE LABELD .ENDC ; DF U$$DAS .IFT ; DF S$$LIBF .IF DF U$$DAS7 CMPB #216,W.BFPD(R4) ;LOOKING AT USER I SPACE WINDOW ?N BLT 30$ ;IF LT NOQ .IFF ; DF U$$DAS)3 TSTB W.BFPD(R4) ;LOOKING AT SUPER I SPACE WINDOW ?  BPL 30$ ;IF PL YES .ENDC ; DF U$$DAS  .IFTF E315$: MOV W.BLVR(R4),R0 ;PICK UP LOW VIRTUAL ADDRESSC SWAB R0 ;CONVERT TO 32W BLOCKS ASL R0 ; ASL R0 ;0 CMP 2(SP),R0 ;POSSIBLE VIRTUAL ADDRESS OVERLAP? BLOS 30$ ;IF LOS NO* ADD W.BSIZ(R4),R0 ;CALCULATE HIGH ADDRESS% CMP R2,R0 ;VIRTUAL ADDRESS OVERLAP?I BHIS 30$ ;IF HIS NO .IF DF U$$DAS( TST (SP) ;ALREADY ESTABLISHED WINDOW ?! BEQ 17$ ;IF EQ YES, ALLOW UNMAPA .IFTF ; DF U$$DAS. CMP R1,(SP) ;OVERLAPPING WINDOW ZERO (OR ONE ;IF I/D TASK ?)D .IFT ; DF U$$DASF) BHIS 40$ ;IF HIS YES, DON'T ALLOW UNMAPT .IFF ; DF U$$DAS0' BEQ 40$ ;IF EQ YES, DON'T ALLOW UNMAPR .ENDC ; DF U$$DAS17$: ;REFERENCE LABEL% CALL ELAW ;ELIMINATE ADDRESS WINDOWI.20$: TST (SP) ;HAS A WINDOW BEEN ESTABLISHED? BEQ 30$ ;IF EQ YES? CMP (R3)+,(R3)+ ;POINT TO WINDOW SIZE IN BLOCK (W.NID)(W.NBAS)D> MOV (R3),W.BSIZ(R4) ;STORE SIZE, ESTABLISHING WINDOW (W.NSIZ)7 MOV -(R3),W.BLVR(R4) ;SET LOW VIRTUAL ADDRESS (W.NBAS)O1 MOVB -(R3),R0 ;PICK UP FIRST APR NUMBER (W.NAPR)F+ ASL R0 ;CONVERT APR NUMBER TO WORD OFFSETT  .IFT  U; BIT #WS.SIS,W.NSTS-W.NAPR(R3) ;CREATING SUPERVISOR WINDOW?; BNE 25$ ;IF NE YES F .ENDC L .IF DF U$$DAS9 BIT #WS.UDS,W.NSTS-W.NAPR(R3) ;CREATING D SPACE WINDOW ?A BEQ 23$ ;IF EQ NOI+ ADD #UDSDR0,R0 ;POINT TO FIRST D SPACE PDRI BR 25$ ;ENTER COMMON CODE .ENDC ; DF U$$DAS/23$: ADD #UINDR0,R0 ;POINT TO FIRST I SPACE PDR).25$: MOVB R0,W.BFPD(R4) ;SET FIRST PDR ADDRESS .IF DF M$$PRO!C$$CBPI2 CLR W.BLPD(R4) ;INITIALIZE CACHE BITS IN LAST PDR4 BIT #WS.NBP,W.NSTS-W.NAPR(R3) ;OK TO BYPASS CACHE ?, BEQ 27$ ;IF EQ YES, LEAVE 00bzyibjbkb a a aCACHE BITS ALONE: BIS #WB.NBP,W.BLPD(R4) ;REMEMEBER NOT TO BYPASS THE CACHE27$: ;REFERENCE LABEL .ENDC ; DF M$$PRO!C$$CBPB .IF DF U$$DAS2 MOVB 4(SP),-(R3) ;PICK UP TOTAL NUMBER OF WINDOWS ;(W.NID) .IFF ; DF U$$DASD1 MOVB (SP),-(R3) ;PICK UP TOTAL NUMBER OF WINDOWSC ;(W.NID) .ENDC ; DF U$$DAS, SUB R1,(R3) ;SET ADDRESS WINDOW ID (W.NID)0 CLR (SP) ;INDICATE WINDOW HAS BEEN ESTABLISHED/30$: ADD #W.BLGH,R4 ;POINT TO NEXT WINDOW BLOCKC DEC R1 ;MORE WINDOW BLOCKS?V BGT 10$ ;IF GT YES/ TST (SP)+ ;WAS AN ADDRESS WINDOW ESTABLISHED?E BNE 50$ ;IF NE NOR .IF DF U$$DAS1 CMP (SP)+,(SP)+ ;POP CALCULATED HIGH ADDRESS ANDP ;SAVED NUMBER OF WINDOWS .IFF ; DF U$$DASI( 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 CREATED0 BIT #WS.MAP,W.NSTS(R3) ;IS WINDOW TO BE MAPPED?) BNE $DRMAP ;MAP ADDRESS WINDOW AND EXITR RETURN ;O#40$: DRSTS D.RS84 ;ALIGNMENT ERRORT(50$: DRSTS D.RS85 ;NO AVAILABLE WINDOWS .PAGE;+$; **-$DRELW-ELIMINATE ADDRESS WINDOW;PH; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ELIMINATE THE SPECIFIED ADDRESS*; WINDOW, UNMAPPING IT FIRST IF NECESSARY.;A ; DPB FORMAT:S;"; WD. 00 -- DIC(119.),DPB SIZE(2.).; WD. 01 -- ADDRESS OF WINDOW DEFINITION BLOCK;( ; INPUTS:T;D9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.W,; R3=ADDRESS OF THE WINDOW DEFINITION BLOCK./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.L,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;W2; INPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:+; W.NID=ID OF ADDRESS WINDOW TO ELIMINATE.E;O5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)T;R-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. &; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.O9; DIRECTIVE STATUS OF 'D.RS87' IS RETURNED IF AN INVALIDD!; ADDRESS WINDOW WAS SPECIFIED.S; 3; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:D6; W.NSTS=INDICATION OF ANY CHANGES IN MAPPING STATUS.7; WS.ELW=1 IF ADDRESS WINDOW SUCCESSFULLY ELIMINATED.O0; 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 PERFORMED7 BIS #WS.UNM,W.NSTS(R3) ;INDICATE A WINDOW WAS UNMAPPEDA:10$: CLR W.BSIZ(R4) ;INDICATE ADDRESS WINDOW IS ELIMINATED; BIS #WS.ELW,W.NSTS(R3) ;INDICATE ADDRESS WINDOW ELIMINATEDI RETURN ;D .PAGE;+ ; **-$DRMAP-MAP WINDOW TO REGION;SB; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO MAP THE SPECIFIED ADDRESSF; WINDOW TO AN OFFSET IN THE SPECIFIED REGION, UNMAPPING IF NECESSARY.;; ; DPB FORMAT:V;F"; WD. 00 -- DIC(121.),DPB SIZE(2.).; WD. 01 -- ADDRESS OF WINDOW DEFINITION BLOCK;W ; INPUTS:O;D9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.,; R3=ADDRESS OF THE WINDOW DEFINITION BLOCK./; 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.NID=ID OF WINDOW TO MAP.P@; W.NRID=ID OF REGION TO MAP TO OR 0 TO DEFAULT TO TASK REGION.); W.NOFF=OFFSET WITHIN REGION TO MAP TO.M<; W.NLEN=LENGTH TO MAP OR 0 TO DEFAULT TO SMALLER OF WINDOW#; SIZE OR SIZE LEFT IN PARTITION. ; W.NSTS=CONTROL INFORMATION.(; WS.WRT=1 IF WRITE ACCESS IS DESIRED.;35; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)O;H-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. &; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED. 9; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE DESIRED '; REGION HAS INCURRED A PARITY ERROR.R:; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE DESIRED#; ACCESS TO THE REGION IS DENIED.A9; DIRECTIVE STATUS OF 'D.RS84' IS RETURNED IF AN INVALIDN0; REGION OFFSET-SIZE COMBINATION IS SPECIFIED.9; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF AN INVALIDE; REGION ID IS SPECIFIED.F9; DIRECTIVE STATUS OF 'D.RS87' IS RETURNED IF AN INVALID #; ADDR00jzKzt__DATADATADATADATAESS WINDOW ID IS SPECIFIED.E; 3; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:D!; W.NLEN=LENGTH ACTUALLY MAPPED.C6; W.NSTS=INDICATION OF ANY CHANGES IN MAPPING STATUS..; WS.UNM=1 IF THE WINDOW WAS UNMAPPED FIRST.;NF; THIS DIRECTIVE FIRST BUILDS AN IMAGE OF A MAPPED WINDOW BLOCK ON THEH; STACK. THEN IF NO ERRORS ARE ENCOUNTERED, THE CORRESPONDING WINDOW IS:; UNMAPPED, IF NECESSARY, AND SET UP FROM THE STACK IMAGE.;-$DRMAP::=; FOR EITHER USER D OR SUPER LIBRARY SYSTEMS, WE PUSH THE TWODA; MAPPING MASKS (H.DMAP,H.SMAP) ONTO THE STACK FOR USE DURING APRBB; UPDATE. H.DMAP MUST BE RE-WRITTEN TO THE HEADER AFTER THE UPDATE; SINCE IT MAY HAVE CHANGED. .IF DF S$$LIB!U$$DAS ; ASSUME H.SMAP+1,H.DMAP ;H.SMAP,H.DMAP MUST BE IN SAME WORDN8 MOV H.SMAP(R4),-(SP) ;GET SUPER/USER D MASKS ONTO STACK .ENDC ; DF S$$LIB!U$$DASE. CALL $SRWND ;SEARCH FOR AND VALIDATE ADDRESS ;WINDOW ID- ADD #W.NRID,R3 ;POINT TO SPECIFIED REGION IDI8 CALL $SRATT ;SEARCH FOR MATCHING ATTACHMENT DESCRIPTOR( MOV A.PCB(R5),R2 ;POINT TO ATTACHED PCB: CMP $TKTCB,$FXRPT ;IS THIS THE PARITY ERROR RECOVER TASK? BEQ 5$ ;IF EQ YESH& BIT #PS.PER,P.STAT(R2) ;PARITY ERROR? BEQ 5$ ;IF EQ NO JMP 90$ ;M85$: BIT #WS.RES,W.NSTS-W.NRID(R3) ;MAP ONLY IF RESIDENT? BEQ 10$ ;NO IF EQG8 BIT #PS.CKP!PS.CKR!PS.OUT,P.STAT(R2) ;REGION IN MEMORY? BEQ 10$ ;IF EQ YES JMP 100$ ;+10$: MOV R2,-(SP) ;SET PCB ADDRESS (W.BPCB)R8 MOV W.BLVR(R4),-(SP) ;COPY LOW VIRTUAL ADDRESS (W.BLVR)% TST (R3)+ ;POINT TO OFFSET (W.NRID)M .IF NDF X$$HDRI0 MOV (R3)+,R0 ;PICK UP SPECIFIED OFFSET (W.NOFF) .IFF ; NDF X$$HDR= MOVB P.HDLN(R2),R0 ;PICK UP LENGTH OF EXTERNAL HEADER (OR 0)?3 ADD (R3)+,R0 ;CALCULATE REAL OFFSET INTO PARTITION. ;(ADD IN W.NOFF)0 BCS 35$ ;IF CS THE OFFSET WRAPPED AROUND. THIS+ ;MAY CAUSE A MAP INTO THE EXTERNAL HDR,?) ;SO IT IS TREATED ALWAYS AS AN ERROR,M ;REGARDLESS OF FINAL OFFSET. .ENDC ; NDF X$$HDR(% CMP R0,P.SIZE(R2) ;WITHIN PARTITION?T BHIS 35$ ;IF HIS NOS- MOV (R3),R1 ;PICK UP LENGTH TO MAP (W.NLEN)R" BNE 20$ ;IF NE ONE WAS SPECIFIED6 MOV P.SIZE(R2),R1 ;CALCULATE SIZE TO END OF PARTITION SUB R0,R1 ;AB CMP R1,W.BSIZ(R4) ;SIZE TO END GREATER THAN WINDOW SIZE? (W.BSIZ) BLOS 20$ ;IF LOS NO)3 MOV W.BSIZ(R4),R1 ;DEFAULT TO WINDOW SIZE (W.BSIZ) /20$: MOV R1,(R3)+ ;PASS BACK SIZE USED (W.NLEN)S6 MOV R1,-(SP) ;CALCULATE HIGH VIRTUAL ADDRESS (W.BHVR) SWAB (SP) ;MULTIPLY BY 64F RORB (SP) ;P ROR (SP) ; ROR (SP) ;* DEC (SP) ;POINT TO LAST ADDRESSABLE BYTE ADD 2(SP),(SP) ;O; MOV R5,-(SP) ;STORE ADDR OF ATTACHMENT DESCRIPTOR (W.BATT)Z0 MOV W.BSIZ(R4),-(SP) ;COPY WINDOW SIZE (W.BSIZ)# CMP R1,(SP) ;LEGAL SIZE? (W.BSIZ)T BHI 35$ ;IF HI NON .IF DF X$$HDR' MOV R0,-(SP) ;COPY THE OFFSET (W.NOFF)14 CLR R5 ;SUBTRACT THE HEADER LENGTH FROM THE OFFSET0 MOVB P.HDLN(R2),R5 ;FOR CORRECT ALIGNMENT CHECK8 SUB R5,(SP) ;SUB THE HEADER LENGTH FOR ALIGNMENT CHECK! BIT #7,(SP)+ ;64-BYTE ALIGNMENT?  .IFF ; DF X$$HDRC BIT #7,R0 ;64-BYTE ALIGNMENT?Y .IFTF ; DF X$$HDR BEQ 30$ ;IF EQ NOA3 BIT #WS.64B,(R3) ;64-BYTE ALIGNMENT BEING ALLOWED?4 BEQ 35$ ;IF EQ NOS .IFT ; DF X$$HDR,30$: MOV 2(SP),R5 ;RESTORE R5I/ MOV R0,-(SP) ;SET OFFSET IN PARTITION (W.BOFF)P .IFF ; DF X$$HDR.330$: MOV R0,-(SP) ;SET OFFSET IN PARTITION (W.BOFF)F .ENDC ; DF X$$HDR0 ADD R1,R0 ;POINT PAST LAST 32W BLOCK MAPPED TO% CMP R0,P.SIZE(R2) ;WITHIN PARTITION? BLOS 37$ ;IF LOS YES35$: JMP 70$ ;F;37$: MOV W.BFPD(R4),-(SP) ; SAVE FIRST PDR ADDRESS (W.BFPD);5 BITB #AS.RED!AS.WRT,A.STAT(R5) ;READ ACCESS ALLOWED?6 BEQ 38$ ;IF NE NOG .IF DF M$$PRO!C$$CBPQ7 MOV W.BLPD(R4),-(SP) ;GET PREVIOUS STATE OF CACHE BITSI6 BIC #^C,(SP) ;CLEAR ALL BUT THE NO BYPASS BIT7 BIS #77402,(SP) ;SET FOR READ ACCESS, 4K SIZE (W.BLPD)I .IFF ; DF M$$PRO!C$$CBP8 MOV #77402,-(SP) ;SET FOR READ ACCESS, 4K SIZE (W.BLPD) .ENDC ; DF M$$PRO!C$$CBPP1 BIT #WS.WRT,(R3) ;WRITE ACCESS DESIRED? (W.NSTS) BEQ 40$ ;IF EQ NO(/ BITB #A00rzyibjbkb a a aS.WRT,A.STAT(R5) ;WRITE ACCESS ALLOWED?. BNE 39$ ;IF NE YES38$: JMP 80$ ;W39$: ;REFERENCE LABEL .IF DF M$$PRO!C$$CBPB* BIS #4,(SP) ;CHANGE ACCESS TO READ/WRITE .IFF ; DF M$$PRO!C$$CBP.7 MOV #77406,(SP) ;SET FOR 4K READ/WRITE ACCESS (W.BLPD)) .ENDC ; DF M$$PRO!C$$CBPE40$: ;REF SYMBOLF $ ! .IF DF M$$PRO!C$$CBP( ; BIT #WS.BPS,(R3) ;SHOULD ACCESSES ALWAYS BYPASS THE CACHE?C BEQ 401$ ;IF EQ NO7 BIS #WB.BPS!100000,(SP) ;SET UP TO ALWAYS BYPASS CACHEN .IF DF M$$PRO BR 43$ ; .IFTF ; DF M$$PRO401$:  .IFT ; DF M$$PRO83 BIT #WB.NBP,(SP) ;NOT BYPASSING CACHE THIS WINDOW?B' BNE 43$ ;IF NE YES, SKIP BYPASS TESTSD41$: MOV R1,-(SP) ;SAVE R1" MOV A.PCB(R5),R1 ;GET PCB ADDRESS/ 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 PDRL$42$: MOV R1,R2 ;RESTORE PCB ADDRESS MOV (SP)+,R1 ;RESTORE R1# .ENDC ; DF M$$PRO P .ENDC ; DF M$$PRO!C$$CBP F ,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)G; SINCE THE UNMAP MAY HAVE CAUSED THE USER-D MAPPING TO CHANGE, WE MUSTGF; UPDATE THE COPY OF H.SMAP ON THE STACK FROM THE CHANGED VALUE IN THE ; HEADER.  .IF DF S$$LIB!U$$DAS  .IF DF X$$HDR* MOV $SAHPT,R0 ;GET POINTER TO TASK HEADER .IFF ; DF X$$HDRA* MOV $HEADR,R0 ;GET POINTER TO TASK HEADER .ENDC ; DF X$$HDR@ MOV H.SMAP(R0),W.BLGH(SP) ; UPDATE THE STORED MAPPING FLAG WORD .ENDC ; DF S$$LIB!U$$DASO+45$: MOVB W.BFPD(R4),R0 ;POINT TO FIRST PDR  D W .IF DF S$$LIB ) BMI 46$ ;IF MI USER WINDOW. ADD #SISDR0,R0 ;POINT TO FIRST SUPERVISOR PDR0 TSTB $SUPFL ;IS THIS FIRST SUPER MODE WINDOW ? BNE 455$ ;IF NE YES  MOV R0,-(SP) ;SAVE REGISTERS  MOV R1,-(SP) ;R% CALL $LSUP1 ;MAP SUPERVISOR D SPACE MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R0 ; 6455$: INCB $SUPFL ;INDICATE ADDITIONAL SUPER I WINDOW ( .IFTF S546$: MOV P.REL(R2),R2 ;CALCULATE OFFSET FOR FIRST PDR  ADD 4(SP),R2 ;(W.BOFF)V+ CLRB 3(SP) ;INIT NUMBER OF PDR'S (W.BNPD).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 PDRR D .IFTW H; FIRST CHECK FOR A SUPERVISOR WINDOW. IF IT IS SUPERVISOR, THEN WE MUSTD; CHECK THE SUPERVISOR MAPPING MASK, AND POSSIBLY UPDATE THE SUPER D ; PAR/PDR./ CMP R0,#UINDR0+2 ;USER SPACE (I OR D) WINDOW ?E. 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 NOE/ MOV R2,SDSAR0-SISDR0-2(R0) ;UPDATE SUPER D PARR1 MOV (SP),SDSDR0-SISDR0-2(R0) ;UPDATE SUPER D PDRU BR 55$ ;GO DO NEXT PAR/PDR52$: ;REFERENCE LABEL .IFTF ; DF S$$LIBE; CHECK FOR USER I OR USER D WINDOW. IF A USER I WINDOW, CHECK TO SEE F; IF BOTH SPACES MUST BE UPDATED. IF NOT, UPDATE IS DONE. IF SO, CHECKD; TO SEE IF THIS APR IS USED FOR AN EXPLICIT D WINDOW. IF SO, UPDATE'; IS DONE. IF NOT UPDATE USER D PAR/PDRM .IF DF U$$DAS+ CMP R0,#UDSDR0+2 ;USER DATA SPACE WINDOW ?I) BHIS 53$ ;IF HIS YES, GO UPDATE D SPACET9 BITB $BTMSK-UINDR0-2(R0),W.BLGH+1(SP) ;D SPACE MAPPED BY  ;OTHER WINDOW ?$ BNE 55$ ;IF NE YES, UPDATE IS DONE. MOV R2,UDSAR0-UINDR0-2(R0) ;UPDATE USER D PAR0 MOV (SP),UDSDR0-UINDR0-2(R0) ;UPDATE USER D PDR .ENDC ; DF U$$DAS<; WE HAVE JUST UPDATED A USER D PAR/PDR. CHECK TO SEE IF THED; CORRESPONDING SUPER D SPACE PAR/PDR IS CURRENTLY MAPPED INTO USERD6; OR SUPER I SPACE. IF USER D, UPDATE SUPER D PAR/PDR. .IFT ; DF S$$LIBS9 BITB $BTMSK-2-UINDR0-2(R0),W.BLGH(SP) ;SUPER D MAPPED TOB ;USER D THIS APR ?L# BNE 55$ ;IF NE NO, UPDATE IS DONE;/ MOV R2,SDSAR0-UINDR0-2(R0) ;UPDATE SUPER D PARO1 MOV (SP),SDSDR0-UINDR0-2(R0) ;UPDATE SUPER D PDR .ENDC ; DF S$$LIB .IF DF U$$DAS$ BR 55$ ;BRANCH AROUND D SPACE CODE .IFTF ; DF U$$DAS53$: ;REFERENCE LABEL .IFT ; DF U$$DAS @; SET BIT IN H.DMAP PROTOTYPE INDICATING00zzKzt__DATADATADATADATA THAT THIS APR IS IN USE!; FOR AN EXPLICIT D SPACE WINDOW./> BISB $BTMSK-UDSDR0-2(R0),W.BLGH+1(SP) ;INDICATE USER D WINDOW ;USES THIS APRA; CHECK TO SEE IF USER D AND SUPER D ARE OVERMAPPED FOR THIS APR.V+; IF THEY ARE, THEN UPDATE SUPER D PAR/PDR. .IF DF S$$LIB< BITB $BTMSK-2-UDSDR0-2(R0),W.BLGH(SP) ;SUPER D/USER D OVER- ;MAPPED FOR THIS APR ?O# BNE 55$ ;IF NE NO, UPDATE IS DONES/ MOV R2,SDSAR0-UDSDR0-2(R0) ;UPDATE SUPER D PAR 1 MOV (SP),SDSDR0-UDSDR0-2(R0) ;UPDATE SUPER D PDRH .ENDC ; DF S$$LIB .ENDC ; DF U$$DAS .IF DF S$$LIB M .IFTF (%55$: ADD #200,R2 ;ADVANCE APR OFFSETW SUB #200,R1 ;DONE YET? BGT 50$ ;IF GT NOS D D .IF DF M$$PRO!C$$CBP  * ADD #177,R1 ;CALCULATE VALUE OF LAST APR$ SWAB R1 ;PLACE IT IN THE HIGH BYTE! BIC #77400,(SP) ;INITIALIZE SIZE;# BIS R1,(SP) ;SET SIZE OF LAST PDRF MOV (SP),-(R0) ;SET LAST PDRE , .IFF ; DF M$$PRO!C$$CBPD 0) SWAB R1 ;SHIFT UNUSED SIZE TO HIGH BYTEP CLRB R1 ;CLEAR LOW BYTET) ADD R1,(SP) ;CALCULATE SIZE IN LAST PDRN ADD R1,-(R0) ;SET LAST PDRL  .ENDC ; DF M$$PRO!C$$CBP0 2 A N .IFTO EH; FIRST CHECK FOR A SUPERVISOR WINDOW. IF IT IS SUPERVISOR, THEN WE MUSTD; CHECK THE SUPERVISOR MAPPING MASK, AND POSSIBLY UPDATE THE SUPER D ; PAR/PDR.- CMP R0,#UINDR0 ;USER SPACE (I OR D) WINDOW ?B. 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 NOE .IF DF M$$PRO!C$$CBP / MOV (SP),SDSDR0-SISDR0(R0) ;UPDATE SUPER D PDRL .IFF ; DF M$$PRO!C$$CBPL- ADD R1,SDSDR0-SISDR0(R0) ;UPDATE SUPER D PDR .ENDC ; DF M$$PRO!C$$CBPC BR 59$ ;UPDATE IS DONE56$: ;REFERENCE LABEL .IFTF ; DF S$$LIBE; CHECK FOR USER I OR USER D WINDOW. IF A USER I WINDOW, CHECK TO SEEPF; IF BOTH SPACES MUST BE UPDATED. IF NOT, UPDATE IS DONE. IF SO, CHECKD; TO SEE IF THIS APR IS USED FOR AN EXPLICIT D WINDOW. IF SO, UPDATE'; IS DONE. IF NOT UPDATE USER D PAR/PDRD .IF DF U$$DAS) CMP R0,#UDSDR0 ;USER DATA SPACE WINDOW ? ) BHIS 57$ ;IF HIS YES, GO UPDATE D SPACER$ TST W.BLGH(SP) ;UPDATE ALL SPACES ? BNE 59$ ;IF NE NOP7 BITB $BTMSK-UINDR0(R0),W.BLGH+1(SP) ;D SPACE MAPPED BYE ;OTHER WINDOW ?$ BNE 59$ ;IF NE YES, UPDATE IS DONE .IF DF M$$PRO!C$$CBP,. MOV (SP),UDSDR0-UINDR0(R0) ;UPDATE USER D PDR .IFF ; DF M$$PRO!C$$CBP,, ADD R1,UDSDR0-UINDR0(R0) ;UPDATE USER D PDR .ENDC ; DF M$$PRO!C$$CBP .ENDC ; DF U$$DAS<; WE HAVE JUST UPDATED A USER D PAR/PDR. CHECK TO SEE IF THED; CORRESPONDING SUPER D SPACE PAR/PDR IS CURRENTLY MAPPED INTO USERD6; OR SUPER I SPACE. IF USER D, UPDATE SUPER D PAR/PDR. .IFT ; DF S$$LIB,7 BITB $BTMSK-2-UINDR0(R0),W.BLGH(SP) ;SUPER D MAPPED TOB ;USER D THIS APR ?I# BNE 59$ ;IF NE NO, UPDATE IS DONEM .IF DF M$$PRO!C$$CBP / MOV (SP),SDSDR0-UINDR0(R0) ;UPDATE SUPER D PDR .IFF ; DF M$$PRO!C$$CBPD- ADD R1,SDSDR0-UINDR0(R0) ;UPDATE SUPER D PDR. .ENDC ; DF M$$PRO!C$$CBP  .ENDC ; DF S$$LIB .IF DF U$$DAS$ BR 59$ ;BRANCH AROUND D SPACE CODE .IFTF ; DF U$$DAS57$: ;REFERENCE LABEL .IFT ; DF U$$DAS,A; CHECK TO SEE IF USER D AND SUPER D ARE OVERMAPPED FOR THIS APR.R+; IF THEY ARE, THEN UPDATE SUPER D PAR/PDR.; .IF DF S$$LIB: BITB $BTMSK-2-UDSDR0(R0),W.BLGH(SP) ;SUPER D/USER D OVER- ;MAPPED FOR THIS APR ?0# BNE 59$ ;IF NE NO, UPDATE IS DONE  .IF DF M$$PRO!C$$CBP,/ MOV (SP),SDSDR0-UDSDR0(R0) ;UPDATE SUPER D PDRD .IFF ; DF M$$PRO!C$$CBPD- ADD R1,SDSDR0-UDSDR0(R0) ;UPDATE SUPER D PDRO .ENDC ; DF M$$PRO!C$$CBPD .ENDC ; DF S$$LIB .ENDC ; DF U$$DAS F $-59$: MOV R4,R3 ;COPY POINTER TO WINDOW BLOCKE/ ADD #W.BLGH,R3 ;POINT PAST END OF WINDOW BLOCKP@60$: MOV (SP)+,-(R3) ;COPY IMAGE OF WINDOW BLOCK INTO REAL BLOCK CMP R3,R4 ;DONE YET? BHI 60$ ;IF HI NO;G; IF THIS IS A USER D OR SUPER LIB SYSTEM, THEN THERE IS A FLAG WORD ONPH; THE STACK. IF SUPER LIB SYSTEM ONLY, WE CAN DISCARD THIS WORD. IF USERH; D, THEN THE HIGH BYTE OF THIS WORD MUST BE00zyibjbkb a a a RE-WRITTEN TO H.DMAP IN THEG; TASK HEADER. IN ADDITION, USER D SYSTEMS HAVE AN OVERMAP DEFAULT FLAGF'; WHICH MUST BE REMOVED FROM THE STACK.N .IF NDF U$$DAS. .IF DF S$$LIB TST (SP)+ ;CLEAN OFF FLAG WORD .ENDC ; DF S$$LIB .IFF ; NDF U$$DAS O .IF DF X$$HDR* MOV $SAHPT,R0 ;GET ADDRESS OF TASK HEADER .IFF * MOV $HEADR,R0 ;GET ADDRESS OF TASK HEADER O .ENDC9 MOV (SP)+,H.SMAP(R0) ;UPDATE SUPER/USER D MASK IN HEADER  .ENDC ; DF U$$DAS0 MOV $TKTCB,R0 ;PICK UP CURRENT TASK TCB ADDRESS* MOV W.BPCB(R4),R1 ;PICK UP PCB OF MAPPING S V .IF DF M$$PRO T8 CALL $SETBP ;SET UP OTHER RUNNING MAPPED TASK (IF ANY) U .ENDC . D8 TSTB A.MPCT(R5) ;IS THIS FIRST MAP THROUGH ATTACHMENT ?& BNE 65$ ;IF NE NO, DON'T CALL $ACCRG/ MOV #$ACCRG,-(SP) ;FORCE RETURN THROUGH $ACCRGS865$: INCB A.MPCT(R5) ;INCREMENT MAPPING THROUGH THIS ADB .IF DF X$$HDR&F$$MAPM* CALL $STFMC ;SETUP FAST MAP IF NECESSARY .ENDC ; DF X$$HDR&F$$MAPD% RETURN ;BACK TO CALLER (OR $ACCRG)K570$: DRSTS D.RS84 ;INVALID OFFSET-LENGTH COMBINATIONG380$: DRSTS D.RS16 ;DESIRED ACCESS TO REGION DENIEDT:90$: DRSTS D.RS6 ;REGION HAD LOAD FAILURE OR PARITY ERROR*100$: DRSTS D.RS8 ;REGION IS NON RESIDENT .PAGE;+ ; **-$DRUNM-UNMAP ADDRESS WINDOW;MD; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO UNMAP THE SPECIFIED ADDRESS ; WINDOW.A;N ; DPB FORMAT:A;"; WD. 00 -- DIC(123.),DPB SIZE(2.).; WD. 01 -- ADDRESS OF WINDOW DEFINITION BLOCK;$ ; INPUTS:D;9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.;,; R3=ADDRESS OF THE WINDOW DEFINITION BLOCK./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.D,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;R2; INPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:; W.NID=ID OF WINDOW TO UNMAP. ;D:; OUTPUTS: (DIRECTIVE STATUS AND PS WORD RETURNED TO TASK);I-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.I;; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THE SPECIFIEDU; ADDRESS WINDOW NOT MAPPED.9; DIRECTIVE STATUS OF 'D.RS87' IS RETURNED IF AN INVALID #; ADDRESS WINDOW ID IS SPECIFIED.5;D3; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:L6; W.NSTS=INDICATION OF ANY CHANGES IN MAPPING STATUS.5; WS.UNM=1 IF THE WINDOW WAS SUCCESSFULLY UNMAPPED.P;-5$DRUNM::CALL $SRWND ;SEARCH FOR AND VERIFY WINDOW IDL! CALL $UNMAP ;UNMAP IF NECESSARY & BCC 10$ ;IF CC WINDOW WAS NOT MAPPED= BIS #WS.UNM,W.NSTS(R3) ;INDICATE ADDRESS WINDOW WAS UNMAPPED RETURN ; 010$: DRSTS D.RS8 ;ADDRESS WINDOW WAS NOT MAPPED;+; DRSRF HAS MOVED.;A%; ITS FORWARDING ADDRESS IS DRSRF.MACD;:; THIS IS DUE TO THE ADDITION OF A SEPARATE COMMON FOR THE; PLAS DIRECTIVES.;N>; YOU MAY BE WONDERING WHY DRRRF IS STILL HERE. ALL DIRECTIVES@; WHICH USE A PLAS DEFINITION BLOCK WHICH IS RELOCATED BY DRDSP ?; MUST BE IN THE SAME DIRECTIVE COMMON, SINCE THE RELOCATION OFI?; THE RDB/WDB TRIGGERS MAPPING THE PLAS COMMON. DRSRF RELOCATESRA; THE BLOCK ITSELF AND THEREFORE CAN'T BE INCLUDED IN THE COMMON.W;- .PAGE;+ ; **-$DRRRF-RECEIVE BY REFERENCE;AD; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DEQUEUE THE NEXT RECEIVE BYG; REFERENCE PACKET IN THE RECEIVE QUEUE, OPTIONALLY EXITING IF THERE ISW; NOT ONE THERE.; ; DPB FORMAT: ;E!; WD. 00 -- DIC(81.),DPB SIZE(2.)O.; WD. 01 -- ADDRESS OF WINDOW DEFINITION BLOCK;T ; INPUTS:E;V9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.M,; R3=ADDRESS OF THE WINDOW 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 WINDOW DEFINITION BLOCK ARE:; W.NSTS=CONTROL INFORMATION.3; WS.MAP=1 IF RECEIVED REFERENCE IS TO BE MAPPED.L5; WS.RCX=1 IF TASK EXIT DESIRED IF NO PACKET FOUND.MA; W.NSRB=OPTIONAL ADDRESS OF 10 WORD BUFFER FOR ADDITIONAL INFO.F;N5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)O;H-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.A&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE00zKzt__DATADATADATADATA IS REJECTED. 1; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THEE0; DIRECTIVE FAILS IN THE MAPPING STAGE BECAUSE.; THE SPECIFIED REGION HAS INCURRED A PARITY ; ERROR.9; 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.;U3; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE:Y6; W.NRID=ASSIGNED REGION ID OF THE REFERENCED REGION./; W.NOFF=OFFSET WORD SPECIFIED BY SENDER TASK.U/; W.NLEN=LENGTH WORD SPECIFIED BY SENDER TASK.A/; W.NSTS=STATUS WORD SPECIFIED BY SENDER TASK.E*; WS.RED=1 IF ATTACHED WITH READ ACCESS.+; WS.WRT=1 IF ATTACHED WITH WRITE ACCESS. ,; WS.EXT=1 IF ATTACHED WITH EXTEND ACCESS.,; WS.DEL=1 IF ATTACHED WITH DELETE ACCESS.'; WS.RRF=1 IF RECEIVE WAS SUCCESSFUL.T;-($DRRRF::MOV KISAR6,-(SP) ;SAVE APR6 BIAS3 MOV R3,-(SP) ;SAVE WINDOW DEFINITION BLOCK POINTERD7 MOV T.RRFL(R5),R2 ;PICK UP FIRST RECEIVE BY REF PACKETR BEQ 60$ ;IF EQ THERE IS NONE CLR -(SP) ;INIT EFN ADDRESSY CLR -(SP) ;INIT EFN MASK4 TST (R2)+ ;POINT TO RECEIVER TCB ADDRESS IN PACKET" MOV (R2)+,R0 ;PICK UP TCB ADDRESS BEQ 20$ ;IF EQ NONE SPECIFIEDS6 DECB T.SRCT(R0) ;DECREMENT SENDER'S OUTSTANDING SREFS$ MOV (R2),(SP) ;SET REAL EFN MASK & MOV 2(R2),2(SP) ;SET REAL EFN ADDRESS&20$: MOV R0,-(SP) ;SAVE TCB ADDRESS & CMP (R2)+,(R2)+ ;SKIP TO REGION ID 6 ADD #W.NRID,R3 ;POINT TO REGION ID WORD IN DEF BLOCK ! 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 CHECKT MOV R2,-(SP) ;SAVE R2' CALL $ACHKP ;ADDRESS CHECK THE BUFFER2 MOV (SP)+,R2 ;RESTORE R25 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 NAME125$: MOV #8.,R0 ;SET LOOP COUNT FOR REST OF INFO -30$: MOV (R2)+,(R3)+ ;MOVE REST OF EXTRA INFOT DEC R0 ;DONE YET?* BGT 30$ ;IF GT NOR140$: MOV R5,R3 ;SAVE RECEIVER TASK TCB ADDRESS A0 MOV (SP)+,R5 ;RETRIEVE SENDER TASK TCB ADDRESS ) MOV (SP)+,R0 ;RETRIEVE EVENT FLAG MASK 0 MOV (SP)+,R1 ;RETRIEVE EVENT FLAG WORD ADDRESS " BEQ 50$ ;IF EQ NO FLAG TO SET 1 CALL $SETMG ;SET EFN AND UNLOCK IF GROUP GLOBAL)'50$: MOV R3,R5 ;RESTORE TCB ADDRESS )4 MOV R5,R0 ;POINT TO RECEIVE BY REFERENCE LISTHEAD  ADD #T.RRFL,R0 ; & CALL $QRMVF ;REMOVE PROCESSED PACKET# MOV R1,R0 ;COPY POINTER TO PACKETO CALL $DEPKT ;DEALLOCATE PACKET0 MOV (SP)+,R3 ;RESTORE WINDOW DEFINITION POINTER+ MOV (SP)+,KISAR6 ;RESTORE KERNAL APR6 BIASSA BIS #WS.RRF,W.NSTS(R3) ;INDICATE SUCCESSFUL RECEIVE BY REFERENCEI, BIT #WS.MAP,W.NSTS(R3) ;WINDOW MAP DESIRED? BEQ 80$ ;IF EQ NOC CALLR $DRMAP ;MAP WINDOW>60$: CMPB #213.,$DICSV ;IS THIS RECEIVE BY REFERENCE OR STOP? BNE 61$ ;IF NE NO  CMP (SP)+,(SP)+ ;CLEAN STACK JMP $STPCT ;GO STOP TASK461$: BIT #WS.RCX,W.NSTS(R3) ;DOES TASK WISH TO EXIT? BEQ 70$ ;IF EQ NOC CMP (SP)+,(SP)+ ;CLEAN STACK JMP $DREXT ;PERFORM TASK EXITI)70$: DRSTS D.RS8 ;NO REFERENCES IN QUEUEK80$: RETURN ; .PAGE;+-; **-$DRFMP-FAST REMAP OF TASK ADDRESS WINDOWE;C=; THIS DIRECTIVE IS INVOKED TO PERFORM A FAST REMAP OF A TASK =; ADDRESS WINDOW. THIS IS NOT A DIRECTIVE PER SE (REQUIRES NO >; DPB), BUT IS INVOKED BY LOADING USER REGISTERS AND EXECUTING; AN IOT INSTRUCTION.;J:; TASKS BUILT TO MAKE USE OF THE FAST MAP FACILITY HAVE AN<; ADDITIONAL DATA AREA APPENDED TO THEIR HEADERS. THE FORMAT.; OF THIS BLOCK IS DOCUMENTED IN $STFMP BELOW.;D ; INPUTS: ; ; R0 = FAST MAP ID; R1 = NEW MAP OFFSETA; ; OUTPUTS:;-; R0 = COMPLETION STATUS; +1 = SUCCESSD; IE.ALG = INVALID OFFSET;A; NOTES:;F4; R0 -> R3 ARE DESTROYED DURING FA00zyibjbkb a a aST MAP PROCESSING.;E;; FAST MAP TAKES PLACE AT PR7, KERNEL MODE, STACK DEPTH +1.E;AE; FAST MAP WITH WINDOW LENGTH CHANGE TAKES PLACE AT PR0, KERNEL MODE,T>; STACK DEPTH 0 (LOOKS LIKE INTERRUPT STATE FOR A PR0 DEVICE).;EI; ALTHOUGH SUPERVISOR MODE WINDOWS CAN'T YET BE FAST MAPPED, THE COMMENTSE; IN THIS MODULE INCLUDE INFORMATION RELATIVE TO THAT IMPLEMENTATION.T;F; BLKMUL IS SET TO 2 IF SYSTEM HAS BOTH USER D AND SUPER MODE SUPPORT,D; 1 OTHERWISE. THIS IS BECAUSE THE OFFSET INTO JUMP TABLE FIELD MUST-; BE BIGGER THAN 255. IF THE SYSTEM HAS BOTH.R;- .IF DF X$$HDR&F$$MAPA .IF DF U$$DAS&S$$LIBL BLKMUL = 1K BLKDIV = 2R .IFF ; DF U$$DAS & S$$LIB BLKMUL = 2 BLKDIV = 1T .ENDC ; DF U$$DAS & S$$LIBH;+"$DRFMP::NOP ;;;* * * DEBUG * * *2 MOV $SAHDB,KISAR6 ;;;MAP CURRENT USER TASK HEADER2 BIC #77607,R0 ;;;VALIDATE USER'S FAST MAP POINTER" ;;;(FORCE POINTER TO BE VALID)- ;;;(ALSO, TEST HIGH BIT TO SEE IF WINDOW T" ;;;LENGTH CHANGE WAS DESIRED.)( BMI 20$ ;;;IF MI LENGTH CHANGE DESIRED/ ADD $FMAPP,R0 ;;;GET POINTER TO FAST MAP AREAA% CMP R1,(R0)+ ;;;PAST MAXIMUM OFFSET?  BHIS 10$ ;;;IF HI YES & MOV (R0)+,R2 ;;;GET ADDRESS OF W.BOFF5 MOV R1,(R2) ;;;STORE NEW OFFSET FIELD (LESS P.HDLN)F/ ADD @(R0)+,R1 ;;;ADD IN P.REL OF PCB TO OFFSET;5 MOVB (R0)+,R3 ;;;GET P.HDLN VALUE AND EXPAND TO WORDE/ ADD R3,R1 ;;;FORM REAL ADDRESS OF MAPPED AREAO. ADD R3,(R2)+ ;;;ADJUST OFFSET IN WINDOW BLOCK! MOVB (R2)+,R2 ;;;GET APR ADDRESSD5 ADD #UISAR0-UISDR0,R2 ;;;POINT TO PAR INSTEAD OF PARD& MOVB (R0),R0 ;;;GET JUMP TABLE VALUE .IF DF U$$DAS & S$$LIB ASL R0 ;;;SHIFT INDEX TO WORDS .ENDC ; DF U$$DAS & S$$LIBA( MOV #200,R3 ;;;SET OFFSET BETWEEN PARS' CALL FMPW1(R0) ;;;AND DISPATCH INTO IT)! MOV #1,R0 ;;;SET SUCCESS STATUS; RTT ;;;AND RETURN%10$: MOV #D.RS8,R0 ;;;INDICATE IE.ITSD RTT ;;;RETURN TO USER TASK ; ERROR EXITS FOR LENGTH CHANGES%11$: MOV #D.RS8,R0 ;;;INDICATE IE.ITS2# JMP $INTX1 ;;;RETURN TO USER TASKS&12$: MOV #D.RS84,R0 ;;;INDICATE IE.ALG# JMP $INTX1 ;;;RETURN TO USER TASKE .PAGE;+ ; FAST MAP WITH CHANGE IN LENGTH;-20$: ;;;REFERENCE LABEL1; SAVE SOME REGISTERS AND DROP PROCESSOR PRIORITY  MOV R5,-(SP) ;;;SAVE R5 MOV R4,-(SP) ;;;AND R4V$ DEC $STKDP ;;;SHOW ENTRY TO SYSTEM MTPS #0 ;;;ALLOW INTERRUPTSS$ NOP ;;; * * * D E B U G * * *7; CALCULATE ADDRESS OF FAST MAP HEADER BLOCK AND SET UP1 ; REGISTERS./ ADD #100002,R0 ;REMOVE LENGTH CHANGE INDICATORS ;AND SKIP MAX OFFSET FIELD0 ADD $FMAPP,R0 ;SET UP POINTER TO FAST MAP BLOCK+ MOV (R0)+,R4 ;R4 -> W.BOFF IN WINDOW BLOCKI# BEQ 11$ ;IF EQ, WINDOW NOT MAPPEDL! MOV (R0)+,R5 ;R5 -> P.REL IN PCBR, MOVB (R0)+,R3 ;GET P.HDLN FOR PARTITION AND ;SIGN EXTEND* ADD R3,R1 ;ADJUST OFFSET FIELD BY P.HDLNB; CALCULATE LENGTH TO MAP AND TEST IF LEGAL. IF NOT, RETURN IE.ITS TST R2 ;LENGTH SPECIFIEDS* BEQ 30$ ;IF EQ NO, CALCULATE LENGTH MOV R2,R3 ;COPY LENGTHG ADD R1,R3 ;ADD IN OFFSETI( BCS 11$ ;IF CS ADD WRAPPED AROUND( CMP R3,P.SIZE-P.REL(R5) ;LENGTH LEGAL? BLOS 40$ ;IF LOS YESI BR 11$ ;IF HI NOW130$: MOV P.SIZE-P.REL(R5),R2 ;GET PARTITION SIZEV1 SUB R1,R2 ;SUBTRACT OFFSET TO CALC. LENGTH - BCS 11$ ;IF CS SUBTRACT WRAPPED AROUNDD( CMP R2,W.BSIZ-W.BOFF(R4) ;LENGTH LEGAL? BLOS 40$ ;IF LOS YESS1 MOV W.BSIZ-W.BOFF(R4),R2 ;SUBSTITUTE WINDOW SIZE #; CALCULATE NEW END VIRTUAL ADDRESS3240$: MOV R1,(R4) ;SET NEW W.BOFF FIELD VALUE6 ADD (R5),R1 ;CONVERT OFFSET TO PHYSICAL ADDRESS. MOV R0,R5 ;SAVE POINTER TO OFFSET VALUE- MOV R2,R3 ;COPY LENGTH IN 32 WD BLOCKSV" ASH #6,R3 ;CONVERT TO BYTES, DEC R3 ;BACK OFF TO LAST BYTE ADDRESS5 ADD W.BLVR-W.BOFF(R4),R3 ;ADD IN LOW VIRTUAL ADDRESSO;; SAVE VALUES NEEDED IN PAR UPDATE CODE OR RETURNED TO USER - MOV R2,-(SP) ;SAVE NEW LENGTH OF WINDOWT- MOV R1,-(SP) ;SAVE PHYSICAL MAP ADDRESSD8 CMP R3,W.BHVR-W.BOFF(R4) ;SIZE OF WINDOW CHANGE00zKzt__DATADATADATADATA AT ALL? BEQ 100$ ;IF EQ NOV7 MOV R3,W.BHVR-W.BOFF(R4) ;TO FORM HIGH VIRTUAL ADDRESSI; CALCULATE NEW NUMBER OF PDRS% MOV R2,R3 ;COPY SIZE OF WINDOW#" ADD #177,R3 ;ROUND UP BY 4K, ASH #-7,R3 ;CONVERT TO NUMBER OF PDRS- MOV R3,-(SP) ;SAVE FOR LAST PDR ADDRESSO ;CALCULATION LATERA3 CMPB R3,W.BNPD-W.BOFF(R4) ;NUMBER OF PDRS CHANGE ? + BEQ 80$ ;IF EQ NO, NO NEED TO UPDATE $ ;OFFSET OR CLEAR/RESET PDRS2 MOVB W.BNPD-W.BOFF(R4),R2 ;GET OLD NUMBER OF PDRS3 MOVB R3,W.BNPD-W.BOFF(R4) ;SET NEW NUMBER OFR PDRS46; CALCULATE NEW OFFSET FIELD FOR FAST MAP WINDOW BLOCK3 SUB R2,R3 ;FORM DIFFERENCE IN NUMBER OF PDRSD!; HANDLE SIMPLEST CASES (1,3,4,7)# .IF DF U$$DAS!S$$LIBU4 CMPB #</BLKDIV>,(R0) ;IS THIS A CASE 1 BHI 50$ ;IF HI YES  .IFTF ; DF U$$DAS ! S$$LIBR' ASL R3 ;MULTIPLY DIFFERENCE BY 2  .IF EQ BLKMUL-2 ASL R3 ;BY 4F .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$$LIBD4 CMPB #</BLKDIV>,(R0) ;IS THIS A CASE 2 BHI 60$ ;IF HI NO/ MUL #,R3 ;CALCULATE DIFFERENCE BR 70$ ;AND UPDATEV .ENDC ; DF U$$DAS&S$$LIBI60$::; HANDLE CASE 5 (ALSO CASE 2 IN SUPER, NO D-SPACE SYSTEMS)/ MUL #,R3 ;CALCULATE DIFFERENCE .ENDC ; DF U$$DAS ! S$$LIB;70$:# MOV R3,-(SP) ;SAVE FOR UPDATEB; CLEAR ALL PDRS FOR OLD WINDOW % CLR R3 ;NO OFFSET BETWEEN PDRSD( MOVB W.BFPD-W.BOFF(R4),R2 ;POINT TO PDR1 MOV (R2),-(SP) ;SAVE A PDR FOR ACCESS VALUEA% CLR R1 ;VALUE TO STORE IS ZEROB% MOVB (R0),R0 ;GET OFFSET VALUE .IF DF U$$DAS&S$$LIBT$ ASL R0 ;CONVERT TO BYTE INDEX .ENDC ; DF U$$DAS&S$$LIBE CALL FMPW1(R0) ;CLEAR PDRS; SET ALL PDRS FOR NEW WINDOWA .IF DF U$$DAS&S$$LIB;0 MOVB (R5),R0 ;RETRIEVE OFFSET FIELD AGAIN .IFTF ; DF U$$DAS & S$$LIB ! MOV (SP)+,R1 ;GET PDR VALUE ' SUB (SP)+,R0 ;ADJUST OFFSET FIELDB$ BIS #77400,R1 ;FORCE 4K ACCESS/ MOVB R0,(R5) ;STORE UPDATED OFFSET VALUE 3 MOVB W.BFPD-W.BOFF(R4),R2 ;GET PDR ADDRESS (AGAIN)T .IFT ; DF U$$DAS & S$$LIBS# ASL R0 ;ADJUST TO WORD VALUEY .ENDC ; DF U$$DAS & S$$LIBS+ CALL FMPW1(R0) ;SET PDRS TO NEW VALUE !; SETUP LAST PDR TO CORRECT VALUED,80$: MOV 4(SP),R2 ;RETRIEVE WINDOW SIZE% DEC R2 ;BACK OFF TO LAST BLOCKD& BIC #177600,R2 ;ISOLATE PLF BITS. SWAB R2 ;PUT IN RIGHT PLACE IN REGISTER1 MOVB W.BFPD-W.BOFF(R4),R3 ;GET FIRST PDR ADDRESS0( MOV (R3),R1 ;FETCH VALUE OF A PDR- BIC #77400,R1 ;CLEAR PLF FROM SAVED PDRA# 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 ADDRESS  .IF DF S$$LIB!U$$DASD4 CMPB #</BLKDIV>,(R5) ;IS THIS A CASE 1 BLOS 90$ ;IF HI YES%; UPDATE LAST PDR FOR A CASE 2 WINDOWI .IF DF U$$DAS4 CMPB #</BLKDIV>,(R5) ;IS THIS A CASE 2 BHI 84$ ;IF HI NO1 MOV R1,UDSAR0-UINAR0(R3) ;;;FILL IN LAST PDR (D)# BR 90$ ;AND CONTINUE #; UPDATE LAST PDR FOR CASE 6 WINDOW 84$:4 CMPB #</BLKDIV>,(R5) ;IS THIS A CASE 6 BHI 86$ ;IF HI NOB1 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 7 MOV R1,SDSAR0-UINAR0(R3) ;;;FILL IN LAST PDR (SUPER D). .IF DF U$$DAS6 MOV R1,UDSAR0-UINAR0(R3) ;;;FILL IN LAST PDR (USER D) .ENDC ; DF U$$DAS .ENDC ; DF U$$DAS ! S$$LIB (90$: MOV R1,(R3) ;FILL IN LAST PDRA MOV R1,W.BLPD-W.BOFF(R4) ;SAVE VALUE OF LAST PDR IN WINDOW BLOCKF%; DISPATCH TO REGULAR PAR UPDATE CODEH6100$: MOV #200,R3 ;SET OFFSET BETWEEN PARS TO 4K8 MOVB W.BFPD-W.BOFF(R4),R2 ;GET FIRST PDR ADDRESS AGAIN.6 ADD #UINAR0-UINDR0,R2 ;POINT TO PAR INSTEAD OF PDR9 MOV (SP)+,R1 00zyibjbkb a a a ;GET BACK VALUE OF START (THIS RIGHT?)+ MOVB (R5),R0 ;GET OFFSET VALUE AGAIN; .IF DF U$$DAS&S$$LIB)# ASL R0 ;ADJUST TO BYTE INDEX$ .ENDC ; DF U$$DAS & S$$LIBR $ CALL FMPW1(R0) ;GO ADJUST PARS0 MOV (SP)+,R2 ;SET LENGTH TO RETURN TO USER' MOV #1,R0 ;SET IS.SUC FOR RETURND$ JMP $INTX1 ;GO RETURN TO USER .ENDC ; DF X$$HDR & F$$MAP. .PAGE;+3; **-$STFMP-SETUP FAST MAP BLOCK FOR ADDRESS WINDOWRC; **-$STFMC-SETUP FAST MAP BLOCK FOR ADDRESS WINDOW (CONDITIONALLY)L;OA; THESE ROUTINES SETS OR RE-SETS THE FAST MAP BLOCK IN THE HEADER;@; EXTENSION CORRESPONDING TO A WINDOW IN THE NORMAL HEADER AREA.;@; $STFMC IS CALLED FROM DRMAP TO EXAMINE WHETHER OR NOT A WINDOWD; REQUIRES FAST MAP UPDATE AND TO RE-FILL THE POINTERS IF NECESSARY.;; ; INPUTS:F;R(; R4=ADDRESS OF WINDOW TO BE FAST MAPPED; ; OUTPUTS:;$; R2,R3 ARE MODIFIED ($STFMC) ; R0,R2,R3 ARE MODIFIE ($STFMP)R;D@; THE FORMAT OF A FAST MAP HEADER EXTENSION BLOCK IS AS FOLLOWS:;N3; +-----------------------------------------------+E#; | MAXIMUM 32WD BLOCK OFFSET | 0E3; +-----------------------------------------------+A*; | POINTER TO W.BOFF IN WINDOW BLOCK | 23; +-----------------------------------------------+P!; | POINTER TO P.REL IN PCB | 4 3; +-----------------------+-----------------------+W8; 7 | DISPATCH OFFSET INTO | COPY OF P.HDLN FOR | 6.; | FMPW1 UPDATE VECTOR | TARGET PARTITION |3; +-----------------------------------------------+ ;- .IF DF X$$HDR&F$$MAP- .ENABL LSB-0$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?E BPL 10$ ;IF PL NO, NO UPDATE MOV R0,-(SP) ;SAVE A REGISTER- MOVB W.BFPD(R4),R0 ;GET ADDRESS OF FIRST PDR  ASL R0 ;CONVERT TO QUAD WORD ASL R0 ;INDEX-) BIC #177607,R0 ;GET RID OF ALL BUT INDEXN, ADD $FMAPP,R0 ;GET ADDRESS OF FAST MAP AREA) CALL 20$ ;GO ADJUST FAST MAP PARAMETERS-"5$: MOV (SP)+,R0 ;RESTORE REGISTER 10$: RETURN. $STFMP:: ;&; CALCULATE ADDRESS OF FAST MAP WINDOW- MOVB W.BFPD(R4),R0 ;GET ADDRESS OF FIRST PDRN ASL R0 ;CONVERT TO QUAD WORD ASL R0 ;INDEX ) BIC #177607,R0 ;GET RID OF ALL BUT INDEXM, ADD $FMAPP,R0 ;GET ADDRESS OF FAST MAP AREA&; CALCULATE MAXIMUM OFFSET INTO REGION5 ASSUME W.BPCB,0 ;W.BPCB MUST BE FIRST WORD OF WINDOWG"20$: MOV (R4),R2 ;GET PCB ADDRESS, MOV P.SIZE(R2),(R0) ;SAVE SIZE OF PARTITION4 SUB W.BSIZ(R4),(R0) ;MAX OFFSET IS LESS WINDOW SIZE2 MOVB P.HDLN(R2),R3 ;CONVERT HEADER LENGTH TO WORD1 SUB R3,(R0) ;MAX OFFSET IS ALSO WITHOUT HDR LENR1 INC (R0)+ ;THE MAX OFF FIELD IS KEPT +1 SO THAT ' ;A VAL. OF ZERO CAN MEAN "UNMAPPED"6*; SET UP POINTER TO W.BOFF IN WINDOW BLOCK% MOV R4,(R0) ;INIT POINTER TO W.BOFFC6 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.RELW&; COPY PARTITIONS EXTERNAL HEADER SIZE9 MOVB P.HDLN(R2),(R0)+ ;SET SIZE OF PARTITION'S EXT. HDR.B .PAGE;+-; NOW CALCULATE OFFSET INTO APR UPDATE TABLE. ); THERE ARE SEVEN CASES TO BE CONSIDERED. ;V+; SUPER MODE MAPPED SUPER MODE NOT MAPPEDP;T:; I-SPACE WINDOW (1) UPDATE I ONLY (4) UPDATE SUPER I ONLY; (WITH OVERLAPPINGO; D-SPACE WINDOW(S))C;E8; I-SPACE WINDOW (2) UPDATE I+D (5) UPDATE I,D, SUPER D; (NO OVERLAP);D8; D-SPACE WINDOW (3) UPDATE D-ONLY (6) UPDATE D, SUPER D;W+; SUPER I WINDOW N/A (7) SUPER I ONLY;V9; SYSTEMS WITH USER I/D AND NO SUPERVISOR MODE HAVE CASESA; (1), (2), AND (3) ONLY.S;I=; SYSTEMS WITH NO USER I/D BUT SUPER MODE HAVE CASE (1) AND AD; SUBSET OF CASE 5.E;-4; IN MULTI-CASE SYSTEMS, ASSUME IT'S THE SIMPLE CASE .IF DF U$$DAS!S$$LIBE/ CLR -(SP) ;ASSUME NO EXTRA OFFSET INTO VECTOR)/ MOV #BLK1SZ*BLKMUL,-(SP) ;ASSUME CASE 1 LENGTHT .ENDC ; DF U$$DAS!S$$LIB)%; CHECK FOR SUPERVISOR I-SPACE WINDOW( .IF DF S$$LIB0; TSTB W.BFPD(R4) ;IS IT A SUPER I-SPACE WINDOW?; BEQ 50$ ;IF EQ YESE .00zKzt__DATADATADATADATAENDC ; DF S$$LIB; CHECK FOR USER D-SPACE WINDOW  .IF DF U$$DAS1 BITB #20,W.BFPD(R4) ;IS IT A USER D-SPACE WINDOW  BEQ 30$ ;IF EQ NOA;; IF USER D-SPACE WINDOW, CHECK FOR SUPERVISOR MODE WINDOWSA .IF DF S$$LIB* TSTB $SUPFL ;ANY SUPERVISOR MODE WINDOWS BEQ 50$ ;IF EQ NOV= MOV #</BLKDIV>,2(SP) ;SET PARAMETERS FOR CASE 6D MOV #BLK6SZ*BLKMUL,(SP) ;S .ENDC ; DF S$$LIB BR 50$ ;TO COMMON CODE .ENDC ; DF U$$DAS5; CHECK USER I WINDOW FOR OVERLAPPING D-SPACE WINDOWS$ 30$: ;C .IF DF U$$DAS$ MOVB W.BFPD(R4),R3 ;GET PDR ADDRESS& SUB #UINDR0,R3 ;ADJUST TO OFFSET ZERO ASR R3 ;CONVERT TO BYTE INDEXE' MOVB W.BNPD(R4),R2 ;GET NUMBER OF PDRSD& ADD R3,R2 ;FORM ENDING PDR NUMBER +1. MOVB $BCMSK-1(R2),R2 ;GET MASK UP TO LAST APR/ BICB $BCMSK-1(R3),R2 ;GET MASK UP TO FIRST APR  MOV $SAHPT,R3 ;POINT TO HEADER6! BITB R2,H.DMAP(R3) ;ANY OVERLAP?D# BNE 50$ ;IF NE YES, UPDATE I ONLY .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 NOA= MOV #</BLKDIV>,2(SP) ;SET PARAMETERS FOR CASE 5  MOV #BLK5SZ*BLKMUL,(SP) ;R BR 50$ ;TO COMMON CODE D .ENDC ; DF S$$LIB40$: .IF DF U$$DAS= MOV #</BLKDIV>,2(SP) ;SET PARAMETERS FOR CASE 6T MOV #BLK2SZ*BLKMUL,(SP) ;P 3 .ENDC ; DF U$$DAS-50$: MOVB W.BNPD(R4),R3 ;FETCH NUMBER OF PDRS  .IF DF U$$DAS!S$$LIB& MUL (SP)+,R3 ;CONVERT TO N WORD INDEX+ ADD (SP)+,R3 ;ADD IN ANY ADDITIONAL OFFSETT .IFF ; DF U$$DAS!S$$LIB ASL R3 ;CONVERT TO WORD INDEX$ ASL R3 ;CONVERT TO TWO WORD INDEX .ENDC ; DF U$$DAS!S$$LIBZ NEG R3 ;MAKE IT NEGATIVE MOVB R3,(R0)+ ;SET JUMP INDEX RETURN ;DONE. .DSABL LSB .ENDC ; DF X$$HDR&F$$MAP2 .PAGE;+C; FAST MAP APR UPDATE TABLES. THERE ARE FOUR SETS OF UPDATE CODE TO$; COVER THE SEVEN CASES.;- .IF DF F$$MAP&X$$HDR;+G; CASE 5 - UPDATE SUPER AND USER DATA SPACE AND PAR POINTED TO BY FAST R8; MAP WINDOW BLOCK (THIS WILL ALWAYS BE USER I-SPACE);- .IF DF S$$LIB .REPT 74 MOV R1,SDSAR0-UINAR0(R2) ;;;FILL IN SUPER D PAR/PDR .IF DF U$$DAS3 MOV R1,UDSAR0-UINAR0(R2) ;;;FILL IN USER D PAR/PDRI .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 = 6$ .IFF ; DF U$$DASA BLK5SZ = 4F .ENDC ; DF U$$DAS $$$ = . . = . + < BLK5SZ * 2 >D(FMPW5: ;;;POINT TO END OF BLOCKS . = $$$9 MOV R1,SDSAR0-UINAR0(R2) ;;;FILL IN LAST SUPER D PAR/PDR$ .IF DF U$$DAS8 MOV R1,UDSAR0-UINAR0(R2) ;;;FILL IN LAST USER D PAR/PDR .ENDC ; DF U$$DAS1 MOV R1,(R2) ;;;FILL IN LAST USER I PAR/PDRN RETURN ;;;AND GO BACK .ENDC ; DF S$$LIB;+H; CASE 6 - UPDATE SUPER DATA SPACE AND PAR POINTED TO BY FAST MAP WINDOW-; BLOCK (THIS WILL ALWAYS BE USER D-SPACE)F;- .IF DF U$$DAS&S$$LIB$ .REPT 74 MOV R1,SDSAR0-UDSAR0(R2) ;;;FILL IN SUPER D PAR/PDR, MOV R1,(R2)+ ;;;FILL IN USER D PAR/PDR& ADD R3,R1 ;;;AND ADVANCE BY 4KW .ENDR BLK6SZ = 40 $$$ = . . = . + < BLK6SZ * 2 >R(FMPW6: ;;;POINT TO END OF BLOCKS . = $$$9 MOV R1,SDSAR0-UDSAR0(R2) ;;;FILL IN LAST SUPER D PAR/PDR1 MOV R1,(R2) ;;;FILL IN LAST USER U PAR/PDRE RETURN ;;;AND GO BACK  .ENDC ; DF U$$DAS & S$$LIB(;+G; CASE 2 - UPDATE USER DATA SPACE AND PAR POINTED TO BY FAST MAP WINDOW-; BLOCK (THIS WILL ALWAYS BE USER I SPACE)R;- .IF DF U$$DAS .REPT 73 MOV R1,UDSAR0-UINAR0(R2) ;;;FILL IN USER D PAR/PDRW, MOV R1,(R2)+ ;;;FILL IN USER I PAR/PDR& ADD R3,R1 ;;;AND ADVANCE BY 4KW .ENDR BLK2SZ = 4= $$$ = . . = . + < BLK2SZ * 2 >F(FMPW2: ;;;POINT TO END OF BLOCKS . = $$$8 MOV R1,UDSAR0-UINAR0(R2) ;;;FILL IN LAST USER D PAR/PDR1 MOV R1,(R2) ;;;FILL IN LAST USER I PAR/PDRU RETURN ;;;AND GO BACK .IFF ; DF U$$DASW0FMPW2: ;;;MAKE SURE THIS LABEL IS ALWAYS& ;00zzibjbkb a a a;;DEFINED SO THAT THE OFFSET/ ;;;ADJUST CODE CAN COMPARE AGAINST IT.D .ENDC ; DF U$$DAS;+9; CASES 1, 3, 4, AND 7. UPDATE JUST THE APR POINTED TO BYW; 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 >,(FMPW1: ;;;POINT TO END OF BLOCKS . = $$$ * MOV R1,(R2) ;;;FILL IN LAST PAR/PDR RETURN ;;;AND GO BACK .ENDC ; DF F$$MAP & X$$HDRE  .ENDC .END ;;;ADJUST CODE CAN COMPARE AGAINST IT.D .ENDC ; DF U$$DAS;+9; CASES 1, 3, 4, AND 7. UPDATE JUST THE APR POINTED TO BYW; 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 >,(FMPW1: ;;;POINT TO END OF BLOCKS . = $$$ * MOV R1,(R2) ;;;FILL IN LAST PAR/PDR RETURN ;;;AND GO BACK .ENDC ; DF F$$MAP & X$$ .TITLE DRGTP1 .IDENT /10.00/M;D2; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; 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.;.; D. N. CUTLER 30-AUG-73; ); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:.;T; T. M. MARTIN;S$; MODIFIED FOR RSX-11M-PLUS V2.1 BY:;O; B. S. MCCARTHY ; T. LEKAS0;C$; MODIFIED FOR RSX-11M-PLUS V4.2 BY:; B. S. MCCARTHY;M$; MODIFIED FOR RSX-11M-PLUS V4.6 BY:;; D. Carroll 1-Jul-1998 10.00g9; DC506 - Include full support for leap year calculatione$; including century determination.;U;+1; **-$DRGTP-GET TIME PARAMETERS / SET SYSTEM TIMED;EG; THE GET TIME DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A SPECIFIED EIGHTI/; WORD BUFFER WITH THE CURRENT TIME PARAMETERS. ;TB; THE SET SYSTEM TIME DIRECTIVE INSTRUCTS THE SYSTEM TO OPTIONALLYE; FILL A SPECIFIED EIGHT WORD BUFFER WITH THE CURRENT TIME PARAMETERST?; AND TO RESET THE SYSTEM TIME USING A SPECIFIED TIME AND DATE.J;1; /; DPB FORMAT FOR GET TIME PARAMETERS DIRECTIVE:y; "; 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.; 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 /7$: MOV #8.*2,R1 ;SET LENGTH OF BUFFER IN BYTES - C00zKzt__DATADATADATADATAALL $ACHKP ;ADDRESS CHECK PARAMETER BUFFER3/ MOV #$TTNS-14,R1 ;POINT TO CURRENT TIME VECTOR :10$: MOV (R1)+,(R3)+ ;INSERT TIME PARAMETER IN TASK BUFFER# CMP R1,#$TTNS ;ANY MORE TO INSERT?  BLOS 10$ ;IF LOS YES% MOV $TKPS,(R3) ;SET TICKS PER SECONDE(15$: ROR R4 ;SET SYSTEM TIME DIRECTIVE?) BCS 17$ ;IF CS SETTIM REQUEST ;DC506T ;DC506! JMP 90$ ; BRANCH AID ;DC506A ;DC506517$: MOV R5,R3 ;GET NEW TIME BUFFER ADDRESS ;DC50684 MOV #8.*2,R1 ;SET LENGTH OF NEW TIME BUFFER ;**-24 CALL $ACHKP ;ADDRESS CHACK AND MAP NEW TIME BUFFER. MOV #$TTNS+2,R1 ;POINT TO CURRENT TIME VECTOR)20$: MOV -(R1),-(SP) ;COPY TIME PARAMETERC 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 NO3+ MOV R1,-(SP) ; save R1 for a bit ;DC506V+ MOV R0,R1 ; copy the year to R1 ;DC506** CLR R0 ; zero the high portion ;DC5064 ADD #1900.,R1 ; adjust for correct century ;DC5060 DIV #100.,R0 ; check for century limit ;DC506+ TST R1 ; is it divisible by 100. ;DC506 - BNE 23$ ; if NE, it is a leap year ;DC506D ;DC5064 BIT #3,R0 ; is the year divisible by 400. ;DC5061 BNE 24$ ; if NE, nope, not a leap year ;DC506T ;DC506(23$: INC R2 ;SET FEB CONSTANT ;DC506524$: MOV (SP)+,R1 ; restore R1 limit pointer ;DC506  ;DC50625$: ;**-1  CALL 100$ ;VALIDATE MONTHD, 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, YESD' CLR R2 ;ELSE CLEAR ANY DPM ADJUSTMENT <28$: MOVB $DYPMN-1(R0),R4 ;GET NUMBER OF DAYS FOR THIS MONTH% ADD R4,R2 ;CALCULATE DAYS-PER-MONTH; CALL 100$ ;VALIDATE DAY" BEQ 40$ ;IF Z=1 THEN ILLEGAL DAY DEC R2 ;NORMALIZE REFERENCED3 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 .IF DF A$$CNT' MOV R5,R3 ;COPY TOP OF STACK POINTERM( SUB #3,R3 ;ADJUST POINTER TO NEW TIME! TST $SABPT ;ACCOUNTING ACTIVE?L BEQ 70$ ;IF EQ NO+ MOV #$TKPS+2,R4 ;POINT TO OLD TIME VECTORD8 MOV #/64.,R1 ;SET NUMBER OF BLKS TO ALLOCATE3 CALL $ALACC ;ALLOCATE ACCOUNTING TRANSACTION BLKR% BCS 70$ ;IF CS, ALLOCATION FAILURED& MOV R0,KISAR6 ;MAP TRANSACTION BLOCKK MOV #+BT.TIM,140000+B.TYP ;FILL IN TRANSACTION TYPE AND LENGTHP: MOV #140000+B.TNEW+6,R2 ;INIT OFFSET INTO OLD TIME VECTOR8 MOV #140000+B.TOLD,R1 ;INIT OFFSET INTO NEW TIME VECTOR;60$: MOVB -(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 ;PO00zzibjbkb a a aINT 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! MOV (R3),R0 ;GET TIME PARAMETERE! 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 .ENDHIMIT. ;FOR$ .TITLE DCQUE - DC Queue Maintenance .IDENT /05.00/0 .IFDF D$$CHEe .PSECT DC$QUE,RO,IR; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.o; All rights reservedO;I;R5; (authorship and previous history lost to posterity)A; Modified By:;P; J. Kauffman 17-Feb-87 1.01>; JRK330 - Convert E.UCBX to E.UCB for deferred write support;R(; Re-mastered for RSX-11M-PLUS V4.4 by:;P ; L. B. McCulley 26-Jan-92 4.00,; LBM409 -- track changes to other modules;n"; D. Carroll 11-August-1992 4.00b6; DC140 -- Insure ES.WPL CEDs are not included into; the region age list.;"; D. Carroll 10-October-1992 4.01/; DC143 -- Include bugcheck codes for errors ;t; D. Carroll 10-Dec-1992 4.02'; DC157 -- Include hash table support.;u$; Modified for RSX-11M-PLUS V4.6 by:; ; D. Carroll 8-Jan-1996 05.00*; DC430 - Include support for 32-bit LBNs; ;4 :* .SBTTL QINLBN - Insert CED into LBN queue;41; This routine will use the temporary cell, H.TMPr3; 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 within?; the LBN list only once, thereby increasing cache performance.C; ; Passed:h.; R0 -> CED to be inserted into the LBN queue.; ; Returned:; All registers preserved.; ; Processing:u;s; CASE TMP1 TMP2s); ----------------------------- ---- ----n&; 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 0'; IV. Inserted within queue NE 0 NE 0s); ----------------------------- ---- ---- ;a; The following is performed:n; ; IF TMP1=0o ; IF TMP2=0b; { ;Case I.r; CURR.PREV <- 0; CURR.NEXT <- 0; X.CCED <- CURR; X.CCED+2 <- CURRi; }s; ELSE 0>g; { ;Case II.; CURR.PREV <- 0; CURR.NEXT <- TMP2; TMP2.PREV <- CURRe; X.CCED <- CURR ; }q; ELSE 0>. ; IF TMP2=0i; { ;Case III.V; CURR.PREV <- TMP1E; CURR.NEXT <- 0; TMP1.NEXT <- CURR ; X.CCED+2 <- CURRr; }; ELSE 0>F; { ;Case IV.; CURR.PREV <- TMP1 ; TMP1.NEXT <- CURR0; CURR.NEXT <- TMP2; TMP2.PREV <- CURRi; }s; END 0; END e;.QINLBN:: CLR E.LPRV(R0) ;CURR.PREV <- 0 CLR E.LNXT(R0) ;CURR.NEXT <- 0& MOV R1,-(SP) ;Obtain a work register/ BITB #CS.DBG,APRD.BASE+H.CSTS ; debug enabled?; BEQ 999$ ; if EQ, nope ...-" CLR -(SP) ; reserve a stack word MOV KISAR6,-(SP) ; save mapping! MOV U.UCBX(R5),KISAR6 ; map ucbx<+ MOV APR6.BASE+X.CCED,2(SP) ; get first cedU# MOV (SP)+,KISAR6 ; restore mapping- MOV (SP)+,R1 ; get ced pointer BEQ 999$ ; done alreadyi#991$: CMP R0,R1 ; already in list?  BNE 992$ ; no, go on* FATAL$ BE.QIN ; element already in queue&992$: MOV E.LNXT(R1),R1 ; get next ced BNE 991$ ; continue scan;999$: MOV APRD.BASE+H.TMP,R1 ;Insert at beginning of queue?f BNE 20$ ;No if NE;S.; here we insert this CED at beginning of list;e* MOV KISAR6,-(SP) ;Save partition mapping- MOV U.UCBX(R5),KISAR6 ;Map the UCB extension3 MOV APR6.BASE+X.CCED,R1 ;R1-> next (was first) CED - BNE 5$ ; got it, don't set ptr to list end- MOV R0,APR6.BASE+X.CCED+2 ;X.CCED+2 <- CURR .5$: MOV R0,APR6.BASE+X.CCED ;X.CCED <- CURR07$: MOV (SP)+,KISAR6 ;Restore partition mapping-10$: MOV R1,E.LNXT(R0) ;set link to next CED+ BEQ 40$ ;no next CED, donef0 MOV R0,E.LPRV(R1) ;set backpointer in next CED BR 40$ ;done, exitg;i>; here we insert following CED pointed to by H.TMP (now in R1);,20$:, MOV R1,E.LPRV(R0) ;set backpointer to prev- MOV E.LNXT(R1),E.LNXT(R0) ;point to next CEDo+ MOV R0,E.LNXT(R1) ;point prev to new nextR& MOV E.LNXT(R0),R1 ;point to next CED( BEQ 30$ ; there is none, set list end0 MOV R0,E.LPRV(R1) ;set backpointer in next CED BR 40$M.30$: MOV KISAR6,-(SP) ;Save partition mapping- MOV U.UCBX(R5),KISAR6 ;Map the UCB extensiont- MOV R0,APR6.BASE+X.CCED+2 ;X.CCED+2 <- CURRg' MOV (SP)+,KISAR6 ;Remap the partitioni340$: BITB #CS.DBG,APRD.BASE+H.CSTS ; debug enabled?R BEQ 901$ ; nope ignore it* MOV E.LPRV(R0),R1 ; check prev < current! BEQ 882$ ; no prev, must be oko5 CMP E.LBNL+2(R0),E.LBNL+2(R1) ; check order ;DC430B* BHI 881$ ; ok, not out of order ;**-1' BLO 899$ ; report disorderly conductt) CMP E.LBNL(R0),E.LBNL(R1) ; finish checke BLO 899$ ; report disorder(9881$: CMP E.LBNH+2(R1),E.LBNL+2(R0) ; overlap? ;DC4302 BHI 899$ ; yep ;**-1P BLO 882$ ; if lo, allrighti CMP E.LBNH(R1),E.LBNL(R0) ; BHI 899$d3882$: MOV E.LNXT(R0),R1 ; now check next > currentL! BEQ 901$ ; no next, must be ok5 CMP E.LBNL+2(R0),E.LBNL+2(R1) ; check order ;DC430.* BLO 891$ ; ok, not out of order ;**-1' BHI 899$ ; report disorderly conduct8) CMP E.LBNL(R0),E.LBNL(R1) ; finish checkE BHI 899$.<891$: CMP E.LBNH+2(R0),E.LBNL+2(R1) ; overlap here? ;DC430# BHI 899$ ; yes, flag it ;**-1e BLO 901$C CMP E.LBNH(R0),E.LBNL(R1) BLOS 901$%899$: FATAL$ BE.LBN ; report error1%901$: MOV (SP)+,R1 ;Restore saved R1. RETURN  n* .SBTTL QRMLBN - Remove CED from LBN queue;, ; Passed:; R0 -> CED to removeB;2 ; Returned:o; All registers preserved ;k ; Processing:d; ; CASE .PREV .NEXTe+; ----------------------------- ----- -----B(; I. Only element in queue EQ 0 EQ 0); II. First element in queue EQ 0 NE 0e(; III. Last element in queue NE 0 EQ 0'; IV. Element within queue NE 0 NE 0B+; ----------------------------- ----- -----;;p; IF CURR.PREV=0; IF CURR.NEXT=0; {d; X.CCED <- 0; X.CCED+2 <- 0; }N; ELSE 0>; {o; X.CCED <- CURR.NEXT; NEXT.PREV <- 0; }c; END ; ELSE 0>; IF CURR.NEXT=0; {B; X.CCED+2 <- CURR.PREV; PREV.NEX00zzibjbkb a a aT <- 0; }i; ELSE 0>; {m; PREV.NEXT <- CURR.NEXT; NEXT.PREV <- CURR.PREV; }-; END ; END ;.QRMLBN::# MOV R1,-(SP) ;Get a work register.. 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. MOV KISAR6,-(SP) ;Save the partition mapping. MOV E.UCB(R0),R1 ;Get pointer to UCB address$ MOV U.UCBX(R1),KISAR6 ;Map the UCBX$ CLR APR6.BASE+X.CCED ;X.CCED <- 0& 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 NEXTP. MOV KISAR6,-(SP) ;Save the partition mapping3 MOV R0,-(SP) ;Save the CED address across mappinge0 MOV E.UCB(R0),R0 ;Get the UCB address from CED$ MOV U.UCBX(R0),KISAR6 ;Map the UCBX' MOV (SP)+,R0 ;Restore the CED addressp. MOV R1,APR6.BASE+X.CCED ;X.CCED <- CURR.NEXT*15$: MOV (SP)+,KISAR6 ;Remap te partition CLR E.LPRV(R1) ;NEXT.PREV <- 0 BR 40$ ;And exitR20$:# MOV E.LNXT(R0),R1 ;Last in queue?K BNE 30$ ;No if NE MOV E.LPRV(R0),R1 ;i. MOV KISAR6,-(SP) ;Save the partition mapping3 MOV R0,-(SP) ;Save the CED address across mappingP0 MOV E.UCB(R0),R0 ;Get the UCB address from CED$ MOV U.UCBX(R0),KISAR6 ;Map the UCBX' MOV (SP)+,R0 ;Restore the CED address1 MOV R1,APR6.BASE+X.CCED+2 ;X.CCED+2 <- CURR.PREVP& MOV (SP)+,KISAR6 ;Remap te partition CLR E.LNXT(R1) ;PREV.NEXT <- 0 BR 40$ ;And exit(30$: MOV E.LPRV(R0),R1 ;Get PREVe2 MOV E.LNXT(R0),E.LNXT(R1) ;PREV.NEXT <- CURR.NEXT MOV E.LNXT(R0),R1 ;Get NEXT(2 MOV E.LPRV(R0),E.LPRV(R1) ;NEXT.PREV <- CURR.PREV$40$: MOV (SP)+,R1 ;Restore saved R11 INC E.LNXT(R0) ; invalidate obsolete links so... 1 INC E.LPRV(R0) ; XDT will report attempted usageC RETURN ;And all done - .SBTTL QUPAGE - Move CED to end of age queueD;< ; Passed:P; R0 -> CED to updatee; ; Returned:; All registers preserved ;0QUPAGE::8 BITB #ES.WPL,E.STAT(R0) ; is this a write place holder?0 BNE 10$ ; if NE, yes, no age list association$ CALL QRMAGE ; Remove it from list& CALL QADAGE ; Add it at end of list 10$: RETURNP R* .SBTTL QRMAGE - Remove CED from age queue;i ; Passed:t#; R0 -> CED to remove from age list ;l ; Returned:p; All registers preservedn;l ; Processing:B; ; CASE .PREV .NEXTd,; ------------------------------ ----- -----+; I. Element is only in queue EQ 0 EQ 0r,; II. Element is first in queue EQ 0 NE 0+; III. Element is last in queue NE 0 EQ 0 *; IV. Element is within queue NE 0 NE 0,; ------------------------------ ----- -----; ; IF CURR.PREV=0; IF CURR.NEXT=0; {B; H.CEDH <- 0; H.CEDH+2 <- 0; } ; ELSE 0>; {l; H.CEDH <- CURR.NEXT; NEXT.PREV <- 0; } ; ELSE 0>; IF CURR.NEXT=0; {-; PREV.NEXT <- 0; H.CEDH+2 <- CURR.PREV; }I; ELSE 0>; {E; NEXT.PREV <- CURR.PREV; PREV.NEXT <- CURR.NEXT; }n; END ; END ;-QRMAGE::8 BITB #ES.WPL,E.STAT(R0) ; is this a write place holder?& BNE 50$ ; if NE, yes, skip this ...# 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. 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?i BNE 30$ ;No if NE MOV E.APRV(R0),R1 ;Get PREV; CLR E.ANXT(R1) ;PREV.NEXT <- 0) MOV R1,APRD.BASE+H.CEDH+2 ;H.CEDH+2 <- 0V BR 40$ 30$:2 MOV E.APRV(R0),E.APRV(R1) ;NEXT.PREV <- CURR.PREV MOV E.APRV(R0),R1 ;Get PREVM2 MOV E.ANXT(R0),E.ANXT(R1) ;PREV.NEXT <- CURR.NEXT40$: MOV (SP)+,R1 ;Restore saved R150$: RETURN R6 .SBTTL QADAGE - Add a CED at the end of the00zzt__DATADATADATADATA age queue;E ; Passed:<; R0 -> CED to append to listP; ; Returned:; All registers preserved ;s ; Processing:B;3; CASE H.CEDH H.CEDH+2R/; ----------------------------- ------ -------- (; I. No elements in queue EQ 0 EQ 0*; II. First element in queue EQ 0 NE 0); III. Last element in queue NE 0 EQ 0((; IV. Element within queue NE 0 NE 0/; ----------------------------- ------ -------- ;e; CURR.NEXT <- 0; IF H.CEDH+2=0; { ; H.CEDH <- CURR ; H.CEDH+2 <- CURR; CURR.PREV <- 0; }p; ELSE 0>u; {; CURR.PREV <- H.CEDH+2s; PREV.NEXT <- CURRA; H.CEDH+2 <- CURR ; }-; END -;-QADAGE::8 BITB #ES.WPL,E.STAT(R0) ; is this a write place holder?/ BNE 30$ ; if NE, yes, don't insert into list # MOV R1,-(SP) ;Get a work registerw CLR E.ANXT(R0) ;CURR.NEXT <- 0) MOV APRD.BASE+H.CEDH+2,R1 ;Is list null?  BNE 10$ ;No if NE< MOV R0,APRD.BASE+H.CEDH ;This extent becomes first and last$ MOV R0,APRD.BASE+H.CEDH+2 ;in queue- CLR E.APRV(R0) ;Indicate no previous either  BR 20$ ;And exitR10$:* MOV R1,E.APRV(R0) ;CURR.PREV <- H.CEDH+2& MOV R0,E.ANXT(R1) ;PREV.NEXT <- CURR, MOV R0,APRD.BASE+H.CEDH+2 ;H.CEDH+2 <- CURR20$: MOV (SP)+,R1 ;Restore saved R130$: RETURNl 5 .SBTTL QRMBUF - Remove a CED from memory buffer list0;U/; QRMBUF - Remove a CED from memory buffer lists;u4; NOTE: E.BNXT is assumed to be offset 0 within CED<.iif ne,e.bnxt .error E.BNXT ; E.BNXT assumed zero and isn'tQRMBUF::$ MOV R1, -(SP) ; save work register+ MOV E.BPRV(R0), R1 ;Point to previous CED.1 MOV (R0), (R1) ;Point previous next to our next)" MOV (R0), R1 ;R1 -> next CED now; MOV E.BPRV(R0),E.BPRV(R1) ;Point next back to our previous ;+;; This section will attempt to set a logical starting pointm>; for any subsequent searches, such that GETFRE will not have:; to chain through [n] CEDs until encountering free space.;-3 MOV APRD.BASE+H.CMDF,R1 ; get the base address CEDe+ BEQ 10$ ; if EQ, nothing there, use this)> CMP E.PHYA(R0),E.PHYA(R1) ; is this CED a lower base address?. BHI 20$ ; if HI, nope, leave previous entryH10$: MOV E.BPRV(R0),APRD.BASE+H.CMDF ; set starting CED entry for GETBUF 20$: INC (R0) ; make links odd INC E.BPRV(R0) ' MOV (SP)+, R1 ; restore work register  RETURNb .ENDC ; .IFDF D$$CHEt .ENDFRE will not have:; to chain through [n] CEDs until encountering free space.;-3 MOV APRD.BASE+H.CMDF,R1 ; get .TITLE DCCHE - $CACHE ENTRY .IDENT /05.00/n .IF DF D$$CHE;R1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reservedt;n; All rights reserved.; ; Original author:; John Gemignani;n; Modified by:;R; D. P. Rabahy 06-Mar-85 01.01; '; Re-mastered for RSX-11M-PLUS V4.4 by:;L; L. B. McCulley 29-Dec-91 4.00 ; D. Carroll 05-August-1992 4.01; L. B. McCulley 8-Aug-92 4.01a!; D. Carroll 10-October-1992 4.02c!; D. Carroll 28-October-1992 4.03V; D. Carroll 13-Nov-1992 4.04H; $; Modified for RSX-11M-PLUS V4.6 by:;$; D. Carroll 8-Jan-1996 05.001*; DC430 - Include support for 32-bit LBNs;r;tI; This module contains the various entry points into the cache code. TheG; executive transfers control to the cache via entry point $CACHE, from I; $DRQRQ in module DRSUB. The entry point at $CACHE must be at 120000 for0K; the transfer of control from the executive. (Note that other entry paths-K; are possible when the cache uses internal I/O mechanism or the fork list)H; I; Entry point $XPLOA is called by the LOAD utility to load the cache codeL; EXP. Likewise, entry point $XPUNL is called by UNLOAD to remove the cacheK; code. This requires special handling, since you must guarantee that thisoH; is not being used. A recommended way to do this is to check the cacheK; fields of the UCBX for all disks on the system. If the appropriate cachemL; are NOT on, then the code has no partitions in the system which are active;sF; Note that the EXP hookpo00zzibjbkb a a aints ($XPLOA and $XPUNL) are called in APR6.L; Therefore, position-independent code is required, with absolute referencesK; corrected by subtracting 20000 from the target addresses. The cache codeeI; built for APR5 (120000->137777), and the subtraction of the 020000 will ;; the 140000-157777 references to the proper address range. ;  .MCALL PCBDF$* PCBDF$ ;Define partition control block - .SBTTL $CACHE - Main entry point from $DRQRQt;s4; The presence of the packet is guaranteed (driver5; kick-starts will bypass the dispatching routine).r0; 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.;($CACHE::0 CALLR DCPHS1 ; invoke Phase I cache dispatcher 4- .SBTTL Executive external partition routinesn, .SBTTL + $XPLOA - "LOAD /EXP=" entry point.;i;; This routine (module, and whole EXP for that matter) ism<; mapped in APR6 (140000->157777). The stack contains the=; return address to LOAD, and the address above that is the >; 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 thei(; 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.;P@; NOTE: The use of the LOA/UNL EXP function is designed only for9; development use, and any other use could be potentially;;; hazardous. This code does not scan the database to insuren<; that there are no devices with caching active, and as such$; this mechanism should not be used.;7$XPUNL::+ CLR @#$DRCHE ;Wipe out APR bias to unloadD RETURN ;And return with CC u? .SBTTL Dispatch incoming I/O operations from $DRQRQ exec callse8 .SBTTL + DCPHS1 - dispatcher (Start phase 1 operations);+*; **-DCPHS1 - Cache dispatcher entry point;d ; Passed:y; R1 -> I/O packet ; R5 -> UCBo;r ; Returned: ; R0 contents lost;u6; Control is passed to the appropriate phase-I routine;t ; Action: 4; 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 thew8; context handy, and to verify that the UCBX is present.7; (Disk UCBs without UCBXs are either offline, or don'tt7; have one due to a lack of secondary pool, and as suche; cannot support data caching.)-;/9; All I/O functions except IO.STC require the cache to bet:; activated in order for dispatching (since IO.STC is used:; to activate the cache), thus IO.STC is dispatched before-; cache is checked to make sure it is active. ; 8; Other I/O functions are dispatched in a logical order.;k:; IO.LOV and IO.LDO must be checked next, because they are>; subfunctions of IO.RLB and subfunction bits cannot be masked*; off before recognition of overlay loads.; >; After overlay loads are recognized, the subfunction bits are>; masked off to eliminate confusion with such things as IO.RLC ; and IO.WLC.g;i=; Then the basic read and write functions (IO.RLB and IO.WLB)s; are checked.;a=; The "bypass" subfunction bits (IQ.X, IQ.S, IQ.Q) will forcec?; cache to be bypassed for reads, but writes must still be seen ?; by cache to allow flushing stale extents, so these are testeda(; after recognition of IO.RLB functions. e;e?; While processing in phase I, this module will be available ino=; Kernel-D space (if supported), unt00zzt__DATADATADATADATAil the cache partition isf?; first mapped. This is intended to aid in the initial dispatchb; of the various functions. ;.<; The mapping structure of phase I goes as follows; with the%; following mapping initially set up;;a-; Kernel-I space Kernel-D Spacet; .; +------------------+ +--------------------+.; ! DCM11M code ! ! DCM11M code !.; !------------------! !--------------------!.; ! Don't care ! ! UCBX !.; !//////////////////! !////////////////////!;r;i@; Once the data cache partition is mapped, the structure appears; as the following;o;f.; +------------------+ +--------------------+.; ! DCM11M code ! ! Cache Partition !;; !------------------! !--------------------! (Pool area)e.; ! Don't care ! !Cache Partition/UCBX!.; !//////////////////! !////////////////////!; 2; For I-space only systems, the general layout is;;-;; +--------------------+; ! DCM11M code !; !--------------------!; !Cache Partition/UCBX!; !////////////////////!;e;-4DCPHS1: CALL $SAVNR ; save non-volatile registers .IF DF K$$DAS7 MOV KINAR5,KDSAR5 ; map the region in D-space as wellP .ENDC ;DF,K$$DAS-$ MP.UCBX ; Map the UCBX into APR6. BEQ DCRJCT ; None present if EQ, no caching .IF DF S$$HDW&S$$HLS/7 BIT #1,I.IOSB+4(R1) ; does this have an IIOC planned?n" BEQ 10$ ; if EQ, nope, continue; CMP @#KINAR5,I.IOSB+2(R1) ; is that IIOC scheduled for us?- BEQ DCRJCT ; yes, forward on to the drivern .ENDC ;DF,S$$HDW&S$$HLS<10$: MOVB I.FCN+1(R1),R0 ; get the high order function code4 CMPB R0,#IO.RLB/256. ; is this a control function?3 BLOS 20$ ; if LO, nope, trasnfer, check activityM9 CMP I.FCN(R1),#IO.STC ; is this a full IO.STC operation?e2 BNE DCRJCT ; if NE, nope, send it to the driver* CALL DCCTL1 ; dispatch control function BCS DCRJCT ; send to phase II TST R1 ; any packet left?& BNE DCFORK ; if NE, yes, check fork BR DCEXIT ; and finish up*20$: DEC R0 ; normalize index to RLB/WLB! BMI DCRJCT ; if MI, was IO.KIL = BITB #XC.ACT, APR6.BASE+X.CSTS ; Cache active for this unit?c, BEQ DCRJCT ; No if EQ, pass to the driver1 CMP I.TCB(R1),$RCTPT ; is this request from RCT?i0 BEQ DCRJCT ; don't even think of syncronizing< BITB #X2.DEA, APR6.BASE+X.CST2 ; Cache rundown in progress?% BEQ 30$ ; No, go ahead and process 4 CALL Q2DRVR ; Queue, send to driver after rundown! BR DCFORK ; and finish rundownX.30$: ASL R0 ; convert function to word index. CALL @DCDISP(R0) ; and dispatch the function3 BCC DCFORK ; If Phase 1 accepted cache operationr. BCS DCRJCT ; ...see if Phase 2 required now) ; ...else return flag to call driveri,DCEXIT: CLR R1 ; tell $DRQRQ we handled it2DCRJCT: RETURN ; we still haven't returned ther&DCUNK: SEC ; flag to pass to driver" RETURN ; and finish processing-DCDISP: .WORD DCW1 ; IO.WLB (Write phase I)n .WORD DCRLB ; IO.RLB/IO.LOV;+2; **-DCRLB -- Process IO.RLB, and its subfunctions;L2; This routine will seperate out the various types@; of read functions, namely (IO.RLB, IO.LOV, IO.LDO, and IO.SCF);e;-0DCRLB: MOV I.FCN(R1),R0 ; Get the function code( CMP #IO.LOV,R0 ; Load I-space overlay? BEQ 20$ ; Yes if EQ( CMP #IO.LDO,R0 ; Load D-space overlay?& BNE 30$ ; No if NE (or, Yes if EQ )020$: CALLR DCOV1 ; Invoke load overlay phase I/30$: BIT #CHEBYP,R0 ; Should read be bypassed?D) BEQ 35$ ; no bypass function requested 3 CALLR CHEPUR ; check for deferred extent overlape35$: ; reference label .IF DF, S$$HDW . TST U.UMB(R5) ; is this unit being shadowed? BEQ 40$ ; no, go do itF1 CMP #IO.SCF,R0 ; is this a shadow copy function # BEQ DCUNK ; yes, don't cache it!; .ENDC ; S$$HDWO'40$: CALLR DCR1 ; Invoke read phase I  , .SBTTL Phase II operations fork queue entry/ .SBTTL + DCFORK - Start Phase II Cache ProcessR;+<; Routine DCFORK is responsible for obtaining a unit of work:; fr00zzibjbkb a a aom the packet queue and initiating Phase II processing; using the system FORK queue.; ; Passed:$; /; R5 -> UCB (used to find cache region to map).?;B8; The packet queue for Phase II processing is located at; H.PKTQ in the cache region. ;yA; The queue contains the User Request Packet (URP, the system I/OoF; packet passed to the data cache code from $DRQRQ for a user request.;TD; During Phase I processing of transfer operations (reads and writesD; there was a Cache Request Packet (CRP) allocated in cache internalC; pool (or system pool) for request context storage. I.AADA in thea?; URP points to to the associated CRP. The original I/O packetD; contents from the URP are saved in the CRP, and the URP is updatedD; (and occasionally refreshed) as cache processing progresses. ThisD; routine does not care about the CRP except when passing packets to8; the driver for completion during deactivation rundown.;a?; There is a special case where an I/O packet is passed to forkaD; processing which does not have a CRP. This is when a given requestC; has indicated that it should bypass data cache, however there areaD; extents which must be addressed prior to forwarding to the driver.A; In this case, the TCB address in the I/O packet is set odd, andaD; that is used as a flag to continue processing overlapping extents.;R;x ; Returned:s; <; This routine is used to start up a Phase II cache process.B; RETURNing to our caller will do the proper thing. Our caller isB; of no concern to us; we are "the system" (or believe that we are; when we reach this point.h;i?; Routine DCFORK is responsible for synchronizing us with otheru@; system (and possibly cache ioc) activity using the system forkB; mechanism. Here we setup and queue a fork block if there is any; work for Phase II.;o>; This code will execute a fork each time through the Phase II?; dispatching code. This is performed to allow any outstanding B; fork-level processes to execute before or between Phase II runs.; B; In a multi-processor environment, the code will attempt to allowA; another processor to run, by setting up a UNIBUS Run mask which A; if the logical "or" of all other pending fork blocks, which maye; be 0.o;8; The fork block is allocated from pool (DSR) when it is8; first needed, and kept as long as the cache region is;; active. There is one fork block per active cache region. ;; It is deallocated in DCCTL deactivation when deactivationo3; completes for the last unit cached in the region. ;- .ENABL LSBo6DCFRK0::BISB #CS.DNF,APRD.BASE+H.CSTS ; insure we fork BR 10$ ; and skip the mapping.DCFORK::MP.PAR ; ensure cache par is mapped@10$: CMP APRD.BASE+H.PAVL,#3 ; is our pool constant still there?. BNE 60$ ; if NE, nope, partition not mapped( TST APRD.BASE+H.PKTQ ; anything queued?, BEQ 50$ ; If EQ, nothing queued, exit now< MOV APRD.BASE+H.FRK,R0 ; get fork block ptr in cache header BNE 110$ ; got one, use it!;+C; At this point, we must allocate a fork block for use while thisC8; region is active. The fork block layout is as follows;; ; +---------------------------+K1; ! UNIBUS Run Mask ! (mP systems only)P; !---------------------------!l; ! Fork list link word ! ; !---------------------------!p3; ! PC of fork routine ! (Address of DCPHS2)5; !---------------------------!t7; ! R5 of fork routine ! (UCB address of device)a; !---------------------------!,<; ! R4 of fork routine ! (I/O packet to be processed); !---------------------------! ; !KINAR5 bias of fork routine!a; +---------------------------+-;-2 MOV #<6.*2>,R1 ;Attempt to allocate a fork block CALL $ALOCB ;From system pool0 BCS 50$ ;If CS, MAJOR PROBLEM: ignore for now( ; R0 -> Newly allocated pool block, CLR (R0)+ ;URM=0; any processor can do it= MOV R0,APRD.BASE+H.FRK ; save fork block ptr in cache headerU* MOV @#KINAR5,10(R0) ; store our APR bias" BR 120$ ; go fork into phase II=50$: BICB #CS.DNF,APRD.BASE+H.CS00zzt__DATADATADATADATATS ; allow to skip fork again- BR DCEXIT ; and finish up(60$: FATAL$ BE.IDC ; region not mapped8110$: TST 2(R0) ; see if it is in use (use PC as flag), BNE 50$ ; yes, just return, we'll be back>120$: MOV APRD.BASE+H.PKTQ,R4 ; Remove this one from the queue% ;URP address returned in R4 fromo- BIT #1,I.TCB(R4) ; is this a purge request?e, BNE 125$ ; if NE, yes, doesn't have a CRP? CMPB I.FCN+1(R4),#IO.STC/256. ; or is this a control function?- BEQ 125$ ; if EQ, yes, no CRP present here * CMP @I.CRP(R4),R4 ; is the CRP coherent?& BEQ 125$ ; if EQ, yes, continue ...# FATAL$ BE.IDC ; CRP is corrupteds2125$: MOV (R4),APRD.BASE+H.PKTQ ; link to next one# BNE 130$ ; Not last packet if NES9 MOV #APRD.BASE+H.PKTQ,APRD.BASE+H.PKTQ+2 ; update "last"r4130$: CACHE$ BYPASS ; insure we see the real thing, TST $FRKHD ; any fork processing pending?# BNE 140$ ; if NE, we should fork,6 BITB #CS.DNF,APRD.BASE+H.CSTS ; can we skip the fork?* BNE 140$ ; if NE, nope, we have to fork;+H; At this point, there is no reason to execute a fork, since we are inA; no rush to return to our caller, and we can continue execution.E;-! CACHE$ RESTOR ; unbypass cache  .IF DF K$$DAS< MOV @#KINAR5,@#KISAR5 ; remap ourselves into kernel-D space .ENDC ;DF,K$$DASH$ MOV R0,R3 ; copy fork block to R3, TST (R3)+ ; and advance to the PC address& BR DCPHS2 ; and enter into phase II&140$: CACHE$ RESTOR ; unbypass cache= BICB #CS.DNF,APRD.BASE+H.CSTS ; remove our phase I interlock+# ADD #6,R0 ;Advance to R4 storage . MOV R4,(R0) ;set URP pointer returned in R41 MOV R0,R4 ;Set fork blk ptr for call to $FORK1n, CLR R1 ;make sure DRQRQ knows we accepted/ CALL $FORK1 ;Queue the fork block and returne% ; to process phase II operations$ .DSABL LSB3 c& .SBTTL PHASE II OPERATIONS DISPATCHER2 .SBTTL + DCPHS2 - dispatch Phase II Cache Process4 .SBTTL + DCEXIT - finished cache processing for now;+<; Routine DCPHS2 is responsible for obtaining a unit of work9; from the packet queue and passing it to the appropriate;; processing routine.d; 8; The packet queue for Phase II processing is located atB; H.PKTQ in the cache region. The queue contains the User RequestB; Packet (URP, the system I/O packet passed to the data cache codeC; from $DRQRQ for a user request. In Phase I of transfer operation D; there was a Cache Request Packet (CRP) allocated in cache internalG; pool for request context storage. I.AADA in the URP points to to thenD; associated CRP. The original I/O packet contents from the URP areF; saved in the CRP, and the URP is updated (and occasionally refreshedG; as cache processing progresses. The I/O function code determines thehG; address to which control should be passed when the packet is dequeueda; and dispatched here.; A; In some cases, the URP will not have a CRP allocated, and theseaC; requests are queued to ensure the integrity of cache with respecte@; to a given I/O request. If an I/O request includes bypass bitsB; to read underneath data cache, then the deferred extents will be; written to disk.;R;s; Start Phase II Cache Process;d ; Context:; R3 -> PC stored in fork blockf%; R4 -> URP from cache phase 2 queue ;w>; Note: Until the first MP.PAR invocation, this code is mapped8; in both I/D space on systems which support kernel-I/D ; space.a;-;DCPHS2: CLR (R3) ; clear to show fork block now availablet# ; R4 -> URP passed across forkn+ MOV R4,R1 ; set conventional URP pointers3 MOV I.UCB(R1),R5 ; set up conventional UCB ptr toe MP.UCBX ; map UCBX for now- MOV #DCFORK,-(SP) ; set up a return address= MOVB I.FCN+1(R1),R0 ; extract the high byte of the functiono4 CMPB R0,#IO.STC/256. ; is this a control function?* BLO 20$ ; if LO, nope, must be transfer, BNE DSPERR ; if NE, fatal, dispatch error/ CALLR DCCTL2 ; assume must be phase 2 of ctl 520$: BIT #1,I.TCB(R1) ; are we in a purge operation?c BNE 30$ ; yes, continue scann9 BITB 00{zibjbkb a a a#X2.DEA,APR6.BASE+X.CST2 ; are we being deactivatedn$ BEQ 40$ ; no, continue processing5 TST I.ACED(R1) ; CED attached? (eg, I/O completion)& BNE 40$ ; yes, just let it complete! MP.PAR ; map cache paritition#) CALL RLSCRP ; release CRP, refresh URP/ CALLR Q2DRVR ; queue to driver on completionD-30$: CALLR PURPH2 ; continue phase II purgeD:40$: CMP R0,#IO.RLB/256. ; only two possibilities allowed BHI DSPERR ; dispatch error# ASL R0 ; convert to a word index. CALLR @DCDSP2(R0) ; and dispatch by functionDCDSP2: .WORD DSPERR ; IO.KILi' .WORD DCW2 ; IO.WLB (Write phase II)a1 .WORD DCR2 ; IO.RLB, IO.LOV, IO.LDO (phase II)u8DSPERR: FATAL$ BE.IFC ; Invalid function code bugcheck L* .SBTTL Common Phase I processing routines9 .SBTTL + PURCHE - purge out extents for read-under cacheH;+F; PURCHE -- This routine will purge out any extents which may overlapJ; a request, such that if a request is posted which either has bypass bitsB; set, or is too large, it will not encounter stale cache data ...; @; If the request is a write, all affected extents will be purged;. ; Input:; R1 - URP, w/o CRPO ; R5 - UCB;S ; Output:B; CC-C set, forward to driver%; CC-C clr, URP tied to given extentp;e;-)PURCHE::MP.UCBX ; map cache partitiont? BITB #XC.DFR, APR6.BASE+X.CSTS ; are deferred writes possible?r" BNE 5$ ; if NE, yes, must scan0 CMPB I.FCN+1(R1),#IO.RLB/256. ; is this a read?# BEQ 30$ ; if EQ, yes, skip thiss+5$: CALL SEARCH ; search for any extentsa$ BCS 50$ ; no overlaps, finish up710$: BITB #ES.WDF,E.STAT(R0) ; is this extent deferredR' BNE 15$ ; we must purge this extent 8 CMPB I.FCN+1(R1),#IO.WLB/256. ; is this a write request& BNE 20$ ; if NE, continue the scan;+F; This is a bit messy, since we have pending extents in cache, whichD; must be flushed, however, we must queue the block through cache so-; that we can allow the extents to be purged.3;-315$: BIS #1,I.TCB(R1) ; flag that purge is activea0 MOV I.ACED(R1),-(SP) ; save the old attach ptr% CLR I.ACED(R1) ; make it look free # CALL ATTCED ; attach to the CED , MOV (SP)+,I.ACED(R1) ; restore CED pointer$ BCS 40$ ; await phase II arrival* BISB #ES.DEL,E.STAT(R0) ; flag to delete- MOV E.LNXT(R0),-(SP) ; save the next extentn2 MOV I.ACED(R1),-(SP) ; save real attachment info/ MOV R0,I.ACED(R1) ; and show we are attached + CALL DETCED ; force a write of this CED# BCS 60$ ; extent I/O is pendinga3 MOV (SP)+,I.ACED(R1) ; restore attachment pointerh" MOV (SP)+,R0 ; get the next CED( BIC #1,I.TCB(R1) ; allow continuation" BR 30$ ; and continue the scan.20$: MOV E.LNXT(R0),R0 ; get the next extent(30$: SEC ; flag to forward to driver& BEQ 50$ ; if EQ, no defers to copy8 CMP R3,E.LBNL+2(R0) ; does this extent overlap ;DC430/ BLO 50$ ; if LO, nope, send to driver ;**-1 $ BHI 10$ ; if HI, yes, check this. CMP R2,E.LBNL(R0) ; how about the low order& BHIS 10$ ; if HIS, yes, check this# RETURN ; w/ CC-C set, all doneR%40$: CLC ; we are queued to a CED 50$: RETURN ; to caller *60$: CALL ATTCED ; re-attach to the CED3 MOV (SP)+,I.ACED(R1) ; restore attachment pointer  TST (SP)+ ; clean stack$ RETURN ; and await phase II RA .SBTTL + CHEPUR, Common dispatch to remove extents in contentionf;+G; **-CHEPUR- Common routine from read/write to purge contending extentsP;,; Input:; Phase I processing contextB; ; Output: (; CC-C clear, cache has extent attached9; CC-C set, forward request to driver via phase I exit ;;-)CHEPUR::CALL PURCHE ; purge out extentsD+ BCS 10$ ; if CC-C set, forward to driver(4 BISB #CS.DNF,APRD.BASE+H.CSTS ; insure that we fork' CLR R1 ; insure no packet to confuse10$: RETURN ; to caller4 .SBTTL + PURPH2, Continue phase II purge processing;+2; **-PURPH2- Purge phase II, continue extent scan;x>; This routine is entered immediately after DCPHS2 to 00 {{t__DATADATADATADATAcontinue?; the scan for extents which overlap a given I/O request. It isrG; expected that this routine will never be required, and is included to G; bullet proof the test cases which create paranoid overlap of deferred ; extents ...S;.?; Input: Normal Phase II setting, immediately after startingf ; phase II; ;-1PURPH2::CALL PURCHE ; look for more overlap ...u( BCC 10$ ; if CC, we are tied to a CED3 BIC #1,I.TCB(R1) ; reset our purge flag for now .e0 CALLR .DRQRQ ; and forward the request to the10$: RETURN ; to caller n/ .SBTTL + INICTX, Initialize statistics contexte;++; **-INICTX- Initialize statistics contextu;t?; This routine will determine the type of I/O request which hasG; posted, and return the max extent size, statistics offset, and statusr#; bits to continue through Phase I.P;:; Input: ; R1 - URPr; R5 - UCB addressB; Cache code mapped in KISAR5; UCBX mapped;. ; Output:r*; R0 - Pointer to context for I/O request; 0(R0) - bit to testu#; 2(R0) - max extent size pointerl$; 4(R0) - Statistics block address; CC-C clear, not virtual I/O; CC-C set , virtual I/O;--INICTX::MOV #IOFNC+2,R0 ; assume logical I/Oy7 BITB #,U.STS(R5) ; check mounted statuse+ BNE 30$ ; if NE, not mounted, or foreign  ; treat as logical I/Oe& TSTB I.EFN(R1) ; is this virtual I/O' BMI 20$ ; if MI, this is virtual I/OI> CMP I.TCB(R1),U.ACP(R5) ; is issuing task ACP for this device% BNE 30$ ; if NE, nope, logical I/Ou; L; The following code determines if context switching is disabled since it isE; when F11ACP has I/O issued on behalf of a user task due to a extent M; crossing (i.e. mapping failure). Otherwise, it is considered directory I/O.m;t( TSTB $CXDBL ; context switch enabled?$ BNE 20$ ; if NE, then virtual I/O$ TST -(R0) ; this is directory I/O BR 40$ ; and join common code+20$: TST (R0)+ ; advance to virtual stats  SEC ; set carryt BR 40$ ; and finish up 230$: CLC ; insure carry clear (not virtual I/O)*40$: MOV (R0),R0 ; get the stats context" RETURN ; to caller (DCR1/DCW1);+; Function code local data;-0IOFNC: .WORD IODIR,IOLOG,IOVIR ; types of reads7IODIR: .WORD XC.DIR, APR6.BASE+X.XDIR, APR6.BASE+S.DIRt7IOLOG: .WORD XC.LOG, APR6.BASE+X.XLOG, APR6.BASE+S.LOG7IOVIR: .WORD XC.DAT, APR6.BASE+X.XDAT, APR6.BASE+S.DATn .PSECT $PATCHPATCH:: .WORD 0 ;n .ENDC ; .IF DF D$$CHE .ENDet carryt BR 40$ ; and finish up 230$: CLC ;R1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reserved;S; 4; This software is furnished under a license and may0; 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 other1; copies thereof may not be provided or otherwiseO2; made available to any other person. No title to5; or ownership of the software is hereby transferred.;M0; The information in this software is subject to3; change without notice and should not be construed 3; as a commitment by Digital Equipment Corporation.i;d2; Digital assumes no responsibility for the use or2; reliability of its software on equipment that is; not supplied by Digital.;b; ; Previously Modified by:t; J. Kauffman; Eric Postpischilm;n(; Re-mastered for RSX-11M-PLUS V4.4 by:;e ; L. B. McCulley 29-Dec-91 4.004; LBM409 -- Major changes for bug fixes addressing2; read/write interactions and general cleanup;o; D. Carroll 10-October-1992h2; DC143 -- Define bugcheck definitions for cache;u; D. Carroll 1-Nov-1992 4.03i2; DC151 -- other cleanup functions/optimizations;l; D. Carroll 21-Nov-1992 4.04;; DC156 -- add pseudo-write-behind support by conditionald;e; D. Carroll 04-Dec-1992 4.054; DC157 -- Impliment a cache hash table for SEARCH;:$; Modified for RSX-11M-PLUS V4.6 by:; ; D. Carroll 08-Jan-1996 05.00 *; DC430 - Include support for 32-bit LBNs;s;d;r#; Pref00{zibjbkb a a aix file for disk data cachingb;15; Note that the data mapping is different for I/D ande2; non-I/D systems. In order to offer maximal data7; space for the [larger] I/D systems, kernel data space17; will be used to map the cache partition header. Thiso4; provides up to 16KB of cache data structures which:; should be more than adequate. However, special handling; is provided for local data.6=; For non-ID systems, only APR6 is used to map the partition.s9; This sets a limit of 8KB on the data structures. Underk;; normal use, this would place a virtual limit on the cache /; date buffer to about 512KB, since there woulde6; be data structure allocation shortages on partitions; in excess of 512KB.l; #; NOTES ON ADDRESSING RESTRICTIONS:r;T;; Note that the cache code itself cannot rely on local data <; 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.s:; On I/D systems, D-space is used to reference 8KW in both; APR5 and APR6.;a2; The UCB extension (UCBX) is mapped in APR6, as a;; convention. It is usually mapped only in the dispatchingn=; code, and may be dynamically (temporarily) mapped to accessN;; the cells used to maintain the device-specific listheads.s; :; 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.;s?; The actual cache buffers themselves are never directly mappedP<; during operation, although the executive subroutine $BLXIO!; will map them to transfer data.y;p6; CHEWBH = 0 ; Define to enable write-behind support CHEDFR = 0r0 CHESTS = 0 ;Define to enable cache statistics;t ; Macro callsf;l# .MCALL CHEDF$ ;Cache definitionss/ .MCALL FILIO$ ;File oriented I/O definitionso$ .MCALL PKTDF$ ;Packet definitions1 .MCALL QIOSY$ ;QI/O error and code definitionso$ .MCALL UCBDF$ ;UCB[X] definitions? .MCALL BGCK$A,BCKDF$ ; Define bugcheck macro, and definitionsa( BCKDF$ ; Define bugcheck definitions CHEDF$i FILIO$e PKTDF$s QIOSY$y UCBDF$H .IF DF CHEWBH,WS.WBH = 100 ; internal write behind flag .ENDC ;DF,CHEWBHf;o; Macro definitionsi;; H; MP.UCBX - Map UCBX in KISAR6 (replaces call to single instruction subr;e) .MACRO MP.UCBX ; Assumes UBC ptr in R5;0 MOV U.UCBX(R5),KISAR6 ; Map UCB's UCBX in APR 6 .ENDM MP.UCBX;K; MP.PAR - Map cache partition in KISAR6 or KISAR5 & KISAR6 (if kernel I/D)k;c( .MACRO MP.PAR ; Assumes UCB ptr in R5+ MP.UCBX ; Map UCBX to get cache addressF MP$PARY .ENDM MP.PAR.; ;; MP$PAR - Map cache partition in KISAR6 or KISAR5/6 if I/D;;C .MACRO MP$PAR MOV R0,-(SP) ; Save a register3 MOV APR6.BASE+X.CPCB,R0 ; Get address of cache PCBt- MOV P.REL(R0),KISAR6 ; Map partition in APR6 ! MOV (SP)+,R0 ; Restore registerA' .IFDF K$$DAS ; Kernel I/D executive?X+ MOV KISAR6,KISAR5 ; I/D systems allow 8KW6* ADD #200,KISAR6 ; Always map accordingly .ENDC ; K$$DASs .ENDM ; MP$PAR;.7; FATAL$ macro, used to declare cache inconsistenciesN;M .MACRO FATAL$ ERR BGCK$A BF.CHE,'ERR', .ENDM ;FATAL$;/#; USTAT$ - Update Statistics BufferP;; .MACRO USTAT$ OFFSET,BASE, .IF DF CHESTS ; Cache statistics enabled? .IF NB $ MOV BASE,-(SP) ; load base address< MOV #, (R1) ; load the offset, and flag base .IFF ;NB,* MOV #OFFSET, (R1) ; assume R1 => i/o pkt .IFTF ;NB,s0 CALL $USTAT ; use I.LNK as param passing link .IFT ;NB, TST (SP)+ ; clean stack .ENDC ;NB,c .ENDC ; .IFDF CHESTSR .ENDM USTAT$E;'(; CRP (Cache Request Packet) definitions7; CRP stores I/O request context in cache internal poolE;. .SAVE .ASECTC.=0s;R.URP: .BLKW 1 ; Pointer to associated User Request Packet ?R.STAT: .BLKW 1 ; Status block context (base offset for USTAT)f:R.LBNH: .BLKW 2 ; Disk extent high LBN (LSP, MSP) ;DC4305R.LBNL: .BLKW 00{{t__DATADATADATADATA2 ; Disk extent low LBN (LSP) ;DC430L:R.FCN: .BLKB 1 ; I.FCN modifiers from user I/O pkt ;**-35R.EFN: .BLKB 1 ; I.EFN virtual op flag from user pktT*R.IOSB2: .BLKW 1 ; I.IOSB+2 from user pkt" .BLKW 1 ; I.IOSB+4 from user pkt)R.P1.1: .BLKW 1 ; I.PRM+P1 from user pktE0R.P1.2: .BLKW 1 ; I.PRM+P1 word 2 from user pkt'R.P2: .BLKW 1 ; I.PRM+P2 from user pkt'R.P3: .BLKW 1 ; I.PRM+P3 from user pktb'R.P4: .BLKW 1 ; I.PRM+P4 from user pkt;'R.P5: .BLKW 1 ; I.PRM+P5 from user pkt'R.AADA: .BLKW 2 ; I.AADA from user pktS ; I.AADA+2 from user pktR.LGTH=. .RESTOREe; ; Offset definitions in I.PRM.; ! P1 = 0 ;Parameter 1 (I.PRM+0)O P1.1 = 0 ; P1.2 = 2 ;s! P2 = 4 ;Parameter 2 (I.PRM+4)s! P3 = 6 ;Parameter 3 (I.PRM+6) # P4 = 10 ;Parameter 4 (I.PRM+10)P# P5 = 12 ;Parameter 5 (I.PRM+12)K# P6 = 14 ;Parameter 6 (I.PRM+14)  P6.1 = 14 ;[UQ.UMD] P6.2 = 16 ;[UQ.UMD];I&; Cache specific offsets within an IOP;P I.CRP = I.AADA ; CRP address- I.ACED = I.AADA+2 ; Address of attached CED ;p=; Symbols used internally as "base values" for APR relocationR;5 APR5.BASE = 120000 ;Base address for APR5 reference5 APR6.BASE = 140000 ;Base address for APR6 reference , .IF DF K$$DAS ;Kernel I/D space supported, APRD.BASE = APR5.BASE ;Data begins in APR5 .IFF ;K$$DAS6 APRD.BASE = APR6.BASE ;Non-I/D systems begin in APR6 .ENDC;6; Macro status bits ;h=; CHEBYP: All modifiers in the function code to indicate thatP); the operation is to be cache bypassed.a;c<; EXBUSY: All bits which mark the extent as "busy" or locked-; pending the completion of another process.e;d;sA CHEBYP = ;<1!2!4=7> If set, request is "bypass"eD EXBUSY = ;<> If set, extent in use or locked;.); Definitions for large extent transfers.S;A>MAXTR = 17700 ; size of largest permissible transfer, in bytes:MAXTRB = 177 ; size of largest transfer, in 64-byte blocksunction code to indicate thatP); t .TITLE DYDRV2 .IDENT /04.10/];R;A1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ;4;/<; 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:t;g; R. T. PERRON ; P. J. CARR; P. J. BEZEREDI ; J. GALLANT ; T. LEKAS ; L. KOGAN; G. MARIGOWDA; $; MODIFIED FOR RSX-11M-PLUS V4.4 BY:;(; D. CARROLL 20-JUL-1992 04.102; DC135 - CORRECT PROBLEMS IN INSURING THAT DYCOM*; IS CORRECTLY LOADED PRIOR TO SUCESSFUL ; ONLINE; ; RX211- NPR FLOPPY DISK DRIVERS;W; FUNCTIONS RECOGNIZED:L<; IO.RPB - READ PHYSICAL BLOCK (MAY READ ANY SECTOR ON DISK)>; IO.WPB - WRITE PHYSICAL BLOCK (MAY WRITE ANY SECTOR ON DISK)8; IO.WDD - WRITE DELETED DATA - WRITE ANY SECTOR ON DISK3; SETTING THE DELETED DATA MARK IN SECTOR HEADERK;NB; THE FOLLOWING FUNCTION CODES OPERATE ON 256. WORD BLOCKS OF DATAA; (4 SECTORS FOR SINGLE DENSITY OR 2 SECTORS FOR DOUBLE DENSITY). D; THE DRIVER AUTOMATICALLY INTERLEAVES AND SKEWS SECTORS TO OPTIMIZEB; THE TRANSFER OF DATA SO THAT A LONG TRANSFER MAY BE DONE WITHOUTC; LOOSING A REVOLUTION OF THE DISK. THE INTERLEAVE FACTOR IS 2 AND-; THE SKEW FACTOR IS 6.Y,; IO.RLB - READ LOGICAL BLOCKS OF 256. WORDS.; IO.WLB - WRITE LOGICAL BLOCKS OF 256. WORDS.;G@; THE FOLLOWING FUNCTION CODES ARE USED TO INITIALIZE THE FLOPPYE; TO SINGLE OR DOUBLE DENSITY AND TO REPORT WHICH DENSITY THE CURRENT ; FLOPPY IS.; IO.SMD - SET MEDIA DENSITY&; IO.SEC - SENSE MEDIA CHARACTERISTICS;SC; IF DELETED DATA IS READ, THE STATUS CODE RETURNED WILL BE IS.RDD,F; OTHERWISE IT WILL BE IS.SUC.;  O* .MCALL HWDDF$,PKTDF$,PCBDF$,QIOSY$,SCBDF$ QIOSY$ SCBDF$ ,,SYSDEF% HWDDF$ ; DEFINE HARDWARE REGISTERSO% PKTDF$ ; DEFINE I/O PACKET OFFSETSB PCBDF$ ; DEFINE PCB OFFSETS L;N; EQUATED SYMBOLSE;E ORETRY = 10 ; ERROR RETRY COUNTL.CEW = 4 ; RETRY COUNT FOR IO.SMD AND IO.SEC'S-DYNUM = 6 ; NUMBER 00"{zibjbkb a a aOF REGISTERS TO ERROR LOGA1MEMSIZ = 7600 ; 124K OF MEMORY IN 32 WORD BLOCKSS$APR5DS = 120000 ; APR5 DISPLACEMENT$APR6DS = 140000 ; APR6 DISPLACEMENT*LOOP = 1000 ; COUNTER TO CHECK FOR TR BIT;$; U.CW2 BITS USAGE;C!DELDAT = 100 ; DELETED DATA READD ERR1 = 2000 ; TIMEOUT ERROR BITDEN = 4000 ; DENSITY BITC'RSAE = 10000 ; READ STATUS AFTER ERRORE,SCHAR = 40000 ; SENSE MEDIA CHARACTERISTICS4SILO = 100000 ; FUNCTION ISSUED WAS A SILO FUNCTION;M; U.CW3 WORD USAGE; SINGLE = 494. ; SINGLE DENSITYODOUBLE = 988. ; DOUBLE DENSITYR N; -; DEVICE REGISTER OFFSETS AND BIT DEFINITIONSE; 6#RXCS= 0 ; CONTROL STATUS REGISTERPGO = 1 ; GO BITUNIT = 20 ; UNIT SELECT BITDONE = 40 ; DONE BITE INTEBL = 100 ; INTERRUPT ENABLE)TR = 200 ; TRANSFER READY BIT (CPU-SILO)0SDEN = 400 ; DENSITY BIT #RX211 = 4000 ; RX211 INDICATOR BIT "INIT = 40000 ; INITIALIZATION BITERR = 100000 ; ERROR BITO RXDB = 2 ; DATA BUFFER REGISTER'RXES = 2 ; RX211 ERROR STATUS REGISTERSCRCERR = 1 ; CRC ERROR BIT;!INITDN = 4 ; INITIALIZE DONE BITRRXACLO = 10 ; RX221 AC LOW BITN DENERR = 20 ; DENSITY ERROR BIT+DRVDEN = 40 ; SELECTED DRIVE'S DENSITY BIT 5DELDAT = 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 BITI B;; 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 DENSITYN-MRDS = INTEBL!12!GO ; MAINTENANCE READ STATUS )WRTDD = INTEBL!14!GO ; WRITE DELETED DATA1&RDERC = INTEBL!16!GO ; READ ERROR CODE 0;R ; LOCAL DATA;E2; RETRY COUNT TABLE (INDEXED BY CONTROLLER NUMBER); &DYPCB: .WORD 0 ; ADD OF PCB OF DYCOM /DYCOM: .RAD50 /DYCOM/ ; NAME OF DY DATA COMMON*BFLAG: .BLKW R$$X21 ; BUFFERING DATA FLAG ; = 0 DO NOT BUFFER DATA ; = 1 BUFFER DATA 9RTTBL: .BLKW R$$X21 ; ERROR RETRY COUNT FOR CURRENT UNITE5CSRSV: .BLKW R$$X21 ; WORD TO SAVE CSR FUNCTION CODE=6COUNT: .BLKW R$$X21 ; COUNT OF BYTES TRANSFERED IN IB;WCOUNT: .BLKW R$$X21 ; COUNT OF DATA LEFT TO BE MOVED (FORO ; WRITE OPERATION ONLY):BUFLEN: .BLKW R$$X21 ; LENGTH OF INTERMEDIATE BUFFER (IB)8PHYADD: .BLKW R$$X21 ; PHYSICAL ADD OF USER BUFFER (LO)8HIADD:: .BLKW R$$X21 ; PHYSICAL ADD OF USER BUFFER (HI)8LOPHYA: .BLKW R$$X21 ; LO ORDER 16 BITS OF PHY ADD (IB)7HIPHYA: .BLKW R$$X21 ; HI ORDER 2 BITS OF PHY ADD (IB)F0DYPTR: .BLKW R$$X21 ; POINTER IN DY DATA COMMON9TEMP: .BLKW R$$X21 ; TEMPORY COUNTER WHEN DOING MULTIPLEE ; FORKSI:RETPTR: .BLKW R$$X21 ; TEMPORY STORAGE FOR RET ADDRESS OF# ; SUBROUTINE WHEN CALLING $FORK" ; NOTHING CAN BE ON STACK WHEN ; CALLING $FORK)5CONCNT: .WORD 0 ;# OF CONTROLLERS CONNECTED TO DYCOML;; MAKE GTPKT$ A LOCAL MACROC;A( .MACRO GTPKT$ DEV,NCTRLR,ADDR,UCBSV,SUC CALL @GTPKT .IF B BCC 65535$H RETURN 65535$:  .IFFR BCS ADDRP .ENDC .IF B  $$$=0 .IF B .IF EQ $$$M MOV R5,S.OWN(R4)X .ENDC .ENDC .IFFH .IF GT NCTRLR-1 MOV R5,UCBSV(R3)P .IFFK MOV R5,UCBSVP .ENDC .ENDC .ENDM; $; EXECUTIVE ENTRY POINT VECTOR TABLE;1EXEVEC: .WORD 0 ; FLAG FOR VECTOR NOT YET FILLEDR ALOCB: .WORD $ALOCB BLXI: .WORD $BLXIOT DEACB: .WORD $DEACB DTOER: .WORD $DTOER DVERR: .WORD $DVERR ERRSQ: .WORD $ERRSQ FNDSP: .WORD $FNDSP FORK: .WORD $FORK FRKHD: .WORD $FRKHD GTPKT: .WORD $GTPKT HFMSK: .WORD $HFMSK IODON: .WORD $IODON LDREG: .WORD $LDREG MPPHY: .WORD $MPPHY C MPUBM: .WORD $MPUBM SCERR: .WORD $SCERR SRNAM: .WORD $SRNAM STMAP: .WORD $STMAP VOLVD: .WORD $VOLVD ; EXEVCL=<<<.-EXEVEC>/2>-1> ;;; DRIVER DISPATCH TABLE ; 0 DDT$ DY,R$$X21,,,,NEW ; GENERATE DISPATCH TABLE .;+/; *** - DYINI FLOPPY DISK CONTROLLER INITIATORO;D; THIS ROUTINE IS ENTERED FROM THE QIO DIRECTIVE WHEN AN I/O REQUESTG; IS QUEUED AND AT THE00*{{t__DATADATADATADATA END OF A PREVIOUS I/O OPERATION TO PROPOGATE THE D; EXECUTION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY,E; THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O REQUEST. OTHERWISEK; A RETURN TO THE CALLER IS EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL;F; THE NEXT I/O OPERATION IS INITIATED. A RETURN TO THE CALLER IS THEN ; EXECUTED.E;. ; INPUTS: 3; R5 - ADDRESS OF UCB OF CONTROLLER TO BE INITIATEDS;U ; OUTPUTS:<; IF THE CONTROLLER ASSOCIATED WITH THE SPECIFIED UCB IS NOTA; BUSY AND AN I/O REQUEST IS WAITING TO BE PROCESSED, THE REQUESTT>; IS DEQUEUED AND THE DRIVER INITIATES THE REQUESTED FUNCTION.;N;- .ENABL LSBD-DYINI: GTPKT$ DY,R$$X21 ; GET NEXT I/O PACKET; 0; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT;E ; R1 - ADDRESS OF THE I/O PACKET5; R2 - PHYSICAL UNIT NUMBER OF DEVICE TO BE INITIATEDN; R3 - CONTROLLER INDEXU; R4 - ADDRESS OF SCB ; R5 - ADDRESS OF THE UCBT;E'; FLOPPY DISK I/O REQUEST PACKET FORMATS;I!; WD. 00 -- I/O QUEUE THREAD WORD/; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBERS1; WD. 02 -- ADDRESS OF TCB OF THE REQUESTING TASKIA; WD. 03 -- POINTER TO SECOND LUN WORD OF REQUESTING TASKS HEADERY5; WD. 04 -- CONTENTS OF FIRST LUN WORD ( UCB ADDRESS)U>; WD. 05 -- I/O FUNCTION CODE (IO.RLB, IO.RPB, IO.WLB, IO.WPB,; IO.WDD, IO.SMD OR IO.SEC)/; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCKE/; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK :; WD. 10 -- I/O STATUS BLOCK ADDRESS DISPLACEMENT + 1400002; 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 TRANSFERS; WD. 15 -- NOT USED (IGNORED)5; WD. 16 -- LOW BYTE MUST BE ZERO, HIGH BYTE NOT USED ,; WD. 17 -- LOGICAL OR PHYSICAL BLOCK NUMBER; WD. 20 -- NOT USED; %; DRIVER USAGE OF WORDS IN I/O PACKET 5; I.PRM+6 (WD. 15) - STATUS REGISTER AFTER INTERRUPTO6; I.PRM+10 (WD. 16) - LOGICAL OR PHYSICAL BLOCK NUMBER-; I.PRM+12 (WD. 17) - SIZE OF "THIS" TRANSFER 4; I.PRM+14 (WD. 20) - PHYSICAL SECTOR NUMBER (1-26.)3; I.PRM+15 (WD. 20) - PHYSICAL TRACK NUMBER (0-76.)F;;D?; WHEN BRINGING RX02 CONTROLLER ONLINE, HRC ISSUES AN IO.SMD TOEA; DYDRV. OFFSETS I.PRM+12 AND I.PRM+14 GET RELOCATED TO I.PRM+147=; AND I.PRM+16 BY $VOLVD ROUTINE. $VOLVD THINKS THAT IT IS AN?; IO.STC FUNCTION AND DOES THE RELOCATE. IN $IOFIN, IF I.PRM+16TA; IS NOT A VALID BUFFER ADDESS (> 140000) OR ZERO, THE SYSTEM CANIA; CRASH OR DESTROY A LOCATION IN MEMORY.SINCE IO.SMD IS ONLY USED D; FOR RX02 DEVICE, A SPECIAL CHECK IS MADE IN THE DRIVER FOR IO.STC.6; IF THE FUNCTION IS IO.STC THEN I.PRM+16 IS CLEARED. ,; THE DRIVER DOES NOT USE LOCATION I.PRM+16.;T;;Y; INITIALIZE DRIVER2;D& MOV #RETRY,RTTBL(R3); SET RETRY COUNT4 BIC #^C,U.CW2(R5); CLEAR DYNAMIC UCB FLAG BITS$ CALL @VOLVD ;VALIDATE VOLUME VALID BCS 20$ ; IF CS WE FAILEDM( 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$ ; NOC7 CLR I.PRM+16(R1) ; CLEAR THIS FOR THE BLOCK LOCK CODE F ; IN $IOFINI$5$: TST (SP)+ ; RESTORE STACK LEVEL TST R0 ; TRANSFER FUNCTION?I BPL 20$ ; IF PL NO* TSTB I.PRM+10(R1) ; HIGH BLOCK SPECIFIED? BEQ 30$ ; IF EQ NO10$: JMP 380$ ; YES, ERRORR20$: JMP 440$ ; ERROR;L; CHECK FOR A VALID FUNCTION;,30$: MOV S.CSR(R4),R2 ; RETRIEVE CSR ADDRESS1 CMPB #IO.SEC/256.,I.FCN+1(R1) ; VALID FUNCTION?A+ BNE 60$ ; IF NE, IT MUST BE READ OR WRITE 7 MOVB #CEW,RTTBL(R3) ; IO.SEC AND IO.SMD ONLY 4 RETRIES(% MOV I.FCN(R1),R0 ; GET FUNCTION CODEE# BIC #7,R0 ; REMOVE QUALIFIER BITS;( CMP #IO.SEC,R0 ; SENSE CHARACTERISTICS? BNE 40$ ; IF NE NO* JMP DYSEC ; GET DISKETTE CHARACTERISTICS(40$: CMP #IO.SMD,R0 ; SET MEDIA DENSITY? BNE 50$ ; IF NE NO0 BITB #US.MNT!US.FOR,U.STS(R5) ; DEVICE MOUNTED? BEQ 50$ ; IF EQ YESC7 MOV R0,I.FCN(R1) ; SET FUNCTION CODE WITHOUT MODIFIERSN" JMP DYSMD ; SET DISKETTE DENSITY+50$: MOV #IE.IFC&377,R0 ; RETURN ERROR CODEC JMP 420$ ; E002{zibjbkb a a aXITE60$: ; REF LABELE;E'; SET UP MAPPING AND FIRST DISK ADDRESSE;B* BIT #HF.UBM,@HFMSK ; UNIBUS MAP PRESENT ? BEQ 61$ ; NO$ CLR BFLAG(R3) ; NO BUFFERING NEEDED2 CALL @STMAP ; SET UP 11/70 UNIBUS MAPPING ADDRS/ SWAB U.BUF(R5) ; POSITION EXTENDED MEMORY BITS BR 69$ N61$: MOV R2,-(SP) ; SAVE R2O. MOV U.BUF(R5),R0 ; GET ADDRESS EXTENSION BITS0 MOVB U.BUF+1(R5),-(SP); SAVE THE EXTENSION BITS- MOV U.BUF+2(R5),R2 ; GET USER BUFFER ADDRESS7( ADD I.PRM+4(R1),R2 ; FIND END OF BUFFER% ADCB (SP) ; GET ANY LEFT OVER CARRYM% BITB #^C303,(SP)+ ; 22 BIT ADDRESS ? BNE 62$ ; YES - DO BUFFERING, ASH #4,R0 ; GET BITS 17 & 18 INTO POSITION BR 63$ ;%62$: MOV #1,BFLAG(R3) ; DO BUFFERING  MOV (SP)+,R2 ; RESTORE R2 BR 65$ ;(63$: CLR BFLAG(R3) ; NO BUFFERING NEEDED) BIC #^C<30000>,R0 ; ISOLATE BITS 12 & 13F+ MOV R0,U.BUF(R5) ; SAVE HI BITS OF ADDRESS. MOV (SP)+,R2 ; RESTORE R2 BR 69$ ;@65$: MOV I.PRM+2(R1),PHYADD(R3); PHYSICAL ADD OF USER BUFFER(LO)# CLR HIADD(R3) ; CLEAR HIGH ADDRESS = MOVB I.PRM+1(R1),HIADD(R3); PHYSICAL ADD OF USER BUFFER (HI)  MOV R1,-(SP) ; SAVE R1B MOV R2,-(SP) ; SAVE R2E$ MOV DYPCB,R0 ; GET PCB ADD OF DYCOM# MOV P.REL(R0),R1 ; RELOCATION BIASI1 MOV R1,DYPTR(R3) ; INITIALIZE POINTER INTO DYCOMC) TST R3 ; IS THIS THE FIRST CONTROLLER ?C BEQ 67$ ; YESA& MOV P.SIZE(R0),R2 ; GET SIZE OF DYCOM ASR R2 ; DIVIDE IN HALFV( ADD R2,R1 ; POINT TO SECOND HALF OF IB4 ADD R2,DYPTR(R3) ; POINT INTO SECOND HALF OF COMMON'67$: MOV #APR6DS,R2 ; APR6 DISPLACEMENT ' CALL @MPPHY ; GET 18BIT PYS ADD OF IBD% ASH #4,R1 ; PUT BITS 17 & 18 OF ADD  ; INTO BITS 12 & 13 + BIC #^C<30000>,R1 ; ISOLATE BITS 12 AND 13M. MOV R1,HIPHYA(R3) ; SAVE HI BITS OF ADD OF IB( MOV R1,U.BUF(R5) ; SET UP EXTENDED BITS. MOV R2,LOPHYA(R3) ; SAVE LO BITS OF ADD OF IB/ MOV R2,U.BUF+2(R5) ; SET UP LO BITS OF ADD FORD ; DATA TRANSFERD) MOV P.SIZE(R0),R1 ; COMPUTE LENGTH OF IBA" ASH #6,R1 ; GET LENGTH IN BYTES ) TST R3 ; IS THIS THE FIRST CONTROLLER ?S BEQ 68$ ; YESC4 ASH #-1,R1 ; DIVIDE BY 2 - TWO CONTROLLERS SHARING ; ONE BUFFER*68$: MOV R1,BUFLEN(R3) ; SAVE LENGTH OF IB MOV R1,COUNT(R3) ;I: MOV U.CNT(R5),WCOUNT(R3); COUNT OF DATA TO BE MOVED FOR A ; WRITE FUNCTION MOV (SP)+,R2 ; RESTORE REGS MOV (SP)+,R1 ;R0 CMPB #IO.WLB/256.,I.FCN+1(R1); WRITE FUNCTION ? BNE 69$ ; NO( CLR COUNT(R3) ; NO BYTES TRANSFERED YET ; INITIATE CALL TO BLXIO69$:; MOV I.PRM+12(R1),R0 ; GET PHYSICAL OR LOGICAL BLOCK NUMBERE9 BITB #IO.RPB&377,I.FCN(R1) ; IS IT READ/WRITE PHYSICAL?D BNE 70$ ; IF NE YESS0 ASL R0 ; CONVERT TO LOGICAL SECTOR NO. (LBN*2)% BIT #DEN,U.CW2(R5) ; DOUBLE DENSITY?  BNE 70$ ; IF NE YESN ASL R0 ; SINGLE DEN - LBN*4D#70$: MOV R0,I.PRM+10(R1) ; STORE ITP.80$: MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS/ CALL TRKSEC ; CONVERT BLOCK # TO TRACK/SECTOR$ BCC 82$ ; IF CC -> OKN" JMP 10$ ; CS -> BAD BLOCK NUMBER82$:& MOV S.CSR(R4),R2 ; GET ADDRESS OF CSR1 CMPB #IO.WLB/256.,I.FCN+1(R3) ; WRITE FUNCTION?P BEQ 822$ ; IF EQ YES" JMP 190$ ; MUST BE READ FUNCTION;N; FILL SILO BEFORE WRITE; .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 ?+ BGT 88$ ; YESP/ CMP BUFLEN(R1),WCOUNT(R1); IS THE I/O TRANSFER ; GREATER THAN THE IBC  BGT 83$ ; BGT - NO> SUB BUFLEN(R1),WCOUNT(R1); UPDATE BYTES LEFT TO COMPLETE TRAN5 MOV BUFLEN(R1),TEMP(R1); NUMBER OF BYTES TO BE MOVED5 BR 84$ ;983$: MOV WCOUNT(R1),TEMP(R1); NUMBER OF BYTES TO BE MOVED;8 CLR WCOUNT(R1) ; AFTER THIS MOVE, I/O TRANS IS COMPLETE184$: MOV TEMP(R1),COUNT(R1); LENGTH OF DATA IN IBT)86$: CALL BLXIO ; FILL IB WITH MORE DATAE ADD #<256./100>,DYPTR(R1) ; BUMP POINTER INTO DYCOM (32 WORD BLOCKS)F- SUB #256.,TEMP(R1) ; DECREMENT TEMPORY COUNT  BLE 87$ ; IB IS FULL ' TST $FRKHD ; ANYONE WAITING TO FORK ?U$ BEQ 86$ ; IF EQ NO -> DO SOME MORE, CALL @FORK ; LET SOMEONE ELSE DO SOME WORK) MOVB S.CON(R4),R1 ; GET CONTROLLER INDEX(# MOV S.CSR(R4),R00:{{t__DATADATADATADATA2 ; GET CSR ADDRESSO* MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS BR 86$ ; DO SOME MORE BLXIOM987$: BIC #30000,U.BUF(R5); RESET EXTENDED ADDRESSING BITSF0 BIS HIPHYA(R1),U.BUF(R5); TO POINT TO BEG OF IB0 MOV LOPHYA(R1),U.BUF+2(R5); RESET LO BITS OF IB MOV R2,-(SP) ; SAVE REG MOV DYPCB,R2 ; GET PCB OF DYCOM7 MOV P.REL(R2),DYPTR(R1); INITIALIZE POINTER INTO DYCOM8 TST R1 ; ONE CONTROLLERO BEQ 877$ ; YES) MOV P.SIZE(R2),-(SP); GET SIZE OF REGION( ASR (SP) ; CUT IN HALF7 ADD (SP)+,DYPTR(R1) ; POINT INTO SECOND HALF OF REGION) 877$: MOV (SP)+,R2 ; RESTORE REG88$: D. MOVB #FILL,U.BUF(R5) ; SET FILL SILO FUNCTION)90$: BIT #DEN,U.CW2(R5) ; DOUBLE DENSITY?( BEQ 100$ ; IF EQ NO 1 BIS #SDEN,U.BUF(R5) ; YES-SET DOUBLE DENSITY BIT 2100$: BIS #SILO,U.CW2(R5) ; INDICATE SILO FUNCTION. MOVB S.CON(R4),R1 ; RETRIEVE CONTROLLER INDEX- MOV U.BUF(R5),CSRSV(R1) ; SAVE FUNCTION CODEN' MOV U.BUF(R5),(R2) ; INITIATE FUNCTION2* BIT #HF.UBM,@HFMSK ; UNIBUS MAP PRESENT ? BEQ 105$ ; N0+ MOV R2,-(SP) ; SAVE REGISTERL, CALL @MPUBM ; MAP 11/70 UNIBUS TO TRANSFER MOV (SP)+,R2 ; RESTORE REGISTER105$:S( MOV U.BUF+2(R5),R0 ; GET BUFFER ADDRESS/ MOV #128.,R1 ; DEFAULT TO A 128. BYTE TRANSFERN. BIT #DEN,U.CW2(R5) ; DOUBLE DENSITY DISKETTE? BEQ 110$ ; IF EQ NON' 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 COUNT9120$: MOV R1,I.PRM+12(R3) ; STORE BYTES BEING TRANSFERRED '130$: BITB #TR!DONE,(R2) ; TRANSFERRED? BMI 140$ ; IF MI YES BEQ 130$ ; IF EQ NOM BR 160$ ; ERRORR140$: ASR R1 ; WORD COUNT" MOV R1,RXDB(R2) ; LOAD WORD COUNT'150$: BITB #TR!DONE,(R2) ; TRANSFERRED?A. 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;R; EMPTY SILO AFTER READH;Y5170$: MOVB #EMPTY,U.BUF(R5) ; SET EMPTY SILO FUNCTIONO& BR 90$ ; SAME AS FILL SILO PROCEDURE;F); INITIATE TRANSFER BETWEEN SILO AND DISKR;/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 CODER# BIC #7,R1 ; REMOVE QUALIFIER BITS * CMP #IO.WDD,R1 ; WRITE WITH DELETED DATA? BNE 200$ ; IF NE NOR: MOVB #WRTDD,U.BUF(R5) ; SET "WRITE DELETED DATA" FUNCTION BR 200$ ;A.190$: MOVB #READ,U.BUF(R5) ; SET READ FUNCTION*200$: BIT #DEN,U.CW2(R5) ; DOUBLE DENSITY? BEQ 210$ ; IF EQ NO* BIS #SDEN,U.BUF(R5) ; YES-SET DENSITY BIT210$: TSTB U.UNIT(R5) ; UNIT 1?I BEQ 220$ ; IF EQ NOV0 BIS #UNIT,U.BUF(R5) ; YES, SET TO SELECT UNIT 13220$: MOVB S.CON(R4),R1 ; RETRIEVE CONTROLLER INDEXC- MOV U.BUF(R5),CSRSV(R1) ; SAVE FUNCTION CODE  MOV #LOOP,R0 ; SET UP COUNTER' MOV U.BUF(R5),(R2) ; INITIATE FUNCTIONV'230$: BITB #TR!DONE,(R2) ; TRANSFERRED?A BMI 240$ ; IF MI YES+ BEQ 235$ ; TR NOT SET - DECREMENT COUNTERC BR 160$ ; ERRORN!235$: DEC R0 ; DECREMENT COUNTER2! BNE 230$ ; KEEP ON CHECKING BITR) MOVB S.CON(R4),R3 ; GET CONTROLLER INDEX(* MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS% MOV #1,RTTBL(R3) ; JUST DO ONE RETRYN- JMP 620$ ; INITIALIZE DRIVE TO RECOVER FROML ; POWER OFF PROBLEM)5240$: MOVB I.PRM+14(R3),RXDB(R2) ; LOAD SECTOR NUMBERP2250$: BITB #TR!DONE,(R2) ; TRANSFER READY OR DONE?! BMI 260$ ; IF MI TRANSFER READYR BEQ 250$ ; IF EQ LOOPY& BR 160$ ; ERROR, NO TRANSFER REQUEST4260$: MOVB I.PRM+15(R3),R0 ; LOAD TRACK NUMBER IN R02270$: MOVB S.ITM(R4),S.CTM(R4) ; SET TIMEOUT COUNT0280$: BIS #S2.ACT,S.ST2(R4) ; SHOW I/O IS ACTIVE9 MOV R0,RXDB(R2) ; LOAD TRACK, BUFFER ADDRESS, OR ASCII ID;N ; DYPWF - POWER FAIL ENTRY POINT;; POWER FAIL IS HANDLED BY THE DEVICE TIMING OUT, THEREFOREI;; NO WORK IS DONE HERE. IT WILL BE HANDLED WHEN THE DEVICEN; TIME OUT ENTRY IS EXECUTED.?;B;2 ; DYCAN - CANCEL I/O ENTRY POINT4; CANCEL I/O IS A NOP OP FOR FILE STRUCTURED DEVICES;E DYPWF: ;;;IDYCAN: RETURN ;;; ;+5; ** -- DYKRB -- DY CONTROLLER STATUS CHANGE ROUTINEM;T00B{zibjbkb a a a=; THIS ROUTINE WILL HANDLE SETTING CONTROLLER ONLINE/OFFLINER;X>; THIS ROUTINE HAS BEEN ADDED FOR 22 BIT QBUS PROCESSORS. THE=; FOLLOWING REQUIREMENTS MUST BE MET TO HAVE THIS CONTROLLERI; BROUGHT ONLINE:; D; 1.DYCOM REGION MUST EXIST. DYCOM IS THE INTERMEDIATE BUFFER (IB).>; 2.DYCOM MUST BE LOADED IN THE FIRST 124K OF PHYSICAL MEMORY;A9; THIS ROUTINE WILL ALSO INSURE THAT THE DYCOM REGION IS:<; NOT CHECKPOINTABLE, NOT SHUFFLEABLE, AND FIXED IN MEMORY.;E ; INPUTSA; ; R2 = KRB ADDRESS; R3 = CTB ADDRESS.; C = 0 REQUEST OFFLINE TO ONLINE TRANSITION-; C = 1 REQUEST ONLINE TO OFFLINE TRANSTIONS; $SCERR = 1 PRESET TO SUCESS; ; OUTPUTS;H"; $SCERR < 0 OPERATION IS FAILURE#; $CSERR CONTAINS FAILURE CODET!; $SCERR = 1 OPERATION IS SUCESS(;.;-DYKRB:0 BCC 279$ ; IF CC -> GO TO TRANSITION TO ONLINE* BIT #HF.UBM,@HFMSK ; UNIBUS MAP PRESENT ? BNE 290$ ; YES5 DEC CONCNT ; DECREMENT # OF CONTROLLERS USING DYCOM ) BNE 290$ ; IF NE , THERE ARE STILL MOREA MOV R0,-(SP) ; SAVE R0S$ MOV DYPCB,R0 ; GET ADDRESS OF DYCOM8 BEQ 278$ ; IF EQ -> DON'T CLEAR BIT - DYPCB NOT SET UP5 BIC #P2.LMA,P.ST2(R0);CLEAR THE 'LEAVE ME ALONE' BIT 278$: MOV (SP)+,R0 ; RESTORE R0 BR 290$ ; AND RETURN#279$: TST EXEVEC ; IF DONE ALREADY  BNE 2$ ; SKIP THIS MOV R2,-(SP) ; SAVE R2- MOV R3,-(SP) ; SAVE R3I MOV KINAR6,-(SP) ; SAVE KINAR6M/ MOV @#112,R0 ; GET ADDRESS OF TABLE OF ENTRIESC; MOV (R0),R0 ; GET ADDRESS OF APR BIAS (1ST WORD IN TABLE)E2 MOV (R0),KINAR6 ; MAP COMMON THROUGH I-SPACE APR6! MOV #EXEVEC,R3 ; POINT TO VECTORQ* MOV #EXEVCL,R2 ; SPECIFY LENGTH OF VECTOR% CALL @#140004 ; TRANSLATE THE VECTORT" MOV (SP)+,KINAR6 ; RESTORE KINAR6 MOV (SP)+,R3 ; RESTORE R3 MOV (SP)+,R2 ; RESTORE R2,2$: BIT #HF.UBM,@HFMSK ; UNIBUS MAP PRESET ? BNE 290$ ; YES - NOTHING TO DO MOV R0,-(SP) ; SAVE R0M MOV R1,-(SP) ; SAVE R1N MOV R2,-(SP) ; SAVE R2  MOV R3,-(SP) ; SAVE R3E& MOV #DYCOM,R3 ; GET ADD OF DYCOM NAME' CALL @SRNAM ; SEARCH FOR NAMED REGION6* BCS 282$ ; DOES NOT EXIST - CANNOT BRING ; CONTROLLER ONLINEQ+ MOV R2,DYPCB ; SAVE ADDRESS OF DYCOM'S PCB! MOV R2,R1 ; DYCOM'S PCB ADDRESSO ASSUME PS.OUT,100000 ;T' TST P.STAT(R1) ; IS REGION IN MEMORY ?V BPL 281$ ; YES0 TSTB P.RMCT(R1) ; have we already called $LDREG$ BNE 27$ ; yup, don't mix and match MOV R4,-(SP) ; Save R4R MOV R5,-(SP) ; and R5R" MOV R1,R4 ; copy the PCB address- MOV P.MAIN(R4),R5 ; and the main PCB address2 CALL @FNDSP ; attempt to allocate region now ...% MOV DYPCB,R1 ; reset the PCB address ) BCS 27$ ; if CS, space is not availableD2 BIC #PS.OUT,P.STAT(R1) ; flag partition as loaded BR 28$ ; and finish up ...27$: ; reference label 2 INCB P.RMCT(R1) ; BUMP RESIDENT MAPPED TASK COUNT. MOVB #160.,P.PRI(R1) ; SET UP REGION PRIORITY' ; MAKE THE PRIORITY HIGH SO IT GETSa ; QUEUED UP QUICKLYa( CALL @LDREG ; BRING REGION INTO MEMORY'28$: MOV DYPCB,R1 ; RESTORE PCB ADDRESSd MOV (SP)+,R5 ; restore R5 MOV (SP)+,R4 ; and R4;281$: MOV P.REL(R1),R3 ; GET STARTING PHYSICAL ADD OF DYCOMC0 ADD P.SIZE(R1),R3 ; GET ENDING ADDRESS OF DYCOM1 CMP R3,#MEMSIZ ; IS DYCOM IN FIRST 124K MEMORY ?n0 BHI 282$ ; NO - DO NOT BRING CONTROLLER ONLINE9 BIS #PS.CHK!PS.FXD!PS.NSF,P.STAT(R1); MAKE SURE DYCOM IS(+ ; NOT CHK,NOT SHUFF,AND FIXED IN MEMORYP ASSUME PS.OUT,100000 ; - TST P.STAT(R1) ; IS THE PARTITION STILL OUT?I0 BMI 282$ ; YES, DON'T COME ONLINE JUST YET ...4 BIS #P2.LMA!P2.RON,P.ST2(R1); DON'T TOUCH PARTITION5 INC CONCNT ; INCREMENT # OF CONTROLLERS USING DYCOMA+ MOVB #1,P.RMCT(R1) ; Indicate one attacher % BR 285$ ; OK TO BRING DEVICE ONLINED8282$: MOVB #IE.PNT,@SCERR ; ERROR - PARTITION NOT THERE285$: MOV (SP)+,R3 ; RESTORE R3P MOV (SP)+,R2 ; RESTORE R2 MOV (SP)+,R1 ; RESTORE R1 MOV (SP)+,R0 ; RESTORE R0290$: RETURN ; DONE - RETURN;+.; ** --DYUCB -- DY UNIT STATUS CHANGE ROUUTINE;B;; THIS ROUTINE WILL HANDLE SETTING EACH UNIT ONLINE/OFFLINEA;.; THIS ROUTINE WILL JUST RETUR00J{{t__DATADATADATADATANI;DYUCB: RETURNC;+9; *** - $DYINT - RX211 FLOPPY DISK INTERRUPT ENTRY POINTa;o;-6 INTSE$ DY,PR5,R$$X21 ;;; GENERATE INTERRUPT SAVE CODE# MOV U.SCB(R5),R4 ; GET SCB ADDRESSI% TSTB S.STS(R4) ; IS THE DRIVE BUSY ?R BNE 295$ ; IF NE YES& RETURN ; IGNORE SPURIOUS INTERRUPTS"295$: MOV R3,-(SP) ; SAVE REGISTER% MOV U.SCB(R5),R4 ;;; GET SCB ADDRESSD, MOV S.PKT(R4),R3 ;;; GET I/O PACKET ADDRESS% MOV S.CSR(R4),R4 ;;; GET CSR ADDRESSN5 MOV RXDB(R4),I.PRM+6(R3) ;;; SAVE CONTROLLER STATUSI" MOV (SP)+,R3 ;;; RESTORE REGISTER! BIT #RXACLO,RXES(R4);POWER OFF ?R BEQ 297$ ;NO' RETURN ;POWER OFF - IGNORE INTERRUPTA297$:R! CLR (R4) ;;; DISABLE INTERRUPTS ( CALL @FORK ;;; CREATE A SYSTEM PROCESS MOV R4,R2 ; COPY CSR ADDRESS# MOV U.SCB(R5),R4 ; GET SCB ADDRESSN) MOVB S.CON(R4),R3 ; GET CONTROLLER INDEXR. BIT #SCHAR,U.CW2(R5); SENSE CHARACTERISTICS ? BNE DYSEN ; IF NE YESA TST (R2) ; ANY ERRORS? BPL 300$ ; IF PL NO ERRORS JMP DYRTY ; YES-RETRY FUNCTION0300$: 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 NOU JMP 410$ ; YES, FINISH I/O4310$: CMPB #IO.RLB/256.,I.FCN+1(R3) ; READ FUNCTION? BNE 340$ ; IF NE NO  TST U.CW2(R5) ; SILO FUNCTION?T BMI 330$ ; IF MI YES. BITB #DELDAT,I.PRM+6(R3) ; DELETED DATA READ? BEQ 320$ ; IF EQ NOT BISB #DELDAT,U.CW2(R5) ; YES0320$: JMP 170$ ; GO EMPTY SILO +330$: BIC #SILO,U.CW2(R5) ; CLEAR SILO FLAG;% CALL NXTSEC ; UPDATE TO NEXT SECTORI 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 FINISHED3360$: BIC #ERR1,U.CW2(R5) ; CLEAR TIMEOUT ERROR BITQ/ MOV S.PKT(R4),R1 ; RETRIEVE I/O PACKET ADDRESS04 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 NOW.380$: MOV #IE.BLK&377,R0 ; SET BAD BLOCK ERROR BR 440$ ;L2390$: MOV #IE.VER&377,R0 ; SET UNRECOVERABLE ERROR BR 420$ ;Y*400$: MOV I.FCN(R3),R1 ; GET FUNCTION CODE# BIC #7,R1 ; REMOVE QUAILFIER BITSO& 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 YES9410$: MOV #IS.SUC&377,R0 ; SET SUCCESSFUL COMPLETION CODES/420$: MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS* MOV I.PRM+4(R1),R1 ; SET BYTES TRANSFERED7 SUB U.CNT(R5),R1 ; CALCULATE BYTES ACTUALLY TRANSFEREDR3430$: MOVB S.CON(R4),R3 ; RETRIEVE CONTROLLER INDEXT* 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?R BNE 435$ ; IF NE NOD+ BIS #CEW*256.,R2 ; SET INITIAL RETRY COUNTE BR 440$ ;A2435$: BIS #RETRY*256.,R2 ; SET INITIAL RETRY COUNT8440$: BIC #SILO!SCHAR!ERR1!DELDAT,U.CW2(R5) ; CLEAR BITS CALL @IODON ; SET DONE% JMP DYINI ; TRY FOR ANOTHER REQUESTF;0; INTERRUPT PROCESSING POINT FOR DETERMINING THE; DISKETTE UNIT STATUS.R;R5DYSEN: MOV S.PKT(R4),R1 ; RETRIEVE I/O PACKET ADDRESSF/ BIT #RSAE,U.CW2(R5) ; READ STATUS AFTER ERROR?K BEQ 450$ ; IF EQ NOE! BIC #RSAE,U.CW2(R5) ; CLEAR FLAG JMP 390$ ; EXIT WITH ERROR*450$: ASRB RTTBL+1(R3) ; INIT IN PROGRESS? BCC 460$ ; IF CC NOT" 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.SEC455$: 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 NOE2 BIT #DENERR,I.PRM+6(R1) ; IS IT A DENSITY ERROR? BEQ DYRTY ; IF EQ NO,470$: BIC #SCHAR!DEN,U.CW2(R5) ; CLEAR FLAGS. MOV #SINGLE,U.CW3(R5) ; ASSUME SINGLE DENSITY1 BIT #DRVDEN,I.PRM+6(R1) ; IS IT DOUBLE DENSITY?) BEQ 48000R{zibjbkb a a a$ ; IF EQ NO;) ASL U.CW3(R5) ; DOUBLE THE MAXIMUM LBN'SE) BIS #DEN,U.CW2(R5) ; SET THE DENSITY BITI&480$: MOV #IS.SUC&377,R0 ; SET SUCCESS1 MOV U.CW2(R5),R1 ; RETURN DEVICE CHARACTERISTICS BR 430$ ;;Q!; SENSE CHARACTERISTIC PROCESSINGY;R;DYSEC: BIS #SCHAR,U.CW2(R5) ; INDICATE SENSE CHARACTERISTICI+ MOV #MRDS,R0 ; SET MAINTENANCE READ STATUS7 TSTB U.UNIT(R5) ; UNIT 1 ?; BEQ 490$ ; IF EQ NOG! BIS #UNIT,R0 ; YES SELECT UNIT 1Y3490$: MOVB S.CON(R4),R1 ; RETRIEVE CONTROLLER INDEX& MOV R0,CSRSV(R1) ; SAVE FUNCTION CODE! MOV R0,(R2) ; INITIATE FUNCTIONE. MOVB S.ITM(R4),S.CTM(R4) ; SET TIMEOUT COUNT, BIS #S2.ACT,S.ST2(R4) ; SHOW I/O IS ACTIVE RETURN ;C;R; SET MEDIA DENSITY$;)DYSMD: MOV #SETDEN,R0 ; SET FUNCTION CODER BIC #DEN,U.CW2(R5) ; CLEAR FLAG. 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? . BNE 500$ ; IF NE NO, TREAT AS SINGLE DENSITY BIS #SDEN,R0 ; DOUBLE DENSITY# BIS #DEN,U.CW2(R5) ; UPDATE STATUSM% ASL U.CW3(R5) ; DOUBLE MAXIMUM LBN'S 500$: TSTB U.UNIT(R5) ; UNIT 1?T BEQ 510$ ; IF EQ NOS! BIS #UNIT,R0 ; YES SELECT UNIT 1R3510$: MOVB S.CON(R4),R1 ; RETRIEVE CONTROLLER INDEXE& MOV R0,CSRSV(R1) ; SAVE FUNCTION CODE! MOV R0,(R2) ; INITIATE FUNCTIONE'520$: BITB #TR!DONE,(R2) ; TRANSFERRED?I BMI 530$ ; IF MI YES BEQ 520$ ; IF EQ NOY* MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS' MOV RXES(R2),I.PRM+6(R3) ; SAVE STATUSI BR DYRTY ; ERROR530$: MOV #'I,R0 ; ASCII "I"($ 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 ;;R; RETRY LAST FUNCTIONT; &DYRTY: CALL LOGERR ; LOG DEVICE ERROR4DYRTY1: MOVB S.CON(R4),R3 ; RESTORE CONTROLLER INDEX* MOV S.PKT(R4),R1 ; GET I/O PACKET ADDRESS/ BIT #RSAE,U.CW2(R5) ; READ STATUS AFTER ERROR?2 BNE 640$ ; IF NE YES) BITB #IQ.X,I.FCN(R1) ; INHIBIT RETRIES ?  BEQ 540$ ; IF EQ NO8 CMP #IO.SEC,I.FCN(R1) ; SENSE CHARACTERISTICS FUNCTION? BEQ 630$ ; IF EQ YES7 BIS #RSAE,U.CW2(R5) ; SET READ STATUS AFTER ERROR FLAGT JMP DYSEC ; GO DO READ STATUSO(540$: DECB RTTBL(R3) ; ANY RETRIES LEFT? BNE 550$ ; IF NE YES5 CMP #IO.SEC,I.FCN(R1) ; DON'T REPEAT IO.SEC FUNCTION) BEQ 630$ ; IF EQ EXITI7 BIS #RSAE,U.CW2(R5) ; SET READ STATUS AFTER ERROR FLAGS JMP DYSEC ; GO DO READ STATUSE*550$: BIT #ERR1,U.CW2(R5) ; TIMEOUT ERROR? BNE 620$ ; IF NE YES&560$: BIT #RXACLO,I.PRM+6(R1); AC LO ? BEQ 565$ ; NOS BR 630$ ; ERROR - POWER OFF=565$: BIT #SCHAR,U.CW2(R5) ; SENSE CHARACTERISTICS FUNCTION ?A BNE 620$ ; IF NE YES3 CMP IO.SMD,I.FCN(R1) ; SET MEDIA DENSTIY FUNCTION?Y BEQ 620$ ; IF EQ YES( BIT #CRCERR,I.PRM+6(R1) ; CRC ERRORS ? BNE 610$ ; IF NE YES0570$: CMP #IO.SMD,I.FCN(R1) ; SET MEDIA DENSITY? BNE 580$ ; IF NE NOT% JMP DYSMD ; RETRY SET MEDIA DENSITYD5580$: MOV I.PRM+10(R1),R0 ; GET LOGICAL SECTOR NUMBERB9 BIT #WCOVFL!DENERR,I.PRM+6(R1) ; WORD COUNT OVERFLOW OR? ; DENSITY ERROR ?  BEQ 610$ ; IF EQ NOF2 BIT #DRVDEN,I.PRM+6(R1) ; IS IT DOUBLE DENSITY ? BNE 590$ ; IF NE YES2 BIC #DEN,U.CW2(R5) ; CORRECT IT TO SINGLE DENSITY BIC #SDEN,U.BUF(R5) ; HERE TOO  ASL R0 ; MULTIPLY LSN BY 2; MOV #SINGLE,U.CW3(R5) ; CHANGE MAX LBN'S TO SINGLE DENSITY, BR 600$ ;E3590$: BIS #DEN,U.CW2(R5) ; CHANGE TO DOUBLE DENSITY  ASR R0 ; DIVIDE LSN BY 2; MOV #DOUBLE,U.CW3(R5) ; CHANGE MAX LBN'S TO DOUBLE DENSITY#7600$: MOV R0,I.PRM+10(R1) ; STORE LOGICAL SECTOR NUMBER 3610$: BIC #ERR1,U.CW2(R5) ; CLEAR TIMEOUT ERROR BITD JMP 80$ ; RETRY FUNCTION6620$: MOVB #1,RTTBL+1(R3) ; SET INITIALIZE IN PROGRESS0 MOV #INIT!INTEBL,CSRSV(R3) ; SAVE FUNCTION CODE0 MOV #INIT!INTEBL,(R2) ; INITIALIZE RX211 DRIVES/ MOVB S.ITM(R4),S.CTM(R4) ; SET TIMEOUT COUNTER RETURN ; ,630$: BIT #DRVRDY,I.PRM+6(R1) ; DRIVE READY? BEQ 640$ ; IF EQ NO JMP 390$ ; EXIT WITH IE.VERB5640$: MOV #IE.DNR&377,R0 ; SET DEVICE NOT READY ERROR$ JMP 400Z{{t__DATADATADATADATA20$ ; EXIT WITH IE.DNRO .DSABL LSBN;+>; *** - TRKSEC - CONVERT LOGICAL OR PHYSICAL BLOCK NUMBER TO; TRACK-SECTOR PAIR2; ; INPUT:; R3 - I/O PACKET ADDRESSI+; I.PRM+10(R3) - LOGICAL OR PHYSICAL SECTORE;N ; OUTPUT:; I.PRM+14(R3) - SECTOR (1-26.)Z; I.PRM+15(R3) - TRACK (0-76.); R3 - UNCHANGED; C CLEAR - VALID BLOCK 0; C SET - BAD BLOCK NUMBER (PHYSICAL OR LOGICAL);Q;-;TRKSEC: MOV I.PRM+10(R3),R1 ; GET LOGICAL OR PHYSICAL BLOCKN MOV #8.,R0 ; SET LOOP COUNT  MOV #6400,R2 ; SET DIVISORH+10$: CMP R2,R1 ; DOES 26 GO INTO DIVIDEND?  BHI 20$ ; IF HI NO (C=0)' SUB R2,R1 ; SUBTRACT 26 FROM DIVIDEND SEC ; SET CARRY*20$: ROL R1 ; SHIFT DIVIDEND AND QUOTIENT DEC R0 ; DONE? BGT 10$ ; IF GT NO BISB R1,R0 ; GET TRACK NUMBER/ CMP R0,#77. ; IS IT A LEGITMATE TRACK NUMBER? BHI 60$ ; IF HI NO BLO 30$ ; IF LO YES 6 BITB #IO.RPB&377,I.FCN(R3) ; PHYSICAL BLOCK FUNCTION?% BEQ 60$ ; IF EQ NO, BAD BLOCK ERRORL"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 YEST% CMP #12.,R1 ; NO, C=1 IF 13<=R1<=25R' ROL R1 ; DOUBLE FOR INTERLEAVE FACTORT ASL R0 ; ADD TRACK -TRACK SKEW ADD R0,R1 ; SKEW BY 2*TRACKT ADD R0,R1 ; SKEW BY 4*TRACKS ADD R0,R1 ; SKEW BY 6*TRACK ASR R0 ; RESTORE TRACK NUMBER  MOV #26.,R2 ; SET MODULUS,640$: 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 1,%50$: INC R1 ; CONVERT TO RANGE 1-26.E) MOV R1,I.PRM+14(R3) ; SAVE SECTOR NUMBER  BR 70$ ; - BRANCHR#60$: SEC ; SIGNAL BAD BLOCK ERRORC) MOVB R0,I.PRM+15(R3) ; SAVE TRACK NUMBERD BR 80$ ; RETURN*-70$: MOVB R0,I.PRM+15(R3) ; SAVE TRACK NUMBER,9 CMP #77.*256.,I.PRM+14(R3) ; IS IT A VALID TRACK/SECTOR?M80$: RETURN ; ;+7; *** - NXTSEC - UPDATE BLOCK NUMBER , BUFFER ADDRESS.; AND BUFFER POINTER;N; INPUT:; R3 - I/O PACKET ADDRESSO; R5 - UCB ADDRESS%; I.PRM+10(R3) - CURRENT BLOCK NUMBERR6; I.PRM+12(R3) - BYTES TRANSFERED DURING LAST FUNCTION$; U.CNT(R5) - BYTES LEFT TO TRANSFER; U.BUF(R5) - BUFFER ADDRESS;R ; OUTPUT: %; I.PRM+10(R3) - UPDATED BLOCK NUMBERB(; U.BUF(R5) - UPDATED BY 128./256. BYTES3; 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;T;+.NXTSEC: INC I.PRM+10(R3) ; UPDATE BLOCK NUMBER) MOVB S.CON(R4),R0 ; GET CONTROLLER INDEXN% BIT #DEN,U.CW2(R5) ; SINGLE DENSITY?E BEQ 5$ ; IF EQ YESB ADD #256.,U.BUF+2(R5) ; UPDATE BUFFER ADDRESS FOR DOUBLE DENSITY BR 10$ ; AND CONTINUE E5$: ADD #128.,U.BUF+2(R5) ; UPDATE BUFFER ADDRESS FOR SINGLE DENSITYS"10$: BCC 15$ ; IF CC, NO OVERFLOW7 ADD #10000,U.BUF(R5) ; CARRY INTO EXTENDED MEMORY BITSL@15$: SUB I.PRM+12(R3),U.CNT(R5) ; UPDATE BYTES LEFT TO TRANSFER0 SUB I.PRM+12(R3),COUNT(R0); UPDATE COUNT FOR IB TST BFLAG(R0) ; BUFFER DATA ?M BEQ 100$ ; NO;1 CMPB #IO.WLB/256.,I.FCN+1(R3); WRITE OPERATION ?E 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$ ; YES.( CMP #256.,COUNT(R0) ; MORE ROOM IN IB ? BLE 100$ ; YES BR 30$ ; NO - MOVE THE DATA,26$: CMP #128.,COUNT(R0) ; MORE ROOM IN IB ? BLE 100$ ; YES.30$: MOV BUFLEN(R0),TEMP(R0); NUMBER OF BYTES % SUB COUNT(R0),TEMP(R0); TO TRANSFER;32$: CALL BLXIO ; MOVE DATA7 ADD #<256./100>,DYPTR(R0) ; UPDATE POINTER INTO DYCOM / ; (32 WORD BLOCKS)7 SUB #256.,TEMP(R0) ; UPDATE TEMPORY COUNT FOR MULTIPLET ; FORKSE BLE 35$ ;M& TST @FRKHD ; ANYONE WAITING TO FORK?$ BEQ 32$ ; IF EQ NO -> DO SOME MORE* MOV (SP)+,RETPTR(R0); SAVE RETURN ADDRESS, CALL @FORK ; LET SOMEONE ELSE DO SOME WORK) MOVB S.CON(R4),R0 ; GET CONTROLLER INDEX0# MOV S.CSR(R4),R2 ; GET CSR ADDRESS)* MOV S.PKT(R4),R3 ; GET I/O PACKET ADDRESS2 MOV RETPTR(R0),-(SP); PUT RETURN ADDRESS ON STACK BR 00b{zibjbkb a a a32$ ; NOW DO SOME MORE WORK135$: MOV BUFLEN(R0),COUNT(R0); RESET LENGTH OF IBB6 BIC #30000,U.BUF(R5) ; RESET EXTENDED ADDRESSING BITS0 BIS HIPHYA(R0),U.BUF(R5); TO POINT TO BEG OF IB0 MOV LOPHYA(R0),U.BUF+2(R5); RESET LO BITS OF IB& MOV DYPCB,R1 ; GET PCB OF DATA COMMON7 MOV P.REL(R1),DYPTR(R0); INITIALIZE POINTER INTO DYCOMV TST R0 ; ONE CONTROLLER ?E BEQ 100$ ; YES) MOV P.SIZE(R1),-(SP); GET SIZE OF REGION) ASR (SP) ; CUT IN HALF7 ADD (SP)+,DYPTR(R0) ; POINT INTO SECOND HALF OF REGIONB2100$: TST U.CNT(R5) ; IF EQ TO ZERO THEN ALL DONE RETURN ;S;N;+,; ** -- BLXIO -- MOVE BLOCK OF DATA ROUTINE;DG; THE MOVE BLOCK OF DATA ROUTINE WILL MOVE THE SPECIFIED DATA IN MEMORYY;0;-BLXIO: MOV R0,-(SP) ; SAVE REG MOV R1,-(SP) ;  MOV R2,-(SP) ;  MOV R3,-(SP) ;  MOV R4,-(SP) ; E MOV R5,-(SP) ;O! MOV R3,R5 ; SAVE I/O PACKET ADDB) MOVB S.CON(R4),R2 ; GET CONTROLLER INDEXS+ MOV PHYADD(R2),R1 ; GET LO BITS OF ADDRESSD* MOV HIADD(R2),R0 ; GET HI BITS OF ADDRESS( ASHC #10.,R0 ; CALCULATE DISP AND BIAS ASHC #-10.,R1 ;0 CMPB #IO.WLB/256.,I.FCN+1(R5); WRITE FUNCTION ? BEQ 10$ ; YESI& ADD #APR6DS,R1 ; SET TO MAP THRU APR6" MOV R0,R3 ; DESTINATION APR BIAS MOV R1,R4 ; APR6 DISPLACEMENTP, CMP #256.,TEMP(R2) ; MORE THAN 256 BYTES TO BLE 5$ ; BE TRANSFERRED ?, MOV TEMP(R2),R0 ; NOP BR 7$ ;R75$: MOV #256.,R0 ; YES - AT LEAST 256 BYTES TO TRANSFERN57$: ADD R0,PHYADD(R2) ; UPDATE FOR NEXT CALL TO BLXIOR% ADC HIADD(R2) ; NOT FOR CURRENT CALLF% MOV DYPTR(R2),R1 ; SOURCE APR5 BIAS S% MOV #APR5DS,R2 ; SOURCE DISPLACEMENT. BR 20$ ;-10$: ADD #APR5DS,R1 ; SET UP TO MAP THRU APR5A, CMP #256.,TEMP(R2) ; MORE THAN 256 BYTES TO BLE 17$ ; BE TRANSFERRED ? MOV TEMP(R2),R3 ; NOC BR 18$ ;817$: MOV #256.,R3 ; YES - AT LEAST 256 BYTES TO TRANSFER618$: ADD R3,PHYADD(R2) ; UPDATE FOR NEXT CALL TO BLXIO) ADC HIADD(R2) ; NOT FOR THE CURRENT CALLA MOV R3,-(SP) ; SAVE REG( MOV DYPTR(R2),R3 ; DESTINATION APR BIAS MOV R1,R2 ; APR DISPLACEMENT MOV R0,R1 ; SOURCE APR BIASA MOV (SP)+,R0 ; RESTORE REG * MOV #APR6DS,R4 ; DESTINATION DISPLACEMENT 20$: CALL @BLXI ; MOVE THE DATA MOV (SP)+,R5 ; RESTORE REGE MOV (SP)+,R4 ;  MOV (SP)+,R3 ;T MOV (SP)+,R2 ;V MOV (SP)+,R1 ;C MOV (SP)+,R0 ;: RETURN.;+; **-LOGTMO-LOG DEVICE TIMEOUT; **-LOGERR-LOG DEVICE ERROR;U=; THESE ROUTINES WILL ALLOCATE A CORE BLOCK, FILL IT WITH THEE=; REGISTER INFORMATION, CALL THE APPROPRIATE EXECUTIVE ERROR T=; LOGGING ROUTINE, DEALLOCATE THE CORE BLOCK, AND RETURN BACKR; TO THE CALLER.;P ; INPUTS:T; R2=CSR ADDRESS; R4=SCB ADDRESS; R5=UCB ADDRESS;: ; OUTPUTS:; SAME AS INPUTS.M$; ALL OTHER REGISTERS ARE DESTROYED.;- .ENABL LSBR9LOGERR: MOV DVERR,-(SP) ; ADDRESS OF DEVICE ERROR ROUTINE BR 10$ ;=LOGTMO: MOV DTOER,-(SP) ;;; ADDRESS OF DEVICE TIMEOUT ROUTINE510$: MOV #DYNUM*2,R1 ; GET NUMBER OF REGISTERS TO LOGT+ CALL @ALOCB ; ALLOCATE THE REGISTER BLOCKA BCC 20$ ; IF CC OK& INC @ERRSQ ; INDICATE A MISSED ERROR! CMP (SP)+,DTOER ; TIMEOUT ERROR?O BNE 30$ ; IF NE NO* CLR @S.CSR(R4) ;;; CLEAR INTERRUPT ENABLE MTPS #0 ;;; ALLOW INTERRUPTS BR 30$ ;)20$: MOV R0,R1 ; COPY CORE BLOCK ADDRESSE( MOV S.CSR(R4),R2 ; RETRIEVE CSR ADDRESS" MOV (R2),(R1) ; SAVE CSR CONTENTS. MOVB S.CON(R4),R3 ; RETRIEVE CONTROLLER INDEX) BIC #^C<17>,CSRSV(R3) ; ISOLATE BITS 0-4#, BIS CSRSV(R3),(R1)+ ; INCLUDE FUNCTION CODE MOV RXDB(R2),(R1)+ ; SAVE RXDBS .REPT 4 CLR (R1)+ ; ZERO 4 WORDS .ENDR$ MOV R0,R2 ; GET CORE BLOCK ADDRESS CALL @(SP)+ ; LOG THE ERRORF) MOV R2,R0 ; GET BACK CORE BLOCK ADDRESS 4 MOV #DYNUM*2,R1 ; GET NUMBER OF BYTES TO DEALLOCATE) CALL @DEACB ; DEALLOCATE THE CORE BLOCKM,30$: MOV S.CSR(R4),R2 ; RETRIEVE CSR ADDRESS RETURN ;V .DSABL LSBS .ENDON(R4),R3 ; RETRIEVE CONTROLLER INDEX) BIC #^C<17>,CSRSV(R3) ; ISOLATE BITS 0-4#, BIS CSRSV(R3),(R1)+ ; INCLUDE FUNCTION CODE MOV RXDB(R2),(R1)+ ; SAVE RXDBS .REPT 4 CLR (R1)+ ; ZERO 4 WORDS .ENDR$ MOV R0,R2 ; GET CORE BLOCK ADDRESS CALL @(00j{{t__DATADATADATADATA .TITLE LADRV .IDENT /05.02/;(; DIGITAL EQUIPMENT CORP., MAYNARD MASS.;0; Copyright (c) 1995-1999 by Mentec Inc., U.S.A.; 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.;;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON AA; SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU-A; SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANYA; OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADEMA; AVAILABLE TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEMnA; 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; PREVIOUSLY MODIFIED BY:O;U; P.K. WEISSn; $; MODIFIED FOR RSX-11M-PLUS V4.5 BY:; ; D. CARROLL 15-Feb-1993 05.02I;F5; DC106 -- Insure that the stack is clean across the !; call to $CFORK on mP systemsS;U;; LPA11 LABORATORY PERIPHERAL ACCELERATOR CONTROLLER DRIVER ;U; ;R;O; MACRO LIBRARY CALLSR;L* .MCALL HWDDF$,PKTDF$,TCBDF$,UCBDF$,SCBDF$% HWDDF$ ;DEFINE HARDWARE REGISTERSR% PKTDF$ ;DEFINE I/O PACKET OFFSETSW/ SCBDF$ ;DEFINE STATUS CONTROL BLOCK OFFSETSO- TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETSE- UCBDF$ ;DEFINE UNIT CONTROL BLOCK OFFSETS;; QIO DIRECTIVE DESCRIPTIONS;; IO.LOD, ... ,'; BUF - BUFFER OF MICRO - CODE TO LOAD #; 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 RDA*; 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; 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 FO00r{zibjbkb a a aR 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, CONTINUEQ 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-00z{{t__DATADATADATADATACODE?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 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 BA00{zibjbkb a a aSE 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. 15 -- 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 RE00{{t__DATADATADATADATAQUEST 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$ ;NO, 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/ MOV (SP)+,S.PKT(R4) ; SAVE I/O PACKET ADDRESSO, CALL $CFORK ; FORK TO THE RIGHT PROCESSOR1 MOV S.PKT(R4),-(SP) ; PUT THE PACKET BACK AGAIN. CLR S.PKT(R4) ; AND CLEAR THE CURRENT PACKET00{zibjbkb a a a .ENDC, MTPS S.PRI(R4) ;;;GO TO PRIORITY OF DEVICE MOV #40000,@S.CSR(R4) ;;;RESETV MTPS #0 ;;;RESET PRIORITY;B?; GET 1024 WORDS FROM USER BUFFER AND LOAD INTO MICRO PROCESSORR"; CHECK EACH WORD LOADED TO VERIFY; % CLR R0 ;R0 IS ADDRESS TO LOAD INTO * MOV S.CSR(R4),R1 ;POINT R1 TO DEVICE CSR-22$: CALL $GTWRD ;GET WORD FROM USER BUFFERS CLR (R1) ;CLEAR CSR MOV R0,4(R1) ;SET CRAM ADDRESS MOV (SP),6(R1) ;CRAM CONTENTSC 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 ROUTINE 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 HAV00{{t__DATADATADATADATAE 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 ;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/00{zibjbkb a a a 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 PROCESSINGE;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 OUTPUT00{{t__DATADATADATADATA) 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 AST 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 LISTHEAD00{zibjbkb a a a3 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$ ;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 11300{{t__DATADATADATADATA$ ;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),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 ENT00{{ibjbkb a a aRY;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 ;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 .TITLE CEXBF - COMM EXECS .IDENT /01.18/;; 1; Copyright (c) 1995-1999 by Mentec Inc., U.S.A.A;EA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDC9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ;P; J. PROVINO 3-AUG-78M;#; MODIFIED BY:; ; JF005 - J. FORECAST 28-MAR-79E:; ALLOCATE BUFFER SPACE DEPENDING ON CONDITIONAL ASSEMBLY; PARAMETERS.;P; JF006 - J. FORECAST 14-MAY-79E.; CHANGE ALLOCATIONS FOR NEW MAPPED COMM/EXEC;L; JF007 - J. FORECAST 8-AUG-80; CHANGE ALLOCATIONS AGAINN;0; 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 00{{t__DATADATADATADATAused).(; 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;D%; 1.17 DC100 - D. Carroll 15-Feb-1993P>; Call $FORK on mP system so that we don't deallocate primary>; pool if we don't own the executive lock, even though we may; own the Comm/Exec lock ....;W%; 1.18 DC404 - D. Carroll 18-Oct-1995NA; Include PSECT statement to allow ICB pool to be fully expandedg; during sysgen; ;k2$CEX:: ; THIS SYMBOL MUST ALWAYS BE DEFINED FOR( ; MCRS "SET /NOCEX" COMMAND TO BUILD ; CORRECTLY  .IF DF M$$NET e .SBTTL Macro DefinitionsP; ; Macro Library Calls-; # .MCALL CCBDF$,OPTDF$,PDVDF$,SLTDF$n" CCBDF$ ; Define the CCB offsets+ OPTDF$ <=>,<:> ; Define COMM/EXEC optionst" PDVDF$ ; Define the PDV offsets" SLTDF$ ; Define the SLT offsets. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404;e; Local Macro Definitionse;l .IF DF K$$DAS .MACRO DDFDF,FNC,ARG1 MOV R3,-(SP) ; Save R3T! MOV #FNC,R3 ; Get function code" .IF B M; BR DDCM1 ; Common processing for non-CCB control function  .IFF ; B  .IF IDN ,a: BR DDCM2 ; Common processing for modem control functions .IFF ; IDN , .IF IDN , BR DDCM4p .IFF ; IDN ,= BR DDCM3 ; Common processing for control functions with CCBF .ENDC ; IDN ,1 .ENDC ; IDN ,a .ENDC ; B l .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 ; Common 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 G .SBTTL Symbol Definitions;R7; These symbols are global for use by DECnet processes.;F1DLC$OV == 8. ; Data link layer overhead (bytes)R%CRC$OV == 4. ; CRC overhead (bytes)RA$CXFLG == CF.MDM!CF.DDM!CF.DYN!CF.EIS!CF.LOG ; Comm exec optionsC;;K.CSR == 0 ; ???;NF; 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$$PROG%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==. ;S00{{ibjbkb a a aPM 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 Interrupts1 .IF DF K$$DAS ;; Slightly different for RSX-11M+e( ;; 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)N ;; PC (Saved by Interrupt)I/ 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 line 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 the00{{t__DATADATADATADATA 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$$DAS=, 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) 7 ADD (SP)+,R2 ; Form address of entry in dispatch tablen5 BIT #1,(R2) ; Is this a dispatch to an odd address?S' BNE 10$ ; If NE, yes! - bad dispatch.M( 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 address 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% MOV R5,@2(R4) ;;; Link first to lastV& 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?E$ BMI 20$ ;;; If MI, yes - just exit& CLR (R4) ;;; Clear next link pointer .IF DF R$$MPL .IF DF M$$PROe5 MOV -(R5),-2(R4) ;;; Set up required Unibus Run Mask .ENDC ; DF M$$PRO& CALL $QFORK ;;; Queue the fork block .IFF ; DF R$$MPLc. MOV R4,@$FRKHD+2 ;;; Link to end of fork list) MOV R4,$FRKHD+2 ;;; Set new last pointerR .ENDC ; DF R$$MPL20$: .IF DF M$$PRO; CALL @(SP)+ ;;; Co-routine return to unlock process queuey .ENDC ; DF M$$PRO% MOV (SP)+,@#PS ;;; Enable interrupts MOV (SP)+,R5 ; Recover R5 RETURN ; Return to caller x+ .SBTTL $CEPWR - Powerfail Recovery Routine$;+&; **-$CEPWR-POWERFAIL RECOVERY ROUTINE;bB; This routine is dispatched from the executive powerfail recovery<; code. It will dispatch to the AUX process with a powerfail; recovery function code.K;-$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 recover00{{ibjbkb a a ay 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$$PROi0 SAVRG ; Save all registers* MOV $CMPDV,R1 ; Get current LLC PDV index+ ADD $PDVTA,R1 ; Point into PDV index tableIB MOVB C.LIN(R4),R3 ; Get LLC channel number without sign extension 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 CCBe* ; Note - bit15 will always be clear to( ; 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 .ENDC ; DF M$$PRO i6 .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 MANAGEMENTL;S>; This routine is called by a LLC process to queue requests toA; another LLC process. Note that the callers context is saved asn; if an interrupt had occurred.,;RJ; The $DLCRS entry point is supplied for use by the X25 data link mapping.;OJ; 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 DLCU ; for line/circuit counters etc.; ; Inputs:C(; R4= Address of CCB (or first in chain); The CCB must contain a valid:i(; 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 the00{{t__DATADATADATADATA; requesting LLC.;:; Registers modified:e; None;-$DLCRS::$LLCRS:: .IF DF M$$PRO6 CLR C.URM(R4) ; Allow process to run on any processor .ENDC ; DF M$$PRO'$NMCRS::SAVRG ; Save R3 and R4 8 BIS #100000,C.LIN(R4) ; Flag destination process is LLC: BISB #200,C.BID(R4) ; Mark CCB as coming from another LLC6 CALL $PDQU1 ; Queue request CCB and schedule process# RESRG ; Restore registersf% RETURN ; And return to calling LLCn n? .SBTTL $LLCLC - Process to Process Direct Call Interface (CCB)eB .SBTTL $LLCAL - Process to Process Direct Call Interface (No CCB);+?; **-$LLCLC-PROCESS TO PROCESS DIRECT CALL INTERFACE (WITH CCB) 4; **-$LLCAL-PROCESS TO PROCESS DIRECT CALL INTERFACE;#G; This routine is called by a process (typically an LLC) to dispatch to;B; 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-COMPUTE 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$$1LNi+ MOVB C.LIN(R4),R2 ; Get system line numberL .ENDC ; NDF N$$1LNv$STDL1:: .IF DF N$$1LN8 MOV @$SLTMA,R2 ; Get address of system line table entry .IFF ; DF N$$1LN 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)L4 MOV R4,R3 ; Compute a pointer to the function code ADD #C.FNC,R3 ; ... RETURN ; Return to caller s5 .SBTTL $ASCMP - Asynchronous Completion to LLC LevelF;+E; **- $ASCMP -ASYNCHRONOUS COMPLETION TO LOGICAL LINK CONTROL MODULESF; ?; This routine is called by Data Link Control processes to passtA; asyncronous status/error information to higher level processes.i;t ; Inputs:,; R2 = Station number and system line number ; R3 = Asynchronous status/error;2 ; Outputs:=; A CCB is allocated on behalf of the caller and based on thet:; 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 add00{{ibjbkb a a aress/system line number BR 10$ ; Finish in common code t/ .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 Level ;+?; **-$XMCMP-TRANSMIT COMPLETE TO LOGICAL LINK CONTROL PROCESSES; **-$CTCMP-CONTROL COMPLETE; **-$RCCMP-RECEIVE COMPLETE; **-$KLCMP-KILL COMPLETE#;C ; Inputs:."; R3 = Operation completion status/; R4 = Address of CCB (or first ccb in a chain)s+; the CCB contains a valid line numberm; ; 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;-D$XMCMP::MOVB #FC.XCP,C.FNC(R4) ; Set transmit complete function code BR 10$ ; Join common code-C$CTCMP::MOVB #FC.CCP,C.FNC(R4) ; Set control complete function codee BR 10$ ; Join common code4@$KLCMP::MOVB #FC.KCP,C.FNC(R4) ; Set kill complete function code BR 10$ ; Join common code C$RCCMP::MOVB #FC.RCP,C.FNC(R4) ; Set receive complete function code #10$: MOV R2,-(SP) ; Save callers R2 + MOVB C.LIN(R4),R2 ; Get system line number 520$: MOV R3,C.STS(R4) ; Store operation status in CCB6 BICB #200,C.BID(R4) ; Mark message from a DLC process ASL R2 ; Multiply SLN by 2/ ADD $LLCTA,R2 ; Point to reverse mapping tableS< MOV (R2),R3 ; Get SLN & station to PDV & channel map entry5 BPL 25$ ; If PL, got PDV & channel (point to point)e( ; 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 LSB. ( .IF NDF X$$NDMi$ .SBTTL $DD??? - DLC to DDM Requests;+; General Requests with CCBe;t; Format of call: ; CALL $DD???a;n ; Inputs:$; R4 = Address of first CCB in chain&; (All CCBs must contain a valid SLN);e; Outputs to DDM: $; R4 = Address of first CCB in chain ; R5 = Address of DDM line table,; R2 & R3 - Available for use without saving;P; Registers across call:*; R0,R1 - Must be preserved by DDM if used#; R2,R3,R5 - Preserved by Comm Exece; 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.CTL00{{t__DATADATADATADATA+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 MOV R2,-(SP) ; Save R2L MOV 2(SP),R2 ; Get line number=. BR 22$ ; Join common code to dispatch to DDM : .SBTTL DDCM2 - Common Process for Modem Control Functions;+7; **-DDCM2 - COMMON PROCESS FOR MODEM CONTROL FUNCTIONSr;a5; If the specified line has modem control enabled the7; function request is derailed to the modem controller..4; 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 .IF DF K$$DAS5 MOV R3,$DDFNC ; Store the function code in data areac+ MOV #$DDFNC,R3 ; Point R3 at function codeL .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 table  .IFF ; DF N$$1LNo+ MOVB C.LIN(R4),R2 ; Get system line numbery ASL R2 ; Form word index3 ADD $SLTMA,R2 ; Point into system line index table5 .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 registerC- MOV R3,-(SP) ; Save address of function code$4 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 co00|{ibjbkb a a ade in data areaH+ MOV #$DDFNC,R3 ; Point R3 at function codei .IFTF ; DF K$$DAS9 MOV (R3),C.FNC(R4) ; Put function and subfunction in CCB  BR 10$ ; Join common code DDCM4: .IFT ; DF K$$DASl2 MOV R3,$DDFNC ; Store function code in data area+ MOV #$DDFNC,R3 ; Point R3 at function coded .ENDC ; DF K$$DAS=/ MOVB (R3),C.FNC(R4) ; Put function code in CCB10$: MOV R2,-(SP) ; Save R2R 20$: MOVB C.LIN(R4),R2 ; Get SLN22$: MOV R5,-(SP) ; Save R53 CALL DDMDSP ; Dispatch to the device driver (DDM)H25$: MOV (SP)+,R5 ; Restore R5 MOV (SP)+,R2 ; Restore R2 MOV (SP)+,R3 ; Restore R3! RETURN ; Return to calling DLC .DSABL LSB i& .SBTTL DDMDSP - Dispatch to DDM Level;+!; **-DDMDSP-DISPATCH TO DDM LEVELd;nF; 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 tabled" 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 $CCBGT ; 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$: MOV00 |{t__DATADATADATADATA 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$$1LN1 MOV L.DDS(R2),R5 ; Get device line table address = MOVB L.DDM(R2),R2 ; Get device driver PDV index (word index)$ RETURN ; Return i( .SBTTL $CCBGT - Allocate a Standard CCB;+$; **-$CCBGT- Allocate a Standard CCB;nG; 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 System;*; Dynamic Memory if the CCB pool is empty.;y ; Inputs:n; None.n;M ; 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 ;;; Lock 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' SAVRG00|{ibjbkb a a a ; 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$$PRO7 CALL @(SP)+ ;;; Co-Routine return to unlock resourcesf .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 processor .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.00|{t__DATADATADATADATASDB,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; ; Outputs:; None.B;-.$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:l .IF DF M$$PRO3 CALL $MPLCK ;;; Lock access to CommExec resources  .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 words# CALL BUFRT ;;; Release the bufferi10$: 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; label 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 00"|{ibjbkb a a aCCBGT - 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 issuedCC; a CLC instruction followed by an INHIB$. No other values must beuE; 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 - CCB 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 .IF DF,M$$PRO;+=; Use the CCB as a fork block, and then deallocate the blockFC; to primary pool ... This will avoid any potential race conditions02; which could possibly exist in an mP environment.;-( MOV R4,6(R4) ;;; save the fork block R42 CLR -(R4) ;;; clear out the URM field in the CCB$ ADD #10,R4 ;;; and point to it ...1 DEC $CCBAL ;;; drop the count prior to fork ... , CALL $FORK1 ;;; and fork into system state .IFF ;DF,M$$PRO+ SAVRG ;; Save some registerst .IFTF ;DF,M$$PRO$" MOV R4,R0 ;; Copy address of CCB1 MOV $CCBSZ,R1 ;; Get size of block to deallocatep .IFT ;DF,M$$PRO/ ADD #2,R1 ;; 2 more bytes on Multi-Processors * TST -(R0) ;; Backup over Unibus Run Mask .IFTF ;DF,M$$PROe# CALL $DEACB ;; Deallocate the CCBa .IFF ;DF,M$$PRO- RESRG ;; Restore the registers.0 DEC $CCBAL ;; Decrement count of dynamic CCB's .ENDC00*|{t__DATADATADATADATA ;DF,M$$PRO  RETURNo .ENDC ; DF N$$OPT!R$$MPLD10$: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 poolc RETURN. . .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:$;A!; .WORD <# of buffers available>B$; .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 issuedxC; a CLC instruction followed by an INHIB$. No other values must beE; 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 ; 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 => Use002|{ibjbkb a a a 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 list.;P ; Inputs:r#; R3 = Address of two word listheadn$; R4 = Address of first CCB in chain;O ; Outputs:*; The CCB is queued to the end of the list;d; Registers modified:; None;-'$CMQIN::SAVRG ; Save registers;"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 bit - MOV (SP),@2(R3) ; Link chain to end of queue< MOV R5,2(R3) ; Update listhead pointer to last CCB in queue# RESRG ; Restore registersu 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;-5$CMQRM::SEC ; Set C-bit just in case queue is empty 1 MOV (R3),R4 ; Get address of first CCB in queue $ BEQ 40$ ; Return if queue is empty! SAVRG ; Save a registerC110$: MOV R4,00:|{t__DATADATADATADATAR5 ; Copy first CCB in chain addressc; BIT #CS.LST,C.STS(R5) ; Is this the last CCB in the chain?.% BNE 20$ ; Yes - update the listhead 5 MOV (R5),R4 ; No - get next CCB - is this the last? ' 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 to 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 call00B|{ibjbkb a a aed 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 subroutineo .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 ASH00J|{t__DATADATADATADATA #-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 Comm 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;+.; **-$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$ S00R|{ibjbkb a a a$ $IDENT PUCOM,05,09, .PSECT .LIST MEB;1; Copyright (c) 1995-1999 by Mentec Inc., U.S.A.; All rights reserved;M; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ONLYM; IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THEM; ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER COPIES THEREOF MAY NOTL; BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO7; AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED. ;OK; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND9L; SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.;SO; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS SOFTWAREE0; ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.; ;OE; JASON GALLANT, JOE MELVIN, BOB SCHMEICHEL, SUSAN THOMAS, PAUL WEISS; ; PREVIOUSLY MODIFIED BY:A;A%; G. MARIGOWDA, J. MELVIN, A. HUDED ; T. SCHOELLER;P$; MODIFIED FOR RSX-11M-PLUS V4.5 BY:;; D. Carroll 15-Feb-1993 05.086; DC113 - Include support for multiple controllers on2; multiple URM's in a multiprocessor environment;N; D. Carroll 05-Jan-1995 05.09:; DC310 - Insure that we don't get a controller interrupt1; when going from step 1 to 2 during controllerI*; initialization at special online time.;B;HM; THIS MODULE CONTAINS ROUTINES AND DATA STRUCTURES REQUIRED TO SUPPORT UQSSPRK; PORT PROTOCAL FOR T/MSCP DEVICES. THESE ROUTINES AND DATA STRUCTURES AREUL; USED WITH CLASS DRIVERS IN THE SYSTEM TO PROVIDE SUPPORT FOR SUCH DEVICES.M;============================================================================NC; PLEASE NOTE THE FOLLOWING RESTRICTIONS WHEN MODIFYING THIS MODULE ;oN; - THE JUMP TABLE DEFINED AT LABEL UQBEGN -MUST- APPEAR AT RELATIVE OFFSET 0.;iJ; - PUCOM IS CURRENTLY SET UP TO ONLY HANDLE VIRTUAL CIRCUIT ID OF 0 OR 1.M;============================================================================ * .MCALL HWDDF$,UCBDF$,SCBDF$,UDADF$,KRBDF$ HWDDF$ ; HARDWARE REGISTERSS' UCBDF$ ; UNIT CONTROL BLOCK OFFSETS+ UDADF$ ; T/MSCP SYMBOLS AND DEFINITIONS= SCBDF$ ,,1 ; SCB OFFSETS= KRBDF$ ; DEFINE KRB OFFSETSE8 JMPTBL CLASS ; DEFINE CLASS DRIVER JUMP TABLE OFFSETS;E; LOCAL MACROS;Q( .MACRO GENLAB PRE,VAL ; GENERATE LABEL PRE'VAL::O .ENDM ;GENLAB< .MACRO GENADD PRE,VAL ; GENERATE LABEL, THEN ADDRESS OF IT .WORD PRE'VAL .ENDM ;GENADD? .MACRO GETINF TYP,CON ; GENERATE SYMBOL, SAVE NUMBER OF RINGSRRNUM=TYP'$R'CON;CNUM=TYP'$C'CONR .ENDM ;GETINF% .MACRO GENTAB BASE,CON,LEN,NUM,PTYPEM ADDR=BASE'CON .REPT NUM, .WORD ADDR + ENVLEN ; ADDRESS OF PTYPE PKTADDR=ADDR + LEN + ENVLEN .ENDR .ENDM ;GENTAB .MACRO RECORD DDD,CON .WORD DDD'QST'CON .ENDM ;RECORD> .MACRO INDEX PRE,VAL ; GENERATE SUBTITLE ASSEMBLER DIRECTIVE3 .SBTTL . PRE: DATA STRUCTURES FOR CONTROLLER VAL .ENDM ;INDEX;N; EQUATED SYMBOLSA; IP = 0 ; IP OFFSET IN CSRSA = 2 ; SA OFFSET IN CSR-ERROR = 100000 ; CONTROLLER ERROR INDICATORFSTEP4 = 40000 ; STEP 4 BIT,STEP3 = 20000 ; STEP 3 BITSTEP2 = 10000 ; STEP 2 BITNSTEP1 = 4000 ; STEP 1 BIT-NOVEC = 2000 ; CANNOT USE HARDWIRED VECTOR#QB = 1000 ; 22 BIT BUS SUPPORTEDD INTE = 200 ; INTERRUPT ENABLE+LF = 2 ; 'SEND LAST FAILURE PACKET' FLAGMGO = 1 ; GO BIT .PAGE4 .SBTTL JMPTAB - JUMP TABLE OF VARIOUS PORT ROUTINESN;=============================================================================N; THE FOLLOWING JUMP TABLE --- MUST --- BE DEFINED FIRST! CLASS DRIVERS EXPECTG; TO SEE THIS TABLE AT 140000 (TO BE MAPPED INTO APR 6 OF CLASS DRIVER)N;TN; THIS TABLE USES SYMBOLS FROM IN DSAPRE.MAC. BE CAREFUL WHEN ADDING ROUTINES.N;=============================================================================FUQBEGN::.WORD MAJOR*256.+MINOR ; COMPONENT ID (SET UP IN $IDENT MACRO) .WORD PORSUP ; PORT SETUP. .WORD PORINT ; CONTROLLER INTERRUPT HANDLER3 .WORD PORSEN ; SEND COMMAND PACKET TO CONTROLLE00Z|{t__DATADATADATADATARO, .WORD PORUMR ; ALLOCATE / DEALLOCATE UMRS( .WORD PKTAC ; ALLOCATE COMMAND PACKET+ .WORD PKTDR ; DEALLOCATE RESPONSE PACKETS% .WORD PKTCHK ; CHECK FOR RESOURCESL% .WORD STOMP ; RESET THE CONTROLLERD6CONCNT: .WORD 0 ; # OF CONTROLLERS CONNECTED TO PORT6 .WORD PKTCH1 ; CHECK FOR RESOURCES - IMMEDIATE CMDS& .WORD PORSYN ; PORT SYNCHRONIZATION2 .WORD 0 ; EXEC VECTORING FROM APR6 CODE ROUTINE ; FILLED IN BY CLASS DRIVER .WORD -1 ; TABLE TERMINATOR*TABTAB:: ; TABLE OF QST TABLE ADDRESSES .IRP CON,C0 .WORD CON'QTBL ; ADDRESS OF TABLE OF ADDRESSES .ENDM ;CONR .WORD -1 ; TABLE TERMINATOR' LOGDAT ; DATA CELLS FOR DEBUG TRACE.3UMRMAP: .BLKW 1 ; ADDRESS OF MAPPING BLOCK OF UMR  .IF DF,M$$PRO% .BLKW M$$PRO-1 ; Static mapping/CPU =CPUCNT: .BLKB M$$PRO ; Count of controllers connected / CPUH .EVEN&UMRPT: .BLKW 1 ; pointer into UMRMAP .ENDC ;DF,M$$PRO;7UQRELC: .BLKW 2 ; RELOCATION CONSTANT USED TO CONVERT/ .IF DF,M$$PRO ; VIRTUAL TO PHYSICAL ADDRESSESR% .BLKW <*2> ; for each CPUE .ENDC ;DF,M$$PROE;)EXEVEC: .WORD 0 ; EXECUTIVE VECTOR FLAGRALOCB: .WORD $ALOCB ASUMR: .WORD $ASUMR.DEACB: .WORD $DEACB DEUMR: .WORD $DEUMRB*DEVHD: .WORD $DEVHD ; USED BY TRACE CODEHFMSK: .WORD $HFMSKPKISR6: .WORD KISAR6$MPUB1: .WORD $MPUB1t .IF DF,M$$PROPROC2: .WORD $PROC2PPROCN: .WORD $PROCNr .ENDC ;DF,M$$PRON7EXEVCL=<<<.-EXEVEC>/2>-1> ; TABLE LENGTH FOR VECTORING  .PAGE9 .SBTTL TABLES - DATA STRUCTURES FOR DISK/TAPE CLASS MSCP.P;===============================================================================.; SET UP DATA STRUCTURES FOR ALL CLASS DRIVERSP;===============================================================================9.IRP DEV, ; ASSUME SAME TABLE STRUCTURE FOR EACHO&CONT=0 ; INITIAL CONTROLLER NUMBER .IF IDN D .IIF NDF R$$UDA R$$UDA=01 LOOP = R$$UDA ; USE NUMBER OF MSCP CONTROLLERST .ENDC .IF IDN . .IIF NDF R$$MYA R$$MYA = 02 LOOP = R$$MYA ; USE NUMBER OF TMSCP CONTROLLERS .ENDC( .REPT LOOP ; FOR EACH MSCP CONTROLLER% INDEX DEV,\CONT ; GENERATE SUBTITLER6 GETINF DEV,\CONT ; # OF CMD/RSP RINGS FOR CONTROLLER .PAGE#; -------------------------------!; SET UP THE CST FOR CONTROLLERB#; -------------------------------I GENLAB DEV'CST,\CONT ; LABEL- .WORD 0 ; C.STAT - CONNECTION STATE STATUSL3 .WORD 0 ; C.EXTN - RESERVED. DO NOT MOVE/DELETEN. .WORD 0,0 ; C.CMST - OLDEST OUTSTANDING CMD3 .WORD 0,.-2 ; C.OLHD - OUTSTANDING I/O LIST HEADN, .WORD 0 ; C.CMDS - CREDIT COUNT FOR CONTR( .BYTE 0 ; C.VCID - VIRTUAL CIRCUIT ID/ .BYTE 0 ; C.FLAG - CLASS DRIVER CONTROL FLAGI, .WORD 0 ; C.REDO - COMMAND TO BE REISSUED. .WORD 0 ; C.REQU - QUEUE OF CMDS TO RESTART% .WORD .-2 ; AFTER RESYNCH- .IF DF E$$LOG0 .WORD 0 ; C.MLNG - LENGTH OF CONTROLLER ERROR( .BYTE 0 ; C.CRED - CREDIT/DEBIT COUNT( .BYTE 0 ; C.VCIX - VIRTUAL CIRCUIT ID' .WORD 0 ; C.IP - SAVED IP REGISTERD' .WORD 0 ; C.SA - SAVED SA REGISTERH .ENDC ;E$$LOG .IF DF M$$EXT5 .WORD MAXWBT ; C.UMCT - # OF UMR WAIT BLOCKS AVAIL 2 .REPT MAXWBT ; C.UMRW - TABLE OF UMR WAIT BLOCK .WORD 0 ; ADDRESSES .ENDR .ENDC ;M$$EXT%; ---------------------------------A%; SET UP THE QST FOR THE CONTROLLERC%; ---------------------------------N GENLAB DEV'QST,\CONT ; LABEL7 GENADD DEV'CST,\CONT ; Q.CST - PNTR TO ASSOCIATE CSTV3 .WORD 0 ; Q.STAT - STATUS BITS (PORT-CONTROLLER) 1 .WORD 0 ; Q.SAD - INTERRUPT HANDLER (DYNAMIC)E. .BYTE 0 ; RESERVED FOR DIGITAL USE, .BYTE 0 ; Q.INF - CONTROLLER INFORMATION1 .BYTE RNUM ; Q.RSPN - NUMBER OF RESPONSE RINGS0 .BYTE CNUM ; Q.CMDN - NUMBER OF COMMAND RINGS, .BYTE 0 ; Q.CTM - CURRENT TIME OUT COUNT) .BYTE 0 ; Q.RTY - CURRENT RETRY COUNT-) ; Q.RING - START OF RING AREA. MUSTV* ; BE SAME ADDRESS AS Q.FRSP!= GENADD DEV'FRR,\CONT ; Q.FRSP - PNTR TO FIRST RESPONSE RINGB< GENADD DEV'LRR,\CONT ; Q.LRSP - PN00b|{ibjbkb a a aTR TO LAST RESPONSE RING4 GENADD DEV'FCR,\CONT ; Q.FCMD - FIRST COMMAND RING4 GENADD DEV'LCR,\CONT ; Q.LCMD - LAST COMMAND RING> GENADD DEV'RPT,\CONT ; Q.RPAT - PNTR TO RSP PACKET ADDRESSES> GENADD DEV'CPT,\CONT ; Q.CPAT - PNTR TO CMD PACKET ADDRESSES0 .WORD 0 ; Q.CRSP - CURRENT RESPONSE RING WHEN( ; CONTROLLER ONLINE (MSCP)- ; Q.STEP - SYNC STEP BIT WHEN CONTROLLER , ; IS SYNCRONIZING. THIS FIELD, ; DELIBERATELY OVERLAPS Q.CRSP/ .WORD 0 ; Q.CCMD - CURRENT COMMAND RING WHENE+ ; CONTROLLER IS ONLINE (MSCP)I* ; Q.INDX - SYNC STEP INDEX WHEN CNTRL+ ; SYNCHRONIZING. DELIBERATELY ; OVERLAPS Q.CCMD.8 .WORD 0,0,0,0 ; Q.WRIT - WORDS TO WRITE TO SA IN SYNC. .WORD 0 ; Q.TEMP - CONTR SPECIFIC WORK AREA) .BYTE 0 ; Q.IOSQ - CONTROLLER SEQUENCEC. .BYTE 0 ; RESERVED FOR DIGITAL USE+ .WORD 0,0,0,0 ; Q.CNTI - CNTRL T/MSCP IDE ; Q.ID <-- Q.CNTI+6( .BYTE 0 ; Q.CSVR - CNTRL SOFT VERSION( .BYTE 0 ; Q.CHVR - CNTRL HARD VERSION1; ---------------------------------------------C1; ALLOCATE SPACE FOR CMD/RSP TABLE OF ADDRESSESN1; ---------------------------------------------0 GENLAB DEV'RPT,\CONT ; TABLE OF RSP PKT ADDR? GENTAB DEV'DRP,\CONT,RPLEN,RNUM,RSP ; GEN TABLE OF ADDRESSES 0 GENLAB DEV'CPT,\CONT ; TABLE OF CMD PKT ADDR> GENTAB DEV'DCP,\CONT,CPLEN,CNUM,CMD ; GEN TABLE OF ADDRESSES5; -------------------------------------------------;5; ALLOCATE THE SPACE FOR THE RESPONSE/COMMAND RINGSR5; --------------------------------------------------. .WORD 0 ; CONTROLLER COMMAND INTERRUPT ADDR/ .WORD 0 ; CONTROLLER RESPONSE INTERRUPT ADDR-8 GENLAB DEV'FRR,\CONT ; FIRST RESPONSE RING BEGINS HERE3 .REPT ; 2 WORDS EACH; N-1 RESPONSE RINGSN .WORD 0,0 .ENDR7 GENLAB DEV'LRR,\CONT ; LAST RESPONSE RING BEGINS HERET! .WORD 0,0 ; LAST RESPONSE RINGE7 GENLAB DEV'FCR,\CONT ; FIRST COMMAND RING BEGINS HERE-2 .REPT ; 2 WORDS EACH; N-1 COMMAND RINGS .WORD 0,0 .ENDR6 GENLAB DEV'LCR,\CONT ; LAST COMMAND RING BEGINS HERE .WORD 0,0 ; LAST COMMAND RING%; --------------------------------- %; ALLOCATE COMMAND/RESPONSE PACKETSF%; ---------------------------------E GENLAB DEV'DRP,\CONT ; LABEL .REPT RNUMO7 .WORD RPLEN ; INSURE MAX PACKET SIZE ON INITIAL CALLL .WORD 0 ; SECOND ENVELOP WORD) .BLKB RPLEN ; ALLOCATE RESPONSE PACKETB" .ENDR ; FOR EACH RESPONSE RING GENLAB DEV'DCP,\CONT ; LABEL .REPT CNUMN7 .WORD CPLEN ; INSURE MAX PACKET SIZE ON INITIAL CALLO .WORD 0 ; SECOND ENVELOP WORD( .BLKB CPLEN ; ALLOCATE COMMAND PACKET! .ENDR ; FOR EACH COMMAND RING "CONT=CONT + 1 ; NEXT CONTROLLER .ENDR ;LOOP;-?; GENERATE TABLE WITH THE ADDRESSES OF THE QSTS FOR THIS CLASSU;, .WORD LOOP ; RECORD NUMBER OF CONTROLLERS DEV'QTBL:: CONT=0 .REPT LOOPE RECORD DEV,\CONTL CONT=CONT + 1 .ENDR ;LOOP .ENDM ;IRP CODBEG = . .PAGE( .SBTTL PKTAC - ALLOCATE COMMAND PACKET;+"; **-PKTAC-ALLOCATE COMMAND PACKET;KL; THIS ROUTINE CALCULATES THE ADDRESS OF THE AVAILABLE COMMAND PACKET, GIVENN; THE COMMAND DESCRIPTOR ADDRESS. THE PKTCHK ROUTINE HAS ALREADY BEEN CALLED.; ; INPUTS:;NB; R0 = NUMBER OF WORDS TO ALLOCATE FOR THE TEXT PORTION OF PACKET; R2 = QST ADDRESSD; R3 = IOP ADDRESSE; R4 = SCB ADDRESS'; R5 = UCB ADDRESSE;L ; OUTPUTS:;E; R0 = DESTROYEDT?; R1 = VIRTUAL ADDRESS OF COMMAND PACKET TO USE (TEXT PORTION)A; R2-R5 = PRESERVED;-?PKTAC:: MOV Q.CCMD(R2),R1 ; ADDR OF CMD RING DESCR TO ALLOCATEL9 SUB Q.FCMD(R2),R1 ; THE BEGINNING OF THE CMD RING DESCR ASR R1 ; DIVIDE BY TWOD- ADD Q.CPAT(R2),R1 ; BASE ADDR TO THE OFFSETE& MOV (R1),R1 ; ACTUAL PACKET ADDRESS& MOV R0,MSGLNG(R1) ; STORE IN ENVELOP% ASL MSGLNG(R1) ; MAKE IT BYTE VALUE & PUSH ; SAVE THE PACKET ADDRESS*10$: CLR (R1)+ ; ZERO OUT WORD OF PACKET* SOB R0,10$ ; CLEAR OUT THE WHOLE PACKET POP ; GET PACKET ADDRESS! RETURN ; AND RETURN TO CALLER: .PAGE00j|{t__DATADATADATADATAA .SBTTL PKTCHK - CHECK FOR REQUIRED RESOURCES: NON-IMMEDIATE CMDS,= .SBTTL PKTCH1 - CHECK FOR REQUIRED RESOURCES: IMMEDIATE CMDSB;+G; **-PKTCHK-CHECK FOR RESOURCES BEFORE ISSUING I/O - NON-IMMEDIATE CMDSAC; **-PKTCH1-CHECK FOR RESOURCES BEFORE ISSUING I/O - IMMEDIATE CMDS(; J; PKTCHK CHECKS FOR SUFFICIENT RESOURCES TO ISSUE A NON-IMMEDIATE COMMAND.K; SUCCESS IS RETURN IF THERE ARE SUFFICIENT CREDITS (AT LEAST TWO) TO ISSUEPB; THE COMMAND .AND. THERE IS AT LEAST ONE HOST OWNED COMMAND RING.;AG; PKTCH1 CHECKS FOR SUFFICIENT RESOURCES TO ISSUE AN IMMEDIATE COMMAND..K; SUCCESS IS RETURN IF THERE ARE SUFFICIENT CREDITS (AT LEAST ONE) TO ISSUE-B; THE COMMAND .AND. THERE IS AT LEAST ONE HOST OWNED COMMAND RING.;H ; INPUTS: ;O; R2 = QST ADDRESSI;- ; OUTPUTS:;(; R0 = PRESERVEDK; R1 = DESTROYEDS; R2-R5 = PRESERVEDE; C - 0 = RESOURCES AVAILABLE. Q.CCMD(R2) IS ADDRESS OF COMMAND RING 6; C - 1 = NO RESOURCES AVAILABLE. Q.CCMD NOT MODIFIED;E .ENABL LSBOPKTCHK:: ASSUME Q.CST,0K MOV (R2),R1 ; GET CST) CMP C.CMDS(R1),#1 ; AT LEAST 2 CREDITS? BLE 100$ ; NO. RETURN FAILURE2 MOV Q.CCMD(R2),R1 ; CHECK CURRENT CMD DESCRIPTOR TST MSW(R1) ; HOST OWNED? BLT 90$ ; NO. RETURN FAILURE CLC ; INDICATE SUCCESS RETURNPKTCH1:: ASSUME Q.CST,0R MOV (R2),R1 ; GET CST' TST C.CMDS(R1) ; AT LEAST ONE CREDIT?U! BLE 100$ ; NO. RETURN FAILURES2 MOV Q.CCMD(R2),R1 ; CHECK CURRENT CMD DESCRIPTOR TST MSW(R1) ; HOST OWNED? BLT 90$ ; NO. RETURN FAILURES CLC ; INDICATE SUCCESS RETURNC90$:100$: SEC ; INDICATE FAILUREB RETURN .DSABL LSBF .PAGE+ .SBTTL PKTDR - DEALLOCATE RESPONSE PACKETI;+%; **-PKTDR-DEALLOCATE RESPONSE PACKET$;;P; THIS ROUTINE DEALLOCATES THE DESIGNATED RESPONSE PACKET. THIS INVOLVES FINDINGP; THE CORRESPONDING RESPONSE RING DESCRIPTOR AND MARKING IT AS CONTROLLER OWNED.; ; INPUTS:T; ; R1 = RESPONSE PACKET ADDRESSH; R2 = QST ADDRESSI; R4 = SCB ADDRESS;; R5 = UCB ADDRESS$;; ; OUTPUTS:;L; R1-R5 = PRESERVED;-CPKTDR:: MOV #RPLEN,MSGLNG(R1) ; RESTORE MAXIMUM REPONSE PACKET SIZE.5 MOV Q.CRSP(R2),R0 ; GET CURRENT RSP RING DESCR ADDRE0 BIS #OWN,MSW(R0) ; MARK IT AS CONTROLLER OWNED RETURN  .PAGE- .SBTTL PORINT - CONTROLLER INTERRUPT HANDLER.;+); **-PORINT- CONTROLLER INTERRUPT HANDLERP;EC; INTERRUPTS ARE RECEIVED FROM CONTROLLER UNDER FOUR CIRCUMSTANCES:;D; 1. DURING THE INITIALIZATION PROCESS (OPEN THE "VIRTUAL CIRCUIT")F; 2. WHEN "COMMAND RING BUFFER" TRANSITIONS FROM "FULL" TO "NOT FULL"I; 3. WHEN "RESPONSE RING BUFFER" TRANSITIONS FROM "EMPTY" TO "NOT EMPTY"MM; 4. WHEN FATAL CONTROLLER ERROR IS DETECTED AND INTERRUPT CAN BE GENERATED. ;A; INPUT:;O; R5 = UCB ADDRESSE;-#PORINT::MOV S.QST(R4),R2 ; GET QSTA ASSUME Q.CST,0P MOV (R2),R3 ; GET CST MOV S.CSR(R4),R1 ; GET CSR ASSUME C.STAT,0; BIT #C1.FAT,(R3) ; WAITING FOR TIMEOUT TO START RECOVERY?I, ; CAN SOMETIMES GET INTERRUPT IN MIDDLE* ; OF POWERFAIL BEFORE CONTROLLER GETS ; RE-INITIALIZED. BNE 55$ ; YES. GO BACK) TST Q.STAT(R2) ; SYNCHRONIZATION STATE?N1 BMI 70$ ; YES. HANDLE SYNCH RELATED INTERRUPTST;E0; THIS SECTION DEALS WITH RESPONSES AND COMMANDS;610$: TST SA(R1) ; DID CONTROLLER SUFFER FATAL ERROR?* BMI 60$ ; HANDLE CONTROLLER FATAL ERROR215$: MOV Q.RING(R2),R1 ; GET ADDRESS OF RING AREA4 CLR CMDINT(R1) ; CLEAR COMMAND INTERRUPT INDICATOR$ CLR RSPINT(R1) ; AND RESPONSE TOO.;R; PROCESS ALL RESPONSES ;E020$: MOV Q.CRSP(R2),R1 ; STARTING RESPONSE RING 23$: TST MSW(R1) ; HOST OWNED? BMI 50$ ; NO. SCAN IS DONE2 SUB Q.FRSP(R2),R1 ; GET OFFSET TO RING FROM BASE ASR R1 ; WORD INDEX2 ADD Q.RPAT(R2),R1 ; GET TABLE ADDRESS OF ADDRESS( MOV (R1),R1 ; GET REAL PACKET ADDRESS# LOGRSP ; TRACE RESPONSE PACKETST' PUSH ; GET MESSAGE FIELDR9 BIC #^C,(SP) ; MAKE SURE IT IS ONLY MESSAGE TYPET0 CMP #,(SP) ; MAINTENANCE PACKET?) BEQ 25$ ; YES. DO NOT ADD THE CREDITSQ& MOV CREDIT(R1),R0 ; GE00r|{ibjbkb a a aT CREDIT FIELD8 BIC #^C,R0 ; MAKE SURE IT IS ONLY CREDIT FIELD/ ADD R0,C.CMDS(R3) ; ADD TO CLASS CREDIT COUNTF.25$: POP ; GET MASKED MESSAGE TYPE BACK* BNE 27$ ; MUST NOT BE SEQUENTIAL PACKET0 ASSUME MSGSEQ,0 ; MAKE THAT ASSUMPTION, THOUGH0 CALLV CLASS,CLAEND ; PROCESS SEQUENTIAL PACKET ASSUME Q.CST,0R MOV (R2),R3 ; GET CST BR 45$ ; JOIN COMMON CODE)27$: CMPB #,R0 ; DATAGRAM?N( BNE 40$ ; NO. JUST DEALLOCATE PACKET' CALLV CLASS,CLADAT ; PROCESS DATAGRAMR BR 45$ ; JOIN COMMON CODE%40$: CALL PKTDR ; THROW PACKET AWAY:45$: MOV Q.CRSP(R2),R1 ; GET CURRENT RING DESCRIPTOR ADDR+ ADD #CMDSIZ,R1 ; POINT TO NEXT DESCRIPTOR$" CMP R1,Q.LRSP(R2) ; WRAP AROUND? BLOS 47$ ; NO. / MOV Q.FRSP(R2),R1 ; YES. SO WRAP TO BEGINNING 247$: MOV R1,Q.CRSP(R2) ; REMEMBER NEXT ONE TO USE BR 23$ ; GET ANOTHER RESPONSE;N;; ALL RESPONSES HAVE BEEN PROCESSED. TRY TO START MORE I/OE;$=50$: JMPV CLASS,CLACMD ; CALL CLASS DRIVER TO START MORE I/OS 55$: RETURNB;5C; HANDLE CONTROLLER ERROR. ALL ASSOCIATED CLASS DRIVERS WOULD HAVEM; TO BE TOLD AT THIS POINT.N;I-60$: SEC ; INDICATE ERROR SHOULD BE LOGGED 0 JMPV CLASS,CLAERR ; INFORM THE CLASS DRIVER(S);+; HANDLE SYNCHRONIZATION RELATED INTERRUPTS.; *70$: TST SA(R1) ; WAS THERE FATAL ERROR? BPL 75$ ; NO. CONTINUE JMP OPN ; YES. TRY TO RETRY)75$: TST Q.SAD(R2) ; SPURIOUS INTERRUPT?  BMI 77$ ; If MI, go dispatchJ# BNE 55$ ; If NE, already flagged ) INC Q.SAD(R2) ; flag interrupt receivedD% BR 55$ ; and dismiss the interruptA777$: JMP @Q.SAD(R2) ; No. process required synch step .PAGE2 .SBTTL PORSEN - SEND COMMAND PACKET TO CONTROLLER;+-; **-PORSEN-SEND COMMAND PACKET TO CONTROLLERS;HM; THIS ROUTINE SENDS A COMMAND PACKET TO THE CONTROLLER FOR PROCESSING. ONCEN; THE PACKET HAS BEEN SENT, THIS ROUTINE DETERMINES THE NEXT AVAILABLE COMMANDM; RING THAT CAN BE USED. WRAP AROUND PROCESSING TAKES PLACE IN THIS ROUTINE.l;d ; INPUTS:;C; R1 = COMMAND PACKET ADDRESS; R2 = QST ADDRESSn; R3 = IOP ADDRESSp; R4 = SCB ADDRESS2; R5 = UCR ADDRESSu;d ; OUTPUTS:;.; R1-R5 = PRESERVED;- ASSUME Q.CST,0TPORSEN::MOV (R2),R0 ; GET CSTD2 MOVB C.VCID(R0),VCID(R1) ; SET VIRTUAL CIRCUIT ID) DEC C.CMDS(R0) ; DECREMENT CREDIT COUNT . MOV Q.CCMD(R2),R0 ; GET CURRENT COMMAND RING< BIS #OWN!FLAG,MSW(R0) ; MARK AS CONTR OWNED/REQUEST INTRPTS MOV S.KRB(R4),R0 ; GET KRB MOV K.CSR(R0),R0 ; GET CSR* LOGCMD ; TRACE RSX/DSA COMMAND PACKETS ASSUME IP,0& TST (R0) ; START CONTROLLER LOOKING/5$: ADD #CMDSIZ,Q.CCMD(R2) ; POINT TO NEXT RINGd* CMP Q.CCMD(R2),Q.LCMD(R2) ; OUT OF RINGS? BLOS 10$ ; NO.O6 MOV Q.FCMD(R2),Q.CCMD(R2) ; YES. PERFORM WRAP AROUND 10$: RETURNA .PAGE7 .SBTTL PORSUP - SETUP DATA STRUCTURES ETC FOR THE PORTC;+; **-PORSUP-PORT SETUP ROUTINE;H; THIS ROUTINE SETS UP SOME OF THE PRELIMINARY DATA STRUCTURES NEEDED TOF; USE THE DSA DRIVERS. THIS ROUTINE IS RESPONSIBLE FOR PERFORMING THEG; EXECUTIVE VECTORING OF ROUTINES (IF NEEDED) AS WELL AS SETTING UP THEI?; CONTROLLER SCB FIELDS WITH THE QST ADDRESS OF THE CONTROLLER.(;, ; INPUTS:;;T; R1 = VIRTUAL CIRCUIT ID; R4 = SCB ADDRESS.; R5 = UCB ADDRESSO;W ; OUTPUTS:;:; R0 = DESTROYED; R1 = PRESERVED; R2 = QST ADDRESSE; R3 = CST ADDRESS; R4 = SCB ADDRESST; R5 = UCB ADDRESSS;-$PORSUP::TST EXEVEC ; ALREADY DONE? BNE 10$ ; YES.E2 MOV @#112,R0 ; GET POINTER TO VECTOR OF POINTERS5 MOV @(R0),-(SP) ; MAP ROUTINE WITH CORRECT APR BIASI4 MOV #120000,-(SP) ; GET ADDR. OF TRANSLATE ROUTINE+ MOV #EXEVCL,R2 ; SPECIFY LENGTH OF VECTORT" MOV #EXEVEC,R3 ; POINT TO VECTOR< CALL @<140000+MPPRO> ; CALL ROUTINE IN EXEC WHICH MAPS AND ; CALLS TRANSLATE ROUTINE-10$: MOV S.CON(R4),R0 ; GET CONTROLLER INDEXE" BIC #177400,R0 ; CLEAR HIGH BYTE* ASL R1 ; CONVERT VC ID INTO BYTE OFFSET. ADD TABTAB(R1),R0 ; GET POINTER TO QST TABLE MOV (R0),R2 ; GET QST* ASR R1 ; RESTORE THE VIRTUAL CIRCUIT ID- MOV R2,S.QST(R4) ; S00z|{t__DATADATADATADATATORE QST ADDRESS IN SCB0 ASSUME Q.CST,0D MOV (R2),R3 ; GET CST1 MOVB R1,C.VCID(R3) ; STORE THE VC ID IN THE CST# RETURN  .PAGEG .SBTTL PORUMR - ALLOCATE/DEALLOCATE STATIC UMR AND DYNAMIC WAIT BLOCKS;+B; **-PORUMR-ALLOCATE/DEALLOCATE STATIC UMR AND DYNAMIC WAIT BLOCKS;EM; CALLED WHENEVER CONTROLLER IS BROUGHT ONLINE OR OFFLINE. THE STATIC UMR ISSK; ALLOCATED ONLY ONCE, AND COUNT IS KEPT OF HOW MANY CONTROLLERS ARE ONLINEJ; TO THE PORT. WHEN THE COUNT GOES TO ZERO, THE UMR IS DEALLOCATED. WAITK; BLOCKS ARE ALLOCATED ON PER-CONTROLLER BASIS TO AVOID HAVING TO DEAL WITH3; FAIRNESS PROBLEMS.;H ; INPUTS:T; @; C = 1 TRANSITION TO OFFLINE - DEALLOCATE UMR AND WAIT BLOCKS; R2 = KRB ADDRESS;*=; C = 0 TRANSITION TO ONLINE - ALLOCATE UMR AND WAIT BLOCKS3; R0 = HIGH 6 BITS OF RELOCATION BIAS FOR PORT UMR 3; R1 = LOW 16 BITS OF RELOCATION BIAS FOR PORT UMRA; R2 = KRB ADDRESSO; R3 = CST ADDRESSE;L ; OUTPUTS:;P/; UMR AND WAIT BLOCKS ALLOCATED OR DEALLOCATEDLJ; FOR THE ONLINE TRANSITION, R0 AND R1 CONTAIN THE RELOCATION BIAS OF THE; ALLOCATED UMR;-(PORUMR: BCC 30$ ; IF CC ONLINE REQUEST .IF DF,M$$PRO+ MOVB @PROCN,R0 ; get this processor index4 DECB CPUCNT(R0) ; drop count of controllers active$ BNE 10$ ; if NE, not done yet ...( ASL R0 ; shift CPU index to index * 2: MOV UMRMAP(R0),R2 ; get the static mapping block address/ CLR UMRMAP(R0) ; and clear out the assignment .IFF ;DF,M$$PRO1 TST CONCNT ; LAST CONTROLLER MAPPING THE PORT?R* BNE 10$ ; NO, JUST DUMP THE WAIT BLOCKS2 MOV UMRMAP,R2 ; GET ADDRESS OF UMR MAPPING BLOCK1 CLR UMRMAP ; MAKE SURE UMRMAP=0 SO WE ALLOCATEO .ENDC ;DF,M$$PRO;% ; ..A STATIC UMR AGAIN NEXT TIMER PUSH ; SAVE THE CSTr& CALL @DEUMR ; DEALLOCATE STATIC UMR- MOV R2,R0 ; GET COPY OF CORE BLOCK ADDRESS*$ MOV #M.LGTH,R1 ; CORE BLOCK LENGTH* CALL @DEACB ; DEALLOCATE THE CORE BLOCK POP ; RESTORE THE CST;10$: ADD #C.UMRW,R3 ; POINT TO START OF THE UMR WAIT BLOCKH8 MOV #MAXWBT,-(SP) ; STORE MAX UMR WAIT BLOCKS ON STACK315$: MOV #UMRWTB,R1 ; SET THE LENGTH OF WAIT BLOCKU MOV (R3),R0 ; GET BLOCK BEQ 20$ ; IF EQ WE'RE DONE$8 .IIF DF M$$PRO TST -(R0) ; BACK UP OVER UNIBUS RUN MASK$ CLR (R3)+ ; CLEAR OUT THE ADDRESS PUSH ; SAVE IT* CALL @DEACB ; DEALLOCATE THE CORE BLOCK POP ; AND RESTORE IT1 DEC (SP) ; KEEP THE COUNT FOR WAIT BLOCKS LEFTK BNE 15$ ; GO DO ANOTHER"20$: TST (SP)+ ; CLEAN THE STACK RETURNF30$: .IF DF,M$$PRO* MOVB @PROCN,R2 ; get the processor index7 INCB CPUCNT(R2) ; flag another controller on this CPUI# ASL R2 ; shift into a word index( ADD #UMRMAP,R2 ; convert into an index% MOV R2,UMRPT ; and save our pointerU TST (R2) ; are we connected?T .IFF ;DF,M$$PRO, TST UMRMAP ; FIRST CONTROLLER TO CONNECT? .ENDC ;DF,M$$PROP% BNE 40$ ; NO, JUST GET WAIT BLOCKS 3 PUSH ; SAVE RELOCATION BIAS HIGH AND LOW 3 MOV #M.LGTH,R1 ; LENGTH OF CORE BLOCK TO ALLOCATER$ CALL @ALOCB ; ALLOCATE CORE BLOCK BCS 80$ ; ERROR, EXIT .IF DF,M$$PRO4 MOV R0,@UMRPT ; SAVE THE ADDRESS OF THE CORE BLOCK .IFF ;DF,M$$PRO4 MOV R0,UMRMAP ; SAVE THE ADDRESS OF THE CORE BLOCK .ENDC ;DF,M$$PROa/ POP M.BFVL(R0) ; SET UP LO 16-BITS OF ADDRESSt4 MOVB (SP),M.BFVH(R0) ; SET UP HI 6-BITS OF ADDRESS5 TST (SP)+ ; POP OFF THE WORD TO MAINTAIN THE STACKS, MOV #4,M.UMRN(R0) ; SET UP COUNT FOR 1 UMR CALL @ASUMR ; GO ASSIGN UMR BCS 90$ ; IF CS, ERROR EXIT; B; WE'LL DO THE ACTUAL MAPPING LATER SO THAT RESYNCH CAN REMAP ALSO; ;; NOW WE ALLOCATE SET OF UMR WAIT BLOCKS FOR THE CONTROLLERH;O40$:, TST C.UMRW(R3) ; ARE WAIT BLOCKS ASSIGNED? BNE 70$ ; IF NE, YES, DONE.( MOV #DUUMR,R2 ; ASSUME THAT IT IS DISK ASSUME U.DCB,0D MOV (R5),R1 ; GET THE DCB0 CMP #"DU,D.NAM(R1) ; SEE IF IT IS DISK OR TAPE BEQ 50$ ; IF EQ IT IS DISKT MOV #MUUMR,R2 ; IT'S TAPEE,50$: PUSH ; SAVE WORKING REGISTERS* ADD #C.UMRW,R3 ; POINT TO UMR WAIT QUEUE+60$: MOV #UMRWTB,R1 ; LENGTH OF W00|{ibjbkb a a aORK BLOCKE# PUSH ; SAVE THE BLOCK INDEXL7 CALL @ALOCB ; ALLOCATE CORE BLOCK FOR UMR ASSIGNMENT:% POP ; RESTORE THE BLOCK INDEXS2 BCS 65$ ; WE WILL ALLOCATE THE REST DYNAMICALLY .IF DF M$$PRO MOV U.SCB(R5),R4 ; SCB ADDRESS' MOV S.URM(R4),(R0)+ ; UNIBUS RUN MASK( .ENDC ;M$$PRO- MOV R0,(R3)+ ; PUT THE ADDRESS IN THE TABLE' SOB R2,60$ ; LOOP THROUGH ALLOCATIONR&65$: POP ; RESTORE REGISTERS70$: .IF DF M$$PRO/ MOV @UMRPT,R0 ; GET THE STATIC UMR WAIT BLOCKF .IFF ;DF M$$PRO/ MOV UMRMAP,R0 ; GET THE STATIC UMR WAIT BLOCK; .IFTF ;DF M$$PROK CALL @MPUB1 ; MAP THE UNIBUS  .IFT ;DF M$$PRO) MOV @UMRPT,R2 ; GET BACK THE STATIC UMR  .IFF ;DF M$$PRO) MOV UMRMAP,R2 ; GET BACK THE STATIC UMRA .ENDC ;DF M$$PROR5 MOVB M.UMVH(R2),R0 ; HIGH 2 BITS OF RELOCATION BIAS,% ASH #-4,R0 ; SHIFT BITS 4:5 TO 0:14 MOV M.UMVL(R2),R1 ; LOW 16 BITS OF RELOCATION BIAS CLC ; GOOD RETURNE RETURN.&80$: POP ; RESTORE REGISTERS90$: SEC ; ERROR RETURN RETURNP .PAGE- .SBTTL PORSYN - PORT SYNCHRONIZATION ROUTINE.;+); **-PORSYN-STANDARD PORT SYNCHRONIZATIONU;I; THIS ROUTINE IS RESPONSIBLE FOR STARTING THE CONTROLLER SYNCHRONIZATIONP-; PROCESS (WHEN CALLED BY THE CLASS DRIVERS).;N ; INPUTS:R;; R2 = QST ADDRESS;; R3 = CST ADDRESSA; R4 = SCB ADDRESSR; R5 = UCB ADDRESST;: ; OUTPUTS:;(;; IF INITIAL PART OF HARDWARE SYNCHRONIZATION BEGINS THEN:R;5; THE CONTROLLER HAS BEGUN STEP 1 OF SYNCHRONIZATIONS; R0-R1 = DESTROYED; R2-R5 = PRESERVED; ; IF ALL RE-TRIES FAIL:; ; CONTROL TRANSFERS TO CLASYN; C=1 TO INDICATE FAILURE; R2 = QST ADDRESSE; R3 = CST ADDRESSG; R4 = SCB ADDRESSR; R5 = UCB ADDRESS ;-9PORSYN::MOVB #RETRY,Q.RTY(R2) ; SET UP FOR RETRY RE-TRYS 4 CLR Q.SAD(R2) ; PROTECT AGAINST SPURIOUS INTERRUPT9 MOV #Q1.SYN,Q.STAT(R2) ; CONTROLLER STATE=SYNCHRONIZINGA# BIS #C1.SYN,(R3) ; SET SYNC STATEG/ MOV #1,C.CMDS(R3) ; SET INTITIAL CREDIT COUNT1 .PAGE .SBTTL . OPNR;+M; CONTROL TRANSFERS HERE IF AN ERROR IN SYNCHRONIZATION IS DETECTED. CONTROLL9; ALSO FALLS THROUGH TO HERE FROM THE PORSYN ENTRY POINT.S;D ; INPUTS:R; ; R0-R1 = MAY BE DESTROYEDR; R2 = QST ADDRESSR; R3 = CST ADDRESSB; R4 = SCB ADDRESSS; R5 = UCB ADDRESSY;- .ENABL LSB)&OPN:: DECB Q.RTY(R2) ; TRY OR RE-TRY? BGE 5$ ; IF GE, YES4 MOV #Q1.OFF,Q.STAT(R2) ; CONTROLLER STATE=OFF-LINE;SC; LET CLASS DRIVER HANDLE FAILURE OF SYNCHRONIZATION BY TRANSFERINGA; TO CLASYN WITH THE CARRY SET; 0BADSYN: SEC ; INDICATE FAILURE TO SYNCHRONIZE7 JMPV CLASS,CLASYN ; TRANSFER TO CLASS DRIVER (CLASYN) (5$: ; START HARDWARE SYNCHRONIZATION PUSH ; SAVE CST MOV R2,R3 ; GET COPY OF QST0 ADD #Q.WRIT,R3 ; POINTS TO Q.WRIT TABLE IN QST3 MOVB S.VCT(R4),(R3) ; (INTERRUPT VECTOR ADDR) / 4R& BISB #INTE,(R3)+ ; ENABLE INTERRUPTS;O-; CALCULATE COMMAND RING LENGTH AS POWER OF 2;E4 MOVB Q.CMDN(R2),R0 ; GET NUMBER OF CMD DESCRIPTORS$ MOV #-1,R1 ; COUNT OF POWERS OF 215$: INC R1 ; COUNT THIS ONE ASR R0 ; SHIFT RIGHTE, BNE 15$ ; IF NE, COUNT ANOTHER POWER OF 2/ ASL R1 ; ELSE, SHIFT C RNG LNG INTO POSITIONO ASL R1 ASL R1> MOVB R1,(R3) ; PUT IT IN WORD4 MOVB Q.RSPN(R2),R0 ; GET NUMBER OF RSP DESCRIPTORS! MOV #-1,R1 ; COUNT POWERS OF 2I25$: INC R1 ; COUNT THIS ONE ASR R0 ; SHIFT RIGHTN, BNE 25$ ; IF NE, COUNT ANOTHER POWER OF 2% BISB R1,(R3) ; PUT IT IN WORD ALSO  BISB #200,(R3) ; SET BIT 15S POP ; GET CST ;P8; CONTINUE WITH INITIALIZATION AND START SYNCHRONIZATION; & CLR Q.SAD(R2) ; No steps are pending: 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 ; GET CSR ASSUME IP,0& CLR (R0) ; HARD INIT THE CONTROLLER# PUSH <#500.> ; COUNTER FOR DELAY30$: DEC (SP) ; COUNT DOWN BGT 30$ ; FOR ENTIRE DELAYO TST (SP)+ ; CLEAN OFF STACK4 CALL WSW ; PROCESS START OF STEP 1 (TABLE DRIVEN). BCS OPN ; IN CASE OF ERROR GO00|{t__DATADATADATADATA TRY TO RE-TRY;II; SET UP KS.EXT BIT IN K.STS FOR THE CONTROLLER, BASED ON QB BIT IN VALUEM%; READ FROM SA AT THE START OF STEP 1E;A( MOV S.KRB(R4),R4 ; GET THE KRB ADDRESS> BIC #KS.EXT,K.STS(R4) ; ASSUME EXTENDED MEMORY NOT SUPPORTED: BIT #QB,Q.TEMP(R2) ; CONTROLLER SUPPORT 22 BIT HOST BUS? BEQ 35$ ; IF EQ, NO;; * * * N O T E * * *;TL; THE FOLLOWING BRANCH MAY BE NOP'D IN ORDER TO ALLOW THE USE OF 22-BIT MSCPL; CONTROLLERS ON BUS ADAPTERS WHICH REQUIRE THE USE OF UNIBUS MAP REGISTERS.;Y1$$$BR1::BR 34$ ; NORMALLY SKIP THE SYSTEM CHECKE4 BIT #HF.UBM,@HFMSK ; ARE THERE UMR'S ON THE SYSTEM+ BNE 35$ ; YES, THEN USE CONVERTER OPTIONT34$:> BIS #KS.EXT,K.STS(R4) ; INDICATE CONTROLLER IS ON 22 BIT BUS035$: MOV U.SCB(R5),R4 ; RESTORE THE SCB ADDRESS; PUSH <120000+SCUCB> ; GET ADDRESS OF THE SCAN UCB ROUTINE '37$: CALL @(SP)+ ; CALL THE COROUTINEH BCS 45$ ; IF CS, ALL DONE> BIC #DV.EXT,U.CW1(R5) ; ASSUME EXTENDED MEMORY NOT SUPPORTED: BIT #QB,Q.TEMP(R2) ; CONTROLLER SUPPORT 22 BIT HOST BUS? BEQ 37$ ; IF EQ NOS; L; THE FOLLOWING BRANCH MAY BE NOP'D IN ORDER TO ALLOW THE USE OF 22-BIT MSCPL; CONTROLLERS ON BUS ADAPTERS WHICH REQUIRE THE USE OF UNIBUS MAP REGISTERS.; )$$$BR2::BR 38$ ; SKIP THE SYSTEM CHECKSR4 BIT #HF.UBM,@HFMSK ; ARE THERE UMR'S ON THE SYSTEM+ BNE 37$ ; YES, THEN USE CONVERTER OPTIONP38$:: BIS #DV.EXT,U.CW1(R5) ; INDICATE DEVICE IS ON 22 BIT BUS BR 37$ ; GO DO ANOTHERT45$: ; CONTINUEO;D+; SET UP THE RELOCATION REGISTERS AT UQRELQ2;T CALL VACSET BCS BADSYN ; ERROR EXIT; 7; SET UP THE NEXT THREE WORDS TO SEND TO THE CONTROLLERF;- PUSH ; SAVE CSTN MOV R2,R3 ; GET QST: ADD #Q.WRIT+2,R3 ; GET TO ADDRESS OF THE NEXT START WORD+ MOV Q.RING(R2),R0 ; GET RING BASE ADDRESS + CALL VACPA ; CONVERT TO PHYSICAL ADDRESS;, MOV R0,(R3)+ ; Q.WRIT+2=RING BASE LOW BITS- MOV R1,(R3)+ ; Q.WRIT+4=RING BASE HIGH BITST, MOV #LF!GO,(R3)+ ; Q.WRIT+6=LAST FAIL ! GO POP ; GET CSTT;RL; SET TIME-OUT AND RETURN. AN INTERRUPT WILL TRANSFER TO OPN2 TO PROCESS THE,; COMPLETION OF STEP 1 (BEGINNING OF STEP 2);C3 MOVB #STMOC,S.ITM(R4) ; SET INITIAL TIMEOUT COUNT 3 MOVB #STMOC,S.CTM(R4) ; AND CURRENT TIMEOUT COUNTE& MOV R5,S.BSYU(R4) ; SET THE BUSY UCB0 BISB #US.BSY,U.STS(R5) ; MARK THE UNIT AS BUSY$ MTPS #PR5 ; go to device priority5 TST Q.SAD(R2) ;;; any interrupts occur during setupI% BEQ 50$ ;;; If EQ, nope, finish up;& CALL OPN2 ;;; process the next step% MTPS #PR0 ;;; return to priority 0. RETURN ; to caller650$: MOV #OPN2,Q.SAD(R2) ;;; setup for next interrupt# MTPS #PR0 ; return to priority 0I RETURN .DSABL LSBI .PAGE .SBTTL . OPN2;+; AT THE START OF STEP 28; OPN2 IS JUMPED TO FROM UQINT (THE INTERRUPT PROCESSOR);. ; INPUTS:5;;; R2 = QST ADDRESSY; R3 = CST ADDRESSo; R4 = SCB ADDRESST; R5 = UCB ADDRESSn;r ; OUTPUTS:;n; R0-R1 = DESTROYED; R2-R5 = PRESERVED;-1OPN2:: CALL WSW ; PROCESS STEP 2 (TABLE DRIVEN)0 BCC 5$ ; ALL IS OKt JMP OPN ; WE FAILED, RESTART:;5$: MOVB S.ITM(R4),S.CTM(R4) ; RESET CURRENT TIMEOUT COUNT0; MOV #OPN3,Q.SAD(R2) ; NEXT INTERRUPT WILL TAKE US TO OPN3. RETURN  .PAGE .SBTTL . OPN3;+; AT THE START OF STEP 38; OPN3 IS JUMPED TO FROM UQINT (THE INTERRUPT PROCESSOR);R ; INPUTS:R;Y; R2 = QST ADDRESSo; R3 = CST ADDRESST; R4 = SCB ADDRESSn; R5 = UCB ADDRESS;R ; OUTPUTS:;D; R0-R1 = DESTROYED; R2-R5 = PRESERVED;-1OPN3:: CALL WSW ; PROCESS STEP 3 (TABLE DRIVEN)O BCC 5$ ; SUCCESSA JMP OPN ; FAILURE. GO RETRY;5$: MOVB S.ITM(R4),S.CTM(R4) ; RESET CURRENT TIMEOUT COUNTD; MOV #OPN4,Q.SAD(R2) ; NEXT INTERRUPT WILL TAKE US TO OPN4E RETURN  .PAGE .SBTTL . OPN4;+; AT THE START OF STEP 48; OPN4 IS JUMPED TO FROM UQINT (THE INTERRUPT PROCESSOR); ; INPUTS: ;R; R2 = QST ADDRESSR; R3 = CST ADDRESSR; R4 = SCB ADDRESSR; R5 = UCB ADDRESS; ; OUTPUTS:;R"; CONTROL IS TRANSFERED TO CLASYN-; C=0 (INDICATES SUCCESSFUL SYNCH00|{ibjbkb a a aRONIZATION); R0-R1 = DESTROYED; R2-R5 = PRESERVED;-1OPN4:: 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 DESCRIPTORST1 MOV #Q1.RDY,Q.STAT(R2) ; CONTROLLER STATE=READYEA MOV Q.FRSP(R2),Q.CRSP(R2) ; SET UP INITIAL RESPONSE RING POINTER A MOV Q.FCMD(R2),Q.CCMD(R2) ; SET UP INITIAL COMMAND RING POINTERP( LOGSYN ; TRACE CONTROLLER INIT START CLC ; INDICATE SUCCESS8 JMPV CLASS,CLASYN ; TRANSFER TO CLASS DRIVER TO HANDLE .PAGE2 .SBTTL RNGSET - INITIAL SETUP OF RING DESCRIPTORS;+.; **-RNGSET-INITIAL SET UP OF RING DESCRIPTORS;SD; THIS ROUTINE IMPLEMENTS THE DESIGN DECISION TO STATICALLY ALLOCATEC; PACKET TO EACH RING DESCRIPTOR. IT FILLS IN EACH DESCRIPTOR WITHSD; THE PHYSICAL ADDRESS OF THE PACKET ASSOCIATED WITH THE DESCRIPTOR.;, ; INPUTS:;;T; R2 = QST ADDRESSR; R4 = SCB ADDRESSY; ; OUTPUTS:;L; R0-R1 = DESTROYED;-:RNGSET::PUSH ; SAVE R4,R3,R2, R2 MUST BE LAST!+ MOV Q.RING(R2),R3 ; GET RING BASE ADDRESSI+ MOVB Q.RSPN(R2),R4 ; NUMBER OF RSP DESCR.E7 MOV Q.RPAT(R2),R2 ; GET TABLE OF RSP PACKET ADDRESSESI15$: MOV (R2)+,R0 ; GET VA OF RSP PACKET (TEXT+0)E, MOV #RPLEN,MSGLNG(R0) ; SET MESSAGE LENGTH( CLR CREDIT(R0) ; CLEAR CREDIT AND VCID1 CALL VACPA ; CONVERT VIRTUAL ADDR. TO PHYSICAL. ; R0 = LOW BITS ; R1 = HIGH BITS 7 MOV R0,(R3)+ ; FILL IN DESCR. WITH PHYSICAL PKT ADDR.Y" MOV R1,(R3) ; THE WHOLE ADDRESS; BIS #OWN!FLAG,(R3)+ ; DESCR. CONTROLLER OWNED AND REQUESTG$ ; INTERRUPT ON RING TRANSITIONS. SOB R4,5$ ; SET UP ALL RSP RING DESCRIPTORS MOV (SP),R2 ; GET QST3 MOVB Q.CMDN(R2),R4 ; GET # OF COMMAND DESCRIPTORST5 MOV Q.CPAT(R2),R2 ; GET TABLE OF CMD PACKET ADDRESSR210$: MOV (R2)+,R0 ; GET VA OF CMD PACKET (TEXT+0), MOV #CPLEN,MSGLNG(R0) ; SET MESSAGE LENGTH( CLR CREDIT(R0) ; CLEAR CREDIT AND VCID1 CALL VACPA ; CONVERT VIRTUAL ADDR. TO PHYSICALY7 MOV R0,(R3)+ ; FILL IN DESCR. WITH PHYSICAL PKT ADDR.+( MOV R1,(R3)+ ; CMD PKTS ARE HOST OWNED/ SOB R4,10$ ; SET UP ALL CMD RING DESCRIPTORS # POP ; RESTORE R2,R3,R4V RETURN  .PAGE6 .SBTTL STOMP - BRING CONTROLLER TO THE OFFLINE STATE;+!; **-STOMP-CLOBBER THE CONTROLLERD;CL; CALLED TO ENSURE THAT THE CONTROLLER IS IN AN OFFLINE STATE WHEN THE CLASS.; DRIVER DETERMINES THAT RESYNCH IS NECESSARY.;; ; INPUTS:I;N; R2 = QST ADDRESS ; R4 = SCB ADDRESSR;O ; OUTPUTS:;V; R0 = DESTROYEDN; R2 = PRESERVEDA; R4 = PRESERVED;-"STOMP: MOV S.CSR(R4),R0 ; GET CSR ASSUME IP,0" CLR (R0) ; STOMP THE CONTROLLER: MOV #Q1.OFF,Q.STAT(R2) ; SET CONTROLLER STATE TO OFFLINE RETURN  .PAGE7 .SBTTL VACPA - VIRTUAL TO PHYSICAL ADDRESS CONVERSIONT;+9; **-VACPA-VIRTUAL ADDRESS TO PHYSICAL ADDRESS CONVERSIONN; N; CALLED TO CONVERT VIRTUAL PACKET ADDRESS TO PHYSICAL ADDRESS (OR UMR ADDRESSN; FOR AN EXTENDED MEMORY UNIBUS MACHINE). BECAUSE ALL PACKETS AND RINGS ARE INL; SHARED COMMON MAPPED THROUGH APR 6 THE VIRTUAL ADDRESS MAY BE COMPUTED AS:;R=; (PHYSICAL ADDRESS)=(VIRTUAL ADDRESS)+(RELOCATION CONSTANT)L;L; SEE ROUTINE VACSET FOR DESCRIPTION OF HOW RELOCATION CONSTANT IS COMPUTED.;B ; INPUTS:-;R; R0 = VIRTUAL ADDRESSC); UQRELC=LOW BITS OF RELOCATION CONSTANTT,; UQRELC+2=HIGH BITS OF RELOCATION CONSTANT;O ; OUTPUTS:;A$; R0 = LOW BITS OF PHYSICAL ADDRESS%; R1 = HIGH BITS OF PHYSICAL ADDRESSIVACPA:: .IF DF,M$$PROL. MOVB @PROC2,R1 ; get the processor index * 2% ASL R1 ; form a double word offsetY7 ADD UQRELC(R1),R0 ; R0 = low 16-bits of physical addrE MOV UQRELC+2(R1),R1 ;L. ADC R1 ; R1 = high 16-bits of physical addr .IFF ;DF,M$$PRO CLR R1M3 ADD UQRELC,R0 ; R0 = LOW BITS OF PHYSICAL ADDRESS ADC R1=6 ADD UQRELC+2,R1 ; R1 = HIGH BITS OF PHYSICAL ADDRESS .ENDC ;DF,M$$PROA RETURN  .PAGE. .SBTTL VACSET - CALCULATE RELOCATION CONSTANT;+); **-VACSET-CALCULATE RELOCATION CONSTANT ;MO; THIS ROUTINE WILL CALCULATE THE RELOCATION CONSTANT 00||t__DATADATADATADATANEEDED TO PERFORM VIRTUAL N; ADDRESS TO PHYSICAL ADDRESS CONVERSIONS (PA=VA+UQRELC). IF UMR IS NEEDED TO2; MAP UQCOM THIS ROUTINE WILL ALLOCATE AND MAP IT.;i ; INPUTS:.; ; R2 = QST ADDRESS; R3 = CST ADDRESS=; R4 = SCB ADDRESS ;R ; OUTPUTS:;; R0-R1 = DESTROYED; R2-R5 = PRESERVED!; UQRELC AND UQRELC+2 ARE SET UPT&; UQRELC HAS THE TWO HIGH BITS SET UP&; UQRELC+2 HAS THE 16 LOW BITS SET UP; UMRS ARE MAPPED IF NECESSARY;-1VACSET::MOV @KISR6,R1 ; GET START OF PORT COMMONE CLR R0 ; ZERO R0A+ ASHC #6.,R0 ; CALCULATE PHYSICAL ADDRESS ( MOV S.KRB(R4),R2 ; GET THE KRB ADDRESS4 BIT #KS.EXT,K.STS(R2) ; EXTENDED MEMORY SUPPORTED?! BNE 50$ ; YES, DON'T GET UMR'S, CLC ; TELL PORUMR IT'S ONLINE TRANSITION7 CALL PORUMR ; ALLOCATE/MAP UMR (GET WAIT BLOCKS TOO)V$ BCS 60$ ; BAD, NO SPACE ALLOCATED;50$: SUB #140000,R1 ; SUBTRACT PORT COMMON VIRTUAL ADDRESS  ; MAPPED THRU APR6R" SBC R0 ; SUBTRACT CARRY FROM R0 .IF DF,M$$PRO. MOVB @PROC2,R2 ; Get the processor index * 2 ASL R2 ; shift to * 41 MOV R1,UQRELC(R2) ; store the low order addressK2 MOV R0,UQRELC+2(R2) ; and the high order address .IFF ;DF,M$$PRO MOV R1,UQRELC ; LO ADDRESS MOV R0,UQRELC+2 ; HI .ENDC ;DF,M$$PROC MOV S.QST(R4),R2 ; GET QST ASSUME Q.CST,0T MOV (R2),R3 ; GET CST CLC ; GOOD RETURNS 60$: RETURN  .PAGE5 .SBTTL WSW - WAIT/RESPOND TO SYNCHRONIZATION STEPR;+M; **-WSW-WAIT FOR AND RESPOND TO STEP IN THE HARDWARE SYNCHRONIZATION PROCESSt;pJ; WAIT UP TO 100 MICRO-SECONDS FOR STEP VALUE, READ AND SAVE SA, WRITE SA.;o ; INPUTS:r;K; R2 = QST ADDRESS); R4 = SCB ADDRESSr;d ; OUTPUTS:;D; C=1 = ERROR DETECTED ; R0-R1 = DESTROYED;E; C=0 = SUCCESS; R0-R1 = DESTROYED;-!WSW:: MOV S.CSR(R4),R1 ; GET CSRT CLR R0 ; LOOP CONTROL-5$: TST SA(R1) ; CONTROLLER ERROR OCCURRED? BMI 15$ ; YES. RETURN/ BIT Q.STEP(R2),SA(R1) ; DESIRED STEP BIT SET?O BNE 10$ ; YES. SUCCESSE5 SOB R0,5$ ; WAIT UP TO 100 MICRO-SEC. FOR STEP BIT0/ BR 15$ ; TIME IS UP, GO SET CARRY AND RETURNW;E0; STEP HAS COMPLETED AND THE NEXT STEP HAS BEGUN; 110$: MOV Q.INDX(R2),R0 ; INDEX INTO Q.WRIT TABLER' ADD R2,R0 ; GET ACTUAL TABLE ADDRESSC: MOV SA(R1),Q.TEMP(R2) ; READ/SAVE SA REGISTER TEMPORARILY' LOGSTP ; TRACE CONTROLLER INIT STEP7 MOV Q.WRIT(R0),SA(R1) ; WRITE TO SA FROM Q.WRIT TABLE;$ 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 DETECTEDI 20$: RETURNS LOGRTN ; TRACE ROUTINESP9CODLEN = <.-CODBEG>/2 ; LENGTH OF CODE SECTION IN WORDSD .END0 ; INDEX INTO Q.WRIT TABLER' ADD R2,R0 ; GET ACTUAL TABLE ADDRESSC: MOV SA(R1),Q.TEMP(R2) ; READ/SAVE SA REGISTER TEMPORARILY' LOGSTP ; TRACE CONTROLLER INIT STEP7 MOV Q.WRIT(R0),SA(R1) ; WRITE TO SA FROM Q.WRIT TABLE;$ ASL Q.STEP(R2) ; UPDATE Q.STEP AND ADD #2,Q.INDX(R2) ; Q.INDX CLC ; INDICATE SUCCESS BR 20$ ; GO TO RETURN .TITLE MEMAPS .IDENT /13.05/;V1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.;; 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.;N; D. N. CUTLER 4-AUG-734;;); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:O;M; P. J. BEZEREDI; D. R. DONCHINM; B. S. MCCARTHY;A; MODIFIED BY:;N ; B. S. MCCARTHY 23-MAY-82 13.01;C,; BM255 -- ADD U$$UMR CONDITIONALS FOR P/OS;V; J. M. LAWLER 02-DEC-82 13.02;S/; JL144 -- MODIFY $RELUI TO RELOCATE SUPERMODE ; I-SPACE REFERENCES CORRECTLY;S$; MODIFIED FOR RSX-11M-PLUS V4.5 BY:;H; D. CARROLL 15-Feb-1993 13.03;1; DC107 -- ADD P$$D74 CONDITIONAL TO FORCE CACHEC%; BYPASS ON UMR USAGE WITHIN $MPUBM4;;; D. CARROLL 03-June-1993 13.04S; 2; DC219 -- INCLUDE SUPPORT FOR UNIBUS MEMORY WHEN; DEALING WITH NPR DEVICES:;N$; Modified for RSX-11M-PLUS V4.6 by:; ; D. Carroll 18-Oct-1995 13.058; DC404 - Include PSECT definit00|{ibjbkb a a aion to allow ICB pool to#; be fully extended during sysgenM; ; ; I/O RELATED ROUTINES;T/; ROUTINES DEALING WITH MEMORY MAPPING AND UMRS;.; MACRO LIBRARY CALLS.;8 .MCALL F11DF$,HDRDF$,HWDDF$,PCBDF$,PKTDF$,SHDDF$,TCBDF$/ F11DF$ ;DEFINE WINDOW AND LOCK BLOCK OFFSETSO% HDRDF$ ;DEFINE TASK HEADER OFFSETS $ HWDDF$ ;DEFINE HARDWARE REGISTERS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSr$ PKTDF$ ;DEFINE I/O PACKET OFFSETS* SHDDF$ ;DEFINE SHADOW RECORDING OFFSETS, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;DC404;+#; **-$MPPHY-MAP TO PHYSICAL ADDRESSR;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, O; 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.K;N ; INPUTS:O;E; R1=RELOCATION BIAS.$; R2=DISPLACEMENT ADDRESS.'; R5=ADDRESS OF THE UNIT CONTROL BLOCK.O;Y ; OUTPUTS:;7; IF DEVICE IS AN NPR DEVICE ON AN 18-BIT MACHINE, THEN ;; R1=HIGH ORDER 2 BITS OF PHYSICAL ADDRESS IN BITS 4 AND 5 ,; R2=LOW ORDER 16 BITS OF PHYSICAL ADDRESS..; IF DEVICE IS AN NPR DEVICE ON AN 11/70, THEN9; R1=HIGH ORDER 6 BITS OF PHYSICAL ADDRESS IN HIGH BYTE.A,; R2=LOW ORDER 16 BITS OF PHYSICAL ADDRESS.&; IF DEVICE IS NOT AN NPR DEVICE, THEN; R1=RELOCATION BIAS.; R2=DISPLACEMENT ADDRESS.O;I&; R0 AND R3 ARE PRESERVED ACROSS CALL.;-+$MPPHY::BITB #UC.NPR,U.CTL(R5) ;NPR DEVICE? BEQ 10$ ;IF EQ NO , ASL R2 ;REMOVE APR6 BIAS FROM DISPLACEMENT ASL R2 ;% CLC ;GET 2 BITS OF RELOCATION BIAS ROR R1 ;. RORB R2 ;TO FILL 8 LOW ORDER BITS OF ADDRESS ASR R1 ; RORB R2 ;1& 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 BITSE .IF NDF M$$EXT=. ASH #-4,R1 ;PUT BITS <17:18> OF ADDRESS INTO ;BITS <4:5> .ENDC10$: RETURN ;L;+:; THE FOLLOWING TWO ENTRY POINTS WILL BE DEFINED ONLY WHEN=; 22-BIT ADDRESSING CODE IS DISABLED. THIS IS TO PREVENT THEN8; DRIVERS FROM HAVING UNDEFINED SYMBOLS WHEN TASK BUILT.;- .ENABL LSB; .IF DF U$$UMR .IF NDF M$$EXTE($MPUBM:: ;MAP 11/70 UNIBUS TO TRANSFER!$STMAP:: ;SET MAPPING REGISTERSA RETURN ;DUMMY RETURN ;+3; **-$MPUB1-MAP UNIBUS TO MEMORY (ALTERNATE ENTRY).A;#A; THIS ROUTINE IS CALLED BY UNIBUS NPR DEVICE DRIVERS TO LOAD THEC=; 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. ;; ; 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-1; 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 9 MOV M.UMRN-M.LGTH(R0),-(SP) ;PUSH COUNT OF UMR'S TO LOADL3 MOV -(R0),R2 ;GET LOW 16 BITS OF BUF ADDR (M.BFVL)A. MOVB -(R0),R1 ;GET HIGH ORDER 6 BITS 00||t__DATADATADATADATA(M.BFVH)7 MOV M.UMRA-M.BFVH(R0),R0 ;PICK UP ADDRESS OF FIRST UMRE-10$: BEQ 20$ ; IF EQ, NO UMR ADDRESS TO LOADF* MOV R2,(R0)+ ;LOAD LOW 16 BITS OF ADDRESS& .IF DF P$$D74&P$$D70 ; 11/74 SUPPORT?$ MOV R1,(R0) ; Load the high 6 bits1 BIS #100000,(R0)+ ; and set the cache bypass bit( .IFF ; DF,P$$D74&P$$D70+ MOV R1,(R0)+ ; LOAD HIGH 6 BITS OF ADDRESSU .ENDC ; DF,P$$D74&P$$D70U ADD #20000,R2 ;ADVANCE 8K BYTES ADC R1 ;$ SUB #4,(SP) ;ALL REGISTERS LOADED? BGT 10$ ;IF GT NO620$: TST (SP)+ ;CLEAN STACK RETURNR .ENDC ;NDF M$$EXT .ENDC ; DF U$$UMR .DSABL LSBM;+); **-$RELOC-RELOCATE USER VIRTUAL ADDRESS 8; **-$RELUI-RELOCATE USER (I SPACE ONLY) VIRTUAL ADDRESS;RC; THIS ROUTINE IS CALLED TO TRANSFORM A 16 BIT USER VIRTUAL ADDRESSeD; INTO A RELOCATION BIAS AND DISPLACEMENT IN BLOCK RELATIVE TO APR6.;I ; INPUTS:S;&; R0=USER VIRTUAL ADDRESS TO RELOCATE.;, ; OUTPUTS:;B,; R1=RELOCATION BIAS TO BE LOADED INTO PAR6.3; R2=DISPLACEMENT IN BLOCK PLUS 140000 (PAR6 BIAS).N;A&; R0 AND R3 ARE PRESERVED ACROSS CALL.;- .ENABL LSB .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 .IFDF S$$LIBL) BIT #20000,@#PS ;EXECUTED IN USER MODE ?A 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 ADDRESS$$ ASH #-6,R1 ;CALCULATE BLOCK NUMBER BIC #177600,R1 ;1! MOV R0,R2 ;COPY VIRTUAL ADDRESS " 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 CONTENTS .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 ;A .DSABL LSBH;+$; **-$RELOM-RELOCATE AND MAP ADDRESS;RC; THIS ROUTINE IS CALLED TO TRANSFORM A 16 BIT USER VIRTUAL ADDRESSRC; INTO A RELOCATION BIAS AND DISPLACEMENT IN BLOCK RELATIVE TO APR6R1; AND LOAD THESE VALUES FOR ACCESS BY THE CALLER.C;E ; INPUTS:F; &; R0=USER VIRTUAL ADDRESS TO RELOCATE.;C ; OUTPUTS:;N; R0=DISPLACEMENT IN BLOCK.S,; KISAR6 IS LOADED WITH THE RELOCATION BIAS.;C; R3 IS PRESERVED ACROSS CALL.;-3$RELOM::CALL $RELOC ;RELOCATE USER VIRTUAL ADDRESS + MOV R1,KISAR6 ;SET KERNEL MAPPING REGISTERA. MOV R2,R0 ;SET DISPLACEMENT IN BLOCK ADDRESS RETURN ; ;+0; **-$RELCD-RELOCATE,MAP AND CHECK A DPB/RDB/WDB;DC; THIS ROUTINE IS CALLED TO TRANSFORM A 16 BIT USER VIRTUAL ADDRESS A; INTO A BIAS/DISPLACEMENT PAIR. THE ROUTINE IS PRIMARILY FOR USES?; FROM THE DIRECTIVE DISPATCHER FOR DPBS/RDBS/WDBS. THE ROUTINE@; 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,3 ( BIC #177761,R0 ;CLEAR ALL BUT APR INDEX6 MOV UISAR0(R0),R1 ;GET PAGE ADDRESS REGISTER CONTENTS$ 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 4KWE3 CMP (SP)+,UISAR0+2(R0) ;CONTIGUOUS WITH NEXT APR ? BEQ 20$ ;IF EQ YES - ALWAYS OK310$: BIC #160000,R3 ;CLEAR APR SELECT FIELD OF V.A.A+ ADD R00|{ibjbkb a a a3,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#;0H; THIS ROUTINE IS CALLED TO ASSIGN A CONTIGUOUS SET OF UMR'S. NOTE THATG; FOR THE SAKE OF SPEED, THE LINK WORD OF EACH MAPPING ASSIGNMENT BLOCKSH; 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 OFE; MAPPING ASSIGNMENT BLOCKS, EACH BLOCK CONTAINING THE ADDRESS OF THE C; FIRST UMR ASSIGNED AND THE NUMBER OF UMR'S ASSIGNED TIMES 4. THE A; BLOCKS ARE LINKED IN THE ORDER OF INCREASING FIRST UMR ADDRESS.R; ; INPUTS:R;I4; R0=POINTER TO A MAPPING REGISTER ASSIGNMENT BLOCK.*; M.UMRN(R0)=NUMBER OF UMR'S REQUIRED * 4.;O ; OUTPUTS:;A; ALL REGISTERS ARE PRESERVED.;M.; C=0 IF THE UMR'S WERE SUCCESSFULLY ASSIGNED.6; ALL FIELDS OF THE MAPPING REGISTER ASSIGNMENT BLOCK0; ARE INITIALIZED AND THE BLOCK IS LINKED INTO; THE ASSIGNMENT LIST.); C=1 IF THE UMR'S COULD NOT BE ASSIGNED.A;- .IF DF M$$EXT&U$$UMRI$ASUMR::SAVNR ;SAVE R4 AND R5T( TST (R0)+ ;SKIP OVER LINK WORD (M.LNK) .IF DF U$$BME7 MOV M.BFVL-2(R0),R5 ; IF IT WAS, THEN M.UMVL SHOULD BE.9 MOVB M.BFVH-2(R0),R4 ; GET BUFFER ADDRESS HGH ORDER PART:2 ASHC #-6,R4 ; GET THE HIGHEST 16 BITS TO COMPARE3 CMP R5,$SYSIZ ; ARE WE IN THE UNIBUS MEMORY RANGE?F BLO 5$ ; IF LO, NOPE ...$ CLR (R0) ; SET THE ADDRESS TO ZERO;+B; Create a UNIBUS address which will coorespond to the low order ; 18-bits of the memory address.;-5 MOV M.BFVL-2(R0),M.UMVL-2(R0) ; LOAD THE LOW 16 BITS& BIC #^C<6000>,R5 ; ISOLATE BITS 17,16/ SWAB R5 ; GET IT INTO THE LOW BYTE (BITS 2,3)S ASL R5 ; SHIFT AGAIN TO (3,4). ASL R5 ; AND AGAIN (4,5)3 MOVB R5,M.UMVH-2(R0) ; AND LOAD THE UNIBUS ADDRESSS BR 30$ ; AND FINISH UP ...5$: .ENDC ;DF,U$$BME7 MOV #$UMRHD+2,R5 ;POINT TO UMR ASSIGNMENT LISTHEAD + 20)10$: MOV R5,R4 ;SAVE POINTER TO PREVIOUSa# BEQ 30$ ;IF EQ ASSIGNMENT FAILURE 7 MOV (R5),(R0) ;POINT TO NEXT FREE UMR (M.UMRA)(M.UMRA)M% ADD M.UMRN-M.UMRA(R5),(R0) ;(M.UMRA)  .IF DF U$$BME6 MOV #UBMPR+<32.*4>,-(SP) ; PUSH POINTER PAST LAST UMR .IFF ;DF,U$$BME5 MOV #UBMPR+<31.*4>,-(SP) ;PUSH POINTER PAST LAST UMR  .ENDC ;DF,U$$BME5 MOV -(R5),R5 ;POINT TO NEXT ASSIGNMENT BLOCK (M.LNK)B BEQ 20$ ;IF EQ THERE IS NONE7 MOV (R5),(SP) ;SET NEXT ALLOCATED UMR ADDRESS (M.UMRA)N:20$: SUB (R0),(SP) ;CALCULATE # OF FREE UMR'S * 4 (M.UMRA)5 CMP (SP)+,M.UMRN-M.UMRA(R0) ;ENOUGH UMR'S AVAILABLE?R BLO 10$ ;IF LO NOE1 MOV R0,-(R4) ;LINK NEW BLOCK TO PREVIOUS (M.LNK) . MOV (R0),R4 ;SAVE FIRST UMR ADDRESS (M.UMRA)7 MOV R5,-2(R0) ;POINT NEW BLOCK TO NEXT IN LIST (M.LNK)V( 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 BITSE) ASR R5 ;SHIFT HIGH 2 BITS TO BITS 4 & 5T- ASLB R4 ;CALCULATE HIGH BYTE OF LOW 16 BITSA# ASL R4 ; (LOSING 200 BIT FIRST) ASL R4 ;% SWAB R4 ;FORM PROPER 16 BIT ADDRESSE< 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 & 5P430$: DEC R0 ;PNT BACK TO LINK WORD PRESERVING CARRY DEC R0 ; RETURN ; ;+-; **-$DEUMR-DEASSIGN UNIBUS MAPPING REGISTERSA;RD; THIS ROUTINE IS CALLED TO DEASSIGN A CONTIGUOUS BLOCK OF UMR'S. IFF; THE MAPPING ASSIGNMENT BLOCK IS NOT IN THE LIST, NO ACTION IS TAKEN.E; NOTE THAT FOR THE SAKE OF ASSIGNMENT SPEED, THE LINK WORD POINTS TOO5; THE UMR ADDRESS (2ND00||t__DATADATADATADATA) WORD OF THE ASSIGNMENT BLOCK.I;D ; INPUTS:,;M!; R2=POINTER TO ASSIGNMENT BLOCK.S;L ; OUTPUTS:;M; R0 AND R1 ARE PRESERVED.;-/$DEUMR::TST (R2)+ ;SKIP OVER LINK WORD (M.LNK)3 MOV #$UMRHD+2,R3 ;POINT TO ASSIGNMENT LISTHEAD + 2U.10$: CMP -(R3),R2 ;IS IT THE NEXT ONE? (M.LNK) BEQ 20$ ;IF EQ YES1 MOV (R3),R3 ;ELSE POINT TO NEXT IN LIST (M.LNK)E BNE 10$ ;IF NE THERE IS ONE 1 BR 30$ ;ELSE MAPPING ASSIGNMENT BLK NOT IN LISTN420$: MOV -(R2),(R3) ;UNLINK THE BLOCK (M.LNK)(M.LNK)30$: RETURN ;H;+<; **-$STMP1-SET UP UNIBUS MAPPING ADDRESS (ALTERNATE ENTRY).;O=; THIS ENTRY CODE SETS UP AN ALTERNATE DATA STRUCTURE USED ASU>; A UMR MAPPING ASSIGNMENT BLOCK AND CONTEXT STORAGE BLOCK, IN;; THE SAME MANNER AS $STMAP USES THE FORK BLOCK AND MAPPINGTC; BLOCK IN THE SCB, KRB. THE FORMAT OF THE STRUCTURE IS AS FOLLOWS: ;N; -------------------------- ; ! ! 4 WORDS USED FOR SAVING!; ! ! DRIVER'S CONTEXT IN CASEL; ! ! UMRS CAN'T BE MAPPEDN; ! ! IMMEDIATELY.N; --------------------------; ! !; ! ! 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 THEBB; UNIBUS MAPPING ADDRESS, FIRST ASSIGNING THE UMR'S. IF THE UMR'SF; CANNOT BE ALLOCATED, THE DRIVER'S MAPPING ASSIGNMENT BLOCK IS PLACEDG; IN A WAIT QUEUE AND A RETURN TO THE DRIVER'S CALLER IS EXECUTED. THEEA; ASSIGNMENT BLOCK WILL EVENTUALLY BE DEQUEUED WHEN THE UMR'S ARE1F; AVAILABLE AND THE DRIVER WILL BE REMAPPED AND RETURNED TO WITH R1-R5A; PRESERVED AND THE NORMAL OUTPUTS OF THIS ROUTINE. THE DRIVER'S F; CONTEXT IS STORED IN THE ASSIGNMENT BLOCK AND FORK BLOCK WHILE IT ISD; BLOCKED AND IN THE WAIT QUEUE. ONCE A DRIVER'S MAPPING ASSIGNMENTC; BLOCK IS PLACED IN THE UMR WAIT QUEUE, IT IS NOT REMOVED FROM THEEA; QUEUE UNTIL THE UMR'S ARE SUCCESSFULLY ASSIGNED. THIS STRATEGYCF; ASSURES THAT WAITING DRIVERS WILL BE SERVICED FIFO AND THAT DRIVER'S;; WITH LARGE REQUESTS FOR UMR'S WILL NOT WAIT INDEFINATELY.P; ; INPUTS:D; ; R4=ADDRESS OF DEVICE SCB.H; R5=ADDRESS OF DEVICE UCB.I!; (SP)=RETURN TO DRIVER'S CALLER.O; ; OUTPUTS:;N;; UNIBUS MAP ADDRESSES ARE SET UP IN THE DEVICE UCB AND THE .; ACTUAL PHYSICAL ADDRESS IS MOVED TO THE SCB.; ;; NOTE: REGISTERS R1, R2, AND R3 ARE PRESERVED ACROSS CALL.;-)$STMAP::MOV S.KRB(R4),R0 ;GET KRB ADDRESS.- ADD K.OFF(R0),R0 ;R0=LAST WORD+2 OF UMR AREAS' ADD #S.FRK+6,R4 ;POINT INTO FORK BLOCK@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)E! DEC R0 ;POINT BACK TO NEXT WORD': MOV U.CNT(R5),-(R0) ;TEMORARILY STORE BYTE COUNT (M.UMVL)* 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 BYTE;610$: ADD #4,(R0) ;INCREASE COUNT FOR ONE UMR (M.UMRN)9 SUB #20000,2(R0) ;REDUCE BYTE COUNT BY 8K BYTES (M.UMVL) ! BHI 10$ ;IF HI MORE BYTES TO GOS TST -(R0) ;(M.UMRA)M7 MOV -(R0),-(SP) ;SAVE POSSIBLE WAIT QUEUE LINK (M.LNK)H/ CALL $ASUMR ;ATTEMPT TO ASSIGN REQUIRED UMR'ST/ BCC 20$ ;IF CC SUCCESSFUL, CHECK FOR UMR WAIT TST (SP)+ ;CLEAR STACK. MOV R5,(R4) ;SAVE R5 IN FORK BLOCK (S.FRK+6)8 MOV (SP)+,-(R4) ;SAVE DRIVER'S RETURN ADDRESS (S.FRK+4)3 MOV R0,-(R4) ;SAVE MAPPING BLOCK POINTER (S.FRK+2)A0 CALL $WTUMR ;WAIT FOR CHANGE IN UMR ASSIGNMENT6 MOV (R4)+,R0 ;RESTORE MAPPING BLOCK POINTER (S.FRK+2)) ADD #00|{ibjbkb a a aM.LGTH,R0 ;POINT PAST MAPPING BLOCKT8 MOV (R4)+,-(SP) ;RESTORE DRIVER'S RETURN ADDR (S.FRK+4)# MOV (R4),R5 ;RESTORE R5 (S.FRK+6)T* 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 R4A< MOV M.UMVL(R0),U.BUF+2(R5) ;STORE LOW WORD OF UMR VIRT ADDR/ MOVB M.UMVH(R0),U.BUF(R5) ;STORE HIGH SIX BITS ( CLRB U.BUF+1(R5) ;CLEAR HIGH-ORDER BYTE( CMP $UMRWT,R0 ;WAS THIS CALLER WAITING? BNE 30$ ;IF NE NOI0 MOV (SP),$UMRWT ;DEQUEUE CURRENT CALLER'S BLOCK BNE 30$ ;IF NE NOT END OF LIST2 MOV #$UMRWT,$UMRWT+2 ;UPDATE LAST IN LIST POINTER30$: TST (SP)+ ;CLEAR STACK .ENABL LSB;+!; **-$DQUMR-DEQUEUE FROM UMR WAITA;(C; CONTROL IS TRANSFERRED HERE TO SEE IF A DRIVER IS WAITING FOR UMRMF; ASSIGNMENT. FIRST THE CALLING DRIVER IS CALLED BACK AS A COROUTINE.G; WHEN THE CALLING DRIVER ISSUES A RETURN BACK TO THIS ROUTINE, A CHECK G; IS MADE TO SEE IF ANY DRIVERS ARE WAITING FOR UMR'S. IF SO THE WAIT-VB; ING DRIVER'S CONTEXT IS RESTORED WITHOUT ACTUALLY DEQUEUEING THEE; MAPPING ASSIGNMENT BLOCK AND CONTROL IS PASSED BACK TO THE ORIGINALT; UMR ASSIGNMENT ROUTINE.N; ; INPUTS:;**; (SP)=RETURN ADDRESS TO DRIVER'S CALLER..;S ; OUTPUTS:;R@; IF ANYONE IS WAITING THEIR CONTEXT IS RESTORED AND THE ALLOCA-; TION ROUTINE IS CALLED BACK.;- .ENABL LSBH2$DQUMR::CALL @(SP)+ ;CALL THE CALLER AS COROUTINE2 MOV $UMRWT,R0 ;ANYONE WAITING FOR UMR ASSIGNMENT?' BEQ 10$ ;IF EQ HE HAS SINCE GONE AWAY ROL -(SP) ;SAVE SENSE OF C-BIT TST (R0)+ ;POINT TO SAVED R1& MOV (R0)+,R1 ;RESTORE SAVED REGISTERS MOV (R0)+,R2 ;T MOV (R0)+,R3 ;M MOV (R0)+,R4 ;I CALL @(R0)+ ;CALL ROUTINES+ ROR (SP)+ ;RESET C BIT TO ENTRY CONDITION RETURN ;;+(; **-$WTUMR-WAIT FOR CHANGE IN UMR STATE;DG; THIS ROUTINE STORES R1-R4 AND THE RETURN PC IN THE MAPPING ASSIGNMENT:G; AND QUEUES THE BLOCK IN THE UMR WAIT QUEUE FOR A SUBSEQUENT RECALL TOGG; THE CALLER WHEN THE STATE OF UMR ASSIGNMENT CHANGES. NOTE THAT IT IS)E; POSSIBLE FOR THE MAPPING ASSIGNMENT BLOCK TO ALREADY BE IN THE WAITR>; QUEUE, BUT IF IT IS IT CAN ONLY BE AT THE HEAD OF THE QUEUE.;0 ; INPUTS:C; $; R0=POINTER TO UMR ASSIGNMENT BLOCK;T ; OUTPUTS:; 7; THE ASSIGNMENT BLOCK IS QUEUED IN THE UMR WAIT QUEUE.G>; THE CALLER IS EVENTUALLY RETURNED AT SYSTEM STATE WITH R1-R4 ; PRESERVED.G;-?$WTUMR::MOV (SP)+,12(R0) ;STORE RETURN ADDR TO ALLOCATE ROUTINEU7 CMP R0,$UMRWT ;MAPPING ASSIGNMENT BLK ALREADY IN LIST?M BEQ 5$ ;IF EQ YESA. MOV R0,@$UMRWT+2 ;LINK BLOCK TO LAST IN QUEUE- MOV R0,$UMRWT+2 ;UPDATE LAST IN LIST POINTERI 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)+ ;E MOV R4,(R0)+ ;D(10$: RETURN ;RETURN TO CALLER'S CALLER .DSABL LSBT .ENDC ; DF M$$EXT&U$$UMR4;+,; **-$RELOP-RELOCATE UNIBUS PHYSICAL ADDRESS;U>; THIS ROUTINE RELOCATES A UNIBUS PHYSICAL ADDRESS TO A KISAR6; BIAS AND DISPLACEMENT.;5 ; INPUTS:E;4; 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 ADDRESS ;V ; OUTPUTS:;S(; KISAR6=CALCULATED BIAS (MAPPED SYSTEM)!; R1=REAL ADDRESS OR DISPLACEMENTT;- .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 ;C .ENDC ; NDF R$$PROS;+E; **-$SWACD-SAVE MAPPING, CALL ACD AS A CO-ROUTINE, THEN REMAP DRIVER:7; **-$SWAC1-CALL ACD AS A CO-ROUTINE, THEN REMAP DRIVERR;GA; THESE ROUTINES ARE CALLED BY THE FULL DUPLEX TERMINAL DRIVER TOTD; SWITCH PROCESSING TO AN ANCILLARY CO00||t__DATADATADATADATANTROL 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),KD .TITLE PLSUBR .IDENT /05.11/C; 1; Copyright (c) 1995-1999 by Mentec Inc., U.S.A. ; 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.;S; PREVIOUSLY MODIFIED BY:M;R; J. R. KAUFFMAN; B. S. MCCARTHY;0+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:L;C; J. W. BERZLE;Q+; MODIFIED FOR RSX-11M-PLUS VERSION 4.1 BY:S; ; B. S. MCCARTHY 1-APR-88 05.01 ;$;; BM409 -- ADD $SRMAI TO LOOK FOR A MAIN PARTITION, CHANGE.&; $SRNAM TO EXCLUDE MAIN PARTITIONS.;t+; Modified for RSX-11M-PLUS Version 4.5 by:R; ; D. Carroll 15-Feb-1993 05.10;L9; DC111 - Correct subroutine $SETBP to correctly handle 4; common regions on an mP system, w/ cache bypass;M$; Modified for RSX-11M-PLUS V4.6 by:;; D. Carroll 18-Oct-1995 05.11:; DC404 - Include PSECT statement to allow ICB pool to be ; fully expanded during sysgen;S;C9; PROGRAM LOGICAL ADDRESS SPACE (PLAS) COMMON SUBROUTINESF;A; MACRO LIBRARY CALLS.;  .IF DF P$$LAS# .MCALL HDRDF$,HWDDF$,PCBDF$,TCBDF$X% HDRDF$ ;DEFINE TASK HEADER OFFSETSr$ HWDDF$ ;DEFINE HARDWARE REGISTERS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS , TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS .IFTF ;DC404R ;DC404. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;DC404 ;DC404;+&; **-$SRNAM-SEARCH FOR NAMED PARTITION;nD; THIS ROUTINE SEARCHES FOR A NAMED PARTITION AND RETURNS A SUCCESS/7; FAILURE INDICATION AND A POINTER TO THE PCB IF FOUND.C; ; INPUTS:F;C&; R3=POINTER TO DOUBLE-WORD RAD50 NAME; ; OUTPUTS:;F; C=1 IF NO MATCH ON NAMEE;; C=0 IF NAMED PARTITION FOUND; R2=PCB ADDRESS;- .IFTF2$SRNAM::MOV $CBDHD,R2 ;POINT TO FIRST ENTRY IN CBD BEQ 25$ ;IF EQ THERE IS NONE510$: CMP P.NAM(R2),(R3) ;MATCH ON FIRST WORD OF NAME? BNE 20$ ;IF NE NO5 CMP P.NAM+2(R2),2(R3) ;MATCH ON SECOND WORD OF NAME?I BEQ 30$ ;IF EQ YES.20$: MOV P.CBDL(R2),R2 ;POINT TO NEXT MAIN PCB BNE 10$ ;IF NE THERE IS ONEC25$: SEC ;C-SET ON NO MATCHC30$: RETURN ; ;++; **-$SRMAI-SEARCH FOR NAMED MAIN PARTITIONF; @; THIS ROUTINE SEARCHES FOR A NAMED MAIN PARTITION AND RETURNS A?; FAILURE SUCCESS/INDICATION AND A POINTER TO THE PCB IF FOUND. ;C ; INPUTS:$;I&; R3=POINTER TO DOUBLE-WORD RAD50 NAME; ; OUTPUTS:; ; C=1 IF NO MATCH ON NAMEI;E; C=0 IF NAMED PARTITION FOUND; R2=PCB ADDRESSO;- .IFTF.$SRMAI::MOV $PARHD,R2 ;POINT TO FIRST MAIN00|{ibjbkb a a a PCB510$: CMP P.NAM(R2),(R3) ;MATCH ON FIRST WORD OF NAME?C BNE 20$ ;IF NE NOC5 CMP P.NAM+2(R2),2(R3) ;MATCH ON SECOND WORD OF NAME?M BEQ 30$ ;IF EQ YES)20$: MOV (R2),R2 ;POINT TO NEXT MAIN PCBI BNE 10$ ;IF NE THERE IS ONEU SEC ;C-SET ON NO MATCHT30$: RETURN ;F .IFTC;+ ; **-$CKACC-CHECK DESIRED ACCESS;RA; THIS ROUTINE CHECKS IF THE DESIRED ACCESS OF A TASK TO A REGION B; IS ALLOWED. THE BITS IN THE PROTECTION WORD ARE ARRANGED IN THE; FOLLOWING ORDER:;I; [WORLD,GROUP,OWNER,SYSTEM] ; 15 0(; C; THE BITS WITHIN EACH CATEGORY IN THE PROTECTION WORD ARE ARRANGED); IN THE FOLLOWING ORDER:D; ; DELETE EXTEND WRITE READ0; 3 2 1 0;M:; A BIT SET MEANS THE CORRESPONDING ACCESS IS NOT ALLOWED.;A ; INPUTS:R;R); R0=DESIRED ACCESS MASK IN LOW FOUR BITSE; R1=CURRENT UIC OF TASK; R2=PCB ADDRESS OF REGION;C ; OUTPUTS:;O; R0,R1 ARE MODIFIED; 7; DIRECTIVE STATUS OF D.RS16 RETURNED IF ACCESS DENIED.O;-.$CKACC::MOV #30$,-(SP) ;PUSH COROUTINE ADDRESS0 BIC #^C17,R0 ;CLEAR ALL BUT DESIRED ACCESS MASK210$: SWAB R1 ;REVERSE GROUP AND OWNER IN UIC WORD2 CALL @(SP)+ ;CHECK IF QUALIFIED IN NEXT CATEGORY BNE 20$ ;IF NE NOM3 BIT R0,P.PRO(R2) ;ALLOWED ACCESS IN THIS CATEGORY?L BNE 20$ ;IF NE NOR" TST (SP)+ ;POP COROUTINE ADDRESS RETURN ;RETURN TO CALLERC)20$: ASL R0 ;SHIFT MASK TO NEXT CATEGORY ASL R0 ; ASL R0 ; ASL R0 ;' BR 10$ ;CHECK ACCESS IN THIS CATEGORY 30$: CMPB R1,#10 ;SYSTEM UIC? BHI 40$ ;IF HI NOH! SEZ ;SET FLAG FOR ACCESS CHECKC.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?* CALL @(SP)+ ;CHECK ACCESS AND SHIFT MASK% SEZ ;INSURE CHECK FOR WORLD ACCESSP CALL @(SP)+ ;CHECK ACCESSR, DRSTS D.RS16 ;ACCESS DENIED IF WE GET HERE;+(; **-$CRATT-CREATE ATTACHMENT DESCRIPTOR;AE; THIS ROUTINE CREATES AN ATTACHMENT DESCRIPTOR AND INSERTS IT IN THES; NECESSARY QUEUES. ; ; INPUTS:Z;;,; R2=PCB ADDRESS OF REGION BEING ATTACHED TO; R4=ACCESS CODE"; R5=TCB ADDRESS OF ATTACHING TASK;C ; OUTPUTS:;+; C=0 IF SUCCESSFULH&; R1=ADDRESS OF ATTACHMENT DESCRIPTOR; R0 IS MODIFIED 8; C=1 IF AN ATTACHMENT DESCRIPTOR COULD NOT BE ALLOCATED; R0,R1 ARE MODIFIED+;- .IFTF$CRATT::MOV R3,-(SP) ;SAVE R3  MOV R2,-(SP) ;SAVE PCB ADDRESS-3 MOV #A.LGTH,R1 ;PICK UP ATTACHMENT DESCRIPTOR SIZET1 CALL $ALOCB ;ALLOCATE THE ATTACHMENT DESCRIPTOR# BCS 10$ ;IF CS ALLOCATION FAILURE4 ADD R0,R1 ;POINT PAST END OF ATTACHMENT DESCRIPTOR( MOV (SP),-(R1) ;SET PCB ADDRESS (A.PCB)0 MOV R4,-(R1) ;INIT STATUS AND MAP COUNT (A.STS)2 BIC #^C17,(R1) ;CLEAR ALL BUT ACCESS BITS (A.STS)/ TST -(R1) ;POINT TO TCBL THREAD WORD (A.TCBL)O- MOV R5,R0 ;POINT TO TCB ATTACHMENT LISTHEAD. ADD #T.ATT,R0 ;0 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)A* TST -(R1) ;POINT TO PCBL THREAD (A.PCBL)/ MOV (SP),R0 ;POINT TO PCB ATTACHMENT LISTHEADS 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 R3C RETURN ;, .IFTT;+,; **-$SRATT-SEARCH FOR ATTACHMENT DESCRIPTOR;QJ; THIS ROUTINE VERFIES IF A VALID REGION ID WAS PASSED IN A PLAS DIRECTIVEG; BY SEARCHING FOR THE CORRESPONDING ATTACHMENT DESCRIPTOR IN THE TCB'SR; ATTACHMENT QUEUE.T;A ; INPUTS:T;R; (R3)=REGION ID TO VERIFY; 0 FOR TASK REGION+; 1-17 FOR OTHER STATICALLY LINKED REGIONST ; R5=TCB ADDRESS OF CURRENT TASK;E ; OUTPUTS:;C%; R5=ADDRESS OF ATTACHMENT DESCRIPTORR;RB; 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 ID ( CMP (SP),#17 ;STATICALLY LINKED REGION? BHI 9$ ;NO IF HI15$: DEC (SP) ;SEARCH FOR PROPER ATTACHMENT DESCRH BLT 20$ ;IF LT00||t__DATADATADATADATA, FOUND IT& MOV (R5),R5 ;POINT TO NEXT ATT DESCR BEQ 15$ ;IF EQ, END OF LISTE BR 5$ ;GO AGAIN +9$: ADD #A.TCBL,(SP) ;ADD BIAS TO LINK WORDE,10$: CMP R5,(SP) ;MATCH ON THIS DESCRIPTOR? BEQ 20$ ;IF EQ YES5 MOV (R5),R5 ;ELSE POINT TO NEXT DESCRIPTOR (A.TCBL)O BNE 10$ ;IF NE THERE IS ONE5%15$: DRSTS D.RS86 ;INVALID REGION IDT<20$: SUB #A.TCBL,R5 ;POINT TO START OF ATTACHMENT DESCRIPTOR TST (SP)+ ;CLEAN STACK RETURN ;$;+/; **-$SRWND-SEARCH FOR SPECIFIED ADDRESS WINDOW2; H; THIS ROUTINE VERIFIES THAT THE SPECIFIED ADDRESS WINDOW ID CORRESPONDS(; TO A VALID ESTABLISHED ADDRESS WINDOW.;A ; INPUTS:;; ; (R3)=ADDRESS WINDOW ID#; R4=ADDRESS OF CURRENT TASK HEADER? ; R5=TCB ADDRESS OF CURRENT TASK; ; OUTPUTS:;N&; R4=POINTER TO SPECIFIED WINDOW BLOCK; R0 IS MODIFIED.5;D?; D.RS87 IS RETURNED IF THE SPECIFIED ADDRESS WINDOW IS INVALIDT;-4$SRWND::MOV H.WND(R4),R4 ;POINT TO NUMBER OF WINDOWS1 MOVB (R3),R0 ;PICK UP ADDRESS WINDOW ID (W.NID)D BEQ 10$ ;IF EQ ILLEGAL .IF DF U$$DAS CMP #1,R0 ;ADDRESS WINDOW 1 ?C BNE 5$ ;IF NE NO/ BIT #T4.DSP,T.ST4(R5) ;TASK USE USER D SPACE ?- BNE 10$ ;IF NE YES, CAN'T CHANGE WINDOW ONEU5$: ;REFERENCE LABELT .ENDC ; DF U$$DAS# CMP R0,(R4)+ ;WINDOW ID TOO LARGE?T 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 WINDOW5 TST W.BSIZ(R4) ;IS IT AN ESTABLISHED ADDRESS WINDOW?  BEQ 10$ ;IF EQ NON RETURN ;$*10$: DRSTS D.RS87 ;INVALID ADDRESS WINDOW;+ ; **-$UNMAP-UNMAP ADDRESS WINDOW; B; THIS ROUTINE SEARCHES FOR AND CONDITIONALLY UNMAPS THE SPECIFIED; ADDRESS WINDOW.E;N ; INPUTS:$; %; R4=ADDRESS OF WINDOW TO BE UNMAPPEDS; ; OUTPUTS:;W; R0 IS MODIFIED; ; C=1 IF UNMAPPING WAS PERFORMED;- .ENABL LSB811$: RETURN ;RETURN TO KEEP BRANCH FROM BREAKINGD-$UNMAP::TST (R4) ;IS WINDOW MAPPED? (W.BPCB) " BEQ 1$ ;IF EQ, WINDOW NOT MAPPED MOV R3,-(SP) ;SAVE REGISTERSR MOV R2,-(SP) ;S MOV R1,-(SP) ;  .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 TOU ASL R0 ;QUADWORD OFFSETD% BIC #177407,R0 ;REMOVE UNNEEDED BITS ADD $FMAPP,R0 ;POINT TO BLOCK CLR (R0) ;INDICATE UNUSEDR5$:E .ENDC ; DF F$$MAP&X$$HDR&P$$LAS< MOV W.BATT(R4),R0 ;PICK UP ADDRESS OF ATTACHMENT DESCRIPTOR4 CLR W.BATT(R4) ;CLEAR ATTACHMENT DESCRIPTOR POINTER) DECB A.MPCT(R0) ;DECREMENT MAPPING COUNT9 MOVB A.MPCT(R0),-(SP) ;SAVE MAPPING COUNT FOR TEST LATER , MOV A.TCB(R0),R1 ;POINT TO TASK TCB ADDRESS .IF DF X$$HDR2 MOV $SAHPT,R0 ;GET ADDRESS OF CURRENT TASK HEADER .IFF 2 MOV $HEADR,R0 ;GET ADDRESS OF CURRENT TASK HEADER .ENDC .IF DF S$$LIB!U$$DASK7 MOV H.SMAP(R0),-(SP) ;GET SUPER MAPPING MASK FOR LATER$ .ENDC ; DF S$$LIB!U$$DAS,4 MOV H.WND(R0),R2 ;GET ADDRESS OF FIRST WINDOW BLOCK, MOVB W.BFPD(R4),R0 ;POINT TO FIRST USER PDR .IF DF S$$LIB BPL 17$ ;IF PL SUPER WINDOWT .IFTF ; DF S$$LIB10$: ;REFERENCE LABEL .IF DF U$$DAS& 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 NO5 MOV KISAR0-UINDR0(R0),UINAR0-UINDR0(R0) ;RESTORE PRVS ;MAPPING .IF DF M$$PRO0 MOV #177406,(R0)+ ;RESTORE R/W 4K BYPASS ACCESS .IFF ; DF M$$PROO( MOV #77406,(R0)+ ;RESTORE R/W 4K ACCESS .ENDC ; DF M$$PRO .IF DF U$$DAS8 BITB $BTMSK-UINDR0-2(R0),1(SP) ;THIS APR MAPPED THROUGH ;DISCRETE USER D WINDOW. BNE 15$ ;IF NE YES, LEAVE USER/SUPER D ALONE8 MOV KISAR0-UINDR0-2(R0),UDSAR0-UINDR0-2(R0) ;MAP USER D ;TO EXECI .IF DF M$$PRO> MOV #177406,UDSDR0-UINDR0-2(R0) ;RESTORE R/W 4K BYPASS ACCESS .IFF ; DF M$$PRO 6 MOV #77406,UDSDR0-UINDR0-2(R0) ;RESTORE R/W 4K ACCESS .ENDC ; DF M$$PRO .ENDC ; DF U$$DAS .IFT ; DF S$$LIBR< BITB $BTMSK00|{ibjbkb a a a-2-UINDR0-2(R0),(SP) ;SUPER I MAPPED TO USER D ? BNE 15$ ;IF NE NON< 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 6 MOV #77406,SDSDR0-UINDR0-2(R0) ;RESTORE R/W 4K ACCESS .ENDC ; DF M$$PRO .IFTF 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 WINDOWB" BNE 15$ ;IF NE YES, DON'T CHANGE, CLR UDSDR0-UINDR0-2(R0) ;UNMAP USER D SPACE .ENDC ; DF U$$DAS .IFT ; DF S$$LIB : BITB $BTMSK-2-UINDR0-2(R0),(SP) ;SUPER D MAPPED TO USER D ;FOR THIS APR ?  BNE 15$ ;IF NE NO- CLR SDSDR0-UINDR0-2(R0) ;UNMAP SUPER D SPACER .IFTF ; DF S$$LIB .IF DF U$$DAS BR 15$ ;SKIP USER D CODE5A140$: BICB $BTMSK-UDSDR0(R0),1(SP) ;INDICATE REMAPPING TO I SPACE > MOV UINAR0-UDSDR0(R0),UDSAR0-UDSDR0(R0) ;MAP USER D TO USER I1 MOV UINDR0-UDSDR0(R0),(R0)+ ;AND SET SAME ACCESS  .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$$DAS15$: DECB W.BNPD(R4) ;DONE YET?- BGT 10$ ;IF GT NOI .IFT ; DF S$$LIBP( BR 18$ ;SKIP SUPER I SPACE WINDOW CODE117$: ADD #SDSDR0,R0 ;ADJUST TO SUPER D SPACE PDRS+4 DECB $SUPFL ;COUNT ONE LESS SUPERVISOR MODE WINDOW& BNE 170$ ;IF NE THERE STILL ARE SOME& BIC #10,SR3 ;DISABLE CSM INSTRUCTION8 BIS #PMODE!CMODE,$STACK-2 ;FORCE EXECUTION TO USER MODE8170$: BITB $BTMSK-2-SDSDR0(R0),(SP) ;THIS APR OVERMAPPED! BEQ 171$ ;IF EQ NO, DON'T TOUCHC# CLR (R0)+ ;CLEAR NEXT SUPER D PDR; BR 172$ ;GO DO NEXT ONEN171$: TST (R0)+ ;SKIP THIS APR !172$: DECB W.BNPD(R4) ;DONE YET ?  BGT 170$ ;IF GT NO .ENDC ; DF S$$LIB18$: ;REFERENCE LABELS .IF DF U$$DAS!S$$LIB * 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$$LIBE* MOV R1,R0 ;COPY TCB ADDRESS FOR DEACCESS' MOV (R4),R1 ;POINT TO PCB TO DEACCESS  .IF DF M$$PRO0 CALL $RESBP ;RESET CACHE BYPASS AS APPROPRIATE .IFTF4 TSTB (SP)+ ;WAS THIS LAST MAP THROUGH ATTACHMENT ?. BNE 20$ ;IF NE NO, DON'T DEACCESS REGION YET MOV R0,-(SP) ;SAVE REGISTERSE MOV R1,-(SP) ;D CALL $DEARG ;DEACCESS REGION MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R0 ;E%20$: CLR (R4) ;UNMAP WINDOW (W.BPCB)T .IFT  .IF DF M$$EXT1 CMP P.REL(R1),#177600 ;IS REGION IN THE IO PAGE?  .IFFS/ CMP P.REL(R1),#7600 ;IS REGION IN THE IO PAGE?C .ENDC BLO 95$ ;NO IF LOR' CALL $SETAT ;RECALULATE TASK AFFINITY .IFTF$95$: MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R2 ;B MOV (SP)+,R3 ;,% SEC ;RETURN CS FOR WINDOW UNMAPPEDP100$: RETURN ; .ENDC .ENDC ; DF P$$LAS .DSABL LSBN;+,; **-$GTMCT-DETERMINE NUMBER OF MAPPED TASKS;CI; THIS ROUTINE CALCULATES THE NUMBER OF WINDOWS MAPPED TO A GIVEN REGION.R7; THE VALUE RETURNED IS FOR DETERMINING IF CACHE BYPASSC; IS NECESSARY FOR THIS REGION.T;I ; INPUTS:;N; R1=PCB ADDRESS; ; OUTPUTS:;S+; R2=NUMBER OF WINDOWS MAPPED TO THE REGION; R2=0 FOR READ ONLY COMMONSS; R2=1 IF ONE WINDOW IS MAPPED+.; R0=ADDRESS OF TASK'S ATTACHMENT DESCRIPTOR6; R2=2 IF 2 OR MORE WINDOWS ARE MAPPED TO THIS REGION;B ; R0 MODIFIED+;- .IF DF M$$PRO'$GTMCT::CLR R2 ;ASSUME NO MAPPED TASKSC) BIT #P2.RON,P.ST2(R1) ;READ ONLY REGION?  BNE 30$ ;YES IF NE MOV R1,-(SP) ; ( CLR -(SP) ;RESERVE A WORD ON THE STACK' ADD #P.ATT,R1 ;POINT TO ATT DESCR LIST*10$: MOV (R1),R1 ;POINT TO NEXT ATT DESCR BEQ 20$ ;IF EQ END OF LIST( MOVB A.MPCT-A.PCBL(R1),R0 ;TASK MAPPED? BEQ 10$ ;IF EQ NON, MOV R1,(SP) ;SAVE ATTACHMENT DESCR ADDRESS3 ADD R0,R2 ;CALCULATE TOTAL NUMBER OF TASKS M00||t__DATADATADATADATAAPPEDP' CMP R2,#2 ;AT LEAST TWO TASKS MAPPED?- BLT 10$ ;IF LT NO220$: SUB #A.PCBL,(SP) ;POINT TO START OF ATT DESCR$ MOV (SP)+,R0 ;GET ATT DESCR ADDRESS MOV (SP)+,R1 ;RESTORE R1,30$: RETURN ;S;+; **-$STCXT-SET MAPPING CONTEXT#;T7; THIS ROUTINE RELOADS THE PDRS FOR A SPECIFIED REGION.T;E ; INPUTS:R;B>; IF CALLED TO FORCE SECOND MAPPED TASK TO BYPASS THE CACHE:;?:; R4=ATTACHMENT DESCRIPTOR FOR FIRST TASK TO MAP TO REGION;; R5=ATTACHMENT DESCRIPTOR FOR SECOND TASK TO MAP TO REGIONP;CI; IF CALLED TO RELOAD THE PDRS FOR THE ONLY TASK MAPPED TO THIS REGION:C;(9; R4=ATTACHMENT DESCRIPTOR FOR ONLY TASK MAPPED TO REGIONS; R5=0; ; OUTPUTS:;RB; THE PDRS ARE SET UP SO THAT ACCESSES TO THIS REGION BYPASS CACHE; AS APPROPRIATE.E;L;-$STCXT:: ;REFERENCE LABELN .IF DF X$$HDR' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGT .ENDC/ MOV $TKTCB,R0 ;GET TCB ADDRESS OF CURRENT TASKF! BEQ 100$ ;IF EQ NO CURRENT TASKT) BIT #TS.RUN,T.STAT(R0) ;IS TASK RUNNING?O BEQ 100$ ;NO IF EQ" MOV T.PCB(R0),R0 ;GET PCB ADDRESS .IF DF X$$HDRI .IFTF% MOV P.HDR(R0),R1 ;GET HEADER ADDRESS  .IFTE! BNE 10$ ;IF NE, RESIDENT HEADER1 MOV P.REL(R0),KISAR6 ;MAP TO NON RESIDENT HEADERR- MOV #140000,R1 ;POINT TO NON RESIDENT HEADER10$: .ENDC- MOV R4,R2 ;COPY ATT DESCR ADDRESS OF CALLER, CALL $SRWAT ;SEARCH FOR WINDOW BCS 100$ ;IF CS NOT FOUNDC( TST W.BPCB(R0) ;IS WINDOW STILL MAPPED? BEQ 100$ ;NO IF EQ2 BIT #WB.NBP,W.BLPD(R0) ;CACHE BYPASS NOT DESIRED?# BNE 100$ ;YES IF NE DO NOT BYPASSP( CLR -(SP) ;RESERVE A WORD ON THE STACK1 MOVB W.BNPD(R0),(SP) ;GET NUMBER OF PDRS TO LOAD, 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 PDR .IF DF S$$LIB BMI 30$ ;IF MI USER WINDOW( ADD #SISDR0,R1 ;POINT TO SUPERVISOR PDR .IFTF-30$: BIC #100000,(R1) ;CLEAR BYPASS INDICATORD, BIS R2,(R1)+ ;SET BYPASS BIT AS APPROPRIATE .IFTB CMP R1,#UISDR0 ;USER WINDOW?? BLO 40$ ;NO IF LON+ MOV -2(R1),SDSDR0-UISDR0-2(R1) ;RELOAD PDR  .ENDC&40$: DEC (SP) ;FINISHED LOADING PDRS? BGT 30$ ;IF GT NOP TST (SP)+ ;CLEAN THE STACK100$: ;REFERENCE LABELO .IF DF X$$HDR) MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPINGD .ENDC TST R5 ;RESET BYPASS) BEQ 110$ ;IF EQ YES, NO TASK TO UNBLOCKT" MOV A.TCB(R5),R0 ;GET TCB ADDRESS! DEC T.STAT(R0) ;UNBLOCK THE TASKA2 CALLR $SETCR ;SET A CONDITIONAL SCHEDULE REQUEST110$: RETURN ;;+; **-$SRWAT-SEARCH FOR WINDOWN;F8; THIS ROUTINE SEARCHES FOR A MAPPED WINDOW WITH A GIVEN; ATTACHMENT DESCRIPTOR.;H ; INPUTS:P;?; R1=HEADER ADDRESSP"; R2=ATTACHMENT DESCRIPTOR ADDRESS; ; OUTPUTS:;E*; C=1 IF NO MATCH ON ATTACHMENT DESCRIPTOR;O; C=0 IF WINDOW FOUND.; R0=WINDOW ADDRESS;Y;S ; R0 MODIFIEDF;-4$SRWAT::MOV H.WND(R1),R0 ;POINT TO NUMBER OF WINDOWS' MOV (R0)+,-(SP) ;GET NUMBER OF WINDOWS510$: CMP W.BATT(R0),R2 ;ATTACHMENT DESCRIPTORS MATCH?$ BNE 15$ ;IF NE NO # TSTB A.MPCT(R2) ;IS WINDOW MAPPED?H BNE 20$ ;IF NE YES)15$: ADD #W.BLGH,R0 ;POINT TO NEXT WINDOWT 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;W3; THIS ROUTINE WILL RESET CACHE BYPASS FOR A REGION.-; IF ONLY ONE WINDOW IS MAPPED TO THE REGION.0;- ; INPUTS:U;R; R1=PCB ADDRESS;P ; OUTPUTS:;;7; CACHE BYPASS IS DISABLED IF ONLY ONE WINDOW IS MAPPEDT; TO THE REGION.;O;-$RESBP::SAVNR ;SAVE REGISTERSA MOV R3,-(SP) ;I MOV R2,-(SP) ;T MOV R1,-(SP) ;  MOV R0,-(SP) ;B .IF DF X$$HDR' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING) .ENDC6 CALL $GTMCT ;GET NUMBER OF TIMES REGION IS MAPPED TO DEC R2 ;ONLY MAPPED ONCE?W 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 NOI* BICB #AS.SBP,A.STAT(R0) ;CLEAR BYPASS00|{ibjbkb a a a BIT: BISB #AS.RBP,A.STAT(R0) ;INDICATE BYPASS IS NOT NECESSARY BR 100$ ;  .IF DF X$$HDR  .IFTF)10$: MOV P.HDR(R2),R1 ;GET HEADER ADDRESSR .IFTK! BNE 20$ ;IF NE, RESIDENT HEADER1 MOV P.REL(R2),KISAR6 ;MAP TO NON RESIDENT HEADER - MOV #140000,R1 ;POINT TO NON RESIDENT HEADERE20$: .ENDC/ MOV R0,R2 ;COPY ATTACHMENT DESCRIPTOR ADDRESSR CALL $SRWAT ;SEARCH FOR WINDOW BCS 100$ ;IF CS NOT FOUNDI7 BIC #100000,W.BLPD(R0) ;RESET CACHE BYPASS IN LAST PDR,8 BIT #WB.NBP!WB.BPS,W.BLPD(R0) ;SHOULD TASK RELOAD PDRS? BNE 100$ ;IF NE NO0 MOV R2,R4 ;COPY ATT DESCR FOR ONLY TASK MAPPED CLR R5 ;1 MOV A.TCB(R2),R2 ;GET TCB ADDRESS OF MAPPED TASKE) BIT #TS.RUN,T.STAT(R2) ;IS TASK RUNNING?R BEQ 100$ ;IF EQ NO/ MOVB T.CPU(R2),R2 ;FIND CPU TASK IS RUNNING ONE ASL R2 ;CONVERT TO WORD INDEXM MOV $BTMSK(R2),R2 ;GET CPU BITP6 MOV #$STCXT,R3 ;GET ADDRESS OF ROUTINE TO RELOAD PDRS2 CALL $EXROP ;EXECUTE $STCXT ON CORRECT PROCESSOR100$: ;REFERENCE LABELB .IF DF X$$HDR( MOV (SP)+,KISAR6 ;RESTORE APR 6 MAPPING .ENDC MOV (SP)+,R0 ;RESTORE REGISTERS MOV (SP)+,R1 ;D MOV (SP)+,R2 ;V MOV (SP)+,R3 ;T RETURNE;+#; **-$SETBP- Setup for cache bypass ; B; This routine will determine if only one window is mapped to thisF; region. If so, the task mapped to this region is notified to bypass; cache as necessary.S;T ; Inputs:D;S; R0 = TCB address; R1 = PCB address9; R3 = Window address of task about to map to this regionC;A ; Outputs:; 6; Task mapped to this region is notified as necessary.8; Task about to map is blocked (if necessary) until task%; already mapped reloads its context.R;R;- $SETBP::SAVNR ; Save registers .IF DF X$$HDR( MOV KISAR6,-(SP) ; Save current mapping .ENDC;+/; Determine if any cache bypass is needed ... ;-* BIT #P2.RON,P.ST2(R1) ; is the region R/O+ BNE 5$ ; if EQ, yes, skip all of this ...1 JMP 120$ ; finish up, don't need to do anythingu85$: MOV W.BATT(R3),R5 ; extract this requests window ADBA BICB #AS.SBP!AS.RBP,A.STAT(R5) ; indicate no cache bypass neededo" MOV R1,R4 ; Copy the PCB address( ADD #P.ATT,R4 ; and initialize our loop10$: MOV R3,-(SP) ;r MOV R2,-(SP) ;  MOV R1,-(SP) ;S MOV R0,-(SP) ;c% MOV R4,R3 ; copy the listhead to R3n%20$: MOV (R3),R3 ; get next accessor" BEQ 100$ ; no writers are mapped' TSTB A.MPCT(R3) ; is the region mappedt! BEQ 20$ ; if EQ, nope, try next 2 BITB #AS.WRT,A.STAT(R3) ; mapped w/ write access?, BEQ 20$ ; if EQ, nope, check next accessor.30$: MOV (R4),R4 ; Get the next link word ...* BEQ 100$ ; if EQ, end of list, finish up4 TSTB A.MPCT(R4) ; is the region mapped via this ADB% BEQ 30$ ; if EQ, no try next regionP8 CMP A.TCB(R4),A.TCB(R5); is this the same task mapping?0 BEQ 30$ ; if EQ, yes, no need to worry yet ...;+2; We will require cache bypass to be implemented,&; based on the following criteria --;p1; - The requesting task is not the only accessor./4; - At least one window is mapped with write access.;-7 BITB #AS.SBP,A.STAT(R5) ; first pass through this way?Q4 BNE 60$ ; if NE, nope, our task mapping is updated;+>; Scan through the TCB attachment list, and update all windows; to be set as cache bypass ...T;-% MOV R4,-(SP) ; save R4 for a bit ...Q2 MOV A.TCB(R5),R4 ; get the requestors TCB address@ ADD #T.ATT-A.TCBL,R4 ; and point to this tasks attachments list;40$: MOV A.TCBL(R4),R4 ; get the next attachment descriptoro. BEQ 50$ ; if EQ, end of attachement list ...7 SUB #A.TCBL,R4 ; and point to the beginning of the ADBp, CMP A.PCB(R4),A.PCB(R5) ; same PCB address?! BNE 40$ ; nope, continue on ...% MOV R4,-(SP) ; save this ADB addressn+ MOV A.TCB(R4),R1 ; extract the TCB addressp. INC T.STAT(R1) ; increment the blocking count) CALL $STCXT ; update the window contexts' MOV (SP)+,R4 ; restore the ADB address & BR 40$ ; and get the next attachment150$: MOV (SP)+,R4 ; Restore our saved ADB pointerr;60$: BISB #AS.SBP,A.STAT(R5) ; indicate cache bypass n00||t__DATADATADATADATAeeded#: MOV A.TCB(R4),R2 ; Get the TCB address of the mapped task' MOV T.PCB(R2),R1 ; and the PCB address48 BIT #PS.OUT!PS.CKP!PS.CKR,P.STAT(R1) ; is the task out?' BEQ 70$ ; nope, the task is in memoryh< BISB #AS.SBP,A.STAT(R4) ; indicate that bypass is requested: BICB #AS.RBP,A.STAT(R4) ; and remove the no bypass option BR 30$h;+; The task is in memory ...1; - The window descriptor in the task header mustu9; be updated to indicate that cache bypass is in effectc?; - If the task is active on another processor, we will need tos=; block the requesting task until we have updated the cache,; bypass status of all other mapped tasks.;-470$: MOV R4,R2 ; Copy attachment descriptor address' MOV A.TCB(R4),R1 ; Get the TCB addressp4 MOV T.PCB(R1),R1 ; and the mapped tasks PCB address .IF DF X$$HDRi MOV R1,R0 ; Copy PCB pointer& MOV P.HDR(R1),R1 ; Get header address" BNE 80$ ; If NE, resident header2 MOV P.REL(R0),KISAR6 ; Map to non resident header. MOV #140000,R1 ; Point to non resident header80$: .IFF ;DF,X$$HDR& MOV P.HDR(R1),R1 ; Get header address .ENDC ;DF,X$$HDRa! CALL $SRWAT ; Search for window1 BCS 30$ ; If CS, not found, but I have the ADB!d3 BIS #100000,W.BLPD(R0) ; Set up last PDR to bypassT1 MOV A.TCB(R4),R1 ; Extract the target mapped TCBF< BIT #TS.RUN,T.STAT(R1) ; Is task running on some processor? BEQ 30$ ; If EQ, nos, MOV R1,-(SP) ; Save our current TCB address8 MOV A.TCB(R5),R0 ; and extract the requesting tasks TCB$ INC T.STAT(R0) ; Block calling task& CALL $SETCR ; Set a schedule request6 MOV (SP)+,R1 ; Restore the currently mapped tasks TCB8 MOVB T.CPU(R1),R2 ; Get CPU ID on which task is running ASL R2 ; Convert to word index! MOV $BTMSK(R2),R2 ; Get run maskT0 MOV #$STCXT,R3 ; Set address of routine to call: CALL $EXROP ; Load the context for this task, in context6 BR 30$ ; and continue the scan of the remaining ADBs=100$: BICB #AS.SBP,A.STAT(R5) ; release the set bypass statuss&110$: MOV (SP)+,R0 ; Restore registers MOV (SP)+,R1 ;L MOV (SP)+,R2 ;  MOV (SP)+,R3 ;120$: ; Reference label .IF DF X$$HDR* MOV (SP)+,KISAR6 ; Restore kernel mapping .ENDC RETURN ;A .ENDC ; DF M$$PRO;+; **-$DELRG-DELETE REGIONn;sH; THIS ROUTINE ASSUMES ALL CHECKS HAVE BEEN MADE ON WHETHER A REGION MAYF; BE DELETED OR NOT. IT UNCONDITIONALLY DELETES THE REGION REGARDLESS+; OF WHAT STATE THE REGION IS CURRENTLY IN.A;AF; WHEN THE REGION IS BE DELETED, A NUMBER OF OPERATIONS MAY HAVE TO BEE; PERFORMED TO EFFECT ALL NECESSARY CLEANUP, DEPENDING ON THE CURRENT H; STATE OF THE REGION AS DETERMINED BY THE BITS PS.OUT AND PS.CKP. NOTED; THAT IF THE REGION IS OUT OF MEMORY, IT CANNOT BE IN THE PARTITIONC; WAIT QUEUE, LOADER OR LOADER QUEUE. THIS IS DUE TO THE FACT THATBH; SINCE THE CURRENT TASK IS RUNNING, IT HAS EITHER NOT BEEN MAPPED (COM-H; MON CANNOT BE CONTENDING FOR MEMORY) OR MAPPED AND NOT BLOCKED (COMMONE; IS IN MEMORY). ON DELETION, IF THE REGION HAS A NAME IT IS REMOVEDEE; FROM THE COMMON BLOCK DIRECTORY. ADDITIONAL CLEANUP ACTIONS FOR THEU); FOUR POSSIBLE STATES OF THE REGION ARE: ;T=; (PS.OUT=0,PS.CKP=0 => COMMON IS IN MEMORY) - RELEASE MEMORYF&; DELETE REGION PCB AND ANY DISK PCB.;AB; (PS.OUT=0,PS.CKP=1 => COMMON IS IN PROCESS OF BEING CHECKPOINTED:; OUT) - RELEASE MEMORY AND COUNT ON THE LOADER TO DETECT6; THIS CONDITION AND RELEASE ANY CHECKPOINT SPACE AND"; DELETE REGION PCB AND DISK PCB.;E@; (PS.OUT=1,PS.CKP=0 => REGION NEVER LOADED) - DELETE REGION PCB; AND ANY DISK PCB.;T=; (PS.OUT=1,PS.CKP=1 => REGION IS CHECKPOINTED OUT) - RELEASES7; CHECKPOINT SPACE AND DELETE REGION PCB AND DISK PCB.I;N ; INPUTS:R;A; R0=REGION PCB ADDRESS.;P ; OUTPUTS:; ; NONE.;-5$DELRG::BIT #PS.COM,P.STAT(R0) ;IS IT A NAMED COMMON?I BEQ 40$ ;IF EQ NOS, TST P.NAM(R0) ;DOES THE REGION HAVE A NAME? BEQ 40$ ;IF EQ NOE< MOV #$CBDHD-P.CBDL,R1 ;POINT TO COMMON BLOCK DIRECTORY HEAD230$: CMP P.CBDL(R1),R0 ;POINTING TO ONE TO DELETE?00}{ibjbkb a a a BEQ 35$ ;IF EQ YES! MOV P.CBDL(R1),R1 ;POINT TO NEXTU BR 30$ ;@35$: MOV P.CBDL(R0),P.CBDL(R1) ;UNLINK FROM COMMON BLK DIRECTORY340$: BIS #PS.DEL,P.STAT(R0) ;MARK REGION FOR DELETEA- BIT #PS.OUT,P.STAT(R0) ;IS REGION IN MEMORY? BNE 50$ ;IF NE NOG MOV R0,R1 ;COPY PCB ADDRESS ) TST P.DPCB(R0) ;DOES IT HAVE A DISK PCB?T BEQ 45$ ;IF EQ NOR7 CALLR $ICHKP ;INITIATE CHECKPOINT & LET LOADER FINISHC#45$: MOV R0,-(SP) ;SAVE PCB ADDRESSR CALL $RLPR1 ;FREE MEMORY" MOV (SP)+,R0 ;RESTORE PCB ADDRESS,50$: CALLR $RLCPS ;RELEASE CHECKPOINT SPACE;+:; **-$DETRG-DETACH REGION BY ATTACHMENT DESCRIPTOR ADDRESS;NK; THIS ROUTINE DETACHES A TASK FROM A REGION AND DEALLOCATES THE ATTACHMENTSI; DESCRIPTOR. ON THE LAST DETACH OF A REGION IT IS CHECKED FOR DELETION.C$; WHEN APPRORIATE, $NXTSK IS CALLED.;T;VK; NOTE: THE DETACH REGION ROUTINE MAKES USE OF THE FOLLOWING RELATIONSHIPSE7; IN THE DATA STRUCTURES AS SHOWN IN THE DIAGRAM BELOW:C; #; A.TCB IS AT OFFSET 4 FROM A.PCBLR#; A.PCB IS AT OFFSET 4 FROM A.TCBL ;E;S ; PCBS ; +-------+ ; | |R; | |H"; |-------| ADB2; | P.ATT |--| +---------------+ +---------------+9; |-------| |--->| A.PCBL |------>| 0 |<------+A7; +----|-------| |---------------| |---------------| |N(; | | | | A.IOC | A.PRI | | | | |.; | | | |---------------| |---------------| |#; | +-------+ | A.TCB | | | |D3; | |---------------| |---------------| | 5; | TCB |--->| A.TCBL |------>| 0 | |E=; | +-------+ | |---------------| |-->|---------------| | ); | | | | |A.MPCT | A.STAT| | | | | | 5; | | | | |---------------| | |---------------| |-*; | |-------| | | A.PCB | | | | |;; | | T.ATT |--| +---------------+ | +---------------+ |-/; | |-------| | | /; | |-------|---------------------------| ||; | | | |; | | | |; | +-------+ |; | |I; +--------------------------------------------------------------------+-;-; ;-I; THE ROUTINE BELOW CLEARS THE KEY TO SEARCH ON, AND CLEARS OFFSET 4 FROM H; THE LINK WORD BEFORE CALLING $QRMVT. $QRMVT COMPARES OFFSET 4 IN EACHK; ELEMENT ON THE LIST WITH THE KEY. THE ZERO KEY WILL MATCH THE ATTACHMENT /; DESCRIPTOR WHICH HAS BEEN MARKED WITH A ZERO. ; ; INPUTS: ; %; R5=ADDRESS OF ATTACHMENT DESCRIPTOR-;| ; OUTPUTS:;|; R0,R1,R2,R3 ARE MODIFIED. ;-0$DETRG::MOV A.PCB(R5),R0 ;POINT TO PCB OF REGION2 ADD #P.ATT,R0 ;POINT TO ATTACHMENT DESCR LISTHEAD CLR R1 ;CLEAR SEARCH KEY& MOV A.TCB(R5),-(SP) ;SAVE TCB ADDRESS6 CLR A.TCB(R5) ;MARK ATTACHMENT DESCRIPTOR FOR REMOVAL1 CALL $QRMVT ;REMOVE DESCRIPTOR FROM PCB'S QUEUEN, TST (R0) ;IS ANYONE ELSE ATTACHED? (P.ATT) BNE 55$ ;IF NE YES% SUB #P.ATT,R0 ;POINT TO START OF PCBT0 BIT #PS.PER,P.STAT(R0) ;PARITY ERROR IN REGION? BEQ 22$ ;IF EQ NO0 MOV $FXRPT,R0 ;GET TCB ADDRESS OF RECOVERY TASK$ BEQ 55$ ;IF EQ IT IS NOT INSTALLED- CMP R0,(SP) ;PARITY ERROR IN RECOVERY TASK?C 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?V BNE 25$ ;IF NE YES" MOV (SP),R1 ;PICK UP TCB ADDRESS' MOV T.PCBV(R1),R1 ;POINT TO PCB VECTOR) BEQ 26$ ;IF EQ THERE IS NONE+ CMP R0,2(R1) ;READ ONLY REGION OF MU TASK?P BNE 26$ ;IF NE NO, MUST DELETE BR 55$ ;ELSE DO NOT DELETE925$: BIT #PS.DEL,P.STAT(R0) ;IS REGION MARKED FOR DELETE?Q BEQ 55$ ;IF EQ NO$26$: CALL $DELRG ;DELETE THE REGION&55$: MOV (SP)+,R0 ;RESTORE TCB ADDRESS7 ADD #T.ATT,R0 ;POINT TO ATTACHMENT DESCRIPTOR LISTHEAD  CLR R1 ;CLEAR SEARCH KEY6 CLR A.PCB(R5) ;MARK ATTACHMENT DESCRIPTOR FOR REMOVAL0 CALL $QRMVT ;REMOVE DESCRIPTOR FROM TCB'S LIST$ MOV R5,R0 ;COPY DESCRIPTOR ADDRESS' MOV #A.LGTH,R1 ;SET SIZE TO DEALLOCATEG0 CALLR $DEACB ;DEALLOCATE ATTACHMENT DESCRIPTOR .END ;ELSE DO NOT DELETE925$: BIT #PS.DEL,P.STAT(R0) ;IS REGION MARKED FOR DELETE?Q BEQ 55$ ;IF EQ NO$26$: CALL $DELRG ;DELETE THE REGION&55$: MOV (00 }|t__DATADATADATADATA .TITLE TDSCH .IDENT /14.02/T;E1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.M; 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;A; PREVIOUSLY MODIFIED BY:L; ; J. R. KAUFFMAN; T. M. MARTIN; B. S. MCCARTHY; J. W. BERZLE; L. B. MCCULLEY; C. A. SILVER ; K. L. NOEL ; D. CARROLL;R$; Modified for RSX-11M-PLUS V4.6 by:;.; D. Carroll 18-Oct-1995 14.009; DC404 - Include PSECT statment to allow ICB pool to be ; fully expanded during sysgen;s; D. Carroll 01-Jul-1998 14.02;; DC506 - Include the full algorithm for leap year supportY!; including century transition.C;I;S/; TIME DEPENDENT SCHEDULING AND DEVICE TIME OUTY;D; MACRO LIBRARY CALLS ;F* .MCALL CLKDF$,HDRDF$,HWDDF$,TCBDF$,PCBDF$ .IF DF M$$PRO .MCALL BGCK$A ; Bugcheck macro .ENDC ;DF M$$PROL2 CLKDF$ ;DEFINE CLOCK QUEUE CONTROL BLOCK OFFSET% HDRDF$ ;DEFINE TASK HEADER OFFSETSI$ HWDDF$ ;DEFINE HARDWARE REGISTERS .IF DF R$$PRO .MCALL UPTUP$ ;UPTIME UPDATE .ENDC ; DF R$$PRO .IF DF N$$DIRc .MCALL LNMDF$' LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETS  .ENDC ;DF N$$DIR, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSL. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;DC404;+; **-$CKINT-CLOCK INTERRUPTL;CD; THIS ROUTINE IS ENTERED AS THE RESULT OF A CLOCK INTERRUPT. $INTSVC; IS CALLED TO SAVE REGISTERS R4 AND R5 AND $INTCT IS INCREMENT. IF$@; THE RESULT IS NONZERO, THEN A JUMP TO $INTXT IS EXECUTED. ELSEA; A FORK IS EXECUTED SO THAT PENDING CLOCK INTERRUPTS CAN BE PRO- ; CESSED.;-$CKINT:: ;;;REFERENCE LABELF .IF NDF K$$DASO- JSR R5,$INTSE ;;;CALL INTERRUPT SAVE ROUTINEL) .WORD ^C&PR7 ;;;NEW PRIORITY IS PR5E .IFF ; NDF K$$DAS1 MOV R5,-(SP) ;MIMIC ACTIONS OF $DIRSV TO PREVENT( MOV R4,-(SP) ;WASTE TIME ON I/D SYSTEMS DEC $STKDP ;;;SWITCH STACKS ?C45$: BIC #^C&PR7,@#PS ;;;DROP TO DEVICE PRIORITY+ CACHE$ SAVE ;;;SAVE BYPASS STATE OF CACHEP7 MOV #$INTSF,-(SP) ;;;PUSH ADDRESS OF EXEC EXIT ROUTINET .ENDC ; DF K$$DAS .IF DF K$$W11* MOV #103,K$$W11 ;;;ENABLE AND START TIMER .ENDC .IF DF P$$3XX+ TST @$CKCSA ;;;ENSURE CLOCK ISN'T LONESOM< ;;;(IF WE'RE ON A PRO-3XX) .ENDC ; DF P$$3XX .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 COUNTP BEQ 10$ ;;;IF EQ FORKU .IFTS& MOV $TKPS,R5 ;;; Get the ticks/second MUL #10.,R5 ;;; multiply * 10V" CMP (R4),R5 ;;; are we in range?- BLO 7$ ;;; if LO, yes, finish the interruptA;+C; If we cannot process a clock interrupt within 10 seconds, we areC>; no longer processing in real time, and we may as well become(; a VAX ... Call an end to this ... NOW!;-; BGCK$A BF.SAN,BE.IDC, ;;; System massively confused 7$: ;;;REFERENCE LABEL .ENDC RETURN ;;;EXIT FROM INTERRUPT!10$: CALL $FORK0 ;;;EXECUTE FORKV;S/; UPDATE ABSOLUTE AND REAL TIME OF DAY AND DATEu;p;+; ** W A R N I N G **r;e; SPM HOOKPOINT NUMBER 67.; ); DO NOT CHANGE THE INSTRUCTION FOLLOWINGn; LABEL WITHOUT CHECKING SPM;-+$SPH67==. ;SPM CHANGES THE INSTRUCTION ATi ;THE LOCATION OF THIS LABELe4UPTIM: MOV #$TKPS+2,R4 ;POINT PAST CONVERSION VECTOR0 MOV #$TTNS+2,R5 ;POINT PAST CURRENT TIME VECTOR#10$: MOV #$TTNS-10,R2 ;POINT TO DAY INC -(R5) ;UPDATE A COUNTER CMP -(R4),(R5) ;EXCEEDED LIMIT? BHI 20$ ;IF HI NOS CLR (R5) ;RESET COUNTERL( 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 MONTH5 MOVB $DYPMN-1(R1),R0 ;GET DAYS FOR NEXT MONTH PLUS 1+ MOV R0,(R4) ;MOVE TO DAYS PER MONTH LIMITV* DEC R1 ;IS CURRENT MONTH ENDING JANUARY? BNE 10$ ;I00}{ibjbkb a a aF NE NON# BIT #3,-(R2) ;IS THIS A LEAP YEAR?# BNE 10$ ;IF NE NO ;+ ;DC506J; We have a potential leap year ... The current year is divisible ;DC506F; by four, now to determine if it is divisible by 100. If not, ;DC5064; this is a leap year, else next test ... ;DC506;- ;DC506. MOV (R2),R1 ; get the current year ;DC506. ADD #1900.,R1 ; correct for reality ;DC506& CLR R0 ; set up for divide ;DC506; DIV #100.,R0 ; determine if the leap year is / 100 ;DC506$& TST R1 ; divisible by 100. ;DC5060 BNE 15$ ; nope, has to be a leap year ;DC506;+ ;DC506I; Now, we have a century ... is the century divisible by 400? If ;DC506t); so, we have a leap year ... ;DC506o;- ;DC506) BIT #3,R0 ; how about by 400. ;DC50661 BNE 10$ ; if NE, nope, not a leap year ;DC506n15$: ;DC506' INC (R4) ;INCREMENT DAYS FOR FEBRUARY6 BR 10$ ;20$: ;REFERENCE LABEL .IF DF R$$PRO) DEC $NVRTM ;TIME TO UPDATE O/S UPTIME ?$ BNE 25$ ;IF NE NOe UPTUP$ ;UPDATE UPTIME25$: ;REFERENCE LABEL .ENDC ; DF R$$PRO) TST $SHFTM ;SHF TIMER ALREADY EXPIRED ?  BEQ 30$ ;IF EQ, YESe3 DEC $SHFTM ;DECREMENT TIMER BLOCKING SHF REQUESTS .30$: INC $ABTIM ;UPDATE ABSOLUTE TIME COUNTER BNE TDS ;IF NE NO OVERFLOW6 INC $ABTIM-2 ;COUNT OVERFLOW IN SECOND WORD OF $ABTIM. 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$ ;;P; TIME DEPENDENT SCHEDULINGR;RTDS: ;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 .IFFN INC @$CKINC ;BUMP TICKER3 ;ABSOLUTE LOCATION 110 OR TPR5 IF CPR ON KXJ-11  .ENDC, 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, YES " CMP $ABTIM,C.TIM(R4) ;TIME TO GO? BLO 11$ ;IF LO, NO/ MOV (R4),$CLKHD ;REMOVE ENTRY FROM CLOCK QUEUER* MOVB C.RQT(R4),R5 ;GET ENTRY REQUEST TYPE+ ADD R5,PC ;DISPATCH TO PROCESSING ROUTINEO10$: BR 20$ ;MARK TIME REQUESTS/ BR 30$ ;TASK REQUEST WITH PERIODIC RESCHEDULEC" BR 30$ ;SINGLE SHOT TASK REQUEST2 BR 12$ ;SINGLE SHOT INTERNAL SUBROUTINE (C.SYST)) BR 15$ ;SINGLE SHOT INTERNAL SUBROUTINE;1); CLEAR STOP BIT AND REALLOCATE PARTITION;;H& MOV C.TCB(R4),R0 ;PICK UP TCB ADDRESS6 CALL $EXRQN ;CLEAR STOP BIT AND REALLOCATE PARTITION BR TDS ;&11$: JMP DVOUT ;JUMP TO DEVICE TIMOUT;V*; SINGLE SHOT INTERNAL SUBROUTINE (TYPE 6);,0; THIS SECTION HANDLES URM SPECIFIC CLOCK BLOCKS12$: ;REFERENCE LABEL .IF DF M$$PRO7 MOV #TDS,-(SP) ;PUSH RETURN ADDRESS FROM EITHER DRIVER, ;(IF WE'RE NOW ON CORRECT CPU) OR $FORK0 ;(IF WE'RE NOT)E; BIT C.URM(R4),@$CPURM ;ARE WE ALREADY ON CORRECT PROCESSORC, BNE 17$ ;IF NE YES, GO CALL THE DRIVER AND ;CONTINUE CLQ SCAN! TST (R4)+ ;POINT PAST LINK WORDE4 MOV C.URM-C.RQT(R4),(R4)+ ;PUT URM IN CORRECT PLACE6 CMP (R4)+,(R4)+ ;POINT PAST LINK AND PC IN FORK BLOCK% CALL $FORK0 ;GET TO RIGHT PROCESSORS$ MOV R3,R4 ;COPY FORK BLOCK POINTER6 SUB #C.TIM,R4 ;POINT BACK TO BEGINNING OF CLOCK BLOCK BR 17$ ;GO MAP DRIVER AND CALL;(G; SINGLE SHOT INTERNAL SUBROUTINE (TYPE 8, ALSO TYPE 6 ON UNIPROCESSOR)R;@ .IFTF ;DF M$$PROY15$: ;REFERENCE LABEL .IFT ;DF M$$PRO6 MOV #TDS,-(SP) ;PUSH RETURN ADDRESS TO SCAN CLQ AGAIN .IFTF ;DF M$$PROE317$: MOV KINAR5,-(SP) ;SAVE KERNEL INSTR ADDR REG 5 .IF DF K$$DAS. MOV KDSAR5,-(SP) ;SAVE KERNEL DATA ADDR REG 5/ MOV C.AR5(R4),KDSAR5 ;MAP DRIVER IN DATA SPACEO .IFTF0 MOV C.AR5(R4),KINAR5 ;MAP DRIVER IN INSTR SPACE;+; ** W A R N I N G **E;N; SPM HOOKPOINT NUMBER 66.;E); DO NOT CHANGE THE INSTRUCTION FOLLOWINGP; LABEL WITHOUT CHECKING SPM;-+$SPH66==. ;SPM CHANGES THE INSTRUCTION ATP ;THE LOCATION OF T00}|t__DATADATADATADATAHIS LABELN( CALL @C.SUB(R4) ;CALL SYSTEM SUBROUTINE .IFT:1 MOV (SP)+,KDSAR5 ;RESTORE KERNEL DATA ADDR REG 5 .ENDC2 MOV (SP)+,KINAR5 ;RESTORE KERNEL INSTR ADDR REG 5 .IFT ;DF M$$PRO RETURN ;  .IFF ;DF M$$PRO BR TDS ; .ENDC ;DF M$$PROD;N; MARK TIME REQUEST*;A320$: MOV C.SRC(R4),R0 ;PICK UP EVENT FLAG MASK WORDO2 MOV C.DST(R4),R1 ;PICK UP EVENT FLAG MASK ADDRESS& MOV C.TCB(R4),R5 ;PICK UP TCB ADDRESS1 CALL $SETMG ;SET EFN AND UNLOCK IF GROUP GLOBALT CLR R5 ;RESET CLOCK BLOCK TYPE' MOV C.AST(R4),R3 ;GET AST TRAP ADDRESS(! BEQ 40$ ;IF EQ NO AST SPECIFIEDD" MOVB C.EFN(R4),R2 ;GET EFN NUMBER. MOV R4,R1 ;COPY ADDRESS OF CLOCK QUEUE ENTRY* TST (R4)+ ;POINT TO CONTROL BLOCK LENGTH3 MOV #C.LGTH,(R4)+ ;SET LENGTH OF AST CONTROL BLOCKK5 MOV #8.*2,(R4)+ ;SET BYTES TO ALLOCATE ON TASK STACKE& MOV R3,(R4)+ ;INSERT AST TRAP ADDRESS+ MOV #1,(R4)+ ;SET NUMBER OF AST PARAMETERS)* MOV R2,(R4) ;INSERT EFN AS AST PARAMETER CALL $QASTT ;QUEUE AST TO TASK BR TDS ;;L; SCHEDULE REQUEST;A+30$: MOV C.TCB(R4),R0 ;GET TASK TCB ADDRESS  .IF NDF N$$DIRD" MOV C.UIC(R4),R1 ;GET REQUEST UIC .IFF1& TSTB C.NAM(R4) ;IS THERE A UIC OR CTX, BNE 35$ ;IF NE, GET UIC FROM CONTEXT BLOCK" MOV C.UIC(R4),R1 ;GET REQUEST UIC BR 37$ ;035$: MOV C.CTX(R4),R1 ;GET CONTEXT BLOCK POINTER' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGE! MOV R1,KISAR6 ;MAP CONTEXT BLOCKT$ TSTB C.DDSL+140000 ;IS THERE A DDS?! BEQ 36$ ;IF EQ, DON'T PROPAGATEQ( MOV R1,$CTXPT ;PROPAGATE CONTEXT BLOCK)36$: MOV C.CUIC+140000,R1;GET REQUEST UICG" MOV (SP)+,KISAR6 ;RESTORE MAPPING37$: ;REFERENCE LABEL .ENDC ;NDF N$$DIR .IF DF A$$CNT. MOV C.UAB(R4),$CKUAB ;GET UAB TO BILL TASK TO .IFTF% CALL $TSKRT ;REQUEST TASK EXECUTIONE .IFTB- CLR $CKUAB ;DO NOT NEED UAB ADDRESS ANYMOREK .ENDC040$: MOV R4,R0 ;SET ADDRESS OF BLOCK TO RELEASE# CMPB #C.SCHD,R5 ;PERIODIC REQUEST?1 BEQ 50$ ;IF EQ YES3 CALL $DCLKA ;DEALLOCATE CLQ BLOCK WITH ACCOUNTING JMP TDS ;N450$: MOV C.RSI+2(R0),R1 ;SET HIGH ORDER PART OF TIME- MOV C.RSI(R0),R2 ;SET LOW ORDER PART OF TIMER MOV R5,R4 ;SET REQUEST TYPE$ .IF DF N$$DIR& TSTB C.NAM(R0) ;IS THERE A UIC OR CTX* BEQ 55$ ;IF EQ, NO CONTEXT BLOCK POINTER1 BIS #100000,R4 ;SET HIGH BIT TO INDICATE CTX PTRO55$: ;REFERENCE LABEL .ENDC ;DF N$$DIR2 MOV C.TCB(R0),R5 ;SET ADDRESS OF REQUEST TASK TCB, CALL $CLINS ;REINSERT ENTRY IN CLOCK QUEUE JMP TDS ;L;L; DEVICE TIME OUT ;C&DVOUT: TST $TTNS ;ONE SECOND ELAPSED? BNE ROBIN ;IF NE NOGC MOV #$SCDVT,-(SP) ;SET ADDRESS OF DEVICE TABLE SCANNING CO-ROUTINE'10$: CALL @(SP)+ ;GET NEXT UCB ADDRESS  BCS ROBIN ;IF CS END OF TABLER" MOV S.KRB(R4),R2 ;GET KRB ADDRESS BEQ 11$ ;IF EQ NO KRBB* MTPS K.PRI(R2) ;;;SET THE DEVICE PRIORITY!11$: TSTB U.STS(R5) ;;;UNIT BUSY?N BPL 20$ ;;;IF PL NOC" TSTB S.CTM(R4) ;;;TIMEOUT ACTIVE? BEQ 20$ ;IF EQ NOS .IF DF M$$PRO7 CMPB #377,S.CTM(R4) ;WAITING FOR INTERPROCESSOR FORK ?+ BEQ 20$ ;IF EQ YES, DON'T TOUCH INTERLOCKE .ENDC ; DF M$$PRO* DECB S.CTM(R4) ;;;DECREMENT TIMEOUT COUNT% BNE 20$ ;;;IF NE -- MORE TIME TO GO ;N6; DRIVER HAS TIMED OUT. CALL HIM AT HIS TIMEOUT ENTRY.;K .IF DF M$$PRO/ DECB S.CTM(R4) ;;;SET TIMED OUT FLAG FOR LATER;" MOV #12$,R3 ;;;SET UP FOR $EXDOP, CALL $EXDOP ;;;CALL ROUTINE TO CALL DRIVER;TA; AT THIS POINT, IF DOESNT HAVE A KRB ADDRESS, THEN HE WAS CALLED$"; BECAUSE OF THE WAY $EXDOP WORKS.;O20$: MTPS #0 ;;;LOWER PRIORITY  BR 10$ ;GO BACK FOR MORE;:; INTERNAL SUBROUTINE TO CALL DRIVER AT HIS TIMEOUT ENTRY.<; THIS SUBROUTINE IS EXECUTED ON THE CPU TO WHICH THE DRIVER; IS ATTACHED.;L&12$: MOV (R5),R3 ;RESTORE DCB ADDRESS" MOV S.KRB(R4),R2 ;GET KRB ADDRESS BEQ 13$ ;IF EQ NO KRB$ MTPS K.PRI(R2) ;SET DEVICE PRIORITY'13$: TSTB U.STS(R5) ;;;UNIT STILL BUSY?R' BPL 30$ ;;;IF PL NO -- DON'T CALL HIM 2 TSTB S.CTM(R4) ;;;DO WE STILL SHOW HIM TIMED OUT?' BPL 30$ ;;;IF PL NO -- DON'T CALL HIML% CLRB S.CTM(00"}{ibjbkb a a aR4) ;;;SHOW HIM TIMED OUTO .ENDC; MOV #IE.DNR&377,R0 ;;;SET DEVICE NOT READY STATUS FOR DRVRH9 MOV D.DSP(R3),R1 ;;;GET ADDRESS OF DRIVER DISPATCH TABLE 1 MOV KINAR5,-(SP) ;;;SAVE KERNEL INSTR ADDR REG 5A .IF DF K$$DAS0 MOV KDSAR5,-(SP) ;;;SAVE KERNEL DATA ADDR REG 5 .IFTF+ MOV D.PCB(R3),R3 ;;;GET DRIVER PCB ADDRESS;) BEQ 15$ ;;;IF EQ DRIVER IS PART OF EXEC-6 MOV P.REL(R3),KINAR5 ;;;MAP THE DRIVER IN INSTR SPACE .IFTU5 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;L8; CALL DRIVER AT TIMEOUT ENTRY POINT WITH THE ARGUMENTS:;.$; R0=DEVICE TIMEOUT STATUS 'IE.DNR'.; R2=ADDRESS OF DEVICE CSR.; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.;'; R5=ADDRESS OF THE UNIT CONTROL BLOCK.L;)&; IF S.KRB=0 THEN R2, R3 ARE UNDEFINED;;+; ** W A R N I N G **R;;; SPM HOOKPOINT NUMBER 64.;); DO NOT CHANGE THE INSTRUCTION FOLLOWINGA; LABEL WITHOUT CHECKING SPM;-+$SPH64==. ;SPM CHANGES THE INSTRUCTION AT( ;THE LOCATION OF THIS LABEL%17$: CALL @D.VOUT(R1) ;;;ENTER DRIVERH .IFTT3 MOV (SP)+,KDSAR5 ;;;RESTORE KERNEL DATA ADDR REG 5E .ENDC4 MOV (SP)+,KINAR5 ;;;RESTORE KERNEL INSTR ADDR REG 5 .IF DF M$$PRO!30$: MTPS #0 ;;;ALLOW INTERRUPTSK RETURN  .IFF0!20$: MTPS #0 ;;;ALLOW INTERRUPTS BR 10$ ;GO FOR SOME MORE .ENDC;U(; EXECUTIVE LEVEL ROUND ROBIN SCHEDULING; ROBIN: ;REF LABEL .IF DF R$$NDC DEC $RNDCT ;TIME TO SCHEDULE?S BNE SWAP ;IF NE NO5 MOV $RNDC,$RNDCT ;RESET CLOCK TICKS TO NEXT INTERVALE1 MOV #SWAP,-(SP) ;ASSUME DIRECT EXIT TO DISK SWAPO .IF DF M$$PRO1 MOV #60$,-(SP) ;THIS WILL PREVENT MULTIPLE CALLSK( ;TO $DRDSE IF MULTIPLE RUNNING TASKS ;ARE MOVED.  .ENDC ; DF M$$PRO5 MOV #$ACTHD-T.ACTL,R1 ;SET ADDRESS OF PREVIOUS ENTRY/10$: MOV R1,R0 ;SAVE ADDRESS OF PREVIOUS ENTRYX- MOV T.ACTL(R0),R1 ;GET ADDRESS OF NEXT ENTRYI BEQ 60$ ;IF EQ END OF LIST) CMPB $RNDH,T.PRI(R1) ;PRIORITY IN RANGE? BLO 10$ ;IF LO NO-20$: CMPB $RNDL,T.PRI(R1) ;PRIORITY IN RANGE?T BHI 60$ ;IF HI NOS .IF NDF M$$PROT TST T.STAT(R1) ;TASK BLOCKED? .IFF0( BIT #^CTS.RUN,T.STAT(R1) ;TASK BLOCKED? .ENDC BNE 30$ ;IF NE YES& BIT #T2.SPN!T2.STP!T2.WFR,T.ST2(R1) ; BEQ 40$ ;IF EQ NOT+30$: MOV R1,R0 ;SAVE ADDRESS OF LAST ENTRY:- MOV T.ACTL(R0),R1 ;GET ADDRESS OF NEXT ENTRYM BR 20$ ;40$: TST T.ACTL(R1) ;NULL TASK? BEQ 60$ ;IF EQ YES .IF NDF M$$PRO,+ CMP R1,$TKTCB ;ABOUT TO MOVE CURRENT TASK?O BNE 45$ ;IF NE NO,2 MOV #$DRDSE,-(SP) ;FORCE SIGNIFICANT EVENT AT END .IFF ; NDF M$$PRO7 BIT #TS.RUN,T.STAT(R1) ;TASK RUNNING ON SOME PROCESSORR BEQ 45$ ;IF EQ NOL1 MOV #$DRDSE,(SP) ;FORCE SIGNIFICANT EVENT AT END2 .ENDC ; DF M$$PRO945$: MOV T.ACTL(R1),T.ACTL(R0) ;REMOVE TCB FROM TASK LIST MOV R1,R2 ;SAVE ADDRESS OF TCB& MOV R0,R1 ;SET ADDRESS OF LAST ENTRY+50$: MOV R1,R0 ;SAVE ADDRESS OF LAST ENTRY - MOV T.ACTL(R0),R1 ;GET ADDRESS OF NEXT ENTRYB2 CMPB T.PRI(R1),T.PRI(R2) ;IN SAME PRIORITY CLASS? BEQ 50$ ;IF EQ YES/ MOV R2,T.ACTL(R0) ;SET ADDRESS OF NEXT IN LASTP8 MOV R1,T.ACTL(R2) ;SET ADDRESS OF NEXT IN REMOVED ENTRY& MOV R2,R0 ;SET ADDRESS OF LAST ENTRY BR 20$ ;260$: RETURN ;TO SWAP, WITH POSSIBLE INTERMEDIATE ;STOP AT $DRDSEC .ENDC;TF; DISK SWAPPING ALGORITHM - REDUCE SWAPPING PRIORITY OF RESIDENT TASKS;ESWAP: ;REF LABELM .IF DF S$$WPC1 DEC $SWPCT ;TIME TO MODIFY SWAPPING PRIORITIES?F BNE 70$ ;IF NE NO.: MOV $SWPC,$SWPCT ;RESET CLOCK TICKS TO NEXT SWAP INTERVAL0 MOV $PARHD,R5 ;POINT TO PARTITION LIST LISTHEAD+10$: TST P.SUB(R5) ;ANY MORE SUBPARTITIONS?  BEQ 20$ ;IF EQ NOV1 MOV P.SUB(R5),R5 ;POINT TO NEXT SUBPARTITION PCB0< BIT #PS.FXD!PS.CHK!PS.CKP!PS.CKR!PS.OUT!PS.COM,P.STAT(R5) ;1 BNE 10$ ;IF NE NOT CHECKPOINTABLE RESIDENT TASK ' MOV P.HDR(R5),R4 ;POINT TO TASK HEADERS .IF D00*}5}t__DATADATADATADATAF X$$HDR BNE 15$ ;IF NE RESIDENT HEADER- MOV P.REL(R5),KISAR6 ;MAP TO EXTERNAL HEADERS MOV #140000,R4 ;AND POINT TO IT .IFTF ; DF X$$HDR515$: CLR R0 ;CALCULATE THE MINIMUM SWAPPING PRIORITYR SUB $SWPR,R0 ;E .ENDC ; DF X$$HDR2 CMPB H.SPRI(R4),R0 ;SWAPPING PRIORITY AT MINIMUM? BLE 10$ ;IF LE YES* DECB H.SPRI(R4) ;REDUCE SWAPPING PRIORITY BR 10$ ;.20$: MOV P.MAIN(R5),R5 ;POINT BACK TO MAIN PCB" MOV R5,R0 ;COPY MAIN PCB POINTER. CALL $NXTSK ;ATTEMPT TO REALLOCATE PARTITION% MOV (R5),R5 ;POINT TO NEXT MAIN PCBD BNE 10$ ;IF NE THERE IS ONET70$: ;REF LABEL .ENDC;AP; EXIT TIME DEPENDENT SCHEDULE IF THERE ARE NOT REMAINING UNPROCESSED CLOCK TICK;P.TIMXT: DEC $INTCT ;ANY MORE TICKS TO PROCESS? BGE 10$ ;IF GE YES RETURN ; 10$: JMP UPTIM ;?;+ ; **-$NLTMO-NULL TIMEOUT ROUTINE;ED; THIS ROUTINE MAY BE SPECIFIED AS THE TIMEOUT ROUTINE IN A DRIVER'SG; DISPATCH TABLE. IT SIMPLY BYPASSES ALL UNITS ON THE CURRENT DCB WHENT ; CALLED.E;R ; INPUTS:V;5'; AS FOR NORMAL DRIVER TIMEOUT ROUTINE. ; ; OUTPUTS:;T?; CURRENT DCB IS NO LONGER CONSIDERED FOR CURRENT TIMEOUT SCAN.E;-$NLTMO:: ;REFERENCE LABELR .IF DF K$$DAS. CLR S$$SPC+4(SP) ;FORCE $SCDVT ON TO NEXT DCB .IFF ; DF K$$DASE. CLR S$$SPC+2(SP) ;FORCE $SCDVT ON TO NEXT DCB .ENDC ; DF K$$DAS2 INCB S.CTM(R4) ;RESET TIMEOUT COUNT FOR NEXT TIME RETURN ;I .END; DISPATCH TABLE. IT SIMPLY BYPASSES ALL UNITS ON THE CURRENT DCB WHENT ; CALLED.E;R ; 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 P2 MTPS #TTPRI ;;; Insure we are at device priority/ MOV $TTUQP,R4 ;;;GET POINTER TO UCB QUEUE HEADR) LOCK$ -LK.SPN(R4),SPIN ;;;LOCK UCB QUEUEC E .IFF  E) MOV #$TTUQ,R4 ;;;POINT TO UCB QUEUE HEADE  .IFTF K' MOV (R4)+,R5 ;;;GET FIRST UCB IN QUEUEC BEQ 20$ ;;;NONE - RETURN MOV @R5,-(R4) ;;;DEQUEUE UCB; BNE 40$ ;;;NOT LAST - JUMP7 MOV R4,2(R4) ;;;LAST UCB DEQUEUED - UPDATE PTR TO LASTC/40$: INC @R5 ;;;SHOW UCB NOT IN QUEUE ANY MORET . .IFT  ;, 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 - J00:}{ibjbkb a a aUMP ! 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(R4),@$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 POI00B}D}t__DATADATADATADATANTER 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)+ ;;;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 .TITLE MDSUBH .IDENT /16.00/S;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.H; 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 4-AUG-73;+; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:T;A ; J. R. (LITTLE RALPHY) KAUFFMAN;U+; MODIFIED FOR RSX-11M-PLUS VERSION 4.3 BY:T;B!; B. S. MCCARTHY 28-JUN-89 15.00G;;8; BM421 -- ENHANCE DOCUMENTATION OF $VOLVD, ADD ABILITY0; TO RESET VOLUME VALID OF A MOUNTED VOLUME AS2; LONG AS IT HAS NO ACP. THIS ALLOWS THE BRU FIX3; TO THE RX50 DOOR PROBLEM ON VAX-COPROCESSOR/RSXL!; TO WORK ON STOCK RSX SYSTEMS. ;Y+; Modified for RSX-11M-PLUS Version 4.5 by:.; ; D. Carroll 22-May-1990 15.10 ;; DC123 - Include support to track shadow recording errorsL'; detected on a shadow pair in $SHSAVX;M; D. Carroll 19-Oct-1993 15.11S8; DC241 - Include correction to allow $CVLBN to handle "; quotients of 16 bit magnitude.;O"; D. Carroll 04-August-1994 15.125; DC298 - Correct $DLNK subroutine to not deallocateF-; the UMB if other packets are present whenS+; delinking the last ML node in the list.;$; Modified for RSX-11M-PLUS V4.6 by:;y; D. Carroll 18-Oct-1995 15.13 7; DC404 - Include PSECT statement to allow ICB pool toi#; be fully extended during sysgenp; ; D. Carroll 08-Jan-1996 16.00O2; DC430 - Include support for 32-bit LBN devices ; and 2,4 retreival pointers; ;1; I/O RELATED ROUTINES;C4; ROUTINES USED BY FILES-11 AND MASS STORAGE DRIVERS;b; MACRO LIBRARY CALLSt;8 .MCALL F11DF$,HDRDF$,HWDDF$,PCBDF$,PKTDF$,SHDDF$,TCBDF$/ F11DF$ ;DEFINE WINDOW AND LOCK BLOCK OFFSETSf% HDRDF$ ;DEFINE TASK HEADER OFFSETSo$ HWDDF$ ;DEFINE HARDWARE REGISTERS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSf$ PKTDF$ ;DEFINE I/O PACKET OFFSETS* SHDDF$ ;DEFINE SHADOW RECORDING OFFSETS, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;DC404;+&; **-$DEATR-DEALLOCATE ATTRIBUTE BLOCK;bC; THIS ROUTINE IS CALLED TO DEALLOCATE AN ATTRIBUTE BLOCK ALLOCATEDK2; BY QIO PROCESSING OF A USER FILE ATTRIBUTE LIST.;L ; INPUTS:f;H ; R0=ADDRESS OF ATTRIBUTE BLOCK.; ; OUTPUTS:;N;; ALL I/O COUNTS ASSOCIATED WITH THE BLOCK ARE DECREMENTED.C;-+$DEATR::MOV R0,-(SP) ;SAVE ADDRESS OF BLOCKS* MOV #6,-(SP) ;SET MAX COUNT OF ATTRIBUTES,60$: TSTB (R0) ;IS THERE ANOTHER ATTRIBUTE? BEQ 70$ ;IF EQ NOP& MOV R0,-(SP) ;SAVE POINTER INTO BLOCK- MOV 2(R0),R0 ;POINT TO ATTACHMENT DESCRIPTOR" CALL $DECIO ;DECREMENT I/O COUNT4 MOV (SP)+,R0 ;RESTORE POINTER INTO ATTRIBUTE BLOCK* ADD #8.,R0 ;POINT TO NEXT ENTRY IN BLOCK DEC (SP) ;ANY MORE TO GO?T BNE 60$ ;IF NE YES70$: TST (SP)+ ;POP COUNT$ MOV (SP)+,R0 ;RESTORE BLOCK POINTER% MOV #I.ATRL,R1 ;SET COUNT TO RELEASEA+ CALLR $DEACB ;DEALLOCATE BLOCK AND RETURNC;+;; **-$CVLBN-CONVERT LOGICAL BLOCK NUMBER TO DISK PARAMETERSB;7A; THIS SUBROUTINE WILL CON00J}{ibjbkb a a aVERT THE SPECIFIED LOGICAL BLOCK NUMBERR%; TO A SECTOR/TRACK/CYLINDER ADDRESS.L;D ; INPUTS:E;T; (SAME AS $BLKCK OUTPUTS); R0=LOW PART OF LBN; R2=HIGH PART OF LBN.; R3=I/O PACKET ADDRESS ; R5=UCB ADDRESS;; ; OUTPUTS:;T; R0=SECTOR NUMBER; R1=TRACK NUMBER ; R2=CYLINDER NUMBER;-#$CVLBN::MOV R0,R1 ;SHUFFLE LOW LBN  MOV R2,R0 ;SHUFFLE HIGH LBN$4 MOVB U.PRM(R5),R2 ;SET DIVISOR TO SECTORS PER TRACK+ MOV R0,-(SP) ; SAVE HIGH ORDER LBN PORTIONT) MOV R1,-(SP) ; AND LOW ORDER LBN PORTIONE% DIV R2,R0 ; CALCULATE SECTOR NUMBERA) BVC 10$ ; IF VC, NO OVERFLOW OF 15 BITSU% MOV (SP)+,R0 ; RESTORE LOW ORDER LBN & MOV (SP)+,R1 ; AND HIGH ORDER PORTION% CALL $DBDIV ; PERFORM DOUBLE DIVIDEA! TST (PC)+ ; SKIP STACK CLEAN UPC"10$: MOV (SP)+,(SP)+ ; CLEAN STACK! MOV R1,-(SP) ;SAVE SECTOR NUMBER  MOV R0,R1 ;SET NEW DIVIDENDR CLR R0 ;CLEAR HIGH BITSM8 MOVB U.PRM+1(R5),R2 ;SET DIVISOR TO TRACKS PER CYLINDER) DIV R2,R0 ;CALCULATE TRACK AND CYLINDERV! MOV R0,R2 ;COPY CYLINDER NUMBERO% MOV (SP)+,R0 ;RETREIVE SECTOR NUMBERE RETURN ; ;+'; **-$BLKCK-LOGICAL BLOCK CHECK ROUTINE 9; **-$BLKC1-LOGICAL BLOCK CHECK ROUTINE (ALTERNATE ENTRY)RG; **-$BLKC2-LOGICAL BLOCK CHECK ROUTINE (ALTERNATE ENTRY FOR QUEUE OPT)E;UD; THIS ROUTINE IS CALLED BY I/O DEVICE DRIVERS TO CHECK THE STARTING?; AND ENDING LOGICAL BLOCK NUMBERS OF AN I/O TRANSFER TO A FILEE; STRUCTURED DEVICE. IF THE RANGE OF BLOCKS IS NOT LEGAL, THEN $IODONC@; IS ENTERED WITH A FINAL STATUS OF "IE.BLK" AND A RETURN TO THEB; DRIVER'S INITIATOR ENTRY POINT IS EXECUTED. ELSE A RETURN TO THE; DRIVER IS EXECUTED. ;TD; $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;B ; INPUTS:E;I; R1=ADDRESS OF I/O PACKET. ; R5=ADDRESS OF THE UCB.;E ; OUTPUTS:;A@; IF THE CHECK FAILS, THEN $IODON IS ENTERED WITH A FINAL STATUS@; OF "IE.BLK" AND A RETURN TO THE DRIVER'S INITIATOR ENTRY POINT; IS EXECUTED.;TB; IF THE CHECK SUCCEEDS, THEN THE FOLLOWING REGISTERS ARE RETURNED'; R0=LOW PART OF LOGICAL BLOCK NUMBER.R/; R1=POINTS TO I.PRM+12 (LOW PART OF USER LBN)N(; R2=HIGH PART OF LOGICAL BLOCK NUMBER.; R3=ADDRESS OF I/O PACKET.;- .ENABL LSB 2$BLKC2::MOV #1,-(SP) ;FLAG THIS AS THE BLKC2 ENTRY BR 4$ ;CONTINUEE/$BLKCK::CLR -(SP) ;FLAG THIS AS A NORMAL ENTRYK*4$: MOV R1,R3 ;SAVE ADDRESS OF I/O PACKET. .IF DF,E$$LBN ;EXTENDED LBN SUPPORT ;DC4307 ADD #I.PRM+12,R1 ;POINT PAST HIGH PART OF LBN ;DC430E; BIT #DV.32B,U.CW1(R5) ; DEVICE SUPPORT 32-BIT LBNS ;DC430=) BNE BLKC3 ;YES, DON'T ZERO IT ;DC430O* CLRB -1(R1) ;CLEAR EXCESS BYTE ;DC430 .IFF ;DF,E$$LBN ;DC430N7 ADD #I.PRM+11,R1 ;POINT PAST HIGH PART OF LBN ;DC430) CLRB (R1)+ ;CLEAR EXCESS BYTE ;DC430K .ENDC ;DF,E$$LBN ;DC430, BR BLKC3 ;SKIP THE ALTERNATE ENTRY ;**-2/$BLKC1::CLR -(SP) ;FLAG THIS AS A NORMAL ENTRYF(BLKC3: MOV (R1),R0 ;GET LOW PART OF LBN# MOV -(R1),R2 ;GET HIGH PART OF LBNP7 MOV I.PRM+4(R3),-(SP) ;GET NUMBER OF BYTES TO TRANSFERP# ADD #777,(SP) ;ROUND TO NEXT BLOCK 3 ROR (SP) ;CALCULATE NUMBER OF BLOCKS IN HIGH BYTEE CLRB (SP) ;CLEAR EXCESS BYTE2 SWAB (SP) ;CALCULATE NUMBER OF BLOCK IN TRANSFER1 ADD (SP)+,R0 ;CALCULATE HIGHEST BLOCK NUMBER + 1E7 .IF DF,E$$LBN ; EXTENDED LOGICAL BLOCK NUMBERS ;DC430L* ADC R2 ; DOUBLE PRECISION CARRY ;DC430% BCS 20$ ; IF CS, OVERFLOW ;DC430N: MOV U.CW2(R5),-(SP) ; SAVE THE DEVICE SIZE (MSP) ;DC4303 BIT #DV.32B,U.CW1(R5) ; USING 32-BIT LBNS ;DC430 / BNE 5$ ; IF NE, YES, DO FULL COMPARE ;DC430N5 CLRB 1(SP) ; ZERO HIGH ORDER PORTION OF LBN ;DC430S+5$: CMP R2,(SP)+ ; DO THE COMPARE ;DC430E .IFF ;DF,E$$LBN ;DC430 ADCB R2 ;R% BCS 20$ ;IF CS ILLEGAL BLOCK NUMBERT+ CMPB R2,U.CW2(R5) ;HIGH PART OF LBN LEGAL?  .ENDC ;DF,E$$LBN ;DC430 BHI 20$ ;IF HI NOC BLO 10$ ;IF LO YES) CMP R0,U.CW3(R5) ;LOW PART OF LBN LEGAL?V BHI 20$ ;IF HI NOV,10$: MOV (R1)+,R2 ;RETRIEVE HIGH PART OF LBN' MOV (R100R}D}t__DATADATADATADATA),R0 ;RETRIEVE LOW PART OF LBN TST (SP)+ ;CLEAN THE STACK RETURN ;C$20$: TST (SP)+ ;TEST THE ENTRY FLAG+ BEQ 30$ ;RETURN TO THE DRIVER'S INITIATOR - TST (SP)+ ;REMOVE DRIVERS EXTRA STACK ENTRY;6 MOV #$QOPDN,(SP) ;SETUP FOR QUEUE OPTIMIZATION RETURN) MOV #IE.BLK&377,R0 ;SET FINAL I/O STATUSL% CALLR $IOFIN ;AND FINISH UP THE I/O,30$: MOV (R5),R0 ;GET ADDRESS OF DEVICE DCB9 MOV @D.DSP(R0),(SP) ;REPLACE RETURN ADDRESS TO INITIATORN) MOV #IE.BLK&377,R0 ;SET FINAL I/O STATUSF" JMP $IOALT ;AND COMPLETE THE I/O .DSABL LSBT;+=; **-$SHFND-FIND SHADOW RECORDING PACKET ON UMB ML NODE LIST.RH; **-$SHFN1-FIND SHADOW RECORDING PACKET ON UMB ML NODE LIST (ALT ENTRY);V>; 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 PACKETL; SPECIFIED AS INPUT.U;H ; INPUTS::;V,; R3=I/O PACKET ADDRESS FOR WHICH TO SEARCH.; R5=UCB ADDRESS.C;E ; OUTPUTS:; #; C=0 (SUCCESS -- FOUND I/O PACKET)F;L; R2=OTHER I/O PACKET. ; R4=ML NODE ADDRESS.;.1; C=1 (FAILURE -- NO PACKET OR DISK NOT SHADOWED) ;K; R2,R4 DESTROYED.T; ; ALL OTHER REGISTERS PRESERVED.;- .IF DF S$$HDW .ENABL LSB>$SHFND::BIT #DV.MSD,U.CW1(R5) ;IS THIS A MASS STORAGE DEVICE?/ BEQ 30$ ;IF EQ NO -- CAN'T SHADOW THIS DEVICES6$SHFN1::BIT #DV.SQD,U.CW1(R5) ;COULD IT BE A MAGTAPE?$ BNE 30$ ;IF NE YES -- CAN'T SHADOW;S?; THE ABOVE STATEMENTS DEFINE THOSE DEVICES WHICH HAVE THE CELL <; U.UMB IN THEIR UCB'S. NOW SEE IF U.UMB IS NON-ZERO, WHICH0; MEANS THE DEVICE IS CURRENTLY SHADOW RECORDED.;O" MOV U.UMB(R5),R4 ;GET UMB ADDRESS/ BEQ 30$ ;IF EQ NO UMB, THEREFORE NOT SHADOWED.; B; SHADOW RECORDING IS ENABLED ON THIS DISK. NOW SEE IF THE PACKETC; SPECIFIED IS FROM THE REPLACEMENT CONTROL TASK AND IF IT IS, SKIP ; OVER IT.;.3 CMP $RCTPT,I.TCB(R3) ;IS THIS I/O PACKET FOR RCT?E BEQ 30$ ;IF EQ YES, EXIT; H; THE SPECIFIED PACKET IS NOT FROM THE REPLACEMENT CONTROL TASK. NOW SEE5; IF THE PACKET SPECIFIED IS IN THE LIST OFF THE UMB. ; 1 ADD #M.LHD+ML.PKT,R4 ;START SCAN AT PROPER PLACEB/10$: MOV ML.LNK-ML.PKT(R4),R4 ;GET NEXT ML NODET BEQ 30$ ;IF EQ NONE LEFT. MOV ML.PRI(R4),R2 ;GET PRIMARY PACKET ADDRESS& CMP R2,R3 ;IS THIS THE INPUT PACKET? BEQ 20$ ;IF EQ YES2 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 AGAIN5 SUB #ML.PKT,R4 ;MOVE BACK TO MAKE R4=ADDRESS ML NODET BR 25$S(20$: MOV R4,R2 ;COPY I/O PACKET ADDRESS* ADD #ML.PKT,R2 ;POINT TO SECONDARY PACKET25$: CLC ;SHOW SUCCESS RETURN030$: SEC ;SHOW FAILURE RETURNX .DSABL LSBB;+6; **-$DLNK-DELINK AN ML NODE FROM THE LIST IN THE UMB.;A>; THIS ROUTINE WILL DELINK THE SPECIFIED ML NODE FROM THE LIST#; OF ML NODES IN THE SPECIFIED UMB.D; ; INPUTS:O;; R3=I/O PACKET ADDRESS. ; R4=ML NODE.?;B ; OUTPUTS:;N"; NODE SPECIFED IN R4 IS DELINKED.;R; REGISTERS R2,R3 DESTROYED.;-1$DLNK:: MOV I.UCB(R3),R3 ;GET UCB ADDRESS FOR UMBD( MOV R3,-(SP) ;SAVE UCB ADDRESS ON STACK+ MOV U.UMB(R3),R3 ;GET UMB ADDRESS FROM UCB0! ADD #M.LHD,R3 ;POINT TO LISTHEAD.10$: MOV R3,R2 ;SAVE LAST NODEN MOV (R3),R3 ;GET NEXT NODE BNE 20$ ;IF NE THERE IS ONEL% BPT ;DEBUGGING BPT -- CAN'T DELINK  ;NODE NOT FOUNDN!20$: CMP R3,R4 ;IS THIS THE ONE?O BNE 10$ ;IF NE NO -- TRY AGAIN MOV (R3),(R2) ;DELINK THE NODE# BNE 30$ ;IF EQ LIST NOT YET EMPTYR;EB; THE LIST IS EMPTY. SEE IF WE ARE SUPPOSED TO DEALLOCATE THE UMB.;S# MOV (SP),R3 ;GET UCB ADDRESS BACKR" MOV U.UMB(R3),R2 ;GET UMB ADDRESS7 BIT #MS.MDA,M.STS(R2) ;IS UMB MARKED FOR DEALLOCATION?. BEQ 30$ ;IF EQ NO -- EXIT NOWN2 TST M.LHD(R2) ; ARE THERE ANY OTHER PACKETS LEFT?. BNE 30$ ; YES, DO NOT DELETE THE UMB YET ...; C; UMB IS MARKED FOR DEALLOCATION. WE WILL NOW RELEASE THE STORAGE,E,; AND REMOVE THE TWO POINTERS FROM THE UCBS.;# MOV M.UCBS(R2),R3 ;GET PRIMARY UCB! CLR U.UMB(R3) ;CLEAR PRIMARY UCBE' MOV M.UCBS+2(R2),R3 ;GET SECONDARY UCB# C00Z}{ibjbkb a a aLR U.UMB(R3) ;CLEAR SECONDARY UCBR MOV R0,-(SP) ;SAVE STATUS MOV R1,-(SP) ;SAVE R1;R6; WE MUST DELINK THE UMB FROM THE SYSTEM LIST OF UMB'S;-" MOV #$SHUMB,R0 ;GET START OF LIST-25$: MOV R0,R1 ;MAKE CURRENT THE NEW OLD PTR " MOV (R1),R0 ;GET NEW CURRENT PTR .IF DF R$$DER BNE 27$ ;IF NE NOT END OF LIST# BPT ;OOPPS -- CNT'T FIND IN LISTT27$: ;REFERENCE LABEL .ENDC CMP R0,R2 ;IS THIS THE NODE? BNE 25$ ;IF NE NO ) MOV (R2),(R1) ;DELINK NODE FROM UMB LISTC( MOV #M.LGH,R1 ;SET LENGTH TO DEALLOCATE MOV R2,R0 ;SET ADDRESS OF UMBR CALL $DEACB ;DEALLOCATE UMBS MOV (SP)+,R1 ;RESTORE R1Y MOV (SP)+,R0 ;RESTORE R0M-30$: TST (SP)+ ;CLEAN UCB ADDRESS FROM STACK1 RETURNU;+/; **-$SHSAV-SAVE CURRENT STATUS IN THE ML NODE.P;>; 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/OC$; PACKETS FINISHED FOR THIS ML NODE.;E ; INPUTS:E; ; R0=FIRST STATUS WORD.N; R1=SECOND STATUS WORD.; R3=I/O PACKET ADDRESS.; R4=ML NODE ADDRESS.S; R5=UCB ADDRESS.;L ; OUTPUTS:;L7; COUNT OF FINISHED I/O PACKETS FOR THIS ML NODE IS ONES8; GREATER. STATUS SAVED IN I/O PACKET. IF THE STATUS IS1; ERROR, THEN THE UMB ERROR COUNT IS INCREMENTED.T;M>; In addition, if we are able to disable devices in the shadowD; pair, a check will be done, and if so, the device will be disabled<; from further reads. However, writes will still be shadowed;; ALL REGISTERS PRESERVED.;-1$SHSAV::INCB ML.DNC(R4) ;SHOW ONE PACKET FINISHED  MOV R0,I.R0(R3) ;SAVE STATUSS MOV R1,I.R1(R3) ;SAVE STATUS $ .IF DF,S$$HLS ; shadow load sharing! MOV R2,-(SP) ; Save R2 for a bitI6 MOV #,R2 ; Assume primary device/ CMP R3,ML.PRI(R4) ; Is this the primary packet " BEQ 5$ ; if EQ, yes, was primary5 MOV #,R2 ; Set secondary devicev'5$: MOV R5,-(SP) ; Save the UCB address + MOV U.UMB(R5),R5 ; Get the ML node address  .IFTF ;DF,S$$HLSE( TSTB R0 ;WAS THE OPERATION SUCCESSFUL? BPL 20$ ;IF PL, YESV .IFF ;DF,S$$HLS# MOV R5,-(SP) ;SAVE THE UCB ADDRESS * MOV U.UMB(R5),R5 ;GET THE ML NODE ADDRESS .IFT ;DF,S$$HLS/ TSTB M.STS(R5) ; do we perform load balancing?s4 BPL 10$ ; if PL, nope, don't check for disable ...* MOVB M.FLG(R5),-(SP) ; get the flags byte& MOV R2,-(SP) ; save the mask word ...9 BIC #^C,(SP) ; isolate down to an increment maskd+ ADD (SP)+,(SP) ; perform the increment ...d* BITB R2,(SP) ; did we overflow the mask?1 BEQ 6$ ; if EQ, yes, we did try the disable ....5 MOVB (SP)+,M.FLG(R5) ; reset the updated error countM$ BR 7$ ; and rejoin common code ...#6$: TST (SP)+ ; clean up the stack 2 BICB R2,M.FLG(R5) ; reset the counter to zero ...3 BITB #MS.DSB,M.STS(R5) ; Can we disable a device?, BEQ 7$ ; if EQ, nope ...2 BITB #MS.CHP,M.STS(R5) ; are we doing an update?0 BNE 7$ ; if NE, yes, don't disable the primary& SWAB R2 ; set up the disable bit ...3 BISB R2,M.STS(R5) ; disable the appropriate device 2 MOV #,-(SP) ; set up the mask word# BIC R2,(SP) ; get the "other" bitr: BICB (SP)+,M.STS(R5) ; so we don't disable both devices&7$: .IFTF ;DF,S$$HLS ; reference label* INCB M.ERC(R5) ;INCREMENT THE ERROR COUNT! BNE 10$ ;IF NE, DIDN'T OVERFLOW ' DECB M.ERC(R5) ;LOCK THE COUNT AT 255.B= BISB #MF.DSE,M.FLG(R5) ; disable SHE... logging at the point *10$: MOV (SP)+,R5 ;RESTORE THE UCB ADDRESS .IFT ;DF,S$$HLS, MOV (SP)+,R2 ; Restore the scratch register RETURN ; To callerM;+B; Succesful I/O completion, the drive isn't fatally wounded ...'; Re-enable the device for further I/O. ;-020$: SWAB R2 ; settup for a full word clear ...0 BIC R2,M.STS(R5) ; Re-enable I/O to this device BR 10$ ; and finish up .IFF ;DF,S$$HLS20$: RETURN ;TO CALLER .ENDC ;DF,S$$HLS2;+D; **-$CKLBN-DETERMINE IF LBN RANGE IN AN ML NODE IS BELOW THE FENCE.;M:; THIS ROUTINE WILL DETERMINE IF A RANGE OF LOGICAL BLOCKS8; SPECIFIED IN AN ML NODE IS BELOW THE FENCE IN THE 00b}D}t__DATADATADATADATAUMB.;e ; INPUTS: ;c; R4=ML NODE ADDRESS.t; R5=UMB ADDRESS.l;w ; OUTPUTS:;e9; C=0 IF THE LBN RANGE IN THE ML NODE IF BELOW THE FENCE.e;-$CKLBN::MOV R0,-(SP) ;SAVE R0R MOV R1,-(SP) ;SAVE R1 .IF DF,E$$LBN ;DC430;8 MOV ML.LBN(R4),R0 ; GET HIGH ORDER PART OF LBN ;DC430 .IFF ;DF,E$$LBN ;DC430*3 MOVB ML.LBN(R4),R0 ;GET HIGH BYTE OF LBN ;DC430  .IFTF ;DF,E$$LBN ;DC4303 MOV ML.PKT+I.PRM+4(R4),R1 ;GET BYTE COUNT ;**-1E% ADD #777,R1 ;ROUND UP TO NEXT BLOCKH ROR R1 ;CONVERT TO WORDS CLRB R1 ;CLEAR RESIDUAL BITS, SWAB R1 ;SWAP NUMBER OF BLOCKS TO LOW BYTE4 ADD ML.LBN+2(R4),R1 ;CALCALATE LAST LBN IN TRANSFER ADC R0 ; .IFT ;DF,E$$LBN ;DC430 ) CMP M.ELBN+2(R5),R0 ;OVERLAP? ;DC430V .IFF ;DF,E$$LBN ;DC430 ' CMPB M.LBN(R5),R0 ;OVERLAP? ;DC430  .ENDC ;DF,E$$LBN ;DC4309 BNE 100$ ;IF LO CARRY IS SET, IF HI CARRY IS CLR ;**-1D+ CMP M.LBN+2(R5),R1 ;SET UP CONDITION CODESU100$: MOV (SP)+,R1 ;RESTORE R1 MOV (SP)+,R0 ;RESTORE R0R RETURN ;O .ENDC ; DF S$$HDW;+#; **-$MPPKT-MAP I/O PACKET FUNCTION ;CN; THIS ROUTINE IS CALLED TO MAP A READ/WRITE VIRTUAL FUNCTION IN AN I/O PACKETP; TO A READ/WRITE LOGICAL FUNCTION. IF THE CURRENT WINDOW DOES NOT MAP THE VIRTUP; FUNCTION, THEN A FAILURE INDICATION IS RETURNED. ELSE IF THE WINDOW COMPLETELYO; MAPS THE VIRTUAL FUNCTION, THEN THE LOGICAL BLOCK NUMBER IS STORED IN THE I/OCP; PACKET AND THE READ/WRITE VIRTUAL FUNCTION IS CONVERTED TO ITS LOGICAL COUNTERD; PART. ELSE THE PARTIAL MAPPING RESULTS ARE RETURNED TO THE CALLER.;K ; INPUTS:A;T; R1=ADDRESS OF THE I/O PACKET. ; R5=UCB ADDRESS OF DEVICE.R;L ; OUTPUTS:; ; C=1 IF MAPPING FAILURE.T ; C=0 IF MAPPING WAS SUCCESSFUL.; IF R0 EQ 0, THENT; I.FCN+1(R1)=IO.WLB/IO.RLB.); I.PRM+10(R1)=HIGH PART OF MAPPED LBN.N); I.PRM+12(R1)=LOW PART OF MAPPED LBN..,; ELSE #; R0=NUMBER OF BLOCKS NOT MAPPED. ; R2=HIGH PART OF MAPPED LBN. ; R3=LOW PART OF MAPPED LBN.;S; R1 IS PRESERVED ACROSS CALL.;-?$MPPKT::MOV I.LN2(R1),R0 ; GET IMAGE OF LUT2 OR ADDRESS OF LUT2 BIT #1,R0 ; ADDRESS? BNE 5$ ; IF NE NOB .IF DF X$$HDR( MOV KISAR6,-(SP) ; SAVE CURRENT MAPPING# MOV I.TCB(R1),R2 ; GET TCB ADDRESSU2 MOV T.PCB(R2),R2 ; GET PCB ADDRESS OF TASK REGION4 MOV P.REL(R2),KISAR6 ; ASSUME WE NEED TO MAP HEADER .IFTF$ MOV (R0),R0 ; GET CONTENTS OF LUT2 .IFTM# MOV (SP)+,KISAR6 ; RESTORE MAPPING  .ENDC)5$: BIC #1,R0 ; CLEAR POSSIBLE INTERLOCKS MOV R0,$IOTMP ; SAVE FOR LATER' MOV R1,-(SP) ; SAVE I/O PACKET ADDRESSE- MOV I.PRM+12(R1),R3 ; PICKUP LOW PART OF VBNR. MOV I.PRM+10(R1),R2 ; PICKUP HIGH PART OF VBN8 MOV I.PRM+4(R1),R0 ; PICKUP LENGTH OF TRANSFER IN BYTES) MOV $IOTMP,R1 ; SET WINDOW BLOCK ADDRESSE' CALL $MPVBN ;MAP VIRTUAL BLOCK NUMBERR* MOV (SP)+,R1 ;RETRIEVE I/O PACKET ADDRESS BCS 20$ ;IF CS MAPPING FAILURE$ TST R0 ;REQUEST COMPLETELY MAPPED? BNE 20$ ;IF NE NON+ MOVB R2,I.PRM+10(R1) ;SET HIGH PART OF LBNL) .IF DF,E$$LBN ; EXTENDED LBNS ;DC430E= BIT #DV.32B,U.CW1(R5) ; DEVICE SUPPORT EXTENDED LBNS ;DC430,* BEQ 7$ ; IF EQ, NOPE, CONTINUE ;DC4304 MOV R2,I.PRM+10(R1) ;SET HIGH PART OF LBN ;DC430!7$: ;REFERENCE LABEL ;DC430S .ENDC ;DF,E$$LBN ;DC430) MOV R3,I.PRM+12(R1) ;SET LOW PART OF LBNO' MOV #IO.RLB,-(SP) ;ASSUME READ REQUESTA7 CMPB #IO.WVB/256.,I.FCN+1(R1) ;WRITE VIRTUAL FUNCTION?; BNE 10$ ;IF NE NOP% MOV #IO.WLC,(SP) ;ASSUME WRITE CHECKP; ASSUME WI.WCK,100000' TST @$IOTMP ;DATA CHECKING REQUESTED?  BMI 10$ ;IF MI YES- CLRB (SP) ;DEMOTE TO WRITE LOGICAL (IO.WLB)C/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 ADDRESSV- CALL $MPPHY ;MAP TO 18 BIT PHYSICAL ADDRESSO6 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 ADDRESSS CLC ;MAKE SURE CARRY IS CLEAR20$: RETURN ;T;+$; **-$MPVBN-MAP VIRTUAL BLOCK 00j}{ibjbkb a a aNUMBER;IO; THIS ROUTINE IS CALLED TO MAP A VIRTUAL BLOCK NUMBER (VBN) TO A LOGICAL BLOCKEJ; NUMBER (LBN) VIA A WINDOW BLOCK THAT CONTAINS A SET OF MAPPING POINTERS.;G ; INPUTS:O;I5; R0=NUMBER OF CONSECUTIVE BYTES THAT MUST BE MAPPED.L!; R1=ADDRESS OF THE WINDOW BLOCK.D; R2=HIGH PART OF VBN.; R3=LOW PART OF VBN.A;D ; OUTPUTS:;V/; 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.U; R3=LOW PART OF LBN.; R4 & R5 PRESERVED.;)7; IF DATA CACHING IS SUPPORTED, THE FOLLOWING RETRIEVALH-; INFORMATION IS PROVIDED VIA CELLS IN SYSCM:N;S5; $DCCEL - CURRENT EXTENT LENGTH (IF SUCCESSFUL MAP)A,; (0 INDICATES INFORMATION NOT AVAILABLE)+; $DCCEB - CURRENT EXTENT BASE LBN (DITTO)-; $DCNEL - NEXT EXTENT LENGTH (IF AVAILABLE)E+; (0 INDICATES INFORMATION NOT AVAILABLE)L(; $DCNEB - NEXT EXTENT BASE LBN (DITTO)0; $DCSTS - STATUS INFORMATION FROM WINDOW BLOCK;H;-+$MPVBN::SAVNR ;SAVE NONVOLATILE REGISTERSR .IF DF D$$CHET9 MOVB W.STS(R1),$DCSTS ;GET INFORMATION FROM WINDOW BLOCKO .ENDC ; DF D$$CHE .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 MAPS( MOV #120000,R1 ;SET R1 TO MAP THRU APR5( .ENDC ;END SECONDARY POOL CONDITIONAL* .IF DF D$$CHE ;DISK DATA CACHING SUPPORT, CLR $DCCEL ;ASSUME THAT THIS MAP WILL FAIL .IFTF ;D$$CHE2 ADD #777,R0 ;ROUND BYTES TO NEXT 256. WORD BLOCK ROR R0 ;CONVERT TO WORDS CLRB R0 ;CLEAR RESIDUAL BITS, SWAB R0 ;SWAP NUMBER OF BLOCKS TO LOW BYTE .IF DF,E$$LBN ;DC430K6 MOV W.VBN(R1),R4 ;GET HIGH ORDER WORD OF VBN ;DC430 .IFF ;DF,E$$LBN ;DC430I9 MOVB W.VBN(R1),R4 ;GET HIGH ORDER 7 BITS OF VBN ;DC430  .ENDC ;DF,E$$LBN ;DC430/ SUB R4,R2 ;NORMALIZE HIGH PART OF VBN ;**-1D+ SUB W.VBN+2(R1),R3 ;NORMALIZE LOW PART TOOU SBC R2H$ BLO 20$ ;BRANCH ON MAPPING FAILURE- MOVB (R1),R4 ;GET NUMBER OF ACTIVE POINTERSB' BEQ 20$ ;BRANCH IF NONE - MAP FAILURE0- ADD #W.RTRV,R1 ;POINT R1 TO MAPPING POINTERSO010$: SUB (R1)+,R3 ;SUBTRACT EXTENT SIZE FROM VBN SBC R2 ;ALSO HIGH VBNH' BLO 30$ ;BRANCH IF VBN IN THIS EXTENT,$ CMP (R1)+,(R1)+ ;INCREMENT PAST LBN, SOB R4,10$ ;DECRIMENT POINTER COUNT & LOOP$20$: SEC ;INDICATE MAPPING FAILURE' BR 70$ ;RETURN WITH CARRY SET - ERROR330$: ADD R3,R0 ;TEST FOR ALL BLOCKS IN THIS EXTENTH/ BGT 40$ ;BRANCH IF NOT - ONLY PARTIAL MAPPING)# CLR R0 ;INDICATE COMPLETE MAPPING-40$: ADD -2(R1),R3 ;R3 = OFFSET WITHIN EXTENT#( ADC R2 ;R2 = HIGH OFFSET (SHOULD BE 0)' ADD (R1)+,R2 ;ADD THE BIGINNING LBN OFR* ADD (R1)+,R3 ;THE EXTENT TO THE OFFSET TO ADC R2 ;GET THE DESIRED LBN9;NOTE: AT THIS POINT CARRY IS CLEAR FOR SUCCESSFUL RETURNN .IFT ;D$$CHEO. SUB #6,R1 ;BACKTRACK TO THE BEGINNING OF RTV; MOV (R1)+,$DCCEL ;ASSUMPTION INCORRECT, SET CURRENT LENGTHL. MOV (R1)+,$DCCEB ;SET CURRENT EXTENT BASE LBN! MOV (R1)+,$DCCEB+2 ;(DOUBLEWORD) - CLR $DCNEL ;ASSUME NONEXISTENCE OF NEXT RTV3! DEC R4 ;OUR ASSUMPTION CORRECT?R, BEQ 50$ ;YES IF EQ; DON'T FILL IN NEXT RTV. MOV (R1)+,$DCNEL ;ELSE SET NEXT EXTENT LENGTH+ MOV (R1)+,$DCNEB ;SET NEXT EXTENT BASE LBN ! MOV (R1)+,$DCNEB+2 ;(DOUBLEWORD)C;;NOTE: CC BY 'CLR'S ABOVE, PRESERVED THROUGH HERE AS NEEDEDS50$: .ENDC ;D$$CHE70$: .IF DF P$$WND# MOV R5,KISAR5 ;RESTORE SYSTEM APR5R( .ENDC ;END SECONDARY POOL CONDITIONAL RETURN ;RETURN(;+#; **-$LCKPR-LOCK PROCESSING ROUTINE;;UD; THIS ROUTINE FIRST DETERMINES IF A FILE I/O REQUEST IS TO A SHAREDB; FILE. IF SO, IT DETERMINES IF THE REQUEST IS AN UNLOCK QIO OR AD; VIRTUAL BLOCK I/O REQUEST. IT THEN EITHER PERFORMS THE UNLOCK QIO&; OR THE LOCK PROCESSING RESPECTIVELY.; ; INPUTS:B;,&; R1=I/O PACKET ADDRESS OF THE REQUEST; ; OUTPUTS:;E); C=0 IF NO LOCK PROCESSING WAS REQUIRED.A;;>; C=1 IF AN UNLOCK WAS PERFORMED OR AN ERROR CONDITION OCCURED; DURING THE LOCK PRO00r}D}t__DATADATADATADATACESSING.; R0=I/O STATUS;E; R1 IS PRESERVED.;- .IF DF R$$LKL0$LCKPR::MOV @I.LN2(R1),R3 ;POINT TO WINDOW BLOCK BIC #1,R3 ;CLEAR INTERLOCK BIT0 MOV #IE.ULK&377,R0 ;SET FOR UNLOCK ERROR STATUS4 MOV W.LKL(R3),R2 ;POINT TO FIRST ENTRY IN LOCK LIST BEQ 50$ ;IF EQ THERE IS NONE;C; AT THIS POINT WE KNOW THAT BLOCK LOCKING IS ENABLED FOR THE FILE.:;ED; THE TYPE OF LOCK REQUESTED IS EITHER SHARED OR EXCLUSIVE DEPENDING/; ON THE TYPE OF ACCESSOR AND THE I/O FUNCTION.R; /; IF REQUEST IS FROM A READER THEN I.FCN(R1) ISI!; IO.RVB TO READ WITH SHARED LOCKL,; IO.ULK TO UNLOCK ANY OR ALL EXISTING LOCKS8; IO.ULK!IQ.LCK TO REQUEST A SHARED LOCK WITHOUT ANY I/O; 3; IF THE REQUEST IS FROM A WRITER THEN I.FCN(R1) IST'; IO.RVB TO READ WITH AN EXCLUSIVE LOCKI*; 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 LOCKS7; IO.ULK!IQ.LCK TO REQUEST A EXCLUSIVE LOCK WITHOUT I/OA;S SAVNR ;SAVE R4 AND R53 MOV I.PRM+4(R1),R4 ;PICK UP BYTE COUNT FOR REQUEST' ADD #777,R4 ;ROUND TO NEXT DISK BLOCKU# ROR R4 ;CONVERT TO SIZE IN BLOCKSS CLRB R4 ;. SWAB R4 ;T: CMPB I.FCN+1(R1),#IO.ULK/256. ;IS THIS AN UNLOCK REQUEST? BNE 100$ ;IF NE NO; ASSUME IQ.LCK,200E* TSTB I.FCN(R1) ;LOCK WITHOUT I/O REQUEST? BPL 5$ ;IF PL NO CALL 100$ ;DO LOCK PROCESSINGC2 DEC @I.PRM+16(R1) ;UNBUSY LOCK BLOCK SINCE NO I/O BR 50$ ;JOIN COMMON CODE5$: ;REFERENCE LABELI; ; UNLOCK PROCESSING;;EG; THIS SECTION OF THE ROUTINE PERFORMS THE UNLOCK PROCESSING. RELEVANT7&; REGISTER CONTENTS AT THIS POINT ARE:;;; R0=UNLOCK ERROR STATUS; R1=I/O PACKET ADDRESS 5; R2=ADDRESS OF THE FIRST LOCK BLOCK IN THE LOCK LISTE; R3=POINTER TO CURRENT WINDOW); R4=BYTE COUNT OF CURRENT UNLOCK REQUESTI;U8 MOV I.PRM+12(R1),R5 ;CREATE BLOCK NUMBER SPECIFIED FLAG BISB I.PRM+10(R1),R5 ;R,10$: TSTB L.CNT(R2) ;THIS LOCK BLOCK IN USE? BEQ 40$ ;IF EQ NO ! TST R5 ;BLOCK NUMBER SPECIFIED?K BEQ 20$ ;IF EQ NOH' CALL 180$ ;EXACT VBN AND COUNT MATCH?L BNE 40$ ;IF NE NOV"20$: CMP L.WI1(R2),R3 ;SAME OWNER? BNE 40$ ;IF NE NOL CLRB L.CNT(R2) ;UNLOCK THE LOCK. MOV #IS.SUC&377,R0 ;SET FOR SUCCESSFUL RETURN0 TST R5 ;WAS THIS FOR AN EXPLICIT BLOCK NUMBER? BNE 50$ ;IF NE YES+40$: MOV (R2),R2 ;POINT TO NEXT LOCK BLOCK, BNE 10$ ;IF NE THERE IS ONEE;G; NO LOCK LIST EXISTS ;C; IF THE FUNCTION IS NOT AN UNLOCK FUNCTION, A SIMPLE RETURN OCCURSTD; WITH CARRY CLEAR. AN UNLOCK IN THIS CASE IS AN ERROR. (NOTE THAT1; ALL UNLOCK REQUESTS FALL THROUGH HERE AS WELL.)0;C;50$: CMPB I.FCN+1(R1),#+1 ;SET CARRY IF UNLOCK( RETURN ;H;K; LOCK PROCESSINGR;SF; THIS ROUTINE CHECKS FOR ATTEMPTED LOCK OVERLAPS, ATTEMPTS TO SET THEC; NEW LOCK, AND PERFORMS THE IMPLIED UNLOCK. IF A NEW LOCK REQUEST,H; FOR AN EXPLICIT UNLOCKER IS DETECTED WHICH EXACTLY MATCHES AN EXISTINGG; LOCK FOR THAT WINDOW IN BOTH STARTING VBN AND SIZE, THE LOCK BLOCK ISR?; SIMPLY REUSED. RELEVANT REGISTER CONTENTS AT THIS POINT ARE: ;O; R1=I/O PACKET ADDRESSH-; R2=ADDRESS OF FIRST LOCK BLOCK IN LOCK LISTO; R3=ADDRESS OF FILE WINDOWL$; R4=BLOCK COUNT FOR CURRENT REQUEST;N;%; THE FOLLOWING CASES ARE CONSIDERED: ;K@; 1. IF THE REQUEST IS FOR A WINDOW WITH IMPLICIT (NOT EXPLICIT,?; WI.EXL) UNLOCKING AND THERE EXISTS A CURRENT LOCK FOR THAT ?; WINDOW WITH I/O STILL IN PROGRESS THEN RETURN A LOCK ERRORW; (IE.LCK).;B<; 2. IF THE REQUEST IS AN EXACT MATCH FOR A LOCK WHICH IS AN;; EXACT MATCH OF WINDOW (OWNER), LBN, AND SIZE AND WHICHSA; HAS I/O STILL IN PROGRESS THEN RETURN A LOCK ERROR (IE.LCK). ;E?; 3. IF THE REQUEST IS FROM A WINDOW WITH ONLY READ ACCESS OR AL=; READ REQUEST REQUESTING ONLY SHARED ACCESS FROM A WRITERW=; ATTEMPT TO GRANT A SHARED LOCK. IF THERE IS NO EXISTINGT?; LOCK WITH OVERLAP THEN GRANT THE SHARED LOCK. IN THE CASEI#; OF A CONFLICT SEE TABLE BELOW.; ?; 4. IF THE REQUEST IS FROM A WINDOW WITH WRITE ACCESS AND IS AW=; WRITE OR A READ WITHOUT A SHARE00z}{ibjbkb a a aD LOCK REQUEST ATTEMPT TON@; GRANT AN EXCLUSIVE LOCK. IF THERE IS NO EXISTING LOCK WITHC; OVERLAP THEN GRANT AN EXCLUSIVE LOCK. IN THE CASE OF CONFLICTC; SEE TABLE BELOW.E;S,; 5. DECISION TABLE FOR RESOLVING CONFLICTS:; ; I/O REQUESTH; LOCK SHARED EXCLUSIVE;T.; EXACT MATCH GRANT SHARED GRANTED EXCLUSIVE; IF NO OTHER CONFLICTO); (REUSE LOCK BLOCK) (REUSE LOCK BLOCK) ; -; CONFLICT SHARED GRANT SHARED REJECT IE.LCKI;W1; CONFLICT EXCLUSIVE REJECT IE.LCK REJECT IE.LCKT;T%100$: CLR R5 ;INIT FREE NODE POINTERI. MOV #IE.LCK&377,-(SP) ;PUSH LOCK ERROR STATUS CLR -(SP) ;ASSUME SHARED LOCKT0 BIT #WI.WRV,(R3) ;IS THIS REQUEST FOR A WRITER?( BEQ 110$ ;IF EQ NO, ALWAYS SHARED LOCK7 CMPB I.FCN+1(R1),#IO.RVB/400 ; IS THIS A READ REQUEST?E+ BNE 105$ ;IF NE NO, ALWAYS EXCLUSIVE LOCKC; ASSUME IQ.LCK,200O' TSTB I.FCN(R1) ;SHARED LOCK REQUESTED?E BMI 110$ ;IF MI YES -105$: INC (SP) ;SET EXCLUSIVE LOCK REQUESTEDW+110$: TSTB L.CNT(R2) ;IS LOCK BLOCK IN USE?I BNE 120$ ;IF NE YES " TST R5 ;ALREADY HAVE FREE BLOCK?. BNE 150$ ;IF NE YES, LOOK AT NEXT LOCK BLOCK BR 130$ ;ELSE CLAIM THIS BLOCK*120$: MOV L.WI1(R2),R0 ;PICK UP OWNER WORD) BIC #1,R0 ;CLEAR BIT FOR NO UNLOCK FLAGC( CMP R0,R3 ;LOCK BELONG TO THIS WINDOW?( BNE 140$ ;IF NE NO, CHECK FOR OVERLAPS% BIT #WI.EXL,(R3) ;EXPLICIT UNLOCKER?3 BEQ 125$ ;IF EQ NO, SAVE BLOCK FOR IMPLIED UNLOCK;! CALL 180$ ;EXACT VBN AND COUNT?C BNE 140$ ;IF NE NO+125$: MOV L.WI1(R2),R0 ;RETRIEVE OWNER WORDI# ROR R0 ;CAN LOCK BLOCK BE REUSED?L BCS 153$ ;IF CS NO.130$: MOV R2,R5 ;SET TO REUSE THIS LOCK BLOCK" BR 150$ ;LOOK AT NEXT LOCK BLOCK<140$: MOVB L.CNT(R2),R0 ;PICKUP LOCK BLOCK COUNT, EXCLUSIVE? BMI 141$ ;IF MI YESC# TST (SP) ;REQUEST EXCLUSIVE LOCK?N BEQ 150$ ;IF NE NO BR 142$ ;DO CONFLICT CHECK#141$: NEG R0 ;CONVERT TO MAGNITUDEB?142$: ADD L.VB1+2(R2),R0 ;CALCULATE NUMBER OF HIGHEST BLOCK + 1E+ MOVB L.VB1(R2),-(SP) ;PUSH HIGH ORDER BYTE2 ADCB (SP) ;PROPAGATE CARRY" CMPB I.PRM+10(R1),(SP)+ ;OVERLAP?" BNE 145$ ;IF NE USE BRANCH BELOW CMP I.PRM+12(R1),R0 ;OVERLAP?145$: BHIS 150$ ;IF HIS NOL) MOV R4,R0 ;COPY SIZE OF CURRENT REQUEST): ADD I.PRM+12(R1),R0 ;CALCULATE NUMBER OF HIGHEST BLOCK +1. MOVB I.PRM+10(R1),-(SP) ;PUSH HIGH ORDER BYTE ADCB (SP) ;PROPAGATE CARRY CMPB L.VB1(R2),(SP)+ ;OVERLAP?C" BNE 146$ ;IF NE USE BRANCH BELOW CMP L.VB1+2(R2),R0 ;OVERLAP? '146$: BLO 153$ ;IF LO YES, (CARRY SET) ,150$: MOV (R2),R2 ;POINT TO NEXT LOCK BLOCK BNE 110$ ;IF NE THERE IS ONE;RF; HACK: IN ORDER TO PHASE IN REAL READER LOCKS WHICH ARE NOT SUPPORTEDE; BY RMS-11 V1.8, THE FOLLOWING CODE IS INCLUDED TO PREVENT THEM FROMS@; BEING CREATED. AT SOME FUTURE TIME THIS CODE WILL BE REMOVED.; .IF NE 1- BIT #WI.WRV,(R3) ;READER? BEQ 170$ ;IF EQ YESR .ENDC- MOV R5,R0 ;COPY POINTER TO SAVED LOCK BLOCK ' BNE 160$ ;IF NE ONE WAS IN FACT SAVEDP8 MOV #IE.NOD&377,2(SP) ;ASSUME ALLOCATION FAILURE STATUS& MOV R1,-(SP) ;SAVE I/O PACKET ADDRESS* MOV #L.LKSZ,R1 ;PICKUP SIZE OF LOCK BLOCK" CALL $ALOCB ;ALLOCATE LOCK BLOCK) MOV (SP)+,R1 ;RESTORE I/O PACKET ADDRESSH BCC 155$ ;IF CC SUCCESSD153$: ROL (SP) ;SAVE CARRYN BR 170$ ;JOIN COMMON EXIT CODE<155$: MOV @W.LKL(R3),(R0) ;POINT NEW BLOCK TO SECOND IN LIST8 MOV R0,@W.LKL(R3) ;POINT FIRST BLOCK IN LIST TO NEW ONE'160$: TST (R0)+ ;ADVANCE TO OWNER WORDE0 MOV R0,I.PRM+16(R1) ;SAVE POINTER TO OWNER WORD MOV R3,(R0) ;SET OWNER WORDA INC (R0)+ ;SET NO UNLOCK FLAG . MOVB I.PRM+10(R1),(R0)+ ;SET HIGH PART OF VBN ROR (SP) ;EXCLUSIVE LOCK?  BCC 165$ ;IF CC NO NEG R4 ;SET FOR EXCLUSVE LOCK $165$: 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 CASE (170$: ROR (SP)+ ;SET CARRY, CLEAN STACK" MOV (SP)+,R0 ;PICKUP ERROR STATUS RETURN ;;;C6; ROUTINE TO CHECK FOR EXACT VBN AND BLOCK COUNT MATCH;E ; INPUTS:V;,; R1=I/O PACKET ADDRESSI; R2=LOCK BLOCK ADDRESSF; R4=BYTE COUNT+;R 00}D}t__DATADATADATADATA; OUTPUTS:;I; ALL REGISTERS PRESERVED.;L; Z=1 IF EXACT MATCH. ;F; Z=0 IT NO MATCH.;O7180$: CMP L.VB1+2(R2),I.PRM+12(R1) ;MATCH ON LOW ORDER?V BNE 190$ ;IF NE NO2 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 NO6 MOVB L.CNT(R2),-(SP) ;GET LOCK BLOCK COUNT, NEGATIVE? BPL 185$ ;IF PL NO NEGB (SP) ;COMPUTE MAGNITUDE1185$: CMPB (SP)+,R4 ;CLEAN STACK, MATCH ON COUNT? 190$: RETURN ; .ENDC;+5; **-$RQCNC-REQUEST CONTROLLER FOR CONTROL OPERATIONSL; @; THIS ROUTINE IS CALLED TO REQUEST CONTROL FUNCTION ACCESS TO AD; CONTROLLER THAT SUPPORTS OVERLAPPED CONTROL OPERATIONS. ACCESS ISF; GRANTED TO A SPECIFIC UNIT. IF THE UNIT IS MULTI-ACCESS, CONTROLLERG; ASSIGNMENT IS PERFORMED FOR IT. IF THE CONTROLLER IS BUSY, THE DRIVERTF; PROCESS CONTEXT IS STORED IN THE FORK BLOCK, AND IT IS QUEUED ON THEE; CONTROLLER REQUEST QUEUE FOR THAT CONTROLLER. IF THE DRIVER IS NOTEE; BUSY, A $CFORK IS PERFORMED TO ENSURE EXECUTION ON THE CORRECT CPU,O); AND A RETURN TO THE CALLER IS EXECUTED. ;U ; INPUTS: ;C; R4=SCB ADDRESS. $; R5=UCB ADDRESS OF REQUESTING UNIT.; 0(SP)=DRIVERS RETURN ADDRESS.R); 2(SP)=RETURN ADDRESS OF DRIVERS CALLER.U;- ; OUTPUTS:;L; R4=SCB ADDRESS. $; R5=UCB ADDRESS OF REQUESTING UNIT.;S; S.FRK+2 IS ALWAYS NON-ZERO.X;SA; ACCESS IS GRANTED TO THE CONTROLLER FOR CONTROL FUNCTIONS ONLY.Q;T&; R4 AND R5 ARE PRESERVED ACROSS CALL.;- .ENABL LSB  .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 <> 0O CMP R5,K.OWN(R0) ;ARE WE OWNER? BEQ 180$ ;IF EQ YES -- RETURNN .IF DF M$$ACD CALL ASKRB  .ENDC: BIT #KS.SDX,K.STS(R0) ;SEEKS DURING DATA XFERS SUPPORTED? BEQ 100$ ;IF EQ NO .IF DF M$$PRO5 CALLR $CFORK ;ASSURE EXECUTION ON CORRECT PROCESSORN .IFF/ RETURN ;RETURN TO DRIVER WITH ACCESS GRANTEDB .ENDC.100$: MOV (SP)+,R4 ;SAVE DRIVER RETURN ADDRESS" TST K.OWN(R0) ;IS CONTROLLER BUSY .IF DF M$$PRO BNE 150$ ;IF NE YES;1 CALL $CFORK ;NOT BUSY - TRANSFER TO CORRECT CPUE' MOV U.SCB(R5),R1 ;GET BACK SCB ADDRESSR' MOV S.KRB(R1),R0 ;GET BACK KRB ADDRESS TST K.OWN(R0) ;IS IT BUSY NOW?) .ENDC- BEQ 300$ ;IF EQ NO -- GRAB IT FOR OURSELVES6150$: MOV #$QINSB,-(SP) ;SAVE QUEUEING ROUTINE ADDRESS' BR 350$ ;SAVE DRIVER CONTEXT AND EXIT  .ENDC ; DF O$$LAP;+0; **-$RQCND-REQUEXT CONTROLLER FOR DATA TRANSFER;ED; THIS ROUTINE IS CALLED FOR ACCESS TO A CONTROLLER FOR AN OPERATIONE; THAT WILL BUSY OUT THE CONTROLLER, USUALLY A DATA TRANSFER. IF THERF; UNIT IS MULTI-ACCESS, CONTROLLER ASSIGNMENT IS PERFORMED. $CFORK ISA; USED IF NECESSARY TO ENSURE EXECUTION ON THE CORRECT PROCESSOR.;B?; NOTE: IF THE SCB IS ALREADY IN A CONTROLLER REQUEST QUEUE, WE(:; SKIP THE CALL AND RETURN TO THE CALLER'S CALLER. THIS IS<; BELIEVED TO HAPPEN ONLY ON NON-DEC SUPPLIED DM: TYPE DISKS5; DURING POWERFAIL RECOVERY. NOTE THAT THIS BASICALLYI=; DISMISSES THE DRIVERS POWER RECOVERY CALL. WE HOPE THAT THEL8; DRIVER KNOWS HOW TO RECOVER WHEN ITS OTHER $RQCND CALL ; COMPLETES.;T ; INPUTS:O;O$; R5=ADDRESS OF REQUESTING UNITS UCB; 0(SP)=DRIVER RETURN ADDRESSR(; 2(SP)=RETURN ADDRESS OF DRIVERS CALLER; ; OUTPUTS:;B; R4=SCB ADDRESS.N$; R5=UCB ADDRESS OF REQUESTING UNIT.;L; S.FRK+2 IS ALWAYS NON-ZERO.L;.;I,; DRIVER HAS EXCLUSIVE ACCESS TO CONTROLLER.;E;-)$RQCND::MOV U.SCB(R5),R1 ;GET SCB ADDRESST .IF DF S2.NRD5 BIT #S2.KRQ,S.ST2(R1) ;KRB ALREADY IN REQUEST QUEUE?E' BNE 370$ ;IF NE YES, IGNORE THIS CALL  .ENDC ; DF S2.NRD" MOV S.KRB(R1),R0 ;GET KRB ADDRESS8 CMP R5,K.OWN(R0) ;IS REQUESTING UNIT ALREADY THE OWNER?) BNE 190$ ;IF NE NO, MAKE HIM THE OWNERV% MOV R1,R4 ;PUT SCB IN CORRECT PLACEB4180$: INC S.FRK+2(R4) ;ALWAYS EXIT WITH S.FRK+2 <> 0 RETURN 190$: ;REFERENCE LABEL .IF DF M$$ACD CALL ASKRBN .ENDC1 INCB K.IOC(R0) ;COUNT AN I/O REQUES00}{ibjbkb a a aT ON THIS KRB. MOV (SP)+,R4 ;PUT DRIVER RETURN ADDRESS IN R4# TST K.OWN(R0) ;IS CONTROLLER BUSY?; .IF DF M$$PRO BNE 340$ ;IF NE YES2, CALL $CFORK ;TRANSFER TO CORRECT PROCESSOR' MOV U.SCB(R5),R1 ;GET SCB ADDRESS BACKD' MOV S.KRB(R1),R0 ;GET KRB ADDRESS BACK  TST K.OWN(R0) ;IS IT BUSY .ENDC BNE 340$ ;IF NE YES ;+; SET OWNER AND RETURN;R!300$: MOV R5,K.OWN(R0) ;SET OWNERE MOV R4,R0 ;SAVE RETURN ADDRESS- MOV R1,R4 ;PUT SCB ADDRESS IN CORRECT PLACEU/ INC S.FRK+2(R4) ;ALWAYS EXIT WITH S.FRK+2 <> 0T$ JMP (R0) ;RETURN TO CALLING DRIVER-340$: MOV #$QINSF,-(SP) ;SET QUEUEING ADDRESS4 BIS #S2.KRQ,S.ST2(R1) ;INDICATE REQUEST IS IN QUEUE;TA; STORE DRIVER CONTEXT IN FORK BLOCK AND RETURN TO DRIVERS CALLER); 2350$: MOV R1,S.FRK+6(R1) ;SAVE SCB IN R4 SAVE AREA+ ADD #S.FRK+6,R1 ;POINT TO R5 SAVE AREA + 2E MOV R5,-(R1) ;SAVE R5* MOV R4,-(R1) ;SAVE DRIVERS RETURN ADDRESS CLR -(R1) ;CLEAR LINK WORD* ADD #K.CRQ,R0 ;POINT TO QUEUE FOR DRIVERS/360$: RETURN ;EXIT TO PROPER QUEUEING ROUTINET)370$: TST (SP)+ ;REMOVE CALLER'S ADDRESS$$ RETURN ;RETURN TO CALLER'S CALLER;+; **-$RLCN-RELEASE CONTROLLERE;QE; THIS ROUTINE WILL RELEASE THE CONTROLLER IF THE CALLER IS THE OWNER D; OF THE CONTROLLER. IT WILL ALSO PLACE THE FORK BLOCK FOR THE NEXTB; DRIVER (IF ANY) IN THE CONTROLLER WAIT QUEUE INTO THE FORK QUEUEF; AFTER MAKING THAT DRIVER THE OWNER OF THE CONTROLLER. IF THE DRIVER); IS NOT THE OWNER, A RETURN IS EXECUTED.F;D ; INPUTS:$;E; R4=SCB ADDRESS.P6; R5=UCB ADDRESS OF UNIT THAT IS RELEASING CONTROLLER.;D ; OUTPUTS:; ; CONTROLLER IS RELEASED.R;); ALL REGISTERS EXECEPT R3 ARE PRESERVED.H;-)$RLCN:: MOV S.KRB(R4),R3 ;GET KRB ADDRESSL* CMP R5,K.OWN(R3) ;IS RELEASING UNIT OWNER BNE 460$ ;IF NE NO, RETURN- CLR K.OWN(R3) ;CLEAR OUT OWNER OF CONTROLLERE. ADD #K.CRQ,R3 ;POINT TO CONTROLLER RQST QUEUE5 DECB K.IOC-K.CRQ(R3) ;COUNT ONE LESS I/O ON THIS KRBR MOV (R3),R4 ;GET NEXT EXTRYI0 BEQ 450$ ;IF EQ NO DRIVER IS WAITING -- RETURN% MOV (R4),(R3) ;SET NEW FIRST IN LISTL( BNE 400$ ;IF NE OLD LAST IS STILL LAST) MOV R3,2(R3) ;SET NEW LAST -- EMPTY LISTR@400$: MOV 4(R4),K.OWN-K.CRQ(R3) ;SET NEW OWNER WITH R5 FROM FORK CLR (R4) ;CLEAR FORK LINK WORD0 CALL $QFORK ;INSERT FORK BLOCK INTO FORK QUEUE)450$: MOV U.SCB(R5),R4 ;REPLACE SCB IN R4R+ BIC #S2.KRQ,S.ST2(R4) ;SCB IS NOT IN QUEUEQ460$: RETURN ; .DSABL LSBC;O,; **-ASKRB-ASSIGN KRB FOR DUAL-ACCESS DEVICE; D; THIS ROUTINE WILL PROPERLY ASSIGN THE KRB FOR A DUAL-ACCESS DEVICE"; THAT USES KS.UOP SYNCRONIZATION.;; ; INPUTS:A;I$; R0=CURRENTLY ASSIGNED KRB ADDRESS.(; R1=SCB ADDRESS FOR DUAL-ACCESS DEVICE.;R ; OUTPUTS:;O#; R0=KRB ADDRESS FOR KRB OF CHOICE.L(; R1=SCB ADDRESS FOR DUAL-ACCESS DEVICE.;K#; REGISTERS R2 AND R3 ARE DESTROYEDC;5 .IF DF M$$ACD-ASKRB: MOV #S2.MAD!S2.LDS,R2 ;GET STATUS BITSQ0 BIC S.ST2(R1),R2 ;ARE ALL OF THE ABOVE BITS SET BNE 30$ ;IF NE NO -- EXIT NOWI/ BITB #S3.DRL,S.ST3(R1) ;IS THE DRIVE RELEASED?R BEQ 30$ ;IF NE NO -- EXIT NOWT; ; GET PORT A KRB -- CHECK IT OUT;A) 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 ADDRESS ( BIC #KP.OFL,R3 ;CLEAR OUT LOW ORDER BIT;C$; GET PORT A -- CHECK IT FOR OFFLINE;E* BIT #KS.OFL,K.STS(R2) ;IS THE KRB OFFLINE# BNE 10$ ;IF NE YES, SELECT PORT BS;R ; GET PORT B KRB -- CHECK IT OUT;& BIT #KS.OFL,K.STS(R3) ;IS KRB ONLINE?" BNE 20$ ;IF NE NO, SELECT PORT A;:; BOTH KRB'S ARE ONLINE -- NOW CHECK FOR PORT RELATIVE I/O;C) MOV S.PKT(R1),R0 ;GET I/O PACKET ADDRESS 2 MOV I.FCN(R0),-(SP) ;GET I/O FUNCTION FROM PACKET1 BIC #7,(SP) ;REMOVE QUALIFIER BITS (SEE $VOLVD)B* CMP #IO.STC,(SP)+ ;IS IT IO.STC FUNCTION? BEQ 40$ ;IF EQ YES;F>; BOTH KRB'S ARE ONLINE, IT IS NOT PORT RELATIVE I/O FUNCTION.7; NOW CHECK FOR THE PDF AND PORT SPECIFIC OFFLINE BITS.B; 75$: BIT #KP.OFL,S.KTB(R1) ;IS PORT A OFL FROM THIS UNIT% BNE 10$ ;IF NE YES -- SELECT PORT 00}D}t__DATADATADATADATAA6 BIT #KP.OFL,S.KTB+2(R1) ;IS PORT B OFL FROM THIS UNIT% BNE 20$ ;IF NE YES -- SELECT PORT BP; F; NOW THE PDF BITS (WHICH, FOR NON PORT-SPECIFIC I/O, ARE EQU TO OFL).; * BIT #KS.PDF,K.STS(R2) ;IS PORT A PDF SET?% BNE 10$ ;IF NE YES -- SELECT PORT BQ* BIT #KS.PDF,K.STS(R3) ;IS PORT B PDF SET?% BNE 20$ ;IF NE YES -- SELECT PORT AO; >; AT THIS POINT, BOTH KRB'S ARE EQUIVALENT FROM THE STANDPOINT=; OF BEING EQUALLY ONLINE, AND THIS WASN'T PORT SPECIFIC I/O.$;I@; NOW WE WILL COMPARE THE KRB'S TO SEE WHICH IS BUSIER. IF THEY@; 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). BLO 20$ ;IF LO PORT A IS FREER BHI 10$ ;IF HI PORT B IS FREER .IF DF M$$PRO@ BIT @$CPURM,K.URM(R2) ;CAN WE GET TO ONE EASIER THAN THE OTHER? BNE 20$ ;IF NE YES -- PORT A .ENDC10$: MOV R3,R2 ;SELECT PORT B&20$: MOV R2,S.KRB(R1) ;SET KRB ADDRESS MOV R2,R0 ;SHOW KRB OF CHOICE$ .IF DF M$$PRO6 MOV K.URM(R0),S.URM(R1) ;SET URM IN FORK BLOCK OF SCB .ENDC530$: BICB #S3.DRL,S.ST3(R1) ;SHOW CONTROLLER ASSIGNEDS RETURN ;U>; FUNCTION IS IO.STC, SEE IF PORT SPECIFICATION EXISTS. IF IT&; DOES, THEN SWITCH TO SPECIFIED PORT.;R040$: MOVB I.PRM+4(R0),R0 ;GET PORT SPECIFICATION BEQ 5$ ;IF EQ NONE EXISTS  SUB #1,R0 ;IS IT PORT AS BNE 10$ ;IF NE NO BR 20$ ;IF EQ YESS .ENDC;+"; **-$ECCOR-ECC CORRECTION ROUTINE;M@; THIS ROUTINE WILL TAKE THE 22 BIT REAL STARTING ADDRESS OF THEE; TRANSFER, CALCULATE WHERE THE ECC CORRECTION SHOULD TAKE PLACE, AND.A; PERFORM THE ACTUAL XOR OPERATION TO CORRECT THE DATA IN MEMORY.N; ; INPUTS: ;P; R0=BYTES ACTUALLY TRANSFERED0; R1=ECC ERROR POSITION (FROM HARDWARE REGISTER):; R3=ECC ERROR CORRECTION PATTERN (FROM HARDWARE REGISTER); R4=SCB ADDRESS; R5=UCB ADDRESS;R ; OUTPUTS:; ; R2=CSR ADDRESS; R3=CONTROLLER INDEXC;; R0, R4, R5 ARE PRESERVED;- .IF DF S$$ECC&$ECCOR::MOV R4,-(SP) ;SAVE SCB ADDRESS. MOV R0,-(SP) ;SAVE NUMBER OF BYTES TRANSFERED) CLR R0 ;CLEAR HIGH ORDER ERROR POSITIONE) DEC R1 ;MAKE POSITION INTO 0-7777 RANGEH DIV #20,R0 ;DIVIDE FOR:N ; R0=WORD POSITION (0-377)R ; R1=BIT POSITION (0-17)O! MOV R0,-(SP) ;SAVE WORD POSITIONC( CLR R2 ;CLEAR HIGH ORDER ERROR PATTERN1 ASHC R1,R2 ;SHIFT PATTERN INTO CORRECT POSITION / MOV U.BUF+2(R5),R1 ;GET LOW 16 BITS OF ADDRESSN3 MOVB U.BUF+1(R5),R0 ;GET HIGH BITS OF REAL ADDRESS ' MOV S.KRB(R4),R4 ;RETREIVE KRB ADDRESSA9 BIT #KS.MBC,K.STS(R4) ;IS THIS A 22-BIT MASSBUS DEVICE?R BNE 10$ ;IF NE YES& ADD K.OFF(R4),R4 ;POINT TO UMR AREA+2. MOV -(R4),R1 ;GET LOW 16 BITS OF REAL ADDRESS/ MOVB -(R4),R0 ;GET HIGH 6 BITS OF REAL ADDRESS 010$: MOV 2(SP),R4 ;GET BYTES ACTUALLY TRANSFERED3 BIC #777,R4 ;GET NUMBER OF FULL BLOCKS TRANSFERED1 BEQ 15$ ;IF EQ THERE WERE NONE' SUB #512.,R4 ;BACKUP TO BLOCK IN ERROR 815$: ADD R4,R1 ;CALCULATE STARTING ADDRESS OF BAD BLOCK ADC R0 ;...M/ ASHC #10.,R0 ;CALCULATE DISPLACEMENT AND BIASM ASHC #-10.,R1 ;...S# MOV R0,KISAR6 ;SET RELOCATION BIAS 7 ADD #140000+2,R1 ;POINT TO HIGH ORDER CORRECTABLE WORD- MOV (SP)+,R4 ;GET WORD POSITION2 ADD R4,R1 ;ADD IN ERROR WORD POSITION OFFSET ...$ ADD R4,R1 ;... FOR BYTE ADDRESSING, MOV (SP),R0 ;GET BYTES ACTUALLY TRANSFERED ASR R0 ;CONVERT TO WORDS- BIC #^C<377>,R0 ;GET HIGHEST WORD TO CORRECTB. BNE 17$ ;IF NE, IT'S A PARTIAL WORD TRANSFER6 MOV #377,R0 ;SET R0 EQUAL TO VERY LAST WORD IN BLOCK017$: CMP R4,R0 ;IS THE OFFSET WITHIN THE LIMIT? BHI 40$ ;IF HI NOT AT ALLA& BEQ 30$ ;IF EQ THEN ONLY ONE WORD IS.20$: XOR R2,(R1) ;CORRECT THE HIGH ORDER WORD-30$: XOR R3,-(R1) ;CORRECT THE LOW ORDER WORDI+40$: MOV (SP)+,R0 ;RESTORE BYTES TRANSFERED " MOV (SP)+,R4 ;RESTORE SCB ADDRESS' MOV S.KRB(R4),R3 ;RETREIVE KRB ADDRESSR# MOV (R3),R2 ;RETREIVE CSR ADDRESS0- MOVB K.CON(R3),R3 ;RETREIVE CONTROLLER INDEXE RETURN ;I .ENDC ; DF S$$ECC;+*; **-$CRPAS - COMMON REGISTER PASS ROUTINE;CF; THIS SUBROUTINE IS USED TO PASS 00}{ibjbkb a a aTHE CONTENTS OF THE DEVICE REGISTERSE; BACK TO THE DIAGNOSTIC TASK. ALL REGISTERS ARE PASSED IN THE ORDERE%; IN WHICH THEY APPEAR ON THE UNIBUS.R;TF; NOTE: THIS ROUTINE MAKES USE OF THE ERROR LOGGING ENTRIES S.ROFF AND; S.RCNT IN THE SCB.;D ; INPUTS:S;B; R1=I/O PACKET ADDRESSR; R2=CSR ADDRESS; R4=SCB ADDRESS;S ; OUTPUTS:;(; R1=DESTROYED.C; R0,R2 ARE PRESERVEDR;- .IF DF U$$UMD$CRPAS::MOV R0,-(SP) ;SAVE R0M- MOV I.PRM+14(R1),KISAR6 ;SET RELOCATION BIAS 1 MOV I.PRM+16(R1),R0 ;GET REGISTER BUFFER ADDRESSS+ MOV R2,-(SP) ;PRESERVE INITIAL CSR ADDRESSR1 MOVB S.ROFF(R4),R2 ;GET OFFSET TO FIRST REGISTERO ADD (SP),R2 ;ADD CSR ADDRESS4 MOVB S.RCNT(R4),R1 ;GET NUMBER OF REGISTERS TO XFER)10$: MOV (R2)+,(R0)+ ;TRANSFER A REGISTER$ SOB R1,10$ ;LOOP FOR ALL REGISTERS .IF DF M$$EXT' MOV S.KRB(R4),R1 ;RETREIVE KRB ADDRESSC2 BIT #KS.MBC,K.STS(R1) ;IS THIS A MASSBUS DEVICE? BEQ 20$ ;IF EQ NO;% ADD K.OFF(R1),R1 ;POINT TO UCB TABLE $ MOV -(R1),R1 ;RETREIVE RHBAE OFFSET' ADD (SP),R1 ;FORM AN I/O PAGE ADDRESS( MOV (R1)+,(R0)+ ;TRANSFER RHBAE MOV (R1),(R0) ;TRANSFER RHCS3 .ENDC&20$: MOV (SP)+,R2 ;RESTORE CSR ADDRESS MOV (SP)+,R0 ;RESTORE R0M RETURNG .ENDC ; DF U$$UMD;+,; **-$VOLVD-PREPROCESS VOLUME VALID FUNCTION;RB; THIS ROUTINE PREPROCESSES ALL I/O FUNCTIONS TO SCREEN AND HANDLED; VOLUME VALID REQUESTS. DISK DRIVERS CALL THIS ROUTINE AT THE STARTF; OF EACH OPERATION. THE ROUTINE WILL RETURN AN INDICATION OF WHICH OF(; THREE OUTCOMES THE DRIVER SHOULD TAKE:;IA; 1. NOP (SUCCESSFULLY COMPLETE) THE I/O, BECAUSE IT WAS A VOLUME;%; VALID REQUEST HANDLED BY $VOLVD.(?; 2. CONTINUE WITH THE I/O REQUEST, BECAUSE IT WAS NOT A VOLUMEG2; VALID REQUEST, AND NEEDS REAL DRIVER SERVICE.@; 3. RETURN AN ERROR, BECAUSE $VOLVD DETECTED A BAD VOLUME VALID=; QIO OR A TRANSFER TO A VOLUME WITH VOLUME VALID NOT SET. ;VF; A VOLUME VALID I/O IS ONE WITH A FUNCTION CODE OF IO.STC, I.PRM = 0,O; AND I.PRM+2 IS A SUBFUNCTION CODE FOR WHICH VOLUME VALID FUNCTION (SEE BELOW);.F; SPECIAL NOTE REGARDING THE INTERACTION OF DATA CACHEING SUBFUNCTION:;R:; THE IO.STC SUBFUNCTION CODE VV$CHE SHOULD BE CONSIDERED7; AN INVALID FUNCTION (AND CURRENTLY IS) IF RECEIVED BY ;; $VOLVD. THIS SUBFUNCTION CODE IS INTERCEPTED, PROCESSED,L;; AND TERMINATED BY THE CACHER. THESE OPERATIONS WILL ONLYO;; REACH THE DRIVER IF DISK DATA CACHING IS NOT SUPPORTED IN ;; THE CURRENTLY RUNNING EXECUTIVE, AND THOSE PACKETS SHOULD #; BE TERMINATED WITH STATUS IE.BAD.E;L ; INPUTS: ;E; R1 = I/O PACKET ADDRESSE;G; I.PRM = ALWAYS ZERO-; I.PRM+2 = VOLUME VALID FUNCTION TYPE CODE:U0; VV$SIZ -1 SIZE THE DRIVE (NO CHANGE IN VV) ; VV$SET 1 SET VOLUME VALID+; VV$UNL 2 UNLOAD THE DRIVE (CLEAR VV) -; VV$CHE 4 "DATA CACHE LOCAL" OPERATIONST; 0 TO RESET VOLUME VALID BITN; 1 TO SET VOLUME VALID BITR/; 2 TO RESET VOLUME VALID AND SPIN DRIVE DOWN +; 3 TO SET VOLUME VALID AND SPIN DRIVE UPS'; 4 FOR "DATA CACHE LOCAL" OPERATIONSB8; -1 TO SIZE THE DISK (VOLUME VALID NOT CHANGED),; I.PRM+4 = RESERVED FOR PORT SPECIFICATION;I; R5 = UCB ADDRESS; ; OUTPUTS:; ?; C = 0 THEN THE FUNCTION CODE WAS IO.STC, AND THE FUNCTION WASDA; PROPERLY HANDLED, OR THE FUNCTION WAS A TRANSFER FUNCTIONTB; AND VOLUME VALID IS SET FOR THE VOLUME. REGISTERS AND CCS:;S5; R0 = IS.SUC&377 IF VOLUME VALID FUNCTION (IO.STC).P(; R0 = -1 IF TRANSFER FUNCTION.3; N = 1 IF TRANSFER FUNCTION (R0 TESTED)A;NE; C = 1 THEN THE FUNCTION WAS EITHER AN INVALID IO.STC, OR A TRANSFER4A; FUNCTION TO A VOLUME WITHOUT VOLUME VALID SET. REGISTERS:U;T; R0 = I/O ERROR CODE.F;- VV$SIZ == -1 ; SIZE THE DRIVEO' VV$SET == 1 ; SET/CLEAR VOLUME VALIDF& VV$UNL == 2 ; LOAD/UNLOAD THE DRIVE, VV$CHE == 4 ; CACHE SUBFUNCTION OF IO.STC#; FIRST CHECK TO SEE IF THIS IS AI; VOLUME VALID FUNCTION.9$VOLVD::MOV #IE.IFC&377,R0 ; ASSUME ILLEGAL FUNCTION CODE , MOV I.FCN(R1),-(SP) ; GET THE FUNCTION CO00}}t__DATADATADATADATADE) BIC #7,(SP) ; REMOVE ANY QUALIFIER BITSA+ CMP #IO.STC,(SP)+ ; VOLUME VALID FUNCTION?T BNE 30$ ; IF NE NO-; YES, IT'S AN IO.STC. CHECK PRIVILIEGES. A 0; PRIVILEGED TASK (LIKE MOUNT) CAN DO WHATEVER.; IT PLEASES. A NON-PRIVILEGED TASK CAN ONLY3; RESET VOLUME VALID ON A FOREIGN MOUNTED VOLUME.E, 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 RESET3; IF VOLUME VALID IS ALREADY SET, THEN THE VOLUMEC1; NEEDN'T BE MOUNTED. THIS COVERS THE CASE OF A."; VOLUME DISMOUNTED WITH /LOCK=V899$: BITB #US.VV,U.STS(R5) ; IS VOLUME VALID ALREADY SET( BNE 1$ ; IF NE YES, SKIP MOUNTED TEST); THE FOLLOWING IS LEFT AS COMMENTS FORM,; ARCHAEOLOGICAL PURPOSES. VER... HAS LONG&; SINCE SHUFFLED OFF ITS MORTAL COIL;A9; CMP $VERTK,R0 ; REQUESTING TASK THE VERIFICATION TASK ?T-; BEQ 1$ ; IF EQ, YES - ALLOW VV TO BE RESET;3; NOW WE VALIDATE THAT THE DEVICE IS NOT MOUNTED.S1; RECENT CHANGE: ALLOW RESET OF VOLUME VALID TOC1; A MOUNTED VOLUME WITH NO ACP. THIS ALLOWS FORO5; BRU TO WORK AFTER COMPENSATING FOR VMS NOT FIXINGR; THE RX50 DOOR PROBLEM.9 BITB #US.MNT,U.STS(R5) ; IS THE DEVICE ALREADY MOUNTED?T BNE 1$ ; IF NE NO, OK; TST U.ACP(R5) ; IS IT MOUNTED WITH AN ACP (F11 OR FOR)?O BNE 50$ ; IF NE YES, ERRORI.; IF WE GET HERE, IT'S OK TO DO VOLUME VALID0; FUNCTIONS ON THIS VOLUME, FOR THIS TASK. GET4; THE SUBFUNCTION TYPE, AND DISPATCH ALL FUNCTIONS ; BUT SIZE.T41$: MOV I.PRM+2(R1),R0 ; GET PARAMETER SPECIFICATION) BPL 2$ ; IF PL SET/CLEAR OR LOAD/UNLOADP/; IT'S VV$SIZ, SET UP THE QIO FOR THE DRIVER.B> 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 $CRPAS" BR 15$ ; SHOW SUCCESS+; IT'S A SET OR CLEAR. BEGIN TO VALIDATE,E; SEPARATE VV$SETE&2$: BIT #VV$SET,R0 ; SET VOLUME VALID? BNE 10$ ; IF NE YES /; IT WASN'T SET. IF IT WASN'T UNLOAD, IT'S ANU; INVALID SUBFUNCTION.- BIT #^C,R0 ; BAD PARAMETERS?; BNE 5$ ; IF NE YESA-; IT WAS VV$UNL. UNSET VOLUME VALID FOR THEV#; VOLUME AND COMPLETE SUCCESSFUL.)* BICB #US.VV,U.STS(R5); CLEAR VOLUME VALID BR 15$ ; RETURN SUCCESSO-; I.PRM+2 WASN'T VV$SET, VV$UNL, OR VV$SIZ.S; RETURN IE.BADA.5$: MOV #IE.BAD&377,R0 ; ASSUME BAD PARAMETERS BR 40$ ; EXIT 1; WE GET HERE FOR A CORRECTLY VALIDATED VV$SET. .; SET SOFTWARE VOLUME VALID, FALL THROUGH TO; SUCCESS RETURN-10$: BISB #US.VV,U.STS(R5) ; SET VOLUME VALIDA.; SET UP FUNCTION CODE FOR SUCCESSFUL RETURN215$: MOV #IS.SUC&377,R0 ; SHOW SUCCESSFUL FUNCTION'; SUCCESSFUL RETURN WITH C BIT CLEAR.S20$: CLC ; SHOW GOOD FUNCTION RETURN ;C1; FUNCTION WAS A TRANSFER FUNCTION. TEST TO SEES*; IF VOLUME VALID IS SET FOR THE VOLUME./30$: MOV #-1,R0 ;ASSUME GOOD TRANSFER FUNCTION 1 BITB #US.VV,U.STS(R5);HAS VOLUME VALID BEEN SET? 2 BNE 20$ ;IF NE YES, GO RETURN SUCCESS INDICATION,; TRANSFER FUNCTION WITH VOLUME VALID NOT'; SET. REJECT AS "DEVICE NOT READY".F/ MOV #IE.DNR&377,R0 ;ELSE FORCE DRIVE NOT READYH); FAILURE RETURN. SET CARRY AND RETURNR40$: SEC ;SHOW FAILURE RETURN ; ,50$: MOV #IE.PRI&377,R0 ;PRIVILEGE VIOLATION BR 40$ ; .ENDEST TO SEES*; IF VOLUME VALID IS SET FOR THE VOLUME./30$: MOV #-1,R0 ;ASSUME GOOD TRANSFER FUNCTION 1 BITB .TITLE DRSUBN .IDENT /03.41/E;+1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.V; 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.;I; B. S. MCCARTHY;T; PREVIOUSLY MODIFIED BY:P;T ; S. C. ADAMS ; J. W. BERZLE ; M. S. FOX ; J. GEMIGNANI, JR. ; R. D. HANEY ; J. R. KAUFFMAN; J. M. LAWLER ; T. LEKASD; T. M. MARTIN; B. S. MCCARTHY; L. B. MCCULLEY ; K. L. NOEL; D. P00}{ibjbkb a a a. RABAHY; P. K. M. WEISS; D. CARROLLo;i$; MODIFIED FOR RSX-11M-PLUS V4.6 BY:;V; D. Carroll 18-Oct-1995 03.41;; DC404 - Include PSECT statement to allow ICB pool to be ; expanded during sysgenW;  .IF DF S$$HDW .MCALL SHDDF$,PKTDF$A* SHDDF$ ;DEFINE SHADOW RECORDING OFFSETS .ENDC ;S$$HDW .IF DF P$$LAS# .MCALL HDRDF$,PCBDF$,TCBDF$,WDBDF$ 1 HDRDF$ ;DEFINE HEADER AND WINDOW BLOCK OFFSETS2 PCBDF$ ;DEFINE PCB AND ATTACHMENT DESCR OFFSETS TCBDF$ ;DEFINE TCB OFFSETS  WDBDF$ ;DEFINE WDB OFFSETSoC; THE FOLLOWING TABLE OF VALUES MUST BE IDENTICAL TO THE ONE AT THE.; BEGINNING OF THE KX DRIVER.t* .IF DF C$$RMT ;IF REMOTE SYSTEM SERVICES .ASECTs .=120000.*CPRCON: .BLKW 1 ;UNIT CONNECT ENTRY POINT8CPRALO: .BLKW 1 ;ALLOCATE BUFFER SPACE AND COMMAND RING)CPRDEA: .BLKW 1 ;DEALLOCATE BUFFER SPACEF$CPRSEN: .BLKW 1 ;SEND PACKET TO VMS6CPRABO: .BLKW 1 ;ABORT TASK AND CLEANUP CPRSX PACKETS@CPRRCV: .BLKW 1 ;RE-ENTER DRIVER WHEN POOL HAS BECOME AVAILABLE .PSECT  .ENDC ;C$$RMT. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;DC404 .PAGE;+%; **-$DRDSE-DECLARE SIGNIFICANT EVENT ; E; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DECLARE A SIGNIFICANT EVENT.N;C ; DPB FORMAT:I;"; WD. 00 -- DIC(35.),DPB SIZE(1.).; ; INPUTS: ;G9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. +; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.R/; 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)P;P$; C=0 WITH A DIRECTIVE STATUS OF +1.;.2; NOTE: THIS DIRECTIVE IS ALSO CALLED A SUBROUTINE;- .IF NDF M$$PROS9$DRDSE::MOV $ACTHD,@$RQSCH ;SET DISPATCH TO FRONT OF LISTT .IFF $DRDSE::MOV R0,-(SP) ;SAVE R0* MOV #$RQTAB,R0 ;POINT TO RESCHEDULE TABLE415$: MOV $ACTHD,(R0)+ ;SET DISPATCH TO FRONT OF LIST, CMP R0,#$RQTAB+ ;AT END OF TABLE? BLO 15$ ;IF LO NON;KB; WE HAVE JUST CHANGED THE RESCHEDULE POINTERS FOR ALL PROCESSORS."; WE SHOULD INTERRUPT ALL OF THEM.;P# MOV $URMST,R0 ;GET ONLINE BUS RUNS+# BIC $CPMSK,R0 ;ONLY PROCESSORS NOWO BIC $CPBIT,R0 ;NOT US EITHER$ BEQ 25$ ;IF EQ NOBODY TO INTERRUPT MTPS #PR7 ;INHIBIT DEADLOCKS LOCK$ $FORKL,SPIN$ BIS R0,$IIPND ;SHOW WORK IS WAITING ULOCK$ $FORKL,SPIN  MTPS #025$: MOV (SP)+,R0 ;RESTORE R0S .ENDC6 CLR $SIGFL ;CLEAR TASK WAITING FOR SIGNIFICANT EVENT) RETURN ;RETURN DIRECTIVE STATUS OF +1 ;+%; **-$DFWFS-WAITFOR SINGLE EVENT FLAGP;EE; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SUSPEND THE EXECUTION OF THEN3; ISSUING TASK UNTIL A SPECIFIED EVENT FLAG IS SET.;C ; DPB FORMAT: ;E"; WD. 00 -- DIC(41.),DPB SIZE(2.).1; WD. 01 -- EVENT FLAG NUMBER OF FLAG TO WAITFOR.O;, ; INPUTS:R;I; 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.T/; 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) ;N$; C=0 WITH A DIRECTIVE STATUS OF +1.;-4$DRWFS::BIC #1,R1 ;CLR GRP GLOBAL 2ND WORD INDCATOR8$DRWS1::BIS #T2.WFR,T.ST2(R5) ;PUT TASK IN WAITFOR STATE) ;(DO NOT USE R2 BECAUSE OF QIOW CALL)F$ MOV R0,T.EFLM(R5) ;SET WAITFOR MASK. MOV R1,T.EFLM+2(R5) ;SET WAITFOR MASK ADDRESS& CALLR $SETRT ;SET A SCHEDULE REQUEST;+$; **-$DRCSR-CANCEL SCHEDULE REQUESTS;EK; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CANCEL ALL SCHEDULE REQUESTS FOR A; SPECIFIED TASK.V;T ; DPB FORMAT:U;D"; WD. 00 -- DIC(25.),DPB SIZE(3.).$; WD. 01 -- FIRST HALF OF TASK NAME.%; WD. 02 -- SECOND HALF OF TASK NAME.;W ; INPUTS:.;,8; R0=ADDRESS OF THE TCB TO CANCEL SCHEDULE REQUESTS FOR.J; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO CANCEL SCHEDULE REQUES9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.E+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.D/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK00}}t__DATADATADATADATA.S,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;P5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)(;)$; C=0 WITH A DIRECTIVE STATUS OF +1.;-&$DRCS1:: ;REF LABEL FOR ERROR LOGGER#$DRCSR::MOV R0,R5 ;SET TCB ADDRESSS( CLR R4 ;SET INITIAL ENTRY TYPE MINUS 21 CALL (PC) ;REMOVE PERIODIC/SINGLE SHOT REQUESTSK' TST (R4)+ ;ADVANCE TO NEXT ENTRY TYPEO, CALLR $CLRMV ;REMOVE ALL REMAINING ENTRIES;+; **-$DRGMX-GET MAPPING CONTEXTB;DF; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO RETURN THE MAPPING CONTEXT OF=; THE TASK, I.E. TO FILL IN UP TO N WINDOW DEFINITION BLOCKS,PB; WHERE N IS THE TOTAL NUMBER OF WINDOW BLOCKS IN THE TASK HEADER.5; NO INFORMATION IS RETURNED ON UNUSED WINDOW BLOCKS.O;0 ; DPB FORMAT:D;S"; WD. 00 -- DIC(113.),DPB SIZE(2.)5; WD. 01 -- ADDRESS OF THE N WINDOW DEFINITION BLOCKSE;K ; INPUTS:+;A9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.I,; (R3)=ADDRESS OF N WINDOW DEFINITION BLOCKS/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;.3; INPUT FIELDS IN THE WINDOW DEFINITION BLOCKS ARE:R; NONE.;T5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)F;A-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.S:; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE ADDRESS5; CHECK OF THE N WINDOW BLOCKS PLUS TERMINATOR WORDI ; FAILS.;S4; 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. -; W.NBAS=VIRTUAL BASE ADDRESS OF THE WINDOW. %; W.NSIZ=SIZE OF THE ADDRESS WINDOW.N,; W.NRID=REGION ID IF MAPPED OR UNMODIFIED.3; W.NOFF=OFFSET IN REGION IF MAPPED OR UNMODIFIED.R0; W.NLEN=LENGTH OF MAP IF MAPPED OR UNMODIFIED.+; W.NSTS=NECESSARY BITS TO RESTORE WINDOW.E0; WS.SIS=1 IF WINDOW IS IN SUPERVISOR I SPACE.!; WS.MAP=1 IF WINDOW IS MAPPED.F3; WS.WRT=1 IF WINDOW IS MAPPED WITH WRITE ACCESS.A;E<; NOTE: ON SYSTEMS SUPPORTING NON RESIDENT TASK HEADERS, THE4; DIRECTIVE DISPATCHER MAPS THE NON RESIDENT HEADER5; THROUGH APR6. ON THESE SYSTEMS WE WILL USE APR5 TON5; MAP TO THE USER TASK (N WINDOW DEFINITION BLOCKS).F8; THEREFORE, THIS DIRECTIVE CAN NOT GO INTO A DIRECTIVE(; PARTITION WITHOUT SOME MODIFICATIONS.;T5; WHEN MAPPING TO A TASK REGION, W.BOFF IS OFFSET BYI8; THE SIZE OF THE EXTERNAL TASK HEADER. WE WILL ADJUST9; THAT VALUE HERE SO THAT THE TASK DOES NOT KNOW WHETHERS$; OR NOT IT HAS AN EXTERNAL HEADER.;-D$DRGMX::MOV H.WND(R4),R4 ;POINT TO NUMBER OF WINDOW BLOCKS IN HEADER. MOV (R4)+,R1 ;PICK UP NUMBER OF WINDOW BLOCKS+ MOV R1,-(SP) ;SAVE NUMBER OF WINDOW BLOCKSW+ ASL R1 ;CONVERT TO BYTES TO ADDRESS CHECKS ASL R1 ; ASL R1 ;' INC R1 ;(INCLUDE WORD FOR TERMINATOR) ASL R1 ;7 MOV (R3),R3 ;PICK UP VIRTUAL ADDRESS OF WINDOW BLOCKST .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 ADDRESSX MOV R1,KISAR5 ;MAP USER BUFFERE' MOV R2,R3 ;GET KERNEL VIRTUAL ADDRESSR+ SUB #20000,R3 ;AND MAKE IT AN APR5 ADDRESS( .IFF ; DF X$$HDRI5 CALL $ACHKP ;ADDRESS CHECK AND MAP TO WINDOW BLOCKSS .ENDC ; DF X$$HDR) CLR -(SP) ;INITIALIZE WINDOW ID COUNTERA910$: TST W.BSIZ(R4) ;IS NEXT BLOCK AN ESTABLISHED WINDOW?B BNE 11$ ;IF NE YES+ ADD #W.BLGH,R4 ;POINT TO NEXT WINDOW BLOCKC, BR 40$ ;BRANCH TO DETERMINE IF MORE BLOCKS+11$: MOVB (SP),(R3)+ ;SET WINDOW ID (W.NID)T+ MOV (R4)+,-(SP) ;SAVE PCB ADDRESS (W.BPCB)R3 MOV (R4)+,R1 ;PICK UP LOW VIRTUAL ADDRESS (W.BLVR)S7 MOVB -1(R4),(R3) ;GET ITS HIGH BYTE (W.BLVR+1)(W.NAPR)X. ASLB (R3) ;SHIFT TO FORM APR NUMBER (W.NAPR) ROLB (R3) ;S ROLB (R3) ;  ROLB (R3)+ ;0 MOV R1,(R3)+ ;SET VIRTUAL BASE ADDRESS (W.NBAS)4 MOV (R4)+,R2 ;PICK UP HIGH VIRTUAL ADDRESS (W.BHVR)3 MOV (R4)+,R0 ;PICK ATT DESCRIPTOR ADDRESS (W.BATT)O2 MOV (R4)+,(R3)+ ;SET WINDOW SIZE (W.BSIZ)(W.NSIZ) .IF DF X$$HDR. MOV (SP)+,R2 ;GET00}{ibjbkb a a a PCB ADDRESS FOR THIS WINDOW .IFF ; DF X$$HDRP# TST (SP)+ ;IS THIS WINDOW MAPPED?L .ENDC ;DF X$$HDRM BEQ 20$ ;IF EQ NOS% MOV R0,(R3)+ ;SET REGION ID (W.NRID)RA MOV T.ATT(R5),-(SP) ;PUSH ADDRESS OF FIRST ATTACHMENT DESCRIPTOR & SUB #A.TCBL,(SP) ;POINT TO FIRST WORD CMP R0,(SP)+ ;TASK REGION? BNE 15$ ;IF NE NOP7 CLR -2(R3) ;SET IT TO DEFAULT TO TASK REGION (W.NRID)E .IF DF X$$HDR015$: MOV (R4)+,(R3) ;SET OFFSET W.BOFF TO W.NOFF6 MOVB P.HDLN(R2),R2 ;GET SIZE OF XTRNL HEADER (IF ANY)- SUB R2,(R3)+ ;ADJUST OFFSET BY HEADER LENGTHT3 MOV W.BHVR-W.BFPD(R4),R2 ;RESTORE HIGH VA (W.BHVR)D .IFF ; DF X$$HDR115$: MOV (R4)+,(R3)+ ;SET OFFSET (W.BOFF)(W.NOFF)A .ENDC ; DF X$$HDR SUB R1,R2 ;CALCULATE LENGTHO ADD #1,R2 ;L ROL R2 ;CONVERT TO 32W BLOCKSR ROL R2 ; ROLB R2 ;B SWAB R2 ;E& MOV R2,(R3)+ ;SET THE LENGTH (W.NLEN)/ TST (R4)+ ;ADVANCE TO LAST PDR IMAGE (W.BFPD)M8 MOV (R4)+,(R3) ;PICK UP LAST PDR IMAGE (W.BLPD)(W.NSTS)7 BIC #^C4,(R3) ;CLEAR ALL BUT WRITE ACCESS BIT (W.NSTS)A% ASR (R3) ;SHIFT INTO PLACE (W.NSTS)B .IF DF U$$DAS2 BITB #20,W.BFPD-W.BLGH(R4) ;USER D SPACE WINDOW ? BEQ 18$ ;IF EQ NO 0 BIS #WS.UDS,(R3) ;SET USER D SPACE BIT (W.NSTS) BR 19$ ;SKIP SUPER I CHECK18$: ;REFERENCE LABEL .ENDC ; DF U$$DAS .IF DF S$$LIB3 TSTB W.BFPD-W.BLGH(R4) ;SUPERVISOR I SPACE WINDOW?W BMI 19$ ;IF MI NOA6 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$ ;920$: ADD #W.NSTS-W.NRID,R3 ;POINT TO NEXT WINDOW ID BLOCKD2 ADD #W.BLGH-W.BOFF,R4 ;POINT TO NEXT WINDOW BLOCK CLR (R3)+ ;CLEAR STATUS WORD?30$: TST (R3)+ ;SKIP OVER SEND/RECEIVE BUFFER ADDRESS (W.NSRB)P40$: INC (SP) ;BUMP WINDOW ID CMP (SP),2(SP) ;DONE YET? BLO 10$ ;IF LO NOB; MOV (SP)+,(R3) ;STORE NUMBER OF HEADER SLOTS AS TERMINATORI NEG (R3) ;AND NEGATE TST (SP)+ ;CLEAN STACK .IF NDF K$$DAST/ MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACEW .ENDC ; NDF K$$DAS) RETURN ;0 .IF DF X$$HDR50$: DRSTS D.RS98 ;BAD ADDRESSC .ENDC ; DF X$$HDR .ENDC ; DF P$$LAS;+; **-$DRQRQ-QUEUE I/O REQUEST ;D@; THIS ROUTINE IS CALLED TO OPTIONALLY INSERT AN I/O PACKET INTO7; A CONTROLLER QUEUE AND TO CALL THE DRIVER TO INITIATEE; ACTIVITY ON THE DEVICE.M;(@; IF THE DEVICE SUPPORTS SEEK OPTIMIZATION AND THE PACKET IS FOR9; A LOGICAL TRANSFER FUNCTION, THE LBN FOR THE REQUEST IS@; BLOCK CHECKED AND CONVERTED TO THE SECTOR/TRACK/CYLINDER FORM.9; THE BLOCK CHECK ROUTINE IS IN THE CORRESPONDING DRIVER.R; ; INPUTS:S;; R1=ADDRESS OF THE I/O PACKET.D'; R5=ADDRESS OF THE UNIT CONTROL BLOCK.U; ; OUTPUTS:;U5; IF NO I/O PACKET IS SPECIFIED AS INPUT (R1 = 0) THE5; DRIVER IS SIMPLY CALLED TO INITIATE ACTIVITY ON THEE/; DEVICE. THIS OPTION ALLOWS US TO RE-INITIATE .; ACTIVITY ON A DEVICE WHEN IT HAS SATISFIED A; STALLED I/O STATE.;N6; IF AN I/O PACKET IS SPECIFIED AS INPUT, IT IS PLACED3; IN THE CONTROLLER QUEUE AND ACTIVITY IS INITIATEDL; ON THE DEVICE.;I(; NOTE: R4 IS DESTROYED BY THIS ROUTINE.;-$DRQRQ:: ;REFERENCE LABELK6 MOV U.SCB(R5),R4 ;GET ADDRESS OF STATUS CONTROL BLOCK% MOV (R5),R2 ;GET ADDRESS OF THE DCB / MOV KINAR5,-(SP) ;SAVE KERNEL INSTRUCTION APR5  .IF DF K$$DAS( MOV KDSAR5,-(SP) ;SAVE KERNEL DATA APR5 .IFTF ;K$$DAS* .IF DF D$$CHE ;DISK DATA CACHING SUPPORT TST R1 ;I/O REQUEST?" BEQ 10$ ;NO, CAN'T CACHE NOTHING> CMP KINAR5,$DRCHE ;REQUEST FROM CACHE? (CHECK KINAR5 MAPPING)1 BEQ 10$ ;YES IF EQ; CACHE ALWAYS BYPASSES CACHEE/ BIT #DV.MSD,U.CW1(R5) ;POSSIBLY A DISK DEVICE?E( BEQ 10$ ;NO IF EQ; DON'T BOTHER CACHER< BIT #DV.SQD,U.CW1(R5) ;IS THIS POSSIBLE DISK REALLY A TAPE?. BNE 10$ ;YES IF NE; DON'T CACHE THESE EITHER4 MOV $DRCHE,KINAR5 ;MAP CACHER [DIRECTIVE] PARTITION1 BEQ 10$ ;IF EQ NOT PRESENT IN RUNNING EXECUTIVE ( MOV R2,-(SP) ;SAVE REGISTER ACROSS CALL0 CALL @#120000 ;HOPE THIS CACHE CALL IS WORTH IT" MOV (SP)+,R2 ;RESTORE DCB ADDRESS; RETURNS FR00}}t__DATADATADATADATAOM CACHER:C; R1 -> I/O PACKET = FORWARD REQUEST TO DRIVER, NO CACHE PROCESSING):; R1 = 0 CACHER ACCEPTED REQUEST, DON'T FORWARD TO DRIVER TST R1 ; DID CACHER CATCH IT?S .IF DF S$$HDW/ BNE 10$ ; CACHE DIDN'T HANDLE IT, CALL DRIVERA. JMP $QOPDN ; FINISH THE I/O, NOTHING IS LEFT .IFF ;DF S$$HDW2 BEQ $QOPDN ; CACHE HANDLED IT, DON'T CALL DRIVER .ENDC ;DF S$$HDWS10$: .ENDC ;D$$CHE) MOV D.PCB(R2),R3 ;GET DRIVER PCB ADDRESS ' BEQ 20$ ;IF EQ DRIVER IS PART OF EXEC< MOV P.REL(R3),KINAR5 ;MAP KERNEL INSTRUCTION APR5 TO DRIVER .IFT ;K$$DASE5 MOV P.REL(R3),KDSAR5 ;MAP KERNEL DATA APR5 TO DRIVERR .IFTF ;K$$DAS#20$: TST R1 ;I/O PACKET TO QUEUE ?D .IF DF S$$HDW .IFF ;DF,S$$HDW) BEQ 40$ ;IF EQ, NO - SIMPLY CALL DRIVERN .IFT ;DF,S$$HDW* BNE 21$ ; if NE, process the I/O request" JMP 40$ ; Simply call the driver;.#; COPY THE I/O PACKET FOR SHADOWING$;E'21$: MOV R4,-(SP) ;SAVE THE SCB ADDRESSR3 MOV R1,R3 ;COPY THE I/O PACKET ADDRESS FOR $SHFNDP$ CALL $SHFND ;THIS DEVICE SHADOWED? BCS 35$ ;IF CS NO, DON'T COPYE% .IF DF,S$$HLS ; shadow load sharing?A. TSTB ML.DNC(R4) ; Has another part completed?" BNE 35$ ; Yes, don't copy it ... .ENDC ;DF,S$$HLSD/ CMP ML.PRI(R4),R1 ;IS THIS THE PRIMARY PACKET?E BNE 35$ ;IF NE NO, DON'T COPY 8 MOV #I.LGTH/2,R0 ;GET THE NUMBER OF WORDS IN THE PACKET632$: MOV (R1)+,(R2)+ ;COPY THE NEXT WORD IN THE PACKET% SOB R0,32$ ;LOOP FOR REST OF PACKETR3 SUB #I.LGTH,R1 ;GET THE PRIMARY I/O PACKET ADDRESSH& 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 PACKET)"35$: MOV (SP)+,R4 ;RESTORE THE SCB% MOV (R5),R2 ;GET ADDRESS OF THE DCB; .ENDC ;S$$HDW .IF DF,S$$HDW&S$$HLSM* CLR (R1) ; clear flag for LBN translated;+E; Implement shadowed device load sharing, to lower the I/O requests+I; to the shadow primary, and also to allow overlapped seeks to be startedC2; while a data transfer is assumed in progress ...;S-; The general algorithm of this section is;V;U=; Determine if either SCB is busy, and other SCB idle. If so,T; select the idle SCB.;MF; If both SCB's are busy/idle, determine if one of the units are idle.; If so, select the idle unit.;W>; If both units are both busy or idle, and the devices supportG; seek optimization, convert the packet LBN, and determine which devicee ; is nearest to the I/O request.;eA; If the difference between the current and desired cylinders are I; the same between both devices, or if seek optimization is not supportedeF; on both units, then the selection is made by alternating between the; primary and secondary units.;uD; For special cases such as error recovery, no optimization is made,/; and the request goes to the device specified.i;,;-8 CMPB I.FCN+1(R1),#IO.RLB/256. ; is this a read request?- BEQ 351$ ; if EQ, yes, continue the processe CALLR 360$ ; branch aid ...t9351$: MOV R1,R3 ; Copy the I/O packet address for $SHFND( CALL $SHFND ; Is this device shadowed?/ BCS 3515$ ; If CS no, no sharing possible ...,. TSTB ML.DNC(R4) ; are we attempting recovery?% BNE 3515$ ; yes, don't optimize ...u& MOV R5,-(SP) ; save R5 for $CKLBN ...6 MOV U.UMB(R5),R5 ; and extract the target UMB address5 CALL $CKLBN ; check if LBN is legal on both devicesL, ; this will also handle IO.SCF functions' MOV (SP)+,R5 ; restore our UCB addressL3 BCC 3517$ ; if CC, LBN is valid, check load share #3515$: CALLR 359$ ; branch aid ...L-3517$: MOV U.UMB(R5),R4 ; get the UMB address , MOVB M.STS(R4),R4 ; get the UMB status byte- BITB #MS.DSC,R4 ; is the secondary disabled?15 BNE 3515$ ; if NE, yes, queue to the primary deviceR% ASSUME MS.LDS,200 ; sign bit assumed  TSTB R4 ; is sharing enabled?C( BPL 3515$ ; if PL, no, don't share ...6 BITB #MS.ACP,R4 ; are ACP requests forced to primary?. BEQ 352$ ; if EQ, no, use standard algorithm8 CMP I.TCB(R1),U.ACP(R5) ; is this the devices ACP task?- BEQ 3515$ ; if EQ, yes, pass to the prim00}{ibjbkb a a aaryR;+'; Determine which SCB is not busy ...,;-=352$: MOV I.UCB(R2),R3 ; get the secondary device UCB address 0 MOV U.SCB(R3),R0 ; and the secondary device SCB2 BITB #MS.DPR,R4 ; is the primary device disabled?1 BNE 357$ ; if NE, yes, use the secondary device 3 MOV U.SCB(R5),R4 ; restore the primary SCB addressA. CMP R0,R4 ; are both devices on the same SCB, BEQ 355$ ; if EQ, yes, status is identical& TSTB S.STS(R4) ; primary device busy? BEQ 353$ ; if EQ, nope ...( TSTB S.STS(R0) ; secondary device busy?+ BEQ 357$ ; if EQ, nope, use secondary UCB2! BR 355$ ; check unit status ... -353$: TSTB S.STS(R0) ; secondary device busy?e, BNE 3515$ ; if NE, yes, use primary device;+'; Determine which UCB is not busy ...t;-+355$: TSTB U.STS(R5) ; is the primary busy?r' BPL 3552$ ; if PL, nope, not busy ... ( TSTB U.STS(R3) ; is the secondary busy?' BPL 357$ ; if PL, nope, use secondaryT BR 3555$ ; check cylinders.3552$: TSTB U.STS(R3) ; is the secondary busy?% BMI 3515$ ; if MI, yes, use primary ;+E; Both devices are busy, or idle, so now we will scan to select which$/; has the highest chance of completing fast ...3;$;; If the device supports seek optimization, convert the LBN 2; into device specific parameters for the scan ...;-13555$: .IF DF,S$$OPT ; seek optimization support? 5 BIT #S2.OPT,S.ST2(R4) ; seek optimization supported?7* BEQ 356$ ; if EQ, toggle between devices, BIT #S2.OPT,S.ST2(R0) ; does the secondary?* BEQ 356$ ; if EQ, toggle between devices;+A; Convert the LBN into device dependent parameters, and determinel?; if one device is closer than the other, optimization wise ...s;.@; Since the device check routine calls $BLKCK, we cannot save/; any parameters on the stack at this point ...n;.A; Note: This routine will only work correctly if the device is2@; utilizing the "nearest" form of seek optimization, and will be; verified as such ...;-= MOV S.ST2(R0),-(SP) ; get the optimization mode of secondaryQ4 BIS S.ST2(R4),(SP) ; and or in the primary opt mode6 BIT #,(SP)+ ; both using nearest mode?+ BNE 356$ ; if NE, nope, use toggle methods2 MOV (R5),R2 ; get the DCB address of the primary8 MOV D.DSP(R2),R2 ; Get address of driver dispatch table7 CALL @D.VCHK(R2) ; Call driver for block check and cvtk) INC (R1) ; flag LBN translated in I.LNK ) MOV R1,R3 ; set up for $SHFND again ... 0 CALL $SHFND ; and locate our packets again ...1 MOV I.UCB(R2),R3 ; restore the other UCB addressS) MOV KISAR6,-(SP) ; save our APR6 mappinge( MOV U.UCBX(R5),KISAR6 ; map to the UCBX0 MOV X.CCYL+140000,R0 ; get our current cylinder8 SUB I.PRM+10(R1),R0 ; and form the delta cylinder count* BGE 3556$ ; if GE, forward direction ...( NEG R0 ; create the absolute value ...83556$: MOV U.UCBX(R3),KISAR6 ; map to the secondary UCBX2 MOV X.CCYL+140000,R4 ; get their current cylinder6 SUB I.PRM+10(R1),R4 ; and form a delta cylinder count* BGE 3557$ ; if GE, forward direction ...' NEG R4 ; create the absolute value ..o;3557$: MOV (SP)+,KISAR6 ; restore the previous APR6 mappingM CMP R0,R4 ; which is closest?n& BLO 359$ ; select the primary device! BHI 357$ ; select the secondary3;+<; Toggle between devices ... everybody is the same distance;- .ENDC ;DF,S$$OPT:356$:U .IF DF,M$$PRO ; mP supporte;+?; In an mP environment, we can also check if a particular KRBB!; is available on the current CPU ;-. MOV U.SCB(R5),R0 ; get the primary device SCB# TSTB S.STS(R0) ; is this SCB busy?u. BNE 3569$ ; if NE, yes, don't check here ...- CALL 3565$ ; check if a port is on this CPUc1 BCC 359$ ; if CC, the primary is available herei0 MOV U.SCB(R3),R0 ; and the secondary device SCB+ CALL 3565$ ; check if a port is availablei) BCS 3569$ ; if CS, go and alternate ...F' BR 357$ ; continue with the secondaryP=3565$: MOV #S2.LDS!S2.MAD,-(SP) ; set the status or multiportb' MOV S.KRB(R0),R4 ; get our current KRB)) BIC S.ST2(R0),(SP)+ ; are both bits set00}}t__DATADATADATADATA?(* BNE 3567$ ; if NE, then both are not set* ADD #S.KTB,R0 ; adjust to the KTB address&3566$: MOV (R0)+,R4 ; get a port entry3 BEQ 3568$ ; if EQ, end of the table, complain ...U' BIT #KP.OFL,R4 ; if this port offline?' BNE 3566$ ; if NE, yes, try next portl CALL 3567$ ; check this KRBl" BCS 3566$ ; if CS, not this port RETURN ; to caller523567$: BIT @$CPURM,K.URM(R4) ; is this on our CPU? BEQ 3568$ ; report the error* TSTB K.IOC(R4) ; is this controller busy?% BNE 3568$ ; if NE, no gain here ...e' TST (PC)+ ; skip the next instructions3568$: SEC ; set carry RETURN ; to caller 3569$: .ENDC ;DF,M$$PRO ; mP support5 ASSUME M.FLG-1,M.STS ; assume flag byte is high byteo$ ASSUME MF.LDS,200 ; assume sign bit, MOV U.UMB(R5),R4 ; get back the UMB address* MOV #MF.LDS*256.,R0 ; set up our XOR mask) XOR R0,M.STS(R4) ; set up a polarity ...M& BMI 359$ ; if MI, use primary device;+G; Use the secondary device ... Update packets, UCB's, and drivers ... ;-2357$: MOV (R1),(R2) ; propogate the translate flag* BEQ 358$ ; if EQ, LBN not translated ...4 MOV I.PRM+10(R2),R4 ; save the high order portion3 MOV I.PRM+10(R1),I.PRM+10(R2) ; propogate the info 5 MOV R4,I.PRM+10(R1) ; and update the high LBN infoV3 MOV I.PRM+12(R2),R4 ; save the low order portion23 MOV I.PRM+12(R1),I.PRM+12(R2) ; propogate the info 4 MOV R4,I.PRM+12(R1) ; and update the low LBN info*358$: CLR (R1) ; and flag as not adjusted- MOV R2,R1 ; select the secondary packet ...O# MOV R3,R5 ; and a new UCB address # MOV (R5),R2 ; get the DCB addressn' MOV D.PCB(R2),R3 ; get the PCB address # BEQ 359$ ; if EQ, resident driver(, MOV P.REL(R3),KINAR5 ; map driver into APR5 .IF DF,K$$DAS ; Kernel D-spaceh, MOV P.REL(R3),KDSAR5 ; and map into D-space .ENDC ;DF,K$$DAS20359$: MOV U.SCB(R5),R4 ; restore the SCB address4 MOV (R5),R2 ; insure we have the DCB address in R2*360$: TST (R1) ; need to translate LBN's?# BNE 30$ ; nope, skip the call ...a .ENDC ;DF,S$$HDW&S$$HLS5 BIT #S2.OPT,S.ST2(R4) ;SEEK OPTIMIZATION SUPPORTED?r BEQ 30$ ;IF EQ NO)7 MOV D.DSP(R2),R2 ;GET ADDRESS OF DRIVER DISPATCH TABLEd6 CALL @D.VCHK(R2) ;CALL DRIVER FOR BLOCK CHECK AND CVT730$: BITB #UC.QUE,U.CTL(R5) ;QUEUE PACKET BEFORE CALL?  BNE 40$ ;IF NE NOe. MOV R4,R0 ;SET ADDRESS OF I/O QUEUE LISTHEAD/ CALL $QINSP ;QUEUE I/O PACKET IN DEVICE QUEUEw640$: MOV (R5),R2 ;GET ADDRESS OF DEVICE CONTROL BLOCK;+; ** W A R N I N G **$; ; SPM HOOKPOINT NUMBER 16.;N); DO NOT CHANGE THE INSTRUCTION FOLLOWINGR; LABEL WITHOUT CHECKING SPM;-+$SPH16==. ;SPM CHANGES THE INSTRUCTION ATA ;THE LOCATION OF THIS LABEL7 MOV D.DSP(R2),R2 ;GET ADDRESS OF DRIVER DISPATCH TABLE:( CALL @D.VINI(R2) ;CALL DRIVER INITIATOR.$QOPDN:: ;$BLKC2 RETURNS HERE AFTER AN ERROR .IFTO+ MOV (SP)+,KDSAR5 ;RESTORE KERNEL DATA APR5P .ENDC2 MOV (SP)+,KINAR5 ;RESTORE KERNEL INSTRUCTION APR5 RETURN ;@$DRWFA::MOV #$DRWFS,-(SP) ;POINT TO WAIT FOR SINGLE FLAG ROUTINE;++;**-$MPDC1-MAP TO AND CALL DIRECTIVE COMMONU;HF; THIS ROUTINE IS CALLED TO TRANSFER CONTROL TO A ROUTINE IN THE FIRSTF; DIRECTIVE COMMON, THEN RESTORE THE CURRENT MAPPING AND RETURN TO THE ; CALLER.:; ; INPUTS:N;2"; (SP) = RETURN ADDRES AFTER CALL!; 2(SP) = ROUTINE ADDRESS TO CALLR; ; OUTPUTS:;(; NONE.R;R/; REGISTERS AND C-BIT ARE PRESERVED ACROSS CALL+;N;- .ENABL LSBE$MPDC3:: .IF DF D$$PAR .IF DF K$$DAS/ MOV KDSAR5,-(SP) ;SAVE CURRENT D SPACE MAPPINGI $$$=4 .IFF ; DF K$$DASN $$$=2 .IFTF ; DF K$$DAS+ MOV $$$(SP),-(SP) ;COPY ADDRESS OF ROUTINE 9 MOV $$$(SP),$$$+2(SP) ;PUT RETURN ADDRESS IN RIGHT PLACEC. MOV KINAR5,$$$(SP) ;SAVE CURRENT APR5 MAPPING, MOV $DRAP3,KINAR5 ;MAP 2ND DIRECTIVE COMMON .IFT ; DF K$$DAS 0 MOV $DRAP3,KDSAR5 ;MAP IT IN DATA SPACE AS WELL .ENDC ; DF K$$DAS0 BR 10$ ;FINISH IN COMMON WITH MAP FIRST COMMON .IFTF ; DF D$$PAR$MPDC4:: .IFT ; DF D$$PARS .IF DF K$$DAS/ M00}{ibjbkb a a aOV KDSAR5,-(SP) ;SAVE CURRENT D SPACE MAPPINGN $$$=4 .IFF ; DF K$$DASD $$$=2 .IFTF ; DF K$$DAS+ MOV $$$(SP),-(SP) ;COPY ADDRESS OF ROUTINE 9 MOV $$$(SP),$$$+2(SP) ;PUT RETURN ADDRESS IN RIGHT PLACEU. MOV KINAR5,$$$(SP) ;SAVE CURRENT APR5 MAPPING, MOV $DRAP4,KINAR5 ;MAP 2ND DIRECTIVE COMMON .IFT ; DF K$$DAST0 MOV $DRAP4,KDSAR5 ;MAP IT IN DATA SPACE AS WELL .ENDC ; DF K$$DAS0 BR 10$ ;FINISH IN COMMON WITH MAP FIRST COMMON .IFTF ; DF D$$PAR$MPDC2:: .IFT ; DF D$$PARS .IF DF K$$DAS/ MOV KDSAR5,-(SP) ;SAVE CURRENT D SPACE MAPPINGD $$$=4 .IFF ; DF K$$DASD $$$=2 .ENDC ; DF K$$DAS+ MOV $$$(SP),-(SP) ;COPY ADDRESS OF ROUTINE 9 MOV $$$(SP),$$$+2(SP) ;PUT RETURN ADDRESS IN RIGHT PLACEU. MOV KINAR5,$$$(SP) ;SAVE CURRENT APR5 MAPPING, MOV $DRAP2,KINAR5 ;MAP 2ND DIRECTIVE COMMON0 BR 10$ ;FINISH IN COMMON WITH MAP FIRST COMMON .IFTF ; DF D$$PAR$MPDCV:: .IFT ; DF D$$PAR  .IF DF K$$DAS/ MOV KDSAR5,-(SP) ;SAVE CURRENT D SPACE MAPPING $$$=4 .IFF ; DF K$$DASR $$$=2 .ENDC ; DF K$$DAS+ MOV $$$(SP),-(SP) ;COPY ADDRESS OF ROUTINE9 MOV $$$(SP),$$$+2(SP) ;PUT RETURN ADDRESS IN RIGHT PLACE . MOV KINAR5,$$$(SP) ;SAVE CURRENT APR5 MAPPING, MOV $DRAPV,KINAR5 ;MAP 2ND DIRECTIVE COMMON0 BR 10$ ;FINISH IN COMMON WITH MAP FIRST COMMON .IFTF ; DF D$$PAR$MPDC1:: .IFT ; DF D$$PAR  .IF DF K$$DAS5 MOV KDSAR5,-(SP) ;SAVE CURRENT D SPACE APR 5 MAPPINGD .ENDC ; DF K$$DAS+ MOV $$$(SP),-(SP) ;COPY ADDRESS OF ROUTINE9 MOV $$$(SP),$$$+2(SP) ;PUT RETURN ADDRESS IN RIGHT PLACEV. MOV KINAR5,$$$(SP) ;SAVE CURRENT APR5 MAPPING+ MOV $DRAPR,KINAR5 ;MAP TO DIRECTIVE COMMON '10$: CALL @(SP)+ ;CALL DESIRED ROUTINE  .IF DF K$$DAS9 MOV (SP)+,KDSAR5 ;RESTORE PREVIOUS D SPACE APR 5 MAPPINGI .ENDC ; DF K$$DAS+ MOV (SP)+,KINAR5 ;RESTORE PREVIOUS MAPPINGF RETURN ;  .IFF ; DF D$$PAR* CALLR @(SP)+ ;DIRECT TRANSFER TO ROUTINE .ENDC ; DF D$$PAR .DSABL LSBM;+$; **-$CPXXX- STUB ROUTINES FOR CPRSX;-:; THIS MODULE PROVIDES GLOBAL ENTRY POINTS TO MAP AND CALL-; ROUTINES IN THE CPRSX COMMUNICATION DRIVER.$;P .ENABL LSBO$CPCON::* .IF DF C$$RMT ;IF REMOTE SYSTEM SERVICES) MOV #CPRCON,R3 ;SAVE OUR CALLING ADDRESS  BR 10$ ;JOIN COMMON CODE .IFTF ;C$$RMT$CPALO:: .IFT ;C$$RMTP) MOV #CPRALO,R3 ;SAVE OUR CALLING ADDRESS  BR 10$ ;JOIN COMMON CODE .IFTF ;C$$RMT$CPDEA:: .IFT ;C$$RMT) MOV #CPRDEA,R3 ;SAVE OUR CALLING ADDRESS  BR 10$ ;JOIN COMMON CODE .IFTF ;C$$RMT$CPRCV:: .IFT ;C$$RMT ) MOV #CPRRCV,R3 ;SAVE OUR CALLING ADDRESSS BR 10$ ;JOIN COMMON CODE .IFTF ;C$$RMT$CPABO:: .IFT ;C$$RMTI) MOV #CPRABO,R3 ;SAVE OUR CALLING ADDRESSS BR 10$ ;JOIN COMMON CODE .IFTF ;C$$RMT$CPSEN:: .IFT ;C$$RMTC) MOV #CPRSEN,R3 ;SAVE OUR CALLING ADDRESSS10$:. MOV @#KINAR5,-(SP) ;SAVE APR5 I SPACE MAPPING. MOV @#KISAR5,-(SP) ;SAVE APR5 D SPACE MAPPING$ MOV $KXBAS,@#KISAR5 ;MAP THE DRIVER$ MOV $KXBAS,@#KINAR5 ;MAP THE DRIVER CALL @(R3) ;CALL THE ROUTINE1 MOV (SP)+,@#KISAR5 ;RESTORE APR5 D SPACE MAPPINGD1 MOV (SP)+,@#KINAR5 ;RESTORE APR5 I SPACE MAPPINGR .ENDC ;C$$RMT RETURN .DSABL LSBR";$IMASG - IMPLICIT ASSIGN LUN CALL;OM; THIS ROUTINE IS USED BY QIO, GLUN, GDVI ETC. TO JUMP TO ALUN FROM THE OTHERR(; DIRECTIVE COMMONS FOR RUN TIME BINDING;N$IMASG::) .IF DF C$$RTB ;RUN TIME BINDING SUPPORTP' MOV $DRAPR,KINAR5 ;MAP TO FIRST COMMON#' MOV $DRAPR,KDSAR5 ;MAP IN D-SPACE ALSOA& JMP $IMAS1 ;JUMP TO ROUTINE IN DRASG .ENDC ; C$$RTB+;+A; **-$MPPRO- MAP AND CALL SPECIFIED PROCESS THEN RETURN TO CALLERR; E; THIS ROUTINE IS CALLED TO MAP AND CALL THE ROUTINE INDICATED BY THES>; ADDRESS DOUBLE WORD ON THE STACK. MAPPING IS DONE VIA APR5.;U ; INPUTS:.; #; (SP) = RETURN ADDRESS AFTER CALLT!; 2(SP) = ROUTINE ADDRESS TO CALLN$; 4(SP) = MAPPING OF ROUTINE TO CALL;I ; OUTPUTS:;; NONE.R;,; ALL REGISTERS ARE PRESERVED.;-$MPPRO::) MOV 2(SP),-(SP)00}}t__DATADATADATADATA ;COPY ADDRESS OF ROUTINET" MOV KISAR5, 4(SP) ;COPY APR5 BIAS+ MOV 6(SP),KISAR5 ;MAP ROUTINE TO BE CALLED & MOV 2(SP), 6(SP) ;COPY RETURN ADDRESS .IF DF K$$DAS. MOV KINAR5,2(SP) ;FOR I/D SYSTEMS SAVE KINAR5# MOV KISAR5, KINAR5 ;AND MAP KINAR5M .IFF ; DF K$$DASR* 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;R4; THIS ROUTINE LOCATES THE CPB FOR THE SPECIFIED CLI;U ; INPUTS:;.(; R3=ADDRESS OF CLI NAME STORED IN RAD50;S ; OUTPUTS:;5; C=1 CLI DOES NOT EXIST; C=0 CLI SUCCESSFULLY FOUND'; R1=OFFSET TO ENTRY FOR CLI IN $CPTBLF; R4=CPB ADDRESS;C3; REGISTERS R0, R2 AND R3 ARE PRESERVED ACROSS CALL ;D;- .IF DF A$$CLIF$FNCLI::MOV #$NMCLI!40000,-(SP) ;GET NUMBER OF CLIS SYSTEM CAN SUPPORT% CLR R1 ;START AT BEGINNING OF TABLET)10$: MOV $CPTBL(R1),R4 ;POINT TO NEXT CPBS BEQ 20$ ;IF EQ, EMPTY SLOT% CMP C.PNAM(R4),(R3) ;IS THIS THE CLII BNE 20$ ;IF NE NO CMP C.PNAM+2(R4),2(R3) ;MAYBE BEQ 30$ ;IF EQ YES220$: TST (R1)+ ;SET OFFSET FOR NEXT SLOT IN TABLE! DECB (SP) ;IS THERE A SLOT LEFTO BGT 10$ ;IF GT YES, ASL (SP) ;PUT BIT IN POSITION TO SET CARRY430$: ASL (SP)+ ;POP STACK AND SET APPROPRIATE CARRY RETURN: .IFF ;A$$CLI,>$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 MCR  BNE 10$ ;IF NE NOA TST 2(R3) ;MATCH MUST BE EXACT BEQ 20$ ;IF EQ, OK10$: SEC ;NOT LOOKING FOR MCR3 20$: RETURNS#$STCLI==-1 ;DEFINE SYMBOL FOR MCRS;+; **-$STCLI-SET CLII;H?; THIS ENTRY POINT EXISTS SO ROUTINES OUTSIDE THE EXECUTIVE CANSA; CALL THE ROUTINE TO SET A TERMINALS CLI ON SYSTEMS THAT SUPPORTC?; THE DIRECTIVE COMMON. THE ROUTINE ITSELF RESIDES IN THE DRCLI &; MODULE. CHECK THERE FOR ALL DETAILS.;;;- .IFT ;A$$CLII .IF DF D$$PAR=$STCLI::MOV #$STCL1,-(SP) ;GET ADDRESS OF ALT ENTRY IN COMMONM;HA; R3 POINTS TO THE NAME OF THE CLI THAT THE TERMINAL IS TO BE SETCB; TO. IF A TASK IS CALLING $STCLI, THE NAME COULD BE IN TASK SPACE<; THAT WILL BE UNMAPPED WHEN THE DIRECTIVE COMMON IS MAPPED.A; THEREFORE, $FNCLI MUST BE CALLED BEFORE THE MAPPING IS CHANGED. 9; NOTE: $MPCM2 MUST PRESERVE ALL REGISTERS AND THE C BIT.N;T% CALL $FNCLI ;FIND THE SPECIFIED CLIH# CALL $MPDC2 ;MAP AND CALL ROUTINE RETURN ;I .ENDC ;D$$PAR .ENDC ;A$$CLI;+/; **-$SNCMD-SEND NEXT COMMAND TO CLI DISPATCHER3;I>; THIS ROUTINE IS CALLED UPON COMPLETION OF THE EXECUTION OF AA; CLI COMMAND, WHEN THE TI: TERMINAL HAS SERIAL COMMAND EXECUTIONH?; ENABLED. IT CALLS THE TTDRV AT THE APPROPRIATE ENTRY POINT TOFD; CAUSE IT TO FIND THE NEXT COMMAND IN THE TYPEAHEAD BUFFER AND SEND"; IT TO MCR... TO START EXECUTION.;E ; INPUTS:T;C ; R0=UCB ADDRESS OF TI: TERMINAL; ; OUTPUTS:;M; NONE; ;-$SNCMD::1 .IF NDF R$$PRO ;NO SERIAL COMMAND MORE FOR P/OS/ BIT #DV.PSE,U.CW1(R0) ;IS TI: A PSEUDO DEVICE?I BNE 10$ ;IF NE, EXIT8 BIT #UM.SER,U.MUP(R0) ;TERMINAL IN SERIAL COMMAND MODE? BEQ 10$ ;IF EQ NOH MOV (R0),R2 ;POINT TO DCB' MOV KINAR5,-(SP) ;SAVE CURRENT MAPPINGO MOV KINAR6,-(SP) ;... .IF DF K$$DAS* MOV KDSAR5,-(SP) ;SAVE DATA SPACE MAPPING MOV KDSAR6,-(SP) ;... .IFTF) MOV D.PCB(R2),R3 ;POINT TO PCB FOR TTDRV ! MOV P.REL(R3),KINAR5 ;MAP DRIVER  .IFT, MOV P.REL(R3),KDSAR5 ;MAP DRIVER IN D SPACE .IFTF* MOV D.DSP(R2),R2 ;POINT TO DISPATCH TABLE2 CALL @D.VNXC(R2) ;CALL TTDRV TO SEND NEXT COMMAND .IFTR- MOV (SP)+,KDSAR6 ;RESTORE DATA SPACE MAPPINGI- MOV (SP)+,KDSAR5 ;RESTORE DATA SPACE MAPPINGN .ENDC4 MOV (SP)+,KINAR6 ;RESTORE INSTRUCTION SPACE MAPPING4 MOV (SP)+,KINAR5 ;RESTORE INSTRUCTION SPACE MAPPING .ENDC ;R$$PRO 10$: RETURNF@; THIS MODULE CONTAINS ROUTINES WHICH MUST BE REMOVED FROM OTHERA; DIRE00}{ibjbkb a a aCTIVE MODULES SINCE THEY CAN NOT BE PLACED IN THE DIRECTIVES; COMMON .IF DF G$$GEF;+C; **-$ELGEF-SUBROUTINE TO ELIMINATE A GROUP GLOBAL EVENT FLAG BLOCKC;AI; THIS SUBROUTINE UNCONDITIONALLY UNLINKS A GROUP GLOBAL EVENT FLAG BLOCKK; AND DEALLOCATES IT.C;A ; INPUTS:.;C9; R0=ADDRESS OF BLOCK POINTING TO BLOCK TO BE DEALLOCATED&; R1=ADDRESS OF BLOCK TO BE ELIMINATED;E ; OUTPUTS:;N; NONE.O;-'$ELGEF::MOV (R1),(R0) ;UNLINK THE BLOCKI+ MOV R1,R0 ;SET UP TO DEALLOCATE THE BLOCKT MOV #10.,R1 ; $ CALLR $DEACB ;DEALLOCATE THE BLOCK;+-; **-$DEAGF-DEACCESS GROUP GLOBAL EVENT FLAGSU;UG; THIS ROUTINE DETERMINES IF GROUP GLOBAL EVENT FLAGS EXIST FOR A TASK. +; IF THEY DO, THE ACCESS COUNT IN THE GROUPFE; GLOBAL EVENT FLAG BLOCK IS DECREMENTED AND THE BLOCK IS DEALLOCATED ; IF IT IS MARKED FOR DELETE.E;O ; INPUTS:1;D; R3=EVENT FLAG MASK ADDRESS; R4=TASK HEADER ADDRESS; R5=TASK TCB ADDRESS.;) ; OUTPUTS:;H; NONE.;V;-,$DEAGF::SAVNR ;SAVE NON-VOLATILE REGISTERS' MOVB H.CUIC+1(R4),R4 ;GET GROUP NUMBERO2 CALL $SRGEF ;SEARCH FOR GROUP GLOBAL EVENT FLAGS BCS 10$ ;IF CS NOT FOUND2 BIC #1,R3 ;CLEAR GROUP GLOBAL 2ND WORD INDICATOR& CMP R3,R1 ;GROUP GLOBAL EVENT FLAG ? BLO 10$ ;IF LO NOE, SUB #G.LGTH,R3 ;POINT TO BEGINNING OF BLOCK& CMP R3,R1 ;GROUP GLOBAL EVENT FLAG ? BHIS 10$ ;IF HIS NOD3 DECB T.GGF(R5) ;DECR GRP GLOBAL USE COUNT FOR TASKE& 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 GROUPO10$: RETURN ;E .ENDC ; DF G$$GEF;+7;**-$CLEDI-CALL USERS ENABLE DISABLE INTERRUPTS ROUTINER;CB; THIS ROUTINE IS CALLED FROM THE CINT$ DIRECTIVE TO MAP THE USERS0; ENABLE/DISABLE INTERRUPTS ROUTINE AND CALL IT.;O ; INPUTS:V; ; R1=ITB ADDRESS; C=0 TO ENABLE INTERRUPTS; C=1 TO DISABLE;E ; OUTPUTS:;E; NONE.C;-9$CLEDR::MOV X.DSI(R1),R2 ; GET ADDRESS OF USER ROUTINE TOF ; ENABLE/DISABLE INTERRUPTS) BEQ 10$ ; NONE - EXITB0 MOV KINAR5,-(SP) ; SAVE CURRENT MAPPING OF APR53 MOV X.REL(R1),KINAR5 ; MAP ROUTINE IN KERNEL APR 5I .IF DF K$$DAS* MOV KDSAR5,-(SP) ; SAVE D SPACE APR 5 TOO3 MOV X.REL(R1),KDSAR5 ; MAP IN DATA SPACE APR 5 TOOS .ENDC$ CALL @R2 ; CALL ROUTINE AND RETURN ; R1 = POINTER TO ITBI$ ; CC-C = 0 TO ENABLE INTERRUPTS,$ ; = 1 TO DISABLE INTERRUPTS .IF DF K$$DAS1 MOV (SP)+,KDSAR5 ; RESTORE D SPACE APR 5 MAPPINGE .ENDC ; DF K$$DAS( MOV (SP)+,KINAR5 ; RESTORE APR5 MAPPING10$: RETURN ; EXIT;+;**-$DRGLI-GET LUN INFORMANTIONR;**-$DRGIN-GET INFORMATION;**-$DREXP-EXTEND PARTITIONS;**-$DRGCL-GET COMMAND LINED;AM; THESE ARE THE TRANSFER STUBS TO MAP THE VECTOR COMMON FOR THESE DIRECTIVES.#; TWO THINGS ARE IMPORTANT TO NOTE:; @; 1) THE DRTBL TABLES MARK THE DIRECTIVES AS BEING IN THE SECONDA; COMMON SO THAT SAVE AND RESTORE OF THE FIRST COMMONS MAPPINGS?; OCCURS (OTHERWISE RETURN TO THE DISPATHCER IS IMPOSSIBLE).V;P@; 2) SINCE THESE STUB ROUTINES USE R1, ALL THE DIRECTIVES IN THE.; VETOR COMMON MUST NOT USE R1 AS AN INPUT.;- .ENABL LSBE4$DREXP::MOV #$DRXP1,R1 ; GET ADDRESS OF REAL ROUTINE BR 10$ ; FINISH IN COMMON CODE4$DRGCL::MOV #$DRGC1,R1 ; GET ADDRESS OF REAL ROUTINE BR 10$ ; FINISH IN COMMON CODE4$DRGIN::MOV #$DRGN1,R1 ; GET ADDRESS OF REAL ROUTINE BR 10$ ; FINISH IN COMMON CODE4$DRGLI::MOV #$DRGL1,R1 ; GET ADDRESS OF REAL ROUTINE BR 10$ ; FINISH IN COMMON CODE810$: MOV $DRAPV,KINAR5 ; MAP TO VECTOR COMMON IN I SPACE .IF DF K$$DAS4 MOV $DRAPV,KDSAR5 ; MAP TO VECTOR COMMON IN D SPACE .ENDC ; DF K$$DAS" JMP (R1) ; TO PROCESSING ROUTINE .DSABL LSB;+.;**-$DRLOG-LOGICAL NAME TRANSLATION DIRECTIVES;1>; THIS ENTRY POINT MAPS THE FOURHT COMMON AND TRANSFERS TO THEG; LOGICAL NAME ROUTINES. SEE MODULE DRLOG FOR DETAILS ON THE OPERATION.S;N;-$DRLOG:: .IF DF L$$GCL!N$$DIRG .IF DF D$$PAR/ MOV $DRAP3,KINAR5 ; MAP THIRD COMMON (I-SPACE)M00}}t__DATADATADATADATA .IF DF K$$DAS/ MOV $DRAP3,KDSAR5 ; MAP THIRD COMMON (D-SPACE) .ENDC ; DF K$$DAS .ENDC ; DF D$$PAR$ JMP $DRLG1 ; JUMP TO VECTOR COMMON .ENDC ; DF L$$GCL!N$$DIRE .IF DF L$$GCL .ENABL LSBG;+G;**-$DELO1-ROUTINE STUB FILE FOR FOURTH DIRECTIVE COMMON ROUTINE $DELOGC;O>; THIS ENTRY POINT MAPS THE FOURTH COMMON AND TRANSFERS TO THE; ROUTINE $DELOG.E;E;- .IFTF ; DF L$$GCL$DELO1:: .IFT ; DF L$$GCL8 MOV #$DELOG,-(SP) ;GET ADDRESS OF ROUTINE IN 4TH DIRCOM BR 10$ ;JOIN COMMON CODE;+G;**-$CRLO1-ROUTINE STUB FILE FOR FOURTH DIRECTIVE COMMON ROUTINE $CRLOGC;D>; THIS ENTRY POINT MAPS THE FOURTH COMMON AND TRANSFERS TO THE; ROUTINE $CRLOG..;D;- .IFTF ; DF L$$GCL$CRLO1:: .IFT ; DF L$$GCLE> MOV #$CRLOG,-(SP) ;GET ADDRESS OF ROUTINE IN DIRECTIVE COMMON BR 10$ ;JUMP TO COMMON CODER;+G;**-$LNTD1-ROUTINE STUB FILE FOR FOURTH DIRECTIVE COMMON ROUTINE $LNTDR.; >; THIS ENTRY POINT MAPS THE FOURTH COMMON AND TRANSFERS TO THE; ROUTINE $LNTDR.;;N;- .IFTF ; DF L$$GCL$LNTD1:: .IFT ; DF L$$GCLT> MOV #$LNTDR,-(SP) ;GET ADDRESS OF ROUTINE IN DIRECTIVE COMMON BR 10$ ;JOIN COMMON CODE;+G;**-$RLRLN-ROUTINE STUB FILE FOR FOURTH DIRECTIVE COMMON ROUTINE $LNTDR ;L>; THIS ENTRY POINT MAPS THE FOURTH COMMON AND TRANSFERS TO THE; ROUTINE $RLRL1;U;- .IFTF ; DF L$$GCL$RLRLN:: .IFT ; DF L$$GCLR> MOV #$RTRL1,-(SP) ;GET ADDRESS OF ROUTINE IN DIRECTIVE COMMON BR 10$ ;JOIN COMMON CODE;+K; $TBTRN - ROUTINE TO TRANSLATE THE LOGICAL TABLE NUMBER INTO AN HASH TABLE 3; OFFSET AND THEN MAP THE HASH TABLE THROUGH KISAR6I;I ; INPUTS: ; R3 - TABLE NUMBERN ; OUTPUTS:; CC - SUCCESS:N3; KISAR6 - CONTAINS MAPPING TO START OF HASH TABLEE$; CS - NO HASH TABLE VALUE AVAILABLE; "; R3, KISAR6 ARE DESTROYED BY CALL;OD; THIS ROUTINE TAKES THE SPECIFIED LOGICAL TABLE NUMBER AND TURNS ITF; INTO A WORD OFFSET INTO THE HIERARCHY TABLE IN SYSCM. THE HIERARCHYG; TABLE CONTAINS THE SECONDARY POOL POINTERS TO EACH OF THE HASH TABLESOF; IN AN ORDERED, PRECEDENCE-DERIVED SEQUENCE. SINCE THE TABLE NUMBERSE; NO LONGER HAVE ANY PRETENSE OF PRECEDENCE ORDERING, IT IS NECESSARYE; TO HASH THE VALUES INTO THE CORRECT WORD OFFSET. FROM THIS OFFSET,B; THE APR BIAS OF THE HASH TABLE IS PLACED INTO KISAR6 SO THAT ANYB; 140000-140100 KERNEL DATA REFERENCES WILL ACCESS THE HASH TABLE.;- .IFTF ;DF L$$GCLA$TBTRN:: .IFT ;DF L$$GCL MOV #$TBTRL,-(SP) BR 10$;+G;**-$LDEL1-ROUTINE STUB FILE FOR FOURTH DIRECTIVE COMMON ROUTINE $LDELXA;R>; THIS ENTRY POINT MAPS THE FOURTH COMMON AND TRANSFERS TO THE; ROUTINE $LDELX.P;E;- .IFTF ; DF L$$GCL$LDEL1:: .IFT ; DF L$$GCLH5 MOV #$LDELX,-(SP) ; SET ADDRESS TO DIRECTIVE ROUTINE?10$: CALL $MPDC3 ; MAP THE ROUTINE IN THE 3RD DIRECTIVE COMMONY .IFF ; DF L$$GCLN SEC .IFTF ; DF L$$GCL RETURNA .DSABL LSBF .ENDC ; DF L$$GCL .IF DF P$$3XX;+8; $FLIPM -- THIS ROUTINE COPIES A BUFFER AND INVERTS IT.;I ; INPUTS:T5; R0 = APR 5 ADDRESS OF LAST WD. +2 OF SOURCE BUFFERI; R1 = BIAS OF SOURCE BUFFERR#; R2 = NUMBER OF WORDS TO TRANSFERE*; R3 = APR6 ADDRESS OF TARGET USER BUFFER; ; OUTPUTS:;M; BUFFER IS TRANSFERRED; APR5 BIAS IS NOT RESTORED;-$FLIPM::1 MOV R1,KISAR5 ;SET UP APR5 BIAS OF SOURCE BUFFER!10$: MOV -(R0),(R3)+ ;MOVE A WORDF SOB R2,10$ ;LOOP TILL DONE RETURNS .ENDC ; DF P$$3XX .MCALL LNMDF$ LNMDF$I MAP5 = 120000 MAP6 = 140000 .IF DF N$$DIRI;+,; $DLCTX -- DELETE A SPECIFIED CONTEXT BLOCK; ; INPUT:1; R1 = ADDRESS OF THE CONTEXT BLOCK TO BE DELETEDR; ; OUTPUT:A8; USE COUNT IN CONTEXT BLOCK IS DECREMENTED. IF CONTEXT9; BLOCK IS NOT USE BY SOMEONE ELSE, THE SPECIFIED CONTEXT ; BLOCK IS DELETED;@; ***** NOTE: IT IS THE RESPONSIBILTY OF THE CALLER TO ZERO THE; POINTER TO THE CTX.;R;0; REGISTER R1 DESTROYED.;; -N .IFTF ;DF N$$DIR$DLCTX:: .IFT MOV R0,-(SP) ;SAVE R0( MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING" MOV R1,KI00}{ibjbkb a a aSAR6 ;MAP OLD CTX BLOCK) BEQ 20$ ;IF EQ, NO BLOCK TO DEALLOCATE ) CMPB #1,C.REF+MAP6 ;ONLY ONE REFERENCE?A! BEQ 10$ ;YES, DEALLOCATE BLOCKE& DECB C.REF+MAP6 ;DECREMENT USE COUNT BR 20$ ; (10$: MOV R1,R0 ;OLD CONTEXT BLOCK BIAS CLR R1 ;*& BISB C.DDSL+MAP6,R1 ;GET SIZE OF DDS2 ADD #C.FIXL+77,R1 ;GET FIXED LENGTH PLUS MODULOS& ASH #-6,R1 ;CONVERT INTO 32W BLOCKS MOV R2,-(SP) ;SAVE R2X! CALL $DESEC ;DEALLOCATE PACKETE MOV (SP)+,R2 ;RESTORE R2'20$: MOV (SP)+,KISAR6 ;RESTORE MAPPINGO MOV (SP)+,R0 ;RESTORE R0 RETURNL;+,; $CRCTX -- CREATE A SPECIFIED CONTEXT BLOCK;R%; R0 = SIZE OF USER BUFFER (IN BYTES)C; R1 = BIAS OF USER BUFFER'; R2 = APR5 DISPLACEMENT TO USER BUFFERR;0 ; OUTPUT:T; $; R3 = ADDRESS OF NEW CONTEXT BLOCK;P; -  .IFTF ;DF N$$DIRD$CRCTX:: .IFT ;DF N$$DIR( MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING! MOV R2,-(SP) ;SAVE DISPLACEMENTX MOV R1,-(SP) ;SAVE BIASE MOV R0,-(SP) ;SAVE DDS SIZER! MOV R0,R1 ;GET SIZE OF NEW DDSR- ADD #C.FIXL+77,R1 ;ADD FIXED SIZE + MODULUSL ASH #-6,R1 ;CONVERT TO BLOCKS* CALL $ALSEC ;ALLOCATE BLOCK FOR DDS LNB% BCS 50$ ;IF CS, ALLOCATION FAILURE 0 MOV R0,R3 ;SET UP SEC. POOL BLK BIAS FOR COPY MOV R3,KISAR6 ;MAP BLOCK' CLRB C.REF+MAP6 ;ZERO REFERENCE COUNT3 MOV (SP)+,R0 ;SET UP BYTE COUNT OF STRING TO COPY# MOVB R0,C.DDSL+MAP6 ;FILL IN SIZEI" BEQ 10$ ;IF EQ, ZERO LENGTH DDS- MOVB #1,C.REF+MAP6 ;FILL IN REFERENCE COUNT; MOV (SP)+,R1 ;SET UP BIAS;# MOV (SP)+,R2 ;SET UP DISPLACEMENT,; MOV #C.DDS+MAP6,R4 ;SETUP DISPLACEMENT TO STRING IN BLOCKC CALL $BLXIO ;COPY DDS BR 20$ ;D"10$: CMP (SP)+,(SP)+ ;CLEAN STACK'20$: MOV (SP)+,KISAR6 ;RESTORE MAPPINGL CLC ;INDICATE SUCCESS, RETURN ;"50$: CMP (SP)+,(SP)+ ;CLEAN STACK MOV (SP)+,R2 ;RESTORE R2# MOV (SP)+,KISAR6 ;RESTORE MAPPINGM .IFTF ;DF N$$DIRF SEC ;INDICATE FAILUREE RETURN ; .ENDC ;DF N$$DIRM .IF DF L$$GCL;+C; $CMPST -- THIS ROUTINE IS USED TO COMPARE A USER SPECIFIED STRINGN4; AGAINST A CURRENTLY MAPPED LOGICAL NAME BLOCK.; ; INPUTS:L/; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCK+; BLOCK CONTAINS:%; WD 1 - BYTE COUNT OF LOGICAL NAMEN.; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME6; WD 3 - APR6 BIASED OFFSET TO START OF LOGICAL NAME,; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE)(; BLOCK TYPE NUMBER (HIGH BYTE)9; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLE$;L;; THE LOGICAL NAME STRING TO BE COMPARED AGAINST IS MAPPEDE<; THROUGH APR6. THIS ROUTINE IS ONLY TO BE USED WHEN IT IS>; KNOWN THAT THE LENGTHS OF THE TWO STRINGS TO BE CHECKED ARE ; THE SAME.;K ; OUTPUT:; ; C=0 AND R1 = 0 MATCHC(; C=0 AND R1 <>0 NO MATCH BUT TRY NEXT.; C=1 NO MATCH AND EITHER INSERT ON PREVIOUS; OR STOP ANY FURTHER SEARCH-;B; R2,R3 ARE PRESERVED;T;-4$CMPST::MOV KISAR5,-(SP) ;SAVE CURRENT APR5 MAPPING MOV R2,-(SP) ;SAVE R2I MOV R3,-(SP) ;SAVE R3/ MOV (R0),R1 ;GET LENGTH OF STRINGS TO VERIFY . MOV 4(R0),R3 ;GET APR6 OFFSET TO USER BUFFER MOV 2(R0),KISAR5 ;MAP USER LNS, SUB #20000,R3 ;REDUCE IT TO AN APR5 OFFSET4 MOV #L.NNAM+140000,R2 ;POINT AT LOGICAL NAME STRING815$: CALL $CVBUC ;CONVERT NEXT USER CHAR TO UPPER CASE( CMPB R5,(R2)+ ;COMPARE THE TWO STRINGS1 BLO 30$ ;IF LO INPUT STRING SHOULD OCCUR FIRST31 BHI 30$ ;IF HI INPUT STRING SHOULD OCCUR LATERS$ SOB R1,15$ ;COMPARE ENTIRE STRING30$: MOV (SP)+,R3 ;RESTORE R3 MOV (SP)+,R2 ;RESTORE R2* MOV (SP)+,KISAR5 ;RESTORE KISAR5 MAPPING RETURN ;RETURN TO CALLER;+A; $CVBUC - ROUTINE TO CONVERT A SPECIFIED CHARACTER TO UPPER CASEF;T ; INPUTS:N7; R3 - POINTER TO NEXT CHARACTER TO DO TRANSLATION UPONB; ; OUTPUTS:.; R3 - POINTS TO BYTE PAST CHARACTER PROCESSED; R5 - UPCASED CHARACTER VALUE;-$CVBUC::' CLR R5 ;INITIALIZE THE RETURNED VALUEF BISB (R3)+,R5 ;GET THE VALUEA. CMPB R5,#141 ;CHARACTER IN LOWER CASE RANGE? BLO 10$ ;IF LO NOR3 CMPB R5,#172 ;CHARACTER OUTSIDE LOWER CASE RANGE?; BHI 10$ 00~}t__DATADATADATADATA;IF HI YES$ BICB #40,R5 ;CONVERT TO UPPER CASE 10$: RETURN-;+J; $GTUSR - ROUTINE TO TAKE A RAW UCB ADDRESS, WALK DOWN THE REDIRECT CHAINA; UNTIL A NON-PSEUDO DEVICE IS FOUND, AND THEN PLUG THE USER HASH3=; TABLE ADDRESS WITH THE SECONDARY POOL VALUE FOR THAT DEVICEA;R ; INPUTS:; R1 - RAW UCB ADDRESS;I ; OUTPUTS:B; R1 - UCB ADDRESS OF FIRST DEVICE IN REDIRECT CHAIN THAT IS NOT A; PSEUDO DEVICE;; $USRLG - UPDATED TO HOLD THE U.LOG VALUE OF THE FOUND UCB ;E;- .IFTF ;DF L$$GCL$$GTUSR::: BIT #DV.PSE,U.CW1(R1) ;CHECK IF SPECIFIED UCB IS A PSEUDO) BEQ 10$ ;IF EQ, NO, GO AND PLUG $USRLGD5 MOV U.RED(R1),R1 ;GET NEXT DEVICE IN REDIRECT CHAINO BR $GTUSR ;GO BACK FOR CHECKS10$: .IFT ;DF L$$GCL* CLR $USRLG ;INITIALIZE TO NO HASH TABLE .IFTF ;DF L$$GCL1 BIT #DV.TTY,U.CW1(R1) ;IS THIS DEVICE A TERMINALA* BEQ 20$ ;IF EQ, NO, LEAVE NO HASH TABLE .IFT ;DF L$$GCL9 MOV U.LOG(R1),$USRLG ;SET UP THE USER HASH TABLE ADDRESSO .IFTF ;DF L$$GCLF 20$: RETURN .ENDC ;DF L$$GCLU .IF DF D$$PAR;+; **-$DREIF-EXIT IF;QG; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF THECA; ISSUING TASK IF, AND ONLY IF, AN INDICATED EVENT FLAG IS CLEAR. ; ; DPB FORMAT:$;L"; WD. 00 -- DIC(53.),DPB SIZE(2.).?; WD. 01 -- EVENT FLAG NUMBER OF EVENT FLAG THAT MUST BE CLEAR.R;A ; INPUTS:$;;; R0=EVENT FLAG MASK WORD.; R1=EVENT FLAG MASK ADDRESS.U9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.F+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.F/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.T,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;O5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)D;L-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. <; DIRECTIVE STATUS OF 'D.RS22' IS RETURNED IF THE SPECIFIED; EVENT FLAG IS SET.; C=1 IF DIRECTIVE IS REJECTED.9; DIRECTIVE STATUS OF 'D.RS97' IF NO OR AN INVALID EVENTF; FLAG NUMBER IS SPECIFIED.S;- .ENABL LSB '$DREIF::BIT R0,(R1) ;EVENT FLAG CLEAR?  BEQ $DREXT ;IF EQ YES2$ DRSTS D.RS22 ;SET DIRECTIVE STATUS;+; **-$DREXT-EXIT;SG; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF THE ; ISSUING TASK.D;L ; DPB FORMAT:C;E"; WD. 00 -- DIC(51.),DPB SIZE(1.).;I ; INPUTS:F;.9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.E/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;=; NOTE: THIS DIRECTIVE IS ALSO CALLED FROM THE DISPATCHER AND 7; THEREFORE ONLY REQUIRES R5 TO BE LOADED ON ENTRANCE.R;-=; PRIVILEGED TASKS WHICH DESIRE TO CALL $DREXT DIRECTLYE<; SHOULD SWITCH TO SYSTEM STATE AND IMMEDIATELY CALL $DREXT.; WITHOUT CALLING ANY OTHER EXEC SUBROUTINES..; THIS IS BECAUSE OF POSSIBLE SIDE EFFECTS OF(; OTHER EXEC ROUTINES (SUCH AS $TSKRP).;W0; BECAUSE MANY PRIVILEGED TASKS CALL $DREXT, WE3; WILL UNCONDITIONALLY MAP THE TASK HEADER SO THATR1; THIS CODE DOES NOT HAVE TO BE ADDED ELSEWHERE.E;R;T5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ;D@; NO STATUS IS RETURNED TO THE ISSUING TASK SINCE THIS DIRECTIVE; TERMINATES ITS EXECUTION. ;-$DREXT:: ;REFERENCE LABELE .IF DF X$$HDR+ MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADER  .ENDC ; DF X$$HDR .IF DF P$$OFF* BIT #T3.ACP,T.ST3(R5) ;IS TASK AN ACP? BNE $DREX1 ;IF NE YES5 MOV #EX$SUC,T.EFLG+2(R5) ;SET SUCCESSFUL EXIT STATUSH@$DREX2::MOV #S.CEXT,T.EFLG(R5) ;SET SUCCESS CODE IN ABORT CODE .ENDC3$DREX1::MOV $DRAPR,KINAR5 ;MAP THE DIRECTIVE COMMONA) JMP $DREX3 ;AND GO THERE TO FINISH EXITI .PAGE;+; **-$TRTRP-TRAP TRAPT;IH; THIS ROUTINE IS TRAPPED TO WHEN A TRAP INSTRUCTION IS EXECUTED. IF THEF; STACK DEPTH IS ZERO, THEN A DIRECTIVE STATUS IS TO BE RETURNED. ELSE=; CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE.$;X ; INPUTS: ;Y+; 2(SP)=PS WORD PUSHED BY TRAP INSTRUCTION. +; 0(SP)=PC WORD PUSHED BY TRAP INSTRUCTION. ;E ; OUTPUTS:;IB; IF THE STACK DEPTH IS ZERO, THEN00 ~~ibjbkb a a a A DIRECTIVE STATUS IS RETURNED.B; ELSE CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE.;- .ENABL LSB-($TRTRP::TST $STKDP ;;;STACK DEPTH ZERO? BNE $EMTRP ;;;IF NE NO4 MOV (SP)+,R0 ;;;GET ADDRESS + 2 OF TRAP INSTRUCTION( MFPI -(R0) ;;;PICK UP TRAP INSTRUCTION7 MOV $DRAPR,KINAR5 ;;;MAP TO DIRECTIVE COMMON (I SPACE)$7 JMP $TRTR1 ;;;CONTINUE PROCESSING IN DIRECTIVE COMMONR;+; **-$EMTRP-EMT TRAP;DH; THIS ROUTINE IS TRAPPED TO WHEN AN EMT INSTRUCTION IS EXECUTED. IF THEC; STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED. ELSE A TEST IS D; MADE TO SEE IF THE EMT INSTRUCTION HAD A CODE OF 377. IF NOT, THENF; CONTROL IS TRANSFERED TO THE EMT/TRAP SST HANDLING ROUTINE. ELSE THE$; APPROPRIATE DIRECTIVE IS EXECUTED.;P ; INPUTS:;;K*; 2(SP)=PS WORD PUSHED BY EMT INSTRUCTION.*; 0(SP)=PC WORD PUSHED BY EMT INSTRUCTION.; ; OUTPUTS:;O@; IF THE STACK DEPTH IS NOT +1, THEN THE SYSTEM IS CRASHED. ELSEE; CONTROL IS GIVEN TO THE EMT/TRAP SST ROUTINE OR A DIRECTIVE ROUTINE 1; DEPENDENT ON WHETHER THE EMT HAD A CODE OF 377.E;-;T>; DETERMINE IF LEGITIMATE ENTRY FROM USER STATE. IF NOT, CRASH;T0$EMTRP::TST $STKDP ;;;ARE WE AT STACK DEPTH +1? BGT 2$ ;;;IF GT YEST! JMP $CREMT ;;;ELSE CRASH SYSTEMU/2$: DIRSV$ ;;;SAVE REGISTERS AND SET PRIORITYB5 MOV $DRAPR,KINAR5 ;MAP TO DIRECTIVE COMMON (I SPACE)U7 JMP $EMTR1 ;;;CONTINUE PROCESSING IN DIRECTIVE COMMON1>; ROUTINES USED BY DISPATCHER TO CALL OTHER COMMONS THAN FIRST/$DRCL2::MOV $DRAP2,KINAR5 ;MAP TO SECOND COMMONN .IF DF K$$DAS' MOV $DRAP2,KDSAR5 ;MAP IN D-SPACE ALSON .ENDC ; DF K$$DAS CALL @2(SP) ;CALL ROUTINE/ MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACEH MOV (SP)+,(SP) ;COLLAPSE STACKP! RETURN ;AND BACK TO DISPATCHER .$DRCL3::MOV $DRAP3,KINAR5 ;MAP TO THIRD COMMON CALL @2(SP) ;CALL ROUTINEI/ MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACEO MOV (SP)+,(SP) ;COLLAPSE STACK ! RETURN ;AND BACK TO DISPATCHER 6$FINDR::MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACE/ JMP $DRFIN ;AND JUMP TO DISPATCHER COMPLETION, .ENDC ; DF D$$PAR .END.ENDC ; DF K$$DAS CALL @2(SP) ;CALL ROUTINE/ MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACEH MOV (SP)+,(SP) ;COLLAPSE STACKP! RETURN ;AND BACK TO DISPATCHER .$DRCL3::MOV $DRAP3,KINAR5 ;MAP TO THIRD COMMON CALL @2(SP) ;CALL ROUTINEI/ MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACEO MOV (SP)+,(SP) ;COLLAPSE STACK ! RETURN ;AND BACK TO DISPATCHER 6$FINDR::MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I-SPACE/ J .TITLE TTYH .IDENT /06.04/;0; Copyright (c) 1995-1999 by Mentec Inc., U.S.A.; All rights reserved;@; COPYRIGHT (c) 1983,1986,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.;;; 27-JAN-78 PETER WANNHEDEN;; PREVIOUSLY MODIFIED BY:;; P. WANNHEDEN ; C. F. SPITZ; D. R. DONCHIN ; R. PHILPOTT ; S. ADAMS ; L. KOGAN;; MODIFICATIONS:;T;; L. KOGAN 02-NOV-85 06.01:; LK703 -- DO NOT DISABLE REMOTE LINE WHEN DTR IS DROPPED;e; L. KOGAN 18-JUN-86 6.0232; LK710 -- INCLUDE 7-BIT CHARACTER LENGTH SUPPORT;H ; TODD SCHOELLER 27-Nov-86 06.03=; TMS047 -- SET TIMER TO EXPIRE IN THE UCB EXTENSION INDEXEDI; OFF OF THE CORRECT R4.;C$; Modified for RSX-11M-PLUS V4.5 by:;N; D. Carroll 15-Feb-1993 06.043; DC120 - Correct problem in ACD code for setting O%; up R2 to be an index during STAX..;G;;;+*; CONTROLLER-DEPENDENT ROUTINES FOR DH-11.;-; ;7 - .IF DF D$$H11 M  .MCALL UCBDF$ O UCBDF$ ;DEFINE UCB SYMBOLS6 3 .IF DF R$$MPL D .MCALL KRBDF$ E KRBDF$ ;DEFINE KRB SYMBOLSL 2 .IFF ;R$$MPL T .MCALL SCBDF$ T SCBDF$ ;DEFINE SCB SYMBOLSN E .ENDC ;R$$MPL E .PSECT MAP5;;o; EQUATED SYMBOLSP; ; DH-11 REGISTER DEFINITIONS;-SCR = 0 ;SYSTEM CONTROL REG.p"NRC = 2 ;NEXT RECEIVED CHAR. REG.LPR = 4 ;LINE PARAMETER REG.TCAR = 6 ;CURRENT ADDR00~}t__DATADATADATADATAESS REG.BCR = 10 ;BYTE COUNT REG.BAR = 12 ;BUFFER ACTIVE REG.$;1;M;+; YHSTAX - START OUTPUT.5; NOTE - NON-BUFFERED OUTPUT CURRENTLY NOT SUPPORTED.C; ; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.TOP+2 BUFFER POINTERD; U.TOC BYTE COUNTE;. ; OUTPUT:L; OUTPUT STARTED.; U.TOP+2 UNCHANGED; U.TOC UNCHANGED;T; REGISTERS ALTERED: R4 ;-;T;C .ENABL LSB; YHSTAX::A BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;HIGH PRIORITY OUTPUT REQUESTED?R5 BEQ 5$ ;;;N - POSSIBLY BEGIN NORMAL PRIORITY OUTPUT = BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT ALREADY IN PROGRESS?O: BEQ 60$ ;;;Y - DO HIGH PRIORITY OUTPUT AT NEXT INTERRUPTE BIS #S5.HPO,U.TST5-U.TSTA(R5);;;SHOW BUSY DOING HIGH PRIORITY OUTPUT.4 ;;;IN CASE A NORMAL PRIORITY REQUEST COMES ALONG&STAXH: CALL SELLIN ;;;SELECT THE LINE1 BIT #S5.XOF,U.TST5-U.TSTA(R5) ;;;OUTPUT AN XOFF?E BEQ 3$ ;;;N - JUMP6 BIC #S5.XOF,U.TST5-U.TSTA(R5) ;;;Y - RESET INDICATION .IF DF T$$SPL1 MOV #YVXOFF-20000,CAR(R3) ;;;POINT TO DMA BUFFERR .IFF ;T$$SPLU+ MOV #YVXOFF,CAR(R3) ;;;POINT TO DMA BUFFERR .IFTF ;T$$SPL BR 4$ ;;;JOIN COMMON CODERL3$: BIC #S5.XON,U.TST5-U.TSTA(R5) ;;;NOT XOFF, MUST BE XON, RESET INDICATION .IFT ;T$$SPLT* MOV #YVXON-20000,CAR(R3) ;;;OUTPUT AN XON .IFF ;T$$SPLX% MOV #YVXON,CAR(R3) ;;;OUTPUT AN XON# .ENDC ;T$$SPL.4$: MOV #-1,BCR(R3) ;;;SET TO OUTPUT ONE CHAR.; BR YHRESX ;;;INITIATE THE OUTPUT REGARDLESS OF XOFF STATEFN5$: 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 - JUMP ADD #U.TOC,R4 ;;;POINT TO U.TOC8STAXM: MOV R2,-(SP) ;;;SAVE R2 DESTROYED BY MOUT ROUTINE+ CALL MOUT ;;;GET NEXT CHARACTER TO OUTPUTS9 MOVB R2,U.ADMA-U.TSTA(R5) ;;;PUT CHARACTER IN DMA BUFFERH MOV (SP)+,R2 ;;;RESTORE R2R CALL SELLIN ;;;SELECT LINE& MOV R5,CAR(R3) ;;;POINT TO DMA BUFFER ADD #U.ADMA-U.TSTA,CAR(R3) ;;;?( MOV #-1,BCR(R3) ;;;OUTPUT ONE CHARACTER BR 50$ ;;;INITIATE THE OUTPUTR .ENDC ;T$$ACD(10$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2 CALL SELLIN ;;;SELECT LINESTAX1:  .IF DF T$$SPL1 MOV (R4),CAR(R3) ;;;SET BUFFER ADDRESS (U.TOP+2)S% CMP (R4)+,#120000 ;;;IN SYSTEM POOL?G- BLO 20$ ;;;Y - UMR MAPPING IS CORRECT, JUMP.@ SUB #20000,CAR(R3) ;;;FORCE BUFFER ADDRESS TO MAP THROUGH UMR 520$: ;;;REFERENCE LABEL .IFF ;T$$SPLA .IF DF M$$EXT 2 MOV (R4)+,CAR(R3) ;;;SET BUFFER ADDRESS (U.TOP+2) R .IFF ;M$$EXTE A. MOV (R4)+,-(SP) ;;;GET VIRTUAL BUFFER ADDRESS# CMP @SP,#120000 ;;;IN SYSTEM POOL?;6 BLO 40$ ;;;Y - VIRTUAL ADDRESS = PHYS. ADDRESS, JUMP= ADD RELC+2,@SP ;;;ADD RELOCATION CONSTANT TO VIRTUAL ADDRESSU MOV RELC,-(SP) ;;;# BCC 30$ ;;;NO CARRY - JUMP) ADD #20,@SP ;;;ADD CARRY TO HIGH 2 BITS.) BIC #^C<60>,@SP ;;;NORMALIZE HIGH 2 BITSS930$: BISB (SP)+,@R3 ;;;LOAD 2 HIGH BITS OF 18-BIT ADDRESS "40$: MOV (SP)+,CAR(R3) ;;;LOAD CAR 4 .ENDC ;M$$EXT U .ENDC ;T$$SPL ASSUME U.TOC,1 MOV @R4,BCR(R3) ;;;SET BYTE COUNT (U.TOC) IN BCR NEG BCR(R3) ;;;NEGATE IT ASSUME S2.CTS,100000Y,50$: TST 2(R5) ;;;OUTPUT STOPPED BY CTRL-S?' BMI 60$ ;;;IF SO, DON'T RESUME OUTPUT ;T; ;+; YHRESX - RESUME OUTPUT.;C; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 0P;-;M;ZFYHRESX::BIS $BTMSK(R2),BAR(R3) ;;;SET BIT IN BAR TO START TRANSMISSION  .IF NDF D$$M11R )YHMTIM::  .ENDC ;D$$M11 60$: RETURN ;;;;A .DSABL LSBU;P;;+; YHABOX - ABORT OUTPUT.;U; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;:; REGISTERS ALTERED: R3P;-;C;-)YHABOX::CALL YHSTOX ;;;STOP TRANSMISSION  CALL SELLIN ;;;SELECT LINE! CLR BCR(R3) ;;;CLEAR BYTE COUNTR7 CLR BCR(R3) ;;;DO IT AGAIN - CONTROLLER MAY HAVE BEENC) ;;;DOING A READ-MODIFY-WRITE CYCLE ONB. ;;;THE BYTE COUNT REGISTER WHEN WE CLEARED ;;;IT FIRST TIME R00~~ibjbkb a a aETURN ;;;;.;C;+; YHSTOX - STOP OUTPUT.;;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 1R;-;A;FGYHSTOX::BIC $BTMSK(R2),BAR(R3) ;;;CLEAR BIT IN BAR TO STOP TRANSMISSION- RETURN ;;;Y;O;; T .ENABL LSBO  .IF DF T$$GMC!T$$SMC!D$$M11 R;+#; YHLPAR - GET/SET LINE PARAMETERS.R; ; INPUT:; R0 BIT 15: 0 = SET SPEED; 1 = GET SPEEDA); BIT 13: 1 = SET 7-BIT CHARACTER LENGTHT4; BIT 12: 1 = CHECK IF 7-BIT CHARACTER IS SUPPORTED;; BIT 11: 1 = SET SPEED SELECTED BY AUTO-BAUD DETECT LOGIC ); BIT 10: 1 = SET DEVICE DEPENDENT SPEEDR!; (USED FOR SETTING PARITY) "; BIT 9: 1 = GET/SET ANSWER SPEED#; BIT 8: 0 = GET/SET RECEIVE SPEEDP; 1 = GET/SET TRANSMIT SPEED; IF SET SPEED:/; BITS 0-7: NEW SPEED PARAMETER (S.XXX SYMBOL);H&; R1 Flow control status change flags.;U(; BIT 0: 1 = Enable input flow control.); BIT 1: 1 = Disable input flow control.R); BIT 2: 1 = Enable output flow control.R*; BIT 3: 1 = Disable output flow control.;L; BITS 4-15: Reserved;O<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;O ; OUTPUT:A; IF GET SPEED REQUESTED:E ; R4 POINTER TO DH11 SPEED TABLE; CC-C 0;P; IF SET SPEED REQUESTED:M; CC-C 0 IF OK; 1 IF ILLEGAL SPEED SPECIFIEDD;RJ; NOTE THAT THIS ROUTINE CAN BE EXECUTED AT BOTH SYSTEM STATE (IN RESPONSEN; TO A SF.GMC OR SF.SMC QIO) AND FROM THE INPUT INTERRUPT SERVICE ROUTINE (FOR; AUTO-BAUD DETECT).;t;-;w;n;lYHLPAR::) TST R1 ;Called for flow control change?B BEQ 5$ ;If EQ no - go on.I RETURN ;Not processed for DH.5$:E .IF DF T$$GMC ! T$$SMCP0 BIT #20000,R0 ;CHECK IF WE VALIDATE 7-BIT CHAR. BEQ 7$ ;NO RETURN07$: BIT #10000,R0 ;CHECK SET 7-BITC BEQ 8$ ;NO. SET SPEED-PARITY0 BR SETLN1 ;SET 7-BIT AND OTHER LINE PARAMETERS8$:D .ENDC ;T$$GMC ! T$$SMCE. BIT #4000,R0 ;SET SPEED FOR AUTO-BAUD DETECT? BEQ 20$ ;N - JUMPC& BIT #2000,R0 ;DEVICE DEPENDENT SPEED? BNE 10$ ;Y - JUMPP! BIC #177400,R0 ;CLEAR UPPER BYTEo4 MOVB SPDH-1(R0),R0 ;GET DEVICE DEPENDENT SPEED BITS-10$: BIC #^C<17>,R0 ;CLEAR ALL BUT SPEED BITS! MOV R0,R2 ;GET A COPY0 H .IF DF R$$EIS8 ASH #4,R2 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITION .IFF ;R$$EISC: CALL SHIFT4 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITION .ENDC ;R$$EIS& BIS R0,R2 ;ADD IN RECEIVE SPEED BITS4 MOVB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED IN DATABASE3 BR SETLN1 ;SET PARITY AND NEW SPEED IN CONTROLLER20$: ;REFERENCE LABEL .IF DF T$$GMC&T$$SMCR T! MOV R0,R4 ;SAVE INPUT PARAMETER & SWAB R4 ;PUT FLAGS IN LOW ORDER BYTE BPL 30$ ;SET SPEED - JUMP V .ENDC T .IF DF T$$GMC D( MOV #SPDH,R4 ;POINT TO DH11 SPEED TABLE RETURN ;RETURN WITH CC-C = 0F R .ENDC ;T$$GMC F .IF DF T$$SMC!D$$M11O A .IF NDF T$$GMCI! MOV R0,R4 ;SAVE INPUT PARAMETERA( SWAB R4 ;PUT FLAGS IN LOWER ORDER BYTE .ENDC ;NDF T$$GMC I'30$: BIC #177400,R0 ;CLEAR R0 HIGH BYTEE# MOVB SPDH-1(R0),R2 ;GET SPEED BITSR SEC ;ASSUME ERROR' BMI 40$ ;NOT A SUPPORTED SPEED - JUMP  ASRB R4 ;SET ANSWER SPEED? BEQ 50$ ;N - JUMP .IF DF D$$M11- BICB #17,U.CW3+1-U.TSTA(R5) ;CLEAR OLD VALUEM1 BISB R2,U.CW3+1-U.TSTA(R5) ;SET NEW ANSWER SPEEDR CLC ;SHOW SUCCESS .IFF ;D$$M11C5 SEC ;ATTEMPT TO SET ANSWER SPEED W/O MODEM SUPPORTV .ENDC ;D$$M11 40$: RETURNS; $50$: BCS 60$ ;TRANSMIT SPEED - JUMP3 BICB #17,U.CW3-U.TSTA(R5) ;CLEAR OLD RECEIVE SPEED  BR 70$ ;JUMP TO SET NEW SPEEDG960$: BICB #360,U.CW3-U.TSTA(R5) ;CLEAR OLD TRANSMIT SPEEDO .IF DF R$$EIS0 ASH #4,R2 ;SHIFT SPEED BITS TO PROPER POSITION .IFF ;R$$EIS12 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 LPR; E .ENDC ;T$$SMC!D$$M11   .IF DF D$$M11&R$$CONCYMLPAR::RETURN .ENDC .ENDC ;T$$GMC!T$$SMC!D$$M11 U;;+; YHPWUP - POWER-UP.;L; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.STS SET UP FOR00"~}t__DATADATADATADATA LOCAL LINE: ; US.CRW 0 ; US.DSB 0E;-;A;# .IF DF R$$CONYHCONL:: .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$$SPLD MOV (R0)+,(R1)+ ;SET UP UMR 6 MOV (R0)+,(R1)+ ; .ENDC ;NDF T$$SPL .ENDC ;M$$EXTYHCPUP:: .IFF$#YHPWUP::TST R2 ;IS THIS LINE ZERO?R BNE 80$ ;N - JUMP  .IFTF- MOV #4000,@R3 ;CLEAR SILO, UARTS, CONTROLLER" MOV #20100,@R3 ;ENABLE INTERRUPTS .IFT RETURNEYHUONL::YHUPUP:: .ENDC ;R$$CON80$: ;REFERENCE LABEL # .IF DF D$$M11 S+ BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE?  BEQ 100$ ;N - JUMP4 BIC #S5.ABP,U.TST5-U.TSTA(R5) ;RESET AUTO-BAUD MODE .IF NDF R$$MPL(! MOV U.SCB-U.TSTA(R5),R0 ;GET SCB;2 TST S.DMCS(R0) ;IS THERE REMOTE SUPPORT FOR LINE? BNE 90$ ;Y - JUMP:1 BIC #U2.RMT,U.CW2-U.TSTA(R5) ;N - SET LINE LOCAL) BR 100$ ;FORGET THAT IT WAS EVER REMOTET90$: ;REFERENCE LABEL .IFTF ;NDF R$$MPL< BISB #US.CRW,U.STS-U.TSTA(R5) ;SET WAITING FOR CARRIER FLAG .IFT ;NDF R$$MPLL MOV R3,-(SP) ;SAVE DH11 CSR+ CALL YHMTIM ;ENABLE INTERRUPTS ON DM11-BBB MOV (SP)+,R3 ;RESTORE DH11 CSRU .ENDC ;NDF R$$MPL .IF DF R$$CON! MOV U.SCB-U.TSTA(R5),R0 ;GET SCBT MOV S.KRB(R0),R0 ;GET DH11 KRB0( MOVB K.CON(R0),R0 ;GET CONTROLLER INDEX. ADD YMCP1,R0 ;POINT TO POINTER TO DM11-BB KRB MOV @R0,R0 ;GET DM11-BB KRB 8 MOVB U.UNIT-U.TSTA(R5),R1 ;GET UNIT NUMBER OF THIS LINE1 ASL R1 ;CONVERT FROM BYTE OFFSET TO WORD OFFSETA9 BIS $BTMSK(R1),K.PRM-2(R0) ;SET ENABLE BIT FOR THIS LINE1 BIT #KS.OFL,K.STS(R0) ;IS DM CONTROLLER OFFLINE?  BNE 100$ ;Y - JUMP MOV R3,-(SP) ;SAVE YH CSR MOV @R0,R3 ;GET YM CSR. CALL YHMTMA ;LET DM KNOW ABOUT THIS LINE NOW MOV (SP)+,R3 ;RESTORE YH CSRG .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 LINE # SWAB R2 ;;;PUT IN HIGH ORDER BYTEB$ ROR R2 ;;;SHIFT TO PROPER POSITION ROR R2 ;;;, BIC #140017,R2 ;;;CLEAR EXTRANEOUS NONSENSE3 BIT #30000,R2 ;;;TRANSMIT SPEED 110 BAUD OR LOWER?; BNE 110$ ;;;N - JUMP$ BIS #4,R2 ;;;Y - SET TWO STOP BITS0110$: BIS #3,R2 ;;;SET FOR EIGHT BIT CHARACTERS8 BIT #S5.CLN,U.TST5-U.TSTA(R5) ;;;CHECK 7-BIT CHARACTERS BEQ 115$ ;;;NO LEAVE IT 8-BITU BIC #1,R2 ;;;SET 7-BIT0115$: MOV R2,LPR(R3) ;;;LOAD NEW LINE PARAMETERS;L7; WHEN RETURNING VIA COROUTINE "LOCKI", CC-C IS CLEARED ;H RETURN ;RETURNR ; .DSABL LSBO .IF DF R$$CONYHCOFF::! CALL LOCKI ;LOCK OUT INTERRUPTSO/ MOV #4000,@R3 ;;;CLEAR SILO, UARTS, CONTROLLER  RETURN;YHUOFF::! CALL LOCKI ;LOCK OUT INTERRUPTSS CALL SELLIN ;;;SELECT THE LINE. CLR LPR(R3) ;;;SET TO 0 BAUD TO DISABLE LINE RETURN ;;;DROP PRIORITY .ENDC ;R$$CON;5;;;+"; INPUT INTERRUPT SERVICE ROUTINE.;-;;$ .ENABL LSBR;; O .IF DF R$$MPL E-$YHINP::TTSET$ YH ;;;SAVE R2, R3 AND SET UP:" ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS .IFF ;R$$MPL  C+$DHINP::TTSET$ DH ;;;SAVE R2,R3 AND SET UPU ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST  .ENDC ;R$$MPL , CALL MUXINP ;;;DO COMMON MULTIPLEXER INPUT ;;;CHARACTER PROCESSINGL3 ;;;MUXINP DISMISSES INTERRUPT IF NO OUTPUT WORK;* BR 10$ ;;;XMIT READY - GO DO OUTPUT WORK;;N;+#; OUTPUT INTERRUPT SERVICE ROUTINE.$;-;B;S  .IF DF R$$MPL M-$YHOUT::TTSET$ YH ;;;SAVE R2, R3 AND SET UP:E ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS E .IFF ;R$$MPLR P+$DHOUT::TTSET$ DH ;;;SAVE R2,R3 AND SET UPS ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST I .ENDC ;R$$MPL M<10$: BIC #100077,@R3 ;;;CLEAR TRANSMIT DONE, UNIT NUMBER AND$ ;;;2 HIGH BITS OF UNIBUS ADDRESS! MOV R4,-(SP) ;;;SAVE KRB ADDRESS; B .IF DF R$$MPL Y+ ADD K.OFF(R4),R4 ;;;GET START OF UCB TABLET U .ENDC ;R$$MPL $)20$: MOV (R4)+,R5 ;;;GET NEXT UCB ADDRESST' BEQ 80$ ;;;JUMP IF LINE IS NOT IN USE CMP R5,#-1 ;;;00*~~ibjbkb a a aEND OF LIST? BEQ 90$ ;;;Y - JUMPE . .IF DF R$$CON D# BITB #US.OFL,U.ST2(R5) ;;;OFFLINE?T BNE 80$ ;;;Y - JUMP  .ENDC ;R$$CON MOV R4,-(SP) ;;;SAVE R4 MOV R3,-(SP) ;;;SAVE CSR@ .IF DF T$$SPL$ MOV U.TAPR(R5),@#KDSAR5 ;;;MAP UCBX. MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX" ADD #U.TSTA,R5 ;;;POINT TO U.TSTA .IFF ;T$$SPL  ASSUME U.TSTA,( ADD #U.TUX,R5 ;;;POINT TO UCBX POINTER MOV (R5)+,R4 ;;;GET UCBX .ENDC ;T$$SPL BIT #2000,@R3 ;;;NXM BIT SET? BEQ 30$ ;;;N - JUMP9 BIS #400,@R3 ;;;Y - CLEAR IT$6 MOVB #1,U.TOTI(R4) ;;;SET TIMER TO EXPIRE IN 1 SECOND BR 60$ ;;;GO ON TO NEXT LINE:30$: TST BCR(R3) ;;;HAS THIS LINE COMPLETED TRANSMISSION? BNE 60$ ;;;N - JUMPVK BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;ANY HIGH PRIORITY OUTPUT REQUEST PENDING?C BEQ 35$ ;;;N - JUMPP- MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET UNIT NUMBERS ASL R2 ;;; .. TIMES 2,* CALL STAXH ;;;START HIGH PRIORITY OUTPUT3 BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETEDXB35$: BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT INTERRUPT UNEXPECTED? BNE 45$ ;;;Y - JUMPSG BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;JUST STARTING NORMAL PRIORITY OUTPUT?B3 BEQ 37$ ;;;N - COMPLETE INTERRUPTED OUTPUT STREAMEJ BIC #S5.HPO,U.TST5-U.TSTA(R5) ;;;START NORMAL (NOT HIGH) PRIORITY REQUEST- MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET UNIT NUMBERM ASL R2 ;;; .. TIMES 2;= CALL STAXN ;;;BEGIN OUTPUT DELAYED BY HIGH PRIORITY REQUESTT3 BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETEDR37$: .IF DF T$$ACD, BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BNE 40$ ;;;Y - JUMPE ADD #U.TOC,R4 ;;;POINT TO U.TOC% DEC @R4 ;;;ANYTHING LEFT TO OUTPUT?L BEQ 50$ ;;;N - JUMPQ1 MOVB U.UNIT-U.TSTA(R5),R2 ;;; get the line indexB- ASL R2 ;;; and create a word index for STAXO- CALL STAXM ;;;Y - INITIATE ANOTHER TRANSFER53 BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETEDC .ENDC ;T$$ACD(40$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+26 CALL NXTOB ;;;GET NEXT OUTPUT BUFFER IF THERE IS ONE BEQ 50$ ;;;N - JUMP;B5; WE GOT ANOTHER OUTPUT BUFFER - START OUTPUTTING IT.;;- TST -(R4) ;;;POINT TO U.TOP+2O MOV (SP)+,R3 ;;;GET CSR- MOVB U.UNIT-U.TSTA(R5),R2 ;;;GET UNIT NUMBERM ASL R2 ;;; .. TIMES 2; CALL STAX1 ;;;START OUTPUT BR 70$ ;;;I45$: BIC #S5.HPO,U.TST5-U.TSTA(R5) ;;;NO HIGH PRIORITY OUTPUT IN PROGRESS3 BR 60$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETED;.-50$: CALL ODONE ;;;DO OUTPUT DONE PROCESSINGO(60$: MOV (SP)+,R3 ;;;RESTORE CSR POINTER70$: MOV (SP)+,R4 ;;;RESTORE R4 980$: BICB #60,@R3 ;;;CLEAR 2 HIGH BITS OF UNIBUS ADDRESST( ;;;TO AVOID OVERFLOW INTO BIT 6 WHEN ;;;INCREMENTING LINE NUMBERR# INCB @R3 ;;;INCREMENT LINE NUMBERN BR 20$ ;;;GO TRY NEXT LINE; 7; ALL LINES SCANNED. SEE IF ANY LINE COMPLETED TRANSMIT#; "BEHIND" US IN THE SCAN LOOP.G;R(90$: MOV (SP)+,R4 ;;;RESTORE KRB ADDRESS) ;;; OR ADDRESS OF UCB LIST (RSX-11M) TST @R3 ;;;XMIT RDY SET?% BMI 10$ ;;;Y - DO IT ALL OVER AGAIN;;S5; ALL OUTPUT WORK DONE. SEE IF ANY INPUT WORK NEEDED.:;C, MOV NRC(R3),R5 ;;;GET A CHARACTER FROM SILO BPL 100$ ;;;NONE - EXITL+ CALL MUXIN1 ;;;PROCESS AS INPUT INTERRUPTN$ BR 10$ ;;;OUTPUT WORK TO DO - JUMP3 ;;;MUXIN1 DISMISSES INTERRUPT IF NO OUTPUT WORK ;N;.;E;  .IF NDF R$$EIST;IH; SUBROUTINE TO SHIFT R2 4 BIT POSITIONS TO THE LEFT FOR NON-EIS SYSTEMS;DSHIFT4: ASL R2 ;SHIFT ONCEU ASL R2 ;TWICE ASL R2 ;THRICE ASL R2 ;LAST TIME  RETURN  .ENDC ;NDF R$$EIS;L$; SUBROUTINE TO SELECT LINE ON DH11.; ;D:SELLIN: BICB #77,@R3 ;;;CLEAR LINE NUMBER AND 2 HIGH BITS ;;;OF 18-BIT ADDRESS* BISB U.UNIT-U.TSTA(R5),@R3 ;;;SELECT LINE100$: RETURN ;;;; .DSABL LSB  .IF DF D$$M11  .IF DF R$$CONYMCONL::YMCPUP:: CALL LOCKI ;RAISE OUR PRIORITY# BIC #1040,@R3 ;;;STOP DM11-BB SCANO"10$: BIT #20,@R3 ;;;SCAN STOPPED? BNE 10$ ;;;N - WAITI# CLR R0 ;;;INITIALLY SET TO LINE 0;20$: MOV R0,@R3 ;;;SELECT LINET" ASL R0 ;;;CONVERT TO WORD OFFSET: BIT $BTMSK(R0),K.PRM-2(R2) ;;;SHOULD WE ENABLE THIS LINE?002~9~t__DATADATADATADATA BEQ 30$ ;;;N - JUMPB4 BIS #7,2(R3) ;;;Y - ASSERT DTR, RTS AND LINE ENABLE30$: ASR R0 ;;;RESTORE COUNTI" INC R0 ;;;INCREMENT TO NEXT LINE% CMP R0,#15 ;;;GONE THRU EVERY LINE?$ BLE 20$ ;;;N - LOOPP+ BIS #140,@R3 ;;;ENABLE SCAN AND INTERRUPTS0' RETURN ;;;RETURN WILL LOWER PRIORITY0YMCOFF::! CALL LOCKI ;LOCK OUT INTERRUPTSI- BIC #1140,@R3 ;;;DISABLE SCAN AND INTERRUPTSVYMSTAX::YMABOX::YMRESX::YMSTOX::YMMTIM::YMUPUP::YMUONL::YMUOFF:: RETURN ;;;O .ENDC ;R$$CON;+); DM11-BB DATASET STATUS CHANGE INTERRUPTY;-;R;T R .IF DF R$$MPL -$DM11B::TTSET$ YM ;;;SAVE R2, R3 AND SET UP:R ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS E .IFF ;R$$MPL; -+$DM11B::TTSET$ DM ;;;SAVE R2,R3 AND SET UPR ;;; R3 = DH11 CSRT# ;;; R4 = ADDRESS OF DH UCB LISTC! MOV -4(R4),R3 ;;;GET DM11-BB CSRB # .ENDC ;R$$MPL 1 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 STATUS5 CALL MODISR ;;;DO COMMON MODEM INTERRUPT PROCESSINGE, BVC 10$ ;;;NO SPECIAL ACTION NEEDED - JUMP BCS 5$ ;;;DROP DTR - JUMPP/ BIS #7,@R3 ;;;ASSERT DTR, RTS AND LINE ENABLEU BIS #40,-(R3) ;;;REENABLE SCAN; RETURND'5$: BIC #6,@R3 ;;;DEASSERT DTR AND RTSE#10$: BIS #40,-(R3) ;;;REENABLE SCAN $ BCS 30$ ;;;NO CALL ANSWERED - JUMP# MOV U.SCB-U.TSTA(R5),R3 ;;;GET SCBL  .IF DF R$$MPL ( MOV @S.KRB(R3),R3 ;;;GET DH CSR ADDRESS 1 .IFF ;R$$MPLL ' MOV S.CSR(R3),R3 ;;;GET DH CSR ADDRESS L .ENDC ;R$$MPL M/ MOVB U.CW3+1-U.TSTA(R5),R2 ;;;GET ANSWER SPEEDP- BICB #^C<17>,R2 ;;;CLEAR ALL BUT SPEED FIELDR? MOVB R2,U.CW3-U.TSTA(R5) ;;;SAVE NEW RECEIVE SPEED IN DATABASE# .IF DF R$$EIS0 ASH #4,R2 ;;;SET TRANSMIT SPEED = ANSWER SPEED .IFF ;R$$EISS2 CALL SHIFT4 ;;;SET TRANSMIT SPEED = ANSWER SPEED .ENDC ;R$$EIS@ BISB R2,U.CW3-U.TSTA(R5) ;;;SAVE NEW TRANSMIT SPEED IN DATABASE9 MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW SPEED AND PARITY BITSV ASSUME S4.ABD,100000 . TST 6(R5) ;;;AUTO-BAUD SPEED DETECT ENABLED?# BPL 20$ ;;;IF NOT, DON'T SET BAUDP* MOV #314,R2 ;;;Y - SET LINE TO 4800 BAUD'20$: JMP SETLIN ;;;SET LINE PARAMETERSE;E"30$: RETURN ;;;DISMISS INTERRUPT;E;;+; YHMTIM - MODEM TIME-OUTP;-;N;R E .IF DF R$$MPL S(YHMTIM::MOV U.SCB-U.TSTA(R5),R3 ;GET SCB MOV S.KRB(R3),R3 ;GET DH11 KRB( MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX. ADD YMCP1,R3 ;POINT TO POINTER TO DM11-BB KRB MOV @(R3)+,R3 ;GET DM11-BB CSRV A .IFF ;R$$MPL0 (YHMTIM::MOV U.SCB-U.TSTA(R5),R3 ;GET SCB# MOV S.DMCS(R3),R3 ;GET DM11-BB CSRT U .ENDC ;R$$MPL ;YHMTMA:L CALL LOCKI ;DISABLE INTERRUPTS BIC #1040,@R3 ;;;STOP SCAN"10$: BIT #20,@R3 ;;;SCAN STOPPED? BNE 10$ ;;;N - WAITM" BIC #17,@R3 ;;;CLEAR LINE NUMBER; 0; NOTE - CANNOT USE BYTE INSTRUCTIONS ON DM11-BB;- MOVB U.UNIT-U.TSTA(R5),R4 ;;;GET LINE NUMBER3 BIS R4,(R3)+ ;;;SELECT LINE4 CALL HLMTIM ;;;DO COMMON MODEM TIME-OUT PROCESSING/ BEQ 20$ ;;;IF EQ Z-BIT SET - DROP DTR AND RTS/ BIS #7,@R3 ;;;ASSERT DTR, RTS AND LINE ENABLED BR 30$ ;;;ENABLE SCANS-20$: BIC #17,@R3 ;;;DROP DTR, RTS, SEC. XMITK INC @R3 ;;;SET LINE ENABLE130$: BIS #140,-(R3) ;;;ENABLE SCAN AND INTERRUPTST" RETURN ;;;RETURN FROM COROUTINE 7 .ENDC ;D$$M11  .ENDC ;D$$H11 - N .END BYTE INSTRUCTIONS ON DM11-BB;- MOVB U.UNIT-U.TSTA(R5),R4 ;;;GET LINE NUMBER3 BIS R4,(R3)+ ;;;SELECT LINE4 CALL HLMTIM ;;;DO COMMON MODEM TIME-OUT PROC .TITLE TTMOD .IDENT /09.00/;0; Copyright (c) 1995-1999 by Mentec Inc., U.S.A.; 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.;;; 26-FEB-78 PETER WANNHEDEN;; PREVIOUSLY MODIFIED BY:;; P. WANNHEDEN ; C. F. SPITZ; D. R. DONCHIN ; S. ADAMS; T. SCHOELLER;; $; MODIFIED FOR RSX-11M-PLUS V4.4 BY:;; L. KOGAN 19-JUN-1990 08.00 ; LK758 - SET DEFAULT /NOPARITY00:~~ibjbkb a a a; .; L. KOGAN 19-JUN-1990 08.01-; LK759 - SET CC-C =1 AND V=0 IN MODI5: CASE #; (DO NOT CHANGE LINE PARAMETERS) ;S$; MODIFIED FOR RSX-11M-PLUS V4.5 BY:;D; D. CARROLL 06-MAY-1993 09.009; DC204 - DON'T RESET TERMINAL ATTRIBUTES BASED ON BIT 3F;7;E .PSECT MAP5.6; ;+!; TTMOD - MODEM SUPPORT ROUTINES.H"; CONTAINS THE FOLLOWING ROUTINES:;(; MODISR MODEM INTERRUPT SERVICE ROUTINE'; HLMTIM SUBROUTINE TO SERVICE TIME-OUT.,; MANS SUBROUTINE TO ANSWER A CALL ON A LINE#; MHUP SUBROUTINE TO HANG UP A LINE-;-;.; L .IF DF T$$MOD A .ENABL LSBI C;+H; MODISR - INTERRUPT SERVICE ROUTINE FOR DATASET STATUS CHANGE INTERRUPT9; ON DM11-BB, DL11-E OR DHV11, OR FROM DZ11 POLL SEQUENCET;S; INPUT:;; R4 BIT 15: 1 IF INTERFACE SUPPORTS "DATASET READY" SIGNAL+-; BIT 14: 1 IF DATASET SHOWS "DATASET READY"S*; BIT 7: 1 IF RING HAS OCCURRED (DM11-BB)!; 1 IF LINE IS RINGING (DL11-E)M0; 1 RING INTEGRATED OVER THREE SAMPLES (DHV11),; BIT 6: 1 IF DATASET SHOWS "CLEAR TO SEND"); BIT 5: 1 IF DATASET SHOWS "CARRIER ON"D; R5 POINTER TO U.TSTA; ; OUTPUT:O%; 1. IF LINE IS NOT REMOTE, DROP DTR.T5; 2. IF LINE IS DISABLED AND NOT WAITING FOR CARRIER:H:; 2.1 IF BIT 1 OF $TTPRM IS 0, AND NO RING SEEN, DROP DTR.D; 2.2 IF BIT 1 OF $TTPRM IS 0, AND RING SEEN, SET A TIMER FOR M$$ANS?; SECONDS AND RAISE DTR. (ANSWER A CALL AND WAIT FOR CARRIER.)19; 2.3 IF BIT 1 OF $TTPRM IS 1, AND DSR IS OFF, NO ACTION.AB; 2.4 IF BIT 1 OF $TTPRM IS 1, AND DSR AND CARRIER AND CTS ARE ON,,; ENTER SUBROUTINE MANS TO ANSWER THE CALL.C; 2.5 IF BIT 1 OF $TTPRM IS 1, DSR IS NOT AVAILABLE AND CARRIER ANDE ; CTS ARE BOTH ON, SAME AS 2.4.C; 2.6 IF BIT 1 OF $TTPRM IS 1, DSR IS NOT AVAILABLE AND CARRIER AND,"; CTS ARE NOT BOTH ON, NO ACTION.D; 2.7 IF BIT 1 OF $TTPRM IS 1, AND DSR IS ON BUT CARRIER AND CTS ARE>; NOT BOTH ON, SET A TIMER FOR M$$ANS SECONDS. (ANSWER A CALL; AND WAIT FOR CARRIER.)A1; 3. IF LINE IS DISABLED AND WAITING FOR CARRIER:M; (RING FLAG IS IGNORED)A3; 3.1 IF DSR IS OFF, DROP DTR AND HANG UP THE LINE.E=; 3.2 IF CARRIER AND CTS ARE ON, CLEAR WAITING FLAG AND ENTER =; SUBROUTINE "MANS". (CARRIER APPEARED WITHIN WAITING PERIODO"; M$$ANS AFTER ANSWERING A CALL.)*; 3.3 IF CARRIER OR CTS IS OFF, NO ACTION.4; 4. IF LINE IS ENABLED AND NOT WAITING FOR CARRIER:3; 4.1 IF DSR IS OFF, DROP DTR AND HANG UP THE LINE. 0; 4.2 IF CARRIER AND CTS ARE BOTH ON, NO ACTION.E; 4.3 IF BIT 0 OF $TTPRM IS 0, AND CARRIER OR CTS IS OFF, SET A TIMERIC; FOR M$$CAR SECONDS AND SET WAITING FLAG. (CARRIER LOST, WAIT FORI; IT TO RETURN.)IF; 4.4 IF BIT 0 OF $TTPRM IS 1, AND CARRIER OR CTS IS OFF, DROP DTR AND; HANG UP THE LINE.0; 5. IF LINE IS ENABLED AND WAITING FOR CARRIER:4; (NOTE - THIS IS THE STATE THE LINE SHOULD STAY IN3; UNTIL A BYE COMMAND HAS BEEN SUCCESSFULLY QUEUED.4; AFTER HAVING FAILED EARLIER AS RESULT OF HANG-UP.3; IN THIS STATE, DTR SHOULD BE OFF SO THAT CARRIERF6; WILL NEVER BE SEEN - CASE 5.4 SHOULD NEVER HAPPEN.)2; 5.1 IF RING SEEN, DROP DTR AND HANG UP THE LINE.3; 5.2 IF DSR IS OFF, DROP DTR AND HANG UP THE LINE.F>; 5.3 IF CARRIER OR CTS IS OFF, NO ACTION. (LINE STILL WITHOUT(; CARRIER, WAIT FOR CARRIER TO RETURN.)9; 5.4 IF CARRIER AND CTS ARE BOTH ON, CLEAR WAITING FLAG.T5; (LINE RETURNED TO NORMAL CONDITION AFTER TEMPORARY ; LOSS OF CARRIER.);A; IN EITHER CASE:E ; CC-V 0 E"; CC-C 0 IF A CALL WAS ANSWERED; 1 NO ACTION ; 1,; CC-C 0 CALLER SHOULD ENABLE DTR AND RTS'; 1 CALLER SHOULD DISABLE DTR AND RTS ;P; REGISTERS ALTERED: R2,R4;-;F;R4MODISR::BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;REMOTE LINE? BEQ 47$ ;;;N - IGNORET COMB R4 ;;;INVERT FLAGS + ROLB R4 ;;;GET INVERTED RING FLAG IN CC-C 2 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,49 JMP @MDSP(R2) ;;;DISPATCH ACCORDING TO DSB AND CRW FLAGSN;R/; CASE 2 - DISABLED AND NOT WAITING FOR CARRIERO; 0MODI2:: BIT #2,$TTPRM ;;;ENABLE DTR BEFORE RING? BNE 3$ ;;;Y - JUMP& BCS 30$00B~9~t__DATADATADATADATA ;;;RING NOT SEEN - NO ACTION? MOVB #M$$ANS+1,U.TMTI-U.TSTA(R5) ;;;SET TIMER = M$$ANS SECONDSI7 BISB #US.CRW,U.STS-U.TSTA(R5) ;;;SET CARRIER-WAIT FLAGR/ SEV ;;;SET CC-V (CC-C IS CLEAR) TO RAISE DTR  RETURNB3$: ROL R4 ;;;CHECK DSR FLAGS5 BVS 25$ ;;;DSR OFF - NO ACTION (BUT LEAVE DTR HIGH)M= BIT #600,R4 ;;;DSR ON (OR N/A) - HOW ABOUT CARRIER AND CTS? 7 BEQ MANS ;;;CARRIER AND CTS BOTH ON - ANSWER THE CALLE- BCC 30$ ;;;DSR IS NOT AVAILABLE - NO ACTIONO( TST R4 ;;;DSR IS AVAILABLE - IS IT ON? BEQ 30$ ;;;N - JUMPCB5$: MOVB #M$$ANS+1,U.TMTI-U.TSTA(R5) ;;;SET TIMER = M$$ANS SECONDS# BR 20$ ;;;GO AND WAIT FOR CARRIER;; +; CASE 3 - DISABLED AND WAITING FOR CARRIERI;L"MODI3:: ROL R4 ;;;CHECK DSR FLAGS- BVS 45$ ;;;DSR WENT AWAY - HANG UP THE LINE-; BIT #600,R4 ;;;DSR ON (OR N/A) - CARRIER AND CTS BOTH ON?  BNE 30$ ;;;N - JUMPR BR MANS ;;;ANSWER CALL;R.; CASE 4 - ENABLED AND NOT WAITING FOR CARRIER;;"MODI4:: ROL R4 ;;;CHECK DSR FLAGS- BVS 45$ ;;;DSR WENT AWAY - HANG UP THE LINE3/ BIT #600,R4 ;;;CARRIER AND CTS STILL BOTH ON?A BEQ 30$ ;;;Y - JUMPA= BIT #1,$TTPRM ;;;DROP LINE IMMEDIATELY UPON LOSS OF CARRIER?- BNE 45$ ;;;Y - JUMPOA MOVB #M$$CAR+1,U.TMTI-U.TSTA(R5) ;;;SET TIMER FOR M$$CAR SECONDSR BR 20$ ;;;GO AND SET WAIT FLAG;#*; CASE 5 - ENABLED AND WAITING FOR CARRIER;TMODI5:: BCC 45$ ;;;RING - JUMPB ROL R4 ;;;CHECK DSR FLAGS - BVS 45$ ;;;DSR WENT AWAY - HANG UP THE LINE; SEC ;;;SET CC-C) BIT #600,R4 ;;;CARRIER AND CTS BOTH ON?Y BNE 40$ ;;;N - JUMPB( BIT #1,$TTPRM ;;;DROP LINE IMMEDIATELY?& BNE 40$ ;;;NO - RETURN TO THE CALLER* CALL 50$ ;;;BOTH ON - CLEAR WAITING FLAG" BR 30$ ;;;AND EXIT WITH CC-C = 1610$: MOVB #1,U.TMTI-U.TSTA(R5) ;;;SET TIMER = 1 SECOND;20$: BISB #US.CRW,U.STS-U.TSTA(R5) ;;;SET CARRIER-WAIT FLAGL25$: CLV ;;;SHOW NO ACTION#30$: SEC ;;;SHOW NO CALL ANSWEREDR 40$: RETURNC;S'; COME HERE TO HANG UP LINE IMMEDIATELYN;P445$: CALL 10$ ;;;START TIMER, SET CARRIER-WAIT FLAG@47$: .WORD SEC!SEV ;;;SET CC-V AND CC-C TO DROP DTR UPON RETURN RETURNM I;L;;+"; SUBROUTINE MANS - ANSWER A CALL.;L; INPUT:; R5 POINTER TO U.TSTA;G ; OUTPUT:;=; UCB IS INITIALIZED. DISABLE AND CARRIER-WAIT FLAGS CLEARED.E#; CC-C 0 TO INDICATE CALL ANSWERED.,;TE; IF BIT 3 IN $TTPRM IS CLEAR, TERMINAL CHARACTERISTICS WILL BE RESET0:; TO A KNOWN STATE, ELSE, IF SET, THEY WILL BE LEFT AS IS.;R; REGISTERS ALTERED: NONEL;-;;:MANS:: .IF DF USECDL!USECDH!USECDZ .IFTF ;USECDL!USECDH!USECDZ. BIS #S2.FLF,2(R5) ;;;INITIALIZE STATUS WORD 2 CLC ;;;AND CLEAR CC-C .IFFN4 BIT #10,$TTPRM ;;; SHOULD WE RESET CHARACTERISTICS?, BNE 48$ ;;; IF NE, NOPE, DON'T DO THIS ...' TST (R5)+ ;;;POINT TO 2ND STATUS WORD0: BIC #S2.WRA!S2.WRB!S2.CR,(R5)+ ;;;INITIALIZE STATUS WORDS& BIC #S3.FDX!S3.8BC!S3.RAL!S3.PTH,(R5)+ ;;;CLEAR FULL DUPLEX, 8 BIT CHARACTERS,W% ;;;READ-ALL, NO-ECHO AND PASSTHRUE BIS #S3.ACR,(R5)+ ;;;SET ACR' BIC #^C,(R5) ;;;S SUB #6,R5 ;;;POINT TO U.TSTA' CLR U.TST5-U.TSTA(R5) ;;;CLEAR U.TST5 A BIC #U2.CRT!U2.HLD!U2.L3S!U2.VT5!U2.ESC,U.CW2-U.TSTA(R5) ; DD168 ( ;;;INITIALIZE CHARACTERISTICS WORD 22 BIC #U3.UPC!U3.PAR,U.CW3-U.TSTA(R5) ;;;AND WORD 3( MOV #80.,U.CW4-U.TSTA(R5) ;;;AND WORD 47 CLRB U.TTYP-U.TSTA(R5) ;;;SET TERMINAL TYPE TO UNKNOWNL48$: ;;; REFERENCE LABELU .ENDC  .IF DF R$$MPL!A$$CLIA/ BIC #UM.CLI,U.MUP-U.TSTA(R5) ;;;SET MCR AS CLI; .ENDC .IF DF M$$CLI H/ MOV #$MCRPT,U.CLI-U.TSTA(R5) ;;;SET MCR AS CLI. A .ENDC T .IF DF T$$SERA BIC #UM.SER!UM.CMD,U.MUP-U.TSTA(R5) ;;;RESET SERIAL COMMAND MODE( .ENDC .IF DF D$$M11!D$$ZMD!D$$VMD ASSUME S4.ABD,100000C2 TST 6(R5) ;;;AUTO-BAUD DETECT SET FOR THIS LINE?- BPL 50$ ;;;IF NOT,DON'T START ABD DETECTION(B BIS #S5.ABP,U.TST5-U.TSTA(R5) ;;;Y - INITIATE AUTO-BAUD DETECTION; MOV #S.4800,U.CW4-U.TSTA(R5) ;;;SET INITIAL AUTOBAUD SPEEDU .ENDC ;D$$M11!D$$ZMD!D$$VMD>50$: CLRB U.TMTI-U.TSTA(R5) ;;;STOP MODEM TIMER AND CLEAR CC-C)60$:00J~~ibjbkb a a a BICB #US.DSB!US.CRW,U.STS-U.TSTA(R5)R) ;;;ENABLE LINE AND CLEAR WAITING FLAG;# RETURN ;;;RETURN WITH CC-V CLEAR . .DSABL LSBD M $;+5; HLMTIM - TIME-OUT ON DM11-BB, DL11-E, DHV11 OR DZ11D;C; INPUT:; R5 POINTER TO U.TSTA; ; OUTPUT:T; IF CARRIER-WAIT FLAG = 0:AD; IF LINE IS LOCAL, RETURN TO CALLER WITH Z-BIT SET, WHICH INDICATES&; THAT DTR AND RTS SHOULD BE DROPPED.G; IF LINE IS REMOTE, RETURN TO CALLER WITH Z-BIT CLEAR, WHICH INDICATES;'; THAT DTR AND RTS SHOULD BE ASSERTED.C;U; ELSE:C8; CALLER CALLED AS COROUTINE WITH INTERRUPTS LOCKED OUT.3; ON RETURN FROM CALLER, THE FOLLOWING IS EXPECTED:S; ; R5 UNCHANGED; DTR AND RTS DROPPED.;-;B;L>HLMTIM::BITB #US.CRW,U.STS-U.TSTA(R5) ;;;ARE WE STILL WAITING? BNE 20$ ;;;Y - JUMPR. BIT #2,$TTPRM ;;;DON'T ASSERT DTR UNTIL RING?4 BEQ 10$ ;;;Y - JUMP (LEAVING CC-Z SET TO DROP DTR)0 BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;IS LINE REMOTE?710$: RETURN ;;;RETURN TO CALLER WITH Z-BIT INDICATION :20$: SEZ ;;;SET Z-BIT TO TELL CALLER TO DROP DTR AND RTS+ CALL @(SP)+ ;;;CALL CALLER AS A COROUTINE5 CALL @(SP)+ ;;;ALLOW INTERRUPTS (RETURN TO LOCKI IS " ;;;ASSUMED TO BE ON THE STACK)= MOVB #M$$DIS+1,U.TMTI-U.TSTA(R5) ;SET TIMER = M$$DIS SECONDSW- BITB #US.DSB,U.STS-U.TSTA(R5) ;LINE ENABLED?# BEQ MHUP ;Y - HANG UP THE LINE2 BICB #US.CRW,U.STS-U.TSTA(R5) ;CLEAR WAITING FLAG RETURN T;2;T;+; SUBROUTINE MHUP - HANG UP.%; MAY ONLY BE CALLED AT SYSTEM STATE!I;Z; INPUT:; R5 POINTER TO U.TSTA8; US.DSB 0 TO PREVENT THAT A RING IS ANSWERED BEFORE THE; TERMINAL IS LOGGED OFFN0; LINE PHYSICALLY HUNG UP (DTR AND RTS DROPPED).;I ; OUTPUT:;&; IF ANY I/O WAS ACTIVE, IT IS KILLED.5; IF TERMINAL WAS LOGGED ON, A BYE COMMAND IS QUEUED.B%; IF BYE COMMAND SUCCESSFULLY QUEUED:L; US.DSB 1 (LINE DISABLED) ; US.CRW 0 (NOT WAITING)T; ELSE:R; US.DSB 0 (LINE ENABLED); US.CRW 1 (WAITING) ;R#; REGISTERS ALTERED: R0,R1,R2,R3,R4 ;-;A;Y5MHUP:: MOV #IE.DNR&377,R0 ;SET DEFAULT STATUS, IE.DNRS!LHMHUP::MOV R0,-(SP) ;SAVE STATUSSB BISB #US.CRW,U.STS-U.TSTA(R5) ;ASSUME FAILURE TO SEND BYE COMMAND+ ;THIS ALSO PREVENTS PROCESSING OF INPUT  ;INTERRUPTST .IF DF T$$SPLE MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;MAP UCBX JUST IN CASE (IT MAY NOT BED4 ;MAPPED IF WE COME HERE FOR POWER UP PROCESSING) .ENDC ;T$$SPL& CALL I1CTXL ;FLUSH TYPE-AHEAD BUFFER4 BIC #S5.ABP,U.TST5-U.TSTA(R5) ;RESET AUTO-BAUD MODE .IF DF T$$SPL, MOV #120000,R4 ;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPLS" 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 EVENE ASSUME U.TOTI,U.TITI+1 . CLR U.TITI(R4) ;CLEAR INPUT AND OUTPUT TIMERS, MOV (SP),R0 ;GET STATUS TO RETURN TO TASK . CALL KILLI1 ;KILL INPUT (IF ANY IN PROGRESS), MOV (SP),R0 ;GET STATUS TO RETURN TO TASK / CALL KILLO1 ;KILL OUTPUT (IF ANY IN PROGRESS)P ;WITH STATUS IE.DNR 010$: TST (SP)+ ;GET RID OF STATUS OFF THE STACK S .IF DF M$$MUP O2 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 BYEI MOV R5,R2 ;SET UCB ADDRESS SUB #U.TSTA,R2 ;U" CALL $QCNTP ;QUEUE A BYE COMMAND .IFF ;T$$SPC0. 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 ADDRESSP% MOV #"BY,(R0)+ ;INSERT "BYE" COMMANDR MOV #'E!,(R0)+N" CALL $QMCR ;QUEUE COMMAND TO MCR .ENDC ;T$$SPC U .ENDC ;M$$MUP 2?; THE LINE MAY HAVE BECOME NON-REMOTE. IF SO, LEAVE IT ENABLED.E;M/20$: BIT #U2.RMT,U.CW2-U.TSTA(R5) ;REMOTE LINE?I BEQ 30$ ;N - JUMPH .IF DF T$$MHU/ BIT #S3.MHE,4(R5) ;IS CHARACTERISTIC ENABLED? BEQ 25$ ;BR IF NOF .IF DF T$$SPL! MOV #120000,R4 ;POINT TO UCBX. 2 .IFF ;T$$SPLA' MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBX  .ENDC ;T$$SPL# MOV U.TMHA(R4),R1 ;GE00R~S~t__DATADATADATADATAT ACB ADDRESSV .IF DF T$$OVL MOV #QUEAEN,-(SP) CALL MPROT ;QUE AST TO TASK; .IFF ;T$$OVLC) CALL QUEAEN ;QUEUE AST TO ATTACHED TASKR .ENDC ;T$$OVL .ENDC ;T$$MHU25$:+ BISB #US.DSB,U.STS-U.TSTA(R5) ;Y - DISABLE;30$: BICB #US.CRW,U.STS-U.TSTA(R5) ;CLEAR CARRIER-WAIT FLAG 40$: RETURN ;C A .ENDC ;T$$MOD B;F;F .ENDF DF T$$SPL! MOV #120000,R4 ;POINT TO UCBX. 2 .IFF ;T$$SPLA' MOV U.TUX-U.TSTA(R5),R4 ;POINT TO UCBX  .ENDC ;T$$SPL# MOV U.TMHA(R4),R1 ;GE .IIF NDF R$$MPL, .TITLE EXESTB .IIF DF R$$MPL, .TITLE SFVC2 .IDENT /04.60/;l1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.D; 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.;S; B. S. MCCARTHY 28-NOV-83;U+; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:C; ; R. D. HANEYD; B. S. MCCARTHY; G. N. LARSEN; T. SCHOELLER ; R. KRISHNA; J. W. BERZLE;Y+; MODIFIED FOR RSX-11M-PLUS VERSION 4.1 BY:$;L ; R. D. HANEY; G. N. LARSEN; J. W. BERZLE;.+; MODIFIED FOR RSX-11M-PLUS VERSION 4.3 BY: ;M; G. N. LARSEN;D+; MODIFIED FOR RSX-11M-PLUS VERSION 4.4 BY: ;F; B. S. MCCARTHY;N+; MODIFIED FOR RSX-11M-PLUS VERSION 4.5 BY:D;E ; D. CARROLL;F+; MODIFIED FOR RSX-11M-PLUS VERSION 4.6 BY:3;U; D. Carroll 19-Oct-1995 04.603; DC406 - Include UTUIC in the vectored references;.; ; EXEC VECTORING ROUTINE;KA; AS YOU MAY HAVE NOTICED IN THE .TITLE DIRECTIVE, THIS MODULE IS E; ASSEMBLED CONDITIONALLY UPON R$$MPL. THE MODULE IS ASSEMBLED TWICE.DG; THE FIRS TIME (ASSEMBLED WITH RSXMC), PRODUCES THE VECTOR CODE ITSELFRJ; FOR THE EXEC (MODULE SFVC2). THE SECOND ASSEMBLY, WITHOUT RSXMC, CREATESH; AN OBJECT MODULE (MODULE EXESTB) WHICH CAN BE TASKBUILT INTO THE DUMMY; STB FILE FOR THE EXECUTIVE.C;+.; **-$SFVCD-TRANSLATE EXEC VECTOR (FOR DRIVER)4; **-$SFVCP-TRANSLATE EXEC VECTOR (FOR COMM PROCESS);EF; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TRANSLATE A VECTOR OF OFFSETSF; INTO THE SYSTEM VECTOR (DEFINED BELOW) INTO OFFSETS. SEE COMMENTS ON; BUFFER FORMAT BELOW.;D$; * * * N O T E W E L L * * *;SI; THESE ROUTINES ARE AT VIRTUAL ZERO IN THE DIRECTIVE COMMON. THE ROUTINEEH; COULD BE MOVED, BUT LABEL $SFVCP HAD BETTER STAY AT ZERO FOR ALL TIME,; AND $SFVCD AT VIRTUAL 4E;I ; INPUTS:;*;; R2=NUMBER OF ENTRIES IN VECTOR (NUMBER OF WORDS, LESS ONEL; FOR FLAGS WORD)&; R3=ADDRESS OF WD. 00. OF THE BUFFER.;S7; CALLING SEQUENCE ($SFVCD): (REGISTER USAGE ARBITRARY) ;T1; MOV @#112,R0 ;GET POINTER TO VECTOR OF POINTERS 5; MOV @(R0),KINAR6 ;MAP ROUTINE WITH CORRECT APR BIAS '; CALL @#140004 ;CALL TRANSLATE ROUTINEA;E7; CALLING SEQUENCE ($SFVCP): (REGISTER USAGE ARBITRARY)D;U1; MOV @#112,R0 ;GET POINTER TO VECTOR OF POINTERS,4; MOV @(R0),-(SP) ;MAP ROUTINE WITH CORRECT APR BIAS3; MOV #120000,-(SP) ;GET ADDR. OF TRANSLATE ROUTINEN3; CALL $MPPRO ;CALL ROUTINE IN EXEC WHICH MAPS AND0; ;CALLS TRANSLATE ROUTINE ;U ; OUTPUTS:;(6; THE VECTOR IS FILLED WITH THE REQUESTED INFORMATION.; ;- .PAGE .IF DF R$$MPL;$SFVCP::JMP SFVCC ;ENTRY POINT TO TRANSLATE PROCESS VECTOR02$SFVCD:: ;ENTRY POINT TO TRANSLATE DRIVER VECTOR .IF DF K$$DAS/ MOV @#KDSAR6,-(SP) ;SAVE MAPPING OF DATA SPACEO5 MOV @#KINAR6,@#KDSAR6;OVERMAP I/D (CALLER CAN'T TELLT# ;THIS MUST BE DONE, BECAUSE THEP' ;FEATURE MASK ISN'T AVAILABLE YET).L .ENDC ; DF K$$DAS! TST (R3) ;FIRST WORD NON-ZERO ? ( ;(IMPLIES VECTOR ALREADY TRANSLATED) BNE 40$ ;IF NE YES, RETURN NOW3 INC (R3)+ ;SET FLAG FOR VECTOR ALREADY TRANSLATED"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 YES0 MOV EXEVEC+20000(R0),(R3)+ ;INSERT REAL ADDRESS BR 30$ ;FINISH LOOPPA20$: MOV #160001,(R3)+ ;THIS ADDRESS SHOULD ALWAYS RESULT IN TRAPF+ ;(IT'S ODD AND GUARANTEED NON-EXISTENT);30$: SOB R2,10$ ;FINISH LOOPO40$: .IF DF K$$DAS) MOV (SP)+,@#KDSAR6 ;R00Z~~ibjbkb a a aESTORE APR6 MAPPING  .ENDC ; DF K$$DAS RETURN ; % .BLKW 50. ; ***** PATCH SPACE ***** .ENDC ; DF R$$MPL .PAGE;+!; **-$SFVC2-TRANSLATE EXEC VECTORO;;F; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TRANSLATE A VECTOR OF OFFSETSF; INTO THE SYSTEM VECTOR (DEFINED BELOW) INTO OFFSETS. SEE COMMENTS ON; BUFFER FORMAT BELOW.;S ; DPB FORMAT: ;A#; WD. 00 -- DIC(169.),DPB SIZE(4.).D.; WD. 01 -- SUBFUNCTION CODE (15.) (LOW BYTE).; WD. 02 -- BUFFER ADDRESS.$#; WD. 03 -- BUFFER SIZE (IN WORDS).A; ; BUFFER FORMAT:;D7; WD. 00 -- RETURNED AS ADDRESS OF ROUTINE/DATA CELLC(; WD. 01 -- OFFSET INTO SYSTEM VECTOR; WD. 02/03 -- SECOND PAIR; .; .; .;I ; INPUTS:S;E*; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.&; R3=ADDRESS OF WD. 00. OF THE BUFFER.(; R5=TCB ADDRESS OF THE REQUESTING TASK.; ; OUTPUTS:;P=; THE USER'S BUFFER IS FILLED WITH THE REQUESTED INFORMATION.-;U;- .PAGE .IF DF R$$MPL .ENABL LSB 7$SFVEC::INC R2 ;ALLOW FOR MANDATORY PARAMETER IN COUNT! MOV R2,R0 ;COPY NUMBER OF WORDS- INC R0 ;ALLOW FOR FLAGS WORD$ ASL R0 ;CONVERT TO NUMBER OF BYTES% ADD R3,R0 ;POINT PAST END OF BUFFERA BCS 50$ ;IF CS WRAPS AROUND3 CMP R0,#160000 ;IS IT PAST MAPPING RANGE OF APR6 ?F# BHI 50$ ;IF HI YES - RETURN ERRORB'SFVCC: TST (R3) ;FIRST WORD NON-ZERO ?T( ;(IMPLIES VECTOR ALREADY TRANSLATED) BNE 40$ ;IF NE YES, RETURN NOW3 INC (R3)+ ;SET FLAG FOR VECTOR ALREADY TRANSLATEDB"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 LOOPEA20$: MOV #160001,(R3)+ ;THIS ADDRESS SHOULD ALWAYS RESULT IN TRAPN+ ;(IT'S ODD AND GUARANTEED NON-EXISTENT)T30$: SOB R2,10$ ;FINISH LOOPI40$: RETURN ; 350$: DRSTS D.RS98 ;INVALID VECTOR BUFFER SPECIFIED .DSABL LSBU% .BLKW 50. ; ***** PATCH SPACE *****R .ENDC ; DF R$$MPL .PAGE ; MACRO TO DEFINE VECTOR ENTRIES .MACRO VECTOR ENTRY,COND, .IF NDF R$$MPLS'ENTRY'==OFFSETOOFFSET=OFFSET+2I .IFF ; NDF R$$MPL .IF NB CONDE .IF DF COND .WORD ENTRY# .IFF ; DF CONDS .WORD 160001 .ENDC ; DF COND .IFF ;NB CONDT .WORD ENTRY .ENDC ; NB CONDT .ENDC ; NDF R$$MPLD .ENDM VECTORE9; MACRO FOR ENTRIES WHOSE NAMES DON'T APPEAR IN DUMMY STB  .MACRO NOSTB ENTRY,COND .IF NDF R$$MPLEOFFSET=OFFSET+2N .IFF ; NDF R$$MPL .IF NB CONDC .IF DF COND .WORD ENTRYF .IFF ; DF COND  .WORD 160001 .ENDC ; DF COND .IFF ;NB CONDN .WORD ENTRY .ENDC ; NB CONDW .ENDC ; NDF R$$MPLN .ENDM NOSTB+; MACRO TO DEFINE SYNONYMS FOR ENTRY POINTS  .MACRO SYNONM ENTRY .IF NDF R$$MPL'ENTRY'==OFFSET-2A .ENDC ; NDF R$$MPLA .ENDM SYNONMI0; DEFINE LOCAL SYMBOLS FOR MULTIPLE CONDITIONALS .IF DF M$$EXT&U$$UMR+ EXTUMR = 0D .ENDC ;DF M$$EXT&U$$UMR .IF DF S$$WPC&D$$ISK  SWAP=0R .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$$PRO MPNET=0 .ENDC ; DF M$$NET&M$$PRO  .IF DF L$$XDT&M$$PROF MPLXDT=0T .ENDC ; DF L$$XDT&M$$PRO .PAGE; THE VECTOR TABLE ITSELF=; AS OF FIELD TEST, THE VECTOR FOR THE VERSION 3.0 RELEASE ISS3; FROZEN. ADD NEW SYMBOLS AT THE END OF THE VECTOR.;E .IF NDF R$$MPLC OFFSET = 0U .IFF.EXEVEC:C .ENDC ; NDF R$$MPL VECTOR D.VINT VECTOR KISAR0 VECTOR KISAR5 VECTOR KISAR6 VECTOR KISAR7 VECTOR P.LGTH VECTOR S.CTMN VECTOR S.FRK VECTOR S.EMBT VECTOR S.ITMN VECTOR S.KRB; VECTOR S.KS5,L$$DRV VECTOR S.KTBM VECTOR S.LHDD VECTOR S.PKT; VECTOR S.RCNT VECTOR S.ROFF VECTOR S.STSB VECTOR S.ST2 VECTOR S.ST3T VECTOR S.URMR VECTOR T.ACN0 VECTOR T.CPU VECTOR T.EXT VECTOR T.IRME VECTOR T.ISIZ VECTOR T.LGTH VECTO00b~S~t__DATADATADATADATAR T.OCBH VECTOR T.RDCT VECTOR T.RRMC VECTOR UISAR0 VECTOR UISAR1 VECTOR UISAR6 VECTOR UISAR7 VECTOR UISDR6 VECTOR UISDR7 VECTOR U.UABC VECTOR V$$CTR VECTOR W.MAPC VECTOR W.RTRV VECTOR W.USE,P$$WND VECTOR W.VBN. VECTOR W.WISZ VECTOR .LB0 VECTOR .CO0 VECTOR .TT0 VECTOR $ABTIM VECTOR $ABTM2 VECTOR $ABTSK VECTOR $ACCRG VECTOR $ACHCK VECTOR $ACHKB VECTOR $ACHRO VECTOR $ACNFE VECTOR $ACTHD VECTOR $ACTPS VECTOR $ALACC VECTOR $ALOCB VECTOR $ALOC1 VECTOR $ALSEC VECTOR $ALTAB VECTOR $ALVBK VECTOR $APLIM VECTOR $ASUMR,EXTUMRO VECTOR $BCBUF,C$$CDA7 VECTOR $BILNG VECTOR $BLXIO VECTOR $BTTIM VECTOR $BTTM2 VECTOR $CBDHD VECTOR $CEFIV 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 $COPTT VECTOR $CPBIT VECTOR $CPCRM VECTOR $CPMSK VECTOR $CPTBL VECTOR $CPUSC VECTOR $CPURM VECTOR $CPUTM VECTOR $CPUT1 VECTOR $CRALT,C$$CDAB VECTOR $CRATT VECTOR $CRAVL VECTOR $CRBAE,C$$CDAT VECTOR $CRCSR,C$$CDAC VECTOR $CRDEV,C$$CDAF VECTOR $CRKRB,C$$CDAC VECTOR $CRMS0,C$$CDAT VECTOR $CRMS3,C$$CDAO VECTOR $CRMS6,C$$CDAR VECTOR $CRMTB VECTOR $CRPAR,C$$CDAO VECTOR $CRPKT VECTOR $CRSBN,C$$CDAD VECTOR $CRSCS,C$$CDAO VECTOR $CRSUN,C$$CDAN VECTOR $CRUNT,C$$CDAO 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 $DIVC SYNONM $$DIVD 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 $MULM SYNONM $$MULS VECTOR $MSCR1,CDA$MSC VECTOR $MSCR2,CDA$MST VECTOR $MSCR3,CDA$MSC VECTOR $MXEXT VECTOR $M100Q,M$$NETT VECTOR $NCPUA VECTOR $NCTPT,T$$TSAC 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 $POOLN VECTOR $PRIHL VECTOR $PRILL VECTOR $PROC2 VECTOR $PRTAB VECTOR $PTBYT VECTOR $PTCBL VECTOR $PTCPT VECTOR $PTTCB VECTOR $PTWRD VECTOR $QACNT VECTOR $QASTT VECTOR $QCLNR VECTOR $QCNTP VECTOR $QCPKT VECTOR $QERMV VECTOR $QFORK VECTOR $QINSF VECTOR $QINSP VECTOR $QMCR7 VECTOR $QMCRL VECTOR $QRMVF VECTOR $QRMVT VECTOR $QSPIB VECTOR $QSPIF VECTOR $QSPIP VECTOR $QSPRF VECTOR $QTRAN VECTOR $QTRN1 VECTOR $QTRN2 VECTOR $QUEBF VECTOR $QUEXT VECTOR $QUPKT VECTOR $RCTPT VECTOR $RELOC VECTOR $REMOV VECTOR $REMO1 VECTOR $REQU1 VECTOR $RNDC,R$$NDC VECTOR $RNDH,R$$NDC VECTOR $RND00j~~ibjbkb a a aL,R$$NDC VECTOR $RQSCH VECTOR $RQTAB VECTOR $SABPT VECTOR $SAHDB VECTOR $SAHPT VECTOR $SAVNR VECTOR $SCCTB VECTOR $SCDEV VECTOR $SCDVT VECTOR $SCDV1 VECTOR $SCERR VECTOR $SCMDQ VECTOR $SCMOF VECTOR $SCOFL VECTOR $SCRET VECTOR $SECFR VECTOR $SETCR VECTOR $SETF VECTOR $SGFIN VECTOR $SGNMK VECTOR $SHERR VECTOR $SHFCT VECTOR $SHFTM VECTOR $SHFPT VECTOR $SHLOS VECTOR $SHPCT VECTOR $SHUMB VECTOR $SIGFL VECTOR $SNCMD VECTOR $SRAST VECTOR $SRCCQ VECTOR $SRGEF,G$$GEFO VECTOR $SRPRO VECTOR $SRSTD VECTOR $SRUCB VECTOR $SRUC1 VECTOR $STACK VECTOR $STALR VECTOR $STCLI VECTOR $STENB VECTOR $STFLG VECTOR $STKDP VECTOR $STPCT VECTOR $STPTK VECTOR $STRTM 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 $TKPSG VECTOR $TKTAB VECTOR $TKTCB VECTOR $TKWSE VECTOR $TMSTP VECTOR $TRACE VECTOR $TSKHD VECTOR $TSKRP VECTOR $TSKRT VECTOR $TSPAR VECTOR $TSTBF VECTOR $TSTCP VECTOR $TTNSC VECTOR $UCBSC VECTOR $UMPCC VECTOR $UMPSC VECTOR $UMRHD,EXTUMRP VECTOR $UMRPT,M$$NETC VECTOR $URMST VECTOR $URMTB VECTOR $VECTR VECTOR $VERSN VECTOR $VERTK VECTOR $VTDCB; COMM EXEC VECTORSO VECTOR $1SCTB,MPNET VECTOR $ACTLN,MPNET VECTOR $ASCMP,M$$NETC VECTOR $CALLX,M$$NETC VECTOR $CCBAF,M$$NETT VECTOR $CCBAL,M$$NETC VECTOR $CCBCT,M$$NETS VECTOR $CCBGT,M$$NETC VECTOR $CCBRT,M$$NETK VECTOR $CCBLH,M$$NETC VECTOR $CCBNM,M$$NETT VECTOR $CCBSZ,M$$NETC VECTOR $CEACC,M$$NETB VECTOR $CECAC,M$$NETC VECTOR $CEDIV,M$$NETR VECTOR $CELFN,M$$NETR VECTOR $CELOG,M$$NETM VECTOR $CEMUL,M$$NETC VECTOR $CEPWR,M$$NETR VECTOR $CMFRK,M$$NETC VECTOR $CMPDV,M$$NETE VECTOR $CMQIN,M$$NET1 VECTOR $CMQRM,M$$NETT VECTOR $CNV22,M$$NETP VECTOR $CNV18,M$$NETX VECTOR $CSBGT,M$$NETF VECTOR $CSBRT,M$$NETL VECTOR $CTCMP,M$$NETT VECTOR $CXOPT,M$$NETT VECTOR $DDAST,M$$NETT VECTOR $DDCCP,M$$NETH VECTOR $DDCRA,M$$NETM VECTOR $DDDIS,M$$NETZ VECTOR $DDENB,M$$NETC VECTOR $DDFNC,M$$NETC VECTOR $DDGET,M$$NETV VECTOR $DDKCP,M$$NETN VECTOR $DDKIL,M$$NETG VECTOR $DDMAN,M$$NETL VECTOR $DDMSN,M$$NETR VECTOR $DDRCE,M$$NETK VECTOR $DDRCP,M$$NETV VECTOR $DDRNG,M$$NETN VECTOR $DDSET,M$$NETM VECTOR $DDSPC,M$$NET2 VECTOR $DDSTP,M$$NET8 VECTOR $DDSTR,M$$NETT VECTOR $DDXKL,M$$NETT VECTOR $DDXME,M$$NETP VECTOR $DDXMP,M$$NETT VECTOR $DDXOF,M$$NETT VECTOR $DDXON,M$$NETP VECTOR $DECPT,M$$NETA VECTOR $DLCRS,M$$NETS VECTOR $DSPTM,M$$NETB VECTOR $EVDSC,M$$NETC VECTOR $FILHD,M$$NETT VECTOR $INTSX,M$$NETP VECTOR $INTX7,M$$NETL VECTOR $KLCMP,M$$NETN VECTOR $LDBAF,M$$NETN VECTOR $LDBGT,M$$NETE VECTOR $LDBRT,M$$NETP VECTOR $LGCON,M$$NETG VECTOR $LGDDB,M$$NETT VECTOR $LGFNB,M$$NETC VECTOR $LGMON,M$$NETP VECTOR $LGPDV,M$$NETR VECTOR $LGSTT,M$$NETL VECTOR $LGUIC,M$$NETE VECTOR $LLCAL,M$$NETP VECTOR $LLCLC,M$$NETF VECTOR $LLCRQ,M$$NETN VECTOR $LLCRS,M$$NETT VECTOR $LLCSP,M$$NETS VECTOR $LLCTA,M$$NETM VECTOR $LTMFC,M$$NETC VECTOR $MAXOV,M$$NETD VECTOR $MPLCK,MPNET VECTOR $MPSAV,MPNET VECTOR $MVFBF,M$$NETK VECTOR $MVTBF,M$$NETL VECTOR $NBIAS,M$$NETL VECTOR $NETPF,M$$NETL VECTOR $NMCLH,M$$NETL VECTOR $NMCL2,M$$NETL VECTOR $NMCRS,M$$NETL VECTOR $NMLST,M$$NETL VECTOR $NTLPT,M$$NETL VECTOR $OBJHD,M$$NETL 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$$NET VECTOR $PWRF1,M$$NET  VECTOR $QBIAS,M$$NETM VECTOR $QSTRT,M$$NETM VECTOR $RCCMP,M$$NETN VECTOR $RDBAF,M$$NETN VECTOR $RDBCT,M$$NETN VECTOR $RDBGT,M$$NETN VECTOR $RDBLH,M$$NETN VECTOR $RDBNM,M$$NETN VECTOR $RDBRT,M$$NETN VECTOR $RDBSZ,M$$NETO VECTOR $RDBTH,M$$NETP VECTOR $RDBWT,M$$NETD VECTOR $RDBQP,M$$00r~S~t__DATADATADATADATANETQ VECTOR $RDQCT,M$$NETQ VECTOR $RDQSL,M$$NETS VECTOR $SDBAF,M$$NETV VECTOR $SDBCT,M$$NETV VECTOR $SDBLH,M$$NETV VECTOR $SDBNM,M$$NETI VECTOR $SDBSZ,M$$NETM VECTOR $SLTMA,M$$NET1 VECTOR $SLTNM,M$$NETS VECTOR $SNAPT,M$$NETT VECTOR $SPMTB,DUMMY VECTOR $SQRCM,M$$NETB VECTOR $STDDM,M$$NETB VECTOR $STDD1,M$$NETB VECTOR $STDLC,M$$NETB VECTOR $STDL1,M$$NETB VECTOR $STMFC,M$$NETB 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$$NETO VECTOR $XMCMP,M$$NETO VECTOR $ZTIME,M$$NETO VECTOR $ZTIM2,M$$NETO VECTOR $STMTB,MPNET6; THE FOLLOWING SYMBOLS ARE FOR SPM-11M-PLUS HOOKPOINT VECTOR $SPH01 VECTOR $SPH02 VECTOR $SPH03 VECTOR $SPH04 VECTOR $SPH05 VECTOR $SPH06 VECTOR $SPH07 VECTOR $SPH08 VECTOR $SPH09 VECTOR $SPH10,E$$XPRT VECTOR $SPH11 VECTOR $SPH12 VECTOR $SPH13,DUMMY VECTOR $SPH14,DUMMY VECTOR $SPH15 VECTOR $SPH16 VECTOR $SPH17 VECTOR $SPH18 VECTOR $SPH19,P$$MONT VECTOR $SPH20 VECTOR $SPH21 VECTOR $SPH22 VECTOR $SPH23,V$$TRMO VECTOR $SPH24,V$$TRMO VECTOR $SPH25 VECTOR $SPH26 VECTOR $SPH27 VECTOR $SPH28,C$$INTS VECTOR $SPH29 VECTOR $SPH30 VECTOR $SPH31 VECTOR $SPH32 VECTOR $SPH33 VECTOR $SPH34,P$$MONS VECTOR $SPH35,P$$MONV VECTOR $SPH36,M$$NETS VECTOR $SPH37,DUMMY VECTOR $SPH38,DUMMY VECTOR $SPH39,DUMMY VECTOR $SPH40,DUMMY;; SYMBOLS ADDED AFTER START OF RSX-11M-PLUS V3.0 FIELD TEST7 VECTOR $BCERR VECTOR $BCFAC VECTOR $BCPC  VECTOR $CRUPC,C$$CDA VECTOR $CRUST,C$$CDA  VECTOR $DQLM1 VECTOR $DQLM2 VECTOR $DRAP2 VECTOR $DRLM1 VECTOR $DRLM2 VECTOR $EMTRP VECTOR $ILINS VECTOR $IOTRP VECTOR $SGFLT VECTOR $SRNAM VECTOR $TRP04 VECTOR $TRTRP VECTOR $XDTND,MPLXDT$; ADDITIONAL SPM-11M-PLUS HOOKPOINTS VECTOR $SPH64 VECTOR $SPH66 VECTOR $SPH67 VECTOR $SPH70 VECTOR $SPH71 VECTOR $SPH72 VECTOR $SPH74,P$$CTLT VECTOR $SPH75,Q$$OPT0 VECTOR $SPH76,P$$CTL  VECTOR $SPH77,Q$$OPT+; ADDITIONS LATE IN VERSION 3.0 DEVELOPMENT  VECTOR $FMSK5; 9; ADDED FOR RSX-11M-PLUS V3.0 UPDATE C AND MICRO/RSX V3.1C;  VECTOR $DRAPR VECTOR $HKSTS VECTOR $IDLFL VECTOR $POLHD VECTOR $SETM  VECTOR $SPMVC VECTOR $SPV01 VECTOR $SPV02 VECTOR $SPV03 VECTOR $SRATT; ADDITIONS FOR VERSION 4.0 VECTOR U.CTXS VECTOR U.FPRO VECTOR U.LOGS VECTOR $LDEL1 VECTOR $USRLG VECTOR $PRISZ VECTOR $FNDSP VECTOR $GTUSR VECTOR $LNTD1 VECTOR $RLRLN VECTOR $CRPAS VECTOR $DVTMO VECTOR $MPUBM* NOSTB $STMAP,DUMMY ; THIS WAS A DUPLICATE VECTOR $CRCTX VECTOR $CRLO1 VECTOR $DELO1 VECTOR $DLCTX VECTOR $LOGTB VECTOR $QRMVA VECTOR $TBTRN VECTOR $BLKC2 VECTOR $BMSET VECTOR $CVLBN VECTOR $RLCN1 VECTOR $RQCND VECTOR $STMAP VECTOR $VOLVD VECTOR $BLKCK VECTOR $MPPHY VECTOR $FRKHD VECTOR $EFMSK,E$$LOGV VECTOR $ULDPT VECTOR $RTF01,MPNET VECTOR $RTF02,MPNET VECTOR $RTF03,M$$NETO VECTOR $RTF04,M$$NET1 VECTOR $LTEEP,M$$NETO VECTOR $WPLST,R$$WPTO VECTOR $WPADR,R$$WPTB VECTOR $WPIN0,R$$WPTS VECTOR $WPIN1,R$$WPTC VECTOR $WPIN2,R$$WPTV VECTOR $WPIN3,R$$WPTD VECTOR $WPBR,R$$WPT VECTOR $TNAME VECTOR $MPUB1 VECTOR $PRMOD VECTOR $ULDRQ VECTOR $FNERL VECTOR $IODSA VECTOR $QINSB VECTOR KISDR0 VECTOR KISDR6 VECTOR $CKCNT VECTOR $CKLDC VECTOR $DRVPF VECTOR $TRINT,C$$CDA VECTOR $UMRWT VECTOR $ACDHD,T$$ACDV VECTOR $DQUMR VECTOR $LOGER VECTOR $STMP1 VECTOR $TTPRM VECTOR $WCFLG VECTOR $CPSEN,C$$RMTL VECTOR $CPALO,C$$RMTA VECTOR $CPDEA,C$$RMTI;$6; SYMBOLS ADDED AT THE END OF VERSION 4.0 FOR XDT, CPR; AND GENERAL CLEANUPV;O VECTOR T.CTX VECTOR T.SAST VECTOR $ABCTK VECTOR $ACCLK VECTOR $ACHKP VECTOR $ACHKW VECTOR $ACHUI,U$$DAS  VECTOR $ACTRM VECTOR $ACTTK VECTOR $ALCLK VECTOR $ALPKT VECTOR $ALSC1,P$$OOL VECTOR $ALSPK,P$$OOL VECTOR $ALTRG VECTOR $ATTPT VECTOR $BILDS VECTOR $B00z~~ibjbkb a a aLKC1 VECTOR $CALTA,S$$LIB VECTOR $CEFIG VECTOR $CEFNG VECTOR $CFORK,M$$PRO VECTOR $CKACC,P$$LAS VECTOR $CKBFI,U$$DAS VECTOR $CKBFW VECTOR $CKLBN,S$$HDWS VECTOR $CKUAB,A$$CNT  VECTOR $CLRSM VECTOR $CPCON,C$$RTB VECTOR $CSFSV,C$$KXJO VECTOR $CSHSV,C$$KXJK VECTOR $CURPR VECTOR $DASTT VECTOR $DBTRP VECTOR $DCAST VECTOR $DCCEB,D$$CHEK VECTOR $DCCEL,D$$CHEO VECTOR $DCLKA VECTOR $DCNEB,D$$CHEO VECTOR $DCNEL,D$$CHEO VECTOR $DCPCB,D$$CHET VECTOR $DCSTS,D$$CHEO VECTOR $DCWIO VECTOR $DECAL VECTOR $DECBF VECTOR $DECIO VECTOR $DECIP VECTOR $DESC1 VECTOR $DIRSV VECTOR $DIRXT VECTOR $DLNK,S$$HDW VECTOR $DQAC,C$$INT VECTOR $DRAP3 VECTOR $DRAP4 VECTOR $DRAPV VECTOR $DRCHE VECTOR $DRCL2 VECTOR $DRCL3 VECTOR $DRTHR,P$$OFFC VECTOR $DRWSE VECTOR $DSPKA VECTOR $DVMG1 VECTOR $ECCOR,S$$ECCC VECTOR $EMSST VECTOR $ERREC,P$$OFFC VECTOR $ERTHR,P$$OFFN VECTOR $ERHEA,E$$LOGN VECTOR $EXDOP,M$$PROP VECTOR $EXROP,M$$PROS VECTOR $EXRP1,M$$PROW VECTOR $EXRQS VECTOR $EXRQU VECTOR $FINBF VECTOR $FINDR VECTOR $FINXT VECTOR $FMAPP,F$$MAPC VECTOR $FMSKR,C$$RMTN VECTOR $FORK0 VECTOR $FORK1 VECTOR $FORK2,C$$INTO VECTOR $FPPRQ,F$$LPPV VECTOR $FPPR7,F$$LPPO VECTOR $FPPR8,F$$LPP3 VECTOR $FORKL,M$$PROC VECTOR $GENBF VECTOR $GGFRN,G$$GEFO VECTOR $GNLST VECTOR $IFORK,M$$PROO VECTOR $IMASG,C$$RTBC VECTOR $INTSC,C$$INTR VECTOR $INTSF VECTOR $INTX1 VECTOR $IOKIL VECTOR $IOKL1 VECTOR $IOKL2 VECTOR $KATBL VECTOR $KXBAS,C$$KXJS VECTOR $KXPTR,C$$KXJO VECTOR $KXVC1,C$$KXJR VECTOR $LCKPR,R$$LKLO VECTOR $LDPCB VECTOR $LOADT VECTOR $LSUPD,S$$LIB0 VECTOR $LSUP1,S$$LIBO VECTOR $MAPTK VECTOR $MPDC2 VECTOR $MPDC3 VECTOR $MPDC4 VECTOR $MPDCV VECTOR $PASTH VECTOR $PKAVL,Q$$OPTO VECTOR $PLTRQ,P$$CTLN VECTOR $PRIFR VECTOR $PROCN,M$$PROK VECTOR $PWRFL VECTOR $QASTC,C$$INTO VECTOR $QCLIL VECTOR $QPKRQ VECTOR $QPKR1 VECTOR $RELCD VECTOR $RELOM VECTOR $RELOP VECTOR $RELUI,U$$DASO VECTOR $REQUE VECTOR $RLCPS VECTOR $RLPAR VECTOR $RLPR1 VECTOR $RNDCT,R$$NDCO VECTOR $RQCNC,O$$LAPO VECTOR $SETFG VECTOR $SETMG VECTOR $SETRT VECTOR $SETRQ VECTOR $SHFND,S$$HDW2 VECTOR $SHFN1,S$$HDWO VECTOR $SHLIM,S$$HDWV VECTOR $SHSAV,S$$HDWO VECTOR $SGFFR VECTOR $SIRWF,S$$LIBN VECTOR $SPMAX VECTOR $SRCQ1 VECTOR $SRMUT,P$$OFFL VECTOR $SRWND,P$$LASO VECTOR $SUPFL,S$$LIBO VECTOR $SWACD,T$$ACD1 VECTOR $SWAC1,T$$ACDO VECTOR $SWPCT,SWAPL VECTOR $SWSTK VECTOR $TSKRQ VECTOR $UISET,M$$MUPC VECTOR $UMR4P VECTOR $UMR5P VECTOR $UNMAP,P$$LASD VECTOR $WPVAL,R$$WPTA VECTOR $WTUMR VECTOR $XXLOW,C$$KXJC VECTOR $XXHGH,C$$KXJT;V; SYMBOLS ADDED FOR VERSION 4.1F;S VECTOR $RMTSK VECTOR $SECPB VECTOR $CRSFM,C$$CDA VECTOR $CPABO;O; SYMBOLS ADDED FOR VERSION 4.3;C VECTOR $CPRCV;S; SYMBOLS ADDED FOR VERSION 4.4A; VECTOR $URTCB VECTOR $SRMAI;A; SYMBOLS ADDED FOR VERSION 4.5O;V NOSTB $MPCSR+6,P$$RTY SYNONM $MPCS6 VECTOR $MPCTL, VECTOR $POWSP,P$$RFLC VECTOR $EXECL,M$$PROM VECTOR $MLOCK,M$$PROV VECTOR $MULCK,M$$PROU VECTOR $CRIOP,C$$CDAX VECTOR $SCURM,M$$PROX VECTOR $UBUMR,U$$BMEE VECTOR $FMSK6 VECTOR $NXTLK,A$$CKP; ;DC406C0; SYMBOLS ADDED FOR RSX-11M-PLUS V4.6 ;DC406; ;DC406  VECTOR $UTUIC ;DC406 VECTOR $PATCH ;DC406 ;DC406#; FOR PEACE OF MIND, PAD THE VECTOR  .IF DF R$$MPL .REPT 25. .WORD 160001Y .ENDRMAXOFF=.-EXEVECC .ENDC ; DF R$$MPL .PAGE*; DEFINE GLOBALS OFFSETS GIVEN IN STB FILE;K;; *********************************************************C ; * *$+; * > > > W A R N I N G < < < * ; * *K9; * THE FOLLOWING ARE OFFSET DEFINITIONS WHICH ARE *L9; * SUPPLIED EITHER BY DEFINITION IN THE EXEC (IOSUB) * 9; * OR THE DUMMY STB FILE (FROM SFVC2). ANY CHANGE TO * 9; * THESE DEFINITIONS MUST BE MADE IN BOTH MODULES. *E ; * *O;; ****************00~~t__DATADATADATADATA*****************************************L .IF NDF R$$MPLI G$$SPA == 34V S$$SPA == 10 S$$SPC == 6* .ENDC ; NDF R$$MPL* .END******C ; * *$+; * > > > W A R N I N G < < < * ; * *K9; * THE FOLLOWING ARE OFFSET DEFINITIONS WHICH ARE *L9; * SUPPLIED EITHER BY DEFINITION IN THE EXEC (IOSUB) * 9; * OR THE DUMMY STB FILE (FROM SFVC2). ANY CHANGE TO * 9; * THESE DEFINITIONS MUST BE MADE IN BOTH MODULES. *E ; * *O;; **************** .TITLE IOSUBT .IDENT /17.15/L; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.A; 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-73T;A;C; PREVIOUSLY MODIFIED BY:O;S ; S. C. ADAMSR; J. W. BERZLE ; H. HUANG$; J. R. KAUFFMAN; J. M. LAWLER ; T. LEKAS ; B. S. MCCARTHY; L. B. MCCULLEY; J. J. MELVIN ; K. L. NOEL; M. PETTENGILL; P. K. M. WEISS; D. CARROLLD; $; MODIFIED FOR RSX-11M-PLUS V4.5 BY:;y;n; D. Carroll 15-Feb-1993 17.11:; DC125 -- Insure shadow failures do not fail over while 3; performing an "UPDATE" operation on the index/ 1; bitmap in $IOFIN, as an ACP I/O request may G3; receive header/bitmap data from an inaccurate "; copy on the secondary volume.;; D. Carroll 05-May-1993 17.12=; DC204 -- Don't tally internal IOC completion against totalE"; IOCs with extended accounting;; D. Carroll 15-Jun-1993 17.137; DC226 -- Honor MF.DSE when logging packets to SHE....2; and allow a MERGE COPY when processing IO.SCF;a$; Modified for RSX-11M-PLUS V4.6 by:;o; D. Carroll 18-Oct-1995 17.14;; DC404 - Include PSECT definition to allow ICB pool to beG'; fully expanded on I/D space systems ;c; D. Carroll 26-Mar-1996 17.158; DC437 - Include support for ACP tasks to be I/D space; ;'; I/O RELATED ROUTINES;t1; PRIMITIVE LEVEL ROUTINES CALLED BY MOST DRIVERSi;; MACRO LIBRARY CALLS-;38 .MCALL F11DF$,HDRDF$,HWDDF$,PCBDF$,PKTDF$,SHDDF$,TCBDF$ .MCALL UCBDF$,SCBDF$,BGCK$A;h/ F11DF$ ;DEFINE WINDOW AND LOCK BLOCK OFFSETSP% HDRDF$ ;DEFINE TASK HEADER OFFSETS9$ HWDDF$ ;DEFINE HARDWARE REGISTERS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETSd$ PKTDF$ ;DEFINE I/O PACKET OFFSETS* SHDDF$ ;DEFINE SHADOW RECORDING OFFSETS, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS. SCBDF$ ;DEFINE STATUS CONTROL BLOCK OFFSETS, UCBDF$ ;DEFINE UNIT CONTROL BLOCK OFFSETS. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;DC404;+B; **-$DECIO-DECREMENT I/O COUNT (THROUGH AN ATTACHMENT DESCRIPTOR)0; **-$DECIP-DECREMENT I/O COUNT (PARTITION ONLY);F>; THESE ROUTINES DECREMENT THE I/O COUNT THROUGH AN ATTACHMENT<; DESCRIPTOR AND/OR ASSOCIATED PCB AND CHECK FOR ANY PENDING; CHECKPOINT REQUESTS.; ; INPUTS:R;G*; R0=ADDRESS OF THE ATTACHMENT DESCRIPTOR.;O1; IF THE LOW BIT OF THE ADB ADDRESS IS SET, THENE/; THIS IS THE COMPLETION OF A BUFFERED I/O FOR1; WHICH THE PCB I/O COUNT HAS ALREADY BEEN DEC'D 3; (VIA $DECBF). ONLY THE ADB I/O COUNT IS CHANGED.T;U ; OUTPUTS:;T; NONE.O;0; R3 IS PRESERVED, ALL OTHER REGISTERS CLOBBERED;;- .ENABL LSBC0$DECIO::BIT #1,R0 ;COMPLETION OF BUFFERED I/O ?- BNE 60$ ;IF NE YES, GO DEC A.IOC AND RETURNN4 DECB A.IOC(R0) ;REDUCE I/O COUNT THROUGH DESCRIPTOR1$DECIP::MOV A.PCB(R0),R1 ;POINT TO THE REGION PCBH4 DECB P.IOC(R1) ;REDDUCE COUNT OF I/O INTO PARTITION# BNE 50$ ;IF NE THERE IS STILL I/O< BIT #PS.CKR!PS.LIO,P.STAT(R1) ;CKP REQ OR SHF DETECTED I/O? BEQ 50$ ;IF EQ NO & MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS3 MOV #$ICHKP,-(SP) ;ASSUME ITS A CHECKPOINT REQUESTE BIT #PS.CKR,P.STAT(R1) ;IS IT?S BNE 10$ ;IF NE YES7 MOV #$NXTSK,(SP) ;MUST BE A SHUFFLER DETECTED LONG I/OO MOV R1,R0 ;COPY PCB ADDRESS.210$: BIC #PS.CKR!PS.LIO,P.STAT(R1) ;CLEAR THE BITS+ CALL @(SP)+ ;CALL ROUTINE AND CLEAN STACK) MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSP50$: RETURN ;$760$: DECB A.IOC-1(R0) ;D00~~ibjbkb a a aECREMENT I/O COUNT THROUGH ATT.R RETURN ;R .DSABL LSB?;+$; **-$ULDRQ-REQUEST MICROCODE LOADER; G; THIS ROUTINE IS CALLED FROM A DRIVER TO REQUEST THE MICRO CODE LOADERTH; TASK. A PACKET IS ALLOCATED AND THE LOAD INFO. IS INSERTED, THE PACKETL; IS QUEUED TO THE MICRO CODE LOADER AND THE MICRO CODE LOADER IS REQUESTED.;C ; INPUTS:.;T; R3=MICRO CODE FILENAME INDEX1; R4=KRB ADDRESS OF CONTROLLER FOR MICROCODE LOADR;O ; OUTPUTS:;D9; C=0 IF THE PACKET WAS ALLOCATED AND THE TASK INSTALLED.I/; C=1 IF THE PACKET WAS NOT SUCCESSFULLY QUEUED +; Z=1 IF THE PACKET COULD NOT BE ALLOCATEDD$; Z=0 IF THE TASK WAS NOT INSTALLED;- .ENABL LSB 9$ULDRQ::MOV #$ULDPT,-(SP) ;PUSH ADDRESS OF ADDRESS OF TCB ) BR 10$ ;AND ENTER COMMON PACKET ROUTINEE;+!; **-$DVMSG-DEVICE MESSAGE OUTPUTO;DD; THIS ROUTINE IS CALLED TO SUBMIT A MESSAGE TO THE TASK TERMINATIONG; NOTIFICATION TASK. MESSAGES ARE EITHER DEVICE RELATED OR A CHECKPOINT ; WRITE FAILURE FROM THE LOADER.; ; INPUTS:K;S; R0=MESSAGE NUMBER.;; R5=ADDRESS OF THE UCB OR TCB THAT THE MESSAGE APPLIES TO.U;N ; OUTPUTS:;D>; A FOUR WORD PACKET IS ALLOCATED, R0 AND R5 ARE STORED IN THEA; SECOND AND THIRD WORDS RESPECTIVELY, AND THE PACKET IS THREADED;<; INTO THE TASK TERMINATION NOTIFICATION TASK MESSAGE QUEUE.;EB; 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 NUMBER .IF DF R$$PRO TST $TKNPT ;IS TKTN INSTALLED?6 BEQ $CTMSG ;IF EQ NO - TRY SENDING TO THE DISPATCHER .ENDC ;R$$PRO7 MOV #$TKNPT,-(SP) ;PUSH ADDRESS OF ADDRESS OF TKTN TCB. BR 10$ ;DROP THROUGH TO COMMON QUEUE ROUTINE;+); **-$QPKRQ-QUEUE PACKET AND REQUEST TASKO;ID; THIS ROUTINE ATTEMPTS TO ALLOCATE A FOUR WORD BLOCK, SAVE R3-R5 INA; THE BLOCK, AND QUEUE IT TO A SPECIFIED TASK. THE CONTENT OF THEN ; BLOCK IS:R%; WD 0 - LINK WORD FOR RECEIVE QUEUEO; WD 1 - SAVED R3; WD 2 - SAVED R5; WD 3 - SAVED R4; ; INPUTS:N;L1; R0=ADDRESS OF ADDRESS OF TCB OF TASK TO REQUESTI; R3-R5=REGISTERS TO BE STORED;# ; OUTPUTS:;U1; C=0 IF ALLOCATION SUCCESSFUL AND TASK INSTALLEDT; 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 CODE)10$: TST @(SP) ;SPECIFIED TASK INSTALLED. BEQ 60$ ;IF EQ NO - ERROR ( MOV #8.,R1 ;SET LENGTH OF BLOCK NEEDED CALL $ALOCB ;GET A CORE BLOCK # BCC 20$ ;FINISH IN COMMON ROUTINEN! BR 50$ ;IF CS DIDN'T GET PACKET ;+3; **-$DVMG1-DEVICE MESSAGE OUTPUT (ALTERNATE ENTRY)6; **-$QPKR1-GENERAL QUEUEING ROUTINE (ALTERNATE ENTRY); @; THESE ROUTINES ARE CALLED IF A PACKET IS TO BE QUEUED WHICH IS=; ALREADY ALLOCATED (E.G. CONVERTING A KERNEL AST TO A DEVICEE>; MESSAGE. THE PACKET MUST BE EXACTLY 8. BYTES LONG, AND IT IS>; THE DRIVERS RESPONSIBILITY TO INSURE THAT THE REQUESTED TASK; IS INSTALLED.C;E ; INPUTS: 0; R0=ADDRESS OF THE PRE-ALLOCATED MESSAGE PACKET#; R3=MESSAGE NUMBER (OR EQUIVALENT)T;; R2=ADDRESS OF ADDRESS OF TCB OF TASK (IF ENTRY AT $QPKR1)A;E ; OUTPUTS::; THE PACKET IS FILLED IN AND QUEUED TO THE SPECIFIED TASK;-8$DVMG1::MOV #$TKNPT,R2 ;PUSH ADDRESS OF TKTN TCB ADDRESS4$QPKR1::MOV R2,-(SP) ;SAVE ADDRESS OF ADDRESS OF TCB-20$: MOV R0,R1 ;SET ADDRESS OF MESSAGE BLOCK.* 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 PARAMETER2 MOV @(SP)+,R0 ;GET TCB ADDRESS OF TASK TO REQUEST. CALL $EXRQF ;INSERT IN RECEIVE LIST, REQUEST CLC ;INDICATE SUCCESS RETURN ;BACK TO CALLERU+50$: CLR (SP) ;SET TO SET Z BIT FOR RETURN$460$: COM (SP)+ ;CLEAN STACK, SET C AND Z IF APPROP. RETURN ;BACK TO CALLER  .IF DF R$$PRO;+1; **-$CTMSG-DO A SEND DATA TO THE P/OS DISPATCHER ;ID; THIS ROUTINE IS CALLED TO SEND A MESSAGE TO THE P/OS DISPATCHER BYE; DOING A SEND DATA. FOR NOW MESSAGES ARE FOR CHECKPOINT WRITE ERRORP00~~t__DATADATADATADATA#; OR CHECKPOINT ALLOCATION FAILURE.R; ; INPUTS:R;E; R0=MESSAGE NUMBERS; ; OUPUTS:L;,9; A FIXED LENGTH SEND DATA IS DONE TO C$CTEX IF POSSIBLE.E;-/$CTMSG::MOV KISAR6,-(SP) ;SAVE THE APR6 MAPPINGC& 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 ADDRESSD1 BCS 95$ ;IF CS NOT INSTALLED - DROP THE MESSAGEM# MOV R0,-(SP) ;SAVE THE TCB ADDRESSOC MOV #<13.+8.+37>/32.,R1 ;GET A PACKET FOR A FIXED LENGTH SEND DATA " CALL $ALSEC ;ALLOCATE THE PACKET, BCS 90$ ;IF CS NO SPACE - DROP THE MESSAGE MOV R0,KISAR6 ;MAP THE PACKET8 MOV #140002,R0 ;POINT AFTER THE LINK WORD IN THE PACKET2 MOV #13.+2,(R0)+ ;INSERT THE NUMBER OF DATA WORDS9 MOV #^R$$E,(R0)+ ;INSERT THE SENDER "TASK" NAME - $$EXECE MOV #^RXEC,(R0)+ ;...5 MOV #4,(R0)+ ;INSERT THE MESSAGE TYPE (EXEC MESSAGE) + MOV 2(SP),(R0)+ ;GET THE SUBMESSAGE NUMBERV, ADD #<13.-2>*2,R0 ;POINT PAST THE DATA AREA- MOV $COPT,(R0)+ ;TI: FOR THIS "TASK" IS CO0:ED MOV #<200*400>+200,(R0)+ ;THE UIC FOR P/OS SHOULD ALWAYS BE 200,200. MOV $CTBNM,(R0)+ ;INSERT THE TARGET TASK NAME MOV $CTBNM+2,(R0) ;...I5 MOV (SP),R0 ;GET THE ADDRESS OF RECIEVER TASK'S TCB * ADD #T.RCVL,R0 ;POINT TO THE RECIEVE LIST) MOV KISAR6,R1 ;GET ADDRESS OF THE PACKETE0 CALL $QSPIF ;INSERT PACKET IN THE RECIEVE LIST. MOV #AS.RCA,R4 ;GET CODE FOR RECIEVE DATA AST3 MOV (SP)+,R5 ;RETRIEVE RECIEVER TASK'S TCB ADDRESS;2 TST (SP)+ ;DON'T NEED THE MESSAGE NUMBER ANYMORE+ MOV (SP)+,KISAR6 ;RESTORE THE APR6 MAPPING)" CALL $DASTT ;DECLARE RECIEVE AST+ CALLR $DRDSE ;DECLARE A SIGNIFICANT EVENTT 90$: TST (SP)+ ;CLEAN THE STACK 95$: TST (SP)+ ;CLEAN THE STACK0100$: MOV (SP)+,KISAR6 ;RESTORE THE APR6 MAPPING RETURN ;ALL DONEM .ENDC ;R$$PRO .DSABL LSBC;+-; **-$GTPKT-GET I/O PACKET FROM REQUEST QUEUET7; **-$GSPKT-GET SELECTIVE I/O PACKET FROM REQUEST QUEUEP;RM; THIS ROUTINE IS CALLED BY DEVICE DRIVERS TO DEQUEUE THE NEXT I/O REQUEST TOUK; PROCESS. IF THE DEVICE CONTROLLER IS BUSY, THEN A CARRY SET INDICATION ISCM; RETURNED TO THE CALLER. ELSE AN ATTEMPT IS MADE TO DEQUEUE THE NEXT REQUEST H; FROM THE CONTROLLER QUEUE. IF NO REQUEST CAN BE DEQUEUED, THEN A CARRYO; SET INDICATION IS RETURNED TO THE CALLER. ELSE THE CONTROLLER IS SET BUSY ANDS5; A CARRY CLEAR INDICATION IS RETURNED TO THE CALLER.T; ?; IF QUEUE OPTIMIZATION IS SUPPORTED AND ENABLED FOR THE DEVICES>; THE APROPRIATE PACKET FOR THE CURRENT OPTIMIZATION ALGORITHMA; IS RETURNED. THREE ALGORITHMS ARE SUPPORTED: NEAREST CYLINDER, ;; ELEVATOR, AND C-SCAN. ALL THREE ALGORITHMS INCORPORATE A A; FAIRNESS COUNT. IF THE FIRST PACKET ON THE LIST IS PASSED OVERI3; MORE THAN "FCOUNT" TIMES, IT IS DONE IMMEDIATELY.I;I;IG; THE ALTERNATE ENTRY POINT $GSPKT IS INTENDED FOR USE BY DRIVERS WHICH F; SUPPORT PARALLEL OPERATIONS ON A SINGLE UNIT, A COMMON EXAMPLE BEINGE; FULL DUPLEX. SUCH DRIVERS ARE EXPECTED TO LOOK TO THE SYSTEM AS IF D; THEY ARE ALWAYS FREE, WHILE MAINTAINING THE STATUS OF ALL PARALLEL@; OPERATIONS INTERNALLY WITHIN THEIR OWN DEVICE DATA STRUCTURES.G; PARALLELISM IS ACCOMPLISHED BY HANDLING DRIVER-DEFINED CLASSES OF I/OHH; FUNCTION CODES IN PARALLEL WITH EACH OTHER. FOR EXAMPLE A FULL-DUPLEXF; DRIVER WOULD HANDLE INPUT REQUESTS IN PARALLEL WITH OUTPUT REQUESTS.C; A DRIVER CALLS $GSPKT WHEN IT WANTS TO DEQUEUE A PACKET WHOSE I/ONG; FUNCTION CODE BELONGS TO A CERTAIN CLASS. WHICH FUNCTIONS QUALIFY ISSD; DETERMINED BY AN ACCEPTANCE ROUTINE IN THE DRIVER WHOSE ADDRESS ISE; PASSED TO $GSPKT IN R2. THE ACCEPTANCE ROUTINE IS CALLED BY $GSPKTCB; EACH TIME A PACKET IS FOUND IN THE QUEUE WHICH IS ELIGIBLE TO BEG; DEQUEUED. THE ACCEPTANCE ROUTINE IS THEN EXPECTED TO TAKE ONE OF THEA; FOLLOWING THREE ACTIONS:;N8; 1. RETURN WITH CARRY CLEAR IF THE PACKET SHOULD BE4; DEQUEUED. IN THIS CASE $GSPKT PROCEEDS AS $GTPKT+; NORMALLY WOULD ON DEQUEUEING THE PACKET.A;C:; 2. RETURN WITH CARRY SET IF THE PACKET SHOULD NOT BE8; DEQUEUED. IN THIS CASE $GSPKT WILL CONTINUE THE SCAN; O00~~ibjbkb a a aF THE I/O QUEUE.;A?; 3. ADD THE CONSTANT G$$SPSA TO THE STACK POINTER TO ABORTN#; THE SCAN WITH NO FURTHER ACTION. ;UE; THE ACCEPTANCE ROUTINE MUST SAVE AND RESTORE ANY REGISTERS WHICH ITO?; INTENDS TO MODIFY. WHEN A PACKET IS DEQUEUED VIA $GSPKT, THEH/; FOLLOWING NORMAL $GTPKT ACTIONS DO NOT OCCUR:S; >; 1. FILLING IN OF U.BUF, U.BUF+2 AND U.CNT. THESE FIELDS); ARE AVAILABLE FOR DRIVER-SPECIFIC USE. ;K ; 2. BUSYING OF UCB AND SCB.;I?; 3. EXECUTION OF $CFORK TO GET TO PROPER PROCESSOR (MULTI- ; PROCESSOR SYSTEMS).;S:; NOTE: $GSPKT MAY NOT BE USED BY A DRIVER WHICH SUPPORTS; QUEUE OPTIMIZATION.;E;N ; INPUTS:M; @; 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:;O:; C=1 IF CONTROLLER IS BUSY OR NO REQUEST CAN BE DEQUEUED.-; C=0 IF A REQUEST WAS SUCCESSFULLY DEQUEUED.C ; R1=ADDRESS OF THE I/O PACKET.; R2=PHYSICAL UNIT NUMBER.E; R3=CONTROLLER INDEX. *; R4=ADDRESS OF THE STATUS CONTROL BLOCK.(; R5=ADDRESS OF THE UNIT CONTROL BLOCK.; 0; NOTE: R4 AND R5 ARE DESTROYED BY THIS ROUTINE.;-;9; DEFINE ADDRESS IN THE UCB EXTENSION AS MAPPED THRU APR6 ; IOC=X.IOC+140000 ;I/O COUNT+WCNT=X.WCNT+140000 ;WORDS TRANSFERED COUNTO,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 LIMITS+DSKD=X.DSKD+140000 ;DISK DIRECTION (1=OUT);; *********************************************************E ; * * +; * > > > W A R N I N G < < < *Y ; * *.9; * THE FOLLOWING ARE OFFSET DEFINITIONS WHICH ARE * 9; * SUPPLIED EITHER BY DEFINITION IN THE EXEC (IOSUB) *+9; * OR THE DUMMY STB FILE (FROM SFVC2). ANY CHANGE TO *N9; * THESE DEFINITIONS MUST BE MADE IN BOTH MODULES. * ; * *4;; ********************************************************* ;N0TEMP=26 ;AMOUNT OF TEMPORARY STORAGE REQUIRED5G$$SPA==TEMP+6 ;CONSTANT TO ADD TO SP TO ABORT SCAN* .ENABL LSB ($GTPKT::MOV #128$,R2 ;ACCEPT ALL PACKETS9$GSPKT::MOV R2,$TEMP2 ;SAVE ADDRESS OF ACCEPTANCE ROUTINET05$: 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?N# BNE 20$ ;IF NE CONTROLLER IS BUSYA/ 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 PACKETR BCS 20$ ;NO MORE PACKETS CALL ACPCHK ;ACP FUNCTION? BCC 25$ ;IF CC NOB CALL DEQUE ;REMOVE THE PACKETE;+; ** W A R N I N G ** ;$; SPM HOOKPOINT NUMBER 22.;C); DO NOT CHANGE THE INSTRUCTION FOLLOWING ; LABEL WITHOUT CHECKING SPM;-+$SPH22==. ;SPM CHANGES THE INSTRUCTION ATT ;THE LOCATION OF THIS LABELB) MOV U.ACP(R5),R0 ;GET ADDRESS OF ACP TCB2+ CALL $EXRQP ;INSURE FILE SYSTEM IS ACTIVER BR 10$ ;GO AGAIN20$: JMP 95$ ;EXIT:25$:;NJ; IN REMOTE SYSTEMS, THE GENERIC DRIVER WILL HANDLE THE ATTACH AND DETATCH!; REQUESTS FOR THE REMOTE DEVICESC; $ .IF DF C$$RMT ;REMOTE HOST SUPPORT1 BIT #HF.RMT,$HFMSK ;REOMTE HOST SUPPROT ENABLED? BEQ 27$ ;IF EQ NON" MOV I.UCB(R1),R2 ;GET UCB ADDRESS: CMP (R2),$XXLOW ;IS THE DCB ADDRESS IN THE GENERIC RANGE? BLO 27$ ;IF LO NO  CMP (R2),$XXHGH ;IS IT? BLOS 60$ ;IF LO OR SAME, YES 27$:  .ENDC ; C$$RMTI;S; PROCESS ATTACH/DETACH;;A+ MOVB I.FCN+1(R1),R2 ;GET I/O FUNCTION CODER' CMPB #IO.ATT/256.,R2 ;ATTACH FUNCTION?N BNE 45$ ;IF NE NOT CALL DEQUE ;REMOVE THE PACKETE/ MOV #IE.PRI&377,R0 ;ASSUME PRIVILEGE VIOLATION! TST U.CW1(R5) ;MOUNTABLE DEVICE?S BPL 30$ ;IF PL NOQ7 BITB #US.MNT!US.FOR,U.STS(R5) ;NOT MOUNTED OR FOREIGN? BEQ 55$ ;IF EQ NOT/30$: MOV I.TCB(R1),R0 ;ASSUME SUCCESSFUL ATTACHI& TST U.ATT(R5) ;UNIT ALREADY ATTACHED? BEQ 35$ ;IF EQ NO,: MOV #IE.DAA&377,R0 ;SET STATUS OF DEVICE ALREADY ATTACHED BR 55$ ;935$: BITB #IQ.UMD,I.FCN(R1) ;IS THIS A DIAGNOSTIC ATTACH?5 BEQ 50$ ;IF EQ N00~~t__DATADATADATADATAON8 BIT #DV.UMD,U.CW1(R5) ;USER MODE DIAGNOSTICS SUPPORTED? BEQ 40$ ;IF EQ NO 3 BISB #US.UMD,U.ST2(R5) ;INDICATE DIAGNOSTIC ATTACHL BR 50$ ;740$: MOV #IE.IFC&377,R0 ;SET STATUS OF ILLEGAL FUNCTION BR 55$ ;*45$: CMPB #IO.DET/256.,R2 ;DETACH FUNCTION BNE 60$ ;IF NE NOC CALL DEQUE ;REMOVE THE PACKETN. MOV #IE.DNA&377,R0 ;ASSUME DEVICE NOT ATTCHED TST R3 ;UNIT ATTACHED? BEQ 55$ ;IF EQ NOT CLR R0 ;SET TO DETACH UNIT- BICB #US.UMD,U.ST2(R5) ;RESET DIAGNOSTIC BIT5)50$: MOV R0,U.ATT(R5) ;ATTACH/DETACH UNITR= BITB #UC.ATT,U.CTL(R5) ;DOES DRIVER WANT CONTROL ON ATT/DET?S BNE 56$ ;IF NE YES5 MOV #IS.SUC&377,R0 ;SET SUCCESSFUL COMPLETION STATUSC/55$: ADD #TEMP,SP ;CLEANUP THE STACK FOR $IOALT % CLR R1 ;ZERO SECOND I/O STATUS WORDU6 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# CALL $IOAL2 ;FINISH I/O OPERATIONO 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/DISMOUNTS ASSUME US.SIO,200, TSTB U.ST2(R5) ;STALLED I/O FOR THIS UNIT ?' BMI 111$ ;IF MI, YES. NO OPT OR STATS  .ENDC ; DF R$$AMD( MOV KISAR6,$TONYL ;SAVE DATA SPACE APR6* MOV U.UCBX(R5),KISAR6 ;MAP UCB EXTENSION4 BEQ 110$ ;IF EQ, NO UCB EXT, CAN'T DO OPT OR STATS4 BITB #S3.OPT,S.ST3(R4) ;SEEK OPTIMIZATION ENABLED?# BEQ 105$ ;IF EQ NO, DO STATS ONLYB;#5; INITIALIZATION FOR THE QUEUE OPTIMIZATION SCAN LOOPQ;1$ TST (R1) ;IS THIS THE ONLY PACKET?! BEQ 104$ ;IF EQ YES - DO IT NOWD) INCB FCUR ;INCREMENT THE FAIRNESS COUNT(! MOVB FLIM,R2 ;GET THE MAX COUNTB' BICB #200,R2 ;CLEAR THE DIRECTION BIT' CMPB R2,FCUR ;FAIRNESS COUNT EXPIRED?;! BLO 104$ ;IF LO YES - DO IT NOW5;A<; TWO IS SUBTRACTED FROM THE OFFSETS BELOW BECAUSE THE STACK8; DOES NOT HAVE THE QUEUE SCAN LOOP RETURN ADDRESS ON IT;N$ ASSUME OUTEX-2 ;ASSUME OUTEX-2 = 0.75$: CLR (SP) ;CLEAR THE EXISTANCE INDICATORS2 MOV R1,LOWPK-2(SP) ;INIT ADDRESS OF LOWEST PACKET2 MOV R0,LOWPR-2(SP) ;INIT ADDRESS OF LOWEST PACKET4 MOV I.PRM+10(R1),LOW-2(SP) ;INIT LOWEST CYLINDER #) MOVB I.PRI(R1),PRI-2(SP) ;INIT PRIORITYH;E; QUEUE OPTIMIZATION SCAN LOOP;S,80$: CALL QOPUPD ;UPDATE THE QUEUE OPT INFO% BCS 105$ ;IF CS DO THIS PACKET NOW!T085$: CALL SCAN ;SCAN FOR THE NEXT USABLE PACKET# BCS 100$ ;IF CS THERE ARE NO MOREO* CMPB I.PRI(R1),PRI-2(SP) ;SAME PRIORITY?' BNE 100$ ;IF NE NO - GO PICK A PACKETN,90$: CMPB #IO.ATT/256.,I.FCN+1(R1) ;ATTACH? BEQ 85$ ;IF EQ YES - GO ON( CMPB #IO.DET/256.,I.FCN+1(R1) ;DETACH? BEQ 85$ ;IF EQ YES - GO ON8 BITB #IQ.UMD,I.FCN(R1) ;IS THIS A DIAGNOSTIC FUNCTION? BNE 85$ ;IF NE YES - GO ON BR 80$ ;CONSIDER THIS ONEO/95$: ADD #TEMP,SP ;RETURN THE TEMPORARY STORAGE  SEC ;SET CARRY FOR NO PACKETC JMP 130$ ;AND EXIT+100$: CALL FNDOPT ;FIND THE OPTIMAL PACKETO( CMP R1,(R4) ;IS THIS THE FIRST PACKET? BNE 105$ ;IF NE NO - GO ON*104$: CLRB FCUR ;CLEAR THE FAIRNESS COUNT(105$: ADD #1,IOC ;UPDATE UNIT I/O COUNT$ ADC IOC+2 ;AND THE HIGH ORDER WORD; CMPB #IO.RLB/256.,I.FCN+1(R1) ;LOGICAL TRANSFER FUNCTION?. BLO 110$ ;IF LO NO' MOV I.PRM+4(R1),R3 ;GET THE BYTE COUNT-;+=; Note: The following instruction counts on the fact that theH8; compare immediately preceding this comment will branch; if the result is CS.;-2 ROR R3 ; MAKE IT WORDS, AND DON'T PROPOGATE SIGN. ADD R3,WCNT ;UPDATE TOTAL WORDS XFERED COUNT% ADC WCNT+2 ;AND THE HIGH ORDER WORDR- BIT #S2.OPT,S.ST2(R4) ;QUEUE OPT SUPPORTED?C BEQ 110$ ;IF EQ NO* MOV CCYL,R3 ;GET THE OLD CYLINDER NUMBER0 MOV I.PRM+10(R1),CCYL ;SET THE NEW CURRENT CYL/ SUB CCYL,R3 ;SUBTRACT CURRENT CYLINDER NUMBERN BPL 108$ ;GET THE ABSOLUTE! NEG R3 ;VALUE OF THE DIFFERENCE (108$: ADD R3,CYLC ;UPDATE THE CYLINDERS ADC CYLC+2 ;THE SECOND WORDr2110$: MOV $TONYL,KISAR6 ;RESTORE DATA APR6 MAPPING3111$: CALL DEQUE ;REMOVE THE PACKET FOR PROCESSING 0120$: ADD #T00~~ibjbkb a a aEMP,SP ;RETURN THE TEMPORARY STORAGE .IF DF S$$HDW7 BIT #DV.MSD,U.CW1(R5) ;IS THIS A MASS STORAGE DEVICE?Y BEQ 125$ ;IF EQ NO/ MOV R1,R3 ;COPY I/O PACKET ADDRESS FOR $SHFNDW/ CALL $SHFN1 ;SEE IF THIS UNIT IS SHADOWED NOWI BCS 124$ ;IF CS NO/ CMP ML.PRI(R4),R1 ;IS THIS THE PRIMARY PACKET?E" BNE 124$ ;IF NE NO -- DON'T COPY+ MOV R1,-(SP) ;SAVE R1 (I/O PACKET ADDRESS)- CMPB #IO.WLB/400,I.FCN+1(R2) ;IS IT A WRITE?I* BNE 123$ ;IF NE NO -- DON'T QUEUE IT NOW MOV R5,-(SP) ;SAVE UCB ADDRESSP- MOV U.SCB(R5),R4 ;GET SCB ADDRESS OF PRIMARYH MOV R2,R1 ;COPY PKT ADDRESSI4 MOV I.UCB(R1),R5 ;GET UCB ADDRESS OF SECONDARY DISK) CLR -(SP) ;ASSUME PRIMARY AND SECONDARYH ;HAVE SEPARATE SCBSI7 CMP U.SCB(R5),R4 ;PRIMARY AND SECONDARY HAVE SAME SCB?M BNE 121$ ;IF NE NO, OK CMP $TEMP2,#128$ ;$GSPKT CALL?N' BNE 121$ ;IF NE YES, OK WITH SAME SCB1+ MOV R4,(SP) ;REMEMBER WE HAD TO INC S.STSC# INCB S.STS(R4) ;SHOW THIS SCB BUSY;2121$: 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 BACK2122$: MOV (SP)+,R5 ;RESTORE UCB ADDRESS OF PRIMARY3123$: MOV (SP)+,R1 ;RESTORE R1 (I/O PACKET ADDRESS)H+124$: MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESSY5 MOV R1,S.PKT(R4) ;RE-SET I/O PACKET ADDRESS INTO SCBK125$: ;REF LABEL$ .ENDC CMP $TEMP2,#128$ ;$GSPKT CALL?M* BNE 127$ ;IF NE YES, SKIP TO DRIVER CALL7 MOV I.PRM(R1),U.BUF(R5) ;INSERT RELOCATION BIAS IN UCBL: MOV I.PRM+2(R1),U.BUF+2(R5) ;INSERT BUFFER ADDRESS IN UCB4 MOV I.PRM+4(R1),U.CNT(R5) ;INSERT BYTE COUNT IN UCB% INCB S.STS(R4) ;SHOW CONTROLLER BUSY;' BISB #US.BSY,U.STS(R5) ;SHOW UNIT BUSY " 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; G; CONTROLLER SUPPORTS PARALLEL OPERATION, AND REQUIRES SYNCHRONIZATION. C; THIS TYPE OF CONTROLLER USUALLY HAS THE INTERRUPT ENABLED, AND ISLE; CAPABLE OF SUSTAINING AN INTERRUPT WHILE INITIATING A NEW FUNCTION.S?; THE INTERRUPT MAY BE FROM SOME EXTERNAL EVENT, SUCH AS A DISKIF; BECOMMING READY. IF LEFT ALONE, THE DRIVER WOULD AUTOMATICALLY FORKF; FOR EVERY INTERRUPT, WHICH WOULD NOT DO SINCE THE FORK BLOCK IS USEDB; TO HOLD THE DRIVER CONTEXT FOR A NUMBER OF CONDITIONS DURING I/OD; INITIATION. THE PC WORD OF THE FORK BLOCK IS USED AS AN INTERLOCKE; TO SHOW IF A FORK IS ALLOWED, WHERE S.FRK+2 IS ZERO IF AN INTERRUPTRA; IS ALLOWED. IT IS THE DRIVERS RESPONSIBILITY TO CLR S.FRK+2 TOIB; ALLOW INTERRUPTS ONCE THEY ARE EXPECTED. THE ONLY OTHER PROBLEME; OCCURS WHEN A DRIVER HAS QUEUED A FORK WHILE THE EXEC AND/OR DRIVEROA; WERE ON THEIR WAY TO THIS POINT, AND WHEN $GTPKT ARRIVES HERE AIC; FORK BLOCK IS CURRENTLY IN THE FORK QUEUE. THE SOLUTION FOR THIS G; IS TO SIMPLY DEQUEUE THE FORK BLOCK AND THEREBY DROP THE INTERRUPT ON ); THE FLOOR. WE WILL PROCEED TO DO THIS.S;L MTPS #PR7 ;INHIBIT DEADLOCK  LOCK$ $FORKL,SPIN* INC S.FRK+2(R4) ;;;SHOW FORK BLOCK IN USE2 MOV #$FRKHD,R0 ;;;PREPARE TO REMOVE IT FROM QUEUE$ TST (R0) ;;;IS IT POSSIBLY THERE ? BEQ 1251$ ;;;IF EQ NOE MOV R4,R1 ;;;COPY SCB ADDRESSI% ADD #S.FRK,R1 ;;;POINT TO FORK BLOCK,) CALL $QRMVA ;;;REMOVE IT FROM THE QUEUEO1251$: ;REFERENCE LABEL ULOCK$ $FORKL,SPINF MTPS #0 .IF DF M$$PRO BR 127$ ;REENTER FLOWB .ENDC126$: ;REFERENCE LABELE .IF DF M$$PRO" MOV (SP)+,R4 ;SAVE RETURN ADDRESS+ CALL $CFORK ;EXECUTE ON CORRECT PROCESSOR;% MOV R4,-(SP) ;REPLACE RETURN ADDRESSR' MOV U.SCB(R5),R4 ;RETRIEVE SCB ADDRESST .ENDC127$: ;REFERENCE LABEL5. MOV S.PKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESS- MOVB U.UNIT(R5),R2 ;SET PHYSICAL UNIT NUMBERL;+; ** W A R N I N G **H;U; SPM HOOKPOINT NUMBER 17.;L); DO NOT CHANGE THE INSTRUCTION FOLLOWINGD; LABEL WITHOUT CHECKING SPM;-+$SPH17==. ;SPM CHANGES THE INSTRUCTION AT ;THE LOCATION OF THIS LABEL " MOV S.KRB(R4),R3 ;GET KRB ADDRESS BEQ 128$ ;IF EQ NO KRB( MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX-128$: CLC 00~~t__DATADATADATADATA;SHOW VALID I/O PACKET FOR RETURNN130$: ;REFERENCE LABEL ;+; ** W A R N I N G **T;V4; SPM HOOKPOINT NUMBER - THE FOLLOWING RETURN IS THE/; NULL CALL FOR HOOKING SEVERAL EXTERNAL TASKS.;P); DO NOT CHANGE THE INSTRUCTION FOLLOWING ; LABEL WITHOUT CHECKING SPM;-)$SPVEX==. ;SPM EXPECTS THIS INSTRUCTIONM ;TO BE RETURNC RETURN .DSABL LSBO;T5; QOPUPD -- UPDATE THE QUEUE OPTIMIZATION INFORMATIONQ;8>; THIS ROUTINE UPDATES THE QUEUE OPTIMIZATION SCAN INFORMATIOND; FOR THE CURRENT PACKET. THIS INFORMATION IS USED LATER BY FNDOPT.;; INPUT:;R&; R1=ADDRESS OF THE CURRENT I/O PACKET; R5=ADDRESS OF THE UCBS;E ; OUTPUTS:;O#; C=0 IF THE SCAN SHOULD CONTINUE.P$; THE OPTIMIZATION DATA IS UPDATED.3; THIS DATA IS ON THE STACK IN THE FOLLOWING FORM. ;S1; +--------------------------------------------+*; 30(SP) ! DRIVER RETURN ADDRESS !1; !--------------------------------------------!S&; 26(SP) ! CURRENT PRIORITY !1; !--------------------------------------------!N%; 24(SP) ! LOWEST CYLINDER !1; !--------------------------------------------!T0; 22(SP) ! ADDRESS OF THE ABOVE PACKET !1; !--------------------------------------------!T8; 20(SP) ! ADDRESS OF THE PREVIOUS PACKET FOR ABOVE !1; !--------------------------------------------!-8; 16(SP) ! NEAREST CYLINDER IN THE INWARD DIRECTION !1; !--------------------------------------------!-0; 14(SP) ! ADDRESS OF THE ABOVE PACKET !1; !--------------------------------------------! 8; 12(SP) ! ADDRESS OF THE PREVIOUS PACKET FOR ABOVE !1; !--------------------------------------------!S8; 10(SP) ! NEAREST CYLINDER IN THE OUTWARD DIRECTION !1; !--------------------------------------------! /; 6(SP) ! ADDRESS OF THE ABOVE PACKET !-1; !--------------------------------------------!T7; 4(SP) ! ADDRESS OF THE PREVIOUS PACKET FOR ABOVE !-1; !--------------------+-----------------------!S7; 3(SP) ! INWARD EXISTANCE ! OUTWARD EXISTANCE !-7; 2(SP) ! FLAG (HIGH BIT=1) ! FLAG (HIGH BIT=1) !O8; !--------------------+-----------------------!3; 0(SP) ! OPTIMIZATION LOOP RETURN ADDRESS !E1; +--------------------------------------------+-;-; ALL REGISTERS ARE PRESERVED.R; ;T+; C=1 IF THE CURRENT PACKET SHOULD BE USED-$; R1=ADDRESS OF THE CURRENT PACKET%; R0-ADDRESS OF THE PREVIOUS PACKETR;O;--; NOTE: THESE OFFSETS ARE ALSO USED BY FNDOPT-;S6PKT=I.PRM+10 ;OFFSET (R1) FOR CYLINDER FOR THIS PACKET-PRI=26 ;OFFSET (SP) FOR THE CURRENT PRIORITY /LOW=24 ;OFFSET (SP) FOR LOWEST CYLINDER NUMBER-/LOWPK=22 ;OFFSET (SP) FOR PACKET ADDRESS OF LOWO9LOWPR=20 ;OFFSET (SP) FOR PREVIOUS PACKET ADDRESS FOR LOW-7OUT=10 ;OFFSET (SP) FOR NEAREST CYL IN THE OUTWARD DIR /OUTPK=6 ;OFFSET (SP) FOR PACKET ADDRESS OF OUT-9OUTPR=4 ;OFFSET (SP) FOR PREVIOUS PACKET ADDRESS FOR OUTH5IN=16 ;OFFSET (SP) FOR NEAREST CYL IN THE INWARD DIR .INPK=14 ;OFFSET (SP) FOR PACKET ADDRESS OF IN8INPR=12 ;OFFSET (SP) FOR PREVIOUS PACKET ADDRESS FOR IN5OUTEX=2 ;OFFSET (SP) FOR OUTWARD EXISTANCE INDICATOR 3INEX=3 ;OFFSET (SP) FOR INWARD EXISTANCE INDICATORD.QOPUPD: CMP PKT(R1),CCYL ;ON CURRENT CYLINDER? BNE 10$ ;IF NE NO-' SEC ;EXIT WITH CARRY SET (DO IT NOW) BR 70$ ;510$: CMP PKT(R1),LOW(SP) ;IS THIS THE CURRENT LOWEST?U BHIS 20$ ;IF GE NO9 MOV PKT(R1),LOW(SP) ;SET THE NEW LOWEST CYLINDER NUMBER, & MOV R1,LOWPK(SP) ;ITS PACKET ADDRESS,2 MOV R0,LOWPR(SP) ;AND THE PREVIOUS PACKET ADDRESS>20$: CMP PKT(R1),CCYL ;THIS PACKET LESS THAN CURRENT LOCATION? BLOS 40$ ;IF LE YES + TSTB OUTEX(SP) ;HAVE WE SETUP OUTWARD YET?S BPL 30$ ;IF PL NOO6 CMP PKT(R1),OUT(SP) ;THIS PACKET NEAREST OUTWARD ONE? BHIS 60$ ;IF GE NO:30$: MOV PKT(R1),OUT(SP) ;SET THE NEW NEAREST OUTWARD CYL,& MOV R1,OUTPK(SP) ;ITS PACKET ADDRESS,2 MOV R0,OUTPR(SP) ;AND THE PREVIOUS PACKET ADDRESS! BISB #200,OUTEX(SP) ;AND NOTE ITV BR 60$ ;EXIT-40$: TSTB INEX(SP) ;HAVE WE SETUP INWARD YET?E BPL 50$ ;IF PL NO4 CMP P00~~ibjbkb a a aKT(R1),IN(SP) ;THIS PACKET NEAREST INWARD ONE? BLOS 60$ ;IF LE NO850$: MOV PKT(R1),IN(SP) ;SET THE NEW NEAREST INWARD CYL,% MOV R1,INPK(SP) ;ITS PACKET ADDRESS,O1 MOV R0,INPR(SP) ;AND THE PREVIOUS PACKET ADDRESS BISB #200,INEX(SP) ;AND NOTE IT'60$: CLC ;SET FLAG FOR CONTINUED SCANR70$: RETURN ;P; =; FNDOPT -- FIND THE OPTIMAL PACKET FOR THE CURRENT ALGORITHMB; ?; THIS ROUTINE PICKS THE OPTIMAL PACKET USING THE DATA PRODUCED)A; BY QOPUPD. IT SUPPORTS NEAREST CYLINDER, ELEVATOR, AND C-SCAN.(; A; NOTE: THE OFFSETS AND THE STACK STRUCTURE ARE DEFINED IN QOPUPDT;) ; INPUTS:T;E; THE DATA PRODUCED BY QOPUPD.; R4=SCB ADDRESS; R5=UCB ADDRESS; CCYL=CURRENT CYLINDER NUMBER-; DSKD=HIGH BIT OF BYTE SET IF MOVING OUTWARD ;0; THE OPTIMIZATION ALGORITHM ENCODED AS FOLLOWS:;R$; S2.OP2,S2.OP1=0,0 NEAREST CYLINDER; =0,1 ELEVATORR; =1,0 C-SCAN ; =1,1 RESERVEDO;M;P ; OUTPUT: ; "; R1=ADDRESS OF THE OPTIMAL PACKET(; THE CURRENT CYLINDER NUMBER IS UPDATED'; THE DIRECTION IS UPDATED IF NECESSARYC;T;T3FNDOPT: BIT #S2.OP2,S.ST2(R4) ;C-SCAN OR RESERVED?A BEQ 20$ ;IF EQ NO." BIT #S2.OP1,S.ST2(R4) ;RESERVED? BEQ 10$ ;IF EQ NON9 BGCK$A BF.OPT,BE.IDC,FATAL ;OPTIMIZATION - RESERVED CODE;; C-SCAN;A*10$: TSTB OUTEX(SP) ;OUTWARD PACKET EXIST? BMI 50$ ;IF MI YES - RETURN IT0 MOV LOWPK(SP),R1 ;ELSE RETURN THE LOWEST PACKET3 MOV LOWPR(SP),R0 ;AND THE PREVIOUS PACKETS ADDRESSE BR 70$ ;EXIT&20$: BIT #S2.OP1,S.ST2(R4) ;ELEVATOR? BEQ 40$ ;IF EQ NOT; ; ELEVATOR;E 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 INX& BR 60$ ;AND RETURN THE INWARD PACKET;V; NEAREST CYLINDER;U(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 INWARD & MOV CCYL,R1 ;GET THE CURRENT CYLINDER. SUB R1,OUT(SP) ;CALCULATE DISTANCE TO OUTWARD, SUB IN(SP),R1 ;CALCULATE DISTANCE TO INWARD CMP R1,OUT(SP) ;INWARD CLOSER?G BLO 60$ ;IF LT YES050$: MOV OUTPK(SP),R1 ;RETURN THE OUTWARD PACKET3 MOV OUTPR(SP),R0 ;AND THE PREVIOUS PACKETS ADDRESS  BR 70$ ;EXIT.60$: MOV INPK(SP),R1 ;RETURN THE INWARD PACKET2 MOV INPR(SP),R0 ;AND THE PREVIOUS PACKETS ADDRESS70$: ;REF LABEL RETURN ;(;O2; SCAN -- SCAN THE DRIVER QUEUE FOR USABLE PACKETS;R0; THIS ROUTINE IS CALLED TO SCAN A DRIVER QUEUE.-; EACH USABLE ENTRY IN THE QUEUE IS RETURNED.B;( ; INPUTS:C;T,; R4=SCB ADDRESS FOR THE QUEUE TO BE SCANNED;S ; OUTPUTS:; 6; C=1 IF THERE ARE NO MORE USABLE ENTRIES IN THE QUEUE0; C=0 IF THE NEXT USABLE ENTRY IS BEING RETURNED$; R0=ADDRESS OF THE PREVIOUS PACKET#; R1=ADDRESS OF THE CURRENT PACKETM(; R5=UCB ADDRESS FOR THE CURRENT PACKET;E1; NOTE: R0 AND R1 MUST BE PRESERVED BETWEEN CALLSN; TO THIS ROUTINE.;USCAN:B010$: MOV R1,R0 ;SAVE ADDRESS OF PREVIOUS PACKET) MOV (R0),R1 ;GET ADDRESS OF NEXT PACKETE( BEQ 50$ ;IF EQ NO MORE PACKETS TO SCAN4 MOV I.UCB(R1),R5 ;GET ADDRESS OF UNIT CONTROL BLOCK TSTB U.STS(R5) ;UNIT BUSY?  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, NO6 CMP $VERTK,I.TCB(R1) ;PACKET FROM VERIFICATION TASK ?% BEQ 40$ ;IF EQ, YES. DEQUEUE PACKETD$ BR 10$ ;NO, SEARCH FOR NEXT PACKET .ENDC ; DF R$$AMD 15$: ;! MOV U.ATT(R5),R3 ;UNIT ATTACHED?P BEQ 40$ ;IF EQ NO(/ CMP #IO.LOV,I.FCN(R1) ;LOAD OVERLAY FUNCTION ?I BEQ 17$ ;IF EQ YES7 CMP #IO.LDO,I.FCN(R1) ;HOW ABOUT LOAD D-SPACE OVERLAY?O BNE 20$ ;IF NE NOU&17$: TST U.CW1(R5) ;MOUNTABLE DEVICE ?/ BMI 40$ ;IF MI YES, ALWAYS BREAK THROUGH ATT. 20$: ;REFERENCE LABEL4 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 THROUGHF7 BIT #T3.PRV!T3.CLI,T.ST3(R2) ;TASK 00~~t__DATADATADATADATAPRIVILEGED OR CLI ?A BEQ 30$ ;IF EQ NOH+ CMP R2,$LDRPT ;REQUESTING TASK THE LOADER?N- BEQ 40$ ;IF EQ YES-ALWAYS BREAK THRU ATTACHQ* BIT #DV.TTY,U.CW1(R5) ;DEVICE A TERMINAL? BEQ 30$ ;IF EQ NOB8 CMPB #IO.WLB/256.,I.FCN+1(R1) ;WRITE LOGICAL FUNCTION ?' BNE 30$ ;IF NE NO, DON'T BREAKTHROUGHU- BITB #TF.WBT,I.FCN(R1) ;BREAKTHROUGH WRITE ?R" BNE 40$ ;IF NE YES, BREAKTHROUGH.30$: CMP R2,R3 ;IS THIS THE APPROPRIATE TASK? BNE 10$ ;IF NE NOA240$: CALL @$TEMP2 ;CALL DRIVER ACCEPTANCE ROUTINE$ BCS 10$ ;IF CS PACKET NOT ACCEPTED BR 60$ ;RETURN THE PACKETU+50$: SEC ;INDICATE NO MORE USABLE PACKETSS60$: RETURN ;EXITT;BB; ACPCHK -- THIS ROUTINE DETERMINES IF A PACKET IS AN ACP FUNCTION;I; INPUT:;F; R1=ADDRESS OF THE PACKET; R5=ADDRESS OF THE UCBN;D ; OUTPUT:H;G&; C=1 IF THE PACKET IS AN ACP FUNCTION ; C=0 IF NOT;4(ACPCHK: TST U.CW1(R5) ;DEVICE MOUNTABLE? BPL 40$ ;IF PL NOR8 BITB #IQ.UMD,I.FCN(R1) ;IS THIS A DIAGNOSTIC FUNCTION?1 BNE 40$ ;IF NE YES, IT CAN'T BE AN ACP FUNCTION ; '; DETERMINE IF FUNCTION IS ACP FUNCTION08; APPLICABLE TO ALL MOUNTED DEVICES - NATIVE AND FOREIGN6; FILES 11 - MAPPING OF VIRTUAL TO LOGICAL NOW DONE BY,; DRQIO. ONLY VIRTUAL & ACP FUNCTIONS THAT2; NEED CORRECT SEQUENCING ARE ROUTED THRU DRIVER.;D# TST U.ACP(R5) ;TEST ADDRESS OF ACP ( BEQ 40$ ;NO ACP - PASS IT ON TO DRIVER+ MOVB I.FCN+1(R1),R2 ;GET THE FUNCTION CODE49 BITB #US.FOR,U.STS(R5) ;MOUNTED FOREIGN (ASSUMED MOUNTEDT ;WITH AN ACP FROM ABOVE)3 BNE 10$ ;IF NE YES, CHECK DCB MASKS FOR ACP FUNC.F* CMP #IO.CLN/400,R2 ;IS IT AN ACP FUNCTION$ BHI 40$ ;IF HI NO, QUEUE TO DRIVER! BR 30$ ;ELSE IS AN ACP FUNCTIONO"10$: MOV (R5),R3 ;GET DCB ADDRESS" CMP R2,#15. ;NORMALIZE FCTN CODE BLOS 20$ ; SUB #16.,R2 ; ( ADD #10,R3 ;ADJUST PTR TO 2ND MASK SET#20$: ASL R2 ;CONVERT TO WORD INDEXS1 BIT $BTMSK(R2),D.MSK+6(R3) ;IS IT ACP FUNCTION??C BNE 30$ ;IF NE ACP FUNCTION(440$: TST (PC)+ ;CLEAR CARRY FOR DRIVER FUNCTION AND$ ;SKIP FOLLOWING INSTRUCTION (MOM% ;WARNED ME NOT TO CODE LIKE THIS)#!30$: SEC ;INDICATE ACP FUNCTIONN RETURN$;I ; DEQUE -- DEQUEUE AN I/O PACKET;L+; THIS ROUTINE DEQUEUES THE CURRENT PACKET.G;D; INPUT:;C#; R0=ADDRESS OF THE PREVIOUS PACKETO%; R1=ADDRESS OF THE PACKET TO DEQUEUE ; R4=SCB ADDRESS;A ; OUTPUT::;L; THE PACKET IS DEQUEUED; R1 IS UNCHANGED,;S2DEQUE: MOV (R1),(R0) ;CLOSE UP LIST REMOVING ENTRY+ BNE 10$ ;IF NE LAST ENTRY WAS NOT REMOVEDI. MOV R0,2(R4) ;SET ADDRESS OF NEW LAST IN LIST810$: MOV R1,S.PKT(R4) ;SET ADDRESS OF CURRENT I/O PACKET RETURN ;AND EXITO;+2; **-$TSTBF-TEST IF I/O BUFFERING CAN BE INITIATED;RD; THIS ROUTINE DETERMINES IF A GIVEN I/O REQUEST IS ELIGIBLE FOR I/OC; BUFFERING, AND IF SO IT STORES THE PCB ADDRESS OF THE REGION INTOS?; WHICH THE TRANSFER IS TO OCCUR IN I.PRM+16 OF THE I/O PACKET. ;H ; INPUTS:;E*; R3=ADDRESS OF I/O PACKET FOR I/O REQUEST;Y ; OUTPUTS:; ; R3 IS PRESERVED.;E(; C=0 IF I/O BUFFERING CAN BE INITIATED.;T,; C=1 IF I/O BUFFERING CAN NOT BE INITIATED.;-,$TSTBF::SEC ;ASSUME TASK CANNOT BE STOPPED .IF DF R$$IIC8 BIT #1,I.IOSB+4(R3) ;INTERNAL I/O COMPLETION SPECIFIED?* BNE 20$ ;IF NE YES, DON'T BUFFER ANY I/O .ENDC ;R$$IIC/ MOV I.TCB(R3),R0 ;GET ADDRESS OF REQUESTOR TCBE" BIT #T2.STP,T.ST2(R0) ;STOP TASK? BNE 20$ ;IF NE NOO6 MOV I.AADA(R3),R0 ;COPY ATTACHMENT DESCRIPTOR ADDRESS+ MOV A.PCB(R0),R1 ;POINT TO PCB OF TRANSFER 6 BIT #PS.CHK!PS.FXD,P.STAT(R1) ;IS PCB CHECKPOINTABLE? BNE 20$ ;IF NE NO 1 MOV R1,I.PRM+16(R3) ;SET PCB ADDRESS OF TRANSFERF$ CLC ;INDICATE TASK MAY BE STOPPED20$: RETURN ;;+"; **-$INIBF-INITIATE I/O BUFFERING; >; THIS ROUTINE INITIATES I/O BUFFERING BY DOING THE FOLLOWING:;I(; 1. DECREMENT THE TASK'S I/O COUNT.;O-; 2. INCREMENT THE TASK'S BUFFERED I/O COUNTE;$4; 3. INITIATE CHECKPOINTING IF A REQUEST IS PENDING;T ; INPUTS:;V+; R3=ADDRESS OF I/O PACKET FOR I/O REQUEST.T;S ; OUTPUTS:;T; R3 IS PRESERVED.;-)$INIBF::MOV R3,-(S00~~ibjbkb a a aP) ;SAVE PACKET ADDRESS60 CALL $DECBF ;DEC PCB I/O COUNTS & UNBLOCK TASK. MOV I.TCB(R3),R0 ;POINT TO ISSUING TASK'S TCB- INCB T.TIO(R0) ;TALLY A BUFFERED I/O REQUESTR5 DECB T.IOC(R0) ;ADJUST OUTSTANDING I/O REQUEST COUNT MOV I.PRM+16(R3),R1 ;GET PCB'= SUB P.REL(R1),I.PRM(R3) ;CONVERT TO RELATIVE RELOCATION BIASE) ADD #T.ST2,R0 ;POINT TO TASK STATUS BITSU8 BIT #T2.AST!T2.WFR,(R0) ;TASK IN AST OR WAITFOR STATE ? BMI 10$ ;IF MI AT AST STATEU% BEQ 10$ ;IF EQ NOT IN WAITFOR STATEI3 BIS #T2.SEF,(R0) ;STOP THE TASK FOR THE EVENT FLAGF10$: ;REFERENCE LABEL+ MOV (SP)+,R3 ;RESTORE PACKET ADDRESS IN R3N RETURN ;;+-; **-$QUEBF-QUEUE BUFFERED I/O FOR COMPLETION ;OG; THIS ROUTINE QUEUES A SPECIAL ENTRY TO A TASK'S AST QUEUE TO COMPLETECF; A BUFFERED I/O REQUEST THE NEXT TIME THE TASK IS SCHEDULED. IT ALSO*; DECREMENTS THE TASK'S BUFFERED I/O COUNT;2D; NOTE: THIS ROUTINE IS EQUIVALENT TO CALLING $IOFIN AND IT DOES NOT; UNBUSY THE DEVICE.; ; INPUTS:A;O; R0=FIRST WORD OF I/O STATUSO; R1=SECOND WORD OF I/O STATUS; R3=ADDRESS OF I/O PACKET;( ; OUTPUTS:;E; NONE;-=$QUEBF::MOV R0,I.PRM+6(R3) ;STORE OFFSPRING I/O RETURN STATUSR MOV R1,I.PRM+10(R3) ;0 MOV I.TCB(R3),R0 ;PICK UP OFFSPRING TCB ADDRESS. MOVB #AK.BUF,A.CBL(R3) ;SET BUFFERED I/O FLAG;+2;**-$REQUE-REQUEUE A REGION LOAD AST TO A TASK ASTD;**-$REQU1-REQUEUE A REGION LOAD AST TO A TASK AST (ALTERNATE ENTRY);LC; THESE ROUTINES ARE USED TO QUEUE A TASK KERNEL AST WHICH HAS BEEN@; USED AS A REGION LOAD AST BACK AS A TASK AST. THE BUFFERED I/O6; COUNT OF THE TASK IS DECREMENTED IF ENTRY AT $REQUE.; ; INPUTS: #; R0=TCB ADDRESS OF ASSOCIATED TASKE#; R3=ADDRESS OF PACKET TO BE QUEUED;V ; OUTPUTS:; NONE.P;-$REQUE::1$REQU1::BIC #TS.CIP!TS.RDN,T.STAT(R0) ;UNBLK TASKL MOV R0,R2 ;COPY TCB ADDRESSR& ADD #T.ASTL,R2 ;POINT TO AST LISTHEAD, MOV (R2),(R3) ;LINK PACKET TO FRONT OF LIST BNE 10$ ; MOV R3,2(R2) ;N10$: MOV R3,(R2) ;A- BIT #T2.SEF,T.ST2(R0) ;TASK IN STOPFOR STATEE BNE 12$ ;IF NE YES0 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;N; THIS ROUTINE IS CALLED BY DEVICE DRIVERS AT THE COMPLETION OF AN I/O REQUESTL; TO DO FINAL PROCESSING. THE UNIT AND CONTROLLER ARE SET IDLE AND $IOFIN IS#; ENTERED TO FINISH THE PROCESSING.;V ; INPUTS:N;0; R0=FIRST I/O STATUS WORD.S; R1=SECOND I/O STATUS WORD.;; R2=STARTING AND FINAL ERROR RETRY COUNTS IF ERROR LOGGING ; DEVICE.C; R5=ADDRESS OF THE UNIT CONTROL BLOCK OF THE UNIT BEING COMPLETED.-); (SP)=RETURN ADDRESS TO DRIVER'S CALLER. ;EC; NOTE: IF ENTRY IS AT $IOALT, THEN R1 IS CLEAR TO SIGNIFY THAT THED; SECOND STATUS WORD IS ZERO.;NH; IF ENTRY IS AT $IODSA, UMR DEALLOCATION, DEVICE BUSY STATUS, AND'; ERROR LOGGING FINISH CODE IS SKIPPEDS ; OUTPUTS:;G'; THE UNIT AND CONTROLLER ARE SET IDLE.A; '; R3=ADDRESS OF THE CURRENT I/O PACKET.2;- .ENABL LSBA,$IOALT::CLR R1 ;ZERO SECOND I/O STATUS WORD$IODON::;+; ** W A R N I N G **B;K; SPM HOOKPOINT NUMBER 18.;); DO NOT CHANGE THE INSTRUCTION FOLLOWING; LABEL WITHOUT CHECKING SPM;-+$SPH18==. ;SPM CHANGES THE INSTRUCTION ATN ;THE LOCATION OF THIS LABEL 6 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$$DVC1 BIT #S2.EIP,S.ST2(R4) ;IS AN ERROR IN PROGRESS?N BEQ 15$ ;IF EQ NOL* MOV R1,-(SP) ;SAVE SECOND I/O STATUS WORD+ CALL $FNERL ;FINISH ERROR LOGGING PROCESSO& MOV (SP)+,R1 ;RESTORE I/O STATUS WORD .ENDC ; DF E$$LOG&E$$DVCE15$: ;REFERENCE LABEL .IF DF U$$UMR, BIT #FE.EXT,$FMASK ;IS THIS A 22-BIT SYSTEM BEQ 20$ ;IF EQ NOU- BITB #UC.NPR,U.CTL(R5) ;IS IT AN NPR DEVICE?K' BEQ 20$ ;IF EQ NO, DOES NOT USE UMR'SU MOV S.KRB(R4),R2 ;POINT TO KRBL- BEQ 20$ ;BLOW OFF ALLOCATING UMRS IF NO KRBED BIT #KS.MBC!KS.EXT!KS.DIP,K.STS(R00~~t__DATADATADATADATA2) ;SHOULD WE NOT DEALLOCATE UMRS?( BNE 20$ ;IF NE YES -- DON'T DEALLOCATE' ADD K.OFF(R2),R2 ;POINT PAST UMR BLOCK, SUB #M.LGTH,R2 ;POINT TO START OF UMR BLOCK! CALL $DEUMR ;DEASSIGN ANY UMR'SR6 MOV #$DQUMR,-(SP) ;PUSH ADDRESS TO CHECK FOR UMR WAIT .ENDC ; DF U$$UMR$IOAL2: ;REFERENCE LABELT520$: MOV S.PKT(R4),R3 ;RETRIEVE ADDRESS OF I/O PACKETI .IF DF,P$$MON) BR 200$ ; SKIP PERFORMANCE MONITOR NOPS .IFTF ; P$$MON $IODSA:: .IFT ; P$$MON;+; ** W A R N I N G **S;R; SPM HOOKPOINT NUMBER 19.;R); DO NOT CHANGE THE INSTRUCTION FOLLOWINGE; LABEL WITHOUT CHECKING SPM;-+$SPH19==. ;SPM CHANGES THE INSTRUCTION ATR ;THE LOCATION OF THIS LABELN' NOP ;UGLY, BUT WE HAVE TO DO THIS AST ;THERE'S NO OTHER WAYN( NOP ;TO BE ASSURED OF EXACTLY 2 WORDS ;TO REPLACE.,200$: ;REFERENCE LABEL TO BYPASS THE NOPS ;EXCEPT FOR $IODSA .ENDC .IF DF E$$LOG&E$$DVC4 BIT #S2.LOG,S.ST2(R4) ;ERROR LOGGING (MASS STORE) ? BEQ 23$ ;IF EQ NOS .IF DF X$$ACC&A$$CNT&XA$IO.0 BIT #1,I.IOSB+4(R3) ; WAS THIS AN INTERNAL IOC?- BNE 23$ ; YUP, WE'LL SEE THE REAL IOC LATERS .ENDC ;DF X$ACC&A$$CNT&XA$IO < TALLY$ B.MIOC,XA$$IO,CPU ;COUNT A MASS STORE I/O COMPLETION23$: .ENDC ; DF E$$LOG&E$$DVC  .IF DF Q$$OPT/ TST (R4) ;ANY OTHER I/O REQUESTS TO INITIATE?$ BEQ 25$ ;IF EQ GO TO $IOFIN $ MOV R3,R4 ;COPY I/O PACKET POINTER4 ADD #I.PRM+14,R4 ;POINT TO LAST WORD FOR FORK BLOCK. MOV R0,(R4) ;STORE I/O STATUS BLOCK CONTENTS MOV R1,-(R4) ;  .IF DF M$$PRO, MOV $CPBIT,-6(R4) ;SET UP OUR URM FOR FORK0 .ENDC5 CALL $FORK0 ;FORK HERE TO ALLOW NEXT I/O INITIATIONA. MOV R4,R0 ;RESTORE I/O STATUS BLOCK CONTENTS MOV R5,R1 ;R3 SUB #I.PRM+10,R3 ;POINT TO BEGINNING OF I/O PACKET .ENDC525$: MOV I.UCB(R3),R5 ;GET UCB ADDRESS OF I/O REQUEST .IF DF S$$HDW, CALL $SHFND ;IS THIS UNIT SHADOW RECORDED? BCC 251$ ;IF CC YESP JMP IOFIN2 ;GO TO $IOFIN8251$: TSTB ML.DNC(R4) ;IS THIS FIRST PACKET THRU SYSTEM?4 BNE 40$ ;IF NE NO -- MUST DECIDE WHAT TO TELL USER; =; THIS I/O PACKET IS THE FIRST ONE TO GO THRU THE SYSTEM. IF ?; IT IS A WRITE PACKET, THEN WE MUST WAIT TO SEE THE OUTCOME OF ; THE SECOND PACKET.;- CMPB #IO.WLB/400,I.FCN+1(R3) ;IS IT A WRITE?E0 BNE 26$ ;IF NE NO -- CHECK FOR OTHER FUNCTIONS< CALLR $SHSAV ;IF EQ YES -- SAVE STS AND WAIT FOR OTHER PKT;26$: CMP #IO.SCF,I.FCN(R3) ;IS THIS A SHADOW COPY FUNCTION?  BEQ 28$ ;IF EQ YES7 CMPB #IO.RLB/400,I.FCN+1(R3) ;IS THIS A READ FUNCTION?4- BNE 271$ ;IF NE NO -- DON'T KNOW WHAT IT IS ;BETTER EXIT NOW;T@; THIS FUNCTION IS AN IO.RLB FUNCTION (READ) AND NO SPECIAL COPY=; SUBFUNCTION WAS SPECIFIED. WE NOW MUST CHECK TO SEE IF THE; READ COMPLETED SUCCESSFULLY.; # CMP R0,#IS.SUC ;WAS IT SUCCESSFUL?- BEQ 271$ ;IF EQ YES -- EXITL;H?; THE FUNCTION IS A READ, AND THE FIRST I/O PACKET FAILED. NOWS=; WE MUST DETERMINE WHETHER WE NEED TO CHECK THE FENCE (WHICHQA; MEANS THAT CATCHUP IS ACTIVE) PRIOR TO TRYING THE OTHER PACKET.E;1D; In addition, if a file structure catchup is active (Shadow update)G; we will not allow the packet to be queued to the secondary on a read.T; F; The ultimate goal during the "UPDATE" function is to insure that allG; writes are shadowed across the volume, and once the file structure isE5; stable, all I/O operations will be shadowed/shared.S;/A; If load sharing is enabled, and the first packet queued was theKA; secondary packet, we can't validate the LBN, but we must go and ;; queue the primary packet, to try and get the best resultst;p9 CMP R3,ML.PRI(R4) ; Was this the primary packet through?t7 BNE 30$ ; Nope, was secondary, go requeue the primarya MOV R5,-(SP) ;SAVE UCB ADDRESSn" MOV U.UMB(R5),R5 ;GET UMB ADDRESS1 BITB #MS.CHP,M.STS(R5) ;IS AN UPDATE IN PROGRESSc SEC ;ASSUME IT IS1 BNE 261$ ;UPDATE IS IN PROGRESS, DON'T READ YETf( CALL $CKLBN ;IS LBN RANGE BELOW FENCE?'261$: MOV (SP)+,R5 ;RESTORE UCB ADDRESS  BCC 30$ ;IF CC YES27$: CALL $SHSAV ;SAVE STAT00~~ibjbkb a a aUS# MOV R3,-(SP) ;PREPARE TO LOG ERRORe MOV R3,-(SP) ;PREPARE SOME MORE' BR 45$ ;GO LOG SHADOW RECORDING ERRORh271$: JMP IOFIN1 ;EXIT )28$: .IF DF S$$HLS ; SHADOW LOAD SHARING, TSTB R0 ; WAS THE I/O SUCCESS? BGT 29$ ; IF GT, YES, CONTINUE4 CMP R3,ML.PRI(R4) ; IS THIS THE PRIMARY I/O PACKET?. BNE 27$ ; IF NE, WE NEED TO REPORT THE ERROR MOV R0,-(SP) ; SAVE R0N' MOV U.UMB(R5),R0 ; GET THE UMB ADDRESSS< BITB #MS.CHP,M.STS(R0) ; IS THIS AN UPDATE/MERGE OPERATION?1 BEQ 288$ ; IF EQ, NOPE, MUST BE START OPERATIONO6 CMP I.PRM+4(R2),#512. ; IS THIS A RECOVERY OPERATION?$ BEQ 283$ ; IF EQ, YES, PROCEED ...'282$: MOV (SP)+,R0 ; RESTORE THE STATUSD BR 27$ ; AND RETURN THE ERROR ;+?; A FORCED ERROR MARK IS THE ONLY *KNOWN* ERROR WHICH WOULD BE)>; SUITABLE FOR ATTEMPTING TO RECOVER DURING A MERGE OPERATION.;-6283$: CMPB (SP),#IE.FER ; IS THIS A FORCED ERROR MARK?6 BNE 282$ ; NOPE, DON'T CLOBBER THE DESTINATION DRIVE;+A; AT THIS STAGE, WE HAVE AN IE.FER ON THE SOURCE DRIVE, AND WHATRD; WOULD HOPE TO BE A VALID BLOCK ON THE SECONDARY DRIVE. WE WILL NOW;; TRY TO MIGRATE THE BLOCK BACK FROM THE SECONDARY PACK ...;;S; INPUT:; R0 - SCRATCH; R2 - OTHER (SECONDARY) IOP; R3 - THIS (PRIMARY) IOP ; R4 - ML NODE; R5 - PRIMARY UCB ADDRESS;-( CLRB ML.DNC(R4) ; RESET THE DONE COUNT. MOV #I.LGTH/2,R0 ; SET UP THE LENGTH TO COPY( MOV R3,R1 ; COPY PRIMARY PACKET TO R1<284$: MOV (R2)+,(R1)+ ; COPY THE PACKET BACK TO THE PRIMARY) SOB R0,284$ ; AND COPY THE WHOLE THINGW5 SUB #I.LGTH,R2 ; RESET THE SECONDARY PACKET ADDRESSR5 MOV R5,I.UCB(R3) ; RESET THE UCB ADDRESS IN PRIMARYT$ TST (SP)+ ; REMOVE THE STACKED R0+ BR 32$ ; AND QUEUE THE IO.SCF TO THE SEC5288$: MOV (SP)+,R0 ; RESTORE R0 (PRIMARY I/O STATUS)Y,29$: .ENDC ;DF,S$$HLS ; SHADOW LOAD SHARING8 MOV #IO.WLB,I.FCN(R2) ;SET WRITE LOGICAL BLOCK FUNCTION; MOVB #251.,I.PRI(R2) ;SET PRIORITY TO THE HIGHEST POSSIBLER;;D; I/O PACKET IS A FAILED READ OR A READ/WRITE COMBINED. WE NOW WILL?; ATTEMPT TO QUEUE THE PACKET TO THE ALTERNATE DRIVE AND SEE IFS4; WE CAN'T GET SOME BETTER RESULTS TO TELL THE USER.;T,30$: CALL $SHSAV ;SAVE STATUS IN I/O PACKET&32$: MOV I.UCB(R2),R5 ;GET UCB ADDRESS$ MOV R2,R1 ;COPY I/O PACKET ADDRESS3 CALLR $DRQRQ ;TRY OTHER I/O PACKET TO OTHER DRIVED;I*; AT THIS POINT, WE HAVE DONE TWO PACKETS.6; WE MUST CONSOLIDATE THE RESULTS TO PASS TO THE USER.;T40$: CALL $SHSAV ;SAVE STATUS( TSTB I.R0(R2) ;ERROR FROM FIRST PACKET? BMI 42$ ;IF MI YES TSTB R0 ;ERROR FROM SECOND?O BMI 42$ ;IF MI YES' JMP IOFIN1 ;SUCCESS FROM BOTH PACKETSS;T4; WE HAVE DETERMINED THAT AT LEAST ONE OF THE STATUS); RETURN CODES SHOWED AN ERROR CONDITION.T;B642$: MOV ML.PRI(R4),R3 ;GET PRIMARY I/O PACKET ADDRESS! MOV R4,R2 ;COPY ML NODE ADDRESS . ADD #ML.PKT,R2 ;R2 = SECONDARY PACKET ADDRESS9 MOV I.R0(R3),ML.PR0(R4) ;SAVE STATUS FROM PRIMARY PACKETU9 MOV I.R1(R3),ML.PR1(R4) ;SAVE STATUS FROM PRIMARY PACKET;+ MOV R3,-(SP) ;SAVE PRIMARY PACKET ON STACKS+ MOV R3,-(SP) ;SAVE PRIMARY PACKET ON STACKI7 CMP #IO.SCF,I.FCN(R3) ;IS THIS A SHADOW COPY FUNCTION? BNE 43$ ;IF NE NOT) TSTB I.R0(R3) ;IS THE PRIMARY STATUS OK?D BMI 45$ ;IF MI NON! BR 44$ ;RETURN SECONDARY STATUS,143$: TSTB I.R0(R3) ;HOW DOES PRIMARY STATUS LOOK?P BPL 45$ ;IF PL OKA644$: MOV R2,(SP) ;RETURN STATUS FROM SECONDARY PACKET;L5; WE HAVE DECIDED WHICH STATUS TO RETURN TO THE USER.3;L%45$: MOV R4,R1 ;COPY ML NODE ADDRESS;' MOV U.UMB(R5),R0 ; GET THE UMB ADDRESST3 BITB #MF.DSE,M.FLG(R0) ; HAS SHE... BEEN DISABLED?C& BNE 46$ ; YUP, DROP THE ERROR PACKET1 MOV $SHERR,R0 ;GET TCB ADDRESS OF THE ERROR TASK) BEQ 46$ ;IF EQ NO ERROR TASK7 CMP $SHPCT,$SHLIM ;DO WE ALREADY HAVE ENOUGH PACKETS ?3, BLT 451$ ;IF LT NO, GO AHEAD WITH THIS ONE6 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 AWAY *451$: INC $SHPCT ;COUNT ONE MORE IN QUEUE2 CLR ML.FID(R400~~t__DATADATADATADATA) ;INITIALIZE FILE ID FOR ERROR TASK1 CLR ML.FSEQ(R4) ;INITIALIZE FILE SEQUENCE NUMBERR0 CALL GETWIN ;GET WINDOW ADDRESS, IS THERE ONE?* BEQ 454$ ;IF EQ THERE IS NO WINDOW BLOCK" MOV W.FCB(R2),R2 ;GET FCB 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?Y 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 ACPI .IF DF U$$DAS ;DC4376 MOV T.ST4(R3),-(SP) ; SAVE FOR I/D SPACE ACP ;DC437 .IFTF ;DF,U$$DAS ;DC437. MOV T.PCB(R3),R3 ;GET PCB ADDRESS FOR THE ACP; BIT #PS.CKP!PS.CKR!PS.OUT,P.STAT(R3) ;IS ACP CHECKPOINTED?E BNE 453$ ;IF NE YESK .IFT ;DF,U$$DAS ;DC437T6 BIT #T4.DSP,(SP) ; IS THIS AN I/D SPACE TASK ;DC437- BEQ 4515$ ; IF EQ, NOPE, CONTINUE ;DC437B7 MOV P.REL(R3),KISAR5 ;MAP THE ACP TASK HEADER ;DC437E: MOV @#120000+H.WND,(SP) ; GET THE WINDOW POINTER ;DC437H ADD #<<2-20000>+W.BLGH+W.BOFF>,(SP) ; POINT TO THE WINDOW OFFSET ;DC437= MOV @(SP),KISAR5 ; GET THE OFFSET WORD FOR WINDOW #1 ;DC437R%4515$: ; REFERENCE LABEL ;DC437T .IFTF ;DF,U$$DAS ;DC437< 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 NO1 SUB #20000,R2 ;CONVERT FCB ADDRESS TO APR 5 BIAS32 ADD #200,KISAR5 ;ADJUST MAPPING TO NEXT 4K OF FCP8452$: MOV F.FNUM(R2),ML.FID(R4) ;MOVE FILE ID TO ML NODE6 MOV F.FSEQ(R2),ML.FSEQ(R4) ;MOVE FILE SEQUENCE NUMBER"453$: .IFT ;DF,U$$DAS ;DC437& TST (SP)+ ;CLEAN THE STACK ;DC437 .ENDC ;DF,U$$DAS ;DC437$ MOV (SP)+,R3 ;RESTORE R3 ;DC4370 MOV (SP)+,KISAR5 ;RESTORE KERNEL PAR 5 ;**-13454$: CALL $DLNK ;REMOVE THE ML NODE FROM THE LISTH& MOV ML.TCB(R4),R3 ;GET ADDRESS OF TCB2 MOV T.NAM(R3),ML.TCB(R4) ;PUT TASK NAME IN PACKET MOV T.NAM+2(R3),ML.TCB+2(R4) ;P* CALL $EXRQF ;QUEUE ML NODE TO ERROR TASK446$: 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 STATUSEST* MOV (SP)+,R3 ;GET REAL I/O PACKET ADDRESS .ENDC ; DF S$$HDW .IF DF P$$MON BR P1 ;BYPASS IOFIN HOOKPOINTS .ENDC .DSABL LSB ;+; **-$IOFIN-I/O FINISH;VM; THIS ROUTINE IS CALLED TO FINISH I/O PROCESSING IN CASES WHERE THE UNIT ANDMG; CONTROLLER ARE NOT TO BE DECLARED IDLE. IF THE TASK WHICH ISSUED THEPE; I/O HAS HAD A RECENT MAPPING CHANGE WHICH MAY HAVE UNMAPPED ITS I/OOF; 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:E;; R0=FIRST I/O STATUS WORD.D; R1=SECOND I/O STATUS WORD.'; R3=ADDRESS OF THE I/O REQUEST PACKET.;+ ; OUTPUTS:;/%; THE FOLLOWING ACTIONS ARE PERFORMEDT;IE; 1-THE FINAL I/O STATUS VALUES ARE STORED IN THE I/O STATUS BLOCK IFT; ONE WAS SPECIFIED. ; ;; 2-ALL ASSOCIATED I/O COUNTS ARE DECREMENTED AND TS.RDN IS 8; 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 MAPPINGE ; CHANGE.;T?; 3-IF 'TS.CKR' IS SET, THEN IT IS CLEARED AND CHECKPOINTING OF ; THE TASK IS INITIATED.+; B; 4-IF AN AST SERVICE ROUTINE WAS SPECIFIED, THEN AN AST IS QUEUED4; FOR THE TASK. ELSE THE I/O PACKET IS DEALLOCATED.;I2; 5-A SIGNIFICANT EVENT OR EQUIVALENT IS DECLARED.;C(; NOTE: R4 IS DESTROYED BY THIS ROUTINE.;-$IOFIN:: ;REFERENCE LABEL  .IF DF P$$MON;+; ** W A R N I N G **A;I; SPM HOOKPOINT NUMBER 35.;D); DO NOT CHANGE THE INSTRUCTION FOLLOWING ; LABEL WITHOUT CHECKING SPM;-+$SPH35==. ;SPM CHANGES THE INSTRUCTION ATO ;THE LOCATION OF THIS LABELT& NOP ;UGLY, BUT IT'S THE ONLY WAY WE ;CAN ASSURE TWO INSTRUCTIONS' NOP ;TO PICK UP AND REPLACE WITH THE  ;SPM HOOKSP1:- .ENDC .ENABL LSBU# .IF DF R$$AMD ;AUTOMOUNT/DISMOUNT >; NOTE THAT THIS CODE WILL NOT WORK IF EITHER ERROR LOGGING OR00~~ibjbkb a a a; SHADOW RECORDING IS TURNED ONN, TSTB R0 ;ERROR IN PROCESSING I/O REQUEST ? BPL 100$ ;IF PL, NOT' MOV I.UCB(R3),R4 ;YES, GET UCB ADDRESSI ASSUME US.SIO,200& TSTB U.ST2(R4) ;I/O STALLED TO UNIT ?+ BPL 100$ ;IF PL, NO - PASS ERRORS TO TASKG; CMP $VERTK,I.TCB(R3) ;I/O REQUEST FROM VERIFICATION TASK ?S, BEQ 100$ ;IF EQ, YES - PASS ERRORS TO TASK3 MOV U.SCB(R4),R0 ;GET SCB LISTHEAD FOR I/O PACKETSD# MOV R3,R1 ;GET CURRENT I/O PACKETO4 ADD #U.SPRM,R4 ;POINT TO PARAMETER SAVE AREA IN UCB9 ADD #I.PRM+6,R3 ;POINT TO READ/WRITE CELLS IN I/O PACKETI MOV (R4)+,(R3)+ ;RESTORE MOV (R4)+,(R3)+ ; I/OM MOV (R4)+,(R3)+ ; PACKET MOV (R4),(R3) ;1 CALL $QINSB ;RE-INSERT PACKET AT FRONT OF QUEUEB RETURN ;P100$: ;REFERENCE LABEL .ENDC ; DF R$$AMD .IF DF S$$HDW MOV R5,-(SP) ;SAVE R57 MOV I.UCB(R3),R5 ;SET UCB ADDRESS FOR SHADOW RECORDINGR- CALL $SHFND ;SEE IF WE HAVE PACKET PROBLEMS1 MOV (SP)+,R5 ;RESTORE R5' BCS IOFIN2 ;IF CS NO SHADOW RECORDINGA;NB; THIS IS THE POINT WHERE WE WILL DEALLOCATE AN ML NODE AND RETURND; THE STATUS IN THE REGISTERS TO THE USER. ALL PROCESSING CONCERNED<; WITH STATUS RETURNS MUST HAVE BEEN RESOLVED AT THIS POINT.;T4IOFIN1: CALL $DLNK ;REMOVE ML NODE FROM LIST ON UMB2 MOV ML.PRI(R4),R3 ;GET PRIMARY I/O PACKET ADDRESS& MOV R3,-(SP) ;SAVE I/O PACKET ADDRESS MOV R1,-(SP) ;SAVE STATUS MOV R0,-(SP) ;SAVE STATUS* MOVB ML.LEN(R4),R1 ;GET LENGTH OF ML NODE! MOV R4,R0 ;COPY ML NODE ADDRESSO( CALL $DEACB ;RELEASE STORE FOR ML NODE MOV (SP)+,R0 ;RESTORE STATUS  MOV (SP)+,R1 ;RESTORE STATUSS) MOV (SP)+,R3 ;RESTORE I/O PACKET ADDRESSIIOFIN2: ;REFERENCE LABELE .ENDC2 TALLY$ B.AIOC,XA$$IO,CPU ;COUNT AN I/O COMPLETION3 MOV R0,I.PRM+6(R3) ;STORE FIRST WORD OF I/O STATUS,5 MOV R1,I.PRM+10(R3) ;STORE SECOND WORD OF I/O STATUS & TSTB I.EFN(R3) ;VIRTUAL I/O FUNCTION? BPL 205$ ;IF PL NO( BICB #200,I.EFN(R3) ;CLEAR VIRTUAL FLAG. BIT #1,I.LN2(R3) ;HEADER LOCKED DOWN FOR ACP? BNE 1$ ;IF NE NO9 MOV I.TCB(R3),R0 ;THE I/O PACKET IS CONNECTED TO THE TCBM2 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 LABELC% MOV #205$,-(SP) ;FAKE RETURN ADDRESSR,$DCWIO::MOV $WCFLG,R0 ;GET UCB FLAG FOR TEST BEQ 11$ ;IF EQ W.IOC DISABLEDR) MOV I.UCB(R3),R2 ;GET DEVICE UCB ADDRESSI$ BIT R0,U.CW1(R2) ;FILES-11 DEVICE ? BEQ 2$ ;IF EQ, NOL1 CALL GETWIN ;GET WINDOW ADDRESS, IS THERE ONE ?D BEQ 2$ ;IF EQ, NO + DECB W.IOC(R2) ;DECREMENT WINDOW I/O COUNT 11$: ;D .IF DF R$$LKL0 MOV I.PRM+16(R3),R0 ;PICK UP LOCK BLOCK ADDRESS BEQ 2$ ;IF EQ THERE IS NONEC1 CMP R0,#140000 ;IS IT A RELOCATED USER ADDRESS ?A BHIS 2$ ;IF HIS, YES# DEC (R0) ;FREE LOCK FOR UNLOCKINGF .ENDC ; DF R$$LKL2$: RETURN 205$: ;REFERENCE LABELV5 MOV I.IOSB+4(R3),R2 ;GET ADDRESS OF I/O STATUS BLOCK2. BEQ 10$ ;IF EQ NO I/O STATUS BLOCK SPECIFIED .IF DF R$$IIC/ BIT #1,R2 ;INTERNAL I/O COMPLETION REQUESTED? BEQ 21$ ;IF LO BIT NOT SET, NO DEC R2 ;CLEAR LO BIT. MOV KISAR5,-(SP) ;SAVE CURRENT KISAR5 MAPPING. MOV KISAR6,-(SP) ;SAVE CURRENT KISAR6 MAPPING4 MOV I.IOSB+2(R3),KISAR5 ;MAP I/O COMPLETION ROUTINE8 MOV KISAR5,KISAR6 ;ROUTINE MAY BE MAPPED THROUGH KISAR6 .IF DF K$$DAS! MOV KINAR5,-(SP) ;SAVE I-SPACE 5 ! MOV KINAR6,-(SP) ;SAVE I-SPACE 63" MOV KISAR5, KINAR5 ;MAP I-SPACE 5" MOV KISAR6, KINAR6 ;MAP I-SPACE 6 .IFTF ; K$$DAS.1 CALL (R2) ;CALL INTERNAL I/O COMPLETION ROUTINEQ .IFT ; K$$DAS0 MOV (SP)+,KINAR6 ;RESTORE SAVED MAPPING CONTEXT MOV (SP)+,KINAR5 ;... .ENDC ; K$$DASI0 MOV (SP)+,KISAR6 ;RESTORE SAVED MAPPING CONTEXT MOV (SP)+,KISAR5 ;A RETURN ;DONEE21$: ;REF LABEL .ENDC ;R$$IIC, MOV I.TCB(R3),R0 ;POINT TO ISSUING TASK TCB6 BIT #TS.BLC,T.STAT(R0) ;TASK BLOCKED (CHECKPOINTED) ?, BNE 3$ ;IF NE YES, DEFER I/O STATUS UPDATE. BIT #T3.MPC,T.ST3(R0) ;RECENT MAPPING CHANGE? BEQ 5$ ;IF EQ NO63$: CALL $SETCR ;RESCHEDULE TASK TO LOOK AT AST QUEUE$ MOV R3,R1 ;COPY I/O PACKET P00~~t__DATADATADATADATAOINTER8 MOVB #AK.DIO,A.CBL(R1) ;INDICATE DELAYED I/O COMPLETION1 ADD #T.ASTL,R0 ;POINT TO TASK AST QUEUE LISTHEADM1 CALL $QINSB ;INSERT BLOCK AT BEGINNING OF QUEUEN0 BR $DECAL ;DEC I/O COUNTS, UNBLK TASK & RETURN*5$: MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING1 MOV I.IOSB+2(R3),KISAR6 ;MAP TO I/O STATUS BLOCKB4 MOV I.PRM+6(R3),(R2)+ ;SET FINAL I/O STATUS VALUES MOV I.PRM+10(R3),(R2) ;* MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING010$: CALL $DECAL ;DEC I/O COUNTS & UNBLOCK TASK4 MOV I.TCB(R3),R1 ;GET ADDRESS OF TASK CONTROL BLOCK, DECB T.IOC(R1) ;DECREMENT I/O REQUEST COUNT/ BNE 15$ ;IF NE TASK STILL HAS OUTSTANDING I/OQ0 BIC #T3.MPC,T.ST3(R1) ;CLEAR MAPPING CHANGE BIT15$: ;REF LABEL5 MOV I.TCB(R3),R1 ;PICK UP ISSUING TASK'S TCB ADDRESST MOV R5,-(SP) ;SAVE UCB ADDRESS6" MOV I.TCB(R3),R5 ;SET TCB ADDRESS) MOVB I.EFN(R3),R0 ;GET EVENT FLAG NUMBERS1 CALL $SETFG ;SET EFN AND UNLOCK IF GROUP GLOBALO$ MOV R3,R0 ;COPY I/O PACKET ADDRESS! TST (R3)+ ;POINT TO SECOND WORDI3 MOV #I.LGTH,(R3)+ ;INSERT LENGTH OF BLOCK IN BYTES ? MOV #8.*2,(R3)+ ;SET NUMBER OF BYTES TO ALLOCATE ON USER STACKL( MOV I.AST(R0),(R3)+ ;INSERT AST ADDRESS BEQ 70$ ;IF EQ NONE SPECIFIED5. MOV #1,(R3)+ ;INSERT NUMBER OF AST PARAMETERS@ MOV I.IOSB(R0),(R3) ;INSERT VIRTUAL ADDRESS OF I/O STATUS BLOCK' MOV R0,R1 ;COPY ADDRESS OF I/O PACKETF. MOV R5,R0 ;CALCULATE ADDRESS OF AST LISTHEAD ADD #T.ASTL,R0 ; " CALL $QINSF ;INSERT AST IN QUEUE MOV R5,R0 ;COPY TCB ADDRESS+( CALL $SETCR ;SET TASK SCHEDULE REQUEST BR 80$ ;(70$: CALL $DEPKT ;DEALLOCATE I/O PACKET&80$: MOV (SP)+,R5 ;RESTORE UCB ADDRESS RETURN ;V .DSABL LSB+;+"; *-GETWIN-GET FILE WINDOW ADDRESS;P; INPUT:; R3=I/O PACKET ADDRESSB;O ; OUTPUT:E; R2=WINDOW ADDRESS,; Z-BIT SET IF NO WINDOW;->GETWIN: MOV I.LN2(R3),R2 ;GET IMAGE OF LUT2 OR ADDRESS OF LUT2 BIT #1,R2 ;ADDRESS?E BNE 10$ ;IF NE NOA .IF DF X$$HDR' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING," MOV I.TCB(R3),R2 ;GET TCB ADDRESS1 MOV T.PCB(R2),R2 ;GET PCB ADDRESS OF TASK REGION 3 MOV P.REL(R2),KISAR6 ;ASSUME WE NEED TO MAP HEADERS .IFTF( MOV @I.LN2(R3),R2 ;GET CONTENTS OF LUT2 .IFTN" MOV (SP)+,KISAR6 ;RESTORE MAPPING .ENDC210$: BIC #1,R2 ;CLEAR POSSIBLE INTERLOCK, WINDOW? RETURN ; ;+5; **-$DECAL-DECREMENT ALL I/O COUNTS AND UNBLOCK TASK ;A?; THIS ROUTINE IS CALLED ON I/O COMPLETION TO DECREMENT ALL I/O.>; COUNTS IN ATTACHMENT DESCRIPTORS AND TO UNBLOCK THE TASK FOR(; CHECKPOINT IN PROGRESS OR I/O RUNDOWN.;R ; INPUTS:A;E; R3=ADDRESS OF I/O PACKET.L;) ; OUTPUTS:; ; NONE.O;-9$DECAL::MOV I.AADA(R3),R0 ;DEC I/O COUNT IN 1ST ATT DESC?2 BEQ 10$ ;IF EQ NOP$ CLR I.AADA(R3) ;CLEAR ATT DESCR PTR" CALL $DECIO ;DECREMENT THE COUNT910$: MOV I.AADA+2(R3),R0 ;DEC I/O COUNT IN 2ND ATT DESCR?N BEQ 20$ ;IF EQ NOU& CLR I.AADA+2(R3) ;CLEAR ATT DESCR PTR" CALL $DECIO ;DECREMENT THE COUNT020$: MOV I.TCB(R3),R0 ;POINT TO ISSUING TASK TCB, BIC #TS.CIP!TS.RDN,T.STAT(R0) ;UNBLOCK TASK RETURN ;W;+?; **-$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.;E ; INPUTS:T;0; R3=ADDRESS OF I/O PACKET./;O ; OUTPUTS:;D; NONE.B;--$DECBF::MOV R3,-(SP) ;SAVE I/O PACKET ADDRESSR3 MOV I.AADA(R3),R0 ;DEC I/O COUNT IN 1ST ATT DESCR?T BEQ 10$ ;IF EQ NOS) BIS #1,I.AADA(R3) ;INDICATE BUFFERED I/OR" CALL $DECIP ;DECREMENT THE COUNT% MOV (SP),R3 ;RESTORE PACKET ADDRESS/910$: MOV I.AADA+2(R3),R0 ;DEC I/O COUNT IN 2ND ATT DESCR?  BEQ 20$ ;IF EQ NOE+ BIS #1,I.AADA+2(R3) ;INDICATE BUFFERED I/O " CALL $DECIP ;DECREMENT THE COUNT)20$: MOV (SP)+,R3 ;RESTORE PACKET ADDRESS3, MOV I.TCB(R3),R0 ;POINT TO ISSUING TASK TCB, BIC #TS.CIP!TS.RDN,T.STAT(R0) ;UNBLOCK TASK RETURN ;S;+; **-$IOKIL-I/O KILL;OL; THIS ROUTINE IS CALLED TO FLUSH ALL I/O REQUESTS FOR THE CURRENT TASK FROMJ; A DEVICE QUEUE AND TO CANCEL THE CURRENT I/O OPERA00~~ibjbkb a a aTION IN PROGRESS IF IT; IS ALSO FOR THE CURRENT TASK.,;; ; INPUTS:N;N<; R5=ADDRESS OF THE UCB OF THE DEVICE TO FLUSH REQUESTS FOR.;I ; OUTPUTS:;/B; IF THE SPECIFIED DEVICE IS NOT FILE STRUCTURED, THEN THE I/O RE-D; REQUEST QUEUE IS FLUSHED AND THE CURRENT I/O OPERATION IN PROGRESS; IS CANCELLED.T;)(; NOTE: R4 IS DESTROYED BY THIS ROUTINE.;-$IOKIL:: .IF DF M$$PRO0 CLR $TEMP0 ;INDICATE THIS IS NOT DRQIO CALLING .ENDC ; DF M$$PRO0$IOKL1::CLR $TEMP2 ;SET INDICATOR TO FLUSH ASTS,$IOKL2::MOV U.SCB(R5),R4 ;GET ADDRESS OF SCB/ MOV $TKTCB,R1 ;GET TCB ADDRESS OF CURRENT TASKF& TST U.CW1(R5) ;DEVICE-UNIT MOUNTABLE? BPL 10$ ;IF PL NOT- BITB #US.MNT,U.STS(R5) ;DEVICE-UNIT MOUNTED?N! BNE 10$ ;IF EQ NO - FLUSH QUEUEU: TST U.ACP(R5) ;DEVICE HAVE ACP (ALSO CATCHES NOT FOREIGN)& BNE 40$ ;IF NE ES, CAN'T FLUSH QUEUE10$:$ .IF DF C$$RTK ;REMOTE TASK SUPPORT6 BIT #F5.RTK,$FMSK5 ;IS REMOTE TASK SUPPORT TURNED ON? BEQ 15$ ;IF EQ NOI: CMP (R5),$XXLOW ;IS THE DCB ADDRESS IN THE GENERIC RANGE? BLO 15$ ;IF LO NOS CMP (R5),$XXHGH ;IS IT?4 BLOS 40$ ;IF LO OR SAME, YES DON'T FLUSH QUEUE YET .ENDC ;C$$RTK15$:/ MOV R4,R3 ;COPY ADDRESS OF I/O QUEUE LISTHEAD-.20$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT ENTRY( MOV (R2),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 NOP- CMP R5,I.UCB(R3) ;REQUEST FOR SPECIFIED UCB?P BNE 20$ ;IF NE NO1 MOV (R3),(R2) ;CLOSE UP LISTL BNE 30$ ;IF NE NO NEW LAST& MOV R2,2(R4) ;SET ADDRESS OF NEW LAST230$: MOV #IE.ABO&377,R0 ;SET FINAL STATUS TO ABORT/ TSTB $TEMP2 ;SUBFUNCTION BIT SET FOR IO.KIL ? BMI 35$ ;IF MI YES2 CLR I.AST(R3) ;MAKE SURE THERE IS NO AST DECLARED,35$: CLR R1 ;CLEAR R1 BEFORE CALLING $IOFIN! CALL $IOFIN ;FINISH I/O REQUESTQ BR $IOKL2 ;GO AGAIN.40$: TSTB U.STS(R5) ;UNIT BUSY?K* 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) ' BEQ 44$ ;IF EQ NO KRB -- CALL DRIVER?E/ BIT K.URM(R4),$URMST ;IS THE KRB'S URM ONLINE? ( BEQ 50$ ;IF EQ NO -- DON'T CALL DRIVER .ENDC?44$: BITB #UC.KIL,U.CTL(R5) ;CALL DRIVER REGARDLESS OF ACTIVITYS BEQ 50$ ;IF EQ NO -- EXITA( BITB #US.OFL,U.ST2(R5) ;DEVICE ONLINE ? BNE 50$ ;IF NE NO -- EXITK45$: ;REFERENCE LABEL .IF DF M$$PRO) MOV $TEMP0,R0 ;WERE WE CALLED FROM DRQIOR BEQ 46$ ;IF EQ NO MOV R0,SP ;RESET STACK POINTER. TST (SP)+ ;ADVANCE PAST SECONDARY PACKET PTR. MOV (SP)+,R4 ;SET ADDRESS OF I/O PACKET IN R40 INC R4 ;MAKE IT ODD TO INDICATE PACKET ADDRESS TST (SP)+ ;CLEAN STACK( BR 461$ ;AND FORK TO CORRECT PROCESSOR046$: MOV $TKTCB,R4 ;GET CURRENT TASK TCB ADDRESS'461$: MOV U.SCB(R5),R2 ;GET SCB ADDRESS,& MOV #465$,R3 ;GET THE ROUTINE ADDRESS5 JMP $EXRP1 ;TRANSFER EXECUTION TO CORRECT PROCESSOR -465$: BIT #1,R4 ;WERE WE CALLED FROM DRQIO ?I& BEQ 462$ ;IF EQ NO, JUST CALL DRIVER MOV R4,R3 ;COPY PACKET ADDRESS DEC R3 ;CLEAR LOW ORDER BITR CLR R1 ;SET LENGTH AND& MOV #IS.SUC&377,R0 ;STATUS FOR $IOFIN6 MOV I.TCB(R3),-(SP) ;SAVE TCB ADDRESS FOR DRIVER CALL% CALL $IOFIN ;FINISH THE I/O REQUESTE# MOV (SP)+,R4 ;RETRIEVE TCB ADDRESSN*462$: MOV R4,R1 ;RESTORE CURRENT TASK TCB& MOV U.SCB(R5),R4 ;RESTORE SCB ADDRESS .ENDC4 MOV S.PKT(R4),R0 ;GET ADDRESS OF CURRENT I/O PACKET7 MOV (R5),R2 ;RETRIEVE ADDRESS OF DEVICE CONTROL BLOCKQ/ MOV KINAR5,-(SP) ;SAVE KERNEL INSTR ADDR REG 5C .IF DF K$$DAS. 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 ADDRESS ' BEQ 47$ ;IF EQ DRIVER IS PART OF EXEC 4 MOV P.REL(R3),KINAR5 ;MAP THE DRIVER IN INSTR SPACE .IFTV3 MOV P.REL(R3),KDSAR5 ;MAP THE DRIVER IN DATA SPACES .IFTF;47$: MOV D.DSP(R2),R2 ;GET ADDRESS OF DRIVER DISPATCH TABLED# BEQ 49$ ;IF EQ DRIVER IS UNLOADEDK" MOV S.KRB(R4),R3 ;GET KRB ADDRESS BEQ 48$ ;IF EQ NO KRB ADDRESSV$ MTPS K.PRI(R3) ;S00t__DATADATADATADATAET DEVICE PRIORITY1 MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX FROM KRB(;SE; CALL DRIVER AT CANCEL I/O OPERATION ENTRY POINT WITH THE ARGUMENTS: ;B'; R0=ADDRESS OF THE CURRENT I/O PACKET.M,; R1=ADDRESS OF THE TCB OF THE CURRENT TASK.; R3=CONTROLLER INDEX.); R4=ADDRESS OF THE STATUS CONTROL BLOCK.C'; R5=ADDRESS OF THE UNIT CONTROL BLOCK.T;D2; IF S.KRB=0 THEN R3 IS UNDEFINED AND PRIORITY =0.; +48$: MOV R5,-(SP) ;;;PROTECT R5 FROM DRIVERS, CALL @D.VCAN(R2) ;;;CANCEL CURRENT REQUESTS MOV (SP)+,R5 ;;;RETRIEVE R5$ MTPS #0 ;;;ALLOW DEVICE INTERRUPTS49$: ;REF LABEL .IF DF X$$HDR' MOV (SP)+,KISAR6 ;RESTORE KERNEL APR 6N .ENDC .IFTS1 MOV (SP)+,KDSAR5 ;RESTORE KERNEL DATA ADDR REG 5  .ENDC2 MOV (SP)+,KINAR5 ;RESTORE KERNEL INSTR ADDR REG 550$: RETURN ;O;+; **-$SCDVT-SCAN DEVICE TABLES0; **-$SCDV1-SCAN DEVICE TABLES (ALTERNATE ENTRY);RP; THIS ROUTINE IS A CO-ROUTINE THAT IS CALLED TO SCAN THE DEVICE TABLES. FOR EAC,; UNIT CONTROL BLOCK THE CALLER IS RECALLED.;I ; INPUTS:P;0&; R3=LIST POINTER (IF ENTRY AT $SCDV1);L ; OUTPUTS:;D4; C=1 IF NO MORE ENTRIES EXIST IN THE DEVICE TABLES.7; C=0 IF THE NEXT DEVICE TABLE ENTRY IS BEING RETURNED. *; R3=ADDRESS OF THE DEVICE CONTROL BLOCK.*; R4=ADDRESS OF THE STATUS CONTROL BLOCK.(; R5=ADDRESS OF THE UNIT CONTROL BLOCK.;-;; *********************************************************H ; * * +; * > > > W A R N I N G < < < *E ; * *E9; * THE FOLLOWING ARE OFFSET DEFINITIONS WHICH ARE *U9; * SUPPLIED EITHER BY DEFINITION IN THE EXEC (IOSUB) *P9; * OR THE DUMMY STB FILE (FROM SFVC2). ANY CHANGE TO *E9; * THESE DEFINITIONS MUST BE MADE IN BOTH MODULES. * ; * *S;; *********************************************************O;O/S$$SPA==10 ;SYMBOL TO ADD TO SP TO ABORT SCAN.4S$$SPC==6 ;OFFSET ON SP TO CLR TO SKIP CURRENT DCB8$SCDVT::MOV #$DEVHD,R3 ;GET ADDRESS OF FIRST DCB ADDRESS6$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 UCBM& 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 ADDRESS$ MOV R5,-(SP) ;SAVE UCB ADDRESSO! MOV R4,-(SP) ;SET RETURN ADDRESSN6 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 UCBT$ DECB (SP) ;ANY MORE UCB'S TO SCAN? CMPB (SP),#-1 ; BNE 20$ ;IF NE YES TST (SP)+ ;CLEAN STACK BR 10$ ;GO AGAIN30$: SEC ;INDICATE NO ENTRY, JMP (R4) ;RETURN TO CALLER .END ;SAVE UCB ADDRESSO! MOV R4,-(SP) ;SET RETURN ADDRESSN6 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" M .TITLE LOADRs .IDENT /15.00/ ;i1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A..; All rights reserved.;w<; 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: ; ; J. W. BERZLE; D. R. DONCHIN ; M. S. FOX ; J. R. KAUFFMAN; G. N. LARSEN; J. M. LAWLER; T. M. MARTIN; B. S. MCCARTHY; L. B. MCCULLEY ; K. L. NOEL; D. P. RABAHY; C. A. SILVER; J. C. FRANZINI; D. CARROLLt;.+; MODIFIED FOR RSX-11M-PLUS VERSION 4.6 BY:h;c; D. CARROLL 9-Jan-1996 15.001; DC430 - Include support for 32-bit LBN devicesS;R;H3; TASK TO LOAD AND CHECKPOINT ALL NONRESIDENT TASKSI;C; MACRO LIBRARY CALLS ;S> .MCALL ABODF$, CPRDF$, HDRDF$, HWDDF$, PCBDF$, TCBDF$, UCBDF$ .MCALL DIR$, WSIG$S" ABODF$ ;DEFINE TASK ABORT CODES+ CPRDF$ ;DEFINE SYMBOLS & OFFSETS FOR CPR.% HDRDF$ ;DEFINE TASK HEADER OFFSETS $ HWDDF$ ;DEFINE HARDWARE REGISTERS1 PCBDF$ ;DEFINE PARTITION CONT00 ~ibjbkb a a aROL BLOCK OFFSETSF, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS, UCBDF$ ;DEFINE UNIT CONTROL BLOCK OFFSETS MAP6= 140000; ; LOCAL DATA;; READ/WRITE I/O DPB;O"LDRDP: .BYTE 3,12. ;DIC, DPB SIZELDRFC: .BLKW 1 ;FUNCTION CODE .BYTE 1 ;LUN 1 .BLKB 1 ;UNUSED BYTE .BYTE 1 ;EFN 1 .BLKB 1 ;UNUSED BYTE+ .WORD IOSB ;I/O STATUS DOUBLEWORD ADDRESS ! .WORD 0 ;NO AST SERVICE ROUTINE ;LDRBF: .WORD 140000 ;BUFFER ADDRESS (ALWAYS MAP THRU APR6)GLDRLN: .BLKW 1 ;BUFFER LENGTH .BLKW 1 ;(UNUSED)S$LDRBK: .BLKW 2 ;LBN OF I/O TRANSFER%IOSB: .BLKW 2 ;I/O STATUS DOUBLEWORDN .IF DF U$$DAS*ISIZE: .WORD 0 ;SIZE OF USER I SPACE LOAD*IREL: .WORD 0 ;RELOCATION BIAS OF I SPACE1MUDPT: .WORD 0 ;POINTER TO D WINDOW INTO MU PARTE ;FOR A MULTI-USER I/D TASK .ENDC .IF DF X$$HDR+HDRDB: .WORD 0 ;APR BIAS OF CURRENT HEADERU .ENDC ; DF X$$HDR;+; **-$LOADR-LOADER TASK;BE; THE LOADER TASK IS DRIVEN OFF A LIST OF PCB'S QUEUED TO ITS RECEIVE1?; QUEUE IN PRIORITY ORDER. THE LOADER'S ACTION FOR EACH PCB IS/@; PRIMARILY DRIVEN BY THE TWO PCB STATUS BITS PS.CKP AND PS.OUT.G; SECONDARY INFORMATION WHICH DRIVES THE LOADER IS PASSED IN THE STATUSIC; BITS PS.CKR, PS.COM, PS.FXD, AND PS.RON. BASICALLY THE LOADER ISE6; CALLED UPON TO PERFORM ONE OF THE FOLLOWING ACTIONS:;D; 1. (PS.CKP=0,PS.OUT=0) INITIALIZE A TASK FOR EXECUTION WHICH IS7; ALREADY IN MEMORY. (CURRENTLY FOR TRAX-11 USE ONLY.)DE; 2. (PS.CKP=0,PS.OUT=1) PERFORM THE INITIAL LOAD OF A NONRESIDENTR@; REGION. IF THE REGION IS A TASK REGION (PS.COM=0), INITIALIZE:; ITS HEADER AND ATTACHMENT LIST. IF THE REGION IS A TASK@; REGION WHICH IS NOT SIMPLY BEING FIXED (PS.FXD=0), CALL $BILDS@; TO INITIALIZE THE TASK'S STACK AND PLACE IT IN THE ACTIVE TASK@; LIST. IF THE REGION BEING LOADED ALREADY HAS A PENDING CHECK-A; POINT REQUEST (PS.CKR=1), INITIATE THE CHECKPOINT OF THE REGIOND; BY CALLING $ICHKP.F; 3. (PS.CKP=1,PS.OUT=0) WRITE A CHECKPOINT IMAGE OF THE REGION OUTB; TO DISK, FREE ITS MEMORY, AND CONDITIONALLY PLACE THE PCB IN THEB; PARTITION WAIT QUEUE. IF THE REGION IS A TASK REGION (PS.COM=0)=; COPY ITS HEADER FROM THE POOL INTO THE IMAGE FIRST. IF THEFA; REGION IS A READ-ONLY COMMON (PS.RON=1), SIMPLY FREE ITS MEMORYN>; WITH NO I/O OPERATION. ALL PRIORITY ZERO COMMONS ARE QUEUED;; TO THE LOADR AS PRIORITY 251. COMMONS SO THAT THEY CAN BEC:; CHECKPOINTED OUT IMMEDIATELY. THEIR CORRECT PRIORITY IS; RE-CALCULATED BY THE LOADR.IF; 4. (PS.CKP=1,PS.OUT=1) READ THE CHECKPOINT IMAGE OF A REGION BACK@; INTO MEMORY. IF THE REGION BEING LOADED ALREADY HAS A PENDING?; CHECKPOINT REQUEST (PS.CKR=1), INITIATE THE CHECKPOINT OF THEE>; REGION BY CALLING $ICHKP. FOR INSTALLED COMMONS WITH PS.NWB<; SET, THE DISK PCB IS DEALLOCATED SO THAT THE COMMON IS NOT/; CHECKPOINTED TO ITS ORIGINAL TASK IMAGE FILE.R;-;23; GET NEXT REQUEST FROM LOADER QUEUE (SYSTEM STATE)I;DG; HERE THE LOADER EXTRACTS THE NEXT PCB FROM ITS RECEIVE QUEUE OR STOPS4F; ITSELF IF THERE IS NO REQUEST. IF THE REQUEST IS THE INITIALIZATIONF; OF AN ALREADY LOADED TASK OR THE CHECKPOINT OF A READ-ONLY COMMON ORE; THE LOADING OF A REGION CREATED BY THE CREATE REGION DIRECTIVE, THENH; 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.N;T$LOADR::) CALL $SWSTK, 31$ ;SWITCH TO SYSTEM STATED, CLR $LDPCB ;INITIALLY CLEAR SAVED PCB WORD* 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 ONET1 BIT #FE.MXT, $FMASK ;; NO WORK, SO STOP OR EXIT?  BNE 4$ ;; IF NE, EXITE CALLR $STPCT ;STOP FOR NOW&4$: MOV $TKTCB, R5 ;; GET LOADER'S TCB CALLR $DREXT ;; EXIT$5$: CLR IOSB ;INDICATE NO I/O ERROR .IF DF U$$DAS& CLR ISIZE ;RESET I-SPACE LOADED FLAG .ENDC ;DF, U$$DAS1 MOV R1,R3 ;CALCULATE ADDRESS OF PCB STATUS WORDE;+; ** W A R N I N G **I;U9; SPM HOOKPOINT - LOADR CALLS DUMMY ROUTINE FOR HOOKPOINTT;D); DO NOT C00t__DATADATADATADATAHANGE THE INSTRUCTION FOLLOWINGB; LABEL WITHOUT CHECKING SPM;-) CALL @$SPV02 ;CALL HOOKABLE ENTRY POINTB ADD #P.STAT,R3 ;E6 BIT #PS.OUT!PS.CKP,(R3) ;INIT OF ALREADY LOADED TASK? BEQ 7$ ;IF EQ YESR" BIT #PS.COM,(R3) ;IS IT A COMMON? BEQ 13$ ;IF EQ NO8 BIT #P2.RON,2(R3) ;IS IT AN INSTALLED READ ONLY COMMON? BEQ 6$ ;IF EQ NO6 BIT #PS.OUT,(R3) ;CHECKPOINT OF THE READ ONLY COMMON?# BNE 13$ ;IF NE NO, MUST BE LOADEDP, BR 12$ ;BYPASS I/O ON CKP OUT OF RO COMMON+6$: TST P.DPCB(R1) ;LOAD OF CREATED REGION?  BNE 13$ ;IF NE NOI;7$: BIS #PS.OUT,(R3) ;SET ALREADY LOADED TASK OUT OF MEMORY !12$: MOV R1,R4 ;COPY PCB ADDRESS#" MOV P.TCB(R4),R5 ;SET TCB ADDRESS$ JMP 82$ ;JOIN AFTER I/O COMPLETION$13$: MOV R1,$LDPCB ;SAVE PCB ADDRESS3 BIT #PS.OUT!PS.COM,(R3) ;CHECKPOINT WRITE OF TASK?L BNE 30$ ;IF NE NO- MOV P.HDR(R1),R3 ;GET ADDRESS OF TASK HEADERN .IF DF X$$HDR, BEQ 30$ ;IF EQ EXTERNAL HEADER, DON'T COPY .ENDC ; DF X$$HDR5 MOV P.REL(R1),KISAR6 ;SETUP TO ACCESS TASK PARTITIONE MOV P.TCB(R1),R2 ;POINT TO TCB3 ADD T.OFF(R2),KISAR6 ;ADD IN OFFSET TO TASK HEADERM3 MOV #140000,R2 ;SET ADDRESS BIAS OF TASK PARTITIONR3 MOV H.WND(R3),R4 ;POINT TO NUMBER OF WINDOW BLOCKSP' TST W.BLVR+2(R4) ;TASK MAPPED TO EXEC?E BNE 15$ ;IF NE YES6 MOV H.DSW(R2),H.DSW(R3) ;COPY DSW TO REAL TASK HEADER515$: MOV H.HDLN(R3),R4 ;GET LENGTH OF HEADER IN BYTESF ASR R4 ;CONVERT TO WORD COUNTT520$: MOV (R3)+,(R2)+ ;MOVE HEADER INTO TASK PARTITIONP! DEC R4 ;ANY MORE WORDS TO MOVE?S BGT 20$ ;IF GT YES#30$: RETURN ;RETURN TO TASK STATER;S*; PERFORM ACTUAL I/O TRANSFER (TASK STATE);0G; HERE THE LOADER SETS UP THE QIOW DPB AND PERFORMS THE ONE OR MORE I/OUF; TRANSFERS REQUIRED. AFTER SETTING UP THE I/O FUNCTION CODE AND BYTEG; COUNT THE LOADER MUST CALCULATE THE DISK ADDRESS AND UCB ADDRESS. IF5F; THERE IS A DISK PCB, THE LOADER CODE ASSUMES IT IS A CHECKPOINT PCB,H; AND THE DATA STRUCTURES ARE SUCH THAT THIS WORKS FOR COMMON TASK IMAGEE; FILE PCB'S AS WELL. OTHERWISE THE REQUEST MUST BE FOR A TASK TO ORRD; FROM ITS TASK IMAGE FILE. FOR AN INITIAL TASK LOAD THIS MEANS THE>; ADDRESS IN T.LBN. FOR A CHECKPOINT OPERATION THIS MEANS THEH; ADDRESS AT T.LBN MINUS THE PARTITION SIZE (THE PREALLOCATED CHECKPOINT ; SPACE).E; G; THE I/O TRANSFER IS SPECIFIED TO THE EXECUTIVE BY SPECIFYING A BUFFER F; ADDRESS OF 140000 AND LOADING UISAR6 WITH THE PHYSICAL MEMORY OFFSETH; OF THE FIRST 32W BLOCK OF THE TRANSFER. THIS ALLOWS THE EXECUTIVE TOF; FIND THE CORRECT START ADDRESS VIA $RELOC. THE SIZE OF THE TRANSFERG; CAN BE ANYTHING SINCE THE EXECUTIVE DOES NOT ADDRESS CHECK PRIVILEGEDRD; TASKS. THE PROCESSOR PRIORITY IS RAISED TO PR7 TO INHIBIT CONTEXTG; SWITCHING BETWEEN THE LOADING OF UISAR6 AND THE EXECUTION OF THE QIOWD; DIRECTIVE. THE PRIORITY ONLY REMAINS AT PR7 FOR SHORT INSTRUCTIONF; SEQUENCES AT TASK STATE IN THE LOADER, NATURALLY DROPPING TO PR0 ANDE; ALLOWING CONTEXT SWITCHING WHEN THE QIOW IS EXECUTED. ON RETURN TOC@; LOADER FROM THE QIOW, HOWEVER, THE PRIORITY IS RETURNED TO PR7B; AUTOMATICALLY AND UISAR6 WILL BE RELOADED IF ANOTHER TRANSFER IS ; REQUIRED.I;E/31$: MOV $LDPCB, R4 ;RETRIEVE SAVED PCB ADDRESS - BEQ $LOADR ;IF EQ THERE WAS NONE, TRY AGAIN 6 MOV P.TCB(R4),R5 ;GET TCB ADDRESS (IF TASK PARTITION)1 MOV R4,R3 ;CALCULATE ADDRESS OF PCB STATUS WORDI ADD #P.STAT,R3 ;N .IF DF C$$LDR. BIT #F5.LDR, $FMSK5 ; REMOTE LOADER SUPPORT? BEQ 49$ ; IF EQ NOG( MOV P.DPCB(R4), R1 ; POINT TO DISK PCB" BEQ 40$ ; IF EQ THERE ISN'T ONE" MOV P.MAIN(R1),R1 ; GET MAIN PCB& MOV P.UCB(R1), R1 ; SAVE UCB ADDRESS BR 41$T640$: MOV T.LDV(R5), R1 ; SAVE LOAD DEVICE UCB ADDRESS/41$: MOV U.RED(R1), R1 ; FOLLOW REDIRECT CHAINA( CMP R1, U.RED(R1) ; FOUND REAL DEVICE?% BNE 41$ ; IF NE, NOPE - KEEP GOINGR ASSUME U.DCB2 CMP (R1), $XXLOW ; INSTALLED ON A REMOTE DEVICE?' BLO 49$ ; IF LO, NOPE - LOCAL DEVICE  CMP (R1), $XXHGHR' BHI 49$ ; IF HI, NOPE - LOCAL DEVICE(/42$: CALL $SWSTK, 48$ ; SWITCH TO SYSTEM STATEE5 MOV #00~ibjbkb a a a< P$BLK+ 77>/ 100, R1 ;; ROUNDED SIZE OF PACKETU/ CLR R0 ;; INDICATES IMMEDIATE RETURN DESIREDV( CALL $CPALO ;; GET BUFFER FROM CPRBUF! BCC 43$ ;; RESOURCES AVAILABLEO0 BIS #1, $UMPS ;; PROPAGATE STATUS TO USER-MODE RETURNC43$:. MOV R0, KISAR6 ;; MAP NEWLY ALLOCATED PACKET) MOV #MAP6, R0 ;; BASE ADDRESS OF PACKETE;E; LOAD HEADER & PARAMETER AREASE;L CLRB H$ICNT(R0) ;; NO ITEMSR+ MOV P.REL(R4),P$ADDR(R0) ;; BIAS IN MEMORY+ CLR P$ADDR+2(R0) ;; OFFSET IS ALWAYS ZEROT> BIT #PS.OUT, P.STAT(R4) ;; IS THE REGION IN OR OUT OF MEMORY? BNE 44$ ;; IF NE, IT'S OUTT2 MOVB #HT$CKW, H$TYPE(R0) ;; MUST BE WRITE REQUEST BR 45$444$:XXX= PS.CKP!PS.COM6 BIT #XXX, P.STAT(R4) ;; IS THIS CHECKPOINT OR COMMON?- BEQ 46$ ;; IF EQ, NO - MUST BE A TASK LOADA4 MOVB #HT$CKR, H$TYPE(R0) ;; CHECKPOINT READ REQUEST45$:8 MOV P.DPCB(R4), R1 ;; GET DISK PARTITION CONTROL BLOCK3 MOV P.LBN+2(R1),P$BLK(R0) ;; RELATIVE BLOCK NUMBER) CMP P.MAIN(R1),R1 ;; IS THIS A CKP PCB?R BEQ 455$ ;; IF EQ NOT1 MOV P.REL(R1),P$BLK(R0) ;; RELATIVE BLOCK NUMBER$/ MOV P.MAIN(R1),R1 ;; GET CKP FILE PCB ADDRESS 455$: 3 MOV P.IID(R1), P$IID(R0) ;; USE COMMON IMAGE INDEXM> MOV P.SIZE(R4), P$LEN(R0) ;; # OF 32. WORD BLOCKS TO TRANSFER BR 47$F46$:/ MOVB #HT$ILD, H$TYPE(R0) ;; IMAGE LOAD REQUEST(1 MOV T.IID(R5), P$IID(R0) ;; USE TASK IMAGE INDEX45 ADD T.OFF(R5), P$ADDR(R0) ;; ADJUST DESTINATION BIASRF47$: CPSEN$ #SN$TSK,KISAR6,#P$BLK+2 ;; SEND PACKET TO CPRSYS VIA KXDRV MOV R0, KISAR6 ;; MAP PACKET* MOV MAP6+H$STAT, IOSB ;; PROPAGATE STATUS+ CALLR $CPDEA ;; RELEASE THE CPRBUF SPACEC48$:, BCS 42$ ; RESOURCE WAS LACKING, TRY AGAIN* JMP 81$ ; CONTINUE WITH POST-PROCESSING49$: .ENDC ; DF C$$LDR( MOV #IO.RLB,LDRFC ;ASSUME READ FUNCTION, BIT #PS.OUT,(R3) ;CHECKPOINT WRITE REQUEST? BNE 50$ ;IF NE NOU& MOV #IO.WLB,LDRFC ;SET WRITE FUNCTION50$: BIT #PS.COM,(R3) ;COMMON ?A BEQ 501$ ;IF EQ, NOS= BIT #P2.LDD,P.ST2(R4) ;WAS LOAD DEVICE DISABLED/DISMOUNTED ?, BNE 51$ ;IF NE, YES" BR 52$ ;ELSE CONTINUE PROCESSING501$:3 BIT #T4.LDD,T.ST4(R5) ;TASK LOAD DEVICE DISABLED ? BEQ 52$ ;IF EQ NO, ALL IS OK' BIT #PS.CKP,(R3) ;CHECKPOINT REQUEST ?P BEQ 51$ ;IF EQ NO, FAILURE3 BIT #T3.CAL,T.ST3(R5) ;CHECK POINT SPACE IN TASK ?N BEQ 52$ ;IF EQ NO, IT'S OK)51$: MOVB #IE.PRI,IOSB ;FORCE I/O FAILUREV52$: CLR R0 ;HIGH PORTION OF SIZE+ MOV P.SIZE(R4),R1 ;ASSUME SIZE OF TRANSFER;7 BIT #PS.CKP!PS.COM,(R3) ;CHECKPOINT REQUEST OR COMMON?L BNE 55$ ;IF NE YES;$D; THIS IS AN INITIAL TASK LOAD. SET SIZE FROM T.TKSZ, TASK LOAD SIZE); AND CLEAR FLAG INDICATING D SPACE TASK.;Q2 MOV T.TKSZ(R5),R1 ;USE TASK TRANSFER SIZE INSTEAD55$:# ASHC #6,R0 ;CONVERT TO BYTE COUNTU! MOV R0,R2 ;HIGH PORTION OF SIZEO; MOV R1,-(SP) ;OUT OF REGISTERS - USE STACK FOR LOW PORTION  MOV #LDRBK,R0 ;POINT TO LBN% MOV P.DPCB(R4),R1 ;POINT TO DISK PCBM BEQ 56$ ;IF EQ THERE IS NONE3 MOV P.REL(R1),2(R0) ;GET RELATIVE POSITION IN FILEE% MOV P.MAIN(R1),R1 ;POINT TO MAIN PCB$4 MOV P.LBN(R1),(R0)+ ;SET HIGH BITS OF BLOCK ADDRESS8 ADD P.LBN+2(R1),(R0) ;ADD LOW BITS TO RELATIVE POSITION ADC -(R0) ;PROPAGATE CARRY& MOV P.UCB(R1),-(SP) ;SAVE UCB ADDRESS BR 60$ ;956$: MOVB T.LBN(R5),(R0)+ ;SET HIGH BITS OF BLOCK ADDRESSM CLRB (R0)+ ; ;DC4301 .IF DF,E$$LBN ; EXTENDED LOGICAL BLOCKS ;DC430O ;DC4309 TSTB $FMSK6 ; SYSTEM SUPPORT 32-BIT LBN DEVICES ;DC430E/ BPL 57$ ; IF PL, NOPE, LEAVE AS ZERO ;DC430F@ MOVB T.LBNX(R5),-1(R0) ; LOAD IN THE HIGH ORDER LBN INFO ;DC430#57$: ; REFERENCE LABEL ;DC430D ;DC430 .ENDC ;DF,E$$LBN ;DC430 ;DC4304 MOV T.LBN+1(R5),(R0) ;SET LOW BITS OF BLOCK ADDRESS2 MOV T.LDV(R5),-(SP) ;SAVE LOAD DEVICE UCB ADDRESS2 BIT #PS.CKP,(R3) ;IS THIS A CHECKPOINT OPERATION? .IF NDF U$$DAS; BEQ 60$ ;IF EQ NOS .IFF ; NDF U$$DAS BNE 58$ ;IF NE YES;MD; THIS IS AN INITIAL LOAD. IF THE TASK HAS USER INSTRUCTION AND DATAF; SPACE ENABLED, ADJUST SO THAT THE FIRST LOAD GETS THE DA00"t__DATADATADATADATATA SPACE IN.6; THEN WE WILL LOCATE I SPACE THROUGH THE TASK HEADER.; = BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D SPACES ?L BEQ 60$ ;IF EQ NOW. DEC ISIZE ;AND INDICATE PARTIAL D SPACE LOAD BR 60$ ;REJOIN COMMON CODE .ENDC ; DF U$$DAS458$: MOV P.SIZE(R4),R1 ;PICK UP MAXIMUM SIZE OF TASK( ADD #7,R1 ;ROUND UP TO NEXT 512. BLOCK% ROR R1 ;CONVERT TO 512. WORD BLOCKSI ASR R1 ; ASR R1 ; .IF DF U$$DAS/ SUB T.ISIZ(R5),(R0) ;ADJUST BY SIZE OF I SPACEI SBC -2(R0) ; .ENDC ; DF U$$DAS1 SUB R1,(R0) ;CALCULATE STARTING LBN OF CKP AREA SBC -(R0) ;P60$:;)I; SINCE WE'RE IN USER-MODE AT THIS POINT WE HAVE TO USE UISAR6 TO MAP OUR L; HEADER AND SO WE MUST DISABLE INTERRUPTS LEST WE HAVE OUR CONTEXT RELOADED;$1 MOV $SAHPT, R1 ; GET ADDRESS OF LOADER'S HEADERE' MOVB #PR7, PS ;;; LOCK OUT INTERRUPTS1, MOV $SAHDB, UISAR6 ;;; MAP LOADER'S HEADER"PLF = / 100 * 400, MOV #PLF + 6, UISDR6 ;;; ALLOW WRITE ACCESS5 MOV (SP)+, H.LUN(R1) ;;; ASSIGN LUN 1 TO LOAD DEVICE CLRB PS ;;; ALLOW INTERRUPTS : MOV P.REL(R4), R1 ; PICK UP RELOCATION BIAS OF PARTITION9 BIT #PS.CKP!PS.COM, (R3) ; CHECKPOINT REQUEST OR COMMON?  BNE 65$ ; IF NE YES6 ADD T.OFF(R5), R1 ; ELSE ADD IN OFFSET TO TASK IMAGE65$:7 MOV #177000, LDRLN ; SET TENTATIVE LENGTH OF TRANSFER ; ; AT THIS POINT WE HAVE:;V-; R2,(SP) = TOTAL SIZE OF TRANSFER TO PERFORM ;; R1 = RELOCATION BIAS OF LOAD AREA IN PHYSICAL MEMORY '; R4 = PCB ADDRESS OF TRANSFER PCBS+; R5 = TCB ADDRESS OF TASK (IF TASK REGION)L=; LDRBK = HIGH ORDER PART OF DISK BLOCK ADDRESS TO TRANSFER 0; LDRBK+2 = LOW ORDER PART OF DISK BLOCK ADDRESS;R5 SUB #177000, (SP) ; REDUCE ACTUAL COUNT TO TRANSFERR SBC R2 BGE 70$ ; IF GE FULL TRANSFER0 ADD (SP), LDRLN ; ELSE REDUCE SIZE OF TRANSFER' BEQ 80$ ; IF EQ LAST TRANSFER DID IT:70$:2 TSTB IOSB ; FORCED I/O ERROR (DUE TO DISMOUNT)?. BMI 80$ ; IF MI YES, MAKE IT LOOK LIKE DONE' MOVB #PR7, PS ;;; LOCK OUT INTERRUPTSE. MOV R1, UISAR6 ;;; SET APR BIAS FOR TRANSFER+71$: DIR$ #LDRDP ;;; REQUEST I/O TRANSFERC# BCC 75$ ;;; IF CC LOAD SUCCEEDEDO) WSIG$S ;;; WAIT FOR SIGNIFICANT EVENTB BR 71$ ;;; RETRY I/OA75$: CLRB PS ;;; ALLOW INTERRUPTSE! ADD #1770, R1 ; UPDATE APR BIASP) ADD #177, LDRBK+2 ; UPDATE BLOCK NUMBERB ADC LDRBK% TST R2 ; WAS IT THE LAST TRANSFER?O BLT 80$ ; IF LT YES' TSTB IOSB ; WAS TRANSFER SUCCESSFUL? ( BPL 65$ ; IF PL YES - GO FOR NEXT ONE80$:+ TST (SP)+ ; POP LOW-ORDER TRANSFER COUNTA;BD; 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$$DAS0 TST ISIZE ;TASK USE I/D SPACE (AND NOT ALREADY ;LOADED BOTH SPACES) ?/ BPL 807$ ;IF PL EITHER NOT D SPACE OR ALREADYN ;ALL LOADEDK) CALL $SWSTK,805$ ;SWITCH TO SYSTEM STATEB$ MOV #ISIZE,R0 ;POINT TO IMPURE AREA+ MOV P.REL(R4),KISAR6 ;POINT TO TASK REGIONY, ADD T.OFF(R5),KISAR6 ;ADJUST TO HEADER AREA) CMPB #17,140000+H.IPS ;SUCCESSFUL READ ?A BNE 803$ ;IF NE NO) MOV H.NLUN+140000,R1 ;GET NUMBER OF LUNS  ASL R1 ;CONVERTM ASL R1 ;TO INDEX6 ADD #140000+H.NLUN+4,R1 ;POINT TO TASK I SPACE WINDOW2 MOV W.BSIZ(R1),(R0)+ ;SAVE SIZE OF I SPACE WINDOWI; IF A TASK HAS BEEN INSTALLED TWICE WITH DIFFERENT /XHR SETTINGS, W.BOFFF; IN WINDOWS 0 AND 1 MAY NOT BE CORRECT FOR THIS INSTANCE OF THE TASK.K; HERE, WE SET W.BOFF IN WINDOW 0 CORRECTLY SINCE WE USE IT BELOW TO FIGURER>; OUT WHERE TO LOAD THE I-SPACE. WINDOW 1 IS SETUP BY $MAPTK.8 SUB W.BOFF+W.BLGH(R1),W.BOFF(R1) ;;CALC SIZE OF I-SPACE; ADD T.OFF(R5),W.BOFF(R1) ;;SET CORRECT OFFSET FOR WINDOW 041 MOV W.BOFF(R1),(R0) ;;SAVE OFFSET INTO PARTITIONV"803$: RETURN ;BACK TO USER STATE.805$: TST ISIZE ;SHOULD WE TRY I SPACE READ ? BLE 807$ ;IF LE, NOT( MOV ISIZE,R1 ;GET SIZE OF USER I WINDOW% ASH #6,R1 ;CONVERT TO SIZE IN BYTEST* MOV R1,-(SP) ;SET UP FOR REGION LOAD CODE$ MOV IREL,R1 ;GET OFFSET TO I SPACE) ADD P.REL(R4),R1 ;SET UP RELO00*~ibjbkb a a aCATION BIAS1+ MOV #LDRBK,R0 ;GET ADDRESS OF BLOCK NUMBER)4 MOVB T.LBN(R5),(R0)+ ;SET HIGH PART OF BLOCK NUMBER CLRB (R0)+ ;CLEAR HIGH BITSR ;DC4301 .IF DF,E$$LBN ; EXTENDED LOGICAL BLOCKS ;DC430  ;DC4303 TSTB $FMSK6 ; SYSTEM SUPPORT 32-BIT LBNS ;DC430 , BPL 806$ ; IF PL, NOPE, CONTINUE ;DC430: MOVB T.LBNX(R5),-1(R0) ; LOAD HIGH ORDER LBN BYTE ;DC430$806$: ; REFERENCE LABEL ;DC430 ;DC430 .ENDC ;DF,E$$LBN ;DC430 ;DC4303 MOV T.LBN+1(R5),(R0) ;SET LOW PART OF BLOCK NUMBERS2 SUB T.ISIZ(R5),(R0) ;ADJUST BACKWARDS TO START OF SBC -(R0) ;I SPACE) CLR ISIZE ;INDICATE FINAL PHASE OF LOADD* JMP 65$ ;GO LOAD USER DATA SPACE SECTION807$: ;REFERENCE LABEL4 .ENDC ; DF U$$DAS;P5; POST PROCESSING FOR CHECKPOINT WRITE (SYSTEM STATE)O;NG; HERE THE LOADER CHECKS THE I/O STATUS, DEALLOCATES THE TASK HEADER IFG; THE REGION WAS A TASK REGION, AND DETERMINES IF THE REGION PCB SHOULD H; BE ENTERED INTO THE PARTITION WAIT QUEUE. TASK REGIONS ALWAYS GO INTOG; THE PARTITION WAIT QUEUE AND COMMONS GO IN IF P.PRI IS NONZERO (THERE)E; IS A RESIDENT MAPPED TASK). FINALLY THE REGIONS MEMORY IS RELEASEDOE; ALLOWING $NXTSK TO ATTEMPT TO BRING IN THE HIGHEST PRIORITY WAITING$ ; REGION.P; /81$: CALL $SWSTK,$LOADR ;SWITCH TO SYSTEM STATEO82$:;+; ** W A R N I N G **O;A9; SPM HOOKPOINT - LOADR CALLS DUMMY ROUTINE FOR HOOKPOINTS;E); DO NOT CHANGE THE INSTRUCTION FOLLOWINGL; LABEL WITHOUT CHECKING SPM;-) CALL @$SPV03 ;CALL HOOKABLE ENTRY POINT $ BIT #PS.OUT,(R3) ;REGION IN MEMORY? BNE 870$ ;IF NE NO$ BIT #PS.COM,(R3) ;IS THIS A COMMON? BEQ 825$ ;IF EQ NO1 BIT #P2.CPC,P.ST2(R4) ;IS THIS A CPCR CKP WRITE?  BEQ 825$ ;IF EQ NO TSTB IOSB ;SUCCESSFUL WRITE? BMI 90$ ;IF MI NO$/ BR 91$ ;OTHERWISE AVOID REAL CHECKPOINT WRITE* ;PARTITION DEALLOCATION 4825$: BIT #PS.DEL,(R3) ;IS REGION MARKED FOR DELETE? BEQ 83$ ;IF EQ NOH. TST P.ATT(R4) ;IS THERE ANYONE LEFT ATTACHED? BNE 83$ ;IF NE YES MOV R4,R1 ;COPY PCB POINTERN! CALL $RLPR1 ;RELEASE ITS MEMORYM MOV R4,R0 ;COPY PCB POINTER4 CALLR $RLCPS ;RELEASE CHECKPOINT SPACE & DEA PCB'S"83$: TSTB IOSB ;SUCCESSFUL WRITE? BMI 90$ ;IF MI NO .IF DF E$$XPR2 BIT #PS.AST,P.STAT(R4) ;REGION HAVE AST PENDING ?, BNE 84$ ;IF NE YES, P.SWSZ IS AST LISTHEAD ;NOT SWAP SIZE.D3 MOV P.SWSZ(R4),P.SIZE(R4) ;SET SIZE FROM SWAP SIZED84$: ;REFERENCE LABEL .ENDC+ BIS #PS.OUT,(R3) ;SET REGION OUT OF MEMORYB& CLR $LDPCB ;CLEAR LOADER PCB POINTER) BIT #PS.COM,(R3) ;IS IT A COMMON REGION?R- BEQ 844$ ;IF EQ, NO - MUST BE A TASK REGIONP1 CLRB P.PRI(R4) ;RE-INITIALIZE PRIORITY OF COMMON + TSTB P.RMCT(R4) ;ANYONE MAPPED TO COMMON ?- BEQ 85$ ;IF EQ, NO - LEAVE PRIORITY AT ZERO  MOV R4,R1 ;COPY PCB POINTERE( ADD #P.ATT,R1 ;POINT TO ATTACHMENT LIST ASSUME A.PCBL&841$: MOV (R1),R1 ;GET FIRST/NEXT ADB BEQ 843$ ;IF EQ, END OF LIST4 TSTB A.MPCT(R1) ;TASK MAPPED THRU THIS DESCRIPTOR ?. BEQ 841$ ;IF EQ, NO - DON'T LOOK AT PRIORITY( MOV A.TCB(R1),R0 ;GET MAPPED TASK'S TCB: CMPB P.PRI(R4),T.PRI(R0) ;REGION PRIORITY ALREADY GREATER ;THAN SOMEONE ELSES TASK ?) BHIS 841$ ;IF SO, DON'T UPDATE PRIORITYO3 MOVB T.PRI(R0),P.PRI(R4) ;UPDATE REGION'S PRIORITYP& BR 841$ ;AND EXAMINE NEXT ATTACHMENT8843$: INCB P.PRI(R4) ;COMMON REGION'S PRIORITY IS ALWAYS0 BR 85$ ;ONE GREATER THAN HIGHEST PRIORITY TASK844$: ;REFERENCE LABELI .IF DF A$$CNT" MOV P.TCB(R4),R0 ;GET TCB ADDRESS MOV KISAR6,-(SP) ;SAVE MAPPINGK+ MOV T.ACN(R0),KISAR6 ;MAP ACCOUNTING BLOCKA BEQ 845$ ;IF EQ, NO ACCOUNTING+ CMPB #BT.TAB,@#B.TYP+140000 ;IS THIS A TAB  BNE 845$ ;IF NE NO0 ADD #1,@#B.TCKP+2+140000 ;COUNT TASK CHECKPOINT ADC @#B.TCKP+140000 ;'845$: MOV (SP)+,KISAR6 ;RESTORE MAPPINGA .ENDC ;A$$CNT- MOV P.HDR(R4),R0 ;GET ADDRESS OF TASK HEADERI .IF DF X$$HDR2 BEQ 85$ ;IF EQ EXTERNAL HEADER, DON'T DEALLOCATE .ENDC ; DF X$$HDR1 MOV H.HDLN(R0),R1 ;GET LENGTH OF HEADER IN BYTESM CALL $DEACB ;DEALLOCATE HE002t__DATADATADATADATAADER 85$: MOV R4,R1 ;SET PCB ADDRESS) TSTB P.PRI(R1) ;DOES IT HAVE A PRIORITY?- BEQ 87$ ;IF EQ NO, DO NOT PUT IN WAIT QUEUEB9 MOV P.MAIN(R1),R0 ;CALCULATE ADDR OF WAIT QUEUE LISTHEADH ADD #P.WAIT,R0 ;T7 CALL $QINSP ;INSERT TASK BACK IN PARTITION WAIT QUEUE%87$: CALLR $RLPR1 ;RELEASE PARTITIONG870$: BR 110$ ;EXTEND BRANCHF;H); CHECKPOINT WRITE FAILURE (SYSTEM STATE)';EF; ON CHECKPOINT WRITE FAILURES A DIAGNOSTIC MESSAGE BLOCK IS QUEUED TOB; TKTN AND THE STATUS OF THE REGION AND ANY MAPPED TASKS IS RESET,F; ALLOWING THE TASKS TO RUN AS IF THE CHECKPOINT WRITE REQUEST HAD NOTF; OCCURED. ANY CHECKPOINT SPACE ALLOCATED FOR THE REGION IS RELEASED.;T190$: MOV #T.NCWF,R0 ;SET CHECKPOINT WRITE FAILUREI MOV R4,R5 ;COPY PCB ADDRESSI) MOV $SAHPT,R4 ;PICK UP PTR TO OWN HEADERT MOV KISAR6,-(SP) ;SAVE MAPPINGA" MOV $SAHDB,KISAR6 ;MAP OWN HEADER5 MOV H.LUN(R4),R4 ;PICK UP UCB ADDRESS OF WRITE ERRORS" MOV (SP)+,KISAR6 ;RESTORE MAPPING CALL $DVMSG ;OUTPUT MESSAGET$ MOV R5,R4 ;RESET PCB ADDRESS IN R4; H; UNBLOCK MAPPED TASKS & FREE CHECKPOINT SPACE (SYSTEM STATE SUBROUTINE);EG; THIS ROUTINE IS CALLED AFTER A REGION LOAD OPERATION OR AN UNSUCCESS-:F; FULL CHECKPOINT WRITE OPERATION TO UNBLOCK ALL MAPPED TASKS AND FREEG; ANY SPACE WHICH MAY BE ALLOCATED IN A CHECKPOINT FILE. IF THE REGIONV<; HAS HAD A LOAD FAILURE, THEN ALL MAPPED TASKS ARE ABORTED.; ; INPUTS:B;D; R4=PCB ADDRESS.S;M ; OUTPUTS:; ; R4 AND R5 PRESERVED.;M;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 MAPPED2 BIT #PS.LFR,P.STAT(R4) ;LOAD FAILURE THIS REGION? BEQ 925$ ;IF EQ NO1 MOV R2,-(SP) ;SAVE ATTACHMENT DESCRIPTOR ADDRESSC( 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 ACTIVE4$ 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 ATLM4 MOV (SP),R2 ;RESTORE ATTACHMENT DESCRIPTOR ADDRESS)923$: CLRB A.MPCT(R2) ;ZERO MAPPING COUNT#& MOV A.TCB(R2),R1 ;POINT TO MAPPED TCB6 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?9 BEQ 924$ ;IF EQ NO5 MOV #S.CCRF,R0 ;SET CODE FOR CHECKPOINT READ FAILUREV924$: CALL $ABTSK ;ABORT TASK9241$: MOV (SP)+,R2 ;RESTORE R2 BR 93$ ;2925$: 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 TASK693$: MOV (R2),R2 ;POINT TO NEXT ATTACHMENT DESCRIPTOR BNE 92$ ;IF NE THERE IS ONEE!94$: MOV R4,R2 ;COPY PCB POINTER / ADD #P.STAT,R2 ;POINT AT PARTITION STATUS WORD4% BIT #PS.COM,(R2)+ ;IS THIS A COMMON?  BEQ 95$ ;IF EQ NOS, 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 ADDRESSE1 CALLR $NXTSK ;REALLOCATE PARTITION IF NECESSARYS2945$: BIT #PS.LFR,-(R2) ;LOAD FAILURE THIS REGION? BNE 96$ ;IF NE YES!95$: MOV R4,R0 ;COPY PCB POINTERV( CALLR $RLCPS ;RELEASE CHECKPOINT SPACE96$: RETURN ;T;T0; POST PROCESSING FOR REGION LOAD (SYSTEM STATE) ; COPY HEADER & CHECK I/O STATUS;(C; HERE THE LOADER SETS UP A COPY OF THE TASK HEADER IN THE POOL AND2,; DETERMINES IF A LOAD FAILURE HAS OCCURRED.;+9110$: BIC #PS.OUT!PS.LFR,(R3) ;CLEAR OUT AND LOAD FAILUREP& BIT #PS.COM,(R3) ;IS REGION A COMMON? BEQ 112$ ;IF EQ NO' JMP 143$ ;YES, SKIP HEADER PROCESSINGR112$: ;REFERENCE LABELI, MOV P.REL(R4),KISAR6 ;MAP TO TASK PARTITION .IF DF X$$HDRE+ TSTB T.HDLN(R5) ;TASK HAVE EXTERNAL HEADER 1 BEQ 113$ ;IF EQ, NO. CALCULATE OFFSET TO HEADERO$ BIT #PS.CKP,(R3) ;CHECKPOINT READ ?/ BNE 114$ ;IF NE, YES - EXAMINE EXTRNAL HEADERN113$:O .ENDC ; DF 00:~ibjbkb a a aX$$HDR3 ADD T.OFF(R5),KISAR6 ;ADD IN OFFSET TO TASK HEADERU2114$: MOV 140000+H.HDLN,R1 ;ASSUME SUCCESSFUL READ) CMPB #17,140000+H.IPS ;VALID TASK IMAGE?F/ BNE 115$ ;IF NE NO TREAT AS UNSUCCESSFUL READ TSTB IOSB ;SUCCESSFUL READ?V BPL 120$ ;IF PL YEST*115$: MOVB #-1,IOSB ;INDICATE LOAD FAILURE9 MOV #H.NLUN+2+W.BLGH+2,R1 ;SETE LENGTH OF MINIMUM HEADER,- CLR 140000+H.NLUN ;CLEAR NUMBER OF LUNS WORD()120$: MOV R1,2(SP) ;SAVE LENGTH OF HEADERY .IF DF X$$HDR- TSTB T.HDLN(R5) ;TASK HAVE EXTERNAL HEADER ?O( BEQ 125$ ;IF EQ NO, GO TRY TO ALLOCATE4 MOV #140000,R0 ;SET VIRTUAL ADDRESS OF XTRNL HEADER. BIT #PS.CKP,(R3) ;CHECKPOINT READ OPERATION ?6 BNE 122$ ;IF NE YES, NO HEADER MANIPULATION REQUIRED0 CLR P.HDR(R4) ;INDICATE EXTERNAL HEADER FOR PCB9 MOV P.REL(R4),HDRDB ;SET BLOCK NUMBER OF EXTERNAL HEADERB BR 131$ ;RE-ENTER CODE FLOWM+122$: JMP 1401$ ;STRETCH BRANCH FROM ABOVEU .ENDC ; DF X$$HDR4125$: CALL $ALOCB ;ALLOCATE A BLOCK FOR TASK HEADER! BCC 130$ ;IF CC BLOCK ALLOCATEDA/ BIS #PS.OUT,(R3) ;MARK REGION AS OUT OF MEMORY;VL; NO NEED TO CHANGE FOLLOWING REFERENCE TO $HEADR TO SUPPORT EXTERNAL HEADER;E( MOV @$HEADR,R0 ;GET SAVED STACK POINTER% MOV #81$,4(R0) ;ALTER RETURN ADDRESSH) CALLR $TKWSE ;WAITFOR SIGNIFICANT EVENTM2130$: MOV R0,P.HDR(R4) ;SAVE ADDRESS OF NEW HEADER+131$: MOV #140000,R2 ;SET APR6 ADDRESS BIAS 4 MOV R0,R1 ;CALC RELATIVE HEADER GUARD WORD POINTER TST -(R1) ;  MOV R1,H.GARD(R2) ;8 MOV R1,H.WND(R2) ;CALCULATE NUMBER OF WINDOW BLOCKS PTR1 MOV H.NLUN(R2),R1 ;CALCULATE NUMBER OF LUN WORDS ASL R1 ; ASL R1 ;% ADD #H.NLUN+4,R1 ;FINISH CALCULATIONO ADD R1,H.WND(R2) ;E1 MOV 2(SP),R1 ;RETRIEVE LENGTH OF HEADER IN BYTES1( MOV R1,H.HDLN(R2) ;SET LENGTH OF HEADER1 ADD R1,H.GARD(R2) ;FINISH GUARD WORD CALCULATIONR .IF DF X$$HDR .IF DF F$$MAP; CLR H.FMAP(R2) ;ASSUME TASK DOES NOT HAVE FAST MAP ENABLEDE .ENDC ; DF F$$MAP .IF DF C$$DFB & C$$RTB; CLR H.LUTE(R2) ;ASSUME TASK DOES NOT HAVE RUN TIME BINDINGN .ENDC ; DF C$$DFB & C$$RTB,+ TST P.HDR(R4) ;TASK HAVE EXTERNAL HEADER ? BNE 139$ ;IF NE NO, GO COPYF MOV R4,-(SP) ;SAVE PCB ADDRESS(- MOVB T.HDLN(R5),R0 ;GET SIZE OF TOTAL HEADERR .IF DF F$$MAP3 BIT #T4.FMP,T.ST4(R5) ;TASK HAVE FAST MAP ENABLED?; BEQ 133$ ;IF EQ NO8 SUB #H$$FMX,R0 ;SUBTRACT OUT SIZE OF FAST MAP EXTENSION133$:A .ENDC ; DF F$$MAP .IF DF C$$DFB & C$$RTB.3 BIT #T4.DFB,T.ST4(R5) ;TASK HAVE DEFERRED BINDING?L BEQ 135$ ;IF EQ NO0 BIT #F5.RTB,$FMSK5 ;TASK HAVE RUN TIME BINDING? BEQ 135$ ;IF EQ NO3 MOV H.NLUN(R2),R1 ;CALCULATE SIZE OF LUT EXTENSION ASL R1 ; ASL R1 ;- ADD #77,R1 ;ROUND TO NEAREST 32. WORD BLOCKT ASH #-6,R1 ; MOV R1,H.LUTE(R2) ;SAVE SIZET/ SUB R1,R0 ;SUBTRACT OUT SIZE OF LUT EXTENSION135$:3 .ENDC ; DF C$$DFB & C$$RTB  ASH #6,R0 ;CONVERT TO BYTEST6 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 WORD,) MOV HDRDB,KISAR6 ;MAP TO EXTERNAL HEADERC. MOV #140000,R0 ;SET VIRTUAL ADDRESS OF HEADER .IF DF F$$MAP3 BIT #T4.FMP,T.ST4(R5) ;TASK HAVE FAST MAP ENABLED?S BEQ 1371$ ;IF EQ NOD2 MOVB T.HDLN(R5),R1 ;GET LENGTH OF HEADER IN BYTES# ASH #6,R1 ;CONVERT TO BYTE OFFSET 4 ADD #140000-<64.*H$$FMX>,R1 ;POINT TO FAST MAP AREA0 MOV R1,H.FMAP(R0) ;SET ADDRESS OF FAST MAP AREA3 MOV #<<+15.>/16.>,R2 ;GET NUMBER OFS ;PASSES THROUGH LOOP137$: .REPT 16.R* CLR (R1)+ ;CLEAR A WORD OF FAST MAP AREA .ENDR SOB R2,137$ ;LOOP UNTIL DONE1371$: .ENDC ; DF F$$MAP .IF DF C$$DFB & C$$RTB3 BIT #T4.DFB,T.ST4(R5) ;TASK HAVE DEFERRED BINDING?B BEQ 138$ ;IF EQ NO0 BIT #F5.RTB,$FMSK5 ;TASK HAVE RUN TIME BINDING? BEQ 138$ ;IF EQ NO< MOVB T.HDLN(R5),R1 ;GET LENGTH OF HEADER IN 32.00Bt__DATADATADATADATA WORD BLOCKS .IF DF F$$MAP4 BIT #T4.FMP, T.ST4(R5) ; TASK HAVE FAST MAP ENABLED BEQ 1375$ ; IF EQ NOU2 SUB #H$$FMX, R1 ; TAKE FAST MAPPING INTO ACCOUNT1375$: .ENDC ; DF F$$MAP TST H.LUTE(R0) ;ARE THERE LUNS? BEQ 138$ ;IF EQ NO LUNS37 SUB H.LUTE(R0), R1 ;SUBTRACT OUT SIZE OF LUT EXTENSIONB! ASH #6, R1 ;GET OFFSET IN BYTESE, ADD #MAP6, R1 ;GET ADDRESS OF LUT EXTENSION& MOV R1,H.LUTE(R0) ;STORE IT IN HEADER- ADD #H.NLUN,R0 ;GET ADDRESS OF LUT IN HEADER * MOV (R0)+,R2 ;GET NUMBER OF WORDS TO COPY ASL R2 ; MOV R2,-(SP) ;SAVE.>1377$: MOV (R0)+,(R1)+ ;COPY THE HEADER LUT INTO THE EXTENSION SOB R2,1377$ ;LOOP UNTIL DONE1 MOV #MAP6+H.NLUN+2,R1 ;POINT TO HEADER LUT AGAINT MOV (SP)+,R2 ;GET SIZE OF LUT'1378$: CLR (R1)+ ;CLEAR OUT HEADER LUT, SOB R2,1378$ ;LOOP UNTIL DONE6138$: MOV #MAP6, R0 ;POINT BACK TO BEGINNING OF HEADER .ENDC ; DF C$$DFB & C$$RTBN BR 14000$ ;RE-ENTER CODE .ENDC ; DF X$$HDR&139$: ASR R1 ;CONVERT LENGTH TO WORDS5140$: MOV (R2)+,(R0)+ ;MOVE TASK HEADER TO CORE BLOCKV! DEC R1 ;ANY MORE WORDS TO MOVE?( BGT 140$ ;IF GT YESU- MOV P.HDR(R4),R0 ;GET ADDRESS OF TASK HEADER %14000$: TSTB IOSB ;SUCCESSFUL READ ?O BMI 1421$ ;IF MI NOV$ BIT #PS.CKP,(R3) ;CHECKPOINT READ?' BNE 1401$ ;IF NE YES, DON'T TOUCH LUT3 .IF DF S$$LIB8 CLR H.SMAP(R0) ;INITIALIZE SUPERVISOR AND DATA MAP MASK .ENDC ; DF S$$LIB5 CALL REBIND ;BIND LUT AND WINDOWS TO EXEC ADDRESSES$1401$: ;REFERENCE SYMBOLT .IF DF M$$PRO- MOV H.WND(R0),R1 ;POINT TO NUMBER OF WINDOWSC' MOV (R1)+,-(SP) ;GET NUMBER OF WINDOWSB,141$: TST W.BPCB(R1) ;IS THIS WINDOW MAPPED? BEQ 142$ ;NO IF EQ8 MOV W.BATT(R1),R2 ;GET ADDRESS OF ATTACHMENT DESCRIPTOR BEQ 142$ ;IF EQ NOT ATTACHED1 BITB #AS.RBP,A.STAT(R2) ;SHOULD BYPASS BE RESET?U BEQ 1411$ ;NO IF EQ- BIC #100000,W.BLPD(R1) ;RESET BYPASS IN LPDR $ BICB #AS.RBP,A.STAT(R2) ;RESET FLAG51411$: BITB #AS.SBP,A.STAT(R2) ;SHOULD BYPASS BE SET?1 BEQ 142$ ;NO IF EQ+ BIS #100000,W.BLPD(R1) ;SET BYPASS IN LPDRP$ BICB #AS.SBP,A.STAT(R2) ;RESET FLAG*142$: ADD #W.BLGH,R1 ;POINT TO NEXT WINDOW DEC (SP) ;ANY WINDOWS LEFT?? BGT 141$ ;YES IF GT TST (SP)+ ;CLEAN THE STACK .ENDC1421$: ;REFERENCE SYMBOLE .IF DF S$$WPC4 MOVB $SWPR,H.SPRI(R0) ;INITIALIZE SWAPPING PRIORITY .ENDC3 MOV H.WND(R0),R1 ;POINT TO NUMBER OF WINDOW BLOCKSC, CALL $MAPTK ;MAP FIRST TASK ADDRESS WINDOW& CMPB #17,H.IPS(R0) ;VALID TASK IMAGE?0 BNE 1431$ ;IF NE NO TREAT AS UNSUCCESSFUL READ143$: TSTB IOSB ;READ ERROR?B BPL 1439$ ;IF PL NOG;$$; REGION LOAD FAILURE (SYSTEM STATE);DH; THE FIXED BIT IS CLEARED AND PS.LFR IS SET TO DENOTE THE LOAD FAILURE.D; IF THE REGION IS A TASK REGION, THEN THOSE HEADER FIELDS WHICH AREC; REQUIRED TO GET THE TASK THROUGH THE ABORT PROCESS ARE FABRICATED.; HERE. (ALL MAPPED TASKS ARE ABORTED LATER.);O-1431$: BIS #PS.LFR,(R3) ;SIGNIFY LOAD FAILUREW) BIT #PS.COM,(R3) ;IS IT A COMMON REGION? BNE 1439$ ;IF NE YES% MOV #77406,(R1) ;SET ACCESS LAST PDRS: MOV #UISDR0&377+<1*256.>,-(R1) ;SET FIRST PDR AND # PDR'S9 MOV H.WND(R0),-(SP) ;GET ADDR OF NUMBER OF WINDOW BLOCKSD) MOV #1,@(SP)+ ;INDICATE ONE WINDOW BLOCK .IF DF, U$$DASA; BIT #T4.DSP,T.ST4(R5) ;TASK BUILT WITH SEPARATE I/D SPACE?  BEQ 1435$ ;IF EQ, NO9 MOV (R1),-20(R1) ;COPY FIRST PDR AND # PDR'S TO WINDOW 0A- MOV 2(R1),-16(R1) ;COPY LAST PDR TO WINDOW 031435$: ;REFERENCE LABEL .ENDC ; DF U$$DAS7 CLR H.FPSA(R0) ;CLEAR FLOATING POINT SAVE AREA POINTERR1 MOV R0,H.GARD(R0) ;INITIALIZE GUARD WORD POINTER, ADD #H.TKVL+2,H.GARD(R0) ;R;M0; POST PROCESSING FOR REGION LOAD (SYSTEM STATE)"; INITIAL TASK LOAD INITIALIZATION;NH; FOR THE INITIAL LOAD OF A TASK REGION, REQUEST OR FIX, THE LOADER MUSTB; ATTACH THE TASK TO ANY REGIONS WHICH IT HAS BEEN LINKED TO. THEG; TASK'S ATTACHMENT QUEUE MAY NOT BE EMPTY DUE TO THE SEND BY REFERENCEOF; DIRECTIVE. IF THE TASK IS NOT BEING FIXED, $BILDS IS CALLED TO INIT7; ITS STACK AND PLACE THE TASK IN THE ACTIVE TASK LIST..;D 00J~ibjbkb a a a1439$: BIT #PS.COM,(R3) ;COMMON? BNE 150$ ;IF NE, YES .IF DF, U$$DAST% CALL CALDMK ;CALCULATE D SPACE MASK) .ENDC ; DF U$$DAS# BIT #PS.CKP,(R3) ;CHECKPOINT READ?O BNE 150$ ;IF NE YESQ3 MOV H.WND(R0),R3 ;POINT TO NUMBER OF WINDOW BLOCKSY" MOV #LDRBK,R1 ;POINT TO SAVE AREA. MOV (R3)+,(R1)+ ;SAVE NUMBER OF WINDOW BLOCKS MOV R5,R0 ;COPY TCB POINTERO7 ADD #T.ATT,R0 ;POINT TO ATTACHMENT DESCRIPTOR LISTHEAD $ 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$$DASA) MOV (R0),(R1) ;SAVE SECOND LISTHEAD WORD  .IFTF ; DF U$$DAS2 MOV (SP)+,(R0) ;REINITIALIZE SECOND LISTHEAD WORD .IFT ; DF U$$DAST- CLR (R1) ;INIT TEMPORARY TO ZERO (INDICATES  ;NOT D-SPACE TASK LATER+0 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 ? BEQ 145$ ;IF EQ NO- MOV R3,(R1) ;SAVE POINTER TO I SPACE WINDOWS( ADD #W.BLGH,R3 ;POINT TO D SPACE WINDOW& DEC -6(R1) ;COUNT AS ONE LESS WINDOW1 BIT #T4.MUT,T.ST4(R5) ;IS IT A MULTI-USER TASK ?E 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$$DAS5145$: CLR R1 ;CLR NEXT ATTACHMENT DESCRIPTOR ADDRESS 0 MOV (R3),R2 ;PICK UP NEXT PCB ADDRESS (W.BPCB) BEQ 148$ ;IF EQ THERE IS NONEQ .IFT ; DF U$$DASV6 CMP R3,MUDPT ;IS THIS RO D WINDOW IN AN I/D MU TASK ? BNE 1455$ ;IF NE NOD2 MOV W.BATT-W.BLGH(R3),R1 ;GET ADDRESS OF RO I ADB- MOV R1,W.BATT(R3) ;SET ADDRESS OF ATTACHMENTQ ;DESCRIPTOR+ BR 1481$ ;AND GO SET MAPPING COUNT IN ADBA .ENDC ; DF U$$DAS61455$: 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;L; NO NEED TO CHANGE FOLLOWING REFERENCE TO $HEADR TO SUPPORT EXTERNAL HEADER;- MOV @$HEADR,R0 ;RETRIEVE SAVED STACK POINTERA. MOV R3,(R0)+ ;SAVE WINDOW BLOCK POINTER AS R4% MOV R5,(R0)+ ;SAVE TCB ADDRESS AS R5O& MOV #147$,(R0) ;MODIFY RETURN ADDRESS* CALLR $TKWSE ;WAIT FOR SIGNIFICANT EVENT0147$: CALL $SWSTK,$LOADR ;SWITCH TO SYSTEM STATE) MOV R4,R3 ;RESTORE WINDOW BLOCK POINTER BR 145$ ;REATTEMPT THE ATTACH =148$: MOV R1,W.BATT(R3) ;SET ADDRESS OF ATTACHMENT DESCRIPTORF$ BEQ 1485$ ;IF EQ WINDOW NOT MAPPED& MOV T.PCB(R5),R4 ;RESTORE PCB ADDRESS6 CMP A.PCB(R1),R4 ;IS ATTACHED REGION THE TASK REGION?- BEQ 1481$ ;IF EQ YES, DON'T ACCESS IT AGAINK MOV R5,R0 ;COPY TCB ADDRESSS MOV R3,-(SP) ;SAVE R3 .IF DF M$$PRO MOV R1,-(SP) ;SAVE R1" MOV A.PCB(R1),R1 ;GET PCB ADDRESS1 CALL $SETBP ;SET UP CACHE BYPASS AS APPROPRIATE MOV (SP)+,R1 ;RESTORE R1  .ENDC4 INCB A.MPCT(R1) ;INIT MAPPING COUNT THIS DESCRIPTOR+ MOV A.PCB(R1),R1 ;POINT TO ATTACHED REGION# CALL $ACCRG ;ACCESS COMMON REGION MOV (SP)+,R3 ;RESTORE R3P BR 1485$ ;:1481$: INCB A.MPCT(R1) ;INIT MAPPING COUNT THIS DESCRIPTOR11485$: ADD #W.BLGH,R3 ;POINT TO NEXT WINDOW BLOCK0) DEC LDRBK ;ANY MORE WINDOWS TO PROCESS?3 BGT 145$ ;IF GT YES1 MOV LDRBK+2,@T.ATT+2(R5) ;ADD ON OLD DESCRIPTORSA BEQ 149$ ;IF EQ IT WAS NULLA; MOV LDRBK+4,T.ATT+2(R5) ;POINT TO LAST ORIGINAL DESCRIPTORN149$: ;REFERENCE LABELNG; FOR AN I/D TASK, WE SKIPPED THE I SPACE WINDOW IN THE PRECEDING CODE.OG; WE WILL NOW FIX UP THE I SPACE WINDOW TO POINT TO THE SAME ATTACHMENT L; DESCRIPTOR AS THE D SPACE WINDOW. SINCE THIS MAPPING IS STATIC, IT DOESN'TK; MATTER THAT THE MAPPING COUNT IN THE ADB WILL BE 1 INSTEAD OF 2, AND THISPG; SIMPLIFIES THE MANAGEMENT OF T.STAT DURING THE TASK REQUEST SEQUENCE.E .IF DF U$$DAS3 MOV LDRBK+6,R0 ;GET POINTER TO TASK I SPACE WINDOWN% BEQ 1495$ ;IF EQ NOT A D SPACE TASK < MOV W.BATT+W.BLGH(R0),W.BATT(R0) ;POINT TASK I SPACE WINDOW+ ;TO SAME ATTACHEMENT DESCRIPTOR AS TASKO ;D SPACE WINDOWW .ENDC ; DF U$$DAS3149500Rt__DATADATADATADATA$: BIT #PS.FXD,P.STAT(R4) ;REGION BEING FIXED ?I BNE 170$ ;IF NE YEST$ MOV R5,R0 ;SET ADDRESS OF TASK TCB3 CALL $BILDS ;BUILD A STACK FOR TASK JUST STARTINGP;I0; POST PROCESSING FOR REGION LOAD (SYSTEM STATE); FINAL PROCESSING;.1; HERE THE LOADER PERFORMS THE FOLLOWING ACTIONS:K;S/; 1. UNBLOCK ALL TASKS MAPPED TO THE REGION.SF; 2. FREE UP ANY DYNAMIC CHECKPOINT SPACE FROM WHICH THE REGION MAY; HAVE BEEN READ.D@; 3. IF INSTALLED COMMON IS ONLY TO BE CHECKPOINTED TO SYSTEM;; CHECKPOINT FILE (PS.NWB=1), DEALLOCATE DISK PCB AND0(; CONVERT COMMON TO A PLAS REGION.?; 4. CHECK FOR A PENDING CHECKPOINT REQUEST AND INITIATE THE3; CHECKPOINT OPERATION IF THERE IS A REQUEST.)7; 5. DECLARE RECEIVE AST'S FOR TASKS'S WITH NONEMPTYF; RECEIVE QUEUES. ;1 ; INPUTS:L;A; R4=PCB ADDRESS OF REGION. "; R5=TCB ADDRESS (IF TASK REGION).;A ; OUTPUTS:;H3; R4 IS PRESERVED IF COMMON REGION OR LOAD FAILURE.D; R5 IS PRESERVED.;H+150$: CALL 170$ ;SERVICE REGION LOAD ASTS,P ;DEALLOCATE CKP SPACEC ;AND UNBLOCK TASKS3 MOV R4,R3 ;RECALCULATE ADDRESS OF PCB STATUS WORD  ADD #P.STAT,R3 ;A, BIT #PS.LFR,(R3) ;LOAD FAILURE THIS REGION? BEQ 155$ ;IF EQ NO) BIT #PS.COM,(R3) ;IS IT A COMMON REGION?'( BEQ 155$ ;IF EQ NO, DO NOT FREE MEMORY/ BIC #PS.CKR,(R3) ;CLEAR CHECKPOINT REQUEST BIT , BIS #PS.OUT,(R3) ;MARK REGION OUT OF MEMORY$ MOV R4,R1 ;COPY REGION PCB ADDRESS' CALLR $RLPR1 ;RELEASE REGION'S MEMORYR,155$: BIC #PS.CKP,(R3) ;CLEAR CHECKPOINT BIT5 BIT #PS.NWB,(R3) ;COMMON CHECKPOINT TO SYSTEM FILE ?K/ BEQ 157$ ;IF EQ, NO. CHECKPOINTS TO TASK FILET* BIC #PS.NWB,(R3) ;DON'T NEED THIS ANYMORE2 MOV P.DPCB-P.STAT(R3),R0 ;GET ADDRESS OF DISK PCB( CLR P.DPCB-P.STAT(R3) ;AND ZERO POINTER% MOV #P.DLGH,R1 ;GET SIZE OF DISK PCB  MOV R3,-(SP) ;SAVE PCB POINTERC" CALL $DEACB ;DEALLOCATE DISK PCB! MOV (SP)+,R3 ;RESTORE COMMON PCBM.157$: BIT #PS.CKR,(R3) ;CHECKPOINT REQUESTED ? BEQ 169$ ;IF EQ NO0 BIC #PS.CKR,(R3) ;CLEAR CHECKPOINT REQUEST FLAG MOV R4,R1 ;SET ADDRESS OF PCBC# CALLR $ICHKP ;INITIATE CHECKPOINT; 169$: RETURN7170$: BIT #PS.AST,P.STAT(R4) ;REGION LOAD AST PENDING ?Y BEQ 180$ ;IF EQ NO4 MOV P.STAT(R4),-(SP) ;SAVE CURRENT STATUS OF REGION5 BIC #^C,(SP) ;CLEAR ALL BUT OUT & CKP , BIC (SP),P.STAT(R4) ;CLEAR THOSE FOR REGION MOV R5,-(SP) ;SAVE NON-VOLATILE MOV R4,-(SP) ;REGISTERS0 MOV P.SWSZ(R4),R0 ;POINT TO FIRST (OR ONLY) AST# MOV (R0),P.SWSZ(R4) ;CLOSE UP LISTR! BNE 175$ ;IF NE STILL MORE LEFTG. BIC #PS.AST,P.STAT(R4) ;INDICATE NO ASTS LEFT5 MOV P.SIZE(R4),P.SWSZ(R4) ;RESET SWAP SIZE FROM SIZEP'175$: CALL $DSPKA ;DISPATCH KERNEL AST 1 DEC T.STAT(R0) ;UNBLOCK THE TASK FOR THIS REGIONS BNE 177$ ;IF NE STILL BLOCKEDC/ CALL $SETCR ;SET CONDITIONAL SCHEDULE REQUEST *177$: MOV (SP),R1 ;GET REGION PCB ADDRESS. CALL $DEARG ;DEACCESS REGION ON TASKS BEHALF MOV (SP)+,R4 ;RESTORE REGISTERS MOV (SP)+,R5 ;(4 BIS (SP)+,P.STAT(R4) ;RESET OUT/CKP STATUS TO PRIOR BR 170$ ;AND GO AGAINL180$: CALLR 91$ ;UNBLOCK TASKSC;O=; REBIND - BIND INSTALLED TASKS TO EXEC DATABASE AT LOAD TIMEZ;=; INSERTS CORRECT UCB ADDRESSES INTO LUT FROM DEVICE LIST ANDOE; PCB ADDRESSES INTO TASK ADDRESS WINDOW BLOCKS FROM TASK PCB VECTOR.S;R?; REPLACES LOADR ROUTINE SCHDR FOR TASKS USING DEFERRED BINDINGIC; (NOTE THAT EXISTING SCHDR FUNCTION MUST BE PRESERVED AND USED FOR((; TASKS WHICH OVERRIDE DEFERRED BINDING);%; CREATED 5-FEB-1987 BY L.B. MCCULLEYA; ; INPUTS:; ; R0 = HEADER ADDRESS; R5 = TCB ADDRESS;C ; OUTPUTS:;@; IOSB MAY BE SET TO -1 IF SCHDR IS CALLED AND HEADER IS INVALID; B; TASK LUT AND WINDOW BLOCKS (W.BPCB OFFSET) CORRECTLY INITIALIZED; FOR THIS EXEC'S DATABASE.I;W; DESTROYS R1, R2C5; PRESERVES R0, R3, R4, R5 (ALL MEANINGFUL TO CALLER)S;IREBIND: ! SAVNR ; COROUTINE SAVES R4/R5D6 MOV R3,-(SP) ; SAVE OTHER REGISTERS NEEDED BY CALLER MOV R0,-(SP)R .IF DF C$$DFB5 BIT #F5.DFB,$FMSK5 ; SYSTEM USING DEFERRED BINDING?  BEQ 2$ 00Z~ibjbkb a a a; NO, GO CHECK HEADERT: BIT #T4.DFB,T.ST4(R5) ; THIS TASK USING DEFERRED BINDING?" BNE 5$ ; YES, GO DO THE BINDING2$:  .ENDC ; DF C$$DFB# TST $FMSK4 ; LUT SCAN DISABLED ?L* BMI 200$ ; YES, SO SKIP IT, JUST RETURN2 CALL SCHDR ; GO CHECK HEADER ALREADY BOUND OKAY+ BR 200$ ; RETURN AFTER REGISTER RESTORES  .IF DF C$$DFB5$: .IF DF C$$RTB > BIT #F5.RTB, $FMSK5 ; SHOULD LUN BINDING BE FURTHER DEFERED?4 BNE 100$ ; IF NE, YEP - JUST BIND WINDOWS FOR NOW .ENDC ; DF C$$RTB MOV R0,R3 ; R0 -> HEADERT ADD #H.NLUN,R3 ; R3 -> LUT+ MOV (R3)+,R2 ; R2 = NUMBER OF LUT ENTRIES ! BEQ 100$ ; NONE, GO DO WINDOWS$;B; GET NEXT LUN AND ASSIGN IT;B10$:' CMP (R3),#"OV ; OVERLAY PSUEDO DEVICE?U BNE 12$ ; NOE MOV T.LDV(R5),(R3)+ ; YES, GET TASK LOAD DEVICE UCB ADDRESS FROM TCBT BR 80$ ;&12$: MOV $DEVHD,R4 ; FIND DEVICE TABLE'15$: CMP D.NAM(R4),(R3) ; FOUND IT YET?I BEQ 20$ ; YES, NOW SET UNIT0#17$: MOV D.LNK(R4),R4 ; NEXT DEVICEF BNE 15$ ; MORE TO GO' ; NO MORE DEVICES, CAN'T ASSIGN LUND: CLR (R3)+ ; COULDN'T FIND MATCHING DEVICE, DON'T BIND IT BR 80$ 20$:;0; AT THIS POINT ; R2=REMAINING LUT ENTRIES; R3->UNIT # IN LUT0 ; R4->DCB3;" CLR R1 ; CREATE AN ACCUMULATOR- BISB 2(R3),R1 ; RETRIEVE DESIRED UNIT NUMBERK@ CMPB R1,D.UNIT(R4) ; CHECK FOR UNIT NUMBER IN RANGE OF THIS DCB# BLO 17$ ; TOO LOW, TRY OTHER DCBSM CMPB R1,D.UNIT+1(R4)T$ BHI 17$ ; TOO HIGH, TRY OTHER DCBS CLR R0 ; CREATE AN ACCUMULATOR8 BISB D.UNIT(R4),R0 ; EXTRACT FIRST UNIT NUMBER FROM DCB& SUB R0,R1 ; GET RELATIVE UNIT NUMBER& BEQ 22$ ; OPTIMIZATION FOR FIRST UCB# MOV D.UCBL(R4),R0 ; GET UCB LENGTHI CALL $MUL ; GET OFFSET TO UCB 222$: ADD D.UCB(R4),R1 ; GET ADDRESS OF DESIRED UCB% MOV R1,(R3)+ ; STORE UCB IN TASK LUNN980$: CLR (R3)+ ; CLEAR LUT FILES-11 WINDOW BLOCK POINTERN DEC R2 ; ALL UNITS ASSIGNED? BNE 10$ ; NO, DO NEXT ONED;I; BIND WINDOW BLOCKS; 100$:R, MOV (SP),R0 ; RESTORE R0 POINTER TO HEADER/ MOV H.WND(R0), R1 ; R1 => WINDOW BLOCK STORAGE % MOV (R1)+, R2 ; R2 = # WINDOW BLOCKSI= MOV T.PCB(R5),W.BPCB(R1) ; SET TASK REGION PCB INTO WINDOW 0, DEC R2 ; ONLY TASK REGION? BEQ 200$ ; YEP, MUST BE DONE, ADD #W.BLGH,R1 ; POINT TO NEXT WINDOW BLOCK% .IFDF U$$DAS ; USER D-SPACE SUPPORT06 BIT #T4.DSP,T.ST4(R5) ; TASK WITH SEPERATE I/D SPACE? BEQ 110$ ; NOPEI; MOV T.PCB(R5),W.BPCB(R1) ; SET TASK D-SPACE WINDOW PCB PTR  DEC R2 ; LAST REGION?( BEQ 200$ ; YEP, DONE, ADD #W.BLGH,R1 ; POINT TO NEXT WINDOW BLOCK110$:C .IFTF ;U$$DAS, MOV T.PCBV(R5),R4 ; R4 => TASK'S PCB VECTOR; BEQ 150$ ; NONE, CAN'T DO IT, GO CLEAR ANY UNUSED WINDOWS ! MOVB (R4)+,R3 ; LENGTH OF VECTORP TSTB (R4)+ ; SKIP USAGE COUNT .IFT ;U$$DASI) BIT #T4.MUT,T.ST4(R5) ; MULTI-USER TASK?U0 BEQ 120$ ; NO, SKIP RO SECTION WINDOW HANDLING< MOV (R4)+,W.BPCB(R1) ; SET PCB ADDRESS IN RO SECTION WINDOW, ADD #W.BLGH,R1 ; POINT TO NEXT WINDOW BLOCK6 BIT #T4.DSP,T.ST4(R5) ; USER D-SPACE MULTI-USER TASK?3 BNE 130$ ; YES, DO D-SPACE RO AND COUNT RO WINDOWM6 BEQ 134$ ; NO, SKIP RO D-SPACE, JUST COUNT RO WINDOW@ ; .IFF U$$DAS DROPS INTO STATIC MAPPING REBIND LOOP PROPERLY .ENDC ;U$$DASC120$: BIT #1, (R4)+ ; CLUSTER LIB PCB VECTOR ENTRY? (YES=NO WINDOW)S5 BNE 140$ ; LO BIT SET FLAGS NO WINDOW BLOCK TO INITC7130$: MOV -2(R4),W.BPCB(R1) ; SET PCB ADDRESS IN WINDOWR, ADD #W.BLGH,R1 ; POINT TO NEXT WINDOW BLOCK,134$: DEC R2 ; COUNT DOWN NUMBER OF WINDOWS( BEQ 200$ ; NO MORE WINDOWS IS ALL DONE3140$: DEC R3 ; COUNT DOWN NUMBER OF PCBS IN VECTOR4. BNE 120$ ; LOOP UNTIL ALL PCBS DONE, THEN...;;; CLEAR UNUSED WINDOW BLOCKS; 150$: " CLR W.BPCB(R1) ; CLEAR WINDOW PCB/ ADD #W.BLGH,R1 ; POINT R1 TO NEXT WINDOW BLOCKR( SOB R2,150$ ; CLEAR ALL UNUSED WINDOWS .ENDC ; DF C$$DFB200$: MOV (SP)+,R0' MOV (SP)+,R3 ; RESTORE SAVED REGISTERSS RETURNO;AH; THIS ROUTINE SCANS THE HEADER AND VALIDATES THE LUT AND WINDOW BLOCKS.C; TASKS WHICH ARE SIMULTANEOUSLY INSTALLED IN TWO DIFFERENT SYSTEMSEH00bt__DATADATADATADATA; MAY HAVE INVALID UCBS IN THE LUT OR INVALID PCBS IN THE WINDOW BLOCKS.+; IF THIS IS THE CASE, THE TASK IS ABORTED. ;C ; INPUTS:$;; R0=HEADER ADDRESS.; R5=TCB ADDRESS.#;L ; OUTPUTS:;1-; IOSB IS SET TO -1 IF THE HEADER IS INVALID.L;N; R0 - R3 ARE DESTROYED.;$ SCHDR: TST H.NLUN(R0) ;ANY LUNS? BEQ 100$ ;IF EQ NO6 BIT #T2.ABO,T.ST2(R5) ;TASK ALREADY MARKED FOR ABORT? BNE 200$ ;IF NE YESU) MOV #$DEVHD,R2 ;POINT TO DEVICE LISTHEADU$10$: MOV (R2),R2 ;POINT TO NEXT DCB BEQ 60$ ;IF EQ END OF LIST2 MOVB D.UNIT+1(R2),-(SP) ;CALCULATE NUMBER OF UCBS SUB D.UNIT(R2),(SP) ; INCB (SP) ;O+ MOV D.UCB(R2),R4 ;GET ADDRESS OF FIRST UCBS$20$: MOV R0,R1 ;COPY HEADER ADDRESS( ADD #H.NLUN,R1 ;POINT TO NUMBER OF LUNS! MOV (R1)+,R3 ;GET NUMBER OF LUNSO30$: DEC R3 ;ANY LUNS LEFT? BLT 50$ ;IF LT NO1 CMP (R1)+,R4 ;UCB MATCH?O BNE 40$ ;IF NE NOA! BIS #1,(R1) ;INDICATE UCB MATCHF(40$: TST (R1)+ ;POINT TO NEXT LUT ENTRY BR 30$ ;SCAN NEXT LUT ENTRYP)50$: ADD D.UCBL(R2),R4 ;POINT TO NEXT UCBI DECB (SP) ;ANY UCBS LEFT?; BNE 20$ ;IF NE YES TST (SP)+ ;CLEAN THE STACK BR 10$ ;SCAN NEXT DCBR'60$: MOV R0,R1 ;COPY ADDRESS OF HEADERV/ ADD #H.NLUN,R1 ;POINT TO NUMBER OF LUT ENTRIESI( MOV (R1)+,R3 ;GET NUMBER OF LUT ENTRIES70$: DEC R3 ;ANY LEFT?R BLT 100$ ;IF LT NO% TST (R1)+ ;POINT TO SECOND LUT WORDM BEQ 80$ ;IF EQ NOT ASSIGNEDB/ TST (R1) ;UCB ADDRESS FOUND IN DEVICE TABLES?  BNE 80$ ;IF NE YES) CLR H.NLUN(R0) ;CLEAR THE NUMBER OF LUNSD BR 150$ ;ABORT THE TASKX&80$: CLR (R1)+ ;CLEAR SECOND LUT WORD BR 70$ ;SCAN NEXT LUT ENTRY 6100$: MOV H.WND(R0),R1 ;POINT TO THE NUMBER OF WINDOWS$ MOV (R1)+,R3 ;GET NUMBER OF WINDOWS#110$: DEC R3 ;LOOK FOR NEXT WINDOWE! BLE 200$ ;IF LE NO MORE WINDOWST% ADD #W.BLGH,R1 ;POINT TO NEXT WINDOWT% MOV (R1),R0 ;IS THIS WINDOW MAPPED?  BEQ 110$ ;IF EQ NO( MOV P.MAIN(R0),R0 ;GET MAIN PCB ADDRESS3 MOV #$PARHD,R2 ;GET ADDRESS OF PARTITION LIST HEADY+120$: MOV (R2),R2 ;GET ADDRESS OF NEXT PCBD BEQ 150$ ;IF EQ END OF LIST0) CMP R0,R2 ;PCB FOUND IN PARTITION LIST?0$ 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 BLOCK  BR 110$ ;CONTINUE SCANNING$150$: MOV #S.CINS,R0 ;GET ABORT CODE MOV R5,R1 ;COPY TCB ADDRESS( MOVB #-1,IOSB ;SET ERROR CODE CALLR $ABTSK ;ABORT THE TASK200$: RETURN ;;+/;**-CALDMK--CALCULATE TASKS DATA SPACE MAP MASK ;TC; THIS ROUTINE IS CALLED TO CALCULATE THE I/D OVERMAP MASK FROM THEE; TASKS ADDRESSING WINDOWS.P;F ; INPUTS:T;O; R0 = HEADER ADDRESSF; R5 = TCB ADDRESS; ; OUTPUTS:;A; R1 = DATA SPACE MAPPING MASK; "; REGISTERS R0 - R3 ARE DESTROYED.;O;- .IF DF U$$DAS$CALDMK: MOV R3,-(SP) ;SAVE REGISTERS MOV R2,-(SP) ;M MOV R1,-(SP) ;C3 MOVB H.DMAP(R0),-(SP) ;INITIALIZE D SPACE MAP MASKB MOV R0,-(SP) ;A< BIT #T4.DSP,T.ST4(R5) ;TASK BUILD WITH SEPARATE I/D SPACE ?1 BEQ 20$ ;IF EQ NO, RETURN WITH ALL OVERMAP MASKA3 MOV H.WND(R0),R0 ;POINT TO NUMBER OF WINDOW BLOCKSI6 MOV (R0)+,R2 ;GET NUMBER OF WINDOWS, ADVANCE TO FIRST910$: DEC R2 ;COUNT ONE LESS WINDOW (REMEMBER THAT WINDOWA$ ;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 NON$ MOVB W.BFPD(R0),R3 ;GET PDR ADDRESS! BIT #20,R3 ;MAPPED TO D SPACE ?K BEQ 10$ ;IF EQ NOI& SUB #UDSDR0,R3 ;ADJUST TO OFFSET ZERO ASR R3 ;CONVERT TO BYTE INDEXW' MOVB W.BNPD(R0),R1 ;GET NUMBER OF PDRSK& ADD R3,R1 ;FORM ENDING PDR NUMBER +1. MOVB $BCMSK-1(R1),R1 ;GET MASK UP TO LAST APR/ BICB $BCMSK-1(R3),R1 ;GET MASK UP TO FIRST APRR' BISB R1,2(SP) ;MERGE WITH REST OF MASKN BR 10$ ;AND CONTINUE)20$: MOV (SP)+,R0 ;RESTORE HEADER ADDRESST, MOVB (SP)+,H.DMAP(R0) ;REWRITE HEADER VALUE MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R2 ;0 MOV (SP)+,R3 ;  RETURNB .ENDC ; DF U$$DAS .END $LOADRDJUST TO OFFSET ZERO ASR R3 ;CONVERT TO BYTE INDEXW' MOVB W.BNPD(R0),R1 ;G00j~ibjbkb a a a .TITLE DCROP - Read operationse .IDENT /05.00/o;o2; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reserved.; ; Written by: John Gemignani;H.; Re-mastered for RSX-11M-PLUS version 4.4 by:;,; L. B. McCulley ; D. Carroll;d$; Modified for RSX-11M-PLUS V4.5 by:; ; D. Carroll 15-Apr-1993 4.045; DC191 - Correct signed branch in check for requestg(; being too big, i.e. 128 block read;H$; Modified for RSX-11M-PLUS V4.6 by:;; D. Carroll 08-Jan-1996 05.00t+; DC430 - Modified for handle 32-bit LBNs ;.;o>; For RSX-11M-PLUS V4.4 a major change to the organization andJ; functionality of disk data caching was implimented. By adopting a queuedG; implimentation with write tracking, a number of issues are addressed,i ; including;;PA; o Increase throughput by handling multiple extents to process at ; request.C; o Insure that read-ahead cannot read beyond file locks and aquire8; stale data which is in the process of being written.A; o Insure that no stale deferred extents exist in cache, and the,; appropriate read-through is implimented.; ;aM; This module contains the code which preforms cache read operations. An I/O '; proceeds through the following steps:c;gD; 1) Phase I - determine if the request should be processed by cache); the cacher will process the request ifr9; caching is enabled for the operation type (eg, IO.LOVe; AND7; request length is less than limit specified by userp;; If cache does not process request, ensure no conflictingx+; data exists in cache, and return C-set.t;eF; 1.1) Allocate a Cache Request Packet (CRP). Holds operation context-; so duplicate I/O packets are not required.r;e:; Initialize CRP with context from $DCCEB et el set up by; $MPVBN for read-ahead. ;cA; 1.2) Queue User Request Packet (URP, from DRQRQ call to cacher)h4; to driver and let cache phase 2 handle completion; of all cache ops.;iG; Cache Phase II is queue-driven with all cache operation packets beingtB; queued FIFO to serialize all processing. Each packet is processE; as much as possible, if it blocks on a resource (extent) busy (fromcF; other request, or read in progress to load for this op) it is queuedC; to the CED. The operation complete that unbusies the extent wille@; re-queue all waiting operations to the Phase II dispatcher for>; further processing. All queueing is FIFO for serialization.; ?; 2.1) Any existing extents involved? CALL SEARCH to find out. ;h<; 2.1a) If one is found, does it cover beginning of request?;s<; - "cache miss" if none found, or request start not coveredA; - "cache hit" if extent found that covers beginning of request ;gD; MISS - Determine if this miss is the only "missing extent" for the?; request. If not, purge out other extents, to insure only onee; I/O request is issued.pB; Then, handle by loading required extent with read-ahead attempt=; Allocate an extent, and attach to the newly allocated CED.t:; Issue I/O to driver using DRP, update CRP parameters to:; reflect request requirements after new extent is loaded:; and transferred. Internal ioc returns the driver error=; status to the user and deletes the extent for errors. Fors;; successful loads, ioc passes control to transfer processt?; common with "cache hit" processing which handles all further ;; processing (eg, transfer, continuation of overlaps, etc.d:; When all processing for this extent has been completed,>; IOC will pass control to the Phase II dispatcher to process>; any request waiting for the extent that just completed load; A; HIT - Attach to the extent. If extent is busy, request will be;; queued to extent and requeued to Phase II for retry whens?; extent goes unbusy. If extent is not busy, perform transfer ;; and detach from extent. Detach will requeue any pending <; requests for the extent now that we are done with it, for>; Phase II processing (this is for IOC code path). Remaining;; request size is checked and if request is done status i00rt__DATADATADATADATAs8; returned to user else next cache extent is processed.;d;- .IF DF D$$CHE .PSECT DC$ROP, RO, Ii u .SBTTL Read Phase I;-; **-DCR1- Read Phase Iu;t ; Passed:f; R1 -> I/O packet5; I.EFN := Sign bit indicates virtual operations$; I.TCB -> TCB of issuing task-; T.ST3 := T3.ACP indicates task is an ACPh ; R5 -> UCBt; UCBX mapped in APR6,;; X.CSTS := Unit's cache status (i.e. selected operations)mA; $CXDBL non-zero = context switching disabled (eg, user I/O from; ; Returned:uD; C-bit set if cache cannot process operation, otherwise C-bit clear;S ; Action: @; Determine if the function is to be processed by cache. If so,B; set up a Cache Request Packet in the cache internal pool to holdB; context across possible driver calls or cache queueing intervals;:B; Queue the request to cache Phase II dispatcher for serializationD; with other cache requests. This includes a call to $FORK to allow ; other possible IOC processing.;iG; NOTE revisions are being made in RSX-11M-PLUS v4.4 to the handling of F; overlapped extents. The requirement for strict serialization of allG; cache operation processing (because of race conditions between writeseH; and read-aheads, occuring below the level of executive disk block lockJ; means that a queued processing architecture must be adopted. This lendsI; itself to the handling of requests having multiple partially overlappeduI; cache extents (the most difficult case) by simply sequentially steppingrL; through the segments of the request as either hits or misses, and handlingF; the simple degenerate cases in series until the operation completes.;oH; It turns out that this eliminates considerable complexity in the cacheF; code required to handle exception cases (eg, deferred extents forcedH; to be written due to partial overlap but unable to complete immediatelH; because of disk queue latency or primary pool depletion). As a resultG; the implementation of full overlapped extent support is believed moreg6; robust than the previous attempt to dodge the issue.; L; The special exception is the case where a single I/O request would requireN; multiple individual I/O's to be sent to disk. This causes excessive overheadJ; as well as compromises shadowing integrity, unless the shadowing case is; handled as a seperate case.e;p; Notes:B; ACP requests which are issued in order to handle the file systemD; (F11) are issued with context switching enabled (i.e. $CXDBL is 0)B; Requests on behalf of a task for disk extent crossings (i.e. mapB; failures) are issued with context switching disabled (i.e. $CXDB ; non-zero).;q;tE; Until the first MP.PAR (or MP$PAR) function is issued, the residentuC; cache code is mapped in Kernel-D APR5, which allows local data to B; be used as a dispatch table. This is not possible after phase IIE; is invoked, since the cache region will be mapped in Kernel-D spacet$; after completing the call to FORK.;h;-, .SBTTL + Local data for dispatch operations;o7IOLOV: .WORD XC.OVR, APR6.BASE+X.XOVR, APR6.BASE+S.OVRr u .SBTTL + DCOV1 - Load overlay;+A; DCOV1 - entry point from DCDSP for IO.LOV, IO.LDO overlay loadsA;-3DCOV1:: MOV #IOLOV,R0 ; point to data for overlaysp% BR COMMON ; rest is common with re 9TOOBIG: USTAT$ S.RBIG,R0 ; tally a read that was too big .QUICK: CALLR CHEPUR ; purge deferred extents .SBTTL + DCR1 - Read operations;+;; DCR1 - entry point from DCDSP for read operations phase If;d:; Determine the type of operation, and re-join common code;-)DCR1:: CALL INICTX ; initialize context 1 BCC COMMON ; join common code, not virtual I/Of= BITB #XC.RDA,APR6.BASE+X.CSTS ; Read-ahead / preload enabledi BNE COMMON ; yes, go aheadO- CLR $DCCEL ; no, show no valid prelod info$* ASSUME COMMON,. ; fall through to common U4 .SBTTL + Common dispatching code for read functions;+=; Common processing code for all read operations in phase Io;e; Input:; ; R0 -> Pointer to status tablee; R1 -> URP 00z~ibjbkb a a aaddress-; R5 -> UCB address+; U.UCBX -> Secondary pool address of UCBXB5; X.CSTS := Unit's cache status, selected operationT"; 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;; Local data is mapped;c/; (Additional parameters set for virtual reads,e; courtesy of $MPVBN);r*; $DCSTS - Window status from file window&; $DCCEB - MSP of base LBN for extent'; $DCCEB+2 - LSP of base LBN for extent *; $DCCEL - Length of extent from base LBN;:; Structure returned by INICTX;p;t ; 0(R0) - I/O status flag XC.xxx*; 2(R0) - Address of extent limit variable+; 4(R0) - Base of block used for statistics.;G;-FCOMMON: BITB (R0)+,APR6.BASE+X.CSTS ; is this option enabled for cache! BEQ QUICK ; nope, finish up ...a INC R0 ; normalize index1 MOVB @(R0)+,-(SP) ; save the maximum extent sizea- MOV (R0),R0 ; and get the statistic addressB;+C; After this point, no data in the cache code may be referenced,oB; since on an I/D space system, the cache partition will be mapped; in both Kernel APR 5 and 6.;(8; USTAT$ insures KISAR5, and KISAR6 are mapped if needed;c;-( USTAT$ S.RTOT,R0 ; Increment read total2 CALL CLCLEN ; calc blocks to read - return in R45 CMPB R4,(SP)+ ; compare request size with size limitr* BHI TOOBIG ; and bypass cache if too big3 MP.PAR ; map cache partition for GETCRP fallbackt< CALL GETCRP ; save params in CRP, tries to delete from age4 BCS QUICK ; age list if depletion but just in case- MOV R0,R.STAT(R2) ; set stats context in CRPb e;l&; Operation will be processed by cache;,B; We need to save the read-ahead information about the file extentD; (from $MPVBN) because we may need to use it in Phase 2 after we'reH; queued for long enough to have another user QIO run through the systemF; We use the CRP as the context storage block, and we can use I.PRM+P6I; here because if that were meaningful the bypass bits would have skippedS ; this code.;t; /; (Additional parameters set for virtual reads,;; courtesy of $MPVBN);*; $DCSTS - Window status from file window&; $DCCEB - MSP of base LBN for extent'; $DCCEB+2 - LSP of base LBN for extentf*; $DCCEL - Length of extent from base LBN;a315$: TSTB I.EFN(R1) ; was this a virtual function?o, BPL 20$ ; if PL, no, logical of some form) ; If MI, yes, maybe can do readaheadw0 TST $DCCEL ; do we have valid read-ahead data+ BNE 25$ ; virt ops should always have it720$: MOV I.PRM+P5(R1),R.LBNL(R2) ; save I/O parametersl6 MOV I.PRM+P5(R1),R.LBNH(R2) ; ...as read-ahead value> MOV I.PRM+P4(R1),R.LBNL+2(R2) ; copy the P4 parameter ;DC430/ BIT #DV.32B,U.CW1(R5) ; 32-bit LBNs? ;DC430C* BNE 22$ ; if NE, yes, continue ;DC430/ CLRB R.LBNL+3(R2) ; use only 24-bits ;DC430o ;DC430-22$: MOV R.LBNL+2(R2),R.LBNH+2(R2) ;DC430,2 ADD R4,R.LBNH(R2) ; update ending block ;DC430. ADC R.LBNH+2(R2) ; double precision ;DC430% BR 30$ ; go to work on it! ;**-4MG25$: MOV $DCCEB,R.LBNL+2(R2) ; save file extent info from $MPVBN ;DC430.> MOV $DCCEB+2,R.LBNL(R2) ; in CRP for cache read-ahead ;DC430@ MOV $DCCEB,R.LBNH+2(R2) ; save file extent info as high ;DC4309 MOV $DCCEB+2,R.LBNH(R2) ; low bounds for preloads ;**-3B6 ADD $DCCEL,R.LBNH(R2) ; as highest LBN in file extent0 ADC R.LBNH+2(R2) ; MSP of double-precision LBN.30$: CLR $DCCEL ; show read-ahead data stale+ CALLR Q2PHS1 ; synchronize thru phase II4 ; .SBTTL + DCR2 - Data Cache Read phase 2 processing entryL;RB; DCR2:: -- Phase 2 entry for Data Cache Read operation processing;);i@; At this point, any return will not go back to $DRQRQ, but back; to Phase II processing.D;0!; Input: (from phase II dispatch)u; ; R1 -> URP, with CRP allocated, ; R5 -> UCBa ; UCBX mappedn;l; SEARCH returns:N ; Cache partition mapped in APR6;N'; R0 -> CED of first overlapping extenta:; R2 := Highest LBN requested 00t__DATADATADATADATALeast significant part (LSP):; R3 := " " " Most " " (MSP) ; R4 := Number of LBNs requested;o; Note:c8; Don't forget that the extent highest LBN is stored +1.;t=; Existing context is preserved and used as much as possible.s;gEDCR2:: MOV I.ACED(R1),R0 ; retrieve ptr to attached CED if any extentl2 BEQ 10$ ; must do SEARCH if not already attached;+E; If we have an attached extent, then we have just completed an I/Op=; to load the request, and now we should go transfer the dataa.; into the user buffer, and continue the scan.;-1 MP.PAR ; map cache partition if SEARCH skipped< CALL UPDPKT ; just completed so refresh request params,(in1 BR XFR ; case preload!) then go do xfr for thiss;+J; No attached extent, so scan to determine if there are any overlapping; extents in cache.B;-510$: CALL SEARCH ; Find the first overlapping extent , BCS MISS ; no extent overlaps range at all l0 .SBTTL + TSTOLP, Test for extent overlap on hit;+2; Test for possible overlap after start of request;t; Input:(; R0 -> Next CED which overlaps request ; R1 -> URP$; R2 -> Highest LBN requested (LSP)$; R3 -> Highest LBN requested (MSP)#; R4 -> Number of blocks requestedt ; R5 -> UCB; Cache partition mapped;-@TSTOLP: MOV I.PRM+P4(R1),-(SP) ; save the high order LBN ;DC430: BIT #DV.32B,U.CW1(R5) ; supporting 32-bit devices ;DC430* BNE 10$ ; if NE, yes, continue ;DC4304 CLRB 1(SP) ; clean up the high order part ;DC430=10$: CMP (SP)+, E.LBNL+2(R0) ; Rqst start before exte ;DC430t) BHI HIT ; If HI, no, hit on it ;**-1s BLO MISS ; If LO, yesR6 CMP I.PRM+P5(R1), E.LBNL(R0) ; Double word comparison" BLO MISS ; If LO yes, else hit .SBTTL + HIT, Process cache hit;+=; Found extent in cache for next request segment, process itg;r; Input:(; R0 -> Next CED which overlaps request ; R1 -> URP$; R2 -> Highest LBN requested (LSP)$; R3 -> Highest LBN requested (MSP)#; R4 -> Number of blocks requestedC ; R5 -> UCB; Cache partition mapped;-@HIT: BITB #ES.ERR,E.STAT(R0) ; Check for deferred extent w/error' BEQ 10$ ; no error, process normallyL. BITB #ES.WDF,E.STAT(R0) ; data exist on disk?, BEQ RDERR ; yes, driver can try again w/o" ; else return error code here;+B; We have a hit, on a deferred extent which encountered an error?; when attempting to write the extent to disk ... Since we willr?; now report the error, we do not have to maintain this extentm:; in memory until the file is deleted, so clean up now ...;-F BICB #,E.STAT(R0) ; we will report the error, so clean# CALL FRECED ; and delete the CEDl5 MOV #,R0 ; Indicate error (bad block error)Q BR RDFINy;+5; Attach to this CED, make sure it's not already busye;-510$: CALL ATTCED ; Attach to CED, queue if it's busyn' BCS DONE ; CED was busy, return latere;+:; Tally a read hit, but only one read hit on any given I/O8; request, even if multiple CEDs are required to satisfy; the request.;-' MOV I.CRP(R1),R2 ; get the CRP pointerR7 BIT #1,R.STAT(R2) ; have we already logged a read hit?/ BNE XFR ; if NE, yes, don't log multiple hits.6 USTAT$ S.RHIT ; Now we've got it, increment read hit5 BIS #1,R.STAT(R2) ; flag that we have tallied a readb 3 .SBTTL + XFR, Transfer CED contents to User bufferb;+/; **-XFR-- Transfer this CED to the user buffer ;l; Input:%; R0 -> CED which is part of the URPI ; R1 -> URP ; R5 -> UCB; Cache partition mapped;s=XFR: BISB #ES.XIP,E.STAT(R0) ; show extent busy w/xfr in prog4 CALL RDXFR ; move data to user buffer, update URP5 BICB #ES.XIP,E.STAT(R0) ; show extent no longer busy. CALL DETCED ; release ownership lock on CED* TST I.PRM+P2(R1) ; more bytes requested?- BEQ RDDON ; nope, all done, return success ;+1; Find next overlapping CED in LBN list (if any)h8; based on R0 being the next CED in the list to process.;-, CALL SRCHP ; partial search, start pt set+ BCS MISS ; no overlapping CED, is a00~ibjbkb a a a missE- BR TSTOLP ; see if next CED covers next blo" .SBTTL + Read completion routines;+D; Request is now complete. P3 is the total of the bytes transferredG; for this request. It must be placed in R1 (R0 will indicate success)m(; and the packet is forwarded to $IOFIN.;--RDDON: MOV #,R0 ;Indicate successp4RDFIN: CALL RLSCRP ; refresh URP (w/stat), release# MOV R1,R3 ; Setup $IOFIN context-3 MOV I.PRM+P3(R3),R1 ;Set the count of bytes movedM1 MOV I.UCB(R3),R5 ;R5 -> Disk UCB for completion / MOV R5,-(SP) ; save UCB address around $IOFINe CALL $IOFIN ;Complete the I/O( MOV (SP)+,R5 ; and restore UCB address3DONE: RETURN ; to dispatch next Phase II processl;+); RDERR - error on read of data from diskhE; handle by passing request to driver, let driver return error codec;->RDERR: CALL RLSCRP ; release CRP, refreshing the original URP' CALLR .DRQRQ ; pass request to driverV P8 .SBTTL + MISS - load next segment of request if missing;+C; MISS: load missing portion of request (eg, the portion before anyuH; extent found in SEARCH, or whole request if no existing extent overlap1; then let ioc run Phase II to finish processing.P;eJ; NOTE: handles read-ahead (actually, preloads as much of disk file extent.; as possible in addition to requested blocks);c ; Passed:D ; R0 -> next CED (or maybe zero); R1 -> I/O request packet2; I.CRP -> CRP with saved user I/O request params; I.ACED -> used as flags cello7; APRD.BASE+H.TMP -> prev CED in LBN list (from SEARCH) ;u ; Action:eF; If cache is in rundown abort caching of request, insure all involved;; extents are deleted prior to forwarding on to the driver. 8; Calculate parameters for actual read with pre-loading.4; Allocate extent, set up packet and queue to driver5; RDIOC will continue request processing via Phase IIe;C;(M; We need to try read-ahead first, to get the actual length (and incidentally J; the starting LBN) for the transfer. The length is required for the callG; to GETBUF, which returns the CED for the transfer. GETBUF parametersaK; R1 => pkt, R4 = length, R5 => UCB. GETBUF returns R0 => CED if allocatedfH; successful (FREAGE is called from GETBUF until no more space is freed,I; allocation failures should be rare). If there is an allocation failure J; attach to a CED which has outstanding I/O, or queue the packet for cache2; phase 2 processing and return to caller in hopes=; that something will free up by the time phase 2 runs again.q;e ; Context:.; R0 -> CED (or 0) for next overlapping extent; R1 -> I/O packet#; R2 -> Highest LBN requested (LSP)5#; R3 -> Highest LBN requested (MSP) "; R4 -> Number of blocks requested ; R5 -> UCBE; Cache partition mapped;rA; This algorithm has evolved, and the current flow is as follows;t; (; a) If deactivation is active, goto (f)=; b) Determine if there are any extents overlapping which areg; deferred. If so, goto (f)@; c) Only one I/O required to satisfy this request? If not, read#; under cache, to satisfy the readr9; d) Pre-age all overlapping extents, and load new extents;B=; f) Delete all overlapping extents, and then load new extent-;-&MISS: MOV KISAR6,-(SP) ; save KISAR6$ MP.UCBX ; map the UCB Extention: MOVB APR6.BASE+X.CST2,(R1) ; get the deactivation status/ MOV (SP)+,KISAR6 ; restore partition mapping)- BITB #X2.DEA,(R1) ; are we in deactivationh* BNE 20$ ; yup, flush, and read-through TST R0 ; any overlap at all? BEQ 35$ ; nothing to testd( CALL RDSIZ ; determine our read size* BCS 15$ ; if CS, multiple I/O requests' MOV R0,I.ACED(R1) ; save CED address,)10$: CALL QUPAGE ; rejuvinate this CEDA) CMP R0,(R1) ; is this the last extentp# BEQ 35$ ; yup, go and load info.' MOV E.LNXT(R0),R0 ; get the next CEDM# BNE 10$ ; if NE, more to go ...  BR 35$?15$: BITB #,(R1) ; any DFR/WPL extents involved,% BEQ 25$ ; if EQ, nope, read under;&20$: TST R0 ; any extents involved?( BEQ 30$ ; nope, ju00t__DATADATADATADATAst queue to driver- CALL DELATT ; delete all involved extentse" BCC 25$ ; and read-under cache/ USTAT$ S.RLAP ; flag overlap sent to drivert' CLR (R1) ; reset statistics addressa% RETURN ; wait for phase II againo325$: USTAT$ S.RLAP ; flag overlap sent to driverB+30$: CLR I.ACED(R1) ; insure no CED shown, CALL UPDPKT ; and update the user params$ BR 70$ ; and forward to the disk035$: MOV I.ACED(R1),R0 ; reset previous "next"& CLR I.ACED(R1) ; and reset the flag;+<; First try read-ahead (always pre-load as much as possible)6; and then aquire a cache buffer for the target extent;-6 CALL PRELOD ; calculate read limits for max preload# CALL GETBUF ; Get a cache buffera# BCC 50$ ; got a buffer, go ahead ;+H; Here we failed to get a cache buffer. It is possible that either thereK; is a lack of pool for the CED, or the buffer. If we are required to purge I; the world, don't purge to load the largest extent, but instead purge to ; get the requested size ...; H; If this also fails, then attempt to queue back to through phase II, or>; attach to the CED which is queued to be written out to disk.;-6 CALL UPDPKT ; restore rqst params (PRELOD mungs em)4 CALL PRELD2 ; recalculate our size w/o read-ahead6 CALL GETBUF ; try to get a buffer w/ new parameters( BCC 50$ ; if CC, we got one this time, CALL RFRSHP ; restore original parameters* TST R0 ; did we get a CED to attach to?) BEQ 40$ ; nope, just requeue for latere$ CALLR ATTCED ; attach to this CED.40$: CALLR Q2PHS1 ; return queued to Phase 2;+F; Prepare the driver packet. Cannot depend on context from user QIO$.J; This sets the parameters that are associated with this specific transferJ; The user request parameters that were stored in the Cache Request PacketE; for later restoration have been used for the pre-load computations.S; ; Context:"; R0 -> CED of extent being loaded; R1 -> I/O packet*; R4 := size of request in 512-byte blocks;aD; Complete the setup of the packet now that we know this I/O will go;-350$: CALL ATTCED ; Better succeed, it's a new CED ( ; Setup the new CED LBN/size parameters4 MOVB #ES.RIP, E.STAT(R0) ; Flag as read-in-progress+ CALL SETLBN ; set up LBN/size parametersr% ; Put CED into age list and LBN lista1 CALL QADAGE ; Insert the CED into the age listp+ CALL QINLBN ; and into the unit LBN list-& ; Set extent buffer address in packet" MOV R1,R3 ; save packet address0 MOV E.PHYA(R0), R1 ; Buffer address doubleword MOV #140000, R2 ; In APR6w/ CALL $MPPHY ; Map to physical address if NPRi7 MOV R1, I.PRM+P1.1(R3) ; Set the most significant parts5 MOV R2, I.PRM+P1.2(R3) ; Set the least " "s& MOV R3, R1 ; Restore packet address ; Update read load statistics1 USTAT$ S.RLOD ; Now we're sure, increment reado) ; Store length to read in request packet . ASH #11,R4 ; R4 is length as 512-byte block1 MOV R4, I.PRM+P2(R1) ; make it bytes for QIO pktE;+D; Common entry for both partial cache hit, and cache load functions;L!; Set fixed fields in I/O packets; ; Function: IO.RLB; Int IOC : RDIOC:;-970$: MOV #IO.RLB,I.FCN(R1) ; set to IO.RLB w/no modifiers 9 MOV KINAR5, I.IOSB+2(R1) ; Setup internal I/O completionUC MOV #,I.IOSB+4(R1) ; Address must be in APR5!, note bit 0e( CLRB I.EFN(R1) ; insure as logical I/O;+ ;**-1A; Note: B; Everything must be ready for IOC when we call $DRQRQ, the driverB; may race us back here. So we need to have set up all the extentD; values that need to be initialized from the I/O packet, before any-; of the drivers get their grubby paws on it.:;V>; Read I/O Complete will refresh the User Request Packet from9; the Cache Request Packet and then pass it to phase II.I;- CALLR .DRQRQ ; Send to driver ,< .SBTTL + PRELOD - calculate limits for read-ahead (preload); @; PRELOD - routine to calculate high and low LBN limits for read:; in order to preload maximum number of block00~ibjbkb a a as to cache=; uses file extent bounds saved in CRP at cache read entryz;f ; Parameters:k; R0 -> CED or zerot; R1 -> packet for request7; APRD.BASE+H.TMP -> prev CED in LBN list (from SEARCH)s;R ; Returned: .; R1 -> packet, starting LBN (P4 & P5) updated"; R4 = number of blocks to be read; ; R0, R2 trashed;,;.+; first set up by retrieving max read aheade;-1PRELOD: CLR -(SP) ; check read-ahead size limita MOV KISAR6,-(SP) ; save KISAR6 MP.UCBXB BISB APR6.BASE+X.XRDA,2(SP) ; get max extent size with read-ahead+ MOV (SP)+,KISAR6 ; restore KISAR6 mapping  BR PRECMN ; join common codet7PRELD2: CLR -(SP) ; set max read-ahead as extent size 6 MOV APRD.BASE+H.TMP,R0 ; get previous CED in LBN list) BNE 10$ ; if NE, we can get the "next"=% MOV KISAR6,-(SP) ; save kernel APR62 MP.UCBX ; map the UCBX8 MOV APR6.BASE+X.CCED,R0 ; get the first CED in the list$ MOV (SP)+,KISAR6 ; restore mapping BR PRECMN ; and continue ....610$: MOV E.LNXT(R0),R0 ; get the next CED in LBN list0PRECMN: MOV I.CRP(R1),R2 ; retreive CRP address;+G; Since all I/O operations appear to have read-ahead, we will check toeC; insure that the request length is in range so that this algorithmiF; will not cause a smaller amount to be read simply based on the factB; that read-ahead is smaller than the request size. If we are here; then the request is in range! ;-- CALL CLCLEN ; calculate blocks to transfer + CMP R4,(SP) ; is the length > read-aheadX# BLOS 5$ ; if LOS, nope, continuei* MOV R4,(SP) ; use request length as max5$: ; reference labelO;+;i<; Find the LBN bounding the start of the read, as higher of:9; end of preceding cache extent, or start of disk extent. ;l;-= MOV R.LBNL+2(R2),R3 ; assume disk extent bounds read ;DC430 + MOV R.LBNL(R2),R4 ; ..dbl prec.. ;**-2i0 MOV R0,-(SP) ; save address of next CED in LBN8 MOV APRD.BASE+H.TMP,R0 ; get R0 -> prev CED in LBN list+ BEQ 20$ ; none, disk extent is the boundO2 ; is top of previous CED above disk extent start?= CMP R3,E.LBNH+2(R0) ; disk extent start before prev ;DC430 6 BHI 20$ ; no, ok now, get real length to read ;**-1/ BLO 10$ ; yes, use top of prev CED as boundsd" CMP R4,E.LBNH(R0) ; ..dbl prec..- BHIS 20$ ; start is ok, get length to read 10$: MOV E.LBNH(R0),R4 ; 20$:/ MOV (SP)+,R0 ; restore ptr to next CED in LBN 3 MOV R4,-(SP) ; save low order LBN of lower boundsD;+;i1; Find the LBN bounding end of read, as lower of:9; start of following cache extent, or end of disk extent.R;.;-9 MOV R.LBNH+2(R2),R3 ; assume disk extent higher ;DC430 3 MOV R.LBNH(R2),R4 ; ...LBN is upper bound ;**-2$& TST R0 ; R0 -> next CED in LBN list- BEQ 50$ ; last extent in cache, no problem ' ; read ahead to end of file extent; CMP R3,E.LBNL+2(R0) ; compare file extent max LBN ;DC430t0 BLO 50$ ; ...with start of next extent ;**-1+ BHI 30$ ; use LBN from CED to bound reade- CMP R4,E.LBNL(R0) ; LSP of double precisionr. BLOS 50$ ; read ahead to end of file extent+30$: ; read to start of overlapping CED . MOV E.LBNL+2(R0),R3 ; ..dbl prec.. ;DC430; MOV E.LBNL(R0),R4 ; next CED LBN bounds top of read ;**-2D, ; R3,R4 = LBN bounding end of possible read50$:" MOV R4,R0 ; trash R0 to save R4 ; (carry/borrow ok here!)0 SUB (SP)+,R0 ; compute length of possible read/ CMP R0,(SP) ; is this greater than max allow$) BHIS 55$ ; yes, use max length allowedR( MOV R0,(SP) ; no, use possible length55$:, SUB (SP),R4 ; find start of possible read SBCB R3 ; handle carry here!n5 MOV I.PRM+P4(R1),-(SP) ; assume 32-bit LBNs ;DC430M4 BIT #DV.32B,U.CW1(R5) ; correct assumption ;DC430, BNE 56$ ; if NE, yes, use 32-bits ;DC4300 CLRB 1(SP) ; clean up high order part ;DC430 ;DC430?56$: CMP R3,(SP)+ ; does this read start before request ;DC430* BLO 60$ ; yes, use preload start ;**-1+ BHI 70$ ; no, use start of request as ise$ CMP R4,I.PRM+P5(R1) ; ..dbl prec.. B00t__DATADATADATADATAHIS 70$ ; rqst ok as is;60$:. MOV R4,I.PRM+P5(R1) ; ..dbl prec.. ;DC430; MOVB R3,I.PRM+P4(R1) ; use computed preload start ;DC430C3 BIT #DV.32B,U.CW1(R5) ; allow 32-bit LBNs ;DC430D& BEQ 70$ ; nope, just bytes ;DC4306 MOV R3,I.PRM+P4(R1) ; load in the full word ;DC43070$: ;**-20# MOV (SP)+,R4 ; get length to read 99$: RETURNq ;1 .SBTTL + RDSIZ - Determine number of I/Os needed;+E; **-RDSIZ-- Determine if deferred extents or multiple I/O is needed ;c>; This routine will size the current request, and determine ifC; there is any chance of requiring multiple I/O requests to satisfy C; a request, or if there are any deferred extents which would cause(; a read under cache to cause a problem.;R; Input:%; R0 - First CED involved in overlap ; R1 - URP ; R2 - LSP of highest LBN; R3 - MSP of highest LBN; R4 - Size of requestI; R5 - UCB address of devicee;; Cache partition mappedn;f;f ; Output:t); CC-C clear -- Only one I/O is requiredu; (R1) last CED involved); CC-C set -- Multiple I/O is requiredc(; (R1) logical OR of all E.STAT bits;-)RDSIZ: MOV R4,-(SP) ; save R4 for a bite& MOV R0,-(SP) ; and the starting CED" CLR (R1) ; init our flags area7 CMP R3,E.LBNL+2(R0) ; this extent start above ;DC430R% BLO 30$ ; yup, skip it ... ;**-1 ! BHI 10$ ; if HI, this is part & CMP R2,E.LBNL(R0) ; and now the MSP$ BLO 30$ ; this is the last one .410$: BISB E.STAT(R0),(R1) ; include current status6 CMP R3,E.LBNH+2(R0) ; will this CED complete ;DC430( BLO 30$ ; if LO, yes, it will ;**-1& BHI 20$ ; if HI, nope, it will not. CMP R2,E.LBNH(R0) ; how about the low order BLO 30$ ; if LO, yes it will+20$: MOV E.LNXT(R0),R4 ; get the next CEDt* BEQ 40$ ; if EQ, multiple I/O required> CMP E.LBNL+2(R4),E.LBNH+2(R0) ; are these contiguous? ;DC430* BNE 40$ ; if NE, no, check defer ;**-12 CMP E.LBNL(R4),E.LBNH(R0) ; how about low order?" BNE 40$ ; nope, check deferred" MOV R4,R0 ; reset the next CED BR 10$ ; and check this one 630$: BIT #,(R1) ; any extents leaving?$ BNE 40$ ; yup, flag multiple I/O# MOV R0,(R1) ; save the last CEDf( TST (PC)+ ; skip the SEC instruction40$: SEC ; indicate overlap /50$: MOV (SP)+,R0 ; restore first CED address,$ MOV (SP)+,R4 ; and the size value RETURN ; to callerN c8 .SBTTL + RDIOC - Internal I/O completion for read loads;+2; **-RDIOC- Internal I/O Completion for read loads;0 ; Passed: 4; R3 -> driver I/O request packet that is completing ; I.PRM+P3(R3) -> driver status; R5 -> UCB addressE;$ ; Returns:; CED unbusied.-; Queued requests for CED queued to Phase II.+; Phase II invoked (if needed);0 ; Actions:1; On error, return status to user and delete CED. ;-8RDIOC: CALL $SAVNR ; save registers - for $IOFIN caller0 MOV R3,R1 ; set up our internal I/O packet ptr1 MOV I.UCB(R3),R5 ; get UCB (and UCBX) for device 0 MP.PAR ; maps cache partition for this device5 MOV I.ACED(R3),R0 ; get CED for this request ;**-1g- BEQ 30$ ; we have a read completion w/o CEDd/ BITB #CS.DBG,APRD.BASE+H.CSTS ; debug enabled?q! BEQ 7$ ; if EQ, nope, skip this6 CMP E.IOPA(R0),R3 ; is this the packet for this ced? BNE 3$ ; no, go die ... # CMP E.UCB(R0),R5 ; ucb match ced?  BEQ 7$ ; ok, sanity checkeda03$: FATAL$ BE.UCB ; bugcheck w/ cache UCB error97$: BICB #ES.RIP,E.STAT(R0) ; clear read in progress flag.6 TSTB I.PRM+P3(R3) ; Get the error status from driver, BPL 10$ ; no error, complete and continue> BISB #,E.STAT(R0) ; set error flags for extent6 CALL DETCED ; detach CED also deletes if ES.DEL set" ; and requeues waiting rqsts( CALL RLSCRP ; refresh URP, delete CRP5 CALL .DRQRQ ; give to driver, let it return statusc2 BR 20$ ; and go run cache phase II if necessaryA10$: ; RDOKAY -- Read succeeded, now finish processing in Phase 2 + MOV R3,R1 ; set conventional register00~ibjbkb a a a toR, CALL Q2PHS2 ; queue packet to Phase 2 now120$: CALLR DCFRK0 ; to Phase II dispatcher forkE,30$: MOV I.CRP(R1),R2 ; get the CRP address; ADD I.PRM+P4(R1),R.P3(R2) ; update total bytes transferred - MOV I.PRM+P3(R1),R0 ; load the final status ' CALLR RDFIN ; and terminate the readQ  .SBTTL + RDXFR - Transfer data; ; Passed: ; Cache partition mapped in APR6;; R0 -> CED to transferc; R1 -> I/O Request packet@; I.PRM+P1 -> user buffer address (dbl prec. or addrs dbl-word)#; I.PRM+P2 -> byte count requestedn,; I.PRM+P3 -> reserved for cache scratchpad); I.PRM+P4 -> MSP of first requested LBNt); I.PRM+P5 -> LSP of first requested LBN;; I.PRM+P6.1 -> CED,; I.CRP -> CRP for this I/O request packet;l ; Returned:L;;;FC; I/O request packet updated for unsatisfied portion after transferd4; I.PRM+P1 add bytes transfered (double precision)'; I.PRM+P2 subtract bytes transferred/:; I.PRM+P4, P5 add blocks transferred (double precision); ;a; Note:w>; Disk devices enforce word alignment, and since cache extents6; are also word aligned, data transfers are fast using5; the executive's $BLXIO routine. (A single 256 word;7; disk block takes approximately 600us on a PDP-11/70.)u; 9; Parameter 3 of the user's I/O packet is used as the sumd; of bytes moved.r;n;t; The algorithm is as follows:;;4; 1. Initialize the count of bytes and blocks moved.7; (do first to use results to update request values)e2; Determine the amount of data available in the4; initial extent by subtracting the high LBN from6; the user's request LBN. This gives the number of2; blocks to move ("blocks"). In bytes, this is3; multipled by 512 ("current"). If "current" is70; larger than the request (I.PRM+P2), then P2; will replace "current".;v3; 2a. The data's starting APR address is the user's./; block number less the LBNL (starting LBN).3; This number multiplied by 8 is used as the APRs4; bias of the starting address (since all buffers5; in cache are APR aligned, the virtual address is; only 120000 or 140000).6; 2b. Update the next requested block number using the+; count previously calculated in step 1.";r7; 3a. The user buffer address is taken from the request.=; packet. This may need to be adjusted, since NPR devicesa<; will have real 22-bit addresses in I.PRM+0 and I.PRM+2.>; $BLXIO expects to see an address doubleword. "ADJBUF" in=; DCSUB is used to do this adjustment, and the contents ofl?; I.PRM+0,I.PRM+2 are saved and restored for use in the next ; request.0<; 3b. Update the request packet to give the next user buffer9; address following the data transferred in this call. ; >; 4. Load the byte count for BLXIO into R0, it was calculated-; and saved earlier because R0 was needed.e:; 4b. Subtract the amount moved "moved" from the requested; byte count (I.PRM+P2).s;a0; 5. Setup and call $BLXIO to transfer the data.;d; <; Calculate lengths to actually transfer - bytes and blocks.;e; Notes:@; We can ignore excess blocks in update of next requested LBN ifC; user request ends before end of extent since there is no next xfre;t7; We ignore the high order bits here, since this CED isn4; definitely connected with this request, and we are3; allowed to borrow from the most significant bits.a2; Our result is a single precision count of blocks6; which are transferrable from the CED, and a count of; bytes to actually transfer.l; ;-*RDXFR: MOV R1,-(SP) ; save i/o packet ptr7 MOV I.CRP(R1),R2 ; reference CRP thru R2, URP thru R1f% ; update CRP to reflect transfere& ; use URP for transient operation=; Here we get the lesser of user rqst length or extent lengths1 MOV E.LBNH(R0),R3 ;Get LSP of extent high LBN+1n3 SUB I.PRM+P5(R1),R3 ;Subtract LSP of user requestn& ; gives number blocks transferred' ASH #9., R3 ;Convert to a byte bountr1 CMP I.PRM+P2(R1),R3 ;User ask to transfer less?l BHIS 20$ ;No if HIS9 MOV00t__DATADATADATADATA I.PRM+P2(R1),R3 ;Else replace extent by user buffer 20$:, MOV R3,-(SP) ;Save EBLXIO byte count param;++; Now set source parameters for EBLXIO calls0; calculated from request and extent information:; (done out of order because of register usage sequencing);o$; R4 = destination APR6 displacement; R3 = destination APR6 bias&; NOTE: must be adjusted for possible8; address doubleword format variant (eg, if NPR device);-; MOV R.P1.1(R2),I.PRM+P1.1(R1) ; set up user buffer addressH2 MOV R.P1.2(R2),I.PRM+P1.2(R1) ; for 'ADJBUF' call7 ADD R.P3(R2),I.PRM+P1.2(R1) ; offset for previous xfrp) ADCB I.PRM+P1.1+1(R1) ; just in case... 8 ADD (SP),R.P3(R2) ;now update total bytes moved for IO, CALL ADJBUF ;Adjust user's buffer address8 MOV I.PRM+P1.1(R1),R3 ;Get adjusted destination address% MOV I.PRM+P1.2(R1),R4 ;...both parts:; R1 = Source APR5 biasb9 MOV I.PRM+P5(R1),R2 ;Get rqst base LBN, subtract extent7 SUB E.LBNL(R0),R2 ; base for block offset into extentd) ASH #3, R2 ;Make it an APR bias offset'7 ADD E.PHYA(R0),R2 ;Now R2 is APR bias of cache bufferp& MOV R2,R1 ;Make R1 param for EBLXIO; R0 = byte count to transferR, MOV (SP)+,R0 ;Get saved length to transfer; R2 = Source APR5 displacment3 MOV #APR5.BASE,R2 ; Extent is block-aligned, APR5n# CALL EBLXIO ; Transfer the data.t;+G; Request is now complete. P3 in CRP is the running total of the bytesNK; transferred for this request. It must be maintained for return to $IOFINJ; URP has been used as a scratchpad for this extent I/O, must be refreshed,; from remaining user request params in CRP.;-* MOV (SP)+,R1 ; restore I/O pkt ptr to R1H ; update request parameters for bytes transferred in all prev sequences4 CALL UPDPKT ; refresh packet, update for transfer1 MOV I.ACED(R1),R0 ; get CED ptr for next search5 ; now get remaining blocks needed to satisfy requestg. CALL CLCLEN ; calculate the length required;+&; at return we want and have (in URP):"; P1 updated by adding bytes xfr'd'; P2 updated by subtracting bytes xfr'dh; P3 d/c,; P4/P5 updated by adding blocks transferred; P6 d/c; CRP:5; P3 updated to be running total of bytes transferredf;-$ MOV I.UCB(R1),R5 ; restore UCB ptr RETURN  .ENDC ; .IF DF D$$CHE .END for transfer1 MOV I.ACED(R1),R0 ; get CED ptr for next search5 ; now get remaining blocks needed to satisfy requestg. CALL CLCLEN ; calculate the length required;+&; at return we want and have (in URP):"; P1 updated b9 .IIF DF,T$$APE $IDENT MUDRV,04,38,C8 .IIF DF,D$$DSK $IDENT DUDRV,04,38,;D1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; 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.;E; PREVIOUSLY MODIFIED BY:N;.; J. BERZLE, J. MELVIN, G. MARIGOWDA, P. WEISS-; M. NOEL, T. SCHOELLER, A. HUDED, D. CARROLL4; $; MODIFIED FOR RSX-11M-PLUS V4.6 BY:;1; D. Carroll 29-Oct-1995 04.356; DC412 - Correct software writelock check on format,/; and include support for partitioned disksi; ; D. Carroll 03-Feb-1998 04.366; DC412 - Include support for extended LBN devices as&; part of partitioned disk support; ; D. Carroll 13-Aug-1998 04.376; DC513 - Correct problem where PUCOM can be unmapped1; when doing shadow catchup on a higher levelW; cached device.;L; D. Carroll 29-Oct-1998 04.388; DC521 - Correct unit online (special case) to insure "; that GUS state is activated.;w; ;t; MACRO LIBRARY CALLS; 8 .MCALL HWDDF$,UCBDF$,SCBDF$,ABODF$,PKTDF$,UDADF$,KRBDF$ .MCALL QIOSY$,CLKDF$ QIOSY$- ABODF$ ; TKTN MESSAGES UDADF$ ; T/MSCP DEFINITIONSa SCBDF$ ,,1 ; SCB DEFINITIONSC HWDDF$ ; HARDWARE REGISTERS3' UCBDF$ ; UNIT CONTROL BLOCK OFFSETSa PKTDF$ ; IOP DEFSs# KRBDF$ ; KRB OFFSET DEFINITIONS $ CLKDF$ ; CLOCK QUEUE DEFINITIONS% JMPTBL PORT ; PORT ROUTINE OFFSETS ;+ ;DC41200~ibjbkb a a aB; Define where the flag byte will be for internal access ;DC412;- ;DC4125I.FLAG = I.PRM+11 ; use high order LBN info ;DC412D ;DC412% .IF DF D$$DSK ; disk I/O ;DC412E; .IF DF D$$PRT!E$$LBN ; Partitions of 32-bit LBNs? ;DC412 6I.FLAG = I.PRI ; use priority field instead ;DC412" .ENDC ;D$$PRT!E$$LBN ;DC412) .ENDC ;D$$DSK ; and disk I/O ;DC412E ;DC412;F.; CHECK FOR THE PRE-ALLOCATED UMR WAIT BLOCKS.;R .IF DF D$$DSK2 .IF NDF DUUMR ; IF NO PRE-ALLO. UMR WAIT BLOCKS# .ERROR DUUMR ; THEN REPORT ERROR2 .IFF ;DUUMR9 .IF GT ; PRE-ALLO. WAIT BLOCKS > MAXIMUM# .ERROR DUUMR ; THEN REPORT ERRORd .ENDC .ENDC ;DUUMRF .IFF ;D$$DSK 9 .IF NDF MUUMR ; IF NO PRE-ALLO. UMR WAIT BLOCKS DEFINEDs" .ERROR MUUMR ; THEN REPORT ERROR .IFF ;MUUMRA .IF GT ; PRE-ALLO. WAIT BLOCKS > MAX. WAIT BLOCKS " .ERROR MUUMR ; THEN REPORT ERROR .ENDC .ENDC ;MUUMR. .ENDC ;D$$DSK .PAGE6 .SBTTL JMPTAB - JUMP TABLE FOR VARIOUS CLASS ROUTINESL;===========================================================================E; THE FOLLOWING JUMP TABLE --- MUST --- BE DEFINED AS THE FIRST THING.D; WITHIN THIS MODULE. VARIOUS PORT DRIVERS EXPECT TO SEE THIS TABLE ; AT 120000.;OH; BE CAREFUL WHEN ADDING NEW ROUTINES TO ADD THEM TO THE END AND TO ALSOJ; DEFINE THEM IN THE MACRO JMPTBL IN DSAPRE.MAC (WHICH CONTAINS THE OFFSET"; DEFINITIONS FOR THESE ROUTINES.)L;===========================================================================FXXBEGN::.WORD MAJOR*256.+MINOR ; COMPONENT ID (SET UP IN $IDENT MACRO)" .WORD CLADAT ; DATAGRAM HANDLER$ .WORD CLAEND ; END PACKET HANDLER* .WORD CLAERR ; PORT/CLASS ERROR HANDLER* .WORD CLACMD ; T/MSCP COMMAND INITIATOR .WORD SCUCB ; SCAN UCB LIST' .WORD CLASYN ; CLASS SYNCHRONIZATIONE .WORD -1 ; TERMINATOR; ; LOCAL DATA;B7EXEVEC: .WORD D.VINT ; FLAG FOR VECTOR NOT YET FILLED ' ; == 0 - IF BUILT WITH RSXVEC.STB=' ; <> 0 - IF BUILT WITH RSX11M.STB=ALCLK: .WORD $ALCLKNALOCB: .WORD $ALOCBNALSEC: .WORD $ALSECTBLKC2: .WORD $BLKC2BLXIO: .WORD $BLXIOACLINS: .WORD $CLINSCCPURM: .WORD $CPURMHCVLBN: .WORD $CVLBN DEACB: .WORD $DEACBHDECLK: .WORD $DECLK DESEC: .WORD $DESECIDEUMR: .WORD $DEUMR DQUMR: .WORD $DQUMRODVMSG: .WORD $DVMSGY .IF DF M$$PROEXROP: .WORD $EXROPT .ENDC ;DF M$$PROAEXRQF: .WORD $EXRQF.FNERL: .WORD $FNERLT!FMSK6: .WORD $FMSK6 ;DC412IFORK1: .WORD $FORK1TGSPKT: .WORD $GSPKT IODSA: .WORD $IODSA=IOFIN: .WORD $IOFINNLDREG: .WORD $LDREGNLOGER: .WORD $LOGERMPPROR: .WORD $MPPROMPUB1: .WORD $MPUB1AMULS: .WORD $$MULN .IF DF M$$PROQFORK: .WORD $QFORKD .ENDC ;DF M$$PROOQINSB: .WORD $QINSBOQINSF: .WORD $QINSFOQINSP: .WORD $QINSPOQRMVA: .WORD $QRMVAORCTPT: .WORD $RCTPTOSRNAM: .WORD $SRNAM$SCERR: .WORD $SCERRXSCOFL: .WORD $SCOFLRSTMP1: .WORD $STMP1TKPS: .WORD $TKPSRUMRWT: .WORD $UMRWTKVOLVD: .WORD $VOLVDKKISR5: .WORD KISAR5KKISR6: .WORD KISAR6SEXEVCL=<<<.-EXEVEC>/2>-1>O/LSTPKT:.WORD 0 ; LAST ABORTABLE IOP IN C.OLHDR,RADNAM:.WORD 0 ; PORT COMMON NAME IN RAD50( .RAD50 /OM/ ; END OF PORT COMMON NAME0COMPCB:.WORD 0 ; STORAGE FOR PORT PCB ADDRESS1SAVSTK:.WORD 0 ; SAVE STACK ADDRESS IN DELAYED& ; CONTROLLER TRANSITION TO ONLINEA .IIF DF D$$DSK&DU$CHK&D$$PRT .ERROR ; DU$CHK AND D$$PRT ;DC412R? .IIF DF E$$LOG KEEPR1: .WORD 0 ; TO HOLD R1 DURING CLADAT CODEK .IF DF,D$$DSK;RSNEXP: .BLKW 18. ; TEMPORARY AREA FOR IO.RSN INFORMATION< .ENDC ;D$$DSK3CONTAB: .BYTE 0,0 ; DEFAULT ENTRY / UNKNOWN MODEL .IF DF,D$$DSKA .BYTE RQDX3, ; NO SCSI ADAPTER, RQDX3 FORMAT STYLEAB .BYTE RQZX1, ; ROI SCSI ADAPTER / SPEC FORMAT STYLE .ENDC ;D$$DSK .IF DF,T$$APE) .BYTE RQZX1, ; ROI SCSI ADAPTER .ENDC ;T$$APE:CONEND: .BYTE 0,0 ; TABLE TERMINATOR. LEAVE THIS HERE!!! .PAGE/ .SBTTL IOFUN - I/O FUNCTION TRANSLATION TABLE.IOFUN: .IF DF,D$$DSK. FUNCT RLB,RD,RD.L,CMDRLB ; READ LOGIC00t__DATADATADATADATAAL BLOCK/ FUNCT WLB,WR,WR.L,CMDWLB ; WRITE LOGICAL BLOCKL .ENDC ;D$$DSK .IF DF,T$$APE/ FUNCT WLB,WR,WR.L,CMDWLB ; WRITE LOGICAL BLOCKP. FUNCT RLB,RD,RD.L,CMDRLB ; READ LOGICAL BLOCK/ FUNCT CMP,CMP,CMP.L,CMDCMP ; COMPARE HOST DATAN .ENDC ;T$$APE .IF DF D$$DSK( FUNCT LOV,RD,RD.L,CMDRLB ; LOAD OVERLAY8 FUNCT STC,AVL,AVL.L,CMDSTC ; SET DEVICE CHARACTERISTICS8 FUNCT RPB,RD,RD.L,CMDRPB ; READ PHYSICAL BLOCK ;DC4128 FUNCT RLC,RD,RD.L,CMDRLB ; READ WITH READ CHECK ;**-10 FUNCT LDO,RD,RD.L,CMDRLB ; LOAD D SPACE OVERLAY+ FUNCT SCF,RD,RD.L,CMDRLB ; SHADOW CATCH UPK9 FUNCT WPB,WR,WR.L,CMDWPB ; WRITE PHYSICAL BLOCK ;DC412A9 FUNCT WLC,WR,WR.L,CMDWLB ; WRITE WITH WRITE CHECK ;**-1F8 FUNCT WDD,WR,WR.L,CMDWDD ; WRITE WITH DELETED DATA MARK> FUNCT INL,GUS,GUS.L,CMDGUS ; INITIALIZE (FOR RCT REPLACEMENT)+ FUNCT RPL,RPL,RPL.L,CMDRPL ; REPLACE BLOCKA+ FUNCT RSN,0,0,CMDRSN ; READ SERIAL NUMBERD1 FUNCT TRM,0,0,CMDTRM ; TERMINATE RCT PROCESSING / FUNCT SMD,FMT,FMT.L,CMDFMT ; SET MEDIA DENSITYL .IFF ;D$$DSKS, FUNCT EOF,WTM,WTM.L,CMDEOF ; WRITE EOF MARK) FUNCT SPF,REP,REP.L,CMDSPF ; SPACE FILEST* FUNCT SPB,REP,REP.L,CMDSPB ; SPACE BLOCKS) FUNCT RWD,REP,REP.L,CMDRWD ; REWIND UNIT: FUNCT RWU,AVL,AVL.L,CMDRWU ; REWIND AND TURN UNIT OFFLINE@ FUNCT SMO,AVL,AVL.L,CMDSMO ; MOUNT AND SET TAPE CHARACTERISTICS1 FUNCT STC,ONL,ONL.L,CMDSTC ; SET CHARACTERISTICSN3 FUNCT SEC,GUS,GUS.L,CMDGUS ; SENSE CHARACTERISTICSD9 FUNCT DSE,ERS,ERS.L,CMDEOF ; ERASE (DATA SECURITY ERASE)M' FUNCT ERS,ERG,ERG.L,CMDEOF ; ERASE GAP6 FUNCT RLV,RD,RD.L,CMDRLV ; READ LOGICAL BLOCK REVERSE .ENDC ;D$$DSK6EIOFUN: FUNCT 0,0,0,ILEGAL ; END OF TABLE (DISK/TAPE);S.; FUNCTION TABLE ENTRIES FOR INTERNAL COMMANDS;T2ONLFUN: FUNCT 0,ONL,ONL.L ; ONLINE T/MSCP COMMAND;GUSFUN: FUNCT 0,GUS,GUS.L ; GET UNIT STATUS T/MSCP COMMANDS1ABOFUN: FUNCT 0,ABO,ABO.L ; ABORT T/MSCP COMMANDT5AVNFUN: FUNCT 0,AVL,AVL.L ; AVAILABLE T/MSCP COMMANDC>GCSFUN: FUNCT 0,GCS,GCS.L ; GET COMMAND STATUS T/MSCP COMMAND>SCCFUN: FUNCT 0,SCC,SCC.L ; SET CONTROLER CHAR T/MSCP COMMAND .IF DF D$$DSK+FMTFUN: FUNCT 0,FMT,FMT.L ; FORMAT COMMANDC .ENDC ;D$$DSK .IF DF,T$$APE7SNGDEN: .BYTE TK50 ; SINGLE DENSITY DRIVE/CONTROLLERSN .BYTE TK70N .BYTE TZ30, .BYTE -1 ;TABLE TERMINATOR .EVEN .ENDC ;T$$APE;;<; TABLE FOR TRANSLATION OF MSCP END CODES TO RSX ERROR CODES;O%RSXTAB: .BYTE IS.SUC ; 00 - SUCCESS,, .BYTE IE.IFC ; 01 - ILLEGAL FUNCTION CODE& .BYTE IE.ABO ; 02 - COMMAND ABORTED# .BYTE IE.DNR ; 03 - UNIT OFFLINE.% .BYTE IE.DNR ; 04 - UNIT AVAILABLE .IF DF D$$DSK+ .BYTE IE.BCC ; 05 - MEDIA FORMAT ERROR .IFF ; IF TAPEA" .BYTE IE.FHE ; 05 - UNDEFINED .ENDC ;D$$DSK( .BYTE IE.WLK ; 06 - UNIT WRITE LOCKED$ .BYTE IE.CBE ; 07 - COMPARE ERROR! .BYTE IE.VER ; 08 - DATA ERRORO/ .BYTE IE.SPC ; 09 - HOST BUFFER ACCESS ERRORB' .BYTE IE.FHE ; 10 - CONTROLLER ERRORI" .BYTE IE.FHE ; 11 - DRIVE ERROR .IF DF T$$APE& .BYTE IE.VER ; 12 - FORMATTER ERROR& .BYTE IS.SUC ; 13 - BOT ENCOUNTERED+ .BYTE IE.EOF ; 14 - TAPEMARK ENCOUNTEREDE .BYTE IE.FHE ; 15 - UNDEFINED, .BYTE IE.DAO ; 16 - RECORD DATA TRUNCATED$ .BYTE IE.VER ; 17 - POSITION LOST( .BYTE IE.ABO ; 18 - SERIOUS EXCEPTION* .BYTE IE.EOV ; 19 - LOGICAL END OF TAPE .IFF ;T$$APE .BYTE IE.FHE ; 12 - UNDEFINED .BYTE IE.FHE ; 13 - UNDEFINED .BYTE IE.FHE ; 14 - UNDEFINED .BYTE IE.FHE ; 15 - UNDEFINED .BYTE IE.FHE ; 16 - UNDEFINED .BYTE IE.FHE ; 17 - UNDEFINED .BYTE IE.FHE ; 18 - UNDEFINED .BYTE IE.FHE ; 19 - UNDEFINED .ENDC ;T$$APE .BYTE IE.FHE ; 20 - UNDEFINED .BYTE IE.FHE ; 21 - UNDEFINED .BYTE IE.FHE ; 22 - UNDEFINED .BYTE IE.FHE ; 23 - UNDEFINED .BYTE IE.FHE ; 24 - UNDEFINED .BYTE IE.FHE ; 25 - UNDEFINED .BYTE IE.FHE ; 26 - UNDEFINED .BYTE IE.FHE ; 27 - UNDEFINED .BYTE IE.FHE ; 28 - UNDEFINED .BYTE IE.FHE ; 29 - UNDEFINED .BYTE IE.FHE ; 30 - UNDEFINED2 .BYTE IE.FHE ; 31 - INTERNAL DIAGNOSTIC MESSAGE .EVEN;."00~ibjbkb a a a; DISK CLASS DRIVER DISPATCH TABLE;  .IF DF D$$DSK/ .IF DF DU$CHK ; QUEUE OPTIMIZATION SUPPORTEDN7 DDT$ DU,R$$UDA,,,,NEW=Y,OPT=Y; GENERATE DISPATCH TABLE2 .IFF ; DU$CHK2 DDT$ DU,R$$UDA,,,,NEW=Y ; GENERATE DISPATCH TABLE .ENDC ; DU$CHKY;I"; TAPE CLASS DRIVER DISPATCH TABLE; .IFF ;D$$DSKN2 DDT$ MU,R$$MYA,,,,NEW=Y ; GENERATE DISPATCH TABLE .ENDC ;D$$DSK .PAGE* .SBTTL XXINI - I/O INITIATOR ENTRY POINT;+ ; **-MUINI-INITIATOR ENTRY POINT ; **-DUINI-INITIATOR ENTRY POINT;V ; INPUTS:I;C; R4 = SCB ADDRESS; R5 = UCB ADDRESS;D ; OUTPUTS:;C; R2 = QST ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;-MUINI:DUINI: MOV S.QST(R4),R2 ; GET QST3 MOV S.PBIA(R4),@KISR6 ; MAP PORT DRIVER (IN APR 6)4 MOV S.PBIA(R4),@#KINAR6 ; KERNAL INSTRUCTION SPACE( CALLR CLACMD ; TRY TO START A COMMAND .PAGE* .SBTTL XXACC - PACKET ACCEPTANCE ROUTINE;+(; **-XXACC-ACCEPTANCE ROUTINE FOR $GSPKT;J; THIS ROUTINE DECIDES WHICH PACKETS CAN BE PROCESSED. IT CHECKS UMR WAITM; STATUS TO MAKE SURE THAT NECESSARY RESOURCES ARE AVAILABLE. IF THE UNIT IS2M; IN SERIAL MODE, NO I/O'S FOR THAT DEVICE ARE PROCESSED. FOR DISKS, I/O MAYVM; BE PREVENTED BY STALL I/O. FOR TAPES, IF ANY I/O'S ARE OUTSTANDING AND THEO; PACKET BEING CHECKED IS AN IO.SEC FUNCTION, THEN NO MORE PACKETS ARE ACCEPTEDAL; FOR THAT UNIT UNTIL ALL OUTSTANDING I/O'S COMPLETE (THIS IS TO INSURE THATP; THE GUS TMSCP COMMAND, WHICH IS AN IMMEDIATE TYPE COMMAND, IS ISSUED TO A UNITF; THAT IS QUIESCENT). THIS ROUTINE SHOULD ONLY BE CALLED FROM $GSPKT.;C ; INPUTS:L;E; R1 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;A ; OUTPUTS:;F; R0-R5 = PRESERVED &; C=1 = PACKET IS NOT TO BE DEQUEUED"; C=0 = PACKET IS TO BE DEQUEUED;-XXACC: .IF DF D$$DSKC BIT #UU.SER!UU.ATN!UU.IOS,U.UTIL(R5) ; SERIAL, ATTENTION, OR STALLI" BNE 40$ ; YES. GO REJECT PACKET7 BIT #UU.RCT,U.UTIL(R5) ; RCT IN PROGRESS ON THIS UNIT?H BEQ 20$ ; NOT- CMP I.TCB(R1),@RCTPT ; YES. IS I/O FROM RCT?E! BNE 40$ ; NO. GO REJECT PACKETE .IFF ;D$$DSKK? BIT #UU.SER!UU.ATN,U.UTIL(R5) ; ANY REASON NOT TO DO THIS I/O?5" BNE 40$ ; YES. GO REJECT PACKET7 CMP #IO.SEC,I.FCN(R1) ; SENSE CHARACTERISTICS COMMAND?U, BNE 20$ ; NO. CHECK FOR TRANSFER FUNCTION MOV S.QST(R4),R4 ; GET QST ASSUME Q.CST,0S MOV (R4),R4 ; GET CST( TST C.OLHD(R4) ; OUTSTANDING COMMANDS? BNE 40$ ; YES. REJECT PACKET5 BR 30$ ; NO. ACCEPT PACKET .ENDC ;D$$DSK20$:9 .IF NDF M$$PRO ; MIGHT NEED TO FORK IF WRONG PROCESSOR;6 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?S$ BNE 30$ ; YES. WE DON'T NEED UMRS .ENDC ;M$$PRO MOV S.QST(R4),R4 ; GET QST ASSUME Q.CST,0T MOV (R4),R4 ; GET CST+ BIT #C1.UMR,(R4) ; UNIT WAITING FOR UMRS?O BNE 40$ ; YES. REJECT PACKET( TST C.UMCT(R4) ; MORE UMR WAIT BLOCKS? BEQ 40$ ; NO.;T; ACCEPT PACKET;:30$: .IF DF,D$$DSK3 CMP I.TCB(R1),@RCTPT ; IS THE REQUEST FROM RCT...?/* BEQ 35$ ; IF EQ, DON'T CLEAR OUT UU.SEL; BIC #UU.SEL,U.UTIL(R5) ; MAKE SURE ERROR PACKET LOGGING ON 35$: ; REFERENCE LABEL .ENDC ;D$$DSK MOV U.SCB(R5),R4 ; GET SCB CLC ; ACCEPT PACKETR RETURNG;Q; REJECT PACKET,; 40$: MOV U.SCB(R5),R4 ; GET SCB SEC ; REJECT PACKET  RETURNO .PAGE' .SBTTL XXCAN - CANCEL I/O ENTRY POINT4;+*; **-DUCAN-CANCEL I/O ENTRY POINT FOR DISK*; **-MUCAN-CANCEL I/O ENTRY POINT FOR TAPE;CG; THIS ROUTINE HANDLES ABORTING OUTSTANDING T/MSCP COMMANDS FOR A GIVENOH; TASK AND UNIT. FOR DISK, NO PROCESSING IS PERFORMED SINCE DISK I/O ISL; RELATIVELY FAST. FOR TAPE, THIS ROUTINE WILL STEP THROUGH THE OUTSTANDINGH; I/O LIST AND SET A FLAG IN EACH PACKET THAT MATCHES THE UNIT AND TASK.N; LATER STATE PROCESSING WILL THEN STEP THROUGH THIS LIST AND ISSUE THE NEEDED; ABORT COMMANDS. ; ; INPUTS:4;+; R0 = IOP ADDRESS; R1 = TCB ADDRESS; R3 = CONTROLLER INDEX/; R4 = SCB ADDRESS; R5 = UCB ADDRESS;H ; OUTPUTS:; ; R000t__DATADATADATADATA = DESTROYED; R1-R5 = PRESERVEDO;-MUCAN:DUCAN: .IF DF,T$$APE0 CALL MAPD ; MAP PORT COMMON AREA THROUGH APR6 MOV S.QST(R4),R0 ; GET QST MOV (R0),R0 ; GET CST MOV R0,R2 ; GET WORK COPY# MOV C.OLHD(R0),R0 ; GET FIRST IOPH BEQ 30$ ; ALL DONEE.10$: CMP I.TCB(R0),R1 ; IOP FOR CORRECT TASK?! BNE 20$ ; NO. GET NEXT PACKETO* CMP I.UCB(R0),R5 ; IOP FOR CORRECT UNIT?! BNE 20$ ; NO. GET NEXT PACKETNB BISB #IP.ABO,I.FLAG(R0) ; MARK IT FOR ABO COMMAND ISSUANCE ;DC4129 BIS #C1.ABO,(R2) ; SET ABORT STATE FOR CONTROLLER ;**-19 BIT #UU.SER,U.UTIL(R5) ; ALREADY IN SERIAL MODE ON UNIT? & BNE 20$ ; YES. DO NOT SAY WE SET ITB BIS #UU.SER!UU.ABO,U.UTIL(R5); INDICATE SERIAL MODE AND WE SET IT!20$: MOV (R0),R0 ; GET NEXT IOP3 BNE 10$ ; CHECK ITC.30$: BIT #C1.ABO,(R2) ; DID WE CHANGE STATES? BEQ 40$ ; IF EQ, NOPE) CALLR MUINI ; GO PROCESS THE OPERATION?40$: .ENDC ;T$$APE RETURNN .PAGE8 .IF DF D$$DSK&DU$CHK ; IF QUEUE OPTOMIZATION SUPPORTED0 .SBTTL XXCHK - DISK SEEK OPTIMIZATION CHECKING'; **-DUCHK-VALIDATE AND CONVERT THE LBNL;DK; THIS ROUTINE IS CALLED FROM $DRQRQ TO DO LBN PROCESSING FOR DEVICES WHICHSN; SUPPORT QUEUE OPTIMIZATION. IF BLKC2 DETECTS AN ERROR IT WILL RETURN TO THE/; CORRECT PLACE IN $DRQRQ AFTER CALLING $IOALT.#;A ; INPUTS:D;W; R1 = IOP ADDRESS; R5 = UCB ADDRESS; ; OUTPUTS:;;4; IF THE CHECKS SUCCEEDS, THEN THE LBN IN THE PACKET=; IS REPLACED BY THE CYLINDER/TRACK/SECTOR. R1 IS PRESERVED.N;P:; IF THE CHECKS FAILS, THEN $IOALT IS ENTERED WITH A FINAL7; STATUS OF IE.BLK AND A RETURN TO THE CORRECT PLACE INE; $DRQRQ IS EXECUTED.T;O<; NOTE: ALL FUNCTIONS PUT INTO THE DRIVER QUEUE ARRIVE HERE.2; THESE INCLUDE IO.ATT, IO.DET, AND ACP FUNCTIONS.;- .ENABL LSB <DUCHK: CMPB #IO.RLB/256.,I.FCN+1(R1); DATA TRANSFER REQUEST? BLO 30$ ; NO. LEAVE IT ALONE: BITB #IO.RPB&IO.WPB,I.FCN(R1); READ/WRITE PHYSICAL BLOCK?" BEQ 10$ ; NO. DO BLOCK CHECKING7REQUE: MOV R1,R3 ; WE HAVE TO SIMULATE THE SETUP THATK9 CLRB I.FLAG(R3) ; BLKC2 WOULD PERFORM FOR $CVLBN ;DC412E% MOV I.PRM+10(R3),R2 ; ... ;**-1I MOV I.PRM+12(R3),R0 ; ...O BR 20$ ; NOW GO TO $CVLBN/10$: CALL @BLKC2 ; CHECK LOGICAL BLOCK NUMBER 120$: CALL @CVLBN ; CONVERT LOGICAL BLOCK NUMBER 5 MOV R2,I.PRM+10(R3) ; SAVE DESIRED CYLINDER ADDRESSE$ 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 ADDRESSU% MOV R3,R1 ; RESTORE PACKET ADDRESSE 30$: RETURN .DSABL LSBR .ENDC ;D$$DSK&DU$CHKR .PAGE" .SBTTL $XXINT - INTERRUPT HANDLER;+.; **-$XXINT-CLASS CONTROLLER INTERRUPT HANDLER; E; INTERRUPTS ARE RECEIVED FROM A CONTROLLER UNDER FOUR CIRCUMSTANCES:C; 1. DURING THE INITIALIZATION PROCESS (OPEN THE "VIRTUAL CIRCUIT")RE; 2. WHEN "COMMAND RING BUFFER" TRANSITIONS FROM "FULL" TO "NOT FULL"YH; 3. WHEN "RESPONSE RING BUFFER" TRANSITIONS FROM "EMPTY" TO "NOT EMPTY"E; 4. WHEN A FATAL ERROR IS DETECTED AND AN INTERRUPT CAN BE GENERATEDE;- .IF DF D$$DSK7 INTSE$ DU,PR5,R$$UDA ;;; GENERATE INTERRUPT SAVE CODE- .IFF ;D$$DSKR7 INTSE$ MU,PR5,R$$MYA ;;; GENERATE INTERRUPT SAVE CODE .ENDC ;D$$DSK( ;;; R5 IS ANY UCB ON THE CONTROLLER ;;; R4 = CONTROLLER INDEX7 MOV U.SCB(R5),R4 ;;; POINT TO CONTROLLER STATUS BLOCKE6 BIT #UU.SPC,U.UTIL(R5) ;;; SPECIAL ONLINE IN EFFECT? BEQ 10$ ;;; NO. FORK NORMALLY CALL SAVREG ;;; SAVE R0-R4 + CALL MAPD ;;; MAP PORT DRIVER (IN APR 6)T- JMPV PORT,PORINT ;;; EXECUTE REQUEST AT PR5.,10$: TST S.FRK+2(R4) ;;; FORK BLOCK IN USE? BEQ 20$ ;;; NO. CALL FORK RETURN ;;; YES. JUST RETURN020$: MOV R4,S.FRK+6(R4) ;;; SAVE OUR CURRENT R43 ADD #S.FRK+6,R4 ;;; AND SET UP FOR CALL TO $FORK1;( CALL @FORK1 ;;; CREATE SYSTEM PROCESS! ;;; R5 MUST STILL BE THE UCBC+ ;;; R4 MUST BE SCB BEFORE $FORK CALLEDN;N; RETURN AT FORK STATE;.: CLR S.FRK+2(R4) ; FREE FORK BLOCK FOR FURTHER INTERRUPTS5 MOV S.PBIA(R4),@KISR6 ; MAP PORT DRIVER (IN APR 6);4 MOV S.PBIA(R4),@#KINAR6 ; KE00~ibjbkb a a aRNAL INSTRUCTION SPACE7 JMPV PORT,PORINT ; TRANSFER TO PORT INTERRUPT ROUTINE  .PAGE0 .SBTTL XXKRB - CONTROLLER STATE CHANGE ROUTINE;+1; **-XXKRB-CLASS CONTROLLER STATUS CHANGE ROUTINEC; F; THIS ROUTINE WILL HANDLE SETTING CONTROLLER ONLINE/OFFLINE REQUESTS.;L; INPUTS;; R4 = DCB ADDRESS; R3 = CTB ADDRESS; R2 = KRB ADDRESS1; 0(SP) = RETURN ADDRESS FOR IMMEDIATE COMPLETIONC3; 2(SP) = RETURN ADDRESS FOR CALLER OF EXEC ROUTINEM'; C = 1 TRANSITION TO OFFLINE REQUESTED4&; C = 0 TRANSITION TO ONLINE REQUESTED:; $SCOFL NONZERO POSITIVE - SPECIAL ONLINE FOR SYSTEM DISK; $SCERR = 1 PRESET TO SUCCESS; PRIORITY = 0;I ; OUTPUTS*;K; $SCERR = 0 OPERATION PENDING:; $SCERR < 0 OPERATION FAILED ($SCERR CONTAINS ERROR CODE) ; $SCERR = 1 OPERATION SUCCEEDED7; 0(SP) = RETURN ADDRESS OF CALLER OF $KRBSC ROUTINE=;BN; THE DRIVER EITHER CHOSES TO REJECT THE STATUS REQUEST, ACCEPT IT IMMEDIATELYM; OR TO DO A DELAYED TRANSITION BY SAVING THE ADDRESS ON TOP OF THE STACK AND /; RETURNING TO THE SECOND ADDRESS ON THE STACK.N;-DUKRB:: MUKRB:: + BCC 20$ ; IF CC, GO TRANSITION TO ONLINEO MOV R2,R3 ; COPY KRB MOV K.OWN(R2),R4 ; GET UCB MOV U.SCB(R4),R4 ; GET SCB MOV S.QST(R4),R2 ; GET QST) CALL MAPD ; MAP PORT DRIVER (IN APR 6)N( MOV COMPCB,R0 ; GET PCB OF PORT DRIVER8 DECB P.RMCT(R0) ; DECREMENT 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' BIT)10$: CALLV PORT,STOMP ; RESET CONTROLLER / BIT #KS.EXT,K.STS(R3) ; CONTROLLER HAVE UMRS?M BNE 60$ ; NO. FINISH UPK MOV (R2),R3 ; GET CST# SEC ; TELL PORUMR TO DEALLOCATET- JMPV PORT,PORUMR ; DEALLOCATE UMRS AND EXITV;(; TRANSITION TO ONLINE; #20$: TST EXEVEC ; VECTORING DONE?T BNE 22$ ; YES.E PUSH ; SAVE REGISTERS MOV KINAR6,-(SP) ; SAVE KINAR60 MOV @#112,R0 ; GET ADDRESS OF TABLE OF ENTRIES( MOV (R0),R0 ; GET ADDRESS OF APR BIAS3 MOV (R0),KINAR6 ; MAP COMMON THROUGH I-SPACE APR6R" MOV #EXEVEC,R3 ; POINT TO VECTOR+ MOV #EXEVCL,R2 ; SPECIFY LENGTH OF VECTORN" CALL @#140004 ; TRANSLATE VECTOR# MOV (SP)+,KINAR6 ; RESTORE KINAR6C" POP ; RESTORE REGISTERS22$: CLR R5 ; NO BITS SETI, BISB K.HPU(R2),R5 ; GET ACTUAL UNIT NUMBER' ASL R5 ; SHIFT TO WORD INDEX K.HPU*2,5 ADD R2,R5 ; ADJUST FOR KRB BASE R5 = KRB+(K.HPU*2)68 ADD K.OFF(R2),R5 ; R5 = LAST UCB SLOT IN KRB UCB TABLE! MOV (R5),R5 ; R5 = UCB ADDRESS MOV U.SCB(R5),R4 ; GET SCB% MOV R5,K.OWN(R2) ; GIVE K.OWN VALUE TSTB @SCOFL ; SPECIAL ONLINE? BLE 30$ ; NO. CONTINUEO8 BIS #UU.SPC,U.UTIL(R5) ; SET SPECIAL ONLINE BIT IN UCB3 CLRB @SCERR ; CLEAR SCERR TO SHOW ONLINE PENDINGS1 BR 40$ ; DON'T DELAY RETURN FOR SPECIAL ONLINE -30$: POP ; DO DELAYED STATUS CHANGEW40$:B .IIF DF D$$DSK MOV #VCDSK,R1 ; R1 = VIRTUAL CIRCUIT ID FOR DISKB .IIF DF T$$APE MOV #VCTAP,R1 ; R1 = VIRTUAL CIRCUIT ID FOR TAPE6 CALL CLASUP ; INITIAL LOAD FUNCTIONS ON PORT COMMON BCS 50$ ; ERROR. GO HANDLE IT) CALL MAPD ; MAP PORT DRIVER (IN APR 6)B; INC 140000+CONCNT ; INCREMENT # OF CONTROLLERS USING PORTI5 MOV MPPROR,140000+MPPROX ; REVECTORED $MPPRO ADDRESSH& ; PUCOM CAN VECTOR OTHER ROUTINES6 CALLV PORT,PORSUP ; MORE SETUP FOR PACKET MANAGEMENT6 MOV #C1.CON!C1.SYN,(R3) ; ENTER C1.SYN,C1.CON STATE.* JMPV PORT,PORSYN ; START SYNCHRONIZATION)50$: PUSH ; SAVE REGISTERSC& CALL @SAVSTK ; TELL CON ABOUT ERROR+ POP ; RESTORE OUR REGISTERS  SEC ; ENSURE CARRY SET 60$: RETURNP .PAGE% .SBTTL XXOUT - TIME OUT ENTRY POINT ;+; **-XXOUT-TIME OUT ENTRY POINTI;M; REASONS FOR TIMEOUTS ARE:E;RC; 1. THE TIMER ON THE OLDEST COMMAND IN THE CONTROLLER HAS EXPIRED.RC; 2. (DISK ONLY) A CONTROLLER RE-SYNCH IS DONE AND OP.ONL'S MUST BE)D; RE-ISSUED FOR ANY UNITS STILL MARKED AS SPINNING UP (US.SPU=1).<; THE TIMEOUT IS SET AND PROCESSED BY THE RECSIO ROUTINE.F; 3. A FATAL ERROR HAS BEEN DETECTED00t__DATADATADATADATA AND NOW A RE-SYNCH MUST COMMENCE.C; CLAERR IS CALLED WHENEVER A FATAL ERROR IS DETECTED AND SETS A-; 1 SECOND TIMER.H; 4. CONTROLLER SYNCHRONIZATION STEP HAS TIMED OUT WHICH IS FATAL ERROR.; ; INPUTS:M;O; R4 = SCB ADDRESS; R5 = UCB ADDRESS;E ; OUTPUTS:;-DUOUT:MUOUT:3 MOV S.PBIA(R4),@KISR6 ; MAP PORT DRIVER (IN APR 6)R3 MOV S.PBIA(R4),@#KINAR6 ; FOR I/D SYSTEMS MAP BOTHS MOV S.QST(R4),R2 ; GET QST MOV (R2),R3 ; GET CST! BIT #C1.RDY,(R3) ; READY STATE?H% BEQ 20$ ; NO. CONTINUE, ELSE THIST" ; MUST BE A CMD TMO. FOR TAPE .IF DF D$$DSK) BIT #C1.R2,(R3) ; RECOVERY IN PROGRESS? ' BEQ 10$ ; NO. THIS MUST BE A COMMANDT( TST C.OLHD(R3) ; COMMANDS IN PROGRESS?) BNE 10$ ; YES. MUST BE COMMAND TIMEOUT=;B>; WE MUST BE HERE IN ORDER TO RETRY UNIT ONLINES AFTER A FATALA; ERROR RE-SYNCHRONIZATION. FOR EACH UNIT THAT USED TO BE ONLINEID; (US.SPU=1), RETRYS, IN CASE OF FAILURE, ARE DONE EVERY FEW SECONDS;C3 BIS #C1.R1,(R3) ; NOTE THAT WE NEED TO DO ONLINESN JMP RECSIO ; GO DO THEM .ENDC ;D$$DSK;T.; WE ARE HERE BECAUSE A COMMAND JUST TIMED OUT;E810$: BIT #C1.TMO!C1.GCS,(R3) ; DID GCS COMMAND TIME OUT? BEQ 15$ ; NO. CONTINUEM& JMP TMOERR ; YES. GO START RESYNCH315$: BIS #C1.GCS,(R3) ; INDICATE NEED TO DO OP.GCST, MOVB S.ITM(R4),S.CTM(R4) ; RESET TMO. COUNT6 CALLV PORT,PKTCH1 ; HAVE THE RESOURCES TO DO IT NOW? BCS 17$ ; NO. RETURNN JMP GCSSIO ; GO ISSUE ITE 17$: RETURNS;CA; IF WE GET HERE EITHER WE TIMED OUT BEFORE THE CONTROLLER GOT UP .; OR WE ARE HERE TO START A RE-SYNCHRONIZATION;E%20$: BIT #C1.FAT,(R3) ; FATAL STATE?: BEQ 30$ ; NO. CONTINUED, BIC #C1.FAT,(R3) ; YES. CLEAR FATAL STATE4 JMPV PORT,PORSYN ; AND START RESYNCH WITH THE CONT"30$: SEC ; LOG CONTROLLER ERROR% JMP CLAERR ; JUMP TO ERROR ROUTINE  .PAGE& .SBTTL XXPWF - POWERFAIL ENTRY POINT;+&; **-DUPWF- DISK POWERFAIL ENTRY POINT&; **-MUPWF- TAPE POWERFAIL ENTRY POINT;:G; THIS ROUTINE HANDLES POWERFAIL RECOVERY FOR CONTROLLERS. CLAERR WILLG; DEAL WITH ALL THE UNITS.;R ; INPUTS:H;I(; C = 1 INDICATES CONTROLLER POWERFAIL; R2 = KRB ADDRESS; R3 = CTB ADDRESS;#"; C = 0 INDICATES UNIT POWERFAIL; R3 = CONTROLLER INDEXA; R4 = SCB ADDRESS; R5 = UCB ADDRESS; ; OUTPUTS:;R; CONTROLLER ONLINE ;-DUPWF:MUPWF:/ BCC 20$ ; RETURN FOR UNIT; CLAERR WILL DO ITI MOV L.DCB(R3),R3 ; GET DCB MOV D.UCB(R3),R5 ; NOW UCB MOV U.SCB(R5),R4 ; NOW SCB) CALL MAPD ; MAP PORT DRIVER (IN APR 6)  MOV S.QST(R4),R2 ; GET QST MOV (R2),R3 ; GET CST( MOVB #RETRY,Q.RTY(R2) ; SET RETRY COUNT4 JMP CLAERR ; RESET STATES, QUEUES, AND SET UP TMO, ; COUNT. THE TIMEOUT ROUTINE WILL START ; RE-SYNCH FOR DISK.A 20$: RETURNA .PAGE, .SBTTL XXUCB - CON UNIT ONLINE ENTRY POINT;+(; **-XXUCB - CON UNIT ONLINE ENTRY POINT;R; ROUTINE DESCRIPTIONW; ; INPUTS:V;D&; R3 = CONTROLLER INDEX (S.KRB .NE. 0); R4 = SCB ADDRESS; R5 = UCB ADDRESS; 0(SP) - RETURN ADDRESS ; 2(SP) - DELAYED RETURN ADDRESS; C SET OFFLINEM; C CLEAR ONLINE; $CSERR SET TO 1, SUCCESS*; $SCOFL > 0 THEN ONLINE FOR SYSTEM DEVICE;S ; OUTPUTS:;E; R4-R5 ARE PRESERVED ; >; $SCERR = 0 OPERATION IS PENDING (MAXIMUM TIME IS 60 SECONDS)8; $SCERR < 0 OPERATION IS A FAILURE $SCERR CONTAINS CODE#; $SCERR = 1 OPERATION IS A SUCCESST4; 0(SP) = RETURN ADDRESS OF CALLER OF $UCBSC ROUTINE;-MUUCB:DUUCB::  .IF DF D$$DSK" BCS 40$ ; IF CS OFFLINE REQUEST; TST U.BPKT+2(R5) ; REPLACEMENT QUEUE ALREADY INITIALIZED?A BNE 10$ ; 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 ; GET KRB3 MOV R5,K.OWN(R2) ; MARK UNIT AS OWNING CONTROLLER . MOV U.UC2X(R5),R0 ; EXTENSION ALREADY THERE?( BNE 30$ ; YES. DON'T GET ANOTHER ONE .IF DF,D$$PRT ;DC412 < BIT #UU.PRT,U.UTIL(R5) ; ARE WE ALREADY A SUB-UNIT? ;DC412+ BEQ 15$ ; NOPE, DON'T DUPLICATE ;DC412I4 MOV U.KRB1(R5),R0 ; GET THE SUBCONTROLLER ;DC412) BEQ 15$ ; KRB1 NOT SET UP00~ibjbkb a a a YET ;DC412#1 MOV K1.OWN(R0),R0 ; GET THE OWNER UNIT ;DC412Q$ CMP R5,R0 ; IS THAT US? ;DC4120 BEQ 15$ ; GO AHEAD, NOT ALL READY YET ;DC4122 MOV U.UC2X(R0),R0 ; GET THEIR EXTENSION ;DC412, BEQ 19$ ; IF EQ, WE CAN'T DO THIS ;DC412+ MOV R0,@KISR6 ; MAP TO THE UCB2X ;DC412D9 INCB @#140000+X.PONL ; SHOW ANOTHER UNIT ONLINE ;DC412R" BR 30$ ; AND CONTINUE ;DC412?15$: MOV #</64.>,R1 ; SIZE W/ PARTITION INFO ;DC412  .IFF ;DF,D$$PRT ;DC412$< MOV #</64.>,R1 ; SIZE W/O PARTITION INFO ;DC412 .ENDC ;DF,D$$PRT ;DC412: CALL @ALSEC ; ALLOCATE A CHUNK OF SECONDARY POOL ;DC412 BCC 30$ ; OK ;DC412519$: MOVB #IE.UPN,@SCERR ; SET FAILURE CODE ;DC412 20$: RETURN ;**-5 ,30$: MOV R0,U.UC2X(R5) ; SAVE BLOCK ADDRESS .IF DF D$$PRT ;DC412; BIT #UU.PRT,U.UTIL(R5) ; ARE WE A PARTITIONED UNIT ;DC412 + BEQ 35$ ; IF EQ, NOPE, CONTINUE ;DC412Z ;DC412. MOV U.KRB1(R5),R0 ; GET THE SUB KRB ;DC4122 BEQ 35$ ; NOT INITIALIZED, WAIT FOR RCT ;DC4123 TST K1.OWN(R0) ; DO WE HAVE AN OWNER YET? ;DC412;+ BNE 35$ ; YUP, NO NEED TO UPDATE ;DC412B ;DC4129 MOV R5,K1.OWN(R0) ; SHOW US AS OWNER OF SUB-KRB ;DC4121"35$: .ENDC ;DF,D$$PRT ;DC4126 TSTB @SCOFL ; SPECIAL OFFLINE TO ONLINE TRANSITION? BLE 20$ ; NO- CALL MAPD ; MAP SECOND 4K WORDS ++++ HUH?U MOV S.QST(R4),R2 ; GET QST MOV (R2),R3 ; GET CST* CLRB @SCERR ; STATUS CHANGE IN PROGRESS) BIS #UU.SPC,U.UTIL(R5) ; SPECIAL ONLINEI! JMP ONLSIO ; BRING UNIT ONLINET-40$: CALL MAPD ; MAP PORT DRIVER (IN APR 6); MOV S.QST(R4),R2 ; GET QST MOV (R2),R3 ; GET CST$ MOV C.OLHD(R3),R1 ; GET QUEUE HEAD CALL 60$ ; CHECK THIS QUEUE, MOV U.BPKT(R5),R1 ; CHECK BAD PACKET QUEUE CALL 60$ ; IF ANY9 BIC #UU.SIO,U.UTIL(R5) ; CLEAR STALL I/O TO THIS DEVICEP* MOV U.UC2X(R5),R0 ; GET ADDRESS OF BLOCK- BEQ 90$ ; IF EQ, DON'T DO ANYTHING ;DC412 3 CLR U.UC2X(R5) ; SHOW THE UCBX AS DELETED ;DC412U .IF DF,D$$PRT ;DC412J6 BIT #UU.PRT,U.UTIL(R5) ; ARE WE A PARTITION? ;DC412+ BEQ 50$ ; NOPE, JUST DELETE UCBX ;DC412  ;DC4123 MOV U.KRB1(R5),R1 ; GET THE KRB1 ADDRESS ;DC412E, BEQ 50$ ; NOT PRESENT, JUST DO IT ;DC412 ;DC412* MOV R0,@KISR6 ; MAP TO THE UCBX ;DC412= DECB @#140000+X.PONL ; DROP COUNT OF UNITS INVOLVED ;DC412U9 BEQ 50$ ; IF EQ, WE DON'T HAVE TO FIND THE MASTE;DC412' ;DC4121 CMP K1.OWN(R1),R5 ; ARE WE THE MASTER? ;DC412;, BNE 50$ ; NOPE, JUST CLEAN UP ... ;DC412 ;DC412- MOV R1,R2 ; COPY THE KRB1 ADDRESS ;DC412,1 ADD #K1.UCB,R2 ; POINT TO THE UCB TABLE ;DC412U+45$: MOV (R2)+,R3 ; GET NEXT UCB ;DC412E$ CMP R3,R5 ; IS THAT US? ;DC412$ BEQ 45$ ; YES, CONTINUE ;DC412* TST U.UC2X(R3) ; UCBX PRESENT? ;DC412, BEQ 45$ ; NOPE, CAN'T SET THEM UP ;DC4123 MOV R3,K1.OWN(R1) ; WE HAVE A NEW MASTER ;DC412 $ BR 90$ ; AND WE ARE DONE ;DC412 ;DC412?50$: MOV #</64.>,R1 ; SIZE W/ PARTITION INFO ;DC412  .IFF ;DF,D$$PRT ;DC412R< MOV #</64.>,R1 ; SIZE W/O PARTITION INFO ;DC412 .ENDC ;DF,D$$PRT ;DC412< CALLR @DESEC ; DEALLOCATE A CHUNK OF SECONDARY POOL ;**-2360$: BEQ 90$ ; EMPTY QUEUE, MUST BE AFTER LOAD OF4$ ; R1 WITH FIRST (P)IOP ON QUEUE'70$: CMP R5,I.UCB(R1) ; FOR THIS UNIT?E BNE 80$ ; NO. CHECK NEXT# TST (SP)+ ; CLEAR RETURN ADDRESS( MOVB #IE.VER,@SCERR ; SET FAILURE CODE RETURN4!80$: MOV (R1),R1 ; GET NEXT IOP; BNE 70$ ; CHECK IT 90$: .ENDC ;D$$DSK RETURN  .PAGE .IF DF,T$$APE0 .SBTTL ABOSIO - KILL I/O'S ON UNIT REQUIRING IT;+,; **-ABOSIO-KILL I/O'S ON UNITS REQUIRING IT;OL; THIS ROUTINE SCANS THROUGH THE C.OLHD QUEUE FOR THE CURRENT CONTROLLER ANDJ; LOCATES ANY IOPS THAT HAVE THE IP.ABO BIT SET (BY XXCAN). IF THE IP.PNDH; BIT IS CLEAR, AN ABORT COMMAND IS ISSUED. CHECKING IS DONE IN REVERSEI; ORDER TO PREVENT THE N-TH I/O FROM ACTUALLY STARTING AFTER ABORTING THE(; N-TH MINUS 1 I/O.O;; INPUT:;C00t__DATADATADATADATA; R2 = QST ADDRESS; R3 = CST ADDRESS;. ; OUTPUT:D;$;-ABOSIO: #10$: CLR LSTPKT ; NO PACKET FOUND  MOV S.QST(R4),R2 ; GET QST MOV (R2),R0 ; GET CST0 ADD #C.OLHD,R0 ; POINT TO LIST HEAD TO PROCESS!20$: MOV (R0),R0 ; GET NEXT IOPA BEQ 30$ ; ALL DONET( CMP #IO.KIL,I.FCN(R0) ; 'KILL' COMMAND?" BEQ 20$ ; YES. LOOK AT ANOTHER> BITB #IP.ABO,I.FLAG(R0) ; SHOULD THIS CMD BE ABORTED? ;DC412* BEQ 20$ ; NO. FIND ANOTHER ONE ;DC412? BITB #IP.PND,I.FLAG(R0) ; ABO ALREADY ISSUED FOR THIS? ;DC412E BNE 20$ ; YES. ;**-3 " MOV R0,LSTPKT ; SAVE LAST PACKET BR 20$ ; CHECK FOR MORE#30$: TST LSTPKT ; ANYTHING FOUND?( BEQ 40$ ; NO.. CALLV PORT,PKTCHK ; ANY RESOURCES AVAILABLE? BCS 70$ ; NO. TRY AGAIN LATER MOV LSTPKT,R0 ; GET IOPT MOV I.UCB(R0),R5 ; GET UCB MOV U.SCB(R5),R4 ; GET SCB2 CALL PIOPAL ; ALLOCATE PIOP FOR 'DUMMY' COMMAND BCS 70$ ; UNABLE TO9 MOV #IO.KIL,I.FCN(R3) ; MAKE SURE WE KNOW WHENCE IT CAMEI MOV #ABOFUN,R0 ; ABORT COMMAND CALL CMDCOM ; BUILD TEMPLATE  MOV LSTPKT,R0 ; GET IOP ADDRC MOVB I.FLAG(R0),P.OTRF(R1) ; GET COMMAND REFERENCE NUMBER 1 ;DC412 A BIC #177760,P.OTRF(R1) ; USE ONLY 4 BITS WORTH (ACTUAL #) ;DC412O: MOV R0,P.OTRF+2(R1) ; PUT IN ASSOCIATED IOP ADDR ;DC412< BISB #IP.PND,I.FLAG(R0) ; SHOW ABORT COMMAND ISSUED ;DC4120 PUSH <#10$> ; GO BACK TO SCANNING LIST ;**-4% CALL CMDSEN ; GO ISSUE THE COMMAND ;; END PACKET PROCESSINGM; ' CLR R0 ; INDICATE NO I/O TO COMPLETEN$ PUSH <#0> ; NO INFORMATION NEEDED) CALL ENDCMO ; CLEAN UP AND RETURN HERE * BR 10$ ; MAKE ANOTHER PASS THROUGH LIST#40$: PUSH <#SCUCB> ; SCAN UCB LIST#.50$: CALL @(SP)+ ; CALL SCUCB AS A COROUTINE BCS 60$ ; ALL DONE.4 BIT #UU.ABO,U.UTIL(R5) ; DID XXCAN SET SERIAL MODE? BEQ 50$ ; NO.A BIC #UU.SER!UU.ABO,U.UTIL(R5) ; YES. RESET SERIAL AND ABORT MODE  BR 50$ ; FIND ANOTHER UNITS*60$: CALL 70$ ; RESTORE QST/CST ADRESSES& BIC #C1.ABO,(R3) ; LEAVE ABORT STATE BR 80$ ; RETURN70$: MOV S.QST(R4),R2 ; GET QST MOV (R2),R3 ; GET CST 80$: RETURNN .ENDC ;T$$APE .PAGE3 .SBTTL CLAATN - CLASS ATTENTION MESSAGE PROCESSINGN;+0; **-CLAATN - CLASS ATTENTION MESSAGE PROCESSING;E;; ATTENTION MESSAGES WILL CAUSE TRANSITION TO UU.ATN STATE. ; ; INPUTS:?;B; R1 = END PACKET ADDRESSR; R2 = QST ADDRESS; R3 = CST ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;I ; OUTPUTS:;0;-CLAATN: MOV R1,R2 ; SAVE COPY#8 CMPB #OP.AVA,P.OPCD(R1) ; AVAILABLE ATTENTION MESSAGE?" BNE 40$ ; NO. DEALLOCATE PACKET" PUSH <#SCUCB> ; SCAN UCB ROUTINE#10$: CALL @(SP)+ ; CALL COROUTINEN BCS 40$ ; NO MORE UCBSP= CMPB P.UNIT(R2),U.UNIT(R5) ; ATTENTION MESSAGE FOR THIS UCB?G BNE 10$ ; NO  .IF DF,D$$DSK4 BIT #UU.IOS,U.UTIL(R5) ; I/O STALLED TO THIS UNIT? BNE 20$ ; YES. MARK THIS UNIT, BITB #US.MNT,U.STS(R5) ; WAS UNIT MOUNTED? BNE 30$ ; NO. SKIP THIS ONE3 BIT #UU.SIO,U.UTIL(R5) ; CAN THIS UNIT STALL I/O?C BEQ 30$ ; NO. CONTINUEV20$: .ENDC ;D$$DSK* BIT #UU.ATN,U.UTIL(R5) ; DID WE ALREADY?# BNE 30$ ; YES. DON'T DO IT AGAINC" BIS #C1.GUS,(R3) ; SET GUS STATE> BIS #UU.GUS!UU.SER!UU.ATN,U.UTIL(R5); SET GUS, SERIAL AND ATN"30$: ADD #10,SP ; FLUSH UCB SCAN!40$: MOV R2,R1 ; GET END PACKETS MOV S.QST(R4),R2 ; GET QST& CALLV PORT,PKTDR ; DEALLOCATE PACKET RETURNT .PAGE7 .SBTTL CLACMD - INITIATOR AND CONTINUATION ENTRY POINTH;+>; **-CLACMD-INITIATOR ENTRY POINT AND CONTINUATION ENTRY POINT; L; DECIDE WHAT TO DO NEXT BASED ON CONNECTION MODES. A MODE IS A COMBINATION ; OF STATES.; ; INPUTS:';O; R2 = QST ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;. ; OUTPUTS:;I; R2 = PRESERVED; R4-R5 = PRESERVEDD; R3 = CST ADDRESS;-CLACMD: MOV (R2),R3 ; GET CSTC BIT #C1.RDY,(R3) ; RDY SET?Q BEQ 70$ ; NO.?10$: BIT #^C,(R3) ; ANYTHING BUT RDY OR DQU SET?I' BNE 20$ ; YES. SPECIAL STATE EXISTS  TST (R4) ; ANY I/O TO START?N BEQ 70$ ; NO. JUST EXIT .IF DF D$$DSK? BITB #C2.SHD,C.FLAG(R3) ; IS THIS A RECURSI00~ibjbkb a a aVE ENTRY? C2.SHD IS - ; ONLY FOR TESTING RECUSRSION THAT MIGHTE ; OCCUR DURING SHADOWINGU$ BNE 90$ ; YES. JUST EXIT ;DC412 ;**-1R( .IF DF DU$CHK ; IF QUEUE OPTIMIZATION5 BITB #S3.OPT,S.ST3(R4) ; QUEUE OPTIMIZATION ENABLED?Y# BEQ 13$ ; NO. GO CHECK RESOURCESC- MOV C.OLHD(R3),R1 ; GET OUTSTANDING REQUESTS, BEQ 15$ ; IF NONE, WE CAN ISSUE A REQUEST( TST (R1) ; MORE THAN ONE OUTSTANDING? BEQ 15$ ; NO. ISSUE THIS ONE$ BR 70$ ; CAN'T ISSUE ONE NOWI .ENDC ; DU$CHKE .IFTF ;D$$DSK.13$: CALLV PORT,PKTCHK ; RESOURCES AVAILABLE? BCS 70$ ; NO. RETURNW"15$: CALLR CMDSIO ; START AN I/O20$: .IF DF M$$PRO2 MOV @CPURM,-(SP) ; DETERMINE IF WE NEED TO FORK?0 BIT S.URM(R4),@(SP)+ ; ARE WE ON THE RIGHT CPU?! BNE 25$ ; IF NE, YES, CONTINUEC5 BITB #C2.FRK,C.FLAG(R3) ; DO WE HAVE A BLOCK QUEUED?$& BNE 90$ ; YES, JUST RETURN ;DC412 ;**-1T= BISB #C2.FRK,C.FLAG(R3) ; FLAG THAT WE ARE IN THE FORK QUEUE ( MOV S.URM(R4),R2 ; GET THE DESIRED URM .IF DF T$$APE0 MOV #MUINI,R3 ; SET TAPE INITIATOR ENTRY POINT .IFF ;DF,T$$APE0 MOV #DUINI,R3 ; SET DISK INITIATOR ENTRY POINT .ENDC ;DF T$$APE' CALLR @EXROP ; FORK TO THE RIGHT CPU =25$: BICB #C2.FRK,C.FLAG(R3) ; RESET OUR IN-PROGRESS FORK BIT2 .ENDC ;DF M$$PRON* CALLV PORT,PKTCHK ; RESOURCES AVAILABLE? BCS 70$ ; NO. RETURN9. BIT #C1.GCS,(R3) ; GET COMMAND STATUS STATE? BEQ 30$ ; NO. KEEP LOOKINGA# CALLR GCSSIO ; ISSUE GCS COMMANDV30$:* BIT #C1.GUS,(R3) ; GET UNIT STATUS STATE BEQ 50$ ; NO. CONTINUE$ CALLR GUSSIO ; ISSUE GUS COMMANDS50$: .IFT ;D$$DSK & BIT #C1.REC,(R3) ; RESYNCH RECOVERY? BEQ 70$ ; NO. KEEP LOOKINGO( CALLR RECSIO ; GO TO RECOVERY ROUTINE .IFF ;D$$DSKT! BIT #C1.ABO,(R3) ; ABORT STATE?; BEQ 70$ ; NO. KEEP LOOKINGK& CALLR ABOSIO ; ISSUE ABORT COMMANDS .ENDC ;D$$DSK70$: ;DC4124 BIT #C1.DQU,(R3) ; SHOULD WE DEQUEUE UMRS? ;DC412 BEQ 90$ ; NO ;DC4121 BIC #C1.DQU,(R3) ; RESET DEQUEUE STATE ;DC412S/ CALL @DQUMR ; CALL IT AS A COROUTINE ;DC412 890$: RETURN ; DON'T KNOW WHAT TO DO, SO RETURN ;DC412 .PAGE ;**-5! .SBTTL CLADAT - HANDLE DATAGRAMSO;+; **-CLADAT - PROCESS DATAGRAMSU;E ; INPUTS:D;S; R1 = END PACKET ADDRESSA; R2 = QST ADDRESS; R3 = CST ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;S ; OUTPUTS:;D;-CLADAT:  .IF DF E$$LOG! MOV R1,KEEPR1 ; SAVE END PACKETE4 PUSH <#SCUCB> ; PUSH "SCAN UCB'S" ROUTINE ON STACK(10$: CALL @(SP)+ ; CALL THE CO-ROUTINE BCS 20$ ; NO MORE UCBS MOV KEEPR1,R1 ; GET END PACKET4 CMPB P.UNIT(R1),U.UNIT(R5) ; PACKET FOR THIS UCB? BNE 10$ ; NOB$ ADD #10,SP ; YES. FLUSH THE STACK .IF DF,D$$DSKA BIT #UU.SEL,U.UTIL(R5) ; SHOULD PACKET BE LOGGED FOR THIS UNIT?= BNE 20$ ; NO3 .ENDC ;D$$DSK$ MOV P.STS(R1),R0 ; GET STATUS CODE/ BIC #^C,R0 ; GET MAJOR STATUS PORTION3 MOVB RSXTAB(R0),R0 ; MAP IT TO AN RSX STATUS CODE 0 BIC #177400,R0 ; MAKE SURE IT IS A BYTE STATUS CALL LERR ; LOG THE PACKETS$20$: MOV KEEPR1,R1 ; GET END PACKET .ENDC- JMPV PORT,PKTDR ; DEALLOCATE RECEIVE PACKETK .PAGE1 .SBTTL CLAEND - CLASS DISPATCHER FOR END PACKETSU;+,; **-CLAEND-CLASS DISPATCHER FOR END PACKETS;5; ROUTINE DESCRIPTIONO;DL; WHEN THE PORT DRIVER RECEIVES END PACKETS IT WILL CALL THE CLASS DRIVER ATP; CLAEND FOR EACH END PACKET. THIS PICKS UP THE THREAD FOR EACH I/O AND RETURNSF; TO THE CORRECT PLACE TO PROCESS THE END PACKET AND COMPLETE THE I/O.;T ; INPUTS:C; ; R0 =; R1 = END PACKET ADDRESSK; R2 = QST ADDRESS; R3 = CST ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS; ; OUTPUTS:; ; R2-R5 ARE PRESERVEDE;-5CLAEND: BITB #OP.AVA,P.OPCD(R1) ; ATTENTION MESSAGE?D BNE 100$ ; YEST"10$: MOV P.CRF+2(R1),R5 ; GET IOP MOV I.UCB(R5),R5 ; GET UCB1 CMPB #OP.GCS!OP.END,P.OPCD(R1) ; GET CMD STATUS?  BEQ 200$ ; YESI,20$: MOV C.OLHD(R3),R0 ; GET ENTRY IN QUEUE BEQ 45$ ; NONEE" MOV P.CRF+2(R1),R3 ; IOP ADDRESS30$: CMP R3,R0 ; SAME? BEQ 50$00t__DATADATADATADATA ; YES# MOV (R0),R0 ; NO. GET NEXT ENTRYA BNE 30$ ; CHECK ITE40$: MOV (R2),R3 ; GET CST)45$: JMPV PORT,PKTDR ; DEALLOCATE PACKETR50$: .IF DF D$$DSK TST P.STS(R1) ; SUCCESS? BEQ 70$ ; YES. CALL ENDSIO ; GO SEE IF WE SHOULD STALL I/O% BCC 70$ ; CC = I/O WAS NOT STALLEDU! RETURN ; CS = I/O WAS STALLED 70$: .ENDC ; DISK CONDITIONAL . JMP @I.PRM+6(R3) ; GO TO END PROCESS ROUTINE0100$: CALLR CLAATN ; PROCESS ATTENTION MESSAGE0200$: CALLR TMOGCS ; PROCESS IN TMOGCS ROUTINE .PAGE% .SBTTL CLAERR - FATAL ERROR RECOVERY$;+'; **-CLAERR- A FATAL ERROR HAS OCCURRED;:H; ON FATAL ERROR RESET CONTROLLER AND UNIT STATES. CLEAN UP C.OLHD QUEUE; DEALLOCATING ALL PIOPS;YG; FOR DISK, MOVE C.OLHD OLDEST I/O TO C.REDO SO THAT IT WILL BE RETRIED H; THE CONTROLLER COMES BACK. MOVE ALL COMMANDS IN C.OLHD TO THE FRONT O;D; FOR TAPE, MOVE ALL COMMANDS;; ; INPUTS:E;R; R2 = QST ADDRESS; R3 = CST ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;O ; OUTPUTS:;R; R2,R3,R4 PRESERVED; R5 IS A UCB ADDRESSR;-3TMOERR: MOVB #4,Q.RTY(R2) ; SET UP THE RETRY COUNT: SEC ; LOG ERRORSCLAERR:L0 BIT #C1.FAT,(R3) ; DID WE ALREADY DO ALL THIS?' BEQ 10$ ; NO. IT'S TIME TO DO IT NOWC RETURN ; DON'T DO IT AGAIN10$:;L/; IF CARRY IS SET THEN LOG FATAL HARDWARE ERRORAD; THIS ROUTINE IS CALLED ON 11M BOOT IN WHICH CASE THERE IS NO ERROR; .IF DF E$$LOG BCC 20$4 MOV #IE.FHE&377,R0 ; INDICATE FATAL HARDWARE ERROR# CALL CERR ; LOG CONTROLLER ERROR .ENDC-20$: CALLV PORT,STOMP ; STOMP THE CONTROLLERO;#4; RESET ALL STATES EXCEPT C1.REC,C1.R2,C1.UMR,C1.CON;O) BIC #^C,(R3)L* BIS #C1.FAT,(R3) ; MARK THAT WE DID THIS MOV R3,R0 ; GET CST, ADD #C.OLHD,R0 ; POINT TO THE C.OLHD QUEUE; "; DEALLOCATE ALL PIOPS FROM C.OLHD;H" MOV R0,R1 ; COPY THE QUEUE HEAD MOV (R1),R1 ; GET NEXT PACKET BEQ 50$ ; NONE LEFT(30$: PUSH <(R1)> ; POINTER TO NEXT IOP2 BITB #IP.FAK,I.FLAG(R1) ; IS IT A PIOP? ;DC412" BEQ 40$ ; NO. CONTINUE ;**-1 PUSH ; SAVE R0 AND R3) CALL @QRMVA ; REMOVE IT FROM THE QUEUE1 POP ; RESTORE R3 CALL PIOPDE ; DEALLOCATE IT POP ; RESTORE R040$: POP ; RESTORE R1 BNE 30$ ; GET ANOTHER$50$: MOV S.QST(R4),R2 ; RESTORE THE* MOV (R2),R3 ; RESTORE CST ADDRESS TO R3;;M; TAKE ANY IOP'S WAITING FOR UMR'S OUT OF THE UMR WAIT QUEUE PUT THEM BACK INL; S.LHD. CHANGE THE PRIORITY TO INSURE THAT IT GOES AT THE BEGINNING OF THE!; QUEUE, AND CLEAR THE C1.UMR BITN;U: BIT #C1.UMR,(R3) ; WAS THIS CONTROLLER WAITING FOR UMRS? BEQ 80$ ; IF EQ NOU PUSH ; SAVE R2 AND R30 MOV @UMRWT,R0 ; GET HEAD OF THE UMR WAIT QUEUE* BEQ 70$ ; IF NOTHING, SKIP THIS SECTION( MOV R0,R1 ; COPY THE QUEUE HEAD TO R1%60$: MOV (R1),R1 ; GET A WAIT BLOCKC BEQ 70$ ; NONE LEFT1 CMP 10(R1),R4 ; WAIT BLOCK FOR THIS CONTROLLER?T ; ..(SAME SCB)I BNE 60$ ; NO. TRY ANOTHER0 CALL @QRMVA ; REMOVE THE BLOCK FROM THE QUEUE4 MOV 6(R1),R1 ; GET IOP ADDRESS FROM THE WAIT BLOCK. .IF DF D$$DSK&DU$CHK ; IF QUEUE OPTIMIZATION4 MOV I.UCB(R1),R5 ; MAKE SURE WE HAVE THE RIGHT UCB! CALL REQUE ; RECONVERT THE LBNM .ENDC ;D$$DSK&DU$CHK;( MOV R4,R0 ; PUT THE S.LHD QUEUE ON R05 CALL @QINSB ; INSERT AT THE BEGINNING OF THE QUEUEA&70$: POP ; RESTORE R3 AND R2& BIC #C1.UMR,(R3) ; CLEAR THE UMR BIT;L; DEALLOCATE ANY UMR'S USEDB;680$:+ ADD #C.OLHD,R3 ; POINT TO THE .OLHD QUEUE !90$: MOV (R3),R3 ; GET A PACKET  BEQ 100$ ; NONE LEFTH5 BITB #IP.UMR,I.FLAG(R3) ; IS IT USING UMRS? ;DC412I" BEQ 90$ ; NO. CONTINUE ;**-1- CLR R0 ; TELL ENDCM1 NOT TO FINISH THE I/OO PUSH ; SAVE R3' CALL ENDCM1 ; GO DEALLOCATE THE UMRSE POP ; RESTORE R3 BR 90$ ; GO TRY ANOTHER%100$: MOV (R2),R3 ; RESTORE THE CST , DECB Q.RTY(R2) ; DECREMENT THE RETRY COUNT- BGT 110$ ; IF GT, WE STILL HAVE MORE TRIESB;6?; WE'VE EXHAUSTED OUR TIMEOUTS. CLEAN OUT THE QUEUES AND EXIT.3;3 MOV (R2),00 ~ibjbkb a a aR1 ; GET CST# CLR (R1) ; SET THE STATE OFFLINEL. ADD #C.OLHD,R1 ; POINTER TO THE C.OLHD QUEUE CALL FINIO ; FLUSH THE QUEUE  MOV R4,R1 ; GET SCB ADDDRESS , ADD #S.LHD,R1 ; POINTER TO THE S.LHD QUEUE/ JMP FINIO ; FLUSH THAT QUEUE TUEUE, AND EXIT3110$:02 MOVB #1,S.CTM(R4) ; SET A 1 SECOND TIMEOUT COUNT' ; RESYNCH WILL START FROM TIMEOUT.E' TST S.BSYU(R4) ; IS THERE A BUSY UNITL BNE 120$ ; IF NE, YES( MOV R5,S.BSYU(R4) ; ELSE MAKE ONE BUSY BISB #US.BSY,U.STS(R5)120$:2. ADD #C.OLHD,R3 ; POINTER TO THE C.OLHD QUEUE# MOV R3,R0 ; SET UP QUEUE ADDRESS  .IF DF D$$DSK;L); SEE IF WE'VE RETRYED THE OLDEST COMMAND;;T6 TST C.REDO-C.OLHD(R3) ; IS THE OLDEST CMD STILL HERE?* BEQ 130$ ; IF EQ, NO. SKIP THIS SECTION;D;I3; IF WE HAVE ALREADY TRYED THE OLDEST COMMAND TWICEO.; IT MUST BE 'FUNNY' SO COMPLETE IT AS IE.ABO.;: CMP (R3),C.REDO-C.OLHD(R3) ; OLDEST AT LAST FAIL THE SAME ; AS OLDEST THIS TIME? BNE 130$ ; IF NE, CONTINUES' ; ELSE THE OLDEST HAS FAILED TWICEP ; SO COMPLETE IT AS IE.ABO MOV R3,R0 ; R0 IS THE QUEUE% MOV (R0),R1 ; R1 IS THE OLDEST IOPT5 CALL @QRMVA ; REMOVE THE OLDEST CMD FROM THE QUEUEI ; R1 IS STILL IOP ADDRESS. MOV S.QST(R4),R2 ; R2,R3 DESTROYED BY $QRMVA ; FOR ENDCOM:* MOV I.UCB(R1),R5 ; R5 = THE UCB ADDRESS ; R4 = THE SCB ADDRESS MOV R1,R3 ; R3 = IOP ADDRESS CLR R1 ; R1 = BYTE COUNT$ MOV #IE.ABO&377,R0 ; R0 = #IE.ABO CALL ENDCM1 ; FINISH THE IOP; ?; ADD C.OLHD QUEUE TO C.REQU AND REMEMBER OLDEST FAILED COMMANDE;O"130$: MOV (R2),R3 ; GET CST BACK7 MOV C.OLHD(R3),C.REDO(R3) ; REMEMBER OLDEST FAILED CMDV MOV R3,R0 ; PUT THE CST IN R0, ADD #C.OLHD,R0 ; R0 POINTS TO C.OLHD QUEUE- TST (R0) ; IS THERE ANYTHING IN THE QUEUE?D BEQ 150$ ; NO. JUST CONTINUET MOV (R2),R1 ;2 ADD #C.REQU,R1 ; R1 IS THE ADDRESS OF THE C.REQU0 PUSH <(R1)> ; SAVE THE ADDRESS OF THE FIRST P- BNE 140$ ; WAS THERE ANYTHING IN THE QUEUEN3 MOV 2(R0),2(R1) ; NO. COPY THE LAST PACKET POINTEM3140$: MOV (R0),(R1) ; COPY THE POINTER FROM C.OLHD CLR (R0) ; QUEUE IS NOW EMPTY1 PUSH <2(R0)> ; SAVE THE LAST PACKET IN THE C.O00 MOV R0,2(R0) ; FINISH SETTING UP THE EMPTY QUE- POP ; GET BACK THE ADDRESS OF THE LASH) POP <(R0)> ; FIRST IN QUEUE NOW ON ENDC?150$: BIS #C1.REC!C1.R1!C1.R2,(R3); INDICATE WE ARE IN RECOVERY .IFF ;D$$DSK . MOV R0,R1 ; MOVE THE C.OLHD POINTER TO R1 F/ CALL FINIO ; FINISH ALL I/O IN C.OLHD AS IE.R .IFTF ;D$$DSK8 PUSH <#SCUCB> ; PUSH ADDRESS OF COROUTINE TO SCAN UCBS160$: CALL @(SP)+ ; GET A UCB  BCS 190$ ; NONE LEFTS .IFT ;D$$DSKE: BIT #UU.RDY,U.UTIL(R5) ; WAS THE UNIT IN THE READY STATE? BEQ 180$ ; NO. KEEP LOOKING- BITB #US.OFL,U.ST2(R5) ; IS THE UNIT ONLINE? ( BNE 180$ ; NO. THEN DON'T BRING IT UP+ BISB #US.SPU,U.STS(R5) ; SET SPIN UP BITR170$:  .ENDC ;D$$DSK> .IIF DF T$$APE BISB #US.PWF,U.STS(R5) ; SET THE POWERFAIL BITC180$: BIC #^C,U.UTIL(R5); CLEARC, ; UTILITY WORD. KEEP SOME BITS THE SAME ; (CONTEXT ACROSS COMMANDS), CLR U.CNT(R5) ; U.CNT USED FOR RETRY COUNT BR 160$ ; GO GET ANOTHER ONE 190$: RETURN .PAGE% .SBTTL CLASUP - CLASS SET UP ROUTINE ;+ ;- CLASUP - CLASS SET UP ROUTINE;>; THIS ROUTINE WILL MAKE SURE THAT THE COMMON IS IN MEMORY AND9; PROPERLY SET UP. THE FOLLOWING FUNCTIONS ARE PERFORMED:T;P1; 1. DETERMINE WHICH PORT THE CONTROLLER IS USING8%; 2. MAKE SURE THE PORT IS IN MEMORY.!?; 3. IF PORT IS NOT PRESENT, TRY TO LOAD IT. IF THAT FAILS, THEH7; DRIVER MUST BE DISABLED AND SEND MESSAGE VIA TKTN. /; 4. IF PORT IS PRESENT, FILL IN S.PBIA IN SCB. ; 5. THE PORT MUST BEU ; - FIXED; - NON SHUFFLABLE!; - NON REMOVABLE (BUMP P.RMCT)L; - NOT TOUCHABLE; ; INPUTS;W; R4 = SCB ADDRESS; R1 = VIRTUAL CIRCUIT ID;R ; OUTPUTSU;T; ALL REG ARE PRESERVEDE%; C=0 SUCCESS, COMMON LOADED PROPERLYP); C=1 FAILURE, COMMON NOT LOADED PROPERLYE!; S.PBIA IN SCB WITH BIAS OF PORTO00t__DATADATADATADATA;-CLASUP:S# CALL SAVREG ; SAVE REGISTERS 0-3H0 MOV S.PORT(R4),RADNAM ; GET RAD50 NAME OF PORT% MOV #RADNAM,R3 ; NAME TO SEARCH FORL' CALL @SRNAM ; SEARCH FOR PORT COMMONB" ; IF FOUND, R2 IS PCB ADDRESS BCS 20$ ; NO COMMON1 MOV R2,COMPCB ; SAVE PCB ADDRESS OF PORT COMMON MOV R2,R1 ; SAVE R22 BIT #PS.OUT,P.STAT(R1) ; PORT COMMON IN MEMORY ? BEQ 10$ ; YES0 MOVB #160.,P.PRI(R1) ; BRING IN COMMON QUICKLY) CALL @LDREG ; BRING COMMON INTO MEMORYB% MOV COMPCB,R1 ; RESTORE PCB ADDRESSP0 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-SHUFFLEABLE. BIS #P2.LMA,P.ST2(R1) ; DON'T TOUCH PARTITION5 MOV P.REL(R1),S.PBIA(R4) ; STORE BIAS OF PORT IN SCB; CLC ; INDICATE NO ERRORQ RETURNY820$: MOVB #IE.PNT,@SCERR ; INDICATE PARTITION NOT THERE SEC ; INDICATE FAILURE RETURN .PAGE. .SBTTL CLASYN - CLASS SYNCHRONIZATION ROUTINE;+); **-CLASYN-CLASS SYNCHRONIZATION ROUTINEM;RC; THIS ROUTINE IS CALLED BY THE PORT DRIVER FOR ONE OF TWO REASONS:F?; HARDWARE SYNCHRONIZATION HAS COMPLETED SUCESSFULLY OR HADWAREC; SYNCHRONIZATION HAS FAILED. IF THE SYNCHRONIZATION WAS SUCESSFUL,IE; THE CLASS DRIVER MUST ISSUE AN OP.SCC IMMEDIATELY AND PUT ALL UNITS ; INTO THEIR KNOWN STATES.; ; INPUTS:I;N; R2 = QST ADDRESS; R3 = CST ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;A; C=1 IF SYNCHRONIZATION FAILEDO!; C=0 IF SYNCHRONIZATION SUCEEDEDL; ; OUTPUTS:; ; R0-R1 ARE DESTROYEDU; R2-R5 ARE PRESERVEDO;D;-CLASYN: - BCC 10$ ; IF CC, SYNCHRONIZATION SUCCEEDEDS% JMP CLAERR ; JUMP TO ERROR ROUTINEY;R2; SUCESSFUL COMPLETION OF HARDWARE SYNCHRONIZATION;F10$:5 CLRB Q.IOSQ(R2) ; RESET SEQ NUM FOR THIS CONTROLLER  BIS #C1.SCC,(R3) ; SCC STATE$ CALL PIOPAL ; ALLOCATE PSEUDO-IOP8 MOV #SCCFUN,R0 ; POINT TO TABLE ENTRY FOR SCC COMMANDS6 CALL CMDCOM ; GET A T/MSCP PKT. FILL IN SOME FIELDS ; R1 IS ADD OF PKTC# CLR P.HTMO(R1) ; SET HOST TIMEOUTR .IF DF,E$$LOGG MOV #CF.ATN!CF.MSC!CF.THS,P.CNTF(R1); ALL PACKETS BACK FROM CONTROLLER .IFF ;E$$LOGP4 MOV #CF.ATN,P.CNTF(R1) ; ONLY ATTENTION MSG PACKETS .ENDC ;E$$LOG< MOVB #10.,S.ITM(R4) ; TIMEOUT OF 10 SECONDS ON SCC COMMAND+ CALL CMDSEN ; SEND COMMAND TO CONTROLLERS;S; END PACKET PROCESSINGL;T ; INPUTS:P; R1-PTR TO END PACKET;T& MOV R1,R0 ; COPY END PACKET ADDRESS2 ADD #P.CNTI,R0 ; POINT TO THE CONTROLLER CONTEXT MOV R2,R3 ; COPY QST ADDRESS(- ADD #Q.CNTI,R3 ; POINT TO CONTROLLER FIELDSV. MOV (R0)+,(R3)+ ; MOVE WORD OF CONTROLLER ID. MOV (R0)+,(R3)+ ; MOVE WORD OF CONTROLLER ID. MOV (R0)+,(R3)+ ; MOVE WORD OF CONTROLLER ID. MOV (R0)+,(R3)+ ; MOVE WORD OF CONTROLLER ID9 MOVB P.CSVR(R1),(R3)+ ; MOVE CONTROLLER SOFTWARE VERSIONO9 MOVB P.CHVR(R1),(R3) ; MOVE CONTROLLER HARDWARE VERSION9 MOVB Q.ID(R2),CONEND ; MAKE SURE CONTROLLER MODEL FOUNDD, MOV #CONTAB,R0 ; GET TABLE ADDRESS TO SCAN312$: CMPB Q.ID(R2),(R0)+ ; CONTROLLER MODEL MATCH?.& BEQ 13$ ; YES. USE THAT INFORMATION. TSTB (R0)+ ; SKIP OVER CONTROLLER INIT INFO BR 12$ ; CHECK ENTIRE TABLE613$: MOVB (R0),Q.INF(R2) ; STORE THE INIT INFO IN QST .IF DF,T$$APE6 BIC #UU.BLK,U.UTIL(R5) ; ASSUME MULTI DENSITY DEVICE7 MOV #SNGDEN,R3 ; ADDRESS OF SPECIAL DRIVE/CONTROLLERS) 14$: TSTB (R3) ; END OF TABLE?" BLT 17$ ; YES. USE THE DEFAULT6 CMPB (R3)+,Q.CNTI+6(R2) ; IS IT A SPECIAL CONTROLLER?' BNE 14$ ; NO. LOOK AT ANOTHER ENTRYR9 BIS #UU.BLK,U.UTIL(R5) ; YES. MARK IT AS SINGLE DENSITY 17$: ; REFERENCE LABEL .ENDC ;T$$APE MOV (R2),R3 ; GET CST BACK * MOV P.STS(R1),R0 ; GET STATUS/EVENT CODE1 BIC #^C,R0 ; CLEAR ALL BUT STATUS/EVENTB BEQ 20$ ; IF EQ, YESA;M; SYNCHRONIZATION HAS FAILED;D SEC ; LOG ERRORP3 JMP CLAERR ; SHOW ERROR. IF ANY RETRIES ARE LEFTA) ; A RETRY WILL BE INITIATED FROM THEC ; TIMEOUT ROUTINE20$:6 BIC #C1.SCC!C1.SYN,(R3) ; LEAV00~ibjbkb a a aE FROM THE SCC AND SYN, BIS #C1.RDY,(R3) ; AND GO TO THE RDY STATE. .IF DF D$$DSK&DUTMO ; IF PRE-DEFINED TIMEOUT6 MOVB #DUTMO,S.ITM(R4) ; SET UP INITIAL TIMEOUT VALUE .IFF ; NORMAL CASES: MOVB P.CTMO(R1),S.ITM(R4) ; SET-UP INITIAL TIMEOUT VALUE .ENDC ;D$$DSK&DUTMO7 BIT #C1.CON,(R3) ; IS THIS CON ONLINE FOR CONTROLLER?  BEQ 40$ ; IF EQ, NO& BIC #C1.CON,(R3) ; CLEAR OUT THE BIT: MOVB #IS.SUC&377,@SCERR ; INDICATE SUCCESS OF CON ON_LINE$ MOV S.KRB(R4),R0 ; GET KRB ADDRESS' MOV K.OWN(R0),R0 ; THE THE OWNING UCBR4 BIT #UU.SPC,U.UTIL(R0) ; IS IT THE SPECIAL ONLINE?& BEQ 30$ ; NO. DO THE DELAYED RETURN7 BIC #UU.SPC,U.UTIL(R0) ; CLEAR THE SPECIAL ONLINE BITO# BR 40$ ; SKIP THE DELAYED RETURN)430$: PUSH ; SAVE REGISTERS TO BE SAFE! MOV S.KRB(R4),R2 ; GET KRB BACKO/ CALL @SAVSTK ; CALL EXEC ROUTINE TO INDICATEB ; CON-ONLINE HAS FINISHED' POP ; RESTORE REGISTERS &40$: MOV P.CRF+2(R1),R3 ; ADD OF PIOP5 MOV #IS.SUC,R0 ; TELL ENDCOM TO DEALLOCATE THE PIOPO+ PUSH <#0> ; PUSH BYTE COUNT - FOR ENDCOMT, CALL ENDCMO ; PERFORM END PROCESSING CODE .IF DF,D$$DSK .IF NE,SPNTMO; M; THE FOLLOWING CODE SCANS THE UCBS ON THIS CONTROLLER LOOKING FOR A SPECIFICPJ; UNIT TYPE (IN THIS CASE RA81). IF ONE IS FOUND, THE UU.SER BIT FOR THATK; UNIT IS SET SO THAT NO I/O'S WILL BE ACTIVATED FOR THAT UNIT. A TIMER ISAJ; SET SO THAT AFTER 'N' SECONDS, THE BIT GETS CLEARED AND I/O TO THAT UNITK; WILL BE ALLOWED TO CONTINUE. A FORCED TIMEOUT WILL MAKE SURE IT HAPPENS.SL; THE TIMER AND FORCED TIMEOUT WILL NOT OCCUR UNTIL THE CONTROLLER AND UNITSK; HAVE BEEN MSCP ONLINED AT LEAST ONCE SINCE IT IS THAT PROCESS WHICH FILLSE$; IN THE UCB WITH THE DEVICE 'NAME'.;EDELAY:0 PUSH ; SAVE FIRST HALF OF REGISTERS" CALL @ALCLK ; GET A CLOCK BLOCK0 BCS 110$ ; DID NOT GET ONE. SO, JUST GET OUT6 PUSH ; SAVE REGISTERS NEEDED DURING THIS PUSH <#0> ; COUNTER= MOV #140000+X.NAME,R1 ; DEVICE NAME IN UCBX (APR 6 MAPPING)L$ MOV S.KRB(R4),R2 ; GET KRB ADDRESS0 ADD K.OFF(R2),R2 ; POINT TO START OF UCB TABLE&10$: CMP (R2),#-1 ; END OF UCB TABLE? BEQ 20$ ; BRANCH IF SOT MOV (R2)+,R3 ; GET NEXT UCBT' BITB #US.SPU,U.STS(R3) ; SPINNING UP?: BEQ 10$ ; BRANCH IF NOT+ MOV U.UCBX(R3),@KISR6 ; MAP UCB EXTENSIONA" CMP #^RRA8,(R1) ; RA81? (RAD50) BNE 10$ ; BRANCH IF NOT# CMP #^R1 ,2(R1) ; RA81? (RAD50)  BNE 10$ ; BRANCH IF NOT INC (SP) ; COUNT IT4 BISB #UU.SER,U.UTIL(R3) ; BLOCK OP.GUS FROM RECSIO BR 10$K;R*; SET UP CLOCK BLOCK IF RA81(S) WERE FOUND;P20$: TST (SP)+ ; ANY RA81? BEQ 100$ ; BRANCH IF NOT ' PUSH ; SAVE WORK REGISTERS( MOV @TKPS,R0 ; GET CLOCK RATEU* MOV #SPNTMO,R1 ; GET TIME OUT IN SECONDS CALL @MULS ; MULTIPLY& MOV R1,R2 ; SWITCH TO REGS EXPECTED MOV R0,R1 ; BY $CLINS* POP ; GET BACK CLOCK BLOCK ADDRESS+ MOV #TIMHAN,R3 ; CLOCK EXPIRATION HANDLERA- MOV R3,C.SUB(R0) ; CLOCK EXPIRATION HANDLERE3 MOV S.KRB(R4),R5 ; SAVE KRB ADDRESS AS IDENTIFIERR4 MOV #C.SYST,R4 ; CLOCK REQUEST TYPE - INTERNAL S/R' CALL @CLINS ; PUT IN THE CLOCK QUEUER, POP ; GET UCB, SCB ADDRESSES BACK6100$: POP <@KISR6,R3> ; GET MAPPING AND REGISTER BACK6110$: POP ; GET REST OF REGISTERS RESTORED JMP SKIP01 TIMHAN:O: PUSH ; SAVE REGISTERS / CURRENT MAPPING PUSH <#0> ; SET UP A COUNTERI6 MOV #140000+X.NAME,R1 ; POINT TO DEVICE NAME IN UCBX$ MOV C.TCB(R4),R2 ; GET KRB ADDRESS0 ADD K.OFF(R2),R2 ; POINT TO START OF UCB TABLE&10$: CMP (R2),#-1 ; END OF UCB TABLE? BEQ 20$ ; BRANCH IF SOP MOV (R2)+,R3 ; GET NEXT UCB5' BITB #US.SPU,U.STS(R3) ; SPINNING UP?$ BEQ 10$ ; BRANCH IF NOT+ MOV U.UCBX(R3),@KISR6 ; MAP ucb EXTENSION " CMP #^RRA8,(R1) ; RA81? (RAD50) BNE 10$ ; BRANCH IF NOT# CMP #^R1 ,2(R1) ; RA81? (RAD50)/ BNE 10$ ; BRANCH IF NOT INC (SP) ; COUNT IT6 BICB #UU.SER,U.UTIL(R3) ; UNBLOCK OP.GUS FROM RECSIO BR 10$B;)9; CONDITIONALLY SETUP DUDRV TIMEOUT IF RA81(00"t__DATADATADATADATAS) WERE FOUND ;U20$: TST (SP)+ ; ANY RA81(S)?D BEQ 30$ ; BRANCH IF NOT MOV C.TCB(R4),R2 ; GET KRB' ADD K.OFF(R2),R2 ; POINT TO UCB TABLE  MOV (R2),R3 ; GET A UCB MOV U.SCB(R3),R2 ; GET SCB' TSTB S.CTM(R2) ; TIMEOUT IN PROGRESS?R, BNE 30$ ; BRANCH IF SO - IT'LL DO THE JOB% INCB S.CTM(R2) ; SET A QUICK ONE UPR& TST S.BSYU(R2) ; GOT AN ACTIVE UNIT?* BNE 30$ ; BRANCH IF SO - THAT'LL DO TOO- MOV R3,S.BSYU(R2) ; SET AN 'ACTIVE' UNIT UP + BISB #US.BSY,U.STS(R3) ; AND MARK IT BUSYW; #; DEALLOCATE CLOCK BLOCK AND RETURN8;)30$: POP <@KISR6,R3,R2,R1># MOV R4,R0 ; POINT TO CLOCK BLOCKD CALLR @DECLK ; DEALLOCATE ITLSKIP01: ; REFERENCE LABEL .ENDC ; SPNTMO  .ENDC ;D$$DSK( BIT #C1.REC,(R3) ; ARE WE IN RECOVERY? BEQ 50$ ; NO. JUST RETURN2 MOVB #1,S.CTM(R4) ; SET A 1 SECOND TIMEOUT COUNT* TST S.BSYU(R4) ; IS A UNIT ALREADY BUSY? BNE 50$ ; YES. RETURN$ MOV R5,S.BSYU(R4) ; SET A BUSY UCB* BISB #US.BSY,U.STS(R5) ; MARK IT AS BUSY 50$: RETURN  .PAGE; .SBTTL CMDCOM - ALLOCATE AND FILL IN COMMON COMMAND PACKETS;+7; **-CMDCOM- ALLOCATE AND FILL IN COMMON COMMAND PACKETE; ?; THIS ROUTINE ALLOCATES A COMMAND PACKET AND A RESPONSE PACKETM=; FOR THE TMSCP/MSCP COMMAND ABOUT TO BE ISSUED. BEFORE THIS>; ROUTINE IS CLALED, PKTCHK MUST HAVE BEEN CALLED TO DETERMINE@; IS THERE ARE ENOUGH RESOURCES TO START THE TMSCP/MSCP I/O. TO;; HAVE REACHED THIS POINT, SUFFICIENT RESOURCES MUST EXIST.B; B; ONCE THE COMMAND PACKET IS ALLOCATED, THIS ROUTINE FILLS IN SOMEA; OF THE COMMON FIELDS FOR VARIOUS ROUTINES. THE COMMAND PACKET,O:; WHEN FIRST ALLOCATED, IS ZEROED OUT BEGINNING AT TEXT+0.;I ; INPUTS:S;C$; R0 = FUNCTION DISPATCH TABLE ENTRY; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;, ; OUTPUTS:;V; R0 = PRESERVED*; R1 = ADDRESS OF COMMAND PACKET ALLOCATED; R2-R5 ARE PRESERVED/; =; THE FOLLOWING FIELDS ARE INITIALIZED IN THE COMMAND PACKET:B>; P.CRF = COMMAND REFERENCE (PART 1) SET TO I/O SEQ NUMBER;; P.CRF+2 = COMMAND REFERENCE (PART 2) SET TO IOP ADDRESSO+; P.UNIT = UNIT NUMBER SET TO U.UNIT(R5)R%; P.OPCD = OPCODE SET TO FO.OP(R0)U; REST OF PACKET ZEROED OUTP;-CMDCOM:T- PUSH ; SAVE POINTER TO DISPATCH ENTRY40 MOVB FO.SZ(R0),R0 ; GET SIZE OF COMMAND PACKET3 CALLV PORT,PKTAC ; ALLOCATE/ZERO A COMMAND PACKETK5 INCB Q.IOSQ(R2) ; INCR SEQ NUM FOR THIS CONTROLLERN6 BICB #^C<17>,Q.IOSQ(R2) ; ONLY USE A FOUR BIT COUNTER; BISB Q.IOSQ(R2),P.CRF(R1) ; USE AS COMMAND REFERENCE NUM 1.6 BICB #017,I.FLAG(R3) ; CLEAR OUT CRF IN IOP ;DC412G BISB P.CRF(R1),I.FLAG(R3) ; STORE THE ACTUAL COMMAND REF NUMBER ;DC412T> MOV R3,P.CRF+2(R1) ; IOP ADDRESS IS SECOND CREF NUMBER ;**-2= BISB U.UNIT(R5),P.UNIT(R1) ; UNIT NUMBER (OBVIOUSLY 255 MAX) , POP ; RESTORE DISPATCH ENTRY POINTER# MOVB FO.OP(R0),P.OPCD(R1) ; OPCODEI/ BIT #IQ.X,I.FCN(R3) ; INHIBIT ERROR RECOVERY?E BEQ 10$ ; NO.. BIS #MD.SER!MD.SEC,P.MOD(R1); INHIBIT IT THEN 10$: RETURNC .PAGE+ .SBTTL CMDDAT - PROCESS ALL DATA TRANSFERSF;+,; **-CMDDAT- PROCESS DATA TRANSFER REQUESTS.;(J; THIS SECTION DOES ALL THE PROCESSING SPECIFIC TO DATA TRANSFER REQUESTS.H; THERE ARE SEPARATE ENTRY POINTS FOR DIFFERENT FUNCTIONS. ANY SPECIFICM; PROCESSING IS DONE AT EACH ENTRY POINT, AND THEN THEY ALL JOIN COMMON CODE.I;; WHEN THE ROUTINE CMDSEN IS CALLED, THE PACKET IS SENT ANDRL; CONTROL IS RETURNED TO CLACMD TO PROCESS ANOTHER I/O. WHEN THE END PACKETL; IS RECEIVED, CONTROL IS RETURNED TO THIS ROUTINE IMMEDIATELY FOLLOWING THE; CALL CMDSEN COMMAND.;-*; **-CMDCMP- COMPARE HOST DATA ENTRY POINT3; COMPARES DATA IN HOST BUFFER WITH DATA IN THE MUN; CONTROLLER BUFFER;R ; INPUTS:E;Y; R0 = FUNCTION TABLE ENTRYN; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;C ; OUTPUTS:; ; DATA TRANSFER I/O STARTEDL; R2-R5 PRESERVEDS; A; FIRST CHECK FOR ANY ERROR CONDITIONS THAT WE CAN DETECT WITHOUT B; SENDING A COMMAND TO THE CONTROLLER. IF NO ERROR CONDITIONS ARE8; FO00*~ibjbkb a a aUND, GET AN MSCP PACKET, FILL IT IN, AND SEND IT OFF;D .IF DF D$$DSK .ENABL LSBPCMDWDD:A< PUSH <#MD.CMP!MD.ERR> ; SET MODS TO WRITE DELETED DATA MARK, BR 10$ ; SKIP OVER PUSHING 0 ON THE STACKCMDWPB: ;DC412SCMDWLB:I PUSH <#0>?10$: BIT #DV.SWL,U.CW1(R5) ; IS THE UNIT SOFTWARE WRITE LOCKED?A BEQ 20$ ; NO. CONTINUE26 MOV #IE.WLK&377,R0 ; SET UP WRITE LOCKED STATUS CODE! BR CMDERR ; AND FINISH THE I/OECMDRPB: ;DC412RCMDRLB:F PUSH <#0>?20$: BITB #IO.RPB&IO.WPB,I.FCN(R3); IS IT READ/WRITE PHYS. BLK?T1 BNE 40$ ; YES. DON'T CHECK MAX LBN, SET MD.CMPAA .IF NDF DU$CHK ; BLOCK CHECKING DONE IN DUCHK IF Q OPT05 PUSH ; SAVE FUNCTION TABLE ADDRESS AND QST ! .IF DF,D$$PRT!E$$LBN ;DC412:5 MOV I.PRM+10(R3),R2 ; GET HIGH PART OF LBN ;DC412K% .IFF ;DF, ;DC412#$ CLR R2 ; CLEAR HIGH BYTE ;DC4123 BISB I.PRM+10(R3),R2 ; GET THE HIGH BYTE ;DC412R& .ENDC ;DF, ;DC4123 MOV I.PRM+12(R3),R0 ; GET LOW PART OF LBN ;**-1I6 MOV I.PRM+4(R3),R1 ; GET NUMBER OF BYTES TO TRANSFER$ ADD #777,R1 ; ROUND TO NEXT BLOCK- ROR R1 ; CALCULATE #OF BLOCKS IN HIGH BYTEP CLRB R1 ; CLEAR EXCESS BYTE. SWAB R1 ; CALCULATE # OF BLOCKS IN TRANSFER0 ADD R1,R0 ; CALCULTE HIGHEST BLOCK NUMBER + 1! .IF DF,D$$PRT!E$$LBN ;DC412$0 BIT #DV.32B,U.CW1(R5) ; 32-BIT DEVICE ;DC412, BEQ 22$ ; IF NOT 32-BIT, CONTINUE ;DC412 ;DC412 ADC R2 ; ;DC412/ BCS 25$ ; IF CS ILLEGAL BLOCK NUMBER ;DC412T4 CMP R2,U.CW2(R5) ; HIGH PART OF LBN LEGAL? ;DC412' BR 23$ ; REJOIN COMMON CODE ;DC412D#22$: ; REFERENCE LABEL ;DC412 & .ENDC ;DF, ;DC412 ADCB R2 ;' BCS 25$ ; IF CS ILLEGAL BLOCK NUMBER - CMPB R2,U.CW2(R5) ; HIGH PART OF LBN LEGAL? #23$: BHI 25$ ; IF HI NO ;DC412  BLO 30$ ; IF LO YES ;**-1;+ CMP R0,U.CW3(R5) ; LOW PART OF LBN LEGAL?  BLOS 30$ ; IF LO OR SAME YES >25$: POP ; RESTORE QST AND FUNCTION TABLE ADDRESS- MOV #IE.BLK&377,R0 ; SET UP THE STATUS CODEA BR CMDERR ; AND EXIT>30$: POP ; RESTORE QST AND FUNCTION TABLE ADDRESS .ENDC ; DU$CHKC: BITB #IO.RLC&IO.WLC,I.FCN(R3); READ/WRITE CHECK FUNCTION?% .IF DF D$$WCK ; IF DISK WRITECHECK2! BNE 40$ ; YES. SET THE CMP BIT38 CMPB #IO.WLB/256.,I.FCN+1(R3); IS THIS A WRITE REQUEST?- BNE 50$ ; NO. DO NOT ATTEMPT TO SET MD.CMPN7 BITB #US.WCK,U.STS(R5) ; DOES UNIT HAVE CHECK ENABLED?R .ENDC ; D$$WCK  BEQ 50$ ; NO. FORGET IT$40$: BIS #MD.CMP,(SP) ; SET THE BIT+50$: BIT #IQ.Q,I.FCN(R3) ; HOW ABOUT IQ.Q?  BEQ CMDDAT ; NO. KEEP GOING BIS #MD.EXP,(SP) ; SET THE BIT BR CMDDAT .DSABL LSBO .IFF ;D$$DSK CMDCMP:C2 PUSH <#MD.CSE> ; CLEAR SERIOUS EXCEPTION CLEARED CMP I.PRM+4(R3),#2S" ; SPECIAL CASE: RETURN IE.SPC$ ; TO TELL THAT IO.CMP SUPPORTED! ; WITHOUT ACTUAL TAPE MOTION  ; BEING DONET! BGT CMDDAT ; NO - REAL COMMANDE. MOV #IE.SPC&377,R0 ; INDICATE A 'FAILURE' OF ; COMMAND TO FUNCTION% BR CMDERR ; CLEAN UP AFTER REQUEST#CMDWLB:R* PUSH <#MD.CSE> ; CLEAR SERIOUS EXCEPTION/ CMP I.PRM+4(R3),#14. ; ENOUGH BYTES FOR WRITE?  BHIS 10$ ; IF HI YES.2 MOV #IE.SPC&377,R0 ; SET UP BAD PARAMETERS ERROR BR CMDERR ; AND EXIT>10$: BIT #M.SWL,U.CW2(R5) ; IS THE UNIT SOFTWARE WRITE LOCKED? BEQ CMDDAT ; NO. CONTINUE6 MOV #IE.WLK&377,R0 ; SET UP WRITE LOCKED STATUS CODE! BR CMDERR ; AND FINISH THE I/OCMDRLV:S5 PUSH <#MD.REV!MD.CSE> ; SET MODIFIER TO READ REVERSE ( BR CMDDAT ; CONTINUE WITH COMMON CODE9CMDRLB: PUSH <#MD.CSE> ; CLEAR SERIOUS EXCEPTION ON READN( BR CMDDAT ; CONTINUE WITH COMMON CODE .ENDC ;D$$DSK%CMDERR: TST (SP)+ ; CLEAR THE STACKS CALLR CMDXIT ; AND EXIT/CMDDAT: CALL CMDCOM ; GO GET A COMMAND PACKET5 BIS (SP)+,P.MOD(R1);W1; IF WE NEED UMRS, ALLOCATE THEM FOR THE TRANSFERE;K* BIT #DV.EXT,U.CW1(R5) ; DO WE NEED UMRS?$ BNE 50$ ; NO. SKIP ALL THIS STUFF .IF DF M$$PROB BITB #IP.UMR,I.FLAG(R3) ; HAVE WE 002t__DATADATADATADATAALREADY ALLOCATED BLOCK ;DC412$ BEQ 5$ ; NO. THEN WE MUST ;**-1 MOV (R2),R0 ; POINT TO CST 0 MOVB I.PRM(R3),R2 ; GET UMR WAIT BLOCK POINTER ASL R2 ; MAKE A WORD OFFSET ADD R2,R0 ; ADD TO CSTS+ ADD #C.UMRW,R0 ; POINT TO UMR WAIT BLOCKSC MOV (R0),R0 ; GET ADDRESS. DEC R0 ; LOW BIT FLAG WAS SET - ODD ADDRESS2 BR 32$ ; ALREADY HAVE BLOCK--GO PAST ALLOCATION5$:1 .ENDC ;M$$PRO. PUSH ; SAVE THE COMMAND PACKET ADDRESS MOV (R2),R1 ; GET CST5 DEC C.UMCT(R1) ; DECREMENT THE UMR WAIT BLOCK COUNT47 ADD #C.UMRW,R1 ; POINT TO BEGINNING OF THE WAIT BLOCK;1 MOV #-1,R2 ; COUNTER = -1 BECAUSE WE INCREMENTB+10$: INC R2 ; INCREMENT THE INDEX COUNTER$ TST (R1) ; IS THERE A BLOCK HERE?' BEQ 20$ ; IF EQ NO. ALLOCATE ANOTHER(% BIT #1,(R1)+ ; IS THE BLOCK IN USE?  BNE 10$ ; YES. TRY ANOTHER MOV -(R1),R0 ; GET WAIT BLOCKO BR 30$ ; GO TO COMMON CODE;<20$: PUSH ; SAVE THE TABLE ADDRESS AND BLOCK INDEX+ MOV #UMRWTB,R1 ; SET LENGTH OF CORE BLOCKE! CALL @ALOCB ; GET A WAIT BLOCKD6 POP ; RESTORE BLOCK INDEX AND TABLE ADDRESS BCC 25$ ; WE GOT ONE,OK MOV S.QST(R4),R2 ; GET QST MOV (R2),R1 ; GET CST8 INC C.UMCT(R1) ; NOT GOING TO USE WAIT BLOCK AFTER ALL% POP ; GET BACK COMMAND PACKET#- MOV #IE.NDR&377,R0 ; SET NO DYNAMIC MEMORYY CLR R1 ;E3 JMP @IOFIN ; COMPLETE I/O WITH NO DYNAMIC MEMORYT@25$: .IIF DF M$$PRO MOV S.URM(R4),(R0)+ ; PUT IN UNIBUS RUN MASK7 MOV R0,(R1) ; PUT THE NEW BLOCK ADDRESS IN THE TABLEC/30$: INC (R1) ; SHOW THAT THE BLOCK IS IN USE;) POP ; GET BACK THE COMMAND PACKETC6 MOVB R2,I.PRM(R3) ; SAVE UMR WAIT BLOCK INDEX IN IOPF BISB #IP.UMR,I.FLAG(R3) ; MARK I/O AS HAVING A UMR WAIT BLOCK ;DC412I32$: MOV I.PRM(R3),U.BUF(R5) ; SET UP FOR UMR ASSIGNMENT BLOCK .. ;**-1E= MOV I.PRM+2(R3),U.BUF+2(R5) ; ... PROCESSING OF BUFFER ADDREO1 MOV I.PRM+4(R3),U.CNT(R5) ; ... AND BYTE COUNT  MOV S.QST(R4),R2 ; GET QST MOV (R2),R2 ; NOW THE CSTT7 BIS #C1.UMR,(R2) ; SHOW THAT WE ARE WAITING FOR A UMRH4 MOV R0,R2 ; ... COPY UMR WAIT BLOCK POINTER TO R2& CALL @STMP1 ; SET UP UNIBUS MAPPING< MOV S.PBIA(R4),@KISR6 ; MAKE SURE THE PORT IS STILL MAPPED4 MOV S.PBIA(R4),@#KINAR6 ; KERNAL INSTRUCTION SPACE MOV S.QST(R4),R0 ; GET QST MOV (R0),R0 ; NOW THE CST*. BIC #C1.UMR,(R0) ; CLR UMR MAPPING INTERLOCK. ADD #10,R2 ; OFFSET TO UMR ASSIGNMENT BLOCK5 MOV R2,R0 ; ASSIGNMENT BLOCK WHERE $MPUB1 WANTS IT6 PUSH ; SAVE R1, POINTER TO UMR ASSIGN BLOCK' CALL @MPUB1 ; MAP UNIBUS TO TRANSFER,5 POP ; RESTORE PNTR TO UMR ASSIGN BLOCK, R1M& MOV S.QST(R4),R2 ; GET QST BACK ALSO350$: MOV I.PRM+2(R3),P.BUFF(R1) ; BUFFER DESCRIPTORM( MOV I.PRM+4(R3),P.BCNT(R1) ; BYTE COUNT8 MOV I.PRM+10(R3),P.LBN+2(R1); HIGH BYTE OF LBN ;DC412" .IF DF,D$$PRT!E$$LBN ;DC4120 BIT #DV.32B,U.CW1(R5) ; 32-BIT DEVICE? ;DC412* BNE 52$ ; IF NE, YES, CONTINUE ;DC412& .IFTF ;DF, ;DC4121 CLRB P.LBN+3(R1) ; CLEAR THE HIGH BYTE ;DC412% .IFT ;DF, ;DC412,#52$: ; REFERENCE LABEL ;DC412R& .ENDC ;DF, ;DC4125 MOV I.PRM+12(R3),P.LBN(R1) ; LOW WORD OF LBN ;**-1U1 MOVB I.PRM+1(R3),P.BUFF+2(R1); BUFFER DESCRIPTORE3 BIT #DV.EXT,U.CW1(R5) ; EXTENDED MEMORY SUPPORTED?B2 BNE 55$ ; YES. NO MANIPULATION NECESSARY ;DC4120 MOV M.UMVL(R0),P.BUFF(R1) ; LO 16 BITS ;**-1+ MOVB M.UMVH(R0),P.BUFF+2(R1) ; HIGH 2 BITSF* ASR P.BUFF+2(R1) ; SHIFT BITS 4:5 TO 0:1 ASR P.BUFF+2(R1) ; ... ASR P.BUFF+2(R1) ; ... ASR P.BUFF+2(R1) ; ...1 BIC #^C<3>,P.BUFF+2(R1) ; CLEAR ALL BUT BITS 0:1F%55$: .IF DF,D$$DSK&D$$PRT ;DC412M5 BIT #UU.PRT,U.UTIL(R5) ; PARTITIONED DRIVE? ;DC412R+ BEQ 60$ ; IF EQ, NOPE, CONTINUE ;DC412T ;DC412= BITB #IO.RPB&IO.WPB,I.FCN(R3) ; READ/WRITE PHYSICAL? ;DC412O9 BNE 60$ ; IF EQ, NOPE, MAKE IT PARTITION BIASED ;DC412  ;DC412C ADD U.PART+2(R5),P.LBN(R1) ; CONVERT I/O TO PARTITION BIAS ;DC412 - ADC P.LBN+2(R1) ; DOUBLE PRECISION ;DC412FH ADD U00:~ibjbkb a a a.PART+0(R5),P.LBN+2(R1) ; AND HIGH ORDER PART OF THE PACKET ;DC412 ;DC412$ .ENDC ;DF,D$$DSK&D$$PRT ;DC412 ;DC412'60$: PUSH <#CLACMD> ; RETURN TO CLACMD$ CALL CMDSEN ; SEND OFF THE PACKET;1&; RETURN TO THIS POINT WITH END PACKETK; REGISTERS ARE THE SAME EXCEPT THAT R1 CONTAINS AN END PACKET INSTEAD OF AI; COMMAND PACKET;CM; NOW WE WILL FIND OUT HOW THE COMMAND FINISHED AND PUT THE STATUS CODE IN R0B ; FOR ENDCOM;C .IF DF D$$DSK4 CALL ENDERR ; TRANSLATE MSCP ERROR INTO RSX ERROR. BITB #EF.BBR,P.FLGS(R1) ; BAD BLOCK REPORTED? BEQ 80$ ; NO.;CF; WE'VE FOUND A BAD BLOCK. IF RCT IS NOT INSTALLED OR NOT APPLICABLE,E; WE JUST RETURN IE.BBE, BAD BLOCK ERROR. IF WE CAN USE RCT, THEN WET<; REQUEST IT TO RUN, AND PUT THE IOP IN THE BAD BLOCK QUEUE.I; RCT WILL REPLACE THE BLOCK AND THEN RETURN THE IOP TO US TO BE REISSUEDE; (SEE CMDTRM);T CALL RQRCT ; GO REQUEST RCT. BCS 80$ ; IF CS, DON'T PUT I/O IN BBK QUEUE;K3; PUT THE IOP IN THE BAD BLOCK QUEUE AND SET UU.RCTR;5 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/O MOV (SP),R1 ; GET IOP BACKD PUSH IC .IIF DF D$$DSK&DU$CHK CALL REQUE; RECONVERT THE LBN FOR QUEUE OPT.H, MOV R5,R0 ; PUT UCB WHERE $QINSF WANTS IT0 ADD #U.BPKT,R0 ; ADD OFFSET TO BAD BLOCK QUEUE- CALL @QINSF ; PUT IT IN THE QUEUE AND EXITR POP ; RESTORE THEM  RETURNK380$: PUSH ; SET BYTE COUNT FOR ENDCOMT .IFF ;D$$DSKS$ MOV P.STS(R1),R0 ; GET STATUS CODE, BIC #^C,R0 ; CLEAR UNEEDED PORTION CMP #ST.SUC,R0 ; SUCCESSFUL?% BNE 70$ ; NO. DON'T RESET ANYTHINGP? BIC #M.BOT!M.PEOV!M.RWD!M.SER!M.TMK!M.EOT,U.CW2(R5) ; DEFAULTSE" ; ENDERR WILL DETECT BOT, EOT70$:4 CALL ENDERR ; SET UP STATUS TO RETURN TO THE USER) CMP #IS.SUC&377,R0 ; WAS IT SUCCESSFUL?; BNE 80$ ; NO.; BIC #M.AEOV,U.CW2(R5) ; NO LONGER AT LOGICAL EOT (TMK/TMK)0;80$: PUSH ; USE ACTUAL TAPE RECORD BYTE COUNTD( ; THIS IS TO MAINTAIN COMPATABILITY! ; WITH ALL OTHER RSX DRIVERSU+ CMP I.FCN(R3),#IO.CMP ; COMPARE HOST DATA??# BNE 85$ ; NO. RETURN ACTUAL TAPEN ; RECORD COUNT4 MOV P.BCNT(R1),(SP) ; YES RETURN POINT OF MISMATCH ; (IF ANY)85$: ; REFERENCE LABEL .ENDC ;D$$DSK CALLR ENDCOM ; FINISH THE I/O .PAGE .IF DF,T$$APE? .SBTTL CMDEOF - PROCESS ROUTINE FOR IO.ERS, IO.EOF, AND IO.DSEI;+6; **-CMDEOF-PROCESS ROUTINE FOR IO.EOF, IO.ERS, IO.DSE;E>; THIS ROUTINE ISSUES THE TMSCP REQUEST FOR IO.EOF (WRITE TAPE>; MARK), FOR IO.ERS (WRITE EXTENDED RECORD GAP) AND FOR IO.DSEA; (ERASE TO END OF TAPE). IF THE DRIVE IS SOFTWARE WRITE LOCKED,DA; THE COMMAND IS NOT ISSUED AND AN ERROR IS RETURNED TO THE USER,;"; OTHERWISE THE COMMAND IS ISSUED.;LA; NOTE: FOR EACH OF THESE FUNCTIONS, THE CURRENT TAPE POSITION ISF@; USED. FOR IO.DSE, THE TAPE IS REPOSITIONED TO BOT AFTER#; ERASING TO THE END OF TAPE.O;N ; INPUTS:F;O; R0 = FUNCTION TABLE ENTRYI; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS:; U.CW2(R5), M.SWL = FLAG INDICATING SOFTWARE WRITE LOCKED;I ; OUTPUTS:;S; R0 = STATUS CODE,; R1 = STATUS INFORMATION (RETURNED AS ZERO); R2-R5 ARE PRESERVED;;-CMDEOF::6 BIT #M.SWL,U.CW2(R5) ; IS UNIT SOFTWARE WRITE LOCKED?$ BEQ 10$ ; NO. GO SEND THE COMMAND/ MOV #IE.WLK&377,R0 ; WRITE LOCKED STATUS CODEO# CALLR CMDXIT ; COMMON ERROR EXITT,10$: BITB #US.MNT,U.STS(R5) ; IS IT MOUNTED?, BEQ 20$ ; YES. OK TO DO THIS TYPE OF CMD3 MOV #IE.PRI&377,R0 ; ERROR. TAPE MUST BE MOUNTEDS# CALLR CMDXIT ; COMMON ERROR EXITG420$: CALL CMDCOM ; BUILD A SKELETON COMMAND PACKET4 BIS #MD.CSE,P.MOD(R1) ; SET 'CLR SER EXCEPTION' NO.! PUSH <#CLACMD> ; RETURN ADDRESSF" CALL CMDSEN ; ISSUE THE COMMAND;TF; END PACKET PROCESSING. CONTROL RETURNS HERE WHEN THE END PACKET FORG; THIS COMMAND IS RECEIVED. AT THIS POINT, THE I/O IS EFFECTIVELY DONEE; SO IT IS NECESSARY TO SET UP THE RETUR00Bt__DATADATADATADATAN STATUS FOR THE USER, RETURND7; IT TO THEM, AND THEN CLEANUP FROM THE MSCP/TMSCP I/O.U;B4 CALL ENDERR ; SET UP STATUS TO RETURN TO THE USER2 CMP R0,#IS.SUC&377 ; WAS THE COMMAND SUCCESSFUL?# BNE 30$ ; NO. LEAVE STATES ALONEXF BIC #M.TMK!M.AEOV!M.BOT!M.RWD!M.SER!M.PEOV,U.CW2(R5) ; INDICATE STATE30$:2 PUSH <#0> ; NO ADDITIONAL INFORMATION AVAILABLE2 CALLR ENDCOM ; CLEANUP FOLLOWING I/O COMPLETION .ENDC ;T$$APE .PAGE .IF DF D$$DSK .SBTTL CMDFMT - FORMATC;+/; **-CMDFMT-PROCESS ROUTINE FOR IO.SMD (FORMAT)R;>; THIS ROUTINE WILL PROCESS THE IO.SMD FUNCTION FOR DISKS THAT; SUPPORT FORMATTING.T;SB; BEFORE ISSUING THE FORMAT COMMAND IT ISSUES AVL COMMAND TO BRINGA; THE UNIT TO UNIT AVAILABLE STATE AND AFTER FORMATING BRINGS THEB ; THE UNIT BACK TO ONLINE STATE.;I;E ; INPUTS::;P; R0 = FUNCTION TABLE ENTRYF; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;$ ; OUTPUTS:;.; R0 = RSX STATUS CODE;T;F=CMDFMT: BITB #US.FOR,U.STS(R5) ; IS THE DISK MOUNTED FOREIGN? BNE 2$ ; YES. THEN CONTINUE3 MOV #IE.PRI&377,R0 ; NO. THEN PRIVILEGE VIOLATIONG BR 5$ ; GO FINISH I/O@2$: BIT #DV.SWL,U.CW1(R5) ; IS THE UNIT SFT WRITE LOCKED ;DC412& BEQ 10$ ; EQ, THEN CONTINUE ;**-1, MOV #IE.WLK&377,R0 ; SET WRITE LOCK STATUS"5$: CALLR CMDXIT ; GO FINISH I/O410$: MOVB Q.INF(R2),R0 ; GET CONTROLLER INFORMATION0 BIC #^C,R0 ; GET ONLY FORMAT SUPPORTED BNE 20$ ; CONTINUES* CALLR ILEGAL ; NO. THEN IT IS ILLEGAL-20$: BIS #UU.SER,U.UTIL(R5) ; SET SERIAL MODE $ PUSH ; SAVE ORIG IOP ADDRESS( CALL PIOPAL ; GET PIOP FOR AVL CMD/ POP ; STORE ORIG IOP ADDR IN PIOP - MOV #AVNFUN,R0 ; FUNCTION CODE ENTRY TO USE$% CALL CMDCOM ; BUILD COMMAND PACKETE- BIS #MD.EXC,P.MOD(R1) ; SET EXCLUSIVE ACCESS ' PUSH <#CLACMD> ; ADDRESS TO RETURN TON CALL CMDSEN ; ISSUE COMMAND. PUSH ; SAVE ORIG PIOP ADDR AGAIN( MOV #IS.SUC,R0 ; NON ZERO STATUS TO R0! PUSH <#0> ; NO STATUS FOR IOSB& CALL ENDCMO ; FINISH UP AVL COMMAND0 MOVB Q.INF(R2),R0 ; GET CONTROLLER INFORMATION0 BIC #^C,R0 ; GET ONLY FORMAT SUPPORTED% CMP #FMSPC,R0 ; NEW FORMAT SUPPORT?M BNE 23$ ; NO, SKIP THE ONLINE( CALL PIOPAL ; GET PIOP FOR ONL CMD/ POP ; STORE ORIG IOP ADDR IN PIOPA- MOV #ONLFUN,R0 ; FUNCTION CODE ENTRY TO USEN% CALL CMDCOM ; BUILD COMMAND PACKET 2 BIS #MD.IMF,P.MOD(R1) ; IGNORE MEDIA FORMAT ERROR' PUSH <#CLACMD> ; ADDRESS TO RETURN TO> CALL CMDSEN ; ISSUE COMMAND. PUSH ; SAVE ORIG PIOP ADDR AGAIN( MOV #IS.SUC,R0 ; NON ZERO STATUS TO R0! PUSH <#0> ; NO STATUS FOR IOSBP& CALL ENDCMO ; FINISH UP AVL COMMAND#23$: POP ; GET ORIG IOP ADDRI- MOV #FMTFUN,R0 ; FUNCTION CODE ENTRY TO USEP) CALL CMDCOM ; BUILD THE COMMAND PACKETO0 MOVB Q.INF(R2),R0 ; GET CONTROLLER INFORMATION0 BIC #^C,R0 ; GET ONLY FORMAT SUPPORTED) CMP R0,#FMDX3 ; OLD RQDX3 STYLE FORMAT?P" BNE 25$ ; NO. USE THE 'DEFAULT'/ MOVB #OP.SP8,P.OPCD(R1) ; USE THE RQDX3 OPCODER< MOV I.PRM(R3),P.FMTI+2(R1) ; FILL THE FIRST 2 BYTES OF INFO= MOV I.PRM+2(R3),P.FMTI(R1) ; FILL THE SECOND 2 BYTES OF INFO 25$:# PUSH <#CLACMD> ; RETURN TO CLACMD $ CALL CMDSEN ; SEND OFF THE PACKET;N&; RETURN TO THIS POINT WITH END PACKET>; REGISTERS ARE THE SAME EXCEPT THAT R1 CONTAINS AN END PACKET; INSTEAD OF A COMMAND PACKET.;R>; FIND OUT HOW THE COMMAND FINISHED AND PUT THE STATUS CODE IN*; R0 FOR ENDCOM AND BRING THE UNIT ONLINE.;4 CALL ENDERR ; TRANSLATE MSCP STATUS TO RSX STATUS" CMP #IS.SUC,R0 ; IS IT A SUCCESS+ BEQ 40$ ; YES THEN BRING THE UNIT ONLINE() PUSH ; NEED TO USE R1, SO SAVE IT: MOV P.STS(R1),R1 ; GET STATUSA/ BIC #^C,R1 ; ISOLATE THE MAJOR STATUS & CMP #ST.DRV,R1 ; IS IT A DRIVE ERROR BNE 30$ ; NO. CONTINUEP6 MOV #IE.ABO&377,R0 ; YES. INDICATE FORMAT INCOMPLETE,30$: POP ; RESTORE END PACKET ADDRESS/ BIC #UU.SER,U.UTIL(R5) ; CLEAR THE SERIAL MODE  PUSH <#0> ; NIL BYTE COUNTL CALLR ENDCOM ; FI00J~ibjbkb a a aNISH IT UP!40$: PUSH <#0> ; NIL BYTE COUNT; CALL ENDCMO ; FINISH UP5 BIS #UU.ONL,U.UTIL(R5) ; INDICATE AN OP.ONL REQUIRED * CALLR ONLSIO ; ISSUE THE ONLINE COMMAND .ENDC ;D$$DSK .PAGE .IF DF,D$$DSK* .SBTTL CMDRPL - RCT BAD BLOCK REPLACEMENT;+/; **-CMDRPL- PROCESS BLOCK REPLACEMENT REQUESTS#;A4; THIS ROUTINE PROCESSES BLOCK REPLACEMENT REQUESTS.;< ; INPUTS:T; ; R0 FUNCTION TABLE ENTRY; R2 QST ADDRESS ; R3 IOP ADDRESS>; R4 SCB ADDRESSC; R5 UCB ADDRESSI;P ; OUTPUTS:;>;-CMDRPL: 7 BIT #IQ.X!IQ.Q!IQ.UMD,I.FCN(R3) ; ILLEGAL SUBMODIFIERS5 BEQ CMDRP1 ; IT IS OK/ JMP ILEGAL ; EXIT WITH ILLEGAL FUNCTION CODED,CMDRP1: CALL CMDCOM ; GET A COMMAND PACKET5 MOV I.PRM(R3),P.RBN+2(R1) ; REPLACEMENT BLOCK NUMBERP5 MOV I.PRM+2(R3),P.RBN(R1) ; REPLACEMENT BLOCK NUMBERP3 MOV I.PRM+4(R3),P.LBN+2(R1) ; LOGICAL BLOCK NUMBER1 MOV I.PRM+6(R3),P.LBN(R1) ; LOGICAL BLOCK NUMBERD& MOV I.PRM+10(R3),P.MOD(R1) ; MODIFIER= MOV I.PRM+6(R3),I.PRM+12(R3); CLEAR SPACE FOR RETURN ADDRESS# PUSH <#CLACMD> ; RETURN TO CLACMDN& CALL CMDSEN ; ISSUE THE RPL COMMAND; &; RETURN TO THIS POINT WITH END PACKET;A& MOV P.CRF+2(R1),R0 ; GET IOP ADDRESS@ MOV I.PRM+12(R0),I.PRM+6(R0); PUT THE LOGICAL BLOCK NUMBER BACK$ CALL ENDERR ; SET UP THE END CODE PUSH <#0> ; NO BYTE COUNT CALLR ENDCOM ; FINISH UPR .PAGE* .SBTTL CMDRSN - READ VOLUME SERIAL NUMBER;+%; **-CMDRSN-READ VOLUME SERIAL NUMBER,;OJ; THE READ VOLUME SERIAL ROUTINE WILL READ THE 4-BYTE VOLUME SERIAL NUMBERH; CONTAINED IN THE DEVICE'S SECOND UCB EXTENSION INTO A BUFFER SPECIFIED ; IN THE IOP. ;U ; INPUTS:P;T; R0 FUNCTION TABLE ENTRYP; R2 QST ADDRESS; R3 IOP ADDRESS; R4 SCB ADDRESS; R5 UCB ADDRESS;G ; OUTPUTS:;E; R0 SUCCESS CODER; R1 BYTES TRANSFEREDE; R2-R5 PRESERVED ;-CMDRSN:CE BITB #IQ.X!IQ.Q!IQ.UMD,I.FCN(R3) ; DO WE HAVE ANY ILLEGAL MODIFIERS?A BEQ 10$ ; NO. CONTINUEE' CALLR ILEGAL ; ILLEGAL FUNCTION CODEV.10$: CMP I.PRM+4(R3),#R$MSIZ ; IS IT IN RANGE? BLE 20$ ; NO. RETURN ERROR+ MOV #IE.BAD&377,R0 ; BAD LENGTH SPECIFIEDR) CALLR CMDXIT ; COMMON ERROR PROCESSING+20$: PUSH ; SAVE WORK REGISTERSS; 8; MAP UCB EXTENSION AND MOVE SELECTED FIELDS INTO PACKET;P4 MOV U.UC2X(R5),@KISR6 ; MAP EXTENSION THROUGH APR 6' MOV #RSNEXP,R2 ; TEMP AREA FOR PACKETI: MOV X.VSER+140000,(R2)+ ; PART 1 OF VERSION NUM : R$VRSN> MOV X.VSER+2+140000,(R2)+ ; PART 2 OF VERSION NUM : R$VRSN+2: MOV X.UNFL+140000,(R2)+ ; UNIT FLAGS : R$USTA;2* MOV #RSNEXP+R$UNTI,R2 ; UNIT INFO POINTER: MOV X.UNTI+140000,(R2)+ ; PART 1 OF UNIT ID : R$UNTI> MOV X.UNTI+2+140000,(R2)+ ; PART 2 OF UNIT ID : R$UNTI+2> MOV X.UNTI+4+140000,(R2)+ ; PART 3 OF UNIT ID : R$UNTI+4> MOV X.UNTI+6+140000,(R2)+ ; PART 4 OF UNIT ID : R$UNTI+6; MOVB X.USVR+140000,(R2)+ ; UNIT SOFT VERS : R$USVR ; MOVB X.UHVR+140000,(R2)+ ; UNIT HARD VERS : R$UHVR : MOV X.MLUN+140000,(R2)+ ; MULTI UNIT CODE : R$MLUN- CLR (R2)+ ; COMMAND REFERENCE NUM 1: R$CRFR/ CLR (R2)+ ; COMMAND REFERENCE NUM 2: R$CRF+2(- CLR (R2)+ ; SEQUENCE NUMBER : R$SEQU- CLR (R2) ; EVENT CODE : R$OPCD$;I:; RESTORE PUCOM MAPPING AND COMPLETE THE PACKET PROCESSING;I$ MOV S.PBIA(R4),@KISR6 ; REMAP PUCOM" MOV (SP),R2 ; GET QST ADDR BACK( ADD #Q.CNTI,R2 ; POINT TO ORIGINAL INF0 MOV #RSNEXP+R$CNTI,R4 ; POINT TO CONTROLLER INF3 MOV (R2)+,(R4)+ ; CONTROLLER INFORMATION : R$CNTIM5 MOV (R2)+,(R4)+ ; CONTROLLER INFORMATION : R$CNTI+2R5 MOV (R2)+,(R4)+ ; CONTROLLER INFORMATION : R$CNTI+4E5 MOV (R2)+,(R4)+ ; CONTROLLER INFORMATION : R$CNTI+6 1 MOV (R2),(R4) ; CNTRL SOFT/HARD INFO : R$CXVRO;$"; RETURN PACKET TO THE USER BUFFER;E0 MOVB I.PRM+1(R3),R2 ; SET HI 6-BITS OF ADDRESS0 MOV I.PRM+2(R3),R3 ; SET LO 16-BITS OF ADDRESS1 ASHC #10.,R2 ; CALCULATE DISPLACEMENT AND BIAS# ASHC #-10.,R3 ; ...T4 MOV R3,R4 ; COPY DESTINATION DISPLACEMENT INTO R40 BIS #140000,R4 ; SET DESTINATION BIAS FOR APR6, MOV R00Rt__DATADATADATADATA2,R3 ; COPY DESTINATION BIAS INTO R3 MOV 2(SP),R0 ; GET IOP ADDRESS4 MOV I.PRM+4(R0),R0 ; GET NUMBER OF BYTES FROM USER MOV @KISR5,R1 ; SOURCE BIAST) MOV #RSNEXP,R2 ; GET SOURCE DISPLACMENT - CALL @BLXIO ; MOVE THE DATA TO USER BUFFER + POP ; RESTORE ORIGNAL CONTENTS;! MOV I.PRM+4(R3),R1 ; BYTE COUNT1% MOV #IS.SUC&377,R0 ; RETURN SUCCESSA4 PUSH <#CLACMD> ; START ANOTHER COMMAND IF POSSIBLE- CALLR ENDCM1 ; COMPLETE THE IOP PROCESSINGS .ENDC ;D$$DSK .PAGE .IF DF,T$$APE@ .SBTTL CMDRWD - PROCESS ROUTINE FOR IO.RWD AND IO.RWU FUNCTIONS;+-; **-CMDRWD-ROUTINE TO HANDLE REWIND FUNCTIONS;I; THIS ROUTINE WILL PROCESS THE RSX IO.RWD AND IO.RWU FUNCTIONS FOR TAPES;L;B ; INPUTS:V;H; R0 = FUNCTION TABLE ENTRYP; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;# ; OUTPUTS:;;; R0 = STATUS CODE; R2-R5 ARE PRESERVEDA9; U.CW2, BIT M.AEOV CLEAR ON SUCCESSFUL REWIND OPERATIONI6; U.CW2, BIT M.REW SET TO INDICATE TAPE IS REWINDING:; U.STS, BIT US.PWF CLEAR POWERFAIL BIT TO ALLOW COMMANDS;O;9; THE VALUE TO PUT INTO IOSB+2 IS ON THE STACK FOR ENDCOMH;-CMDRWU:L> PUSH <#MD.UNL!MD.CSE> ; UNLOAD AND 'CLR SER EXCEPT' MODIFIERS BR CMDRWC ; JOIN COMMON CODE CMDRWD:R9 PUSH <#MD.RWD!MD.IMM!MD.CSE>; SET REWIND, IMMEDIATE, ANDE! ; 'CLR SER EXCEPT' MODIFIERST CMDRWC: ; COMMON ENTRY POINT0 CALL CMDCOM ; ALLOCATE T/MSCP PACKET AND FILL ; COMMAND FIELDSO) BIS (SP)+,P.MOD(R1) ; SET THE MODIFIERSP, PUSH <#CLACMD> ; SAVE ROUTINE ADD ON STACK+ CALL CMDSEN ; SEND COMMAND TO CONTROLLERA; ; END PACKET PROCESSINGT;S9 BICB #EF.EOT,P.FLGS(R1) ; DO NOT USE EOT FLAG ON REWINDSL- MOV P.CRF+2(R1),R0 ; GET I/O PACKET ADDRESS * MOV I.FCN(R0),R0 ; GET I/O FUNCTION CODE3 BIC #IQ.Q!IQ.X!IQ.UMD,R0 ; CLEAR SPECIAL MODIFIERS;) CMP R0,#IO.RWU ; REWIND/UNLOAD COMMAND? ( BNE 2$ ; NO. DO NOT CHANGE TO SUCCESS( CMP #ST.VOL,P.STS(R1) ; VOLUME MOUNTED?' BEQ 3$ ; NOTHING THERE; SHOW SUCCESS 2$: ; REFERENCE LABEL ( CMP #ST.AVL,P.STS(R1) ; UNIT AVAILABLE? BNE 5$ ; NO. .3$: CLR P.STS(R1) ; INDICATE SUCCESS (ST.SUC)5$:C0 CALL ENDERR ; SET UP STATUS TO RETURN TO USER) CMP #IS.SUC&377,R0 ; WAS IT SUCCESSFUL?  BNE 10$ ; NOF+ BISB #US.PWF,U.STS(R5) ; SET POWERFAIL BITQB BIC #M.PEOV!M.RWD!M.SER!M.TMK!M.EOT!M.AEOV,U.CW2(R5) ; NEW STATES< BIS #M.BOT,U.CW2(R5) ; INDICATE TAPE IS AT BOT (OR WILL BE- ; WHEN THE CONTROLLER GETS DONE WITH IT)3+10$: PUSH <#0> ; VALUE TO PUT INTO IOSB+2 * CALLR ENDCOM ; DO COMMON END PROCESSING .PAGE3 .SBTTL CMDSMO - MOUNT AND SET TAPE CHARACTERISTICS ;+F; **-CMDSMO-PROCESS ROUTINE FOR IO.SMO (MOUNT AND SET CHARACTERISTICS);#L; THIS ROUTINE PERFORMS THE FUNCTION OF SETTING THE TAPE CHARACTERISTICS ANDM; BRINGING THE UNIT TMSCP ONLINE. FOR TAPES THAT SUPPORT MULTIPLE DENSITIES, L; THIS MUST FIRST MAKE SURE THE TAPE UNIT IS TMSCP AVAILABLE. IF IT IS NOT,L; AN AVAILABLE COMMAND MUST BE ISSUED, FOLLOWED BY AN ONLINE COMMAND SO THAT<; THE TAPE DENSITY CAN BE SET TO THAT SPECIFIED BY THE USER.; ; INPUTS:S;-; R0 = FUNCTION TABLE ENTRYI; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS; ; OUTPUTS:;I; R0 = STATUS CODE; R1 = DESTROYED; R2-R5 ARE PRESERVEDA;-CMDSMO:T4 BIT #M.BOT,U.CW2(R5) ; ARE WE AT BEGINNING OF TAPE?/ BNE 10$ ; YES. CONTINUE WITH DENSITY SETTINGE, CALLR ILEGAL ; NO. IO.SMO IS ILLEGAL THENC10$: BIT #UU.BLK,U.UTIL(R5) ; DOES UNIT SUPPORT MULTIPLE DENSITIES?T( BNE 200$ ; NO. NOTHING TO DO IN HERE! PUSH ; SAVE ORIG IOP ADDRS. CALL PIOPAL ; A "FALSE" IOP FOR AVN COMMAND. POP ; SAVE ORIG IOP ADDR IN PIOP- MOV #AVNFUN,R0 ; FUNCTION CODE ENTRY TO USES' CALL CMDCOM ; BUILD TEMPLATE COMMAND ? BIS #MD.CSE,P.MOD(R1) ; SET 'CLEAR SERIOUS EXCEPTION' MODIFIERI% PUSH <#CLACMD> ; WHERE TO RETURN TON" CALL CMDSEN ; ISSUE THE COMMAND. PUSH ; SAVE WHAT WILL BE USED LATER' PUSH ; SAVE ORIG IOP ADDRT1 MOV #IS.SUC,R0 ; NON-ZERO ->00Z~ibjbkb a a a RETURN IOP TO POOLI" PUSH <#0> ; NO IOSB DATA EITHER% CALL ENDCMO ; CLEAN UP PACKET USEDF# POP ; RESTORE ORIG IOP ADDRA! POP ; RETURN REGISTERSF/200$: CALLR CMDONL ; ISSUE THE ONLINE COMMANDM .PAGE+ .SBTTL CMDSPB - PROCESS ROUTINE FOR IO.SPB;;+5; **-CMDSPB-PROCESS ROUTINE FOR IO.SPB (SPACE BLOCKS);;EH; THIS ROUTINE PERFORMS THE FUNCTION OF SPACING FORWARD OR BACKWARD OVER=; A SPECIFIED NUMBER OF BLOCKS. IF A NEGATIVE BLOCK COUNT ISAJ; SPECIFIED, THE SKIPPING IS DONE IN THE REVERSE DIRECTION. FOR UNLABELEDH; TAPE, SPACING BLOCKS PAST EOV (TWO CONSECUTIVE TAPE MARKS OR BOT/TMRK); IS NOT PERMITTED.;P ; INPUTS:;;T; R0 = FUNCTION TABLE ENTRYM; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS/; U.CW2, BIT M.AEOV=TAPE AT OR PAST LOGICAL EOTS;( ; OUTPUTS:;; R0 = STATUS CODE4; R1 = STATUS INFORMATION (NUMBER OF BLOCKS SKIPPED); R2-R5 ARE PRESERVEDR/; U.CW2, BIT M.AEOV=TAPE AT OR PAST LOGICAL EOTC;-CMDSPB::0 TST I.PRM(R3) ; ANY BLOCKS ACTUALLY SPECIFIED?, BNE 10$ ; YES. FURTHER PROCESSING NEEDED5 MOV #IS.SUC&377,R0 ; INDICATE SUCCESS (NOP THE I/O)# CALLR CMDXIT ; COMMON ERROR EXITA210$: BITB #US.MNT,U.STS(R5) ; IS THE UNIT MOUNTED?, BEQ 20$ ; YES. OK TO DO THIS TYPE OF CMD3 MOV #IE.PRI&377,R0 ; ERROR. TAPE MUST BE MOUNTEDP# CALLR CMDXIT ; COMMON ERROR EXITS:20$: BITB #US.LAB,U.STS(R5) ; WORKING WITH A LABELED TAPE?* BNE 30$ ; YES. SKIP LOGICAL EOV CHECKS8 BIT #M.AEOV,U.CW2(R5) ; ARE WE PAST LOGICAL END OF TAPE( BEQ 30$ ; NO. GO TO COMMON PROCESSING( TST I.PRM(R3) ; TEST SPACING DIRECTION BLE 30$ ; BACKWARD IS OK.5 MOV #IE.EOV&377,R0 ; INDICATE EOV ON UNLABELED TAPET# CALLR CMDXIT ; COMMON ERROR EXITN430$: CALL CMDCOM ; BUILD A SKELETON COMMAND PACKET6 BIS #MD.CSE,P.MOD(R1) ; SET 'CLR SER EXCEPT' MODIFIER3 CLR P.RECC+2(R1) ; HIGH ORDER WORD OF BLOCK COUNTT5 MOV I.PRM(R3),P.RECC(R1) ; DEFAULT SPACE BLOCK COUNT % BGE 40$ ; GOING FORWARD DIRECTION.U3 BIS #MD.REV,P.MOD(R1) ; INDICATE REVERSE DIRECTION 5 NEG P.RECC(R1) ; INDICATE POSITIVE NUMBER OF BLOCKSS340$: BITB #US.LAB,U.STS(R5) ; IS THIS LABELED TAPE?#& BNE 50$ ; YES. SKIP LEOT PROCESSING$ TST I.PRM(R3) ; FORWARD DIRECTION?% BLE 50$ ; NO. SKIP LEOT PROCESSINGA? BIS #MD.DLE,P.MOD(R1) ; SET TO DETECT LEOT FOR UNLABELED TAPESX;50$: CLR P.TMGC(R1) ; INSURE NO TAPE MARKS WILL BE SKIPPED 7 CLR P.TMGC+2(R1) ; HIGH ORDER WORD OF TAPE MARK COUNTO! PUSH <#CLACMD> ; RETURN ADDRESSR$ CALL CMDSEN ; ISSUE TMSCP COMMAND;TF; END PACKET PROCESSING. CONTROL RETURNS HERE WHEN THE END PACKET FORG; THIS COMMAND IS RECEIVED. AT THIS POINT, THE I/O IS EFFECTIVELY DONEYE; 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.T;E$ CALL ENDERR ; GET RSX STATUS CODE: BIC #M.AEOV,U.CW2(R5) ; ASSUME NO LONGER AT END OF VOLUME, CMP R0,#IE.EOV&377 ; WAS LEOT ENCOUNTERED? BNE 60$ ; NO.6 BIS #M.AEOV,U.CW2(R5) ; INDICATE THAT LOGICAL EOT HITA BIC #M.BOT!M.PEOV!M.RWD!M.SER!M.TMK!M.EOT,U.CW2(R5) ; NEW STATES 260$: PUSH ; NUMBER OF BLOCKS SKIPPED3 CMP R0,#IE.EOF&377 ; WAS A TAPE MARK ENCOUNTERED?S BNE 70$ ; NO.. INC (SP) ; COUNT TAPE MARK AS BLOCK SKIPPED/70$: CALLR ENDCOM ; GO TO COMMON CLEANUP CODET .PAGE+ .SBTTL CMDSPF - PROCESS ROUTINE FOR IO.SPFE;+4; **-CMDSPF-PROCESS ROUTINE FOR IO.SPF (SPACE FILES);.H; THIS ROUTINE PERFORMS THE FUNCTION OF SPACING FORWARD OR BACKWARD OVERE; A SPECIFIED NUMBER OF TAPE MARKS. IF A NEGATIVE TAPE MARK COUNT ISMJ; SPECIFIED, THE SKIPPING IS DONE IN THE REVERSE DIRECTION. FOR UNLABELEDG; TAPE, SPACING FILES PAST EOV (TWO CONSECUTIVE TAPE MARKS OR BOT/TMRK)N; IS NOT PERMITTED.N;A ; INPUTS:B;K; R0 = FUNCTION TABLE ENTRY ; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS/; U.CW2, BIT M.AEOV=TAPE AT OR PAST LOGICAL EOTP; ; OUTPUTS:;H; R0 = STATUS CODE3; R1 = STATUS INFORMATION (NUMBER OF FILES SKIPPED) ; R2-R5 ARE PRESERVEDE/; 00bt__DATADATADATADATAU.CW2, BIT M.AEOV=TAPE AT OR PAST LOGICAL EOTC;-CMDSPF::4 TST I.PRM(R3) ; ANY TAPE MARKS ACTUALLY SPECIFIED?, BNE 10$ ; YES. FURTHER PROCESSING NEEDED5 MOV #IS.SUC&377,R0 ; INDICATE SUCCESS (NOP THE I/O)# CALLR CMDXIT ; COMMON ERROR EXIT 210$: BITB #US.MNT,U.STS(R5) ; IS THE UNIT MOUNTED?, BEQ 20$ ; YES. OK TO DO THIS TYPE OF CMD3 MOV #IE.PRI&377,R0 ; ERROR. TAPE MUST BE MOUNTED:# CALLR CMDXIT ; COMMON ERROR EXITU:20$: BITB #US.LAB,U.STS(R5) ; WORKING WITH A LABELED TAPE?* BNE 30$ ; YES. SKIP LOGICAL EOV CHECKS8 BIT #M.AEOV,U.CW2(R5) ; ARE WE PAST LOGICAL END OF TAPE( BEQ 30$ ; NO. GO TO COMMON PROCESSING( TST I.PRM(R3) ; TEST SPACING DIRECTION BLE 30$ ; BACKWARD IS OK.5 MOV #IE.EOV&377,R0 ; INDICATE EOV ON UNLABELED TAPET# CALLR CMDXIT ; COMMON ERROR EXITN430$: CALL CMDCOM ; BUILD A SKELETON COMMAND PACKET6 BIS #MD.CSE,P.MOD(R1) ; SET 'CLR SER EXCEPT' MODIFIER7 CLR P.TMGC+2(R1) ; HIGH ORDER WORD OF TAPE MARK COUNT54 MOV I.PRM(R3),P.TMGC(R1) ; DEFAULT SPACE FILE COUNT% BGE 40$ ; GOING FORWARD DIRECTION.C3 BIS #MD.REV,P.MOD(R1) ; INDICATE REVERSE DIRECTION;4 NEG P.TMGC(R1) ; INDICATE POSITIVE NUMBER OF TMRKS340$: BITB #US.LAB,U.STS(R5) ; IS THIS LABELED TAPE?#& BNE 50$ ; YES. SKIP LEOT PROCESSING$ TST I.PRM(R3) ; FORWARD DIRECTION?% BLE 50$ ; NO. SKIP LEOT PROCESSINGA? BIS #MD.DLE,P.MOD(R1) ; SET TO DETECT LEOT FOR UNLABELED TAPESX750$: CLR P.RECC(R1) ; INSURE NO BLOCKS WILL BE SKIPPEDA3 CLR P.RECC+2(R1) ; HIGH ORDER WORD OF BLOCK COUNTP! PUSH <#CLACMD> ; RETURN ADDRESSF$ CALL CMDSEN ; ISSUE TMSCP COMMAND;)F; END PACKET PROCESSING. CONTROL RETURNS HERE WHEN THE END PACKET FORG; THIS COMMAND IS RECEIVED. AT THIS POINT, THE I/O IS EFFECTIVELY DONE5E; 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.);S$ CALL ENDERR ; GET RSX STATUS CODE: BIC #M.AEOV,U.CW2(R5) ; ASSUME NO LONGER AT END OF VOLUME, CMP R0,#IE.EOV&377 ; WAS LEOT ENCOUNTERED? BNE 60$ ; NO.6 BIS #M.AEOV,U.CW2(R5) ; INDICATE THAT LOGICAL EOT HIT@ BIC #M.PEOV!M.BOT!M.RWD!M.SER!M.TMK!M.EOT,U.CW2(R5) ; NEW STATE660$: PUSH ; NUMBER OF TAPE MARKS SKIPPED+ CALLR ENDCOM ; GO TO COMMON CLEANUP CODES .ENDC ;T$$APE .PAGE9 .SBTTL CMDXIT - COMMON ERROR EXIT - INCLUDES ILEGAL EXITT;+;T+; **-ILEGAL-EXIT WITH ILLEGAL FUNCTION CODER; **-CMDXIT-COMMON ERROR EXIT#;EH; THIS ROUTINE PROVIDES A SIMPLE AND COMMON EXIT PATH FOR COMMAND ERRORSG; THAT ARE DETECTED BEFORE ANY I/O IS ACTUALLY ISSUED TO THE CONTROLLER ;T ; INPUTS:T;T$; R0 = RSX ERROR CODE TO BE RETURNED;E ; OUTPUTS:;N; CONTROL IS PASSED TO ENDCM1>; ;-3ILEGAL: MOV #IE.IFC&377,R0 ; ILLEGAL FUNCTION CODEMCMDXIT:P CLR R1 ; NO BYTE COUNT.6 PUSH <#CLACMD> ; RETURN TO CLACMD TO FIND MORE TO DO, CALLR ENDCM1 ; JOIN COMMON END PROCESSING .PAGE( .SBTTL CMDSEN - SEND OFF COMMAND PACKET;+?; **-CMDSEN-ROUTINE TO SEND CMD PKT AND ADD IOP TO C.OLHD QUEUE ;O=; THIS ROUTINE WILL SEND THE T/MSCP PACKET TO THE CONTROLLER.E?; IT ALSO WILL ADD THE IOP TO THE END OF THE OUTSTANDING QUEUE.UB; IF THE COMMAND IS THE OLDEST, THEN THE COMMAND STATUS IS UPDATED>; AND THE TIMEOUT COUNT IS UPDATED AND THE TIMER GETS STARTED.;R ; INPUTS:T;O; R1 = COMMAND PACKET ADDRESS ; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS; ; OUTPUTS:;-; R0-R1-R3 DESTROYEDT; R2-R4-R5 PRESERVEDN;-CMDSEN: < POP ; ADDR TO RETURN TO WHEN END PKT ARRIVES0 CALLV PORT,PORSEN ; SEND CMD PKT TO CONTROLLER MOV (R2),R0 ; ADDR OF CSTT5 ADD #C.OLHD,R0 ; POINT TO QUEUE OF OUTSTANDING IOPS # MOV R3,R1 ; POINTS TO IOP TO ADD & CALL @QINSF ; INSERT IOP INTO QUEUE ; R2 GETS DESTROYED, MOV S.QST(R4),R2 ; RESTORE THE QST ADDRESS MOV R3,R0 ; IOP ADDRESS MOV (R2),R3 ; ADDR OF CSTS6 CMP R0,C.OLHD(R3) ; IS THIS COMMAND NOW THE OLDEST ? BNE 20$ ; NO-; C; RESET TIMEOUT COUNT FOR NEW OLDEST COMMAND AND MAYBE RESET BSYUCBN;D MOVB S.IT00j~ibjbkb a a aM(R4),S.CTM(R4)S7 MOV S.BSYU(R4),R1 ; ADDRESS OF THE PREVIOUS BUSY UNITO- BEQ 10$ ; IF NO UNIT IS BUSY CHANGE BSYUCBT: 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 BSYUCBD9 MOV #-1,C.CMST(R3) ; SET COMMAND STATUS PROGRESS TO MAX 1 MOV #-1,C.CMST+2(R3) ; UNSIGNED DOUBLE PRECISION 20$:& RETURN ; RETURN TO CALLER'S CALLER .PAGE' .SBTTL CMDSIO - START NEXT I/O REQUESTC;+8; **-CMDSIO-TRY TO START NEXT I/O REQUEST FROM SCB QUEUE;SB; THIS ROUTINE WILL TRY TO START THE NEXT I/O REQUEST FROM THE SCBA; QUEUE. THIS ROUTINE WILL DISPATCH TO THE FUNCTION CODE SPECIFICT&; ROUTINE WHICH WILL RETURN TO CLACMD.;I ; INPUTS:S;N; R2 = QST ADDRESS; R3 = CST ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS; ; OUTPUTS:; #; R0 = FUNCTION CODE ENTRY IN TABLEU; R1 = DESTROYED; R3 = IOP ADDRESS; R2-R4-R5 ARE PRESERVED;A;-CMDSIO:S/ MOV #XXACC,R2 ; ADDRESS OF ACCEPTANCE ROUTINE ;S%; MAKE BUSY UNIT TEMPORARILY NON-BUSYSF; IT IS ONLY BUSY SO THAT THE TIMEOUT COUNT IN THE SCB IS DECREMENTED.;U MOV S.BSYU(R4),R0 BEQ 10$ BICB #US.BSY,U.STS(R0)I10$: .IF DF D$$DSK- BISB #C2.SHD,C.FLAG(R3) ; SET RECURSIVE FLAGQ .IFTF ;D$$DSK# CALL @GSPKT ; GET IOP TO PROCESS=;B; MAKE BUSY UNIT BUSY AGAIN;0$ MOV S.QST(R4),R2 ; WE NEED THE QST .IFT ;D$$DSK3 MOV (R2),R3 ; GET CST3 BICB #C2.SHD,C.FLAG(R3) ; CLEAR THE RECURSION FLAGD .ENDC ;D$$DSK MOV S.BSYU(R4),R0 BEQ 20$ BISB #US.BSY,U.STS(R0) 20$:8 .IF DF D$$DSK&DU$CHK ; IF QUEUE OPTOMIZATION SUPPORTED) BCS 30$ ; IF CS, NO PACKETS LEFT, EXITC;UL; UNFORTUNATELY WE NOW HAVE TO CHANGE SECTOR, TRACK, AND CYLINDER THAT QUEUE.; OPTOMIZATION NEEDED BACK INTO AN LBN NUMBER.;T6 CMPB #IO.RLB/256.,I.FCN+1(R1); DATA TRANSFER REQUEST?( BLO CMDRED ; IF LO NO. LEAVE IT ALONE+ MOV I.PRM+10(R1),R2 ; GET CYLINDER NUMBERC+ MOVB U.PRM+1(R5),R0 ; GET TRACKS/CYLINDERA, MUL R0,R2 ; TRACKS UP TO CURRENT CYLINDER1 MOVB I.PRM+13(R1),R2 ; GET CURRENT TRACK NUMBER$ ADD R3,R2 ; GET CURRENT TRACK' MOVB U.PRM(R5),R0 ; GET SECTORS/TRACKE* MUL R0,R2 ; SECTORS UP TO CURRENT TRACK+ MOVB I.PRM+12(R1),R0 ; GET CURRENT SECTORT& ADD R0,R3 ; GET TOTAL SECTOR NUMBER ADC R2 ; HIGH AND LOW, MOV R2,I.PRM+10(R1) ; SAVE HIGH LBN NUMBER+ MOV R3,I.PRM+12(R1) ; SAVE LOW LBN NUMBER MOV S.QST(R4),R2 ; GET QST$ BR CMDRED ; GO PROCESS THE PACKET30$: .IFFC BCC CMDREDL .ENDC ;D$$DSK&DU$CHK  MOV (R2),R3 ; GET CST+ BIT #C1.DQU,(R3) ; SHOULD WE CALL $DQUMR?R BEQ 40$ ; IF EQ NOA& BIC #C1.DQU,(R3) ; CLEAR THE BIT OUT;EN; DO NOT CHANGE THE FOLLOWING CALL AND RETURN TO A JUMP: $DQUMR IS A COROUTINE;S CALL @DQUMR ; AND CALL IT 40$: RETURNB;+; - THE MAGIC IS BACK!! -M;R0; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GSPKT;+; R1 = IOP ADDRESS/; R2 = PHYSICAL UNIT NUMBER OF THE REQUEST UCB.R9; R3 = KRB ADDRESS (UNLESS 0 THEN R3 = CONTROLLER INDEX)..; R4 = SCB ADDRESS; R5 = UCB ADDRESS;G-; UDA50 CLASS DISK I/O REQUEST PACKET FORMAT.U;R*; WD 00 -- I/O QUEUE THREAD WORD (I.LINK).H; WD 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER (I.EFN & I.FLAG). ;DC412C; WD 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK (I.TCB). ;**-1:G; WD 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER (I.LN2).RD; WD 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTOR'S TASK HEADER ; (I.UCB).Q5; WD 05 -- I/O FUNCTION CODE (IO.RLB/IO.WLB) (I.FCN).R8; WD 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK (I.IOSB).:; WD 07 -- RELOCATION BIAS OF I/O STATUS BLOCK (I.IOSB+2).C; WD 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140000)E; (I.IOSB+4).:; WD 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE (I.AST).;R:; FOLLOWING FORMAT APPLIES TO ALL DATA TRANSFER FUNCTIONS:;NH; WD 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER (I.PRM).4; WD 13 -- BUFFER ADDRESS OF I/O TRANSFER (I.PRM+2).6; WD 14 -- NUMBER OF BYTES TO BE TRANSFERED (I.PRM+4).E; WD 15 -- DIAGNOSTIC SUPP00rt__DATADATADATADATALIMENTAL PARAMETER ELSE NOT USED (I.PRM+6).CC; WD 16 -- HIGH PART OF LOGICAL BLOCK NUMBER AND HIGH BYTE NOT USEDC; (I.PRM+10).F; WD 17 -- LOW PART OF LOGICAL BLOCK NUMBER OF I/O REQUEST (I.PRM+12).F; WD 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. BLOCK ADRS ELSE NOT USED; (I.PRM+14).E; WD 21 -- DIAGNOSTIC REG. BLOCK ADRS (REAL OR DISPLACEMENT + 140000)S; (I.PRM+16).;1#; SET CHARACTERISTICS FUNCTION CODEI;M ; WD 12 --,; WD 13 -- PARAMETER SPECIFICATION (I.PRM+2); 0 = RESET VOLUME VALIDU; 1 = SET VOLUME VALID ); 2 = RESET VOLUME VALID, SPIN UNIT DOWNO%; 3 = SET VOLUME VALID, SPIN UNIT UPT*; -1 = SIZE UNIT (VOLUME VALID UNCHANGED) ; WD 14 --;K;-;CMDRED: CLRB I.FLAG(R1) ; CLEAR INTERNAL FLAG BYTE ;DC412 ' MOV R1,R3 ; SAVE IOP ADDRESS ;**-1 .IF DF M$$PRO! TST S.URM(R4) ; UNIBUS RUN MASK  BEQ 37$ ; NONE, CONTINUE0 MOV @CPURM,-(SP)& BIT S.URM(R4),@(SP)+ ; OK ON THIS CPU BNE 37$ ; YES. JUST EXITP;+*; GET FORK BLOCK AND QUEUE IT IN FORK LIST;MB; If the request is a control function, we cannot assume that theD; first descriptor in the IOP is a buffer, and if we allocate a forkB; block as a UMR wait block, then the first control parameter willH; be clobbered. So ... in this case, we will simply call $EXROP instead.;-< CMPB I.FCN+1(R1),#IO.STC/256. ; IS THIS A CONTROL FUNCTION?/ BNE 30$ ; NOPE, USE UMR WAIT BLOCK FOR $FORKT' MOV S.URM(R4),R2 ; GET THE TARGET URM$+ MOV R3,R4 ; COPY THE IOP ADDRESS INTO R4D. MOV #36$,R3 ; SET UP OUR SUBROUTINE ADDRESS, CALLR @EXROP ; AND FORK TO THE TARGET CPU30$: MOV (R2),R1 ; GET CST5 DEC C.UMCT(R1) ; DECREMENT THE UMR WAIT BLOCK COUNTR7 ADD #C.UMRW,R1 ; POINT TO BEGINNING OF THE WAIT BLOCKc1 MOV #-1,R2 ; COUNTER = -1 BECAUSE WE INCREMENT$+32$: INC R2 ; INCREMENT THE INDEX COUNTER/$ TST (R1) ; IS THERE A BLOCK HERE?' BEQ 33$ ; IF EQ NO. ALLOCATE ANOTHERF% BIT #1,(R1)+ ; IS THE BLOCK IN USE?R BNE 32$ ; YES. TRY ANOTHERH MOV -(R1),R0 ; GET WAIT BLOCK, BR 35$ ; GO TO COMMON CODED<33$: PUSH ; SAVE THE TABLE ADDRESS AND BLOCK INDEX+ MOV #UMRWTB,R1 ; SET LENGTH OF CORE BLOCKE! CALL @ALOCB ; GET A WAIT BLOCKD" POP ; RESTORE REGISTERS BCC 34$ ; WE GOT ONE,OK ; NO POOL, EXIT GRACEFULLYR MOV S.QST(R4),R2 ; GET QST MOV (R2),R1 ; GET CST8 INC C.UMCT(R1) ; NOT GOING TO USE WAIT BLOCK AFTER ALL- MOV #IE.NDR&377,R0 ; SET NO DYNAMIC MEMORYC CLR R1 ;B JMP @IOFIN ; COMPLETE I/O234$: MOV S.URM(R4),(R0)+ ; PUT IN UNIBUS RUN MASK7 MOV R0,(R1) ; PUT THE NEW BLOCK ADDRESS IN THE TABLES/35$: INC (R1) ; SHOW THAT THE BLOCK IS IN USEF6 MOVB R2,I.PRM(R3) ; SAVE UMR WAIT BLOCK INDEX IN IOPF BISB #IP.UMR,I.FLAG(R3) ; MARK I/O AS HAVING A UMR WAIT BLOCK ;DC412. MOV R0,R4 ; PUT THE FORK BLOCK IN R4 ;**-1" CLR (R0)+ ; CLEAR THE FORK LINK( MOV #36$,(R0)+ ; PUT IN RETURN ADDRESS MOV R5,(R0)+ ; R5, UCB ADDRESS/ MOV R3,(R0)+ ; IOP ADDRESS (COMES BACK IN R4)  MOV @KISR5,(R0)+ ; APR 5 BIAS)& CALLR @QFORK ; QUEUE THE FORK BLOCK&36$: MOV R4,R3 ; RESTORE IOP ADDRESS: MOV U.SCB(R5),R4 ; RECOVER R4 WHICH IS DESTROYED BY FORK MOV S.QST(R4),R2 ; RESTORE QST2 MOV S.PBIA(R4),@KISR6 ; MAP APR 6 TO PORT DRIVER- MOV S.PBIA(R4),@#KINAR6 ; KERNAL INST SPACER/ MOV R3,R1 ; RESTORE THE IOP IN R1 FOR $VOLVD037$: .ENDC ;M$$PRO .IF DF D$$DSK< CMP #IO.SMD,I.FCN(R1) ; IS IT A SET MEDIA DENSITY FUNCTION? BNE 39$ ; NO. THEN CALL VOLVD: BITB #US.UMD,U.ST2(R5) ; DEVICE ATTACHED FOR DIAGNOSTICS? BEQ 39$ ; NO. THEN CALL VOLVD7 BISB #US.VV,U.STS(R5) ; SET THE VV BIT FOR LATER CHECK;+39$: CALL @VOLVD ; CHECK THE VOLUME VALIDS# BCC 40$ ; IF IT WAS OK, CONTINUEI# CALLR ENDCM1 ; GO FINISH THE I/OV40$: .ENDC ;D$$DSK;6K; SCAN THE PRIMARY TABLE FOR THE I/O FUNCTION CODE. FOR TAPE, CONTROL WILL:G; EITHER TRANSFER TO THE PROCESSING ROUTINE FOR THAT FUNCTION OR TO THETE; ROUTINE TO HANDLE ILLEGAL FUNCTIONS. FOR DISK, CONTROL WILL EITHERMH; TRANSFER TO THE PROCESSING ROUTINE FOR THAT FUNCTION OR TO THE 'SC00z~ibjbkb a a aAN2'J; ROUTINE BELOW IN ORDER TO SCAN THE SECONDARY FUNCTION TABLE FOR A MATCH.;L& MOV I.FCN(R3),R1 ; GET FUNCTION CODE3 BIC #IQ.Q!IQ.X!IQ.UMD,R1 ; CLEAR OUT ANY MODIFIERSN) MOV R1,EIOFUN ; INITIALIZE END OF TABLE + MOV #IOFUN,R0 ; ADD OF I/O FUNCTION TABLEO50$:" CMP R1,(R0) ; I/O CODES MATCH ? BEQ 60$ ; YES- ADD #FOSIZ,R0 ; POINT TO NEXT FUNCTION CODEO BR 50$ ; KEEP ON LOOKINGI=60$: JMP @FO.CMD(R0) ; DISPATCH TO FUNCTION SPECIFIC ROUTINEI .PAGE .SBTTL CMDSTC - SET STATUSE;+ ; **-CMDSTC-;EJ; THIS ROUTINE DISPATCHES ALL IO.STC COMMANDS. ONLINE AND GET UNIT STATUSS; COMMANDS ARE PASSED OFF TO OTHER ROUTINES. AVAILABLE COMMANDS ARE PROCESSED HERE;VO; FOR DISKM THE IO.STC FUNCTION WILL DO ONE OF THE FOLLOWING ACTIONS, DEPENDINGL; ON THE VALUE IN I.PRM+2:;C; I.PRM+2 Action6; ------- ------O; 0 SET UNIT AS AVAILABLE; 1 SET UNIT AS ONLINEE+; 2 SET UNIT AVAILABLE, AND SPIN UNIT DOWNT; 3 SAME AS 1; -1 GET UNIT STATUSE;.H; FOR TAPE, THIS ROUTINE PERFORMS THE SET CHARACTERISTIC FUNCTION. THISE; MEANS THAT A TMSCP ONLINE COMMAND IS ISSUED, FOLLOWED BY A GET UNITEG; STATUS COMMAND. IF THE STC FUNCTION IS ISSUED BY CON/HRC, THE ONLINEO?; COMMAND IS NOT ISSUED; THE GET UNIT STATUS COMMAND IS ISSUED. G; CON/HRC IS CONSIDERED TO HAVE SENT THE STC FUNCTION IF BOTH ARE TRUE: ;-6; 1. UNIT IS ATTACHED FOR DIAGNOSTICS (US.UMD IS SET)3; 2. STC COMMAND HAS THE IQ.UMD SUBFUNCTION BIT SET ;M ; INPUTS:1;E; R0 FUNCTION TABLE ENTRYA; R2 QST ADDRESS; R3 IOP ADDRESS; R4 SCB ADDRESS; R5 UCB ADDRESS;H ; OUTPUTS:;N;-CMDSTC:I .IF DF D$$DSK, TST I.PRM+2(R3) ; IS IT A GET UNIT STATUS? BGE 10$ ; NO. KEEP LOOKINGE CALLR CMDGUS ; GO DO IT THERE010$: BIT #1,I.PRM+2(R3) ; IS IT AN ONL COMMAND? BEQ 20$ ; NO,CONTINUE CALLR CMDONL ; GO DO IT THERE,20$: CALL CMDCOM ; GO GET A COMMAND PACKET! .IF DF,D$$DSK&D$$PRT ;DC412S4 BIT #UU.PRT,U.UTIL(R5) ; PARTITIONED DISK? ;DC412. BEQ 25$ ; NOPE, ALLOW THE SPIN DOWN ;DC412 ;DC412- MOV S.KRB(R4),R0 ; GET KRB ADDRESS ;DC412:1 ADD K.OFF(R0),R0 ; ADJUST TO UCB TABLE ;DC412R+ CLR -(SP) ; FORM AN ACCUMULATOR ;DC412N1 BISB U.UNIT(R5),(SP) ; GET UNIT NUMBER ;DC412 ASL (SP) ; *2 ;DC412I. ADD (SP)+,R0 ; POINT TO MASTER UNIT ;DC412) MOV (R0),R0 ; MASTER UNIT UCB ;DC412L8 BIT #UU.PTV,U.UTIL(R0) ; PARTITION TABLE VALID? ;DC4121 BEQ 25$ ; IF EQ, NOPE, ALLOW SPIN DOWN ;DC412E1 MOV U.UC2X(R0),@KISR6 ; MAP TO THE UCBX ;DC412 > DECB 140000+X.PONL ; DROP NUMBER OF ONLINE PARTITIONS ;DC412. BNE 30$ ; IF NE, WE WON'T SPIN DOWN ;DC412#25$: ; REFERENCE LABEL ;DC412R$ .IFTF ;DF,D$$DSK&D$$PRT ;DC412/ TST I.PRM+2(R3) ; SHOULD WE SPIN IT DOWN TOO?P BEQ 30$ ; NO,KEEP GOING1 MOV U.UC2X(R5),@KISR6 ; MAP SECOND UCB EXTENSION,+ MOV X.UNFL+140000,R0 ; RETRIEVE UNIT FLAGSV# .IFF ;DF,D$$DSK&D$$PRT ;DC412 6 MOV S.PBIA(R4),@KISR6 ; RESTORE PORT MAPPING ;DC412$ .IFTF ;DF,D$$DSK&D$$PRT ;DC4120 BIT #UF.RMV,R0 ; IS THE DISK REMOVABLE? ;**-1, BEQ 30$ ; NO. DON'T SPIN DOWN FIXED DISKS/ MOV #MD.SPD,P.MOD(R1) ; SET SPIN DOWN MODIFIERR'30$: .IFT ;DF,D$$DSK&D$$PRT ;DC412$6 MOV S.PBIA(R4),@KISR6 ; RESTORE PORT MAPPING ;DC412$ .ENDC ;DF,D$$DSK&D$$PRT ;DC412; PUSH <#CLACMD> ; RETURN TO STARTING OTHER COMMANDS ;DC412U CALL CMDSEN ;**-1I;G&; RETURN TO THIS POINT WITH END PACKETK; REGISTERS ARE THE SAME EXCEPT THAT R1 CONTAINS AN END PACKET INSTEAD OF A$; COMMAND PACKET.B;#3 CALL ENDERR ; CHANGE END CODE TO RSX STATUS CODE  PUSH <#0> ; NO BYTE COUNT5 CMP #ST.SDI!ST.CON,P.STS(R1); WAS SPIN DOWN IGNORED? BNE 70$ ; NO. JUST FINISH UP;;1%; WE HAVE TO SPIN DOWN THE OTHER UNITR;A5 CALL ENDCMO ; GO FINISH THE COMMAND, AND COME BACKP1 MOV U.UC2X(R5),@KISR6 ; MAP SECOND UCB EXTENSION;+ MOV X.MLUN+140000,R2 ; GET MULTI-UNIT CODEE- MOV S.PBIA(R4),@KISR6 ; RESTORE PORT MAPPING * MOV R5,R0 ; SAVE THE ORIGINAL UCB IN R04 PUSH <#SCUCB> ; NOW SEARCH TO FIND ONE THAT MATCES40$: C00t__DATADATADATADATAALL @(SP)+ ; GET A UCB% BCC 50$ ; WE GOT ONE, CHECK IT OUTU3 MOV S.QST(R4),R2 ; RESTORE THE QST BEFORE EXITINGR$ RETURN ; END OF UCB SEARCH, EXIT150$: CMP R0,R5 ; IS IT THE UCB WE STARTED WITH?L BEQ 40$ ; YES. GET NEXT ONE1 MOV U.UC2X(R5),@KISR6 ; MAP SECOND UCB EXTENSIONC+ MOV X.MLUN+140000,R1 ; GET MULTI-UNIT CODEE- MOV S.PBIA(R4),@KISR6 ; RESTORE PORT MAPPINGS( CMP R1,R2 ; MULTI UNIT CODE THE SAME? BNE 40$ ; NO. GET ANOTHER ONE/ ADD #10,SP ; WE FOUND IT, FLUSH THE UCB SCANL/ BIS #UU.IOS,U.UTIL(R5) ; SET THE STALL I/O BITC. MOV #T.NIOS,R0 ; I/O STALLED CONSOLE MESSAGE CALL @DVMSG ; GO PRINT IT MOV S.QST(R4),R2 ; GET QST& MOV (R2),R3 ; /*Q.CST*/ AND THE CST CALL PIOPAL ; ALLOCATE A PIOP6 MOV #AVNFUN,R0 ; SET UP THE AVAILABLE FUNCTION TABLE CALL CMDCOM ; GO GET A PACKET3 MOV #MD.SPD,P.MOD(R1) ; SET THE SPIN DOWN MODIFIERR4 PUSH <#CLACMD> ; SEE IF WE CAN START MORE COMMANDS$ CALL CMDSEN ; SEND OFF THE PACKET;0N; END PACKET RETURNS HERE. WE CAN'T REALLY DO ANYTHING INTELLIGENT IF THE I/O(; IS NOT A SUCCESS, SO JUST COMPLETE IT.;N PUSH <#0> ; NO BYTE COUNT& MOV #IS.SUC&377,R0 ; SHOW SUCCESSFUL70$: JMP ENDCOM ; FINISH ITA .IFF ;D$$DSK 6 BIT #IQ.UMD,I.FCN(R3) ; USER MODE DIAGNOSTIC BIT SET?+ BEQ 20$ ; NO. DO ONLINE/GET-UNIT-STATUS 3 BITB #US.UMD,U.ST2(R5) ; ATTACHED FOR DIAGNOSTICS?O+ BEQ 20$ ; NO. DO ONLINE/GET-UNIT-STATUSN2 MOV #GUSFUN,R0 ; ISSUE A GET-UNIT-STATUS COMMAND0 CALL CMDCOM ; BUILD THE COMMAND PACKET NEEDED# PUSH <#CLACMD> ; WHENCE TO RETURNO" CALL CMDSEN ; ISSUE THE COMMAND;I; END PACKET PROCESSING ;E$ MOV P.STS(R1),R0 ; GET STATUS CODE, BIC #^C,R0 ; GET MAJOR STATUS CODE( CMP R0,#ST.AVL ; IS IT AVAILABLE CODE? BNE 10$ ; NO.0 CLR R0 ; /*ST.SUC*/ ; INDICATE SUCCESS ANYWAY/10$: CALL ENDERR ; CONVERT TO RSX STATUS CODEA% PUSH <#0> ; NO STATUS FOR IOSB + 2/* CALLR ENDCOM ; AND GO CLEAN UP PROPERLY*20$: BIT #M.BOT,U.CW2(R5) ; ARE WE AT BOT?& BEQ 25$ ; NO. DO NOT WORRY ABOUT IT? BIT #UU.BLK,U.UTIL(R5) ; DOES UNIT SUPPORT MULTIPLE DENSITIES?D' BNE 25$ ; NO. NOTHING TO DO IN HEREP! PUSH ; SAVE ORIG IOP ADDRC+ CALL PIOPAL ; GET A PIOP FOR THE COMMANDP. POP ; SAVE ORIG IOP ADDR IN PIOP- MOV #AVNFUN,R0 ; FUNCTION CODE ENTRY TO USES' CALL CMDCOM ; BUILD TEMPLATE COMMAND : BIS #MD.CSE,P.MOD(R1) ; SET 'CLEAR SERIOUS EXCEPTION' MOD% PUSH <#CLACMD> ; WHERE TO RETURN TOY" CALL CMDSEN ; ISSUE THE COMMAND* PUSH ; SAVE REGISTERS FOR LATER( PUSH ; SAVE ORIG IOP ADDR4 MOV #IS.SUC,R0 ; NON-ZERO -> RETURN PACKET TO POOL" PUSH <#0> ; NO IOSB DATA EITHER% CALL ENDCMO ; CLEAN UP PACKET USEDA$ POP ; RESTORE ORIG PIOP ADDR" POP ; RESTORE REGISTERS225$: CALLR CMDONL ; ISSUE ONLINE/GET-UNIT-STATUS .ENDC ;D$$DSK .PAGE .IF DF,D$$DSK( .SBTTL CMDTRM - PROCESS RCT TERMINATION;+-; **-CMDTRM- PROCESS RCT TERMINATION REQUESTS;LH; THIS SECTION DOES ALL THE PROCESSING SPECIFIC TO TERMINATION REQUESTS.K; I.PRM CONTAINS THE ADDRESS OF THE I/O THAT MUST BE RESTARTED, AND I.PRM+2T-; CONTAINS THE STATUS CODE RETURNED FROM RCT. ;H ; INPUTS:N;O; R0 = FUNCTION TABLE ENTRYP; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;C ; OUTPUTS:;-CMDTRM:T> BIT #IQ.X!IQ.Q!IQ.UMD,I.FCN(R3) ; THESE MODIFIERS ARE ILLEGAL BEQ 10$ ; IT'S OK CALLR ILEGAL%10$: MOV R5,R0 ; COPY THE UCB TO R0E8 ADD #U.BPKT,R0 ; ADD THE OFFSET TO THE BAD BLOCK QUEUE7 MOV I.PRM(R3),R1 ; GET I/O THAT INITIATED THE REPLACE 4 BEQ 40$ ; IF NO IOP THEN JUST COMPLETE WITH SUCCE PUSH ; SAVE R3) CALL @QRMVA ; REMOVE IT FROM THE QUEUEF2 MOV (SP),R3 ; GET R3, BUT LEAVE IT ON THE STACK, CMPB #IS.SUC,I.PRM+2(R3) ; DID RCT SUCCEED?! BNE 20$ ; NO. COMPLETE THE I/OB" .IF DF D$$PRT!E$$LBN ;DC4121 MOV I.TCB(R1),R0 ; GET THE TCB ADDRESS ;DC412L@ MOVB T.PRI(R0),I.PRI(R1) ; RESTORE PRIORITY FOR REQUEUE ;DC412$ .ENDC ;DF,D$$PRT!E$$LBN ;DC4121 MOV R4,R0 ; COPY 00~ibjbkb a a aTHE SCB TO R0 (S.LHD IS AT 0) 5 CALL @QINSP ; INSERT THE IOP BACK IN THE SCB QUEUE  MOV S.QST(R4),R2 ; RESTORE R23 BR 30$ ; COMMON END POINT20$: MOV S.QST(R4),R2 ; RESTORE R2,& MOV I.PRM+2(R3),R0 ; GET STATUS CODE0 MOV I.PRM(R3),R3 ; MOVE THE ORIGINAL IOP TO R3 CLR R1 ; NO BYTE COUNT  CALL ENDCM1 ; FINISH THE I/OI30$: POP ; RESTORE R3)40$: MOV #IS.SUC&377,R0 ; SUCCESS STATUSE CLR R1 ; NO BYTE COUNT ( PUSH <#CLACMD> ; TRY TO START MORE I/O" CALLR ENDCM1 ; FINISH THE I.TRM .ENDC ;D$$DSK .PAGE= .SBTTL ENDCOM - COMMON PROCESSING TO COMPLETE AN I/O REQUEST);+:; **-ENDCOM - COMMON PROCESSING TO COMPLETE AN I/O REQUESTA; **-ENDCMO - ALTERNATE ENTRY POINT FOR ENDCOM (RETURN TO CALLER)M; ROUTINE DESCRIPTION ; ; INPUTS:P; :; R0 = STATUS (0 -> DO NOT CALL $IOFIN, I/O STILL PENDING); R1 = END PACKET3; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS; (SP)=BYTECOUNT;C&; OUTPUTS: (FALLING THROUGH TO ENDCM1); ; R0,R2-R5 ARE PRESERVED; R1 IS SET TO BYTECOUNT;-ENDCMO:C6 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:M .IF DF E$$LOG" TST R0 ; IS THERE ENDING STATUS- BEQ 10$ ; NO. THEN WE DON'T LOG THE PACKETF4 CMP #ST.VOL,P.STS(R1) ; IS IT 'NO VOLUME MOUNTED'?) BEQ 10$ ; YES. DO NOT LOG IT FOR TAPEE@ BITB #EF.LOG,P.STS(R1) ; IS THERE AN ERRORLOG PACKET TO FOLLOW BEQ 10$ ; NO. THEN DON'T LOGA .IF DF,D$$DSK5 BIT #UU.SEL,U.UTIL(R5) ; LOG PACKET FOR THIS DEVICE?C' BNE 10$ ; NE - DO NOT LOG THE PACKET4 .ENDC ;D$$DSK0 CMPB #OP.ONL!OP.END,P.OPCD(R1); ONLINE COMMAND? BEQ 10$ ; DO NOT LOG PACKET .IF DF,T$$APE3 CMPB #OP.AVL!OP.END,P.OPCD(R1); AVAILABLE COMMAND?E BEQ 10$ ; DO NOT LOG PACKET .ENDC ;T$$APE CALL LERR ; LOG THE ERROR10$: .ENDC ;E$$LOG6 BIT #IQ.UMD,I.FCN(R3) ; USER MODE DIAGNOSTIC REQUEST? BEQ 70$ ; NOK, PUSH ; SAVE WORK REGISTERS" MOV R3,R0 ; COPY OF IOP ADDRESS .IF DF T$$APE2 CMPB #IO.EOF/256.,I.FCN+1(R3); WRITE EOF FUNCTION BEQ 20$ ; IF EQ YES/ CMPB #IO.RWD/256.,I.FCN+1(R3); REWIND FUNCTIONN BNE 30$ ; IF EQ YES120$: MOV I.PRM+14(R3),I.PRM+16(R3); RELOCATE BIASP0 MOV I.PRM+12(R3),I.PRM+14(R3); RELOCATE ADDRESS30$: .IFTF ;T$$APE. MOV I.PRM+14(R0),R3 ; DESTINATION APR 6 BIAS BEQ 40$ ; NO BUFFER/ MOV I.PRM+16(R0),R4 ; REGISTER BUFFER ADDRESSQ BEQ 40$ ; NO BUFFER$ MOV R1,R2 ; R2 IS THE SOURCE DISP* SUB #ENVLEN,R2 ; BACK TO START OF HEADER/ BIC #160000,R2 ; R2 IS ADDRESS IN APR 5 RANGE  BIS #120000,R2 ;) MOV @KISR6,R1 ; R1 IS SOURCE APR 5 BIAS)' MOV #RPLEN+ENVLEN,R0 ; NUMBER OF BYTESS CALL @BLXIO ; MOVE THE DATA40$: .IFT ;T$$APE% MOV 2(SP),R3 ; RESTORE IOSB ADDRESSA2 CMPB #IO.EOF/256.,I.FCN+1(R3); WRITE EOF FUNCTION BEQ 50$ ; IF EQ YES/ CMPB #IO.RWD/256.,I.FCN+1(R3); REWIND FUNCTION  BNE 60$ ; IF EQ YES050$: MOV I.PRM+14(R3),I.PRM+12(R3); RESTORE BIAS/ MOV I.PRM+16(R3),I.PRM+14(R3); RESTORE ADDRESST60$: .ENDC ;T$$APE1 POP ; RESTORE ORIGINAL CONTENTSR70$:2 PUSH ; SAVE COMPLETION CODE/IOP ADDRESS* CALLV PORT,PKTDR ; DEALLOCATE END PACKET& MOV R3,R1 ; SAVE THE PACKET ADDRESS MOV (R2),R0 ; GET CST& ADD #C.OLHD,R0 ; POINT TO QUEUE HEAD7 CMP R1,(R0) ; IS THIS THE OLDEST PACKET IN THE QUEUEC( BNE 90$ ; NO. DON'T BOTHER WITH TIMER; 8; MUST TAKE CARE OF TIMER BECAUSE OLDEST COMMAND IS DONE; $ TST (R1) ; OTHER PACKETS ON QUEUE) BEQ 80$ ; NO. THEN DON'T RESTART TIMERA;?; RESET TIMEOUT COUNT FOR NEW OLDEST COMMAND AND RESET BUSY UCB ;,. MOV (R1),R1 ; ADDRESS OF THE NEW OLDEST CMD* MOV I.UCB(R1),R1 ; UCB OF THE NEW OLDEST. BICB #US.BSY,U.STS(R5) ; CLEAR OLD BUSY UNIT, BISB #US.BSY,U.STS(R1) ; SET NEW BUSY UNIT, MOV R1,S.BSYU(R4) ; REMEMBER NEW BUSY UNIT& MOVB S.ITM(R4),S.CTM(R4) ; SET TIMER2 MOV (R0),R1 ; GET BACK THE IOP WE'RE WORKING ON BR 90$E;C7; STOP THE TIMER THERE ARE NO MO00t__DATADATADATADATARE COMMANDS OUTSTANDING;Q80$: CLRB S.CTM(R4) ; STOP TIMERA BICB #US.BSY,U.STS(R5)N CLR S.BSYU(R4) ; CLEAR BSYUCBT90$:1 CALL @QRMVA ; REMOVE THE PACKET FROM THE QUEUET( MOV S.QST(R4),R2 ; RESTORE QST ADDRESS7 POP ; GET IOP ADDR, COMPL CODE, BYTE COUNTB; ; FALL THROUGH TO ENDCM1;B .PAGEI .SBTTL ENDCM1 - ALTERNATE ENTRY POINT FOR COMMANDS WITHOUT AN END PACKET;;+F; **-ENDCM1 - ALTERNATE ENTRY POINT FOR COMMANDS WITHOUT AN END PACKET; ROUTINE DESCRIPTIONE;E ; INPUTS:M;D:; R0 = STATUS (0 -> DO NOT CALL $IOFIN, I/O STILL PENDING); R1 = BYTECOUNT; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;O ; OUTPUTS:;M; R0-R1 DESTROYED; R2,R4-R5 ARE PRESERVED; R3 IS SET TO CST;-ENDCM1:D;T(; DEALLOCATE UMRS IF THEY WERE ALLOCATED;.E BITB #IP.UMR,I.FLAG(R3) ; UMR WAIT BLOCK ALLOCATED FOR THIS? ;DC412D BEQ 20$ ; IF EQ NO ;DC412N) PUSH ; SAVE R2 AND R3 ;DC412 7 BICB #IP.UMR,I.FLAG(R3) ; CLEAR THE UMR FLAG ;DC412=! MOV (R2),R2 ; GET CST ;**-4// BIS #C1.DQU,(R2) ; SET THE BIT TO CALL $DQUMRD7 ADD #C.UMRW,R2 ; POINT TO BEGINNING OF THE WAIT BLOCKA% MOVB I.PRM(R3),R3 ; GET BLOCK INDEXS# PUSH ; SAVE THE BLOCK INDEX3( ASL R3 ; MAKE THE INDEX A WORD OFFSET3 ADD R3,R2 ; ADD IT TO THE BEGINNING OF THE TABLEM" DEC (R2) ; CLEAR THE IN USE BIT% PUSH ; SAVE THE TABLE ADDRESS 3 MOV (R2),R2 ; GET ADDRESS OF THE BLOCK FOR DEUMR;) ADD #10,R2 ; POINT TO THE MAPPING INFOH MOV S.QST(R4),R3 ; GET QST MOV (R3),R3 ; NOW THE CSTS7 INC C.UMCT(R3) ; INCREMENT UMR ASSIGNMENT BLOCK COUNTW" CALL @DEUMR ; DEASSIGN THE UMRS6 POP ; RESTORE BLOCK INDEX AND BLOCK ADDRESS> .IIF DF D$$DSK CMP #DUUMR,R3 ; DYNAMICALLY ALLOCATED BLOCK?> .IIF DF T$$APE CMP #MUUMR,R3 ; DYNAMICALLY ALLOCATED BLOCK? BGE 10$ ; IF GE, NO PUSH ; SAVE R0 AND R1+ MOV (R2),R0 ; MOV THE ADDRESS FOR $DEACBS: .IIF DF M$$PRO TST -(R0) ; ADJUST FOR EXTRA WORD FOR URM, CLR (R2) ; CLEAR THE ADDRESS IN THE TABLE' MOV #UMRWTB.,R1 ; LENGTH OF THE BLOCK * CALL @DEACB ; DEALLOCATE THE WAIT BLOCK" POP ; RESTORE R1 AND R0&10$: POP ; RESTORE R3 AND R2&20$: TST R0 ; DO WE COMPLETE THIS IO BEQ 40$ ; NO. THEN WE EXITL2 BITB #IP.FAK,I.FLAG(R3) ; IS IT A PIOP ;DC412' BEQ 30$ ; NO. FINISH THE I/O ;**-1, MOV R3,R1 ; ADDRESS OF PIOP TO DEALLOCATE( MOV (R2),R3 ; WE NEED CST FOR PIOPDE% CALLR PIOPDE ; DEALLOCATE THE PIOPO30$: PUSH 5 CALL @IODSA ; SPECIAL ENTRY POINT FOR MSCP DEVICES POP H5 MOV U.SCB(R5),R4 ; RECOVER R4 (DESTROYED BY $IOFIN)P< MOV S.PBIA(R4),@KISR6 ; MAP APR 6 TO PORT DRIVER ;DC513C MOV S.PBIA(R4),@#KINAR6 ; FOR I/D SYSTEMS MAP BOTH I AND D ;DC513E( MOV S.QST(R4),R2 ; RESTORE QST ADDRESS40$:! MOV (R2),R3 ; CST IS RESTOREDN RETURN/ .PAGE6 .SBTTL ENDERR - TRANSLATE MSCP ERROR CODE TO RSX CODE;+2; **-ENDERR- TRANSLATE MSCP ERROR CODE TO RSX CODE;AE; THIS ROUTINE LOOKS AT THE CURRENT END PACKET, POINTED TO BY R1, ANDFD; TRANSLATES THE MSCP ERROR RETURNED TO THE RSX EQUIVALENT. IN SOMEG; ERRORS, ADDITIONAL ACTION IS REQUIRED, E.G. FOR POSITION LOST ERRORS, !; THE POWER FAIL BIT MUST BE SET. ; ; INPUTS: ; ; R1 = END PACKET ADDRESSS; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;R ; OUTPUTS:;./; R0 = RSX ERROR STATUS (CAN BE IS.SUC AS WELL)O; R1-R5 = PRESERVEDT<; POWERFAIL FLAG SET IF TMSCP ERROR IS ST.POL(POSITION LOST); ;-ENDERR:N .IF DF T$$APE4 BITB #EF.EOT,P.FLGS(R1) ; WAS PHYSICAL EOT REACHED? BEQ 10$ ; NO.4 MOVB P.OPCD(R1),R0 ; GET US THE ACTUAL OPCODE USED8 BIC #177400!OP.END,R0 ; CLEAR ALL BUT THE OPCODE ITSELF0 CMP R0,#OP.RD ; WAS THIS EITHER READ FUNCTION?1 BEQ 10$ ; YES. DON'T REPORT EOT ON SUCH THINGS. CMP R0,#OP.REP ; IS THIS A SPACING FUNCTION?, BEQ 10$ ; YES. KEEP ORIGINAL STATUS CODE/ CMP R0,#OP.CMP ; IS THIS A COMPARE HOST DATA? , BEQ 10$ ; YES. KEEP ORIGINAL STATUS CODE4 MOV #IE.E00~ibjbkb a a aOT&377,R0 ; INDICATE PHYSICAL END OF TAPE; BIC #M.AEOV!M.BOT!M.RWD!M.SER!M.TMK,U.CW2(R5) ; NEW STATES ! BIS #M.EOT,U.CW2(R5) ; NEW STATEO, RETURN ; THAT'S ALL WE NEED FOR THIS ONE10$: .IFTF ;T$$APE- PUSH ; SAVE. NEED AS A WORK REGISTER?+ MOV P.STS(R1),R1 ; GET TMSCP STATUS CODEST, BIC #^C,R1 ; CLEAR OUT THE SUBCODE .IFT ;T$$APE$) CMP #ST.AVL,R1 ; IS THE UNIT AVAILABLE?,+ BEQ 20$ ; YES. THIS MEANS CERTAIN STATEQ- CMP #ST.BOT,R1 ; IS THERE A BOT INDICATION?# BNE 30$ ; NO.+20$: BIS #M.BOT,U.CW2(R5) ; INDICATE AT BOTBB BIC #M.AEOV!M.PEOV!M.RWD!M.SER!M.TMK!M.EOT,U.CW2(R5) ; NEW STATES30$: .IFTF ;T$$APE/ MOVB RSXTAB(R1),R0 ; TRANSLATE THE ERROR CODE;4 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 UPE4 BISB #US.PWF,U.STS(R5) ; SET POWERFAIL BIT FOR UNIT40$:( POP ; RESTORE END PACKET ADDRESS .IFF( POP ; RESTORE END PACKET ADDRESS, CMP P.STS(R1),#ST.DAT ; IS IT FORCED ERROR? BNE 50$ ; NO. LEAVE IT ALONEV3 MOV #IE.FER&377,R0 ; SET FORCED ERROR STATUS CODES50$: .ENDC- CMP #ST.OFL,P.STS(R1) ; WAS IT UNIT OFFLINE?E BNE 60$ ; NO. JUST EXIT0 MOV #IE.IDU&377,R0 ; ST.OFL MEANS NO SUCH UNIT60$: RETURN1 .PAGE .IF DF,D$$DSK! .SBTTL ENDSIO - TRY TO STALL I/OU;+; **-ENDSIO- TRY TO STALL I/OO;F ; INPUTS: ;T; R1 END PACKET ADDRESST; R2 QST ADDRESS; R3 (P)IOP ADDRESSP; R4 SCB ADDRESS; R5 UCB ADDRESS;C ; OUTPUTS:0; CARRY CLEAR - R1-R5 PRESERVED, I/O NOT STALLED-; CARRY SET - R2,R4,R5 PRESERVED, I/O STALLEDE;-+ENDSIO: MOV P.STS(R1),R0 ; GET STATUS WORDL+ BIC #^C,R0 ; CLEAR SUBSTATUS BITS " CMP #ST.OFL,R0 ; OFFLINE TO DISK( BEQ 5$ ; YES. SHOULD TRY TO STALL I/O' CMP #ST.AVL,R0 ; HOW ABOUT AVL STATE?N& BNE 20$ ; NOT THAT EITHER, CONTINUE5$:Y2 BITB #IP.FAK,I.FLAG(R3) ; IS IT A PIOP? ;DC4127 BNE 20$ ; YES. LET PIOP'S THROUGH FOR RECOVERY ;**-1B3 BIT #UU.SIO,U.UTIL(R5) ; DOES THIS UNIT STALL I/O?L BEQ 20$ ; IF EQ NOI. BITB #US.MNT,U.STS(R5) ; IS THE UNIT MOUNTED? BNE 20$ ; NO. DON'T STALL I/O& CLR R0 ; INDICATE NOT TO FINISH I/O5 PUSH ; SAVE THE IOP AND SHOW NO BYTE COUNT;( CALL ENDCMO ; CLEAN UP THE END PACKET POP ; GET IOP#. .IF DF D$$DSK&DU$CHK ; IF QUEUE OPTIMIZATION4 MOV I.UCB(R1),R5 ; MAKE SURE WE HAVE THE RIGHT UCB! CALL REQUE ; RECONVERT THE LBN$ .ENDC ;D$$DSK&DU$CHKU4 MOV R4,R0 ; MOVE THE S.LHD QUEUE TO R0 FOR $QINSB5 CALL @QINSB ; INSERT AT THE BEGINNING OF THE QUEUE.3 BIT #UU.IOS,U.UTIL(R5) ; DID WE ALREADY STALL I/O?.+ BNE 10$ ; YES. DON'T REISSUE THE MESSAGE / BIS #UU.IOS,U.UTIL(R5) ; SET THE STALL I/O BITO* MOV #T.NIOS,R0 ; SET I/O STALLED MESSAGE CALL @DVMSG ; GO SEND IT  MOV S.QST(R4),R2 ; RESTORE R2 %10$: SEC ; SHOW THAT WE STALLED ITR RETURNM 20$: CLC ; WE DIDN'T STALL IT RETURN  .ENDC ;D$$DSK .PAGE- .SBTTL FINIO - FINISH UP ALL I/O IN A QUEUE ;+.; **-FINIO-FINISH ALL I/O IN A QUEUE AS IE.FHE;T ; INPUTS:I;O; R1 INITIAL POINTER FOR QUEUE; R2 QST ADDRESS; R4 SCB ADDRESS; R5 UCB ADDRESS;' ; OUTPUTS:; R2,R4,R5 PRESERVED;-FINIO:+ MOV R1,R3 ; COPY THE QUEUE ADDRESS TO R3;! MOV (R3),R3 ; GET FIRST PACKETM, BEQ 20$ ; THERE AREN'T ANY, SO JUST LEAVE$ CLR (R1) ; REINITIALIZE THE QUEUE MOV R1,2(R1) ; .../10$: MOV #IE.FHE&377,R0 ; FATAL HARDWARE ERRORN CLR R1 ; NO BYTE COUNT 3 PUSH <(R3)> ; SAVE LINK TO NEXT IOP IN THE QUEUEO CALL ENDCM1 ; GO FINISH ITE/ POP ; GET LINK TO NEXT IOP IN THE QUEUER BNE 10$ ; GO DO THE NEXT ONEB 20$: RETURN5 .PAGE. .SBTTL GCSSIO - INITIATE A GET COMMAND STATUS;+:; **-GCSSIO-INITIATE A GET COMMAND STATUS COMMAND (OP.GCS);; ; INPUTS:P;E; R2 QST ADDRESSA; R3 CST ADDRESSE; R4 SCB ADDRESSA; R5 UCB ADDRESS,;1 ; OUTPUTS:;M;-GCSSIO:7# TST C.OLHD(R3) ; I/O STILL THERE? $ BNE 10$ ; IF NE, YES. CHECK ON IT0 BIC #C1.GCS,(R3) ; FORGET ABOUT ISSUING 00t__DATADATADATADATAOP.GCS) JMP CLACMD ; GO TRY TO START SOMETHING ;T7; ISSUE 'GET COMMAND STATUS' COMMAND FOR OLDEST COMMAND:;T10$:/ BIS #C1.TMO,(R3) ; WE'RE NOW IN TIMEOUT STATET- BIC #C1.GCS,(R3) ; SHOW THAT WE DID THE GCSA) MOV #GCSFUN,R0 ; GET GCS FUNCTION TABLE , MOVB FO.SZ(R0),R0 ; GET SIZE OF THE PACKET! CALLV PORT,PKTAC ; GET A PACKETC7 MOV C.OLHD(R3),R0 ; GET ADDRESS OF THE OLDEST COMMAND(, MOV #OP.GCS,P.OPCD(R1) ; SET UP GCS OP CODEB MOVB I.FLAG(R0),P.OTRF(R1) ; OUTSTANDING REFERENCE NUMBER ;DC412C BIC #^C<17>,P.OTRF(R1) ; CLEAR OUT ALL BUT THE SEQUENCE BITS ;**-1S< 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 NUMBERS MOV R0,P.CRF+2(R1) ; ..., MOV I.UCB(R0),R5 ; GET CORRECT UCB ADDRESS? BISB U.UNIT(R5),P.UNIT(R1) ; UNIT NUMBER (WAS ZEROED IN PKTAC)P& CALLV PORT,PORSEN ; SEND THE COMMAND. JMP CLACMD ; GO TRY TO START OTHER COMMANDS .PAGE4 .SBTTL GUSSIO - START AND PROCESS AN OP.GUS REQUEST .SBTTL CMDGUS - GET UNIT STATUS;+1; **-GUSSIO - START AND PROCESS AN OP.GUS REQUEST ;-H; THIS ROUTINE ISSUES GUS COMMANDS. THE GUSSIO ENTRY POINT WILL ISSUE A#; FOR ANY UNIT THAT HAS UU.GUS SET.T;C ; INPUTS:;V ; ASSUMES ONE SCB PER CONTROLLER; R2 = QST ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS; ; OUTPUTS:; IF C1.GUS IS CLEARED THENL;P; R2 = QST ADDRESS; R3 = CST ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;.; **-CMDGUS - GET UNIT STATUSD;O; ROUTINE DESCRIPTION;BM; CONTROL IS PASSED TO THIS POINT WHEN A GET UNIT STATUS COMMAND IS ISSUED BYU(; THE USER, SUCH AS IN AN IO.STC COMMAND; ; INPUTS: ;R; R0 = FUNCTION TABLE ENTRYN; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS; ; OUTPUTS:;E; R2-R5 ARE PRESERVED;5;- .ENABL LSB CMDGUS::* PUSH <#CLACMD> ; RETURN TO CLASS COMMAND BR 30$ ; GO TO COMMON CODEGUSSIO:B;D!; LOOK FOR UNITS NEEDING OP.GUS'SC;U" PUSH <#SCUCB> ; START A UCB SCAN!10$: CALL @(SP)+ ; GO GET A UCBE BCC 20$ ; WE GOT ONET JMP 190$ ; NONE LEFT, EXITB520$: BIT #UU.GUS,U.UTIL(R5) ; IS AN OP.GUS REQUIRED?U$ BEQ 10$ ; IF EQ, NO. TRY NEXT ONE- BIC #UU.GUS,U.UTIL(R5) ; LEAVE UU.GUS STATE=9 BIS #UU.SER,U.UTIL(R5) ; MAKE SURE WE'RE IN SERIAL MODER CALL PIOPAL ; GO GET A PIOP5 PUSH <#200$> ; RETURN TO ISSUING MORE GUS COMMANDSC: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 ; ); PROCESS END PACKET FOR OP.GUS - INPUTS: ;O; R1 = END PACKET ADDRESSU; R3 = IOP ADDRESS; R2 = QST ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;B .IF DF D$$DSK;;#; SAVE INFORMATION IN UCB EXTENSIONU;(- PUSH ; SAVE END PACKET, QST, IOPI6 MOV #,R0 ; SET NUMBER OF BYTES TO MOVE- MOV R1,R2 ; COPY MSCP PACKET POINTER TO R2R1 ADD #P.MLUN,R2 ; UPDATE OFFSET INTO MSCP PACKET;+ MOV @KISR6,R1 ; GET PACKET'S BASE ADDRESS " SUB #20000,R2 ; BIAS IT PROPERLY/ MOV U.UC2X(R5),R3 ; GET DESTINATION APR6 BIAS5 MOV #X.MLUN+140000,R4 ; GET DESTINATION DISPLACEMENTQ CALL @BLXIO ; MOVE THE DATA, MOV U.SCB(R5),R4 ; RESTORE THE SCB ADDRESS8 .IF DF D$$DSK&DU$CHK ; IF QUEUE OPTOMIZATION SUPPORTED- MOV 4(SP),R2 ; RETRIEVE MSCP PACKET POINTERL1 MOVB P.TRCK(R2),U.PRM(R5) ; SET UP SECTORS/TRACK;& MOVB P.GRP(R2),R0 ; GET TRACKS/GROUP0 MUL P.CYL(R2),R0 ; MULTIPLY BY GROUPS/CYLINDER. MOVB R1,U.PRM+1(R5) ; SET UP TRACKS/CYLINDER" MOV R1,R0 ; SET UP FOR MULTIPLY. MUL P.TRCK(R2),R0 ; COMPUTE SECTORS/CYLINDER' MOV U.CW3(R5),R3 ; SET UP MAX LBN ...L MOVB U.CW2(R5),R2 ; ...M% DIV R1,R2 ; COMPUTE CYLINDERS/UNITO, MOV R2,U.PRM+2(R5) ; SET UP CYLINDERS/UNIT .ENDC ;D$$DSK&DU$CHKP;TN; THE NEXT SECTION OF CODE SETS MULTI-UNIT CODES FOR THE UNIT. IF THE MULTI-P; UNIT CODE OF THIS UNIT MATCHES THAT OF ANY OTHER UNITS ON THE CONTROLLER, UU.SN; IS SET IN THE UCB OF THE FIXED DISK. THIS INDICATES THAT I/O CAN BE STALLEDL; TO THIS UNIT. FOR M00~ibjbkb a a a-PLUS, US.MUN IS SET IN THE UCB OF THE REMOVABLE DISK.N; THIS TELLS DISMOUNT TO ISSUE WARNING MESSAGES ABOUT MULTI-UNIT SPIN DOWN AND=; TO PREVENT NON-PRIVILEGED USERS FROM SPINNING DOWN THE DISKT; $ MOV 4(SP),R1 ; GET END PACKET BACK$ MOV P.UNFL(R1),R0 ; GET UNIT FLAGS- MOV P.MLUN(R1),R2 ; AND THE MULTI-UNIT CODE-( BEQ 90$ ; IF NO CODE, UNIT IS OFFLINE MOV R5,R3 ; SAVE THE UCBO( PUSH <#SCUCB> ; GET UCB SEARCH ADDRESS!50$: CALL @(SP)+ ; GO GET A UCBA BCS 90$ ; ALL DONE " CMP R5,R3 ; IS IT THE SAME UCB? BEQ 50$ ; YES. GO GET ANOTHER' PUSH <@KISR6> ; SAVE THE PORT MAPPINGA1 MOV U.UC2X(R5),@KISR6 ; MAP THE SECOND EXTENSIONN& MOV 140000+X.UNFL,R1 ; GET UNIT FLAGS/ MOV 140000+X.MLUN,R4 ; AND THE MULTI-UNIT CODE POP <@KISR6> ; REMAP THE PORTA1 CMP R2,R4 ; ARE THE MULTI-UNIT CODES THE SAME? BNE 50$ ; NO. GO TRY ANOTHERO- BIT #UF.RMV,R0 ; IS THE ORIGINAL REMOVABLE?C BNE 60$ ; IF NE YES8 BIS #UU.SIO,U.UTIL(R3) ; INDICATE DEVICE CAN STALL I/O8 BICB #US.MUN,U.ST2(R3) ; DON'T HAVE DMO ISSUE MESSAGES BR 70$ ; BRANCH AROUND <60$: BISB #US.MUN,U.ST2(R3) ; INDICATE DEVICE IS MULTI-UNIT.70$: BIT #UF.RMV,R1 ; IS THE OTHER REMOVABLE? BNE 80$ ; IF NE YES8 BIS #UU.SIO,U.UTIL(R5) ; INDICATE DEVICE CAN STALL I/O8 BICB #US.MUN,U.ST2(R5) ; DON'T HAVE DMO ISSUE MESSAGES BR 50$ ; FINISH THE SCAN.<80$: BISB #US.MUN,U.ST2(R5) ; INDICATE DEVICE IS MULTI-UNIT BR 50$ ; FINISH THE SCANB790$: POP ; RESTORE IOP, QST, AND END PACKETB .IFF ;D$$DSK(. MOV P.MEDI(R1),U.MEDI(R5) ; SAVE THE MEDIA ID/ MOV P.MEDI+2(R1),U.MEDI+2(R5) ; IT'S TWO WORDSD .IFTF ;D$$DSK;N>; NOW WE CHECK OUT THE STATUS CODE AND TAKE APPROPRIATE ACTION; 3 CALL ENDERR ; MAP MSCP END CODE INTO AN RSX CODEN+ PUSH <#0> ; PUT A FLAG WORD ON THE STACKH: MOV P.STS(R1),-(SP) ; PUT THE STATUS IN A TEMPORARY CELL' BIC #^C,(SP) ; GET MAJOR CODEI, CMP #ST.AVL,(SP)+ ; WAS IT UNIT AVAILABLE?& BNE 140$ ; NO. LEAVE THE ERROR CODE;E5; SPECIAL PROCESSING IF THE STATUS WAS UNIT-AVAILABLER;;4 MOV #IS.SUC,R0 ; RETURN SUCCESS AS THE STATUS CODE? BIT #UU.ATN,U.UTIL(R5) ; WAS THIS GUS FROM ATTENTION MESSAGE?A BEQ 170$ ; NO. JUST CONTINUEI .IFF ;D$$DSKE3 BIT #UU.BLK,U.UTIL(R5) ; SHOULD WE DO THE ONLINE?  BEQ 170$ ; NO. JUST CONTINUE .IFTF ;D$$DSK2 INC (SP) ; MARK THE FLAG WORD AS NEEDING AN ONL BR 170$ ; GO FINISH UPI .IFT ;D$$DSKP.140$: TST P.STS(R1) ; WAS THE STATUS SUCCESS? BNE 170$ ; NO. FINISH UPC; <; SPECIAL PROCESSING IF THE STATUS WAS SUCCESS - UNIT ONLINEI; IF THIS IS THE GUS AFTER AN ONL, THEN REQUEST RCT AND RESTART STALL I/OI;U2 BIT #UU.SER,U.UTIL(R5) ; WERE WE IN SERIAL MODE?2 BEQ 160$ ; NO. MUST HAVE BEEN AN IO.STC ;DC4121 BITB #US.VV,U.STS(R5) ; IS VOLUME VALID? ;**-1U% BNE 150$ ; YES. REQUEST RCT TO RUN(8 BIT #UU.IOS,U.UTIL(R5) ; IS I/O STALLED TO THIS DEVICE?$ BEQ 160$ ; NO. CONTINUE ;DC4126150$: PUSH ; R1 IS A PARAMETER FOR RQRCT ;**-10 CLR R1 ; R1 = 0 TELLS RCT WE ARE INITIALIZING CALL RQRCTS POP ; RESTORE R1; SEE IF INIT WAS STALLING I/O9 BIT #UU.IOS,U.UTIL(R5) ; IS I/O STALLED TO THIS DEVICE?($ BEQ 160$ ; NO. CONTINUE ;DC4129 BIC #UU.IOS,U.UTIL(R5) ; CLEAR THE STALL I/O BIT ;**-1U* BISB #US.VV,U.STS(R5) ; SET VOLUME VALID* PUSH ; SAVE WORK REGISTERS. MOV #T.NIOR,R0 ; SET THE I/O RESUMED MESSAGE CALL @DVMSG ; GO PRINT IT" POP ; GET 'EM BACK$160$: ; REFERENCE LABEL ;DC412;1>; IF SPECIAL ONLINE PUT STATUS CODE IN $SCERR AND CLEAR UU.SPC;T?170$: BIC #UU.ATN!UU.SER,U.UTIL(R5) ; EXIT SERIAL AND ATN STATE5! BIT #UU.SPC,U.UTIL(R5) ; $SCOFL?( BEQ 180$ ; IF EQ, NON- MOVB R0,@SCERR ; SET UP ERROR CODE FOR EXECT/ BIC #UU.SPC,U.UTIL(R5) ; NOLONGER SPECIAL CASE !180$: PUSH <#0> ; NO BYTE COUNT, .IFF ; IF TAPEG140$:=170$: BIC #UU.ATN!UU.SER,U.UTIL(R5) ; CLEAR ATN AND SER FLAGS;. BIC #M.DEFM,U.CW2(R5) ; CLEAR DEFAULT FLAGS- BITB #EF.EOT,P.FLGS(R1) ; EOT ENCOUNTERED ?F BEQ 60$ ;00t__DATADATADATADATA NOU0 BISB #M.EOT,U.CW2(R5) ; YES. ENCOUNTERED EOT60$:5 BIT #UF.WPH,P.UNFL(R1) ; HARDWARE WRITE-PROTECTED ? BEQ 70$ ; NOI8 BIS #M.HWL,U.CW2(R5) ; YES. HARDWARE WRITE-PROTECTED70$:% BIT #TF.PE,P.FORM(R1) ; 1600 BPI ?C BEQ 80$ ; NOO( BIS #M.1600,U.CW2(R5) ; YES. 1600 BPI' BR 90$ ; DO NOT CHECK MORE DENSITIES80$:% BIT #TF.GCR,P.FORM(R1) ; 6250 BPI ?T BEQ 90$ ; NO( BIS #M.6250,U.CW2(R5) ; YES. 6250 BPI90$: ; REFERENCE LABEL) CMP #ST.OFL,R0 ; UNIT OFFLINE ? BNE 110$ ; NO, BIS #M.SER,U.CW2(R5) ; YES. SELECT ERROR110$:U PUSH ; SET IOSB+2 VALUEE CMP I.FCN(R3),#IO.STC BEQ 120$, CMP I.FCN(R3),#IO.SMO BEQ 120$P2 MOV U.CW2(R5),(SP) ; VALUE TO BE USED FOR IOSB+2120$:8 .ENDC ;D$$DSK1 CALL ENDCMO ; GO FINISH UP, AND COME BACK HEREN& TST (SP)+ ; SHOULD WE DO AN ONLINE? BEQ 220$ ; NO. JUST RETURN+ JMP ONLSIO ; GO ISSUE THE ONLINE COMMANDY5; NO UNIT'S REQUIRE OP.GUS'S - LEAVE THE C1.GUS STATE 190$:;' MOV (R2),R3 ; R3 IS THE CST ADDRESS#' BIC #C1.GUS,(R3) ; LEAVE C1.GUS STATE1+ JMP CLACMD ; GO LOOK FOR SOMETHING TO DOI;N4; GO BACK TO TOP OF LOOP FOR PROCESSING MORE PACKETS200$:+ CALLV PORT,PKTCH1 ; DO WE HAVE RESOURCES?O& ; ONLY NEED ONE CREDIT SINCE THIS ; IS AN IMMEDIATE CMD BCS 210$ ; NO RESOURCES, QUIT% JMP 10$ ; WE'RE OK, GO TRY ANOTHER '210$: ADD #10,SP ; FLUSH THE UCB SCANE220$: RETURN ; GO HOMEI/ .DSABL LSB ; DISABLE LOCAL SYMBOL DEFINITION .PAGE .SBTTL LERR - LOG AN ERROR ' .SBTTL CERR - LOG A CONTROLLER ERRORU .IF DF E$$LOG;+-; **- CERR - CONTROLLER ERROR LOGGING ROUTINEC;OJ; THE CONTROLLER ERROR LOGGING ROUTINE WILL CAUSE THE CREATION OF AN ERRORJ; LOG PACKET, COPY THE VALUES OF THE TWO I/O PAGE REGISTERS INTO THE ERRORJ; LOG PACKET AND REQUEST THE ERROR LOGGING SUB-SYSTEM TO CAPTURE THE DATA.;N ; INPUTS:$1; R0 = ERROR CODE (IE.FHE FOR CONTROLLER FAILURE) ; R3 = CST ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS; ; OUTPUTS:; @; THE ERROR (OR TIME OUT) ON THE SPECIFIED CONTROLLER IS LOGGED.;F;- .ENABL LSB CERR:R5 PUSH ; SAVE REGISTERS (WE NEED R0)L$ MOV S.KRB(R4),R2 ; GET KRB ADDRESS$ MOV K.CSR(R2),R2 ; GET CSR ADDRESS;Y$; SET UP CONTROLLER ERROR LOG PACKET; ' MOV #4,C.MLNG(R3) ; SET PACKET LENGTHE. MOVB #-2,C.VCIX(R3) ; SET VIRTUAL CIRCUIT ID( MOVB #20,C.CRED(R3) ; SET CREDIT FIELD& MOV (R2),C.IP(R3) ; SAVE IP REGISTER' MOV 2(R2),C.SA(R3) ; SAVE SA REGISTERE! MOV #C.IP,R1 ; ADJUST R1 TO ... 3 ADD R3,R1 ; POINT TO CONTROLLER ERROR LOG PACKET& ; ADJUSTED LATER TO POINT TO MLNG BR 10$ ; AND LOG ERROR PACKET;+'; **- LERR - UNIT ERROR LOGGING ROUTINEE;H; THE UNIT ERROR LOGGING ROUTINE WILL CAUSE THE CREATION OF AN ERROR LOGG; PACKET, COPY THE CONTENTS OF THE MSCP ERROR LOG PACKET INTO THE ERROR)J; LOG PACKET AND REQUEST THE ERROR LOGGING SUB-SYSTEM TO CAPTURE THE DATA.;, ; INPUTS: ;E+; R0 = COMPLETION STATUS (IS.SUC OR IE.XXX)R#; R1 = CURRENT RESPONSE RING PACKETT; R4 = SCB ADDRESS; R5 = UCB ADDRESS;E ; OUTPUTS:;,; THE ERROR ON THE SPECIFIED UNIT IS LOGGED.;-LERR:O( PUSH ; SAVE REGISTERS810$: CLRB S.ROFF(R4) ; ZERO OFFSET TO FIRST REGISTER OF ; ... ERRLOG PACKET6 MOV #MSGLNG,R2 ; GET OFFSET TO BEGINNING OF ENVELOPE2 ADD R1,R2 ; ADD BASE ADDRESS OF RESPONSE PACKET# PUSH <(R2)> ; GET MESSAGE LENGTHC2 ADD #-,(SP) ; ADD EXTRA FOR THE ENVELOPE7 CMP #RSPLNG,(SP) ; DID WE EXCEED MAXIMUM PACKET SIZE?I BHIS 30$ ; IF HIS NOD920$: TST (SP)+ ; PACKET + ENVELOPE EXCEEDS MAXIMUM SIZEN$ BR 80$ ; EXIT, CAN'T ERROR LOG IT/30$: MOV (SP),R2 ; COPY NUMBER OF BYTES TO R2: MOVB (SP)+,S.RCNT(R4) ; NUMBER OF REGISTERS TO COPY FOR ; ... ERROR LOG& CLR S.PKT(R4) ; ASSUME NO IOP ACTIVE2 MOV CREDIT(R1),R0 ; OBTAIN MESSAGE/CREDIT FIELDS5 BIC #^C,R0 ; CLR ALL BUT MESSAGE TYPE FIELDA CMPB #,R0 ; IS THIS RESPONSE A DATAGRAM PACKET?P BEQ 40$ ; IF EQ Y& MOV P.CRF+2(R1)00~ibjbkb a a a,R3 ; GET IOP ADDRESS* BEQ 40$ ; NO PACKET...... NOT POSSIBLE?F BITB #IP.FAK,I.FLAG(R3) ; NO. DOING AN INTERNAL I/O FUNCTION? ;DC412 BNE 40$ ; IF EQ YES ;**-1R7 MOV P.CRF+2(R1),S.PKT(R4) ; NO. COPY IOP ADDRESS FORY ; ... ERROR LOGGERG ; IS I/O ACTIVE?U BR 50$ ; NO. GO ON TO LOG IT040$: CLR R4 ; NO. CLR R4 50$: PUSH ; SAVE R1 AGAIN+ MOV R2,R1 ; COPY NUMBER OF BYTES INTO R1G;R; INTERFACE TO $LOGER:;T ; INPUTS:T;,; R1 = LENGTH OF DATA TO BE LOGGED, IN BYTES#; R4 = SCB ADDRESS (ZERO IF NO IOP)T; R5 = UCB ADDRESS;B ; OUTPUTS:;L; C = 1 UNABLE TO LOG ERRORA;/; C = 0 ABLE TO LOG ERROR$;;0; R1 = ADDRESS OF DATA AREA IN ERROR LOG PACKET#; R3 = ADDRESS OF ERROR LOG PACKET.;E; NOTE:E;; R4 AND R5 ARE PRESERVEDB!; R0, R2, AND R3 MAY BE DESTROYED:+; KISAR6 IS DESTROYED BY $LOGER ON 11M PLUSV;1, CALL @LOGER ; ATTEMPT TO LOG ERROR PACKET+ BCS 20$ ; EXIT IF WE CAN'T LOG THE ERRORU. MOV R1,R4 ; COPY R1 INTO R0 FOR DESTINATION3 POP ; GET POINTER TO MSCP PACKET FOR SOURCEU. BCS 80$ ; IF CS, UNABLE TO LOG ERROR PACKET* PUSH ; SAVE DESTROYED REGISTERS2 ADD #MSGLNG,R2 ; OFFSET TO BEGINNING OF ENVELOPE/ BIC #160000,R2 ; R2 IS ADDRESS IN APR 5 RANGEO BIS #120000,R2 ;( MOV U.SCB(R5),R3 ; RESTORE SCB ADDRESS( MOV S.PBIA(R3),R1 ; MAP TO PORT DRIVER CLR R0 ; SETUP FOR "BISB": BISB S.RCNT(R3),R0 ; NUMBER OF REGISTERS (WORDS) TO COPY7 MOV (SP),R3 ; RESTORE ERRORLOG PACKET ADDRESS (BIAS)R CALL @BLXIO ; MOVE THE DATA" MOV U.SCB(R5),R4 ; R4 IS THE SCB5 MOV S.PBIA(R4),@KISR6 ; MAP APR 6 TO PORT DRIVER,& MOV S.PBIA(R4),@#KINAR6 ; KERNAL DATA0 POP ; GET MAPPING BIAS FOR ERRLOG PACKET POP ; RESTORE REGISTER, 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 R2C;R;R; INTERFACE TO $FNERL:;O ; INPUTS:Y;M; R0 = FIRST I/O STATUS WORD,; R2 = STARTING AND FINAL ERROR RETRY COUNTS2; R3 = ADDRESS OF ERROR LOG PACKET (BIAS IF MPLUS)#; R4 = SCB ADDRESS (ZERO IF NO IOP)T; R5 = UCB ADDRESS;P ; OUTPUTS:;6*; THE SPECIFIED ERROR LOG PACKET IS LOGGED;F; NOTE: ;K; R4 AND R5 ARE PRESERVEDE!; R1, R2, AND R3 MAY BE DESTROYED ;C970$: CALL @FNERL ; FINISH LOGGING THIS ERROR LOG PACKET;.80$: POP ; RESTORE REGISTERS2 MOV S.PBIA(R4),@KISR6 ; MAP APR 6 TO PORT DRIVER& MOV S.PBIA(R4),@#KINAR6 ; KERNAL DATA RETURN .DSABL LSBN .ENDC .PAGE* .SBTTL MAPD - COROUTINE TO MAP THE PORT( .SBTTL SAVREG - COROUTINE TO SAVE R0-R3;+&; **-MAPD-SAVE AND LATER RESTORE APR 6; R0 IS DESTROYED;-MAPD:O& POP ; REMEMBER WHERE TO RETURN PUSH <@KISR6> ; SAVE APR 64 MOV S.PBIA(R4),@KISR6 ; MAP APR 6 TO PORT DRIVER0 PUSH <@#KINAR6> ; SAVE INSTRUCTION SPACE APR 6< MOV S.PBIA(R4),@#KINAR6 ; FOR I/D SYSTEMS MAP BOTH I AND D/ CALL (R0) ; CALL CALLER BACK AS A CO-ROUTINEK;A; COROUTINE RETURN POINT;S2 POP <@#KINAR6> ; RESTORE INSTRUCTION SPACE APR 6. POP <@KISR6> ; RESTORE PREVIOUS APR6 MAPPING RETURNM;+(; **-SAVREG-SAVE AND LATER RESTORE R0-R3;-SAVREG:D0 PUSH ; STORE R0 TEMPORARILY ON THE STACK) MOV 2(SP),R0 ; GET RETURN ADDRESS IN R0S4 POP <(SP)> ; MOVE ORIGINAL R0 OVER 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;N; COROUTINE RETURN POINT;I+ POP ; RESTORE THE REGISTERSI RETURNA .PAGE& .SBTTL CMDONL - ISSUE ONLINE COMMANDS;+; **-CMDONL- DEVICE ONLINE;EO; CONTROL IS PASSED TO THIS POINT WHEN AN ONLINE REQUEST IS ISSUED BY THE USER,L; AS IN AN IO.STC COMMANDR;; ; INPUTS: ;R; R0 = FUNCTION TABLE ENTRYO; R1 =; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;S ; OUTPUTS:; IF C1.ONL IS CLEARED THENP; ; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;R;-1ONLS00€t__DATADATADATADATAIO: MOV (R2),R3 ; MAKE SURE WE HAVE THE CST$ CALL PIOPAL ; GO GET A PSEUDO IOPCMDONL:*- MOV #ONLFUN,R0 ; GET TABLE ENTRY FOR OP.ONL 3 BIS #UU.SER,U.UTIL(R5) ; SERIAL MODE FOR THIS ONE & CALL CMDCOM ; SET UP COMMAND PACKET .IF DF T$$APE;=/; TAPE SET UP DENSITY AND (USER SETTABLE BITS?)S; 5 BIT #UU.BLK,U.UTIL(R5) ; ONLY 1 DENSITY SUPPORTED?S2 BNE 40$ ; YES. USE 0 (CONTROLLER PICKS DENSITY)) BIT #M.1600,I.PRM(R3) ; YES. 1600 BPI= BEQ 30$ ; NO5$ BIS #TF.PE,P.FORM(R1) ; 1600 BPI% BR 40$ ; IGNORE NEXT DENSITY CHECKC30$:) BIT #M.6250,I.PRM(R3) ; YES. 6250 BPIV BEQ 40$ ; NOT& BIS #TF.GCR,P.FORM(R1) ; 6250 BPI ?40$: .ENDC ;T$$APE- PUSH <#CLACMD> ; TRY TO ISSUE MORE COMMANDS 3 CALL CMDSEN ; SEND THE COMMAND TO THE CONTROLLERN;E); PROCESS END PACKET FOR OP.ONL - INPUTS:(; ; R1 = END PACKET ADDRESSD; R2 = QST ADDRESS; R3 = P/IOP ARDDESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS; 5; FOR DISK SAVE SOME INFORMATION IN THE UCB EXTENSION); + BIC #UU.SER,U.UTIL(R5) ; LEAVE SERIAL MODEH .IF DF D$$DSK;0#; SAVE INFORMATION IN UCB EXTENSION4; 1 PUSH ; SAVE END PACKET, QST, AND IOP:6 MOV #,R0 ; SET NUMBER OF BYTES TO MOVE- MOV R1,R2 ; COPY MSCP PACKET POINTER TO R2O1 ADD #P.UNSZ,R2 ; UPDATE OFFSET INTO MSCP PACKET.+ MOV @KISR6,R1 ; GET PACKET'S BASE ADDRESSD" SUB #20000,R2 ; BIAS IT PROPERLY/ MOV U.UC2X(R5),R3 ; GET DESTINATION APR6 BIAS 5 MOV #X.UNSZ+140000,R4 ; GET DESTINATION DISPLACEMENT) CALL @BLXIO ; MOVE THE DATA- MOV 4(SP),R2 ; RETRIEVE MSCP PACKET POINTERA( MOV U.SCB(R5),R4 ; RESTORE SCB ADDRESS2 MOV P.UNSZ(R2),U.CW3(R5) ; SET UP THE MAX LBN ...> MOVB P.UNSZ+2(R2),U.CW2(R5) ; AND THE HIGH ORDER PART ;DC412;+ ;DC412M; Handle 32-bit LBN access in this section. If the device is larger ;DC412,N; than 24-bits, we will use the full word for U.CW2, otherwise we will ;DC412M; only allow a maximum of 24 bits of storage, to insure we match what ;DC412N); the executive will support ;DC412A;- ;DC412A BIC #DV.32B,U.CW1(R5) ; INSURE WE DON'T LOOK LIKE 32 BITS ;DC412D/ TSTB P.UNSZ+3(R2) ; IS THIS TOO BIG? ;DC412L, BEQ 55$ ; IF EQ, NOPE, USE ACTUAL ;DC4124 TSTB @FMSK6 ; EXECUTIVE SUPPORT INCLUDED? ;DC412* BMI 50$ ; IF MI, YES, CONTINUE ;DC412< MOV #377,U.CW2(R5) ; SET SIZE TO MAXIMUM AVAILABLE ;DC412+ MOV #-1,U.CW3(R5) ; BOTH HALVES ;DC412& BR 55$ ; DONE WITH LOADING ;DC412B50$: MOV P.UNSZ+2(R2),U.CW2(R5) ; ... FOR PROPER OPERATION ;DC4124 BIS #DV.32B,U.CW1(R5) ; SHOW 32 BIT DEVICE ;DC412#55$: ; REFERENCE LABEL ;DC412I9 POP ; RESTORE IOP, QST, AND END PACKET ;**-1L .ENDC ;D$$DSK: BIT #UU.SPC,U.UTIL(R5) ; IS THIS A SPECIAL ONLINE ;DC5210 BNE 57$ ; IF SO, ALWAYS GUS FOR SCERR ;DC521 ;DC521 MOV P.STS(R1),R0;) BIC #^C,R0 ; ISOLATE MAJOR CODEV) BNE 70$ ; IF NOT SUCCESS, ST.SUC, SKIPB; :; UNIT IS NOW ONLINE, FIND OUT ABOUT IT BY DOING AN OP.GUS; ,57$: MOV (R2),R0 ; R0 IS THE CST ;DC521/ BIS #C1.GUS,(R0) ; ENTER C1.GUS STATE ;**-1  ; STATE= SERIAL, GUS, RDY% BIS #UU.SER!UU.GUS!UU.RDY,U.UTIL(R5)E/ BICB #US.SPU,U.STS(R5) ; CLEAR SPINNING UP BITU .IF DF T$$APE;P?; IF TAPE AND IF (IO.STC!IO.SMO) THEN LEAVE THE POWERFAIL STATED;1 CMP I.FCN(R3),#IO.STC BEQ 60$ CMP I.FCN(R3),#IO.SMO BNE 70$60$: BICB #US.PWF,U.STS(R5)I .ENDC ;T$$APE70$: PUSH ; SAVE R1* MOV P.STS(R1),R1 ; R1 IS COMPLETION CODE& CMP #ST.VOL,R1 ; IS IT A MEDIA ERROR BNE 80$ ; NO. CONTINUES' MOV #IE.DNR&377,R0 ; DEVICE NOT READY  BR 110$ ; JOIN COMMON CODES380$: CMP #ST.OFL,R1 ; MSCP OFFLINE (NO SUCH UNIT)?. BNE 90$ ; NO. CONTINUE - MOV #IE.IDU&377,R0 ; ILLEGAL DEVICE OR UNIT( BR 100$ ; JOIN COMMON CODEO90$:% MOV #IS.SUC&377,R0 ; ASSUME SUCCESSB3 BIC #^C,R1 ; ISOLATE MAJOR CODE IS ST.SUCU BEQ 110$ ; IF SUCCESS OK$ .IF DF D$$DSK, CMP #ST.MFE,R1 ; IS IT MEDIA FORMAT ERROR? BNE 95$ ; NO. CONTINUEV4 MOV #IE.BCC&300ʀ~ibjbkb a a a77,R0 ; SET UP FOR MEDIA FORMAT ERROR BR 110$ ; JOIN COMMON CODEC .ENDC ;D$$DSK595$: MOV #IE.OFL&377,R0 ; ELSE SET TO DEVICE OFFLINECN100$: .IIF NDF R$$MPL&T$$APE BISB #US.OFL,U.ST2(R5) ; RSX-11M DISK DRIVER ONLY110$:D POP ; RESTORE R12 PUSH <#0> ; ZERO BYTE COUNT FOR ONLINE COMMANDS CALLR ENDCOM;C .PAGE& .SBTTL PIOPAL - ALLOCATE A PSEUDO IOP;+,; **-PIOPAL-ROUTINE TO ALLOCATE A PSEUDO IOP;#;; THIS ROUTINE WILL ALLOCATE A PSEUDO IOP FROM PRIMARY POOLI;V ; INPUTS:B;3; R2 = QST ADDRESS; R3 = CST ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;D ; OUTPUTS:;E; R0-R1 ARE DESTROYED ; R2-R4-R5 ARE PRESERVED,; R3 = PIOP ADDRESS IF SUCESSFULLY ALLOCATED#; C=0 PIOP IS SUCESSFULLY ALLOCATEDP; C=1 PIOP CANNOT BE ALLOCATED;-PIOPAL:Y3 MOV #I.LGTH,R1 ; SIZE OF PIOP (BYTES) TO ALLOCATEA PUSH ; SAVE R2( CALL @ALOCB ; ALLOCATE PIOP FROM POOL POP ; RESTORE R2+ BCS 30$ ; CANNOT ALLOCATE PIOP - GET OUTO MOV R0,R3 ; PUT IOP ADD IN R3" PUSH <#I.LGTH/2> ; PACKET LENGTH)20$: CLR (R0)+ ; CLEAR A WORD AT A TIMEA$ DEC (SP) ; ONE LESS WORD TO CLEAR BGT 20$ ; GO DO ENTIRE PACKET! TST (SP)+ ; CLEAN UP THE STACKF= MOVB #IP.FAK,I.FLAG(R3) ; SET TO 1 TO INDICATE PIOP ;DC412P/ MOV R5,I.UCB(R3) ; SET UP UCB ADDRESS ;**-1R CLC ; CLEAR CARRYS BR 40$ ; AND EXIT730$: MOV #177773,R3 ; PUT A BAD ADDRESS IN R3 SINCE NOL ; POOL AVAILABLE  SEC ; SET CARRYO 40$: RETURNO .PAGE( .SBTTL PIOPDE - DEALLOCATE A PSEUDO IOP;+.; **-PIOPDE-ROUTINE TO DEALLOCATE A PSEUDO IOP;R3; THIS ROUTINE WILL DEALLOCATE A PSEUDO IOP. IF THEE9; PIOP IS FROM POOL, THEN DEALLOCATE IT FROM SYSTEM POOL,U;; ELSE IT IS FROM THE CST SO JUST MARK THE FIRST WORD AS -1E; TO INDICATE THAT IT IS FREE.;; ; INPUTS: ;R; R1 = PIOP ADDRESS ; R3 = CST ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;T;B ; OUTPUTS:;3; R0-R1 DESTROYEDP; R2-R5 ARE PRESERVED ;E;-PIOPDE:: PUSH ; SAVE R2,R30 MOV R1,R0 ; ADD OF PIOP IN POOL TO DEALLOCATE0 MOV #I.LGTH,R1 ; NUMBER OF BYTES TO DEALLOCATE CALL @DEACB ; DEALLOCATE PIOP POP ; RESTORE R3,R2 RETURNA .PAGE .IF DF,D$$DSKL .SBTTL RECSIO - CONTINUE RECOVERY FROM A CONDITION THAT REQUIRED A RE-SYNCH;+G; **-RECSIO-CONTINUE RECOVERY FROM A CONDITION THAT REQUIRED A RE-SYNCH;4A; AFTER ALL UNITS ARE BROUGT BACK ONLINE FROM THE TIMEOUT ROUTINE C; THEN ALL OUTSTANDING I/O IS RE-ISSUED AND C1.REC STATE IS CLEARED ;A ; INPUTS:M;R; R2 = QST ADDRESS; R3 = CST ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;E ; OUTPUTS:; ; R2,R3,R4 PRESERVED; R5 IS A UCB ADDRESSR;-RECSIO:D; PROPER OPERATION OF THIS CODE DEPENDS ON THE FACT THAT THIS DRIVERB; ALWAYS TRYS TO START MORE COMMANDS AFTER IT COMPLETES PROCESSING; ANY RECEIVED END PACKETS. ;U?; RECOVERY INVOLVES THREE STAGES AND IS CONTROLLED BY THE STATEO>; BITS C1.R1, C1.R2 AND C1.REC. THE THREE BITS ARE RELATED TO<; THREE PARTS OF RECOVERY; ISSUING ONLINES, RETRYING ONLINES&; AND RE-ISSUING OUTSTANDING COMMANDS.;E;; C1.R1 IS SET TO INDICATE THAT IT IS TIME TO TRY AND BRINGV9; "SPINNING UP" UNITS (US.SPU SET) BACK ONLINE. C1.R1 ISI9; CLEARED AFTER UNITS ARE MARKED AS NEEDING TO BE BROUGHTA:; ONLINE. IF, AFTER ALL ONLINES COMPLETE, THERE ARE STILL4; UNITS THAT DIDN'T COME READY THE DRIVER WILL SET A8; TIMEOUT. WHEN THE TIMEOUT COMES DUE C1.R1 WILL BE SET;; AND CONTROL WILL TRANSER HERE WHERE WE WILL TRY TO ONLINE :; THE UNITS AGAIN. THIS BEHAVIOR IS REPEATED UNTIL EITHER.; ALL UNITS ARE READY OR RETRYS ARE EXHAUSTED.;T9; IF POSSIBLE IT WOULD BE BETTER TO HAVE LIMITLESS RETRYS 7; FOR THE SYSTEM DISK. THIS IS NOT CURRENTLY THE CASE. ;E=; C1.R2 REMAINS SET AS LONG AS THERE ARE STILL UNITS SPINNINGT; UP.O;N=; 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 ALLA; RE-ISSUED COMMANDS MUST COMPLETE BEFORE NEW I/O MAY BE STARTED.I;R00Ҁt__DATADATADATADATA:; IF C1.R1 IS SET THEN MARK UNITS THAT NEED TO COME ONLINE'; AND GOTO ONLSIO TO START THE COMMANDSE;R 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 WILLI ; ONLY BE DONE ONCE. ; 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)S, ; ONLINE IN PROGRESS (FROM ATTEN. MSG)? BNE 10$ ; IF SO, GO AGAIN+ INC U.CNT(R5) ; COUNT THIS ONLINE ATTEMPTB- CMP U.CNT(R5),#120. ; RETRY COUNT EXCEEDED?O! BLE 20$ ; IF LE, NO. TRY AGAIN > BICB #US.SPU,U.STS(R5) ; RETRYS EXHAUSTED, CLEAR SPINNING UP# CLR U.CNT(R5) ; AND RETRY COUNT.R5 BIS #UU.ABO,U.UTIL(R5) ; ABORT ALL I/O FOR THIS UNITR BR 10$ ; TRY NEXT UNIT I20$: BIS #UU.SER!UU.GUS!UU.ATN,U.UTIL(R5) ; GET UNIT STATUS, AND THEN ONL; BR 10$ ; GO THROUGH LOOPS230$: BIS #C1.GUS,(R3) ; SET GET UNIT STATUS STATE JMP GUSSIOE;$@; AT THIS POINT C1.R1 IS CLEAR BUT C1.R2 MAY BE SET. C1.R2 WILLC; BE CLEARED WHEN ALL UNITS HAVE BECOME READY AND HAVE BEEN BROUGHT A; BACK ONLINE OR WHEN RETRYS HAVE BEEN EXHAUSTED. THIS CONDITIONS-; IS TRUE WHEN US.SPU IS CLEAR FOR ALL UNITS.R;B;; THIS SECTION OF CODE WILL SET A TIMEOUT IF ANY UNITS HAVE <; FAILED TO SPIN UP. AT THE END OF THE TIMEOUT CONTROL WILL=; TRANSFER TO RECSIO WITH C1.R1 SET SO THAT MORE ONLINES WILL ; BE TRYED.G;(440$: BIT #C1.R2,(R3) ; IN SECOND STAGE OF RECOVERY?' BEQ 90$ ; IF EQ, NO. TRY THIRD STAGEY. BIC #C1.R2,(R3) ; ASSUME ALL UNITS ARE READY; MOV #SCUCB,-(SP) ; PUSH "SCAN UCB'S" ROUTINE ON THE STACKW(50$: CALL @(SP)+ ; CALL THE CO-ROUTINE BCS 60$ ; IF CS, ALL DONE3 BITB #US.SPU,U.STS(R5) ; IS THIS UNIT SPINNING UPW BEQ 50$ ; IF NOT, GO AGAINH+ BIS #C1.R2,(R3) ; SET C1.R2, NOT DONE YET  BR 50$ ; TRY NEXT UNITN60$: BIT #C1.R2,(R3) ; DONE?O& 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 TIMEOUTH ; FOR ONLINE RETRYS RETURN 70$:* TST S.BSYU(R4) ; IS A UNIT BUSY ALREADY?* BNE 80$ ; IF NE, YES WE MUST BE WAITING& ; FOR A TIMEOUT SO DON'T RESET IT+ MOV R5,S.BSYU(R4) ; ELSE, SET A UNIT BUSYB BISB #US.BSY,U.STS(R5), MOVB #2,S.CTM(R4) ; SET A 2 SECOND TIMEOUT 80$: RETURN ;SF; AT THIS POINT C1.R1 AND C1.R2 MUST BE CLEAR AND IT IS THEREFORE TIME; TO RE-ISSUE I/O.;R90$:+ BIC #C1.REC,(R3) ; ASSUME WE ARE FINISHEDA5 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 YET9 CMP R1,C.REDO(R3) ; IS THIS THE OLDEST AT TIME OF FAIL?V! BEQ 110$ ; IF YES. GO START ITB5 TST C.OLHD(R3) ; WE KNOW THE OLDEST HAS STARTED BUTE" ; ARE WE STILL WORKING ON IT?+ BEQ 100$ ; IF EQ, NO. SO GO CLEAR C.REDO 8 CMP C.OLHD(R3),C.REDO(R3) ; ARE WE STILL WORKING ON IT?+ BEQ 150$ ; YES. SO WAIT FOR IT TO FINISHS;100$: CLR C.REDO(R3) ; OTHERWISE WE MUST HAVE FINISHED THE$ ; OLDEST COMMAND SO ITS TIME TO ; FORGET IT. ;A$; START PROCESS OF RE-ISSUING AN I/O; R1 IS THE IOPP; R3 IS THE CST ; R4 IS THE SCBT; /110$: MOV I.UCB(R1),R5 ; R5 IS THE UCB ADDRESS MOV R3,R01 ADD #C.REQU,R0 ; R0 IS THE POINTER TO THE QUEUEA' CALL @QRMVA ; REMOVE THE FIRST ENTRY = BIT #UU.ABO,U.UTIL(R5) ; DID THIS UNIT FAIL TO BECOME READY?E, BEQ 120$ ; IF EQ, NO. GO RE-ISSUE THE I/O& ; OTHERWISE COMPLETE IT AS IE.DNR MOV R1,R3 ; R3 IS THE IOP6 MOV #IE.DNR&377,R0 ; R0 IS IE.DNR (DEVICE NOT READY)# CLR R1 ; R1 IS A ZERO BYTE COUNTS! CALL ENDCM1 ; COMPLETE THE I/O ' BR 90$ ; GO TRY TO START ANOTHER I/O)120$: MOV S.QST(R4),R2 ; RESTORE THE QST ' JMP CMDRED ; RESTART ENTRY IN CMDSIOR;S,; WE ARE NOT DONE UNTIL I/O'S HAVE COMPLETED;V130$:I- TST C.O00ڀ~ibjbkb a a aLHD(R3) ; STILL WORKING ON COMMANDS?U BNE 150$ ; YES. JUST EXIT ; ELSE WE ARE DONE * 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 SCBC140$: 8 CLR C.REDO(R3) ; FORGET ABOUT OLDEST COMMAND IF IT WAS ; THE ONLY COMMANDT' CALLR CLACMD ; START ANY PENDING I/OR*150$: BIS #C1.REC,(R3) ; STILL RECOVERING RETURNC .PAGE1 .SBTTL RQRCT - REQUEST REPLACEMENT CONTROL TASKO;+6; **- RQRCT - REQUEST REPLACEMENT CONTROL TASK ROUTINE; <; THE REQUEST THE REPLACEMENT CONTROL TASK ROUTINE IS CALLED?; TO INITIALIZE THE SPECIFIED UNIT OR TO REPLACE A BAD BLOCK ON,; THE SPECIFIED UNIT. ; ; INPUTS:Y;4=; R1 = ADDRESS OF CURRENT RESPONSE RING PACKET IF REPLACEMENT ; OR ELSE ZERO IF INITIALIZATION; R2 = QST ADDRESS; R3 = IOP ADDRESS; R4 = SCB ADDRESS; R5 = UCB ADDRESS;, ; OUTPUTS:;E6; THE REPLACEMENT CONTROL TASK IS REQUESTED TO REPLACE&; THE BAD BLOCK ON THE SPECIFIED UNIT.;E;-RQRCT: ; REF LABEL! PUSH ; SAVE R0-R3C1 MOV U.UC2X(R5),@KISR6 ; MAP SECOND UCB EXTENSIONZ- MOV X.UNFL+140000,R1 ; RETRIEVE UNIT FLAGSO+ MOV X.RCTS+140000,R0 ; RETRIEVE RCT SIZE4- MOV S.PBIA(R4),@KISR6 ; RESTORE PORT MAPPINGT% TST R0 ; DOES IT EVEN HAVE AN RCT?T BEQ 20$ ; NO. JUST EXIT> BIT #UF.RPL,R1 ; CONTROLLER INITIATED BAD BLOCK REPLACEMENT? BNE 20$ ; IF NE YES-5$: TST @RCTPT ; IS RCT INSTALLED? ;DC412A BNE 40$ ; IF NE YES ;**-1I= MOV #T.NRCT,R0 ; SET MESSAGE "REPLACEMENT CONTROLL TASK ...3 ; ... NOT INSTALLED"2 10$: CALL @DVMSG ; GO PRINT IT*20$: MOV 4(SP),R1 ; RETREIVE R1 ;DC412- .IF DF,D$$PRT ; PARTITIONED DRIVES ;DC412R2 BNE 25$ ; NOPE, UPDATE THE ERROR STATUS ;DC4128 BIT #UU.PTV,U.UTIL(R5) ; PARTITION TABLE VALID? ;DC412* BNE 30$ ; IF NE, YES, CONTINUE ;DC412' TST @RCTPT ; RCT INSTALLED? ;DC4122% BEQ 30$ ; IF EQ, NOPE ... ;DC412 4 CMP @RCTPT,I.TCB(R3) ; IS THIS FROM RCT... ;DC412% BEQ 30$ ; IF EQ, CONTINUE ;DC412E$ BR 50$ ; CONTINUE ON ... ;DC412 .IFF ;DF,D$$PRT ;DC412D7 BEQ 30$ ; IF EQ, YES, DON'T CHANGE ERROR CODE ;DC412  .ENDC ;DF,D$$PRT ;DC412E25$: MOV #IE.BBE&377,6(SP) ; SET BAD BLOCK ERROR IN STORED R0 ;DC4124930$: SEC ; SET CARRY TO INDICATE NO NEED TO REQUE;**-32 BR 90$ ; EXIT40$: ; REF LABEL. CMP @RCTPT,I.TCB(R3) ; IS THE I/O FROM RCT? BNE 50$ ; NO. REQUEST RCT" CLR R0 ; GET A WORKING REGISTER MOV 4(SP),R1 ; GET END PACKET3 BISB P.FLGS(R1),R0 ; GET FLAGS+ SWAB R0 ; PUT THE FLAGS IN THE HIGH BYTED= BIS R0,6(SP) ; SET THE FLAG BITS IN THE I/O STATUS ON STACKR BR 30$ ; EXIT/50$: MOV #12.,R1 ; SET LENGTH OF BLOCK NEEDED7! CALL @ALOCB ; GET A CORE BLOCKO BCC 60$ ; IF CC GOT ONE MOV #T.NUER,R0 ; SET MESSAGE BR 10$ ; GO ON /60$: MOV R0,R3 ; SET ADDRESS OF MESSAGE BLOCK., TST (R0)+ ; POINT TO SECOND WORD IN BLOCK6 MOV 4(SP),R1 ; DO WE HAVE AN INITIALIZATION REQUEST? BEQ 70$ ; IF EQ YES> MOV P.CRF+2(R1),(R0)+ ; NO. INSERT IOP ADDRESS (REPLACEMENT ; REQUIRED INDICATOR)# MOV R5,(R0)+ ; INSERT UCB ADDRESS 8 MOV P.FBBK+2(R1),(R0)+ ; INSERT HI LBN TO BE REPLACED6 MOV P.FBBK(R1),(R0)+ ; INSERT LO LBN TO BE REPLACED- MOV P.STS(R1),(R0) ; GIVE EVENT CODE TO RCT# BR 80$ ; AND CONTINUE270$: CLR (R0)+ ; INSERT INITIALIZATION INDICATOR# MOV R5,(R0)+ ; INSERT UCB ADDRESST" CLR (R0)+ ; CLR LO LBN POSITION" CLR (R0)+ ; CLR HI LBN POSITION3 CLR (R0) ; NO EVENT CODE TO RCT (INITIALIZATION)0. .IF DF,D$$PRT ; PARTITIONED DRIVES? ;DC4122 BIT #UU.SPC,U.UTIL(R5) ; SPECIAL ONLINE? ;DC4122 BNE 80$ ; YES, SAVE HAS IT UNDER CONTROL ;DC412D BIS #UU.RCT,U.UTIL(R5) ; LOCK UP THE DRIVE OTHERWISE FOR RCT ;DC412 .ENDC ;DF,D$$PRT ; ;DC412N080$: MOV R3,R1 ; COPY ADDRESS OF MESSAGE BLOCK+ MOV @RCTPT,R0 ; PICK UP RCT'S TCB ADDRESSM# CALL @EXRQF ; REQUEST RCT TO RUNC- CLC ; CLR CARRY TO INDICATE RCT REQUESTED;190$: POP ; RESTORE R3,R2,R1 AND R0O RETURNT .ENDC ;D$$DSK .PAGE; .SBTTL SCUCB - GET ADDR OF NEXT UCB ON CONTROLLER ;+L; ** - SCUCB - SCAN UCB'S ASSOCIATED WITH SPECIFIED CONTROLLER (SCB ADDRESS);U;T ; INPUTS: ;O; R5 = UCB ADDRESS;S ; OUTPUTS:;2;.; R1 = DESTROYED; R4 = SCB ADDRESS; R5 = UCB ADDRESS; CARRY CLEAR=UCB FOUNDC; CARRY SET=NO MORE UCBS;-SCUCB:% POP ; RETRIEVE RETURN ADDRESS PUSH ; SAVE R5 AND R3$ MOV U.SCB(R5),R3 ; GET SCB ADDRESS' MOV S.KRB(R3),R3 ; GET ADDRESS OF KRB$, ADD K.OFF(R3),R3 ; OFFSET TO THE UCB TABLE810$: 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?5 BEQ 10$ ; IF EQ NOU2 MOV U.SCB(R5),R4 ; GET SCB ADDRESS FOR THIS UNIT% PUSH ; SAVE UCB TABLE POINTERA% MOV 2(SP),R3 ; RETRIEVE CALLER'S R3 ( CLC ; CLR CARRY TO SHOW WE FOUND ONE# CALL (R1) ; CALL THE CALLER BACKEA POP ; GET RETURN ADDRESS AND POINTER TO NEXT UCB ENTRY  BR 10$ ; TRY THE NEXT UCB20$: ; REF LABEL+ POP ; RESTORE ORIGINAL R3 AND R5T2 MOV U.SCB(R5),R4 ; GET SCB ADDRESS FOR THIS UNIT# SEC ; SET CARRY TO SHOW THE ENDU JMP (R1) ; EXIT .PAGE/ .SBTTL TMOGCS - PROCESS END PACKET FROM OP.GCSE;+<; **-TMOGCS-RESPOND TO RECEIPT OF END PKT FOR OP.GCS COMMAND;R ; INPUTS:V;A; R1 = END PACKET ADDRESSA; R2 = QST ADDRESS; R3 = CST ADDRESS;L ; OUTPUTS:;CJ; IF THE COMMAND IS MAKING PROGRESS OR HAS COMPLETED THEN DO NOTHING/; OTHERWISE INITIATE A RE-SYNCHRONIZATION;-TMOGCS: . BIC #C1.TMO,(R3) ; INDICATE OP.GCS COMPLETED' MOV P.OTRF+2(R1),R0 ; GET IOP ADDRESS - CMP R0,C.OLHD(R3) ; IS IT THE SAME COMMAND?X/ BNE 30$ ; NO. THE COMMAND MUST HAVE FINISHEDR3 MOVB I.FLAG(R0),R0 ; GET SEQUENCE NUMBER ;DC412 8 BIC #^C<17>,R0 ; CLEAR ALL BUT THE LOW FOUR BITS ;**-16 CMP R0,P.OTRF(R1) ; BOTH REFERENCE NUMBERS THE SAME?+ BNE 50$ ; NO. COMMAND MUST HAVE FINISHEDA# TST P.CMST(R1) ; REF NUMBER ZERO?O3 BNE 10$ ; NO. WE HAVE TO SEE IF IT MADE PROGRESST4 TST P.CMST+2(R1) ; HOW ABOUT THE OTHER REF NUMBER?+ BEQ 50$ ; NO. COMMAND MUST HAVE FINISHED :10$: CMP P.CMST+2(R1),C.CMST+2(R3) ; DID IT MAKE PROGRESS? BHI 20$ ; NO. TIME OUT ERRORA BLO 30$ ; YES@ CMP P.CMST(R1),C.CMST(R3) ; HIGH WORD WAS EQUAL, CHECK LOW WORD/ BLO 30$ ; IF LOWER THEN IT DID MAKE PROGRESS,.20$: CALLV PORT,PKTDR ; DEALLOCATE END PACKET% JMP TMOERR ; JMP TO TIME OUT ERRORS830$: MOV P.CMST(R1),C.CMST(R3) ; COMMAND STATUS - PART 17 MOV P.CMST+2(R1),C.CMST+2(R3); COMMAND STATUS - PART 2 50$: ; REFERENCE LABEL/ MOVB S.ITM(R4),S.CTM(R4) ; RESET TIMEOUT COUNTE* CALLV PORT,PKTDR ; DEALLOCATE THE PACKET RETURNP .END BHI 20$ ; NO. TIME OUT ERRORA BLO 30$ ; YES@ CMP P.CMST(R1),C.CMST(R3) ; HIGH WORD WAS EQUAL, CHECK LOW WORD/ BLO 30$ ; IF LOWER THEN IT DID MAKE PROGRESS,.20$: CALLV PORT,PKTDR ; DEALLOCATE END PACKET% JMP TMOERR ; JMP TO TIME OUT ERRORS830 .TITLE SYSCM* .IDENT /19.10/*;*1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.$; 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.;H; D. N. CUTLER 11-AUG-73;I+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:Y;F; P. J. BEZEREDI; J. R. KAUFFMAN; J. M. LAWLER ; T. LEKASF; T. M. MARTIN; +; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY: ;H;D; J. R. KAUFFMAN; L. B. MCCULLEY ; K. L. NOEL; B. S. MCCARTHY;.+; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:,;c ; K. L. NOEL; J. W. BERZLE;.+; MODIFIED FOR RSX-11M-PLUS VERSION 4.2 BY:C;E ; L. KOGAN ; K. L. NOEL; +; MODIFIED FOR RSX-11M-PLUS VERSION 4.4 BY:E;.; B. S. MCCARTHY ; D. Carroll;$; MODIFIED FOR RSX-11M-PLUS V4.5 BY:;Y ; D. Carroll;E$; MODIFIED FOR RSX-11M-PLUS V4.6 BY:;; D. Carroll 19-Oct-1995 19.00,; DC406 - Include $UTUIC for use by install;; D. Carroll 08-Jan-1996 19.10*; DC430 - Inc00~ibjbkb a a alude support for 32-bit LBNs; (Happy birthday, Ann!); ; D. Carroll 06-Feb-1998 19.207; DC492 - Include support for four digit date display,O; or ISO 8601 format dates..; ;L; SYSTEM COMMON DATA AREAM;U; MACRO LIBRARY CALLS;. .MCALL HDRDF$,HWDDF$,TCBDF$/ .MCALL EPKDF$ ;ERRLOG PACKET/MASK DEFINITIONSr% HDRDF$ ;DEFINE TASK HEADER OFFSETS4$ HWDDF$ ;DEFINE HARDWARE REGISTERS, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS$ EPKDF$ ;DEFINE FEATURE MASK FLAGS .IF DF A$$CNT .MCALL ACNDF$/ ACNDF$ ;DEFINE OFFSETS FOR ACCOUNTING BLOCKSr .ENDC;.; MAKE CLOCK PARAMETERS GLOBAL;f S$$RTZ==H$$RTZ ;LINE FREQUENCY%S$$IEN==K$$IEN ;ENABLE BITS PATTERNC/S$$LDC==K$$LDC ;LOAD VALUE FOR COUNT REGISTER-S$$TPS==K$$TPS ;TICKS PER SECOND ON P CLOCK ;O; LOCAL SYMBOL DEFINITIONS;R; FUNCTION MASK LITERAL ;SBFMASK= FE.EXV!FE.DRV!FE.CAL!FE.EXP!FE.FDT ;INITIALIZE FEATURE MASKFMASK= FMASK!FE.DYME .IF DF M$$EXT&M$$MGEK2FMASK= FMASK!FE.EXT ;INCLUDE EXTENDED MEMORY MASK .ENDC .IF DF M$$MUP8FMASK= FMASK!FE.MUP ;INCLUDE MULTI-USER PROTECTION MASK .ENDC .IF DF P$$LAS"FMASK= FMASK!FE.PLA ;PLAS SUPPORT .ENDC .IF DF Q$$OPT.FMASK= FMASK!FE.PKT ;QIO PACKET PREALLOCATION .ENDC .IF DF P$$OFF6FMASK= FMASK!FE.OFF ;PARENT OFFSPRING TASKING SUPPORT .ENDC0F2MASK=0 ;INITIALIZE SECOND MASK WORD CONTENTS .IF DF K$$DAS0F2MASK=F2MASK!F2.DAS ;KERNEL DATA SPACE SUPPORT .ENDC .IF DF S$$LIB6F2MASK=F2MASK!F2.LIB ;SUPERVISOR MODE LIBRARY SUPPORT .ENDC .IF DF M$$PRO,F2MASK=F2MASK!F2.MP ;MULTIPROCESSOR SUPPORT .ENDC .IF DF E$$VNT3F2MASK=F2MASK!F2.EVT ;EVENT TRACE FACILITY SUPPORTA .ENDC .IF DF A$$CNT-F2MASK=F2MASK!F2.ACN ;CPU ACCOUNTING SUPPORTA .ENDC .IF DF S$$HDW/F2MASK=F2MASK!F2.SDW ;SHADOW RECORDING SUPPORTE .ENDC .IF DF P$$OOL-F2MASK=F2MASK!F2.POL ;SECONDARY POOL SUPPORT  .ENDC .IF DF D$$PAR<F2MASK=F2MASK!F2.DPR ;SYSTEM SUPPORTS A DIRECTIVE PARTITION .ENDC .IF DF P$$WND=F2MASK=F2MASK!F2.WND ;SYSTEM SUPPORTS SECONDARY POOL WINDOWS. .ENDC%; DEFINE CONSTANT FEATURE MASK 2 BITSE8 F2MASK=F2MASK!F2.IRR!F2.GGF!F2.RAS!F2.RBN!F2.SWP!F2.STP; FEATURE MASK 3 BITSC%; DEFINE CONSTANT FEATURE MASK 3 BITSF# F3MASK=F3.AST!F3.EIS!F3.RLK!F3.STMO F3MASK=F3MASK!F3.SHFC .IF DF A$$CLI F3MASK=F3MASK!F3.CLIS .ENDC .IF DF X$$HDR. F3MASK=F3MASK!F3.XHR ;EXTERNAL HEADER SUPPORT .ENDC .IF DF U$$DAS. F3MASK=F3MASK!F3.UDS ;USER DATA SPACE SUPPORT .ENDC .IF DF P$$OOL1 F3MASK=F3MASK!F3.PRO ;SEC POOL PROTO TCB SUPPORTN .ENDC .IF DF T$$COM5 F3MASK=F3MASK!F3.TCM ;TTDRV HAS SEPARATE BUFFER POOL .ENDC .IF DF P$$CTL. F3MASK=F3MASK!F3.PMN ;POOL MONITORING SUPPORT .ENDC .IF DF A$$SEC0 F3MASK=F3MASK!F3.SEC ; EXTENDED SECURITY OPTION .ENDC; FEATURE MASK 4 BITS ; DEFINE MASK (NO CONSTANT BITS) F4MASK=0A .IF DF R$$PRO) F4MASK=F4MASK!F4.XT ;THIS IS A CT SYSTEMK .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. F4MASK=F4MASK!F4.DVN ;DECIMAL VERSION NUMBERS .ENDC ; DF F$$DVN .IF DF C$$CDA .IF EQ, C$$CDAS2 F4MASK=F4MASK!F4.LCD ;LOADABLE CRASH DUMP SUPPORT .ENDC ; EQ C$$CDA .ENDC .IF DF F$$NIM0 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 SUPPORTC .ENDC .IF DF N$$DIR. F4MASK=F4MASK!F4.NAM ;NAMED DIRECTORY SUPPORT .ENDC ;DF N$$DIR .IF DF P$$LAS&X$$HDR&F$$MAP' F4MASK=F4MASK!F4.FMP ;FAST MAP SUPPORTF .ENDC ; DF P$$LAS&X$$HDR&F$$MAP .IF DF D$$DCL) F4MASK=F4MASK!F4.DCL ;DCL IS DEFAULT CLI$ .ENDC ;DF D$$DCLF .IF DF D$$DDS2 F4MASK=F4MASK!F4.DDS 00t__DATADATADATADATA;DDS IS DEFAULT (NAMED MODE) .ENDC ;DF D$$DDSF .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 SUPPORT4 .ENDC ;DF T$$TSAR$; DEFINE MASK (NO CONSTANT FEATURES)* F5MASK=F5.VTL ;INIT TO VTLOGONS DISABLED; Remote services feature maskG; If HF.RMT is set as SAV brings the system up, the mask in $FMSKR will $; replace the bits defined by $FMSKMH; This scheme allows the system to be SAVed on a processor that does notM; require host services and then run on a processor like the KXJ11 which doesU FMASKR=0 .IF DF P$$3XX7 F5MASK=F5MASK!F5.PRO ;SYSTEM SUPPORTS PROFESSIONAL 3XXC ;SERIES PERSONAL COMPUTERS .ENDC ; DF P$$3XX .IF DF C$$DFB8 F5MASK=F5MASK!F5.DFB ; SYSTEM SUPPORTS DEFERRED BINDING .ENDC ; DF C$$DFB .IF DF C$$ODB5 F5MASK=F5MASK!F5.ODB ; CAN OVERRIDE DEFERRED BINDING  .ENDC ; DF C$$ODB .IF DF C$$RTB8 F5MASK=F5MASK!F5.RTB ; SYSTEM SUPPORTS RUN TIME BINDING .ENDC ; DF C$$RTB .IF DF C$$RTK< FMASKR=FMASKR!F5.RTK ; SYSTEM SUPPORTS REMOTE TASK INSTALLS .ENDC ; DF C$$RTK .IF DF C$$NSY< FMASKR=FMASKR!F5.NSY ; SYSTEM SUPPORTS NO LOCAL SYSTEM DISK .ENDC ; DF C$$NSY .IF DF C$$NCO2 FMASKR=FMASKR!F5.NCO ; SYSTEM SUPPORTS NO CONSOLE .ENDC ; DF C$$NCO .IF DF C$$XDJ/ FMASKR=FMASKR!F5.XDJ ; SYSTEM SUPPORTS KXJ XDTE .ENDC ; DF C$$XDJ .IF DF C$$RDRA FMASKR=FMASKR!F5.RDR ; SYSTEM SUPPORTS REMOTE DIRECTORY DEFAULTSE .ENDC ; DF C$$RDR .IF DF C$$RLG7 FMASKR=FMASKR!F5.RLG ; SYSTEM SUPPORTS REMOTE LOGICALST .ENDC ; DF C$$RLG .IF DF C$$LDR> FMASKR=FMASKR!F5.LDR ; SYSTEM SUPPORTS REMOTE LOADER/OVERLAYS .ENDC ; DF C$$LDR, .IF NDF C$$RMT ; IF NO REMOTE HOST SUPPORT. F5MASK=F5MASK!FMASKR ; SET $FMASK5 TO BE BOTH .ENDC ; C$$RMT.; DEFINE FEATURE MASK 6 (NO CONSTANT FEATURES) F6MASK=0 ;NO CONSTANT FEATURES .IF DF S$$HLS: F6MASK = F6MASK!F6.SLS ; IS SHADOW LOAD SHARING SUPPORTED .ENDC ;DF S$$HLSR .IF DF U$$BME? F6MASK = F6MASK!F6.UBM ; SYSTEM SUPPORTS UNIBUS MEMORY OPTIONSN .ENDC ;DF U$$BMEF .IF DF I$$CBP .IF NDF M$$PRO D F6MASK = F6MASK!F6.ICP ; SYSTEM SUPPORTS USING ICB POOL FOR PRIMARY .ENDC ;NDF M$$PRO .ENDC ;DF I$$CBPF .IF DF E$$BUSE F6MASK = F6MASK!F6.SWB ; SYSTEM SUPPORTS SWITCHED BUSSES (DT07/MIRA)N .ENDC ;DF E$$BUS .IF DF A$$CKPF F6MASK = F6MASK!F6.ACK ; SYSTEM SUPPORTS ALTERNATE CHECKPOINT ROUTINE .ENDC ;DF A$$CKPD .IF DF E$$LBN ;DC430 ;DC430H F6MASK = F6MASK!F6.32B ; SYSTEM SUPPORTS DEVICES WITH 32BIT LBNS ;DC430 ;DC430 .ENDC ;DF E$$LBN ;DC430 ;DC430 .IF DF Y$$ISO ;DC492  ;DC492H F6MASK = F6MASK!F6.ISO!F6.Y2K ; SYSTEM DISPLAYS ISO FORMAT DATES ;DC492 ;DC492 .ENDC ;DF Y$$ISO ;DC492 ;DC492 .IF DF Y$$2KD ;DC492 ;DC492E F6MASK = F6MASK!F6.Y2K ; SYSTEM SUPPORT 4 DIGIT YEAR DISPLAY ;DC492F ;DC492 .ENDC ;DF Y$$2KD ;DC492 ;**-1 ;6; NULL TASK CONTROL BLOCKT;EE; THIS TCB TERMINATES THE SYSTEM AND ACTIVE TASK LISTS. IT MUST HAVE C; A PRIORITY OF ZERO AND ALWAYS BE BLOCKED. REQUIRED POSITIONS ARED!; ENFORCED BY THE "ASSUME" MACRO.K;S+$CMBEG:: ;BEGINNING OF SYSCM AREA FOR CDA ;DF; $ACCLK MUST REFERENCE THE SAME TWO WORDS AS $ABTIM FOR ACCOUNTING TOF; WORK, UNLESS ACCOUTING HAS ITS OWN CLOCK. IN THIS CASE, $ACCLK WILLD; BE THE ADDRESS OF WHERE ACCOUNTING CAN ACCESS IT. ACCOUNTING WILL;; USE A TWO WORD $ABTIM IF A PRIVATE CLOCK IS NOT AVAILABLE;-$ACCLK:: ;ABSOLUTE TIME CLOCK FOR ACCOUTINGK,$ABTM2::.WORD 0 ;ADDITIONAL WORD FOR $ABTIM'$ABTIM::.WORD 0 ;ABSOLUTE TIME COUNTER 1$ACTHD::.WORD . ;T.LNK-ACTIVE TASK LIST LISTHEADB* ASSUME .-$ACTHD,T.PRI ;T.PRI MUST BE ZERO+ .BYTE 0 ;T.PRI-NULL TASK PRIORITY IS ZEROA .IF DF M$$PRO=$NCPU:: .BYTE M$$PRO ;T.IOC - NUMBER OF PROCESSORS IN SYSTEM, .IFFI3$NCPU:: .BYTE 0 ;T.IOC - NOT MU00~ibjbkb a a aLTIPROCESSOR SYSTEM  .ENDC0$COMEF::.WORD 0 ;T.DPCB-COMMON EVENT FLAGS 1-16) .WORD 0 ;T.NAM-COMMON EVENT FLAGS 17-32M/$HRCPT::.WORD 0 ;T.NAM+2-POINTER TO HRC... TCBN?$DEVHD::.WORD $DEVTB ;T.RCVL-PTR TO FIRST DEVICE CONTROL BLOCKT.$TKNPT::.WORD 0 ;T.RCVL+2-POINTER TO TKTN TCB0$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-177546T+$CKLDC::.WORD 0 ;T.EFLG+2-CLOCK LOAD COUNTN .IFFC0$CKLDC::.WORD K$$LDC ;T.EFLG+2-CLOCK LOAD COUNT .ENDC4$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 TCB/ ASSUME .-$ACTHD,T.STAT ;T.STAT MUST BE NONZEROT7$EXSIZ::.WORD $SYTOP ;T.STAT-ADDR OF LAST BYTE IN EXECC7$PWRFL::.WORD 0 ;T.ST2-POWERFAIL RECOVERY REQUEST FLAGC2$SIGFL::.WORD 0 ;T.ST3-TASK WAITING FOR SIG EVENT+ .WORD 0 ;T.DPRI MUST BE 0, T.LBN - UNUSED:6$FXRPT::.WORD 0 ;T.LBN+1-POINTER TO PARITY ERROR TASK8$LSTLK::.WORD 0 ;T.LDV-LOCK WORD (TCB ADDRESS OF OWNER)1 .WORD 3 ;T.PCB-CONSTANT FOR ALLOCATION ROUTINESC .IF NDF K$$DAST4$ICAVL:: ;ICB POOL SAME AS CORE POOL IF NO D SPACE .ENDC7$CRAVL::.WORD $SYBEG ;T.MXSZ-ACTIVE TASK LIST LISTHEADS, ASSUME .-$ACTHD,T.ACTL ;T.ACTL MUST BE ZERO .IF NDF M$$PROO*$K6TAB:: ;REFERENCE LABEL FOR MAPPING IN ;NON-MULTIPROCESSOR SYSTEM .ENDC1 .WORD 0 ;T.ACTL-NEXT ACTIVE TASK-DUMMY BLK SIZE ;.7; END OF SUPERIMPOSED AREA-REMAINING SYSTEM COMMON AREAD;O$ACPTK:: .IF DF R$$AMD) .WORD 0 ;TCB POINTER FOR DEFAULT F11ACPU .ENDC ; DF R$$AMD3$VERTK::.WORD 0 ;TCB POINTER FOR VERIFICATION TASKD4$LOGHD::.WORD 0 ;LOGICAL DEVICE ASSIGNMENT LISTHEAD6$CFLPT::.WORD 0 ;POINTER TO FIRST CHECKPOINT FILE PCB$MOULS::.WORD 0 ;MOUNT LIST $LBUIC::.BYTE 54,3 ;LIBRARY UIC $NTUIC::.BYTE 54,1 ;NETWORK UIC*$UTUIC::.BYTE 0,0 ;Utility UIC ;DC406 ;**-1A7$SPMAX::.WORD 0 ;POINTER TO AUXILARY MONITOR POOL NODEI1$SPMVC::.BLKW 1 ;POINTER TO SPM NODE IN ICB POOL )$HKSTS::.BLKW 1 ;SPM MONITOR STATUS WORDTG; SPM ENTRY VECTORS - EXTERNAL TASKS (LOADER,F11ACP) CALL THROUGH THESEA5; HOOKS. THEY POINT TO THE RETURN IN $GTPKT IFN;; SPM IS TURNED OFF, AND SPM INTERCEPTS THEM WHEN ITE; IS ENABLED.;O .IF DF K$$DAS4$SPV01::.WORD 0 ;SPM VECTOR FOR ACP HOOKPOINT ENTRY6$SPV02::.WORD 0 ;SPM VECTOR FOR LOADR HOOKPOINT ENTRY6$SPV03::.WORD 0 ;SPM VECTOR FOR LOADR HOOKPOINT ENTRY .IFF ; DF K$$DASB9$SPV01::.WORD $SPVEX ;SPM VECTOR FOR ACP HOOKPOINT ENTRYP;$SPV02::.WORD $SPVEX ;SPM VECTOR FOR LOADR HOOKPOINT ENTRYS;$SPV03::.WORD $SPVEX ;SPM VECTOR FOR LOADR HOOKPOINT ENTRYI .ENDC ; DF K$$DAS;N?; $BTTIM HOLDS THE ABSOLUTE TIME OF WHEN THE SYSTEM WAS BOOTED. C; THE TWO WORDS MUST BE CONSECUTIVE, THE LABEL IS ON THE SECOND ONET; FOR COMPATABILITY WITH $ABTIM2;W+$BTTM2::.WORD 0 ;HIGH ORDER WORD OF $BTTIM1$BTTIM::.WORD 0 ;VALUE OF $ABTIM WHEN SYS BOOTEDT .IF DF D$$MND2$DICSR::.WORD D$$MND ;ADDRESS OF DIAMOND REGISTER7$DITCB::.WORD 0 ;ADDRESS OF TCB FOR TASK BEING WATCHED  .ENDC .IF DF M$$PRO3$CKURM::.WORD 1 ;URM OF PROCESSOR THAT KEEPS CLOCKN .ENDC* .BLKW 1 ;CLOCK INTERRUPT FORK BLOCK LINK( .BLKW 1 ;CLOCK INTERRUPT FORK BLOCK PC.$INTCT::.WORD -1 ;CLOCK INTERRUPT TICKS COUNT%$FRKHD::.WORD 0 ;FORK QUEUE LISTHEADB0 .WORD $FRKHD ;(LAST POINTS TO FIRST INITIALLY))$FMASK::.WORD FMASK ;SYSTEM FEATURE MASKN9$FMSK2:: .WORD F2MASK ;SECOND WORD OF SYSTEM FEATURE MASKA8$FMSK3:: .WORD F3MASK ;THIRD WORD OF SYSTEM FEATURE MASK9$FMSK4:: .WORD F4MASK ;FOURTH WORD OF SYSTEM FEATURE MASK8$FMSK5:: .WORD F5MASK ;FIFTH WORD OF SYSTEM FEATURE MASK8$FMSK6:: .WORD F6MASK ;SIXTH WORD OF SYSTEM FEATURE MASK1$FMEND:: ;REF. LABLE DELIMITING FEATURE MSK WDS  .IF DF C$$RMT$XXWIN::A$FMSKR::.WORD FMASKR ; THIS WORD BECOMES $FMSK5 IF HF.RMT IS SET 2 .WORD 0 ; W.IOC MUST BE ZERO, EVERYTHING E00t__DATADATADATADATALSE IS ; IRRELIVANT .IFF ; C$$RMT$XXWIN::$FMSKR:: .ENDC ; C$$RMTA($PRMOD::.WORD 0 ;PROCESSOR MODEL NUMBER$CLKHD::.WORD 0 ;CLOCK QUEUEF2$COPT:: .WORD .CO0 ;POINTER TO COMMAND OUTPUT UCB+$PARHD::.WORD 0 ;POINTER TO PARTITION LISTA'$LDRPT::.WORD 0 ;POINTER TO LOADER TCBS7$TSKHD::.WORD $ACTHD ;POINTER TO SYSTEM TASK DIRECTORYT1$CBDHD::.WORD 0 ;COMMON BLOCK DIRECTORY LISTHEADW .IF DF G$$GEF*$GGEF:: .WORD 0 ;GROUP GLOBAL EVENT FLAGS3$GFTCB::.WORD $GEFPT+2 ;GRP GLOBAL USER TCB POINTERR9$GEFPT::.WORD $GEFPT+2 ;GROUP GLOBAL MASK ADDRESS POINTER;, .WORD 0 ;DUMMY WORD FOR NON-GRP GLOBAL USE .ENDC ; DF G$$GEF,$LDPCB::.WORD 0 ;CURRENT LOADER PCB POINTER.$VECTR::.WORD V$$CTR-4 ;HIGHEST VECTOR ADDRESS<$MXEXT::.WORD 177777 ;INITIALLY NO LIMIT FOR TASK EXTENSION7$AVRHD::.WORD 0 ;AUTOMATIC VOLUME RECOGNITION LISTHEAD-$PRIFR::.WORD 0 ;CURRENT AMOUNT OF FREE POOLA3$ULDPT::.WORD 0 ;MICROCODE LOADER TASK TCB ADDRESSL2$GNLST::.WORD 0 ;GENERAL USE POOL PACKET LISTHEAD($PTCBL::.WORD 0 ;PROTOTYPE TCB LISTHEAD.$PTCPT::.WORD 0 ;KISAR5 BIAS OF PROTOTYPE TCB,$PASTH::.WORD 0,.-2 ;PARTITION AST LISTHEAD;G6; P/OS $NXTSK LOCK AND BASE FROM WHICH TO START SEARCH;: .IF DF A$$CKP=$NXTLK::.WORD 100000 ;$NXTSK RECURSION LOCK (DEFAULT TO RSX)I .IFF ;DF,A$$CKP'$NXTLK::.WORD 0 ;$NXTSK RECURSION LOCKC .ENDC ;DF,A$$CKP)$NXTBA::.WORD 0 ;$NXTSK BASE SEARCH BIASO;U'; LOGICAL NAME TRANSLATION SUPPORT DATA ;R .IF DF L$$GCL;$LOGTB::.WORD 0 ;APR BIAS PTR TO SYSTEM LOGICAL HASH TABLET3 .WORD 0 ;APR BIAS PTR TO GROUP LOGICAL HASH TABLEO9$USRLG::.WORD 0 ;APR BIAS PTR TO USER LOGICAL HASH TABLEG2 .WORD 0 ;APR BIAS PTR TO TASK LOGICAL HASH TABLE3 .WORD 0 ;RESERVED WORD FOR P/OS LT.USR (ALWAYS 0)S .IFF ; DF L$$GCLA$LOGTB::$USRLG:: .ENDC ; DF L$$GCL; '; NAMED DIRECTORY CONTEXT BLOCK POINTERK;$CTXPT:: .IF DF N$$DIR .WORD 0 .ENDC ;DF N$$DIRE;A>; THE FOLLOWING WORDS ARE USED FOR THE POOL MONITOR INTERFACE.C; THE ORDERING OF THESE WORDS CANNOT BE CHANGED BECAUSE PMT AND VMRG; ARE WRITTEN TO DEPEND ON IT.;W .IF DF P$$CTL3$PTTCB::.WORD 0 ;TCB ADDRESS OF POOL RECOVERY TASK )$PRISZ::.WORD 0 ;TOTAL SIZE OF FREE POOLR4$POLST::.WORD 0 ;EXEC/POOL TASK COMMUNICATIONS WORD:$PRIHL::.WORD P$$HIL ;HIGH WATER MARK FOR POOL MONITORING9$PRILL::.WORD P$$LOL ;LOW WATER MARK FOR POOL MONITORINGD7$PFRSZ::.WORD P$$FRS ;MINIMUM SIZE OF LARGEST FRAGMENT 9$POLBP::.WORD P$$BPR ;MINIMUM PRIORITY OF NONPRIVILEGED % ;TASKS TO EXECUTE DURING LOW POOLH4$POLFL::.WORD 0 ;EXECUTIVE POOL USAGE CONTROL FLAGS .IFF&$PTTCB:: ;ALWAYS DEFINE THESE LABELS$PRISZ::$POLST::$PRIHL::$PRILL::$PFRSZ::$POLBP::$POLFL:: .ENDC;W#; SHADOW RECORDING IMPURE DATA AREA ;D#$SHUMB::.WORD 0 ;ROOT FOR UMB LISTK4$SHERR::.WORD 0 ;POINTS TO TCB OF SHADOW ERROR TASK&$SHLIM::.WORD 10. ;ERROR PACKET LIMIT,$SHPCT::.WORD 0 ;CURRENT SHADOW ERROR COUNT8$SHLOS::.WORD 0 ;NUMBER OF PACKETS LOST FROM SATURATION/$RCTPT::.WORD 0 ;POINTER TO CURRENT RCT... TCBW; %; UNIVERSAL RECEIVER TASK TCB ADDRESS;F*$URTCB::.WORD 0 ;POINTER TO TCB OF URT...1$EXCRC::.WORD 0 ;EXECUTIVE RO CODE CRC16 ;**-2P;:=; WINDOW I/O COUNT FLAG. THE FOLLOWING WORD IS USED BY DREIF, <; IOFIN, AND DEACC IN THE ACP TO DETERMINE WHETHER TO MANAGE;; THE WINDOW I/O COUNT. IF SET TO DV.F11 THE BEHAVIOR IS TOO=; MANAGE THE I/O COUNT (NEW). IF SET TO ZERO THE I/O COUNT ISS7; LEFT ALONE AND THE WINDOW MAY BE DEALLOCATED WITH I/O(; PENDING. THIS MAY CAUSE CRASHES LATER.;C8$WCFLG::.WORD DV.F11 ; WINDOW I/O COUNT MANAGEMENT FLAG* .IF DF D$$CHE ;DISK DATA CACHING SUPPORT;W; DATA CACHING IMPURE DATA AREA ;-9$DCPCB::.WORD 0 ;PCB ADDRESS OF SYSTEM DEFAULT CACHE PAR ;E1; THESE CELLS ARE FILLED IN BY $MPVBN (MDSUB) FORE8; VIRTUAL TO LOGICAL I/O TRANSLATIONS. THIS INFORMATION5; IS USED BY THE CACHER WHEN PROCESSING THE RESULTINGT ; I/O PACKET.O;U'$DCCEL::.WORD 0 ;CURRENT EXTENT LENGTHD+$DCCEB::.WORD 0,0 ;CU00 ~ibjbkb a a aRRENT EXTENT BASE LBNS$$DCNEL::.WORD 0 ;NEXT EXTENT LENGTH($DCNEB::.WORD 0,0 ;NEXT EXTENT BASE LBN6$DCSTS::.WORD 0 ;STATUS INFORMATION FROM WINDOW BLOCK .ENDC ;D$$CHE; C; POINTER TO FIRST IP11 UCB, USED BY IP11 POWERFAIL CODE (IN POWER);,$IPUCB::.WORD 0 ; POINTER TO FIRST IP11 UCB;I8; PARAMETER AREA FOR STATUS CHANGE ROUTINES IN OLRSR.MAC;E.$SCDEV::.BLKW 1 ;UCB OR KRB FOR STATUS CHANGE.$SCRET:: ;REFERENCE LABEL (ALIAS FOR $SCCTB),$SCCTB::.BLKW 1 ;CTB IF $SCDEV CONTAINS KRB-$SCOFL::.BLKB 1 ;ONLINE OR OFFLINE PARAMETERG*$SCERR::.BLKB 1 ;ERROR RETURN FROM DRIVER .IF DF M$$PRO/$SCURM::.BLKW 1 ; URM OF DESIRED STATUS CHANGEC .ENDC ;DF M$$PRO;O"; EVENT TRACE READ/WRITE DATA AREA;O .IF DF E$$VNT;; CURRENT BUFFER INFORMATION;T)$EVKS6::.WORD 0 ;KISAR6 OFFSET TO BUFFERR0$EVDIS::.WORD 0 ;BUFFER POSITION FOR NEXT EVENT2$EVLEN::.WORD 0 ;PTR TO WORD BEYOND END OF BUFFER'$EVSEQ::.WORD 0 ;EVENT SEQUENCE NUMBERC:$EVLOS::.WORD 0 ;NUMBER OF EVENTS LOST THROUGH SATURATION2$EVTCB::.WORD 0 ;TCB ADDRESS OF EVENT LOGGER TASK;U; EVENT SWITCH TABLE;$; INDEXED BY EVENT NUMBERM"; IF BYTE NEGATIVE, EVENT DISABLED,; IF BYTE POSITIVE, VALUE IS LENGTH OF EVENT;A?; EVERY EVENT MUST CONTAIN AN ENTRY IN THIS TABLE, OF THE FORM:;E(; .BYTE -EV.XXX ;THIS IS A SAMPLE EVENT;D); WHERE XXX IS THE NUMBER OF THE EVENT.T;E$EVTAB:: ;REFERENCE LABELO .REPT E$$VNTE, .BYTE -1 ;SET ALL EVENTS TO NULL INITIALLY .ENDR! .BYTE 0 ;THERE IS NO EVENT ZEROA .EVEN;:; EVENT BUFFER MANAGEMENTE;L4$EVBSQ::.WORD 1 ;BUFFER SEQUENCE NUMBER (NEVER = 0)$EVLST:: ;REFERENCE LABELA .REPT E$$BUF+1# .WORD 0 ;KISAR6 POINTER TO BUFFERE .ENDR .IFFV$EVKS6:: ;REFERENCE LABELI$EVDIS::$EVLEN::$EVSEQ::$EVTAB::$EVBSQ::$EVLST:: .ENDC; WATCHPOINT DEBUG INFO  .IF DF R$$WPT2$WPLST::.WORD 0 ;LAST SYSTEM STATE ROUTINE CALLED/$WPVAL::.WORD 0 ;VALUE TO WATCH FOR OR AGAINSTN,$WPADR::.WORD $WPVAL ;PLACE TO WATCH FOR IT .ENDC ; DF R$$WPT;N;; ADDITIONAL ARGUMENT TO $POWER FOR MULTIPROCESSOR SYSTEMS.E;  .IF DF M$$PRO!E$$BUSA"$PFURM::.WORD 0 ;URM TO POWERFAIL .ENDC=$SWR:: .WORD 0 ;SOFTWARE SWITCH REGISTER IF NONE IN HARDWAREI; EXECUTIVE COMMON APR TABLE;B; * * * N O T E * * *;CE; THIS TABLE IS ORDER DEPENDENT, SINCE THERE IS A TABLE IN VMR OF THE;E; STANDARD COMMON NAMES THAT OCCUR IN THE DIRECTIVE PARTITION. A SIDEOE; EFFECT OF THIS IS THAT THE ENTRIES BELOW MAY NOT BE CONDITIONALIZED ;W .IF DF D$$PAR6$DRAPR::.WORD 0 ;APR VALUE TO MAP DIRECTIVE PARTITION1$DRAP2::.WORD 0 ;BIAS OF SECOND DIRECTIVE COMMON 0$DRAP3::.WORD 0 ;BIAS OF THIRD DIRECTIVE COMMON1$DRAP4::.WORD 0 ;BIAS OF FOURTH DIRECTIVE COMMONX2$DRAPV::.WORD 0 ;BIAS OF EXEC VECTORING DIRECTIVE3$DRCHE::.WORD 0 ;BIAS OF DATA CACHE MANAGER COMMONE- .WORD -1 ;FLAG FOR END OF COMMON BIAS TABLEA .IFFO%$DRAPR:: ;ALWAYS DEFINE THIS SYMBOL .ENDC?; $ENVEC - TABLE OF ENTRY POINTS FOR VECTORING CODE WHICH CAN'T; USE $DRGIN;D:; THIS TABLE CONTAINS A *SMALL* NUMBER OF ADDRESSES AND IS?; INTENDED TO PROVIDE THE MINIMUM AMOUNT OF INFO TO ACCESS THENI$; SYSTEM WITHOUT BEING LINKED TO IT.;R7$ENVEC::.WORD $DRAPV ;POINTER TO APR BIAS OF VECTORINGI ;COMMONC .IF DF C$$CDA/$CRKRB::.WORD 0 ;CRASH DUMP DEVICE KRB ADDRESSE7$CRSFM::.WORD 0 ;CRASH FORMATTER NUMBER (RH TAPE ONLY)OC$CRSUN::.WORD C$$RUN ;CRASH PHSICAL UNIT NUMBER. NOTE: C$$RUN ISB. ;...A LOGICAL UNIT NUMBER. INITL CONVERTS) ;...$CRSUN TO A PHYSICAL UNIT NUMBER.A6$CRCSR::.WORD 0 ;CRASH DEVICE CSR ADDRESS WHEN NO KRB5$CRLCK::LCKDF$ SPIN ;ONLY ONE CPU SHOULD DUMP MEMORYY;$CRIOP::.WORD 0 ; ADDRESS OF COMMON PCB FOR I/O PAGE IMAGE  .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 INTERVAL8$RNDL:: .BYTE R$$NDL ;LOWEST PRIORITY CLASS TO CONSIDER-$RNDH:: .BYTE 00t__DATADATADATADATAR$$NDH ;HIGHEST PRIORITY CLASSM .ENDC .IF DF S$$WPC&D$$ISKT<$SWPCT::.WORD S$$WPC ;CLOCK TICKS TO NEXT SWAPPING INTERVAL8$SWPC:: .WORD S$$WPC ;CLOCK TICKS PER SWAPPING INTERVAL($SWPR:: .WORD S$$WPR ;SWAPPING PRIORITY .ENDC;F:; DAYS PER MONTH TABLE (ENTRY CONTAINS DAYS PER MONTH + 1);'$DYPMN::.BYTE 29.,32. ;FEBRUARY, MARCHT .BYTE 31.,32. ;APRIL, MAYW .BYTE 31.,32. ;JUNE, JULYS" .BYTE 32.,31. ;AUGUST, SEPTEMBER" .BYTE 32.,31. ;OCTOBER, NOVEMBER" .BYTE 32.,32. ;DECEMBER, JANUARY;R; BIT MASK TABLE;F; NOTE: DUE TO THE ORGANIZATION OF THE SUPERVISOR MODE MAPPING CONTROL@; SUPPORT, NAMELY THE FACT THAT BIT 0 OF THE BYTE CORRESPONDS TO:; APR 1, NOT APR 0, THERE MUST BE A ZERO PRECEDING $BTMSK.;! .WORD 0 ;DUMMY FOR APR0 BITMASK $BTMSK::.WORD 1 ;BIT 0. .WORD 2 ;BIT 1.B .WORD 4 ;BIT 2.A .WORD 10 ;BIT 3. .WORD 20 ;BIT 4. .WORD 40 ;BIT 5. .WORD 100 ;BIT 6.. .WORD 200 ;BIT 7.B .WORD 400 ;BIT 8.O .WORD 1000 ;BIT 9. .WORD 2000 ;BIT 10.J .WORD 4000 ;BIT 11.K .WORD 10000 ;BIT 12. .WORD 20000 ;BIT 13. .WORD 40000 ;BIT 14. .WORD 100000 ;BIT 15.N7; BIT MASK TABLE FOR FORMING ADDRESS MASKS IN $ACHRO IN ; USER I/D SYSTEMS .IF DF U$$DAS!S$$LIB$ .BYTE 0$$BCMSK::.BYTE 1,3,7,17,37,77,177,377 .ENDC ; DF U$$DAS!S$$LIBD4; TABLE OF APR ADDRESSES USED BY GIN SF.APR FUNCTION .EVEN5$APRTB::.WORD KINAR0,KINDR0 ;KERNEL I SPACE REGISTERSD .IF DF K$$DAS. .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 REGISTERSD- .WORD SDSAR0,SDSDR0 ;SUPER D SPACE REGISTERS, .ENDC ; DF S$$LIB .WORD 0 ;END OF TABLE;L@; SHUFFLER TASK REQUEST LIMIT FLAGS. $SHFTM CONTAINS THE NUMBER>; OF CLOCK TICKS THAT MUST EXPIRE BEFORE THE SHUFFLER TASK CAN@; BE REQUESTED BY THE EXECUTIVE. IT IS INITIALIZED TO THE VALUE6; CONTAINED IN $SHFCT EACH TIME THE SHUFFLER EXECUTES.;.>$SHFTM:: .WORD 0 ;TIME REMAINING BEFORE NEXT POSSIBLE REQUEST?$SHFCT:: .WORD S$$HFC ;MINIMUM TICKS BETWEEN SHUFFLER REQUESTS ;E ; ONLINE ERROR LOGGING DATA BASE;  .IF DF E$$LOG;N ; ERROR LOG FEATURE MASK SUPPORT;A EFEAT = 0L$ .IIF DF,E$$ICM EFEAT = EFEAT!EL.ICM$ .IIF DF,E$$MOU EFEAT = EFEAT!EL.MOU$ .IIF DF,E$$SEF EFEAT = EFEAT!EL.SEF1$EFMSK::.WORD EFEAT ;SELECTED FEATURE MASK WORDS -$ERHEA::.WORD 0, .-2 ;MESSAGE QUEUE LISTHEADH'$ENTSQ::.WORD 0 ;ENTRY SEQUENCE NUMBER($ERFLA::.WORD 0 ;ERROR LOGGER FLAG WORD7$ERRX:: .WORD 0 ;POINTER TO SECONDARY POOL ERRLOG DATA  .IFFW$ERFLA:: ;REFERENCE LABEL .ENDC ; DF E$$LOG-$ERRPT::.WORD 0 ;POINTER TO ERROR LOGGER TCBO'$ERRSQ::.WORD 0 ;ERROR SEQUENCE NUMBER.$NCTPT:: .IF DF T$$TSAI .WORD 0 ;APR BIAS OF NT.NCTA( .WORD 0 ;APR5 ADDRESS OF QUEUE ROUTINE .WORD 0 ;NCT... TCB ADDRESSE .ENDC ; T$$TSA  .IF DF R$$PRO;,A; $NVRTM CONTAINS THE NUMBER OF TICKS THAT MUST ELAPSE BEFORE THEMD; O/S UPTIME CELL IN THE PROFESSIONAL 3XX NVR IS UPDATED. IN GENERALD; IT IS SET TO THE NUMBER OF TICKS PER SECOND TIMES 60. THIS RESULTSD; IN UPTIME IN MINUTES BEING RECORDED. IT IS INITIALIZED WITH $NVRCT ; EACH TIME THAT NVR IS UPDATED.;E,$NVRTM::.WORD 0 ;TICKS TILL NEXT NVR UPDATE1$NVRCT::.WORD N$$VRC ;TICKS PER NVR UPDATE CYCLER;Q#; TASK NAME OF THE P/OS DISPATCHER.D(; USED TO SEND MESSAGES AND AST'S TO IT.;4$CTBNM::.RAD50 /C$CTEX/ ;NAME OF THE P/OS DISPATCHER .ENDC ; DF R$$PRO$$DVSAV::.BLKW 1 ;SAVED CSR CONTENTS;D0; SYSTEM BOOTSTRAP AND SAVE CONFIGURATION VECTOR;P .IF NDF K$$DASH$SYALT:: ;REFERENCE LABELT .ENDC3$SYSIZ::.WORD S$$YSZ ;SIZE OF MEMORY IN 32W BLOCKSN- .BLKB 1 ;LOGICAL UNIT NUMBER OF LOAD DEVICEI< .BLKB 1 ; HIGH ORDER LBN OF SYS IMAGE IF NOT E$$LBN ;DC4302 .BLKB 2 ;LBN OF LOAD/SAVE IMAGE ON DISK ;DC4300 .BLKW 1 ;NAME OF LOAD DEVICE IN ASCII ;DC43000~ibjbkb a a a4 .BLKW 1 ;SIZE OF LOAD IMAGE IN 256W BLOCKS ;DC4300 .IF DF,E$$LBN ; 32-BIT DEVICE SUPPORT ;DC430< .BLKW 1 ; HIGH ORDER LBN OF LOAD DEVICE BITS[16:31] ;DC430 .ENDC ;DF,E$$LBN ;DC430; ;**-4; TIME LIMIT PARAMETERSC; .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 HOUR .WORD 60. ;SECONDS PER MINUTE ;DE; ACCOUNTING USES $ACTPS TO GET THE NUMBER OF CLOCK TICKS PER SECOND.1D; ON SYSTEMS WHERE ACCOUNTING IS USING THE SYSTEM CLOCK, $ACTPS MUSTE; REFERENCE THE SAME WORD AS $TKPS. IF ACCOUNTING HAS ITS OWN CLOCK,S.; IT WILL CONTAIN THE TICK RATE OF THAT CLOCK.; %$ACTPS:: ;CLOCK RATE FOR ACCOUNTING .IF EQ K$$CSR-177546 '$TKPS:: .WORD H$$RTZ ;TICKS PER SECONDO .IFFD'$TKPS:: .WORD K$$TPS ;TICKS PER SECONDU .ENDC;D; CURRENT TIME VECTOR;.* .WORD 82. ;YEAR OF UNIVERSE - HAPPY 30TH' .WORD 3. ;MONTH OF YEAR - BIRTHDAY * .WORD 30. ;DAY OF MONTH - MS. LAWLER .WORD 0 ;HOUR OF DAY .WORD 0 ;MINUTE OF HOURE .WORD 0 ;SECOND OF MINUTE $TTNS:: .WORD 0 ;TICK OF SECOND .IF DF P$$3XX7$CKCSA::.WORD $CKCSA ;THIS WORD IS SET EITHER TO POINTF# ;TO ITSELF (PDP-11 HARDWARE) OR7& ;TO THE CLOCK CSR (SAME AS $CKCSR)' ;(PRO HARDWARE) TO MAKE TDSCH CLOCKS" ;TICKLING RUN TIME CONDITIONAL .ENDC ; DF P$$3XX;.=; LIFO SEND AND I/O PREALLOCATION LIST POINTER AND PARAMETERST;F .IF DF Q$$OPT1$PKAVL::.WORD 0 ;POINTER TO FIRST PACKET IN LIST05$PKNUM::.BYTE 0 ;NUMBER OF PACKETS CURRENTLY IN LISTS5$PKMAX::.BYTE Q$$OPT ;MAXIMUM NUMBER ALLOWED IN LIST. .IFF3$PKNUM:: ;REF LABEL FOR MCR $PKMAX:: ;REF LABEL FOR MCR  .ENDC;-1; SAVE AREA FOR CALCULATED MULTI-USER TASK NAMES.K;) .IF DF R$$DSP8$TNAME::.BLKW 2 ;(2ND WORD IS ALSO FLAG FOR RQST & RUN) .ENDC;34; TEMPORARY STORAGE VARIABLES FOR DIRECTIVE SERVICES;R$TEMP0::.BLKW 1 ;$TEMP1::.BLKW 1 ;4$TEMP2::.BLKW 1 ;COMPLETION ROUTINE ADDR FOR $GSPKT3$TEMP3::.WORD 0 ;SCRATCH SPACE FOR SPWN$ AND RPOI$S3$TEMP4::.WORD 0 ;SCRATCH SPACE FOR SPWN$ AND RPOI$S7$TONYL::.WORD 0 ;SCRATCH STORAGE FOR SEEK OPTIMIZATION 2$IOTMP::.WORD 0 ;SCRATCH WD FOR ADDR CHECKING AND ;ACP QIO TEMPORARY WORKK5$ATTPT::.WORD 0 ;POINTER TO I.AADA IN CURRENT PACKET2+$CTLST::.WORD $CTB0 ;START OF THE CTB LIST; KERNEL AST DISPATCH TABLEEA; THIS TABLE IS FILLED IN BY INITL AT BOOT TIME. ANY CHANGES MADE;+; HERE MUST BE REFLECTED IN INITL AT DBTBL.O;GF; IF THE SYSTEM DOES NOT SUPPORT KERNEL I/D SPACE, THEN THE REFERENCES; ARE RESOLVED DIRECTLY.; 7$KATBL::.WORD $FINBF ;$FINBF-BUFF I/O FINISH (AK.BUF)T0 .WORD $FINXT ;$FINXT-OFF. TASK EXIT (AK.OCB)0 .WORD $GENBF ;$GENBF-GEN. BUFF. I/O (AK.GBI)0 .WORD $DBTRP ;$DBTRP-FORCE T-BIT TRAP (AK.TBT)0 .WORD $FINDI ;$FINBF-DELAYED I/O FIN (AK.DIO) .IF DF G$$GEF0 .WORD $GGFRN ;$GGFRN-GROUP GBL RUNDWN (AK.GGF) .IFF ; DF G$$GEFA-; .WORD 0 ;IF OTHER KASTS ARE INVENTED, MAKED% ;THIS A PLACEHOLDER IN THE TABLE.P .ENDC ; DF G$$GEF .IF DF M$$PRO!E$$BUSR.$URMST::.WORD 0 ;UNIBUS RUN MASK STATUS TABLE .ENDC ;DF, M$$PRO!E$$BUSF .IF DF M$$PRO; .IF DF X$$DBT*$XDTFL::.WORD 1 ;XDT INITIALIZATION TABLE)$XDTPR::.WORD 0 ;FLAG FOR PROMPTS OF XDTP .IFFB>$XDTFL::.WORD 177777 ;ALWAYS LOOKS INITIALIZED WHEN NOT THERE4$XDTPR:: ;REFERENCE LABEL -- UNUSED IF XDT ALREADY ;INITIALIZED .ENDC OFF=177777 .REPT M$$PROH OFF=OFF+OFFI .ENDR,$CPMSK::.WORD OFF ;PROCESSOR BIT CLEAR MASK*$IIMSK::.WORD 0 ;IIST INTERRUPT MASK WORD;$IIPND::.WORD 0 ;PENDING URM WORK WORD. LOCKED WITH $FORKLC9$IICPU::.WORD 0 ;MASK OF URMS THAT HAVE BEEN INTERRUPTED2$IINXT::.WORD $BTMSK ;ROUND ROBIN WORD FOR $IISVC7$STENB::.WORD 0 ;SANITY TIMER ENABLED ON VARIOUS CPU'SW-$STFLG::.WORD 0 ;SECONDARY SANITY TIMER FLAGT5$STALR::.WORD 0 ;SANITY TIMER ALARM ENABLED ON CPU'SA6$PWRMK::.WORD 0 ;MASK OF CPUS IN THEIR POWERFAIL CODE00"t__DATADATADATADATA8$CPPAR::.WORD 0 ;POINTER TO PARTITION FOR CPU LOCAL MEMC; NOTE THAT THE NEXT TWO TABLES FOLLOW AN INDEX STRUCTURE LIKE THAT:F; OF $PARTB+2 INS LOWCR, AND THE TWO SHOULD BE UPDATED IN HARMONY WITH; HRC (MODULE HRBOX) .IF DF M$$K11.$MKCS1::.WORD 1 ;CONTENTS FOR CSR 1 OF MK11'S% .WORD 8. ;NUMBER OF MK11'S POSSIBLED4$MKCSR::.BLKW 8. ;CSR ADDRESS TABLE FOR MK11 PARITY*$MKCS2::.BLKW 8. ;CSR CONTENTS FOR MK11'S .ENDC ; DF M$$K11;R; MULTIPROCESSOR LOCKS;I/; BYTE 0 -- LOCK VALUE (0 IF LOCKED, 1 IF FREE) ; BYTE 1 -- IF BYTE 0 EQUALS:/; 0, THEN BYTE 1 EQUALS PROCESSOR ID OF OWNER -; 1, THEN BYTE 1 EQUALS COMPLEMENT OF ID OFA; PREVIOUS OWNERD;D; IF LOCK TYPE IS "WAIT" THEN:;O>; BYTE 2,3 = SECONDARY LOCK WORD (ABOVE FORMAT) FOR WAIT MASK.(; BYTE 4,5 = MASK OF WAITING PROCESSORS.;L+; NOTE: BYTES 4+5 ARE REFERENCED AS A WORD.M; 8$EXECL::LCKDF$ WAIT ;SERIALIZE ACCESS TO EXECUTIVE DATA3$FORKL::LCKDF$ SPIN ;SERIALIZE ACCESS TO FORK LISTY0$IIFNL::LCKDF$ SPIN ;SERIALIZE ACCESS TO $MPTAB0$PWRLK::LCKDF$ SPIN ;SERIALIZE ACCESS TO $PWRMK;R; MULTIPROCESSOR TABLE;,"$TKTAB:: ;CURRENT TASK TCB TABLE .REPT M$$PROI+ .WORD $ACTHD ;INITIALIZE TO NULL TASK TCB: .ENDR .IFTF3$RQTAB::.WORD $ACTHD ;RESCHEDULE POINTER TCB TABLEY .IFTM .REPT M$$PRO-1E+ .WORD $ACTHD ;INITIALIZE TO NULL TASK TCBA .ENDR .IFTF7$PRTAB::.WORD 0 ;PROCESSOR CURRENT TASK PRIORITY TABLEF .IFTD .REPT M$$PRO-1 & .WORD 0 ;INITIALIZE TO PRIORITY ZERO .ENDR"$MPTAB:: ;PROCESSOR STATUS TABLE .REPT M$$PROZ! .WORD MP.STP ;INITIALLY STOPPEDO .ENDR"OFF=0 ;START K6 OFFSETS AT ZERO-$K6TAB:: ;PROCESSOR IMPURE AREA APR OFFSETSA .REPT M$$PROS .WORD OFF#OFF=OFF+40 ;INCREASE OFFSET BY 1K  .ENDR#OFF=1 ;START PROCESSOR URMS AT 1E,$URMTB:: ;PROCESSOR URM CONNECTIVITY TABLE .REPT M$$PRO. .WORD OFF$OFF=OFF+OFF ;POOR MAN'S LEFT SHIFT .ENDR#OFF=1 ;START PROCESSOR URMS AT 1$2$CRMTB:: ;COMPLEMENT OF CPU URM CONNECTIVITY TBL .REPT M$$PRO  .WORD ^C$OFF=OFF+OFF ;POOR MAN'S LEFT SHIFT .ENDR .IFTF;$CRFLG::.WORD 0 ;FLAG INDICATING REGISTERS HAVE BEEN SAVED; .IFT  .REPT M$$PRO-1S .WORD 0 .ENDR6$CRFPR::.WORD 377 ;$PROCN OF FIRST PROCESSOR TO CRASH .IFT=' .WORD 1 ;URM IN FORK BLOCK FOR ERRLOG  .IFTF# .BLKW 2 ;ERROR LOGGING FORK BLOCK.$PBEZ:: ;REFERENCE LABELP .IFT URM=2T .REPT M$$PRO-1  .WORD URM ;URM IN FORK BLOCK URM=URM*2;$ .BLKW 2 ;3 WORD (TOTAL) FORK BLOCK .ENDR .ENDC ; DF M$$PRO .IF DF F$$LPP .IF DF M$$PRO .WORD 1 ;URM IN FORK BLOCK .IFTF .BLKW 2 ;2 WORD FORK BLOCK$FLFTB:: ;REFERENCE LABELM .IFTURM=2 .REPT M$$PRO-1: .WORD URM URM=URM*2I .BLKW 2 .ENDR .ENDC .ENDC; ); DEFINITIONS FOR NON MK11 MEMORY SYSTEMS;L .IF NDF M$$K11I$MKCS1::0 .WORD 0 ;# OF MK11 REGISTERS (FOR BOO,SAV,HRC)$MKCSR::$MKCS2:: .ENDC ; DF M$$K11 .IF NDF M$$PRO*;.,; DEFINITIONS FOR NON-MULTIPROCESSOR SYSTEMS;N$CKURM:: ;REFERENCE LABELS$CPBIT::!$CPCRM:: ;COMPLEMENTED RUN MASK $CPMSK::$CPURM::#$CPUSC:: ;CPU STATUS CHANGE ENTRYF'$CRMTB:: ;COMPLEMENTED RUN MASK TABLE=$EXECL::'$IBXMT:: ;IIST INTERCPU BOOT TRANSMITW$IIMSK::'$IISTM:: ;IIST SUBROUTINE ENTRY POINTN$$IIXMT:: ;IIST TRANSMIT SUBROUTINE$MPTAB::$PROCN::$PROC2::$STENB:: ;SANITY TIMER ENABLE $STFLG::$STALR::$TKTAB:: .IF NDF E$$BUS $URMST::$PFURM:: .ENDC ;NDF E$$BUS$SCURM::$URMTB::$XDTFL::$XDTPR::$XDTIN:: .ENDC .IF NDF E$$BUST$BSCTB::$BSTBX:: .ENDC ;NDF E$$BUSF; HERE WE DEFINE A SINGLE "FAKE WORD" WHICH RECEIVES ALL THE ADDRESSESD; FOR THINGS WHICH ARE NOT GENNED INTO THE SYSTEM, BUT WHICH REQUIREB; THAT THE ADDRESSES ALWAYS BE RESOLVED FOR TASKBUILDING MCR, ETC.B; THIS ONE (IN SYSCM) IS TO BE USED FOR D SPACE LOCATIONS, AND THEC; ONE IN LOWCR IS USED FOR I SPACE REFERENCES AND CPU SPECIFIC INFOUA; (ALSO THINGS WHICH MUST BE ACCESSED WHEN D SPACE IS TU00*1ibjbkb a a aRNED OFF)T .IF NDF R$$WPTT$WPVAL::$WPADD::$WPLST:: FAKE = 0 .ENDC ; NDF R$$WPT$& .IF NDF M$$NET ;IF NO DECNET SUPPORT($DECPT:: ;POINTER TO DECNET HOME BLOCK FAKE = 0E .ENDC .IF NDF E$$LOGB$ERHEA::$ENTSQ:: FAKE = 0S .ENDC ; NDF E$$LOGO .IF DF FAKE- .WORD -1 ;FAKE DATA LOCATION FOR ALL OF THE ;ABOVE .ENDC ; DF FAKE .IF DF P$$OOL/$PLPAR::.WORD 0 ;POINTER TO SECONDARY POOL PCBS8$POLHD::.WORD 0 ;LIST HEAD FOR SECONDARY POOL FREE LIST:$SECPB::.WORD 0 ;NUMBER OF TOTAL BLOCKS IN SECONDARY POOL9$SECFR::.WORD 0 ;NUMBER OF FREE BLOCKS IN SECONDARY POOLN .IFFS$PLPAR::$POLHD::$SECPB::$SECFR:: .ENDC .IF DF A$$CNT1$SYLHD::.WORD 0 ;LISTHEAD FOR SYSLOG INPUT QUEUE # .WORD $SYLHD ;END OF LIST POINTERD1$SABPT::.WORD 0 ;POINTER TO SYSTEM ACCOUNT BLOCK  .IF DF X$$ACC0$ACNFE::.WORD BF.TRN!BF.XAC ;EXTENDED ACCOUNTING .IFF ;X$$ACCS2$ACNFE::.WORD BF.TRN ;NORMAL SUPPORTED ACCOUNTING .ENDC ;X$$ACC7$APLIM::.WORD 0 ;FREE SEC POOL SPACE ACNT MUST RESERVEO1$SYUAB::.WORD 0 ;ADDRESS OF UAB FOR SYSTEM TASKSN3$CKUAB::.WORD 0 ;UAB FOR TASK RUN FROM CLOCK QUEUE .IFF$SABPT::$SYLHD::$ACNFE::$APLIM::$SYUAB:: .IFTF/$LOGPT::.WORD 0 ;POINTER TO TCB OF SYSLOG TASKO .ENDC;R; CLI DATABASE AREAE;C($CLICQ::.WORD 0 ;COMMAND QUEUE LISTHEAD .WORD $CLICQB4$CNTLN::.WORD 0 ;CONTINUATION LINE SEGMENT LISTHEAD .WORD $CNTLN -$CPTBL::.WORD $MCRPT ;POINTER TO CPB FOR MCR .IF DF A$$CLI .REPT A$$CLI-1C" .WORD 0 ;TABLE FOR CPB ADDRESSES .ENDR0$NMCLI==A$$CLI ;NUMBER OF CLIS SYSTEM SUPPORTS .IFTF ;A$$CLI;U ; CPB FOR MCR;B:$MCRPT::.WORD 0 ;POINTER TO MCR'S TCB, START OF MCR'S CPB .RAD50 /MCR / ;CLI NAME .WORD CP.LGO ;STATUS WORDC- .BYTE MDPL ;LENGTH OF DEFAULT PROMPT STRINGR/ .BYTE MCPL ;LENGTH OF CONTROL/C PROMPT STRINGT$$$=.R .IF DF R$$MIC* .ASCIZ <15><12>/$ / ;MICRO DEFAULT PROMPT .IFF ; DF R$$MICI* .ASCIZ <15><12>/>/ ;DEFAULT PROMPT STRING .ENDC ; DF R$$MIC MDPL=.-$$$$$$=.E .IF DF R$$MIC( .ASCIZ <15><12>/DCL>/ ;CONTROL/C PROMPT .IFF ; DF R$$MICI/ .ASCIZ <15><12>/MCR>/ ;CONTROL/C PROMPT STRINGE .ENDC ; DF R$$MIC MCPL=.-$$$ .EVEN .IFF ;A$$CLI($NMCLI==0 ;ALTERNATE CLI NOT SUPPORTED .ENDC ;A$$CLI&$CMFIN:: ; END OF SYSCM AREA FOR CDA; A; PARAMETER WORD TO CONTROL TERMINAL DRIVER SYSTEM-WIDE BEHAVIOR:I; F; BIT 0 = 0 FOR REMOTE LINES, DON'T HANGUP IMMEDIATELY ON CARRIER LOSS:; 1 FOR REMOTE LINES, HANGUP IMMEDIATELY ON CARRIER LOSSA; BIT 1 = 0 FOR REMOTE LINES, DON'T ENABLE DTR UNTIL RING IS SEEN 6; 1 FOR REMOTE LINES, ENABLE DTR BEFORE RING IS SEEN;RL; BIT 2 = 0 WHEN TYPEAHEAD BUFFER OPTION FOR SLAVED TERMINALS IS NOT ENABLEDB; 1 WHEN TYPEAHEAD BUFFER OPTION FOR SLAVED TERMINALS IS ENABLED;;M; BIT 3 = 0 WHEN TERMINAL ATTRIBUTES SHOULD BE RESET WHEN CARRIER IS DETECTEDTD; = 1 WHEN TERMINAL ATTRIBUTES SHOULD NOT BE RESET ON CARRIER DETECT;A2$TTPRM::.WORD 2 ;DEFAULT TERMINAL DRIVER BEHAVIOR;M1; TERMINAL DRIVER DATA BUFFER - NOT DUMPED BY CDAN;  .IF DF K$$DAS&T$$COMN&$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 .ENDN FOR SLAVED TERMINALS IS ENABLED;;M; BIT 3 = 0 WHEN TERMINAL ATTRIBUTES SHOULD BE RESET WHEN CARRIER IS DETECTEDTD; = 1 WHEN TERMINAL ATTRIBUTES SHOULD NOT BE RESET ON CARRIER DETECT .TITLE DRREG .IDENT /02.20/ ;1; Copyright (c) 1995-1999 by Mentec Inc., U.S.A.;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; T. J. MILLER 12-MAR-76;); MODIFIED FOR RSX-11M-PLUS VERSION 2 BY:;; J. M. LAWLER; B. S. MCCARTHY; T. M. MARTIN ;+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:;; J. M. LAWLER; B. S. MCCARTHY;+; MODIFIED FOR RSX-11M-PLUS VERSION 4.1 BY:;; B. S. 002t__DATADATADATADATAMCCARTHY;R+; MODIFIED FOR RSX-11M-PLUS VERSION 4.3 BY:(;1!; B. S. MCCARTHY 29-JUN-89 02.11; K. L. NOEL 7-JUL-89 02.12;D+; MODIFIED FOR RSX-11M-PLUS VERSION 4.5 BY:E;N; D. CARROLL 15-MAY-1993 02.20H3; DC209 -- ALLOW FOR REGIONS TO BE CREATED TOPDOWNI'; IF USED IN COMBINATION WITH RS.RES ;M .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:E;O4; ------------------------------------------------- ; ! !-; R.GID ! REGION ID ! ; ! !M4; !-----------------------------------------------! ; ! !2); R.GSIZ ! SIZE OF REGION (32W BLOCKS) !W ; ! !S4; !-----------------------------------------------! ; ! !E ; ! !E ; ! !O%; R.GNAM ! NAME OF REGION (RAD50) !H ; ! ! ; ! !O ; ! !N4; !-----------------------------------------------! ; ! !C ; ! !L ; ! !E1; 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.3; RS.TOP=1 IF REGION SHOULD BE ALLOCATED TOP DOWN ); IN MEMORY (ONLY IF RS.RES ALSO SET) 1; RS.RES=1 IF REGION SHOULD BE CREATED ONLY IF E; MEMORY IS AVAILABLE NOW54; RS.NDL=1 IF REGION SHOULD 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.O2; RS.WRT=1 IF WRITE ACCESS IS DESIRED ON ATTACH.3; RS.EXT=1 IF EXTEND ACCESS IS DESIRED ON ATTACH.M3; RS.DEL=1 IF DELETE ACCESS IS DESIRED ON ATTACH.;; R.GPRO=PROTECTION CODE FOR REGION [DEWR,DEWR,DEWR,DEWR].N;M5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)S;L-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.L&; 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 T00:1ibjbkb a a aO 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'1$: DRSTS D.RS94 ;PARTITION NAME ERRORT?$DRCRR::ADD #R.GPAR,R3 ;PNT TO NAME OF PAR IN WHICH TO ALLOCATEU9 MOV T.PCB(R5),R2 ;ASSUME ALLOCATING IN TASK'S PARTITION D/ MOV P.MAIN(R2),R2 ;POINT TO MAIN PARTITION PCBP% TST (R3) ;PARTITION NAME SPECIFIED?E BEQ 5$ ;IF EQ NO/ CALL $SRMAI ;SEARCH FOR NAMED PARTITION'S PCB ( BCS 1$ ;IF CS, PARTITION NOT IN SYSTEM+ CMP R2,P.MAIN(R2) ;IS IT A MAIN PARTITION?Z BNE 1$ ;IF NE NO C E .IF DF M$$EXT N) CMP P.REL(R2),#177600 ;DEVICE PARTITION?S  .IFFR ' CMP P.REL(R2),#7600 ;DEVICE PARTITION?D R .ENDC N O BHIS 1$ ;YES, IF HIS8 BIT #P2.LMA!P2.SEC!P2.CPU,P.ST2(R2) ;SPECIAL PARTITION?' BNE 1$ ;IF NE YES, DON'T ALLOW CREATEO#5$: MOV R2,R0 ;COPY POINTER TO PCBT, TST -(R3) ;POINT TO REGION NAME (R.GNAM+2), TST -(R3) ;REGION NAME SPECIFIED? (R.GNAM) BEQ 10$ ;IF EQ NOR, CALL $SRNAM ;DETERMINE IF NAME IS UNIQUE & BCC 35$ ;IF CC, NAME IS NOT UNIQUE 10$: ;REF SYMBOLE   .IF DF M$$PRO 6) CLR -(SP) ;CLEAR REQUIRED RUN MASK WORDP R .ENDC 04 CLR -(SP) ;CLR HDR SIZE AND I/O CNT (P.HDLN/P.IOC) H+ 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)8 BIT #RS.RES,R.GSTS-R.GNAM(R3) ;CREATE ONLY IF RESIDENT? BEQ 34$ ;IF EQ NO, PROCEED" MOV SP,R4 ;POINT TO PCB ON STACK+ MOV P.MAIN(R4),R5 ;POINT TO MAIN PARTITION(4 MOV #$FNDSP,-(SP) ;ASSUME WE CAN USE NORMAL ROUTINE9 BIT #RS.TOP,R.GSTS-R.GNAM(R3) ;WANT TOP DOWN ALLOCATION?-# BEQ 33$ ; YES, USE NORMAL ROUTINE; MOV #$ALTOP,(SP) ; ELSE, USE TOP DOWN ALLOCATION ALGORITHM 533$: CALL @(SP)+ ;ATTEMPT TO FIND SPACE IN PARTITIONZ4 BCS 121$ ;IF CS, COULDN'T ALLOCATE - RETURN IE.ALG7 MOV R1,P.SUB(R0) ;UNLINK STACK PCB FROM PARTITION LISTE7 MOV R0,P.SUB(R4) ;AND SAVE POINTER TO WHERE IT BELONGS,) MOV $SAHPT,R4 ;RESTORE POINTER TO HEADER,. MOV $TKTCB,R5 ;RESTORE POINTER TO CURRENT TCB-34$: MOV SP,R2 ;COPY POINTER TO PCB ON STACKP535$: BIT #RS.ATT,R.GSTS-R.GNAM(R3) ;ATTACH DESIRED? $ BEQ 36$ ;IF EQ NOO CALL ATT ;ATTACH REGION )36$: TST (SP) ;WAS THE REGION CREATED? 3 BNE 81$ ;IF NE NO, DONE 2 MOV R1,R5 ;COPY POINTER TO ATTACHMENT DESCRIPTOR! MOV #P.LGTH,R1 ;PICK UP PCB SIZE, CALL $ALOCB ;ALLOCATE A PCBM$ 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 PCBO DEC R1 ;DONE YET?V BGT 40$ ;IF GT NO  P O .IF DF M$$PRO #( TST -(R0) ;SKIP REQUIRED RUN MASK WORD  .ENDC I Q. TST -(R0) ;SKIP XTRNL HDR SIZE AND I/O COUNT A H' CMP -(R0),-(R0) ;WAS THE PCB ATTACHED?, BEQ 50$ ;IF EQ00Bt__DATADATADATADATA 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 BIT:80$: MOV P.SUB(R4),R1 ;WAS SPACE ALLOCATED FOR THE REGION?# BEQ 81$ ;IF EQ NO, RETURN SUCCESS)8 MOV P.SUB(R1),P.SUB(R4) ;SET POINTER TO NEXT IN NEW PCB1 BIC #PS.OUT,P.STAT(R4) ;SET PARTITION IN MEMORYI! MOV R4,P.SUB(R1) ;AND LINK US INB81$: RETURN ;SUCCESS(90$: DRSTS D.RS94 ;PARTITION NAME ERROR)110$: TST P.ATT(SP) ;WAS REGION ATTACHED?3 BEQ 120$ ;IF EQ NO3 MOV (R3),R5 ;POINT TO ATT DESCR TO DETACH (R.GID)I- MOV SP,P.NAM(SP) ;SET NAME TO AVOID DELETION( CALL $DETRG ;DETACH THE REGION&120$: DRSTS D.RS1 ;ALLOCATION FAILURE1121$: DRSTS D.RS84 ;COULDN'T FIT IT IN PARTITIONU V;+; **-$DRATR-ATTACH REGIONE;OD; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ATTACH THE SPECIFIED REGION; TO THE CURRENT TASK.; ; DPB FORMAT:T; !; WD. 00 -- DIC(57.),DPB SIZE(2.)T.; WD. 01 -- ADDRESS OF REGION DEFINITION BLOCK;T ; INPUTS:B;19; 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.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.B;15; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)A; -; 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 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 16000J1ibjbkb a a a$ ;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;+1; **-$ALTOP-Allocate region top down in partitionL;R:; This routine will attempt to allocate space for a region2; in a top down manner in the specified partition.;N ; Input:O; R4 - PCB to insert$; R5 - Address of main PCBG ; Output:,; CC-C clear, region inserted into PCB list; R0 - Previous PCB; R1 - Next PCB address ; CC-C set, no memory available;R; R3 preserved;-$$ALTOP: MOV R3,-(SP) ; save register6 MOV P.REL(R5),R2 ; set high address of prev partition) MOV R5,R0 ; set up main as previous PCBo) CLR -(SP) ; reserve a word on the stackt;+; In this area:;o; R0 = address of previous PCB; R1 = address of next PCB<; R2 = address of first byte beyond (above) the previous PCB; R3 = scratch; R4 = address of new PCBr; R5 = address of main PCB; 1; Look through our partition (from low memory to-?; high) for a hole (memory that is not part of a subpartition)O+; that is large enough to hold the common. ;e,; Allocate the partition into the highest4; (last) such hole. The last hole is remembered by $; saving information in the new PCB.;-4100$: MOV P.SUB(R0),R1 ; get address of next sub-PCB% BEQ 160$ ; No more, end of list ...e* MOV P.REL(R1),R3 ; Calculate size of hole SUB R2,R3 ;d& CMP R3,P.BLKS(R4) ; Is it big enough?+ BLO 140$ ; Nope, update and try again ... 0 MOV R0,(SP) ; set previous address for linkage4 MOV R1,P.SUB(R4) ; Link this PCB to be our next PCB8 MOV P.REL(R1),P.REL(R4) ; Make base of common partition/ SUB P.BLKS(R4),P.REL(R4) ; as high as possiblei5140$: MOV R1,R0 ; Update this PCB to be previous ...-7 MOV P.REL(R1),R2 ; Calculate base address of next holeB ADD P.BLKS(R1),R2 ;! BR 100$ ; and try next hole ... 4160$: MOV P.REL(R5),R3 ; calculate size of last hole% ADD P.BLKS(R5),R3 ; adjust correctlyp SUB R2,R3 ;r& CMP R3,P.BLKS(R4) ; is it big enough?, BHIS 200$ ; yup, fit it in ... *real high*1180$: MOV (SP)+,R0 ; was a hole found previously?L BNE 220$ ; yup, continue ...;+=; No main memory available for common partition ... Sorry ... ;-& MOV (SP)+,R3 ; restore saved register SEC ; signal errora RETURN ; to caller  t"200$: TST (SP)+ ; clean the stack" CLR P.SUB(R4) ; clear our linkage" MOV R4,R3 ; copy the PCB address* ADD #P.REL,R3 ; and bias to P.REL address2 MOV P.REL(R5),(R3) ; make the base of the new PCB* ADD P.BLKS(R5),(R3) ; as high as possible8 SUB P.BLKS(R4),(R3) ; adjust to be correct base address=220$: MOV R4,P.SUB(R0) ; and chain us into the real world ...a9 MOV P.SUB(R4),R1 ; and set the next PCB address after us+, MOV (SP)+,R3 ; restore the saved R3 address240$: CLC ; clear carry RETURN ; and return to caller;+; **-$DRDTR-DETACH REGIONr;nE; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO DETACH THE SPECIFIED REGION,P; UNMAPPING IF NECESSARY.);3 ; DPB FORMAT:s;f!; WD. 00 -- DIC(59.),DPB SIZE(2.);.; WD. 01 -- ADDRESS OF REGION DEFINITION BLOCK; ; INPUTS:c;a9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.e,; R3=ADDRESS OF THE REGION DEFINITION BLOCK./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.e,; 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 ON3; 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 TH00RUt__DATADATADATADATAE 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 WIN .TITLE TTYHV .IDENT /08.12/;0; Copyright (c) 1995-1999 by Mentec Inc., U.S.A.; 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.;;; 28-AUG-82 DALE R. DONCHIN;; MODIFICATIONS:;; S. C. ADAMS 19-MAY-89 8.00; SA497 -- DON'T USE OUTPUT TIMER ON DMA OUTPUT;; M. W. ZAHAREE 8-MAY-91 8.10; MWZ016 -- MAKE SURE INTERRUPTS ARE LOCKED OUT2; WHEN SETTING PARITY. CLEAN UP EXCESSIVE LOCKI ; CALLS.; ; D. CARROLL 19-May-1993 8.119;; DC214 -- Correct MWZ016 for unit online, and insure that 2; YVMTMA is correctly used as a co-routine with%; LOCKI still in effect on return.W; ; D. CARROLL 17-May-1993 8.12<; DC227 -- Allow buffers to reside in low memory (ICB pool); and be properly handled.S;7; ;+.; CONTROLLER-DEPENDENT ROUTINES FOR DHU/DHV11.;-;-;- .IF DF D$$V11 .MCALL UCBDF$ UCBDF$ ;DEFINE UCB SYMBOLST .IF DF R$$MPL .MCALL KRBDF$ KRBDF$ ;DEFINE KRB SYMBOLS1 .IFF ;R$$MPL .MCALL SCBDF$ SCBDF$ ;DEFINE SCB SYMBOLSu .ENDC ;R$$MPL .PSECT MAP5;e;s; EQUATED SYMBOLS; ; DHU/DHV11 REGISTER DEFINITIONS; !CSR = 0 ;CONTROL STATUS REGISTER #RBUF = 2 ;RECEIVER BUFFER REGISTERl(TXCHAR = 2 ;TRANSMIT CHARACTER REGISTER!LPR = 4 ;LINE PARAMETER REGISTERRSTAT = 6 ;LINE STATUS REGISTER.#FIFODT = 6 ;DHU FIFO DATA REGISTERC#FIFOSZ = 6 ;DHU FIFO SIZE REGISTERY#LNCTRL = 10 ;LINE CONTROL REGISTERR0BFADR1 = 12 ;TRANSMIT BUFFER ADDRESS 1 REGISTER0BFADR2 = 14 ;TRANSMIT BUFFER ADDRESS 2 REGISTER1BFCNT = 16 ;TRANSMIT DMA BUFFER COUNTER REGISTER;Q7; DEFINITION FOR THE CONTROLLER ID BIT IN STAT REGISTERS; &DHUID = 400 ; DHUID=0 INDICATES DHV11 ; DHUID=1 INDICATES DHU11H;=;+; YVSTAX - START OUTPUT.5; NOTE - NON-BUFFERED OUTPUT CURRENTLY NOT SUPPORTED. ;T; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.TOP+2 BUFFER POINTER1; U.TOC BYTE COUNTS;R ; OUTPUT:1; OUTPUT STARTED. ; U.TOP+2 UNCHANGED; U.TOC UNCHANGED;F; REGISTERS ALTERED: R4F;-;6;T ; M; BUFFERED OUTPUT FOR ALL QIO, EXCEPT IO.WAL IS ALWAYS DONE FROM THE TERMINALRC; DRIVER BUFFERS. IN CASE OF IO.WAL FOR Q-BUS SYSTEMS OUTPUT MAY BENB; DONE FROM THE TASK BUFFER WITHOUT INTERMEDIATE TRANSFER INTO THE#; CHAIN OF USUAL TTDRV BUFFERS G; ONLY ONE INTERNAL TTDRV BUFFER IS USED FOR THIS TRANSFER. THIS BUFFER.G; DOES NOT CONTAIN DATA. IT CONTAINS INFORMATION00Z1ibjbkb a a a FOR DIRECT OUTPUT FROMP; THE TASK BUFFERS. ; .; OFFSETS ; R; 0 - LINK WORD (CONTAINS 0); 2 - LENGTH D'; 4 - NUMBER OF BYTES FOR DMA TRANSFER A'; 6 - HIGH BYTE OF TASK BUFFER ADDRESS E(; 10 - LOW BYTES OF TASK BUFFER ADDRESS ; N-; THE REST OF THE OUTPUT BUFFER IS NOT USED A ; N; IN A REGULAR QIO WE HAVE AS MANY PHYSICAL DATA TRANSFERS AS WE HAVE INTERNALL; OUTPUT BUFFERS CHAINED FOR TASK OUTPUT. FOR 'PURE' IO.WAL WE HAVE ONLY ONE; PHYSICAL DATA TRANSFER ; P .ENABL LSBB;EHYVSTAX::BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;HIGH PRIORITY OUTPUT REQUESTED?4 BEQ 7$ ;;;N -POSSIBLY BEGIN NORMAL PRIORITY OUTPUT> BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT ALREADY IN PROGRESS? 6 BEQ 8$ ;;;Y - DO HIGH PRIOR.OUTPUT AT NEXT INTERRUPTC BIS #S5.HPO,U.TST5-U.TSTA(R5);;;SHOW BUSY DOING HIGH PRIOR. OUTPUTQ A)STAXH: CALL SELLIN ;;;SELECT THE LINE N" MOV R3,R4 ;;;COPY CSR ADDRESS ( BIT #DHUID,STAT(R3) ;;;CHECK FOR DHU  BEQ 2$ ;;;NO. THIS IS DHV 3 TSTB FIFOSZ(R3) ;;;IF DHU CHECK IF FIFO HAS SPACE S BEQ 8$ ;;;NO SPACE. EXIT O% ADD #FIFODT,R4 ;;;POINT TO FIFODT L M22$: BIT #S5.XOF,U.TST5-U.TSTA(R5);;;OUTPUT XOF?  BEQ 3$ ;;;NO R3 BIC #S5.XOF,U.TST5-U.TSTA(R5);;;RESET INDICATION T! MOV YVXOFF,-(SP) ;;;SET XOFF S BR 4$ ;;;GO ON O03$: BIC #S5.XON,U.TST5-U.TSTA(R5);;;RESET XON  MOV YVXON,-(SP) ;;;SET XON C R#4$: CMP R3,R4 ;;;IF EQUAL - DHV  BNE 5$ ;;;NO. THIS IS DHU 1 MOV (SP)+,TXCHAR(R3);;;OUTPUT XON/XOFF FOR DHV O BR 6$ ;;;ALL DONE ; X05$: MOVB (SP)+,(R4) ;;;OUTPUT XON/XOFF FOR DHU $$6$: JMP 60$ ;;;INITIALIZE OUTPUT 97$: BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;HIGH PRIOR. OUTPUT T ;;;IN PROGRESS? 3 BEQ STAXN ;;;Y - DO NORMAL PRIOR. OUTPUT ON NEXT  ;;;INTERRUPT 8$: JMP 70$ ;;;EXIT  STAXN: ;;;REFERENCE LABEL  .IF DF T$$ACD, BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BNE 10$ ;;;Y - JUMPP ADD #U.TOC,R4 ;;;POINT TO U.TOC&STAXM: CALL SELLIN ;;;SELECT THE LINE+ CALL MOUT ;;;GET NEXT CHARACTER TO OUTPUTF9 MOVB R2,U.ADMA-U.TSTA(R5) ;;;PUT CHARACTER IN DMA BUFFER = BIS #100000,U.ADMA-U.TSTA(R5) ;;;SET TRANSMIT DATA VALID BITO JMP 50$ ;;;INITIATE THE OUTPUT  .ENDC ;T$$ACD(10$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2&STAX1: CALL SELLIN ;;;SELECT THE LINEE BICB #200,BFADR2+1(R3) ;;;DISABLE THE XMITTER IN CASE WE'RE X-OFF'ED2 .IF DF T$$DMA R = BIT #S5.DWA,U.TST5-U.TSTA(R5);;;CHECK FOR IO.WAL IN PROGRESS: BNE 48$ ;;;NOS .ENDC ;T$$DMA T X< 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 POOLO;JP; FOR 22-BIT SYSTEMS, CHECK FOR THE PRESENCE OF UMRS. THE CHECKING IS DIFFERENT; FOR RSX-11M AND RSX-11M-PLUS.L;  .IF DF M$$EXT .IF DF R$$MPL2 BIT #HF.UBM,$HFMSK ;;;UMRS EXIST? SET CC-Z IF NO .IFF ;R$$MPLA2 BIT #177777,$UMRPT ;;;UMRS EXIST? SET CC-Z IF NO .ENDC ;R$$MPL .ENDC ;M$$EXT;SP; IN I/D SYSTEMS, BUFFERS CAN BE IN EITHER TTCOM OR PRIMARY POOL, EACH REQUIRINGN; DIFFERENT RELOCATION CONSTANTS IF THERE ARE NO UMRS. FOR NON-I/D SYSTEMS WEM; ONLY NEED TO COMPUTE A PHYSICAL ADDRESS FOR BUFFERS IN THE DRIVER'S PRIVATES ; POOL FOR SYSTEMS WITHOUT UMRS.;S .IF DF K$$DAS BNE 30$ ;;;UMRS PRESENT - JUMP* BLO 20$ ;;;BUFFER IN PRIMARY POOL - JUMPE ADD RELCV+2,BFADR1(R3) ;;;ADD RELOCATION CONSTANT TO VIRTUAL ADDRESSXF MOVB RELCV,BFADR2(R3) ;;;(NOTE: RELCV MUST NOT HAVE BITS 6 AND 7 SET) ADCB BFADR2(R3) ;;; BR 40$ ;;;JOIN COMMON CODE20$: .IF DF I$$CBP6 BIT #160000,-2(R4) ;;; IS THE BUFFER IS THE LOW 4.KW?# BEQ 40$ ;;; IF EQ, YES, NO MATTER  .ENDC ;DF,I$$CBPA7 ADD RELCV+6,BFADR1(R3) ;;;ADD POOL RELOCATION CONSTANTRB MOVB RELCV+4,BFADR2(R3) ;;;(RELCV MUST NOT HAVE BITS 6 AND 7 SET) ADCB BFADR2(R3) ;;; BR 40$ ;;;JOIN COMMON CODE.30$: BLO 40$ ;;;BUFFER IN PRIMARY POOL - JUMP .IF DF T$$S00bUt__DATADATADATADATAPLC SUB #20000,BFADR1(R3) ;;;FORCE BUFFER ADDRESS TO MAP THROUGH UMR 5  .ENDC ;T$$SPL .IFF ;K$$DASB .IF DF M$$EXT BNE 40$ ;;;UMRS PRESENT - JUMP .ENDC ;M$$EXT* BLO 40$ ;;;BUFFER IN PRIMARY POOL - JUMPE ADD RELCV+2,BFADR1(R3) ;;;ADD RELOCATION CONSTANT TO VIRTUAL ADDRESSAF 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 COUNT* BR 49$ ;;;DMA TRANSFER FROM INT. BUFFER S .IF DF T$$DMA O48$: MOV R0,-(SP) ;;;SAVE R0$ MOV R4,R0 ;;;NOW R0 POINTS U.TOP+2* ADD #U.TFOB-U.TOP-2,R0;;;SET R0 TO U.TFOB4 CLRB U.TOTI-U.TFOB(R0) ;;;DON'T TIME-OUT DMA OUTPUT MOV (R0),R0 ;;;O6 CMP (R0)+,(R0)+ ;;;SET R0 AT THE BEGINNING OF BUFFER0 MOV (R0)+,BFCNT(R3) ;;;SET BYTE COUNT FOR DMA 1 MOV (R0)+,BFADR2(R3);;;SET 6 HIGH BITS OF ADDR C0 MOV (R0),BFADR1(R3);;;SET LOW 16 BITS OF ADDR  MOV (SP)+,R0 ;;;RESTORE R0  .ENDC ;T$$DMA E 49$: D/ BISB #200,BFADR2(R3) ;;;ENABLE DMA TRANSFER 0 ASSUME S2.CTS,100000 S,50$: TST 2(R5) ;;;OUTPUT STOPPED BY CTRL-S?% BMI 70$ ;;;YES- DON'T RESUME OUTPUTT;M;U;+; YVRESX - RESUME OUTPUT.O;C; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 0E;-;F;D'YVRESX::CALL SELLIN ;;;SELECT THE LINEB .IF DF T$$ACD+ BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT BNE 60$ ;;;Y - JUMPE% BIT #DHUID,STAT(R3) ;;;CHECK FOR DHU  BEQ 55$ ;;;LINE IS DHV -> 55$2 TSTB FIFOSZ(R3) ;;;IF DHU CHECK IF FIFO HAS SPACE$ BEQ 70$ ;;;NO SPACE. TRY NEXT TIME? MOVB U.ADMA-U.TSTA(R5),FIFODT(R3) ;;;INITIATE SINGLE CHAR XFERE4 BR 60$ ;;;INITIATE OUTPUT REGARDLESS OF XOFF STATEA55$: MOV U.ADMA-U.TSTA(R5),TXCHAR(R3);;;INITIATE SINGLE CHAR XFERN .ENDC ;T$$ACD560$: MOVB #200,BFADR2+1(R3) ;;;ENABLE THE TRANSMITTERD .IF NDF D$$VMD2YVMTIM:: .ENDC ;D$$VMD 70$: RETURN$;; .DSABL LSBB;#;I;+; YVABOX - ABORT OUTPUT.;Q; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;S;-;B;7YVABOX:: .IF DF T$$ACD, BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BEQ 10$ ;;;N - RETURN  .ENDC ;T$$ACDB BIT #S5.HPO,U.TST5-U.TSTA(R5);;;HIGH PRIORITY OUTPUT IN PROGRESS?& BNE 10$ ;;;YES - DO NOT ABORT OUTPUT5 BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT IN PROGRESS?R BNE 10$ ;;;N - JUMPD CALL SELLIN ;;;SELECT THE LINE4 BIS #1,LNCTRL(R3) ;;;ABORT THE CURRENT DMA TRANSFER= CMP (SP)+,#LOCKR ;;;REMOVE RETURN ADDRESS - WAS IT TO LOCKR?F BNE 10$ ;;;N - JUMP  MTPS #0 ;;;ALLOW INTERRUPTSX2 TST (SP)+ ;REMOVE RETURN ADDRESS TO FORK ROUTINE410$: RETURN ;RETURN WITHOUT SIGNALLING OUTPUT DONE;A;;+; YVSTOX - STOP OUTPUT.R;;; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 1U;-;.;-'YVSTOX::CALL SELLIN ;;;SELECT THE LINE1; BICB #200,BFADR2+1(R3) ;;;CLEAR THE TRANSMITTER ENABLE BITN RETURN ;;;R;H;U .IF DF T$$GMC!T$$SMC!D$$VMD;+#; YVLPAR - GET/SET LINE PARAMETERS.L;R; INPUT:; R0 BIT 15: 0 = SET SPEED; 1 = GET SPEEDX); BIT 13: 1 = SET 7-BIT CHARACTER LENGTHK4; BIT 12: 1 = CHECK IF 7-BIT CHARACTER IS SUPPORTED;; BIT 11: 1 = SET SPEED SELECTED BY AUTO-BAUD DETECT LOGIC); BIT 10: 1 = SET DEVICE DEPENDENT SPEEDE!; (USED FOR SETTING PARITY)"; BIT 9: 1 = GET/SET ANSWER SPEED#; BIT 8: 0 = GET/SET RECEIVE SPEED ; 1 = GET/SET TRANSMIT SPEED; IF SET SPEED:/; BITS 0-7: NEW SPEED PARAMETER (S.XXX SYMBOL);V&; R1 Flow control status change flags.;U(; BIT 0: 1 = Enable input flow control.); BIT 1: 1 = Disable input flow control.R); BIT 2: 1 = Enable output flow control.R*; BIT 3: 1 = Disable output flow control.;L; BITS 4-15: Reserved;O<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.;O ; OUTPUT:A; IF GET SPEED REQUESTED:E%; R4 POINTER TO DHU/DHV11 SPEED TABLEE; CC-C 0;; IF SET SPEED REQUESTED:E; CC-C 0 IF OK; 1 IF ILLEGAL SPEED SPECIFIEDM;RJ; NOTE THAT THIS ROUTINE CAN00j1ibjbkb a a a BE EXECUTED AT BOTH SYSTEM STATE (IN RESPONSEN; TO A SF.GMC OR SF.SMC QIO) AND FROM THE INPUT INTERRUPT SERVICE ROUTINE (FOR; AUTO-BAUD DETECT).;l;-;r;R; YVLPAR::) TST R1 ;Called for flow control change?  BEQ 5$ ;If EQ no - go on.R RETURN ;Not processed for DZ.5$:N .IF DF T$$GMC ! T$$SMC  G0 BIT #20000,R0 ;CHECK IF WE VALIDATE 7-BIT CHAR. BEQ 7$ ;NO  RETURN 7$:  BIT #10000,R0 ;CHECK SET 7-BITI BEQ 8$ ;NO. SET SPEED-PARITY 0 BR SETLN1 ;SET 7-BIT AND OTHER LINE PARAMETERS8$: T  .ENDC ;T$$GMC ! T$$SMCR .IF DF D$$VMD. BIT #4000,R0 ;SET SPEED FOR AUTO-BAUD DETECT? BEQ 20$ ;N - JUMP& BIT #2000,R0 ;DEVICE DEPENDENT SPEED? BNE 10$ ;Y - JUMPh! BIC #177400,R0 ;CLEAR UPPER BYTER5 MOVB SPDHV-1(R0),R0 ;GET DEVICE DEPENDENT SPEED BITSC-10$: BIC #^C<17>,R0 ;CLEAR ALL BUT SPEED BITS  MOV R0,R2 ;GET A COPYQ .IF DF R$$EIS8 ASH #4,R2 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITION .IFF ;R$$EIS-: CALL SHIFT4 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITION .ENDC ;R$$EIS& BIS R0,R2 ;ADD IN RECEIVE SPEED BITS4 MOVB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED IN DATABASE- BR SETLN1 ; AND SET NEW SPEED IN CONTROLLERP20$: ;REFERENCE LABEL .ENDC ;D$$VMD .IF DF T$$GMC&T$$SMC ! MOV R0,R4 ;SAVE INPUT PARAMETERS& SWAB R4 ;PUT FLAGS IN LOW ORDER BYTE BPL 30$ ;SET SPEED - JUMP2 .ENDC .IF DF T$$GMC. MOV #SPDHV,R4 ;POINT TO DHU/DHV11 SPEED TABLE RETURN ;RETURN WITH CC-C = 0 .ENDC ;T$$GMC .IF DF T$$SMC!D$$VMDI .IF NDF T$$GMC! MOV R0,R4 ;SAVE INPUT PARAMETER ( SWAB R4 ;PUT FLAGS IN LOWER ORDER BYTE .ENDC ;NDF T$$GMC'30$: BIC #177400,R0 ;CLEAR R0 HIGH BYTEN$ MOVB SPDHV-1(R0),R2 ;GET SPEED BITS SEC ;ASSUME ERROR' BMI 40$ ;NOT A SUPPORTED SPEED - JUMPV ASRB R4 ;SET ANSWER SPEED? BEQ 50$ ;N - JUMPE .IF DF D$$VMD- BICB #17,U.CW3+1-U.TSTA(R5) ;CLEAR OLD VALUE1 BISB R2,U.CW3+1-U.TSTA(R5) ;SET NEW ANSWER SPEEDT CLC ;SHOW SUCCESS .IFF ;D$$VMD;5 SEC ;ATTEMPT TO SET ANSWER SPEED W/O MODEM SUPPORTM .ENDC ;D$$VMD 40$: RETURN;A$50$: BCS 60$ ;TRANSMIT SPEED - JUMP3 BICB #17,U.CW3-U.TSTA(R5) ;CLEAR OLD RECEIVE SPEED  BR 70$ ;JUMP TO SET NEW SPEED;960$: BICB #360,U.CW3-U.TSTA(R5) ;CLEAR OLD TRANSMIT SPEEDO .IF DF R$$EIS0 ASH #4,R2 ;SHIFT SPEED BITS TO PROPER POSITION .IFF ;R$$EISD2 CALL SHIFT4 ;SHIFT SPEED BITS TO PROPER POSITION .ENDC ;R$$EIS,70$: BISB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED# BR SETLN1 ;;;GO AND LOAD INTO LPRE .ENDC ;DF T$$SMC!D$$VMD .ENDC ;T$$GMC!T$$SMC!D$$VMD;0;+; YVPWUP - POWER-UP.; ; INPUT:<; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE.; U.STS SET UP FOR LOCAL LINE: ; US.CRW 0B ; US.DSB 03;-;(; .ENABL LSBA .IF DF R$$CON8YVCONL::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$$SPLP MOV (R0)+,(R1)+ ;SET UP UMR 6 MOV (R0)+,(R1)+ ; .ENDC ;NDF T$$SPLYVCPUP:: .IFF ;R$$CONU#YVPWUP::TST R2 ;IS THIS LINE ZERO?R BNE 30$ ;N - JUMPN .IFTF ;R$$CON MOV #40,@R3 ;SET MASTER RESETU.10$: BIT #40,@R3 ;IS RESET FUNCTION COMPLETE? BNE 10$ ;N - LOOP UNTIL DONE .IFT ;R$$CONO2 BIT #20000,@R3 ;DID INTERNAL DIAGNOSTICS SUCCEED? BEQ 20$ ;Y - JUMPD= MOVB #IE.FHE,$SCERR ;INDICATE FATAL HARDWARE ERROR ON DEVICE; RETURNR .IFTF ;R$$CON&20$: MOV #40100,@R3 ;ENABLE INTERRUPTS .IFT ;R$$CON RETURN(YVUONL::YVUPUP:: .ENDC ;R$$CON%30$: CALL LOCKI ;LOCK OUT INTERRUPTSI CALL SELLIN ;;;SELECT THE LINE3 BIS #4,LNCTRL(R3) ;;;ENABLE RECEIVER FOR THIS LINE BA BISB #US.OIU,U.STS-U.TSTA(R5) ;;;SET OUTPUT INTERRUPT UNEXPECTED F .IF DF T$$DMA 0 I( BIT #HF.QB,$HFMSK ;;;CHECK FOR Q-BUS  BEQ 33$ ;;;NO @ BIS #S5.DMA,U.TST5-U.TSTA(R5) ;;;SET BIT TELLING DHV/DHU IS DMA33$: ;;;REFERENCE LABEL , 00rUt__DATADATADATADATA  .ENDC ;T$$DMA $  .IF DF D$$VMD6 BIC #S5.ABP,U.TST5-U.TSTA(R5) ;;;RESET AUTO-BAUD MODE- BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;REMOTE LINE?E BEQ 40$ ;;;N - JUMP;> BISB #US.CRW,U.STS-U.TSTA(R5) ;;;SET WAITING FOR CARRIER FLAG0 MOV R3,-(SP) ;;;SAVE POSSIBLY MODIFIED REGISTER! CALL YVMTMA ;;;SET MODEM STATUS. CALL @(SP)+ ;;;CALL BACK THE CALLER (HLMTIM)! MOV (SP)+,R3 ;;;RESTORE REGISTER5 .ENDC BR 40$)+SETLN1: CALL LOCKI ;;; LOCK OUT INTERRUPTSR=40$: MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW SPEED AND PARITY BITS'SETLIN: CALL SELLIN ;;;SELECT THE LINES( SWAB R2 ;;;PUT SPEED BITS IN HIGH BYTE5 RORB R2 ;;;PUT PARITY ENABLE BIT IN PROPER POSITIONJ/ BICB #^C<40>,R2 ;;;CLEAR ALL BUT PARITY ENABLEN$ TST U.CW3-U.TSTA(R5) ;;;ODD PARITY? BMI 60$ ;;;Y - JUMPE' BIS #100,R2 ;;;N - SET TO EVEN PARITY:60$: BIT #140000,R2 ;;;TRANSMIT SPEED 134.5 BAUD OR LOWER? BNE 70$ ;;;N - JUMP5& BIS #200,R2 ;;;Y - SET TWO STOP BITS,70$: BIS #30,R2 ;;;SET EIGHT BIT CHARACTERS7 BIT #S5.CLN,U.TST5-U.TSTA(R5) ;;;CHECK 7-BIT CHARACTER  BEQ 75$ ;;;NO LEAVE IT 8-BIT BIC #10,R2 ;;;SET 7-BITT/75$: MOV R2,LPR(R3) ;;;LOAD NEW LINE PARAMETERST ;S;O7; WHEN RETURNING VIA COROUTINE "LOCKI", CC-C IS CLEAREDT;C RETURN ;RETURND .DSABL LSB6 .IF DF R$$CONYVCOFF::! CALL LOCKI ;LOCK OUT INTERRUPTSB! MOV #40,@R3 ;;;SET MASTER RESET. RETURN YVUOFF::! CALL LOCKI ;LOCK OUT INTERRUPTS CALL SELLIN ;;;SELECT THE LINE@ BIC #11004,LNCTRL(R3) ;;;DROP DTR, RTS AND DISABLE THE RECEIVER RETURN ;;;DROP PRIORITY .ENDC ;R$$CON; ;8;+"; INPUT INTERRUPT SERVICE ROUTINE.;-;P;31 DS.CHG = 70000 ;DATASET STATUS CHANGE CONDITION .ENABL LSBV;C .IF DF R$$MPL-$YVINP::TTSET$ YV ;;;SAVE R2, R3 AND SET UP:B ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS .IFF ;R$$MPLT+$DVINP::TTSET$ DV ;;;SAVE R2,R3 AND SET UP  ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST .IFTF ;R$$MPL410$: MOV RBUF(R3),R5 ;;;GET NEXT CHARACTER FROM SILO! BPL 70$ ;;;SILO IS EMPTY - JUMPD MOV R5,-(SP) ;;;SAVE CHARACTER( SWAB R5 ;;;GET LINE NUMBER IN LOW BYTE CALL MUXUCB ;;;GET UCB IN R5' MOV (SP)+,R2 ;;;RETRIEVE CHAR + STATUS.( BCS 10$ ;;;BAD LINE - IGNORE CHARACTER0 MOV R2,-(SP) ;;;CHECK FOR DATASET STATUS CHANGE0 BIC #^C,@SP ;;;CLEAR ALL BUT ERROR BITS, CMP #DS.CHG,(SP)+ ;;;DATASET STATUS CHANGE? BEQ 20$ ;;;Y - JUMP3 .IFF ;R$$MPL4! MOV R3,-(SP) ;;;SAVE CSR ADDRESSM .IFTF ;R$$MPL% MOV R4,-(SP) ;;;SAVE KRB/UCB ADDRESS5 CALL ICHAR1 ;;;DO COMMON INPUT INTERRUPT PROCESSINGV( MOV (SP)+,R4 ;;;RESTORE KRB/UCB ADDRESS .IFF ;R$$MPLL MOV (SP)+,R3 ;;;RESTORE CSR .IFT ;R$$MPLI# MOV @R4,R3 ;;;RESTORE CSR ADDRESSN .ENDC ;R$$MPL6 BR 10$ ;;;TRY TO GET ANOTHER CHARACTER FROM THE SILO;CQ; WE ARE HERE BECAUSE FRAMING ERROR, DATA OVERRUN AND PARITY ERROR BITS WERE SET,GN; WHICH MEANS THAT EITHER A DATASET STATUS CHANGE HAS OCCURRED OR A DIAGNOSTIC; MESSAGE HAS BEEN RECEIVEDR;(&20$: BIT #1,R2 ;;;DIAGNOSTIC MESSAGE? BNE 10$ ;;;Y - IGNORET .IF DF D$$VMD;V; PROCESS MODEM STATUS CHANGED;S MOV R4,-(SP) ;;;SAVE R4: MOV #100000,R4 ;;;SHOW THAT INTERFACE SUPPORTS DSR SIGNAL% BIT #10,R2 ;;;IS CLEAR TO SEND SET?L BEQ 30$ ;;;N - JUMPG( BIS #100,R4 ;;;Y - SET APPROPRIATE BIT*30$: BIT #20,R2 ;;;IS CARRIER DETECT SET? BEQ 40$ ;;;N - JUMPT' BIS #40,R4 ;;;Y - SET APPROPRIATE BIT 40$: BIT #40,R2 ;;;IS RING SET? BEQ 50$ ;;;N - JUMPS( BIS #200,R4 ;;;Y - SET APPROPRIATE BIT50$: TSTB R2 ;;;IS DSR SETE BPL 53$ ;;;N - JUMP) BIS #40000,R4 ;;;Y - SET APPROPRIATE BITS+53$: CALL SELLIN ;;;SETUP THE CORRECT LINE#5 CALL MODISR ;;;DO COMMON MODEM INTERRUPT PROCESSINGB, 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 LINEM.55$: BIC #11000,LNCTRL(R3) ;;;DROP DTR AND RTS(57$: BCS 65$ ;;;NO CALL ANSWERED - JUMP/ MOVB U.CW3+1-U.TSTA(R5),R2 ;;;GET ANSWER SPEEDE- BICB #^C<17>,00z1ibjbkb a a aR2 ;;;CLEAR ALL BUT SPEED FIELD;> MOVB R2,U.CW3-U.TSTA(R5) ;;;SET NEW RECEIVE SPEED IN DATABASE .IF DF R$$EIS0 ASH #4,R2 ;;;SET TRANSMIT SPEED = ANSWER SPEED .IFF ;R$$EISS2 CALL SHIFT4 ;;;SET TRANSMIT SPEED = ANSWER SPEED .ENDC ;R$$EIS? BISB R2,U.CW3-U.TSTA(R5) ;;;SET NEW TRANSMIT SPEED IN DATABASE;9 MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW SPEED AND PARITY BITS) ASSUME S4.ABD,1000007. TST 6(R5) ;;;AUTO-BAUD SPEED DETECT ENABLED? BPL 60$ ;;;N - JUMPG* MOV #273,R2 ;;;Y - SET LINE TO 4800 BAUD(60$: CALL SETLIN ;;;SET LINE PARAMETERS65$: MOV (SP)+,R4 ;;;RESTORE R4  .ENDC ;D$$VMD6 BR 10$ ;;;TRY TO GET A CHARACTER FROM THE INPUT SILO;<; SILO IS NOW EMPTY. SEE IF CONTROLLER IS READY TO TRANSMIT;S#70$: MOV @R3,R5 ;;;XMIT READY SET?C" BMI 75$ ;;;Y - GO DO OUTPUT WORK RETURN ;;;RETURNV;C;U;+#; OUTPUT INTERRUPT SERVICE ROUTINE.B;-;A;M .IF DF R$$MPL-$YVOUT::TTSET$ YV ;;;SAVE R2, R3 AND SET UP:B ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS .IFF ;R$$MPL:+$DVOUT::TTSET$ DV ;;;SAVE R2,R3 AND SET UP( ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST .ENDC ;R$$MPL7 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 STATUSU( SWAB R5 ;;;GET LINE NUMBER IN LOW BYTE CALL MUXUCB ;;;GET UCB IN R5) MOV (SP)+,R2 ;;;RETRIEVE TRANSMIT STATUS  BCS 130$ ;;;BAD LINE - IGNORE= .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 . MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPLR$ MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX .ENDC ;T$$SPL ; C; WE'RE HERE BECAUSE AN OUTPUT REQUEST HAS COMPLETED OR WAS ABORTEDN ; 2 CALL SELLIN ;;;SELECT THE LINE THAT INTERRUPTED ; H; TO MAKE LATER ERROR CHECKING EASIER, MERGE THE DMA ABORT BIT (BIT 0 OF8; THE LNCTRL CSR) WITH THE DMA ERROR BIT (ALREADY IN R2); + ASL R2 ;;;SHIFT A ZERO INTO THE LOW-ORDER2 BISB LNCTRL(R3),R2 ;;;COMBINE ERROR BITS TOGETHER7 BIC #1,LNCTRL(R3) ;;;RESET ABORT BIT FOR NEXT TRANSFERR;N; CHECK IF XOFF/XON SHOULD BE OUTPUT NOW (POSSIBLY BETWEEN QIO OUTPUT BUFFERS);E4 BIC #100000,R2 ;;;ASSUME DON'T NEED XOFF/XON OUTPUTE BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;ANY HIGH PRIORITY REQUEST PENDING?  BEQ 85$ ;;;N - JUMP * CALL STAXH ;;;START HIGH PRIORITY OUTPUT, BIS #100000,R2 ;;;REMEMBER THAT WE DID THIS;R+; PROCESS ANY ERRORS FROM PREVIOUS TRANSFER ;O%85$: MOV R3,-(SP) ;;;SAVE CSR ADDRESSR+ ASR R2 ;;;DID WE ABORT PREVIOUS TRANSFER?T BCS 110$ ;;;Y - JUMP= BIT #10000,R2 ;;;DID THE CONTROLLER ABORT PREVIOUS TRANSFER?N BEQ 90$ ;;;N - JUMPO6 MOVB #1,U.TOTI(R4) ;;;SET TIMER TO EXPIRE IN 1 SECOND/ BR 120$ ;;;WAIT UNTIL THEN TO COMPLETE OUTPUT);;; DETERMINE WHAT TO DO NEXTD;?290$: TST R2 ;;;DID WE JUST START XOFF/XON OUTPUT?- BMI 120$ ;;;Y - DON'T START ANY MORE OUTPUT B BITB #US.OIU,U.STS-U.TSTA(R5) ;;;ANY QIO (OR ACD) OUTPUT PENDING? BNE 120$ ;;;N - JUMP ; K; WE HAVE NO OUTPUT IN PROGRESS BUT HAVE QIO OUTPUT TO DO. DETERMINE IF WEPP; SHOULD START IT FROM THE BEGINNING (S5.HPO SET) OR CONTINUE IT (S5.HPO CLEAR) ;M; BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;JUST STARTING QIO OUTPUT?B BEQ 95$ ;;;N - JUMPH4 CALL STAXN ;;;BEGIN QIO OUTPUT DELAYED BY XOFF/XON0 BR 120$ ;;;CLEAR S5.HPO AND GO ON TO NEXT LINE;TE; POSSIBLY CONTINUE (IF MORE BUFFERS OR CHARACTERS) QIO OR ACD OUTPUTT;.95$: ;;;REFERENCE LABEL .IF DF T$$ACD, BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BNE 100$ ;;;Y - JUMP ADD #U.TOC,R4 ;;;POINT TO U.TOC% DEC @R4 ;;;ANYTHING LEFT TO OUTPUT?I BEQ 110$ ;;;N - JUMP) CALL STAXM ;;;INITIATE ANOTHER TRANSFERT4 BR 120$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETED .ENDC ;T$$ACD)100$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2F .IF DF T$$DMA S8 BIT #S5.DWA,U.TST5-U.TSTA(R5);;;CHECK IO.WAL COMPLETI00t__DATADATADATADATAON BNE 110$ ;;;YES  .ENDC ;T$$DMA;104$: CALL NXTOB ;;;GET NEXT OUTPUT BUFFER IF THERE IS ONET BEQ 110$ ;;;N - JUMP;R5; WE GOT ANOTHER OUTPUT BUFFER - START OUTPUTTING IT.O;  TST -(R4) ;;;POINT TO U.TOP+2E MOV (SP)+,R3 ;;;GET CSR ADDRESS CALL STAX1 ;;;START OUTPUT0 BR 122$ ;;;CLEAR S5.HPO AND GO ON TO NEXT LINE110$: A BIC #S5.DWA,U.TST5-U.TSTA(R5);;;CLEAR DMA IO.WAL IN PROGRESS BITT) CALL ODONE ;;;DO OUTPUT DONE PROCESSINGT)120$: MOV (SP)+,R3 ;;;RESTORE CSR POINTEROE122$: BIC #S5.HPO,U.TST5-U.TSTA(R5) ;;;NO XOFF/XON OUTPUT IN PROGRESSG;N; *; SEE IF ANY OTHER LINE COMPLETED TRANSMIT;;-130$: MOV (SP),R4 ;;;RESTORE KRB/UCB ADDRESSS MOV @R3,R5 ;;;XMIT READY SET?R% BMI 80$ ;;;Y - DO IT ALL OVER AGAIN  TST (SP)+ ;;;CLEAN STACK- JMP 10$ ;;;SEE IF ANY MORE INPUT WORK TO DO ; .DSABL LSB ;E;1;  .IF NDF R$$EIST;SH; SUBROUTINE TO SHIFT R2 4 BIT POSITIONS TO THE LEFT FOR NON-EIS SYSTEMS;OSHIFT4: ASL R2 ;SHIFT ONCE; ASL R2 ;TWICEN ASL R2 ;THRICE ASL R2 ;LAST TIME5 RETURNO .ENDC ;NDF R$$EIS;(; SUBROUTINE TO SELECT LINE ON DHU/DHV11;N;T9SELLIN: MOV #40100,-(SP) ;;;INCLUDE INTERRUPT ENABLE BITS@5 BISB U.UNIT-U.TSTA(R5),(SP) ;;;GET THE LINE NUMBERO! MOV (SP)+,@R3 ;;;SELECT THE LINEA RETURN ;;;; .IF DF D$$VMD;W; ;+; YVMTIM - MODEM TIME-OUT1;-;;F .ENABL LSB(YVMTIM::CALL LOCKI ;LOCK OUT INTERRUPTS CALL SELLIN ;;;SELECT THE LINE0 BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;IS LINE REMOTE? BNE 10$ ;;;Y - JUMPL. BIC #400,LNCTRL(R3) ;;;SET LINK TYPE TO LOCAL! BR 20$ ;;;PROCESS MODEM TIMEOUT ;+=; Note: If this routine is called, it should be noted that =; if US.CRW is set, then the caller will be called back as a MC; co-routine, since it is expected that LOCKI is the second address$B; on the stack in routine HLMTIM. Currently, it is only referencedD; in subroutine YVUONL:, and it is hoped that this remains the rule.;-%YVMTMA: ;;;(LINE ALREADY SELECTED)5310$: BIS #400,LNCTRL(R3) ;;;SET LINK TYPE TO REMOTE0820$: CALL HLMTIM ;;;DO COMMON MODEM TIME-OUT PROCESSING/ BEQ 30$ ;;;IF EQ Z-BIT SET - DROP DTR AND RTSs, BIS #11000,LNCTRL(R3) ;;;ASSERT DTR AND RTS RETURN ;;;t.30$: BIC #11000,LNCTRL(R3) ;;;DROP DTR AND RTS RETURN ;;; .DSABL LSBO .ENDC ;D$$VMD .ENDC ;D$$V11 .ENDoutine HLMTIM. Currently, it is only referencedD; in subroutine YVUONL:, and it is hoped that this remains the rule.;-%YVMTMA: ;;;(LINE ALREADY SELECTED)5310$: BIS #400,LNCTRL(R3) ;;; .TITLE REQSBE .IDENT /15.04/U;0; Copyright (c) 1995-1999 by Mentec Inc., U.S.A.; 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.;O; D. N. CUTLER 10-AUG-73;A!; MODIFIED FOR RSX-11M-PLUS V2.1:; ; H. HUANGN; J. R. KAUFFMAN; B. KRISHNAMURTHY:; J. M. LAWLER ; T. LEKAS; T. M. MARTIN; B. S. MCCARTHYC;+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:L;E; J. M. LAWLER; J. R. KAUFFMAN; J. W. BERZLE; B. S. MCCARTHY; L. B. MCCULLEY;e+; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY: ;S; J. W. BERZLE ; K. L. NOEL;C+; MODIFIED FOR RSX-11M-PLUS VERSION 4.1 BY:O;N ; K. L. NOELM; P. K. M. WEISS;O+; MODIFIED FOR RSX-11M-PLUS VERSION 4.2 BY:R;X; B. S. MCCARTHY;$; MODIFIED FOR RSX-11M-PLUS V4.3 BY:; ; J. C. FRANZINI ; K. L. NOEL;.+; MODIFIED FOR RSX-11M-PLUS VERSION 4.5 BY:C; ; D. Carroll 20-June-1989 15.02; 7; DC114 - Modify mP scheduling algorithm to take into E(; consideration possible URM conflicts; ; D. Carroll 19-Sep-1993 15.03;.<; DC238 - Allow P/OS checkpointing algorithm to be selected%; on standard RSX-11M-PLUS systems. ;N$; Modified for RSX-11M-PLUS V4.6 by:;R; D. Carroll 18-Oct-1995 15.04X:; DC404 - Include PSECT statement to allow ICB pool to be ; fully extended during sysgen;; "; TASK REQUEST RELATED SUBROUTINES;Y; MACRO LIBRARY CALLS-;e* .MCALL HDRDF$,ITBDF$,PCBDF$,TCBDF$,BGCK001ibjbkb a a a$A .IF DF N$$DIR .MCALL LNMDF$' LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETSa .ENDC ;DF N$$DIR.% HDRDF$ ;DEFINE TASK HEADER OFFSETSn2 ITBDF$ ;DEFINE INTERRUPT TRANSFER BLOCK OFFSETS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS69 TCBDF$ ,,SYSDEF ;DEFINE TASK CONTOL BLOCK OFFSETS & LGTHu .IF DF A$$CNT .MCALL ACNDF$ ACNDF$ ;ACCOUNTING OFFSETS  .ENDC .IF DF C$$RTK .MCALL CPRDF$ CPRDF$Y .ENDC MAP6=140000. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;DC404;+; **-$ABCTK-ABORT CURRENT TASK; **-$ABTSK-ABORT TASK;aK; THIS ROUTINE IS CALLED TO MARK A TASK FOR ABORT AND TO FORCE A TASK EXIT.DG; THE REASON FOR ABORT AND THE CURRENT OUTSTANDING I/O COUNT ARE STOREDO$; IN THE FIRST TASK EVENT FLAG WORD.;E ; INPUTS:L;O; R0=REASON FOR ABORT.E; R2=EXTENDED ABORTER INFORMATION (VALID ONLY IF R0=S.CABO OR S.CPMD)N; ; OUTPUTS:;KD; THE TASK IS MARKED FOR ABORT AND A CONDITIONAL SCHEDULE REQUEST IS; SET.;-6$ABCTK::MOV $TKTCB,R1 ;SET TCB ADDRESS TO CURRENT TASK=$ABTSK::BIC #TS.STP,T.STAT(R1) ;REMOVE POSSIBLE MCR BLOCK BITI1 .IF DF C$$RTK ;IF REMOTE TASK SERVICE SUPPORTED A BIT #T4.P0,T.ST4(R1);DOES THIS TASK HAVE AN ASSOCIATED P0 IMAGE?A5 BEQ 3$ ;NOPE, CONTINUE WITH NORMAL ABORT PROCESSING  MOV R0,-(SP) ;SAVE ABORT CODE MOV R1,-(SP) ;SAVE TCBE' MOV R2,-(SP) ;SAVE ABORTER INFORMATION & MOV #MAP6,R2 ;BASE ADDRESS FOR PACKET, MOV $CPOUT,R0 ;GET FIRST OUTSTANDING PACKET'101$: BEQ 25$ ;IF NONE, LEAVE IT ALONET MOV R0,@#KISAR6 ;MAP THE PACKET+ CMP R1,H$TCB(R2) ;IS THIS THE CORRECT TCB?E BNE 1$ ;NO3 CMPB #HT$VMS,H$TYPE(R2) ;IS THIS THE RIGHT PACKET? ' BEQ 2$ ;YES, SEND THE P0 ABORT PACKETT61$: MOV H$LINK(R2),R0 ;GET THE NEXT PACKET IN THE LIST" BR 101$ ;GO BACK TO CHECK IT OUT2$:M0 DEC (R2) ;DECREMENT THE LENGTH OF THE P0 BLOCK CLR -(SP) ;GET A STORAGE SPACE, MOVB (R2),(SP) ;GET THE LENGTH OF THE BLOCK& ADD (SP)+,R0 ;GET THE NEW PACKET BIAS8 MOV R0,@#KISAR6 ;MOVE TO LAST BLOCK OF ORIGINAL REQUEST" MOV #1,(R2) ;LENGTH OF ONE BLOCK+ MOVB #HT$AP0,H$TYPE(R2) ;SET P0 ABORT TYPEE$ MOV $TKTCB,-(SP) ;SAVE CURRENT TASK+ MOV R1,$TKTCB ;MOVE IN TASK WE'RE ABORTING 1 CPSEN$ #SN$DET,R0,#H$SIZE ;SEND P0 ABORT REQUESTN' MOV (SP)+,$TKTCB ;RESTORE CURRENT TASKT.25$: MOV (SP)+,R2 ;RESTORE ABORTER INFORMATION MOV (SP)+,R1 ;RESTORE TCB! MOV (SP)+,R0 ;RESTORE ABORT CODE 3$:( .ENDC ;C$$RTK* CMP R0,#S.CABO ;ABORT BY DIRECTIVE OR MCR BEQ 4$ ;IF EQ YES#" CMP R0,#S.CTKN ;QUIET TASK ABORT?, BEQ 4$ ;IF EQ YES, ISSUE ABORT ASTS IF ANY CMP R0,#S.CPMD ;ABORT WITH PMD? BNE 7$ ;IF NE NO4$: SAVNR ;SAVE R4 AND R5K0 MOV #AS.REA,R4 ;GET CODE FOR REQUESTED EXIT AST MOV R1,-(SP) ;SAVE TCB ADDRESSP MOV R0,-(SP) ;SAVE ABORT CODE' MOV R2,-(SP) ;SAVE ABORTER INFORMATIONP MOV R1,R5 ;COPY TCB ADDRESSI 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?S BEQ 7$ ;IF EQ NO7 BIT #T2.REX,T.ST2(R1) ;HAS ABORT AST ALREADY OCCURRED?$ BEQ 7$ ;IF EQ NO MOV R1,R0 ;COPY TCB ADDRESSD BR 10$ ;RESCHEDULE TASKM5$: TST (SP)+ ;CLEAN STACK6 MOV #4,A.PRM(R1) ;STORE NUMBER OF AST PARAMETER BYTES. MOV R2,A.PRM+2(R1) ;STORE ABORTER INFORMATION/ RETURN ;$NXTSK ALREADY CALLED, SIMPLY RETURNO(7$: BIT #T3.ACP,T.ST3(R1) ;ACP ABORTING? BEQ 8$ ;IF EQ NO) BIT #T3.PMD,T.ST3(R1) ;IS PMD REQUESTED?O0 BNE 8$ ;IF NE NO (NOTE: T3.PMD=1 MEANS NO PMD)7 BGCK$A BF.XIT,BE.ACP,FATAL ;CRASH SYSTEM ON ACP ABORTSA.8$: MOV R0,T.EFLG(R1) ;INSERT REASON FOR ABORT8 MOVB T.IOC(R1),T.EFLG+1(R1) ;SAVE OUTSTANDING I/O COUNT .IF DF M$$PRO4 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 YES 7 MOV #EX$SEV,T.EFLG+2(R1) ;SET SEVERE ERROR EXIT STATUS?9$: ;REFERENCE SYMBOL .ENDC MOV R1,R0 ;COPY TCB ADDRESS80 ADD #T.STAT,R1 ;POINT TO FIRS00t__DATADATADATADATAT TASK STATUS WORD% BIC #TS.CKR,(R1)+ ;CLEAR STATUS BITSA3 BIC #T2.SEF!T2.STP!T2.SPN,(R1) ;MAKE TASK RUNNABLEA= BIS #T2.AST!T2.DST!T2.HLT!T2.ABO,(R1) ;DSBL AST'S & FRC EXIT .IF DF M$$PRO8 BIT #^C,-(R1) ;OUT FOR INITIAL LOAD OR BLOCKED? .IFF4 TST -(R1) ;OUT FOR INITIAL LOAD OR OTHERWISE BLKD? .ENDC BNE 10$ ;IF NE YES1 CALL $SETCR ;SET A CONDITIONAL SCHEDULE REQUEST(10$: MOV T.PCB(R0),R0 ;POINT TO TASK PCB6 CALLR $NXTSK ;REALLOCATE TASK PARTITION IF NECESSARY;+-; **-$BILDS-BUILD STACK AND INITIALIZE HEADERT;BG; THIS ROUTINE SETS UP THE TASK STACK AND INITIALIZES THE HEADER. IT ISTG; CALLED PRIOR TO PLACING A TASK INTO CONTENTION FOR THE PROCESSOR WHENBD; AN EXECUTION REQUEST IS MADE FOR A TASK THAT IS FIXED IN MEMORY OR1; WHEN A DISK RESIDENT TASK HAS FINISHED LOADING.;. ; INPUTS:B;12; R0=ADDRESS OF THE TCB OF THE TASK TO INITIALIZE.;L ; OUTPUTS:;:.; 1-TASK LOCAL EVENT FLAGS 1.-32. ARE CLEARED.'; 2-CURRENT UIC IS SETUP IN THE HEADER.AJ; 3-TASK CONTEXT IS SETUP TO CAUSE THE TASK TO START EXECUTION AT ITS ENTR>; 4-REDISPATCHING OF THE PROCESSOR IS CONDITIONALLY REQUESTED.;D; R3 IS PRESERVED ACROSS CALL.;-1$BILDS::MOV T.PCB(R0),R1 ;GET ADDRESS OF TASK PCBI .IF DF X$$HDR5 MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING FOR XTRNL HDRA) MOV P.HDR(R1),-(SP) ;SAVE HEADER POINTER  BNE 5$ ;IF NE INTERNAL HEADER - MOV P.REL(R1),KISAR6 ;MAP TO EXTERNAL HEADERC2 MOV #140000,(SP) ;RESET VIRTUAL ADDRESS OF HEADER/5$: MOV (SP)+,R1 ;GET VIRTUAL ADDRESS OF HEADERU .IFF ; DF X$$HDRO- MOV P.HDR(R1),R1 ;GET ADDRESS OF TASK HEADERF .ENDC ; DF X$$HDR- MOV T.EFLG(R0),H.CUIC(R1) ;SET SPECIFIED UICS" BNE 10$ ;IF NE UIC WAS SPECIFIED+ MOV H.DUIC(R1),H.CUIC(R1) ;SET DEFAULT UICR .IF DF M$$MUP BR 15$ ; .IFTF10$: ;REF LABEL .IFT-+ MOV T.ACTL(R0),H.DUIC(R1) ;SET DEFAULT UICE .ENDC 15$: ;R .IF DF A$$CNT MOV KISAR5,-(SP) ;SAVE MAPPING 1 MOV T.ACN(R0),KISAR5 ;MAP FIRST ACCOUNTING BLOCK;' BEQ 16$ ;IF EQ, NO ACCOUNTING ON TASK + CMPB #BT.TAB,@#B.TYP+120000 ;IS THIS A TABO BNE 16$ ;IF NE NON4 MOV H.CUIC(R1),@#B.PUIC+120000 ;COPY PROTECTION UIC1 MOV H.DUIC(R1),@#B.CUIC+120000 ;COPY CURRENT UICV+ 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 ABORTA BNE 20$ ;IF NE YES .IF DF M$$PRO. MOV T.PCB(R0),R2 ;GET TASK REGION PCB ADDRESS< MOV T.RRM(R0),P.RRM(R2) ;SAVE THE TASK'S INSTALLED AFFINITY1 CALL $SETAT ;SET UP THE TASK'S RUNNING AFFINITY+ .ENDC- CLR T.EFLG(R0) ;CLEAR TASK LOCAL EVENT FLAGS,! BIT #T3.ACP,T.ST3(R0) ;TASK ACP?C BNE 17$ ;IF NE YES CLR T.EFLG+2(R0) ;R17$: ;REFERENCE SYMBOLB .IF DF M$$PRO1 CALL $TSTAT ;ARE THE REQUIRED BUS RUNS PRESENT?N BCC 20$ ;IF CC YES MOV R0,-(SP) ;SAVE REGISTERSO MOV R1,-(SP) ;$ MOV R3,-(SP) ; MOV R0,R1 ;COPY TCB ADDRESS)$ MOV #S.CAFF,R0 ;GET TKTN ABORT CODE CALL $ABTSK ;ABORT THE TASKT MOV (SP)+,R3 ;RESTORE REGISTERS MOV (SP)+,R1 ;  MOV (SP)+,R0 ;F .ENDC220$: MOV H.ISP(R1),(R1) ;SET INITIAL STACK POINTER. MOV H.GARD(R1),R2 ;POINT TO CONTEXT SAVE AREA SUB #16,R2 ;POINT TO SAVED PCR( MOV H.IPC(R1),(R2) ;SET INITIAL PC WORD) MOV H.IPS(R1),-(R2) ;SET INITIAL PS WORDU .IF DF C$$RTK ;REMOTE TASK 0 BIT #F5.RTK,$FMSK5 ;ARE REMOTE TASKS BEING USED BEQ 30$ ;IF EQ NO7 TSTB T.TKI(R0) ;HAS THIS TASK HAD CONTACT WITH CPRAME? 4 BEQ 30$ ;IF EQ, NO - DON'T NEED TO CLEAR LUN TABLE= CLRB T.TKI(R0) ;INDICATE THAT NO TASK START REQUEST HAS BEENN ; MADE FOR THIS TASK YET! .IF DF C$$RTB ;RUN TIME BINDINGG0 BIT #F5.RTB,$FMSK5 ;RUN TIME BINDING TURNED ON? BEQ 30$ ;IF EQ NO" MOV T.PCB(R0),R3 ;GET PCB ADDRESS( BIT #PS.FXD,P.STAT(R3) ;IS TASK FIXED?0 BEQ 30$ ;IF EQ NO, NO NEED TO CLEAR LUN TABLE MOV R0,-(SP) ;SAVE R0 MOV R5,-(SP) ; AND R5 MOV R3,-(SP) ; AND R32 MOV R0,R5 ;PUT TCB ADDRESS WHERE $MPLND WANTS IT# ADD #H.NLUN,R1 ;POINT TO LUN TABLEL! MOV (R1)+,R3 001ibjbkb a a a;GET NUMBER OF LUNST%25$: MOV (R1),R0 ;GET LUN ASSIGNMENT  BEQ 27$ ;IF EQ, NOT ASSIGNED CALL $MPLND ;FOLLOW REDIRECTS/ CMP (R0),$XXLOW ;MIGHT IT BE A GENERIC DEVICE?B BLO 27$ ;IF LO, NO) CMP (R0),$XXHGH ;IS IT A GENERIC DEVICE?S BHI 27$ ;IF HI, NO 26$: CLR (R1)+ ;CLEAR LUN ENTRY CLR (R1)+ ;L SOB R3,25$ ;LOOP UNTIL DONE  BR 28$ ;DONE(27$: CMP (R1)+,(R1)+ ;SKIP OVER THIS ONE SOB R3,25$ ;LOOP UNTIL DONEN28$: MOV (SP)+,R3 ;RESTORE R3T MOV (SP)+,R5 ; AND R5 MOV (SP)+,R0 ; AND R0 .ENDC ;C$$RTB30$: .ENDC ;C$$RTK .IF DF X$$HDR+ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGI .ENDC ; DF X$$HDR;+(; **-$ACTTK-PUT TASK IN ACTIVE TASK LIST;OG; THIS ROUTINE IS CALLED TO PUT AN ACTIVE TASK IN THE ACTIVE TASK LIST.;: ; INPUTS: ;E>; R0=ADDRESS OF THE TCB OF THE TASK TO PUT IN THE ACTIVE LIST.; ; OUTPUTS:;; THE SPECIFIED TASK IS MERGED INTO THE ACTIVE TASK LIST BYU ; PRIORITY.;:; R3 IS PRESERVED ACROSS CALL.;-:$ACTTK::MOV #$ACTHD-T.ACTL,R1 ;SET ADDRESS OF PREVIOUS TCB-10$: MOV R1,R2 ;SAVE ADDRESS OF PREVIOUS TCB++ MOV T.ACTL(R2),R1 ;GET ADDRESS OF NEXT TCB;8 CMPB T.PRI(R1),T.PRI(R0) ;TASK HIGHER OR SAME PRIORITY? BHIS 10$ ;IF HIS YES- MOV R0,T.ACTL(R2) ;LINK NEW TASK TO PREVIOUSS0 MOV R1,T.ACTL(R0) ;SET LINK TO NEXT IN NEW TASK;+,; **-$SETCR-SET CONDITIONAL SCHEDULE REQUEST ; **-$SETRQ-SET SCHEDULE REQUEST1; **-$SETRT-SET SCHEDULE REQUEST FOR CURRENT TASK;@; THIS ROUTINE IS CALLED TO FORCE REDISPATCHING OF THE PROCESSORC; FROM A SPECIFIED POSITION IN THE TASK LIST. IF A PREVIOUS REQUESTI?; HAS BEEN SET, THEN REDISPATCHING STARTS AT WHICH EVER REQUESTR; HAS THE HIGHEST PRIORITY.O;A ; INPUTS:?;B; IF ENTRY AT $SETRT, THEN-; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.R$; IF ENTRY AT $SETRQ OR $SETCR, THEN1; R0=ADDRESS OF THE TCB TO START DISPATCHING AT.Q;T ; OUTPUTS:;E:; A SCHEDULE REQUEST IS SET WHICH WILL FORCE A REDISPATCH-6; ING OF THE PROCESSOR WHEN A SYSTEM EXIT IS EXECUTED.;H&; R2 AND R3 ARE PRESERVED ACROSS CALL.8; R0 IS PRESERVED ACROSS CALL IF ENTRY IS NOT AT $SETRT.;- .IF NDF M$$PROG .ENABL LSBH6$SETCR::CMP R0,$TKTCB ;REQUESTED TASK SAME AS CURRENT? BEQ $SETRQ ;IF EQ YESS8 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 EVENT/$SETRT::MOV R5,R0 ;SET ADDRESS OF DISPATCH TCBA5$SETRQ::MOV @$RQSCH,R1 ;GET PREVIOUS SCHEDULE REQUEST $ 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 PRIORITIES., BHI 30$ ;IF HI PREVIOUS IS HIGHER PRIORITY BEQ 10$ ;IF EQ SAME PRIORITY)20$: MOV R0,@$RQSCH ;SET SCHEDULE REQUESTR30$: RETURN ;E .DSABL LSBB .IFF ;NDF,M$$PROB .ENABL LSBF;+E; Search for lowest priority rescheduled or currently executing task.TA; If it is lower than reschedule request, then force a reschedule;0; request for that processor, URM's allowing ...;-$SETCR::MOV R2,-(SP) ; Save R28 BIT #TS.RUN,T.STAT(R0) ; Is task running on another CPU BNE 40$ ; If NE, yes.5$: MOV #$RQTAB,R2 ; Point to reschedule table6 MOV #377,-(SP) ; Initialize lowest priority cell with% ; maximum possible priority value 310$: 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 into ; priority table415$: BIT $BTMSK-$RQTAB-2(R2),$URMST ; Is CPU online? BNE 20$ ; If NE, yes17$: TST (SP)+ ; Clean stack$ BR 30$ ; Try for next CPUQ@20$: BIT $CRMTB-$RQTAB-2(R2),T.RRM(R0) ; Will this processor do?. BNE 17$ ; If NE, we're missing something ..., CMP R0,-2(R2) ; Task already rescheduled??? BNE 25$ ; If NE, no' CMP (SP)+,(SP)+ ; Clean stack prior toi BR 80$ ; exit -25$: ADD #T.PRI,(SP) ; Point to task priorityQ* MOVB @(SP)+,1(SP) ; Pick up task priority/ CMPB (SP),1(SP) ; Current priorit00t__DATADATADATADATAy low or same2 BLO 30$ ; If LO, yes2 BHI 27$ ; If HI, no -- don't change low priority;+=; Priority is the same as the current lowest. if this is our2>; CPU, then we will be new lowest priority processor. if not, ; no change.;-! CMP $RQSCH,R2 ; Is this our CPU?e" BNE 30$ ; If NE, no -- no change.27$: SWAB (SP) ; Else set new lowest priority+ MOV R2,R1 ; Save reschedule table pointer;030$: CMP R2,#$RQTAB+ ; at end of table BLO 10$ ; If LO, no 2 CMPB (SP)+,T.PRI(R0) ; Schedule request required? BHI 80$ ; If HI, no  BLO 60$ ; If LO, yes<35$: MOV (SP)+,R2 ; Else effect significant event because we& ; don't know which TCB comes first ; in ATL! CALLR $DRDSE ; exit thru $DRDSE ;+:; Task is in execution -- Find the processor and perform a8; $SETRQ for that processor. This generalizes the single; processor $SETCR.R;18; Include verification path to insure that a task is not*; scheduled on an incompatable processor.;-(40$: MOV #$TKTAB,R1 ; Get start of table/45$: CMP (R1)+,R0 ; Is task active on this CPU? % BNE 45$ ; If NE, no -- try next CPUe7 ADD #$RQTAB-$TKTAB-2,R1 ; Point into $RQTAB for $SETRQh, BR 50$ ; Enter $SETRQ, already in progress2$SETRT::MOV R5,R0 ; Set address of dispatch table8$SETRQ::MOV $RQSCH,R1 ; Pick up reschedule table pointer MOV R2,-(SP) ; Save R2i;+C; This code sgement is based upon the fact that a task which hastC; an incompatable URM will not be allowed to return to user mode onMH; a processor which is incompatable, if a reschedule request is pending.;->50$: BIT $CRMTB-$RQTAB(R1),T.RRM(R0) ; Will this processor do?$ BEQ 55$ ; if EQ, yup, continue ...6 BIT #TS.RUN,T.STAT(R0) ; is the task active on a CPU?* BEQ 5$ ; nope, reschedule on another CPU+ CMP $RQSCH,R1 ; is it active on "this" CPUt' BNE 80$ ; if NE, nope, do nothing ...+7 MOV $ACTHD,(R1) ; force significant event for this CPU / BR 5$ ; and force a reschedule on another CPUo655$: MOV (R1)+,R2 ; Pick up current reschedule pointer BEQ 60$ ; If EQ there is nonet' CMP R0,R2 ; Task already rescheduled?R BEQ 80$ ; If EQ, yes. CMPB T.PRI(R2),T.PRI(R0) ; Is previous higher$ BHI 80$ ; If HI, yes -- do nothing0 BNE 60$ ; If NE, yes -- set reschedule request6 MOV $ACTHD,-(R1) ; Set significant event for this CPU& BR 70$ ; Exit thru notification code*60$: MOV R0,-(R1) ; Set reschedule request;+@; At this point in a multiprocessor system, we have just changedB; the reschedule pointer for some processor. we want to interrupt!; him to inform him of that fact.R;-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 service ULOCK$ $FORKL,SPINt MTPS #0 ; Back to PR0 80$: MOV (SP)+,R2 ; Restore R2 RETURN; .DSABL LSBf .ENDC ;NDF,M$$PRO;+<; **-$SETMG/$SETFG-SET EVENT FLAG AND UNLOCK IF GROUP GLOBAL;r@; THESE ROUTINES SET AN EVENT FLAG AND TAKE CARE OF THE REQUIRED?; SCHEDULING. IF THE EVENT FLAG WAS GROUP GLOBAL, THE USE COUNTa?; FOR THAT FLAG'S GROUP GLOBAL CONTROL BLOCK IS DECREMENTED. IFy>; THE CONTROL BLOCK IS MARKED FOR DELETE AND THE COUNT GOES TO; ZERO, IT WILL BE DEALLOCATED.o;n ; INPUTS:e;U<; R0=EVENT FLAG NUMBER ($SETFG) OR EVENT FLAG MASK ($SETMG).+; R1=EVENT FLAG WORD ADDRESS ($SETMG ONLY).N-; R5=TCB ADDRESS FOR WHICH FLAG IS BEING SET.E;T ; OUTPUTS:;K+; R0=TCB ADDRESS OF TASK WHOSE FLAG WAS SET ; R3 IS PRESERVED.;E;- .ENABL LSB '$SETMG::CALL $SETM ;SET THE EVENT FLAGB BR 5$ ;JOIN COMMON CODEH'$SETFG::CALL $SETF ;SET THE EVENT FLAGE5$: ;REFERENCE LABELT .IF DF G$$GEF* BNE 15$ ;IF NE FLAG WAS COMMON OR GLOBAL3 DECB T.GGF(R5) ;DECR GRP GLOBAL USE COUNT FOR TASKF8 ADD #,R1 ;POINT TO GROUP GLOBAL USE COUNT0 ASR R1 ;SHIFT OFF POSSIBLE SECOND GRP GBL FLAG2 SBC R1 ;IF IT WAS SET SUBTRACT ONE WHICH BECOMES, ASL R1 ;THREE WHEN JOINED WITH THE ASR/ASL, DEC (R1) ;DECREMENT GROUP GLOBAL USE COUNT/ BNE 15$ ;IF NE THESE001ibjbkb a a a EVENT FLAGS STILL IN USE 6 BITB #GS.DEL,-(R1) ;FLAGS MARKED FOR DELETE? (G.STAT) BEQ 15$ ;IF EQ NOE MOV R0,-(SP) ;SAVE TCB ADDRESS MOV R3,-(SP) ;SAVE R3 MOV R4,-(SP) ;SAVE R4( MOVB -(R1),R4 ;GET GROUP NUMBER (G.GRP)4 CALL $SRGEF ;FIND THESE FLAGS IN GROUP GLOBAL LIST6 CALL $ELGEF ;ELIMINATE THIS GROUP GLOBAL CONTROL BLK MOV (SP)+,R4 ;RESTORE R4  MOV (SP)+,R3 ;RESTORE R3M" MOV (SP)+,R0 ;RESTORE TCB ADDRESS .ENDC ; DF G$$GEF 15$: RETURNR .DSABL LSBC;+; **-$SETF/$SETM-SET EVENT FLAGS;L@; THESE ROUTINES SET AN EVENT FLAG AND TAKE CARE OF THE REQUIRED; RESCHEDULING.N; ; INPUTS:P;S:; R0=EVENT FLAG NUMBER ($SETF) OR EVENT FLAG MASK ($SETM).*; R1=EVENT FLAG WORD ADDRESS ($SETM ONLY).-; R5=TCB ADDRESS FOR WHICH FLAG IS BEING SET.O; ; OUTPUTS:;G+; R0=TCB ADDRESS OF TASK WHOSE FLAG WAS SET; R1=EVENT FLAG WORD ADDRESS; R3 IS PRESERVED.;M,; IF GROUP GLOBAL EVENT FLAGS ARE SUPPORTED:(; Z=0 IF LOCAL OR COMMON EVENT FLAG SET%; Z=1 IF GROUP GLOBAL EVENT FLAG SETF;S;-;$SETF:: CALL $CEFI ;CONVERT EVENT FLAG TO MASK AND ADDRESSR.$SETM:: CLR -(SP) ;CLR GROUP GLOBAL INDICATOR+ MOV R1,-(SP) ;SAVE EVENT FLAG WORD ADDRESS$0 BIC #1,R1 ;CLEAR GROUP GLOBAL SECOND WORD FLAGA BIT #T2.ABO!T2.HLT,T.ST2(R5) ;TASK EXITING OR MARKED FOR ABORT ?G2 BNE 10$ ;IF NE YES, DO NOT TOUCH EVENT FLAG WORD! BIS R0,(R1) ;SET THE EVENT FLAGR,10$: MOV R5,R0 ;COPY TCB ADDRESS FOR $SETCR% TST R1 ;WAS AN EVENT FLAG SPECIFIED # BEQ 19$ ;IF EQ NO, DON'T SCHEDULEL, CMP R1,#$COMEF+2 ;IS IT A COMMON EVENT FLAG BLOS 20$ ;IF LOS YES SUB R5,R1 ;IS IT GROUP GLOBAL? BLO 15$ ;IF LO YES SUB #T.EFLG+2,R1 ;IS IT LOCAL?V BLE 18$ ;IF LE YES315$: DEC 2(SP) ;INDICATE SETTING GROUP GLOBAL FLAGB BR 20$ ;JOIN COMMON CODE18$: ;REF LABEL. BIT #T2.SEF,T.ST2(R0) ;TASK IN STOPFOR STATE? BNE 185$ ;IF NE YESB* TSTB T.TIO(R0) ;OUTSTANDING BUFFERED I/O?$ BEQ 30$ ;IF EQ NO, DON'T UNSTOP IT/ BIT #T2.WFR!,T.ST2(R0) ;TASK IN WFR?I$ BEQ 30$ ;IF EQ NO, DON'T UNSTOP IT@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 TCB1- CALL $EXRQN ;UNSTOP AND REQUEST TASK TO RUNN MOV (SP)+,R0 ;RESTORE TCB MOV (SP)+,R3 ;RESTORE R3 519$: TST $SIGFL ;TASK WAITING FOR SIGNIFICANT EVENT?T BEQ 30$ ;IF EQ NON,20$: CALL $DRDSE ;DECLARE SIGNIFICANT EVENT BR 40$ ;JOIN COMMON CODE/30$: CALL $SETCR ;FORCE CONDITIONAL REDISPATCH 240$: MOV (SP)+,R1 ;RESTORE EVENT FLAG WORD ADDRESS1 INC (SP)+ ;CLEAN STACK AND SET Z-BIT FOR RETURNT RETURN ;?;+5; **-$DCAST-DECLARE COMMAND ARRIVAL AST TRAP FOR CLIS3;M?; THIS ROUTINE IS CALLED BY THE COMMAND QUEUEING ROUTINE $QCPKT 9; WHEN IT IS QUEUEING A COMMAND TO A CLI TASK. IF THE CLI >; HAS SPECIFIED THE COMMAND ARRIVAL AST, AN ATTEMPT IS MADE TO?; ALLOCATE A NEW AST BLOCK FROM THE POOL. THIS IS DONE IN ORDER >; TO ELIMINATE THE WINDOW THAT OCCURS WHEN THE AST BLOCK WOULD:; NORMALLY BE UNLINKED FROM T.SAST AND LINKED INTO T.ASTL.B; IT WOULD BE UNACCEPTABLE FOR A CLI TO LOSE A COMMAND DURING THIS?; WINDOW. IF THE ALLOCATION FAILS HOWEVER, THE CURRENT EXISTINGA; AST BLOCK IS USED. THE WORD AT A.PRM+2 IN THE AST BLOCK IS USED B; AS A FLAG TO THE SYSXT CODE TO INFORM IT IF IT SHOULD DEALLOCATE; OR RELINK THE AST BLOCK.;A ; INPUTS:S;D; R0=TCB ADDRESS OF CLIT; R1=ADDRESS OF COMMAND BUFFER;I ; OUTPUTS:;E4; C=1 IF THE TASK IS NOT SETUP FOR THE SPECIFIED AST6; C=0 IF THE TASK IS SETUP FOR THE AST AND THE AST HAS; BEEN DECLARED&; R1=ADDRESS OF THE AST CONTROL BLOCK;D;- .IF DF A$$CLI$DCAST::SAVNR ;SAVE R4 AND R5E MOV #AS.CAA,R4 ;SET AST TYPE # MOV R0,R5 ;COPY CLI'S TCB ADDRESSS! MOV R1,R3 ;COPY COMMAND ADDRESSE .IFF ;A$$CLIF $DCAST==-1 .ENDC ;A$$CLI;+; **-$DASTT-DECLARE AST TRAP;SC; THIS ROUTINE IS CALLED TO DECLARE A NON-I/O RELATED AST TRAP. THE E; TCB OF THE SPECIFIED TASK IS EXAMINED TO DETERMINE IF THE SPECIFIED=<; AST IS ENABLED (SETUP). IF IT IS THEN THE AS00t__DATADATADATADATAT IS DECLARED.;R ; INPUTS:D;S); R3=COMMAND ADDRESS IF AST TYPE = AS.CAAF2; R4=CODE INDICATING WHICH AST SHOULD BE DECLARED.;; R5=ADDRESS OF THE TCB OF THE TASK TO DECLARE THE AST FOR.S; ; OUTPUTS:;P5; C=1 IF THE TASK IS NOT SETUP FOR THE SPECIFIED AST..E; C=0 IF THE TASK IS SETUP FOR THE AST AND THE AST HAS BEEN DECLARED.I'; R1=ADDRESS OF THE AST CONTROL BLOCK. ;P'; NOTE: R4 IS DESTROYED BY THIS ROUTINEA;- .ENABL LSBI4$DASTT::CALL $SRAST ;SEARCH FOR SPECIFIED AST BLOCK BCS 10$ ;IF CS, THERE IS NONEN .IF DF A$$CLI8 CMP A.CBL(R0),# ;DECLARING CMD ARRIVAL AST BNE 1$ ;IF NE NO0 MOV R1,-(SP) ;SAVE POINTER TO AST BLOCK ADDRESS+ MOV #C.LGTH,R1 ;GET LENGTH OF AN AST BLOCK ) CALL $ALOCB ;ALLOCATE ONE FROM THE POOLA3 MOV (SP)+,R4 ;RESTORE POINTER TO AST BLOCK ADDRESSA0 MOV (R4),R1 ;GET ADDRESS OF EXISTING AST BLOCK( BCC 105$ ;IF CC, SUCCESSFUL ALLOCATION6 MOV SP,A.PRM+2(R1) ;NON-ZERO TO FORCE SYSXT TO RELINK* MOV (R1),(R4) ;REMOVE AST BLOCK FROM LIST BR 107$ ;H+105$: MOV R1,R4 ;COPY POINTER TO OLD BLOCKL$ MOV R0,R1 ;COPY NEW AST BLOCK ADDR! CMP (R4)+,(R0)+ ;SKIP LINK WORDSR MOV (R4)+,(R0)+ ;COPY A.CBL MOV (R4)+,(R0)+ ;COPY A.BYT MOV (R4)+,(R0)+ ;COPY A.AST MOV (R4)+,(R0)+ ;COPY A.NPR3 CLR A.PRM+2(R1) ;ZERO TO FORCE SYSXT TO DEALLOCATEL8107$: MOV R3,A.PRM(R1) ;SET COMMAND ADDRESS IN AST BLOCK# MOV R5,R0 ;SET TCB ADDRESS OF CLIL BR $QASTT ;QUEUE AST1$:  .ENDC ;A$$CLI8 CMPB A.CBL+1(R0),#AS.REA ;IS THIS A REQUESTED EXIT AST? BNE 2$ ;IF NE NO6 BIS #T2.REX,T.ST2(R5) ;INDICATE AST HAS BEEN DECLARED92$: MOV (R0),(R1) ;REMOVE THE CONTROL BLOCK FROM THE LISTM2 MOV R0,R1 ;SAVE ADDRESS OF THE AST CONTROL BLOCK MOV R5,R0 ;COPY TCB ADDRESSA .IF DF C$$INT BR $QASTT ;GO QUEUE THE ASTE;+.; **-$DQAC-DEQUEUE AST BLOCK QUEUED BY $QASTC.!; (TO BE CALLED FROM SYSXT ONLY).K;M; INPUT:; R0 POINTER TO AST BLOCKB;Q ; OUTPUT:E+; A.CBL SET TO 1 TO INDICATE AST BLOCK FREE+; (NOT IN AST QUEUE).A;Q; REGISTERS ALTERED: NONE;;-*$DQAC:: INC A.CBL(R0) ; SET AST BLOCK FREE RETURNR;+; **-$QASTC-QUEUE AST TO TASK.;L?; THIS IS A VARIANT OF $QASTT TO BE USED BY A TASK ISR, ENTEREDB4; VIA A VECTOR CONNECTED TO VIA THE CINT$ DIRECTIVE.;; INPUT:!; R5 POINTER TO FORK BLOCK IN ITB$;C ; OUTPUT:T=; CC-C 0 IF OK, 1 IF AST ADDRESS NOT SPECIFIED IN CINT$ CALL.M; 9; NOTE - IF THE AST BLOCK IS ALREADY QUEUED FOR THE TASK, &; NO ACTION IS TAKEN. RETURN CC-C = 0.;T ; REGISTERS ALTERED: R0,R1,R2,R3;-$QASTC::MOV R5,R1A$ ADD #X.AST-X.FORK,R1 ;GET AST BLOCK/ 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 NOD! BEQ 10$ ;N - EXIT WITH CC-C = 1 ) CLR A.CBL(R1) ;INDICATE AST BLOCK IN USE) MOV X.TCB-X.FORK(R5),R0 ;GET TCB ADDRESSD ;FALL THRU TO $QASTT .ENDC;+; **-$QASTT-QUEUE AST TO TASKY;ED; THIS ROUTINE IS USED TO QUEUE AN AST TO A TASK AND INSURE THE TASKF; WILL BE SCHEDULED AND RECONSIDERED FOR ELIGIBILITY IN THE PARTITION.;R ; INPUTS:B;K'; R0=TCB ADDRESS OF TASK TO RECEIVE ASTT,; R1=ADDRESS OF AST CONTROL BLOCK TO BE USED;T ; OUTPUTS:; ; C=0 ; R1 IS PRESERVED;;-2$QASTT::ADD #T.ASTL,R0 ;POINT TO TASK AST LISTHEAD0 MOV R1,-(SP) ;SAVE ADDRESS OF AST CONTROL BLOCK0 CALL $QINSF ;INSERT CONTROL BLOCK IN AST QUEUE* SUB #T.ASTL,R0 ;POINT BACK TO TCB ADDRESS;+; ** W A R N I N G **E; ; SPM HOOKPOINT NUMBER 08.;A); DO NOT CHANGE THE INSTRUCTION FOLLOWING ; LABEL WITHOUT CHECKING SPM;-+$SPH08==. ;SPM CHANGES THE INSTRUCTION ATE ;THE LOCATION OF THIS LABELA0 CALL @#$SETCR ;SET CONDITIONAL SCHEDULE REQUEST( BIT #T2.STP,T.ST2(R0) ;IS TASK STOPPED? BEQ 5$ ;IF EQ NO$ MOV T.PCB(R0),R0 ;POINT TO TASK PCB( CALL $NXTSK ;REALLOCATE TASK PARTITION35$: MOV (SP)+,R1 ;RESTORE AST CONTROL BLOCK ADDRESSS CLC ;RETURN CARRY CLEAR10$: RETURN ; .DSABL LSBI;+,; **-$SRAST-SEARCH FOR A SPECIFIED AST BLOCK;CH; THIS ROUTINE IS CALLED TO SEAR001ibjbkb a a aCH FOR A SPCIFIC TYPE OF AST CONTROL BLK;= ; INPUTS:A;S5; R4=CODE INDICATING TYPE OF BLOCK TO BE SEARCHED FOR:; R5=TCB ADDRESS OF TASK WHOSE SAST LIST IS TO BE SEARCHED;T ; OUTPUTS:;S-; C=1 IF SPECIFED TYPE OF AST BLOCK NOT FOUND)-; C=0 IF SPECIFIED TYPE OF AST BLOCK IS FOUNDT; R0=ADDRESS OF THE BLOCK+; R1=ADDRESS OF WORD POINTING TO THE BLOCKC;-#$SRAST::MOV R5,R0 ;GET TCB ADDRESS5 ADD #T.SAST,R0 ;POINT TO SPECIFIED AST BLOCK ADDRESSD10$: SEC ;ASSUME FAILURE& MOV R0,R1 ;GET POINTER TO NEXT BLOCK MOV (R0),R0 ;GET LINK WORD BEQ 20$ ;IF EQ, END OF LISTG= CMPB R4,A.CBL+1(R0) ;IS THIS THE BLOCK OF THE SPECIFIED TYPEO BNE 10$ ;NO IF NE 20$: RETURN;+%; **-$SRPRO-SEARCH PROTOTYPE TCB LIST ;CB; THIS ROUTINE IS CALLED TO SCAN THE SECONDARY POOL TCB LIST FOR AC; SPECIFIC TASK NAME. IF THE SEARCH SUCCEEDS, THEN THE ADDRESS OF A-C; KISAR5 BIAS, WITH THE LOW BIT OF THE ADDRESS SET TO DIFFERENTIATECD; IT FROM A POOL TCB ADDRESS, IS RETURNED. IF THE SEARCH FAILS, THEN?; THE ROUTINE DROPS INTO $SRSTD TO SEARCH THE PRIMARY TCB LIST.I;Q ; INPUTS:S;+; R3=ADDRESS OF THE TASK NAME TO SEARCH FORE;E ; OUTPUTS:;B,; C=1 IF THE TASK IS NOT IN EITHER TASK LIST; C=0 IF TASK WAS FOUNDB&; R0=ADDRESS OF TCB IN POOL (IF EVEN)0; R0=ADDRESS OF KISAR5 BIAS OF TCB ! 1 (IF ODD);-$SRPRO:: ;REFERENCE LABEL  .IF DF P$$OOL, CALL CLIDSP ;CHECK IF TASK NAME WAS CLI...& MOV KISAR6,-(SP) ;SAVE APR 6 FOR SCAN, MOV $PTCBL,KISAR6 ;MAP TO FIRST TCB IN LIST BEQ 30$ ;IF EQ THERE IS NONE>10$: CMP (R3),140000+T.NAM ;MATCH ON FIRST HALF OF TASK NAME ? BNE 20$ ;IF NE NO 4 CMP 2(R3),140002+T.NAM ;LUCKY SO FAR, SECOND HALF ? BEQ 40$ ;IF EQ YES, THIS IS IT620$: MOV 140000+T.TCBL,KISAR6 ;MAP TO NEXT TCB IN LIST BNE 10$ ;IF NE NOT END OF LIST430$: MOV (SP)+,KISAR6 ;PUT APR 6 BACK AS WE FOUND IT BR SCNSTD ;AND TRY THE STD340$: MOV #$PTCPT,R0 ;POINT TO THE PROTO TCB POINTERK# MOV KISAR6,(R0) ;STORE KISAR6 BIASV2 INC R0 ;INDICATE KISAR5 POINTER, NOT TCB ADDRESS+ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGN$ RETURN ;C IS CLR DUE TO CMP ABOVE .ENDC ;DF P$$OOL ;+(; **-$SRSTD-SEARCH SYSTEM TASK DIRECTORY;FG; THIS ROUTINE IS CALLED TO SEARCH THE TASK DIRECTORY FOR A TASK OF THET; SPECIFIED NAME.;E ; INPUTS:E;T,; R3=ADDRESS OF THE TASK NAME TO SEARCH FOR.;C ; OUTPUTS:;T%; C=1 IF SPECIFIED TASK IS NOT FOUND.V!; C=0 IF SPECIFIED TASK IS FOUND. ; R0=ADDRESS OF THE TCB.;;R*; R1,R2, AND R3 ARE PRESERVED ACROSS CALL.;- .ENABL LSBE&$SRSTD::CALL CLIDSP ;CHECK FOR CLI...1SCNSTD: MOV $TSKHD,R0 ;POINT TO FIRST TCB IN LIST.210$: CMP T.NAM(R0),(R3) ;FIRST HALF OF NAME MATCH? BNE 20$ ;IF NE NOH2 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 NO25$: SEC ;INDICATE FAILURE30$: RETURN ;=;SD; **-CLIDSP-LOCAL ROUTINE TO CHECK IF SUPPLIED TASK NAME IS "CLI..."; C; THIS ROUTINE IS CALLED BY EITHER $SRPRO OR $SRSTD TO CHECK IF THE;>; TASK THEY ARE TRYING TO FIND IS THE CLI DISPATCHER "CLI...".?; IF IT IS, THE ADDRESS OF MCR... IS PUT IN R0, AND A RETURN TO$=; THE CALLER'S CALLER IS EXECUTED. OTHERWISE, A RETURN TO THE?>; APPROPRIATE SCAN ROUTINE IS EXECUTED TO SEARCH THE LIST. ALLH; THIS IS BEING DONE SINCE THERE IS NO ACTUAL CLI... TASK IN THE SYSTEM.E; CLI... IS INTENDED TO BE USED FROM SPWN$ OR RPOI$ TO PASS A COMMANDKC; LINE TO THE TERMINAL'S CLI, WHEREAS MCR... WILL FORCE THE COMMANDI'; TO MCR, REGARDLESS OF CLI ASSIGNMENT. ;K ; INPUTS:R;G; R3=ADDRESS OF TASK NAMEH;" ; OUTPUTS:;I;; IF THE NAME WAS CLI..., THE TCB ADDRESS IS RETURNED IN R0 #; WITH C=0 TO THE CALLER'S CALLER.RA; IF THE NAME WAS NOT CLI..., A RETURN TO THE CALLER IS EXECUTED.E;H;--CLIDSP: CMP #^RCLI,(R3) ;SEARCHING FOR CLI...O BNE 35$ ;IF NE NON CMP #^R...,2(R3) ;MAY HAVE IT BNE 35$ ;IF NE NOW! MOV $MCRPT,R0 ;USE TCB OF MCR...I1 TST (SP)+ ;POP FIRST RETURN ADDRESS AND SET C=0 35$: RETURN;+1; **-$00t__DATADATADATADATAACTRM-REMOVE TASK FROM THE ACTIVE TASK LIST;C; THIS ROUTINE IS CALLED TO REMOVE A TCB FROM THE ACTIVE TASK LIST..; ; INPUTS:R; "; R0=ADDRESS OF THE TCB TO REMOVE.;C ; OUTPUTS:;RB; C=1 IF THERE IS NO ENTRY IN THE LIST THAT MATCHES THE TCB ADDRES3; C=0 IF A MATCHING ENTRY IS REMOVED FROM THE LIST.I;O"; R0 IS PRESERVED ACROSS THE CALL.;3;-3$ACTRM::MOV #$ACTHD-T.ACTL,R1 ;GET ADDR OF LISTHEADC'40$: MOV R1,R2 ;SAVE PREVIOUS TCB ADDRR% MOV T.ACTL(R2),R1 ;GET NEXT TCB ADDR" BEQ 25$ ;IF EQ END OF LIST FOUND( CMP R0,R1 ;DOES NEXT TCB ADDR EQ OURS?# BNE 40$ ;IF NE NO -- KEEP LOOKINGE( MOV T.ACTL(R0),T.ACTL(R2) ;REMOVE ENTRY RETURN ;EXITO .DSABL LSB;+&; **-$SRMUT-SEARCH FOR MULTI-USER TASK; D; THIS ROUTINE CALCULATES THE NAME OF A MULTI-USER TASK ACCORDING TOA; THE NAME OF THE PROTOTYPE TCB AND THE TI: OF THE COPY. IT THEN@; SEARCHES FOR THE COPY OF THE MULTI-USER TASK IN THE TASK LIST.; ; INPUTS:O;T>; R0=ADDRESS OF THE TI: UCB OF THE COPY OF THE MULTI-USER TASK8; R1=FIRST WORD OF THE TASK NAME OF THE COPY OF THE TASK;? ; OUTPUTS:; :; R3=PTR TO CALCULATED TASK NAME (IN $TNAME AND $TNAME+2).;Y,; C=0 IF THE COPY WAS FOUND IN THE TASK LIST; R0=ITS TCB ADDRESSU; 0; C=1 IF THE COPY WAS NOT FOUND IN THE TASK LIST;- .IF DF R$$DSP2$SRMUT::MOV R1,$TNAME ;SET FIRST WORD OF TASK NAME# CLR -(SP) ;ALLOCATE SCRATCH SPACEE MOV (R0),R2 ;POINT TO TI: DCBH( TST (R2)+ ;SKIP OVER LINK WORD (D.LNK)3 SUB (R2)+,R0 ;CALC RELATIVE ADDRESS OF UCB (D.UCB)K1 MOV (R2)+,-(SP) ;PUSH DEVICE NAME OF TI: (D.NAM)H7 MOV (R2)+,-(SP) ;SAVE LOW UNIT NUMBER FOR DCB (D.UNIT)A+ MOV (R2),R1 ;PICK UP SIZE OF UCB (D.UCBL)E2 CALL $DIV ;CALCULATE RELATIVE UNIT NUMBER OF UCB4 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 ASCII. 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 DIGIT $ ADD #'0,R0 ;CONVERT TO ASCII DIGIT% ASRB R1 ;CALCULATE HIGH-ORDER DIGITF ASRB R1 ;P ASRB R1 ;A, 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 DIGITT*20$: MOVB R1,1(SP) ;STORE IN SCRATCH SPACE% MOV SP,R0 ;POINT TO ASCII TASK NAMEE# CALL $CAT5 ;CONVERT TO RAD50 WORDO CMP (SP)+,(SP)+ ;CLEAN STACK 1 MOV #$TNAME,R3 ;POINT TO TASK NAME AREA IN SYSCMF+ MOV R1,2(R3) ;SET SECOND WORD OF TASK NAMEA/ CALLR $SRSTD ;SEARCH FOR TASK NAME AND RETURNF;+; **-$TCBCP-TCB COPY ROUTINE; C; THIS ROUTINE IS CALLED TO COPY AN INSTALLED TCB INTO AN ALLOCATEDRC; TCB AND LINK IT INTO TO THE SYSTEM TASK DIRECTORY. SPECIFICALLY,M"; THIS ROUTINE DOES THE FOLLOWING:;VF; 1. COPY THE CONTENTS OF THE INSTALLED TCB INTO THE ALLOCATED TCB.6; 2. INITIALIZE ALL LISTHEADS IN THE ALLOCATED TCB.A; 3. TRANSFER ANY SEND PACKETS DESTINED FOR THE ALLOCATED TCB.F,; 4. SET UP THE TASK NAME IN THE NEW TCB.C; 5. LINK THE NEW TCB INTO THE SYSTEM TASK DIRECTORY IMMEDIATELY-5; AFTER THE TCB INPUT AS THE PROTOTYPE INSTALLED TCB.A;N ; INPUTS: ;O!; R0=ADDRESS OF THE ALLOCATED TCBN!; R1=ADDRESS OF THE INSTALLED TCBP>; IF R1 IS ODD, THEN R1-1 IS THE ADDRESS OF THE KISAR6 BIAS*; OF A PROTOTYPE TCB IN SECONDARY POOL.?; R3=ADDRESS OF THE TASK NAME DOUBLE-WORD FOR THE ALLOCATED TCBE;C ; OUTPUTS:;N; R0 AND R1 ARE PRESERVED.;-$TCBCP::SAVNR ;SAVE R4 AND R5  .IF DF P$$OOL. MOV KISAR6,-(SP) ;SAVE CURRENT KERNEL MAPPING' BIT #1,R1 ;IS TCB IN SECONDARY POOL ?E BEQ 3$ ;IF EQ NO DEC R1 ;POINT BACK TO BIAS( MOV (R1),KISAR6 ;REMAP TO SEC. POOL TCB/ MOV (R1),(R0)+ ;STORE KISAR6 BIAS IN T.LNK FOR& ;POSSIBLE ERROR RECOVERY BY $REMOV- MOV #140000,R1 ;POINT TO TCB VIRTUAL ADDRESS  BR 4$ ;ENTER COMMON CODE .ENDC ;DF P00ʁ1ibjbkb a a a$$OOL 03$: CLR (R0)+ ;CLEAR AND SKIP LINK WORD (T.LNK)84$: MOVB T.DPRI(R1),(R0)+ ;INIT RUNNING PRIORITY (T.PRI)$ CLRB (R0)+ ;INIT I/O COUNT (T.IOC): MOV T.PCBV(R1),(R0)+ ;COPY POINTER TO PCB VECTOR (T.PCBV) BEQ 5$ ;IF EQ THERE IS NONE 7 ADD #400,@T.PCBV(R1) ;INCREMENT ACCESS COUNT IN VECTOR6,5$: MOV (R3)+,(R0)+ ;STORE TASK NAME (T.NAM) MOV (R3),(R0)+ ;.1 ADD #T.RCVL,R1 ;POINT TO INSTALLED TCB RCVD LISTM CALL 40$ ;SETUP RECEIVE QUEUEA10$: ;MARK T.RCVL CALLC CALL @(SP)+ ;SETUP AST QUEUE% CLR (R0)+ ;CLEAR EFN WORDS (T.EFLG) CLR (R0)+ ;$7 CMP (R0)+,(R0)+ ;POINT TO STATUS WORDS (T.UCB)(T.TCBL)3 MOV #TS.EXE,(R0)+ ;INIT FIRST STATUS WORD (T.STAT),; ADD #T.ST2-T.EFLG,R1 ;POINT TO INSTALLED TCB 2ND STAT WORDH0 MOV (R1)+,(R0) ;COPY SECOND STATUS WORD (T.ST2)= BIC #^CT2.CHK,(R0)+ ;CLEAR ALL BUT CHECKPOINTABILITY (T.ST2)A/ MOV (R1)+,(R0) ;COPY THIRD STATUS WORD (T.ST3) < BIC #T3.REM!T3.MCR!T3.CAL,(R0)+ ;CLR NECESSARY BITS (T.ST3)" MOV (R1)+,(R0)+ ;(T.DPRI & T.LBN) MOV (R1)+,(R0)+ ;(T.LBN+1)0 MOV (R1)+,(R0)+ ;(T.LDV)G* MOV (R1)+,R2 ;PICK UP PCB ADDRESS (T.PCB). MOV P.MAIN(R2),(R0)+ ;SET PCB POINTER (T.PCB) MOV (R1)+,(R0)+ ;(T.MXSZ) CMP (R1)+,(R0)+ ;(T.ACTL)) CALL @(SP)+ ;SET UP ATTACHMENT LISTHEADH+ MOV (R1)+,(R0) ;FOURTH STATUS WORD (T.ST4).4 BIC #T4.PRO!T4.RIN,(R0)+ ;CLEAR NON-PROPAGATED BITS1 MOV (R1)+,(R0)+ ;HDR LENGTH/UNUSED BYTE (T.HDLN)W3 CLR (R0)+ ;GRP GBL USE/BUFFERED I/O (T.GGF,T.TIO)E TST (R1)+ ;POINT TO T.EFLM8 MOV (R1)+,(R0)+ ;COPY POSSIBLE CPU TIME LIMIT IN T.EFLM MOV (R1)+,(R0)+ ;SECOND HALFV .IF DF A$$CNT7 BIT #TS.EXE,T.STAT-T.TKSZ(R1) ;IS SOURCE TASK ACTIVE ?R BNE 15$ ;IF NE, NO. CLR -2(R0) ;YES, THEN DON'T COPY (T.EFLM+2), CLR -4(R0) ;EVENT FLAG MASKS (T.EFLM)15$: ;REFERENCE LABEL .ENDC ; DF A$$CNT1 MOV (R1)+,(R0)+ ;TASK INITIAL LOAD SIZE (T.TKSZ)1 $$$=T.TKSZ+2 .IF DF P$$LAS* MOV (R1)+,(R0)+ ;COPY OFFSET WORD (T.OFF)/ CLR (R0)+ ;CLR SREF WITH EFN COUNT (T.SRCT-1)M* TST (R1)+ ;ADVANCE INSTALLED TCB POINTER3 CALL @(SP)+ ;SET UP RECEIVE BY REFERENCE LISTHEAD 20$: ;MARK T.RRFL CALLA,$$$=T.RRFL+4 ;MARK CURRENT POSITION IN TCB .ENDC .IF DF N$$DIR2 CLR (R0) ;POINTER TO CONTEXT BLOCK (DDS) (T.CTX)( CMP (R0)+,(R1)+ ;INCREMENT TCB POINTERS $$$=T.CTX+2. .ENDC ; DF N$$DIR .IF DF P$$OFF! CALL @(SP)+ ;SETUP OCB LISTHEADK CLR (R0) ;CLEAR RUNDOWN COUNT(& CMP (R0)+,(R1)+ ;ADVANCE TCB POINTERS .ENDC CLR (R0) ;CLEAR T.SAST*$$$=T.SAST ;MARK CURRENT POSITION IN TCB .IF DF M$$PRO/ CMP (R0)+,(R1)+ ;ADVANCE TCB POINTERS TO T.RRM ( MOV (R1)+,(R0)+ ;COPY REQUIRED RUN MASK/ MOV (R1)+,(R0)+ ;COPY INITIAL AFFINITY (T.IRM)D( CLR (R0) ;CLEAR CPU ID AND UNUSED BYTE $$$=T.CPUT .ENDC .IF DF A$$CNT/ CMP (R0)+,(R1)+ ;ADVANCE TCB POINTERS TO T.ACN- CLR (R0) ;CLEAR POINTER TO ACCOUNTING BLOCKL)$$$=T.ACN ;MARK CURRENT POSITION IN TCB .ENDC .IF DF U$$DAS/ CMP (R0)+,(R1)+ ;ADJUST TCB POINTERS TO T.ISIZ=! MOV (R1),(R0) ;COPY I SPACE SIZET $$$=T.ISIZ .ENDC ; DF U$$DAS" SUB #$$$,R0 ;POINT BACK TO START SUB #$$$,R1 ;+ .IF DF P$$OOL' CMP #140000,R1 ;TCB IN PRIMARY POOL ?N BHI 30$ ;IF HI YES 4 MOV #$TSKHD-T.TCBL,R2 ;POINT TO FIRST TCB IN SYSTEM)25$: MOV R2,R1 ;SAVE POINTER TO OLD TCBA. MOV T.TCBL(R2),R2 ;POINT TO NEXT TCB IN LIST BEQ 30$ ;IF EQ THERE IS NONE.: CMPB T.DPRI(R2),T.DPRI(R0) ;TASK BELONG BEFORE THIS TCB ?! BHIS 25$ ;IF HIS NO,KEEP GOINGT30$: ;REFERENCE LABELV .ENDC ; DF P$$OOL7 MOV T.TCBL(R1),T.TCBL(R0) ;LINK ALLOCATED TCB INTO STD0 MOV R0,T.TCBL(R1) ;" TST (SP)+ ;POP COROUTINE ADDRESS .IF DF P$$OOL2 MOV (SP)+,KISAR6 ;RESTORE PREVIOUS KERNEL MAPPING .ENDC ; DF P$$OOL RETURN ;T.40$: CLR (R0) ;INIT LISTHEAD IN ALLOCATED TCB MOV R0,2(R0) ;T .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?I BNE 80$ ;IF NE NOE4 BIT #T3.NSD!T3.ACP,T.ST3-T.RCVL(R1) ;DOES TASK HAVE ;STANDAR00ҁt__DATADATADATADATAD RECEIVE QUEUE ?R( BNE 80$ ;IF NE, NO - DON'T TRY TO COPY .IF DF P$$OOL2 MOV R0,-(SP) ;SAVE LISTHEAD ADDRESS FOR ALLOC TCB0 MOV R1,-(SP) ;SAVE LISTHEAD ADDRESS FOR INS TCB MOV KISAR5,-(SP) ;SAVE KISAR5' MOV R1,R0 ;COPY INSTALLED TCB POINTERC 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 5. MOV @#120002,R1 ;GET NUMBER OF DATA WORDS + 2 ASL R1 ;CONVERT TO BYTES- ADD #120010,R1 ;POINT TO TASK NAME IN PACKET * MOV #120000,R4 ;POINT TO PACKET LINK WORD3 CMP (R1),-2(R3) ;MATCH ON FIRST WORD OF TASK NAME?T BNE 46$ ;IF NE NOC3 CMP 2(R1),(R3) ;MATCH ON SECOND WORD OF TASK NAME?B BNE 46$ ;IF NE NOS" MOV KISAR5,R1 ;GET PACKET ADDRESS- MOV 2(SP),R0 ;GET LISTHEAD FOR ALLOCATED TCB63 CALL $GTSPK ;UNLINK THE PACKET FROM INSTALLED TCBD# MOV R0,R4 ;SET UP TO RESTART SCANK1 MOV 4(SP),R0 ;GET INSTALLED TCB LISTHEAD ADDRESSA+ CALL $QSPIF ;AND LINK IT TO ALLOCATED TCBD BR 46$ ;CONTINUE SCANK%47$: MOV (SP)+,KISAR5 ;RESTORE KISAR5T2 MOV (SP)+,R1 ;RESTORE LISTHEAD ADDRESS OF INS TCB4 MOV (SP)+,R0 ;RESTORE LISTHEAD ADDRESS OF ALLOC TCB BR 80$ ; .ENDC.50$: MOV R1,R5 ;INIT POINTER TO START OF LIST)60$: MOV R5,R4 ;SAVE POINTER TO PREVIOUS $ MOV (R5),R5 ;POINT TO NEXT IN LIST BEQ 80$ ;IF EQ THERE IS NONE5 CMP 44(R5),-2(R3) ;MATCH ON FIRST WORD OF TASK NAME? BNE 60$ ;IF NE NOS4 CMP 46(R5),(R3) ;MATCH ON SECOND WORD OF TASK NAME? BNE 60$ ;IF NE NO' MOV (R5),(R4) ;UNLINK PACKET FROM LISTK0 BNE 70$ ;IF NE IT WAS NOT THE LAST IN THE LIST* MOV R4,2(R1) ;UPDATE LAST IN LIST POINTER70$: CLR (R5) ;CLEAR LINK WORDB1 MOV R5,@2(R0) ;LINK TO END OF ALLOCATED TCB LISTO* MOV R5,2(R0) ;UPDATE LAST IN LIST POINTER. MOV R1,-(SP) ;SAVE T.RRFL PTR FOR PROTO TCB. 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 ADDRR5 ADD #T.ATT-T.RRFL,R1 ;POINT TO PROTO ATT DESC LISTE, MOV R1,R2 ;MAKE A COPY OF LISTHEAD ADDRESS%72$: MOV R2,R4 ;SAVE POINTER TO LASTI MOV (R2),R2 ;GET NEXT ADBD BEQ 74$ ;IF EQ THERE IS NONE CMP R2,R0 ;THIS THE ONE ?M BNE 72$ ;IF NE NO MOV (R2),(R4) ;UNLINK FROM LIST! BNE 73$ ;IF NE NOT LAST IN LISTR* MOV R4,2(R1) ;UPDATE LAST IN LIST POINTER473$: MOV (SP),R0 ;RESTORE POINTER TO CREATED T.RRFL5 ADD #T.ATT-T.RRFL,R0 ;POINT TO CREATED ATT DESC LISTC* MOV R2,@2(R0) ;INSERT IN SPAWNED ATT LIST" MOV R2,2(R0) ;UPDATE LAST IN LIST1 MOV R0,A.TCB-A.TCBL(R2) ;CREATE POINTER IN A.TCBE, SUB #T.ATT,A.TCB-A.TCBL(R2) ;TO CORRECT TCB7 BICB #AS.PRO,A.STAT-A.TCBL(R2) ;INDICATE PRI. POOL TCBE$74$: MOV (SP)+,R0 ;RESTORE REGISTERS MOV (SP)+,R1 ;M BR 50$ ;RESTART SCAN(80$: CMP (R0)+,(R0)+ ;BUMP BOTH POINTERS CMP (R1)+,(R1)+ ;# CALL @(SP)+ ;CALL THE CALLER BACKP BR 40$ ; .ENDC ; DF R$$DSP;+; **-$REMOV-REMOVE TASKI,; **-$REMO1-REMOVE TASK DURING ERROR CLEANUP;ED; THIS ROUTINE IS STRICTLY DESIGNED TO REMOVE A TASK, WHICH HAS BEENC; DYNAMICALLY INSTALLED BY THE EXECUTIVE-LEVEL DISPATCHING CODE, AS)@; PART OF ERROR RECOVERY BEFORE THE TASK IS EVER ACTIVATED, OR AE; TASK BEING REMOVED ON TASK EXIT. IT WILL NOT, IN GENERAL, PROPERLY0; REMOVE ANY OTHER GIVEN TASK.;0B; $REMO1 IS AN ALTERNATE ENTRY TO BE USED WHEN CLEANING UP AFTER AA; FALSE START, SUCH AS WHEN THE SPAWN DIRECTIVE PASSES $TCBCP BUT-B; FAILS TO START THE TASK. $REMO1 CHECKS THE UTILTITY LINK WORD TOE; SEE IF IT CONATINS THE KISAR6 BIAS OF THE PROTOTYPE TCB, AND SHOULDA>; NOT BE CALLED IF THE TCB HAS BEEN CHANGED (E.G. FROM $DREIF);A ; INPUTS: ;O'; R0=TCB ADDRESS OF TASK TO BE REMOVED.R; ; OUTPUTS:;M; NONE.A;- .ENABL LSB,$REMO1:: ;REFERENCE LABELE .IF DF P$$OOL! SAVNR ;SAVE NON-VOL. REGISTERST& MOV KISAR6,-(SP) ;SAVE KERNEL MAPPING. MOV (R0),KISAR6 ;MAP TO POSSIBLE SEC POOL TCB# BEQ 5$ ;IF EQ TCB IN PRIMARY POOLT' MOV #140000,R1 ;POINT TO PROTOTYPE TCBW CALL 15$ ;JOIN $REMOV BELOWE+ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGA RETURN ;L.5$: 00ځ1ibjbkb a a aMOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING" BR 6$ ;SKIP SAVNR CALL IN $REMOV .ENDC ; DF P$$OOL$REMOV::SAVNR ;SAVE R4 AND R56$: ;REFERENCE LABELR+ CALL $DRCSR ;CANCEL ANY SCHEDULE REQUESTS MOV R5,R0 ;RESTORE TCB ADDRESS .IF DF P$$LAS4 CALL $CLSRF ;CLEAR ANY REC BY REF PKT PTRS TO TASK .ENDC< MOV #$TSKHD-T.TCBL,R1 ;POINT TO START OF TASK LIST - T.TCBL' CMP $TSKHD,R0 ;REMOVING FIRST IN LIST?O BEQ 40$ ;IF EQ YES-10$: MOV T.TCBL(R1),R1 ;POINT TO NEXT IN LIST* CMP T.TCBL(R1),R0 ;REMOVING NEXT IN LIST? BNE 10$ ;IF NE NOA15$: ;REFERENCE LABEL .IF DF P$$OOL4 MOV T.RCVL(R0),R2 ;ANY ENTRIES IN THE RECEIVE LIST? BEQ 30$ ;IF EQ NOE$ MOV KISAR5,-(SP) ;SAVE KERNEL APR 5. MOV #120000,R4 ;POINT TO FIRST WORD OF PACKET; MOV T.RCVL+2(R1),KISAR5 ;MAP THE LAST PACKET THROUGH APR 5. TST T.RCVL(R1) ;PROTO TCB RECEIVE LIST EMPTY? BNE 20$ ;IF NE NO$# MOV R1,R4 ;COPY PROTO TCB ADDRESSB& ADD #T.RCVL,R4 ;POINT TO RECEIVE LIST520$: MOV R2,(R4) ;LINK RECEIVE ENTRIES TO PROTO LISTG7 MOV T.RCVL+2(R0),T.RCVL+2(R1) ;FIX UP LAST IN LIST PTRE' MOV (SP)+,KISAR5 ;RESTORE KERNEL APR 50 .IFF 8 MOV T.RCVL(R0),@T.RCVL+2(R1) ;LINK ENTRIES TO PROTO TCB BEQ 30$ ;IF EQ THERE ARE NONE#7 MOV T.RCVL+2(R0),T.RCVL+2(R1) ;FIX UP LAST IN LIST PTR1 .ENDC30$: ;REF LABEL .IF DF P$$LAS8 MOV T.RRFL(R0),@T.RRFL+2(R1) ;LINK ENTRIES TO PROTO TCB BEQ 40$ ;IF EQ THERE ARE NONER7 MOV T.RRFL+2(R0),T.RRFL+2(R1) ;FIX UP LAST IN LIST PTR, .ENDC740$: MOV T.ATT(R0),@T.ATT+2(R1) ;MOVE ADBS (FROM SREFS)2 BEQ 41$ ;IF EQ THERE WERE NONE7 MOV T.ATT(R0),T.ATT+2(R1) ;UPDATE LAST IN LIST POINTERV3 MOV T.ATT(R0),R4 ;GET ADDRESS OF FIRST ADB IN LIST3412$: CMP #120000,R1 ;PROTOTYPE IN SECONDARY POOL ?. BLOS 413$ ;IF LOS YESN) MOV R1,A.TCB-A.TCBL(R4) ;SET TCB ADDRESSL BR 414$ ;FINISH LOOP IN COMMON;413$: BISB #AS.PRO,A.STAT-A.TCBL(R4) ;INDICATE SEC POOL TCB . 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 ADDRESSP' MOV T.PCBV(R0),R0 ;POINT TO PCB VECTOR) BEQ 50$ ;IF EQ THERE IS NONE+ MOV 2(R0),R1 ;POINT TO FIRST PCB IN VECTORC TST P.NAM(R1) ;NAMED PCB? BNE 45$ ;IF NE YES- CMP P.OWN(R1),R4 ;IS THIS TCB USED FOR NAME?F BNE 45$ ;IF NE NO- MOV $TSKHD,R2 ;POINT TO FIRST INSTALLED TASKS;43$: CMP T.PCBV(R2),R0 ;DOES THIS TASK USE THE PCBV VECTOR? BEQ 44$ ;IF EQ YES0 MOV T.TCBL(R2),R2 ;POINT TO NEXT INSTALLED TASK' TST T.TCBL(R2) ;POINTING TO NULL TASK?S BNE 43$ ;IF NE NOV" CLR R2 ;POINT P.OWN TO 0 FOR NOW"44$: MOV R2,P.OWN(R1) ;RESET P.OWN/45$: DECB 1(R0) ;REDUCE ACCESS COUNT IN VECTORT1 BNE 50$ ;IF NE THERE ARE STILL OTHERS INSTALLED?/ MOV (R0),R1 ;ELSE PICK UP NUMBER OF PCB WORDSS( 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 NOK& CALL $DELRG ;DELETE READ ONLY REGION$50$: MOV R4,R0 ;RESTORE TCB ADDRESS' MOV #T.LGTH,R1 ;SET SIZE TO DEALLOCATEU CALLR $DEACB ;DEALLOCATE TCB .DSABL LSBE;+A; **-$CLSRF-CLEAR TASK TCB ADDRESS IN ALL RECEIVE BY REF PACKETS.O;S=; THIS ROUTINE WILL SEARCH THE ACTIVE TASK LIST FOR TCBS WITH B; RECEIVE BY REFERENCE PACKETS WHICH CONTAIN A POINTER TO THE TASK;; BEING REMOVED. IF SUCH A POINTER IS FOUND IT IS CLEARED.I; ; INPUTS:P;M'; R0=TCB ADDRESS OF TASK TO BE REMOVED.I;E ; OUTPUTS:;L; NONE.T;E;-$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 NO-# MOV T.TCBL(R1),-(SP) ;END OF LIST?  BEQ 30$ ;IF EQ YES3 ADD #T.RRFL,R1 ;POINT TO RECEIVE BY REFERENCE LISTC-20$: MOV (R1),R1 ;GET NEXT REC BY REF PACKETC BEQ 30$ ;IF EQ END OF LIST3 CMP 2(R1),R0 ;DOES IT POINT TO TASK BEING REMOVED?E BNE 200t__DATADATADATADATA0$ ;IF NE NOP2 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 GLOBAL % MOV (SP)+,R1 ;RESTORE PACKET ADDRESS * MOV (SP)+,R0 ;RESTORE TCB OF EXITING TASK .ENDC ; DF G$$GEF3 MOV T.NAM(R0),4(R1) ;STORE FIRST HALF OF TASK NAME2' MOV T.NAM+2(R0),6(R1) ;AND SECOND HALFV BR 20$ ;GO AGAIN230$: MOV (SP)+,R1 ;GET ADDRESS OF NEXT TCB IN LIST BNE 10$ ;IF NE GO AGAINP .IFTF40$: RETURN ;. .ENDC;+G; **-$DRTHR/$ERTHR-DIRECTIVE ERROR AND GENERAL ERROR THREADING ROUTINES;VA; THESE ROUTINES ARE USED IN CONJUNCTION WITH THE FOLLOWING ERRORGC; RECOVERY ROUTINE TO DYNAMICALLY THREAD ERROR RECOVERY INFORMATIONR?; ONTO THE STACK. AFTER INITIALIZATION, THE INTERFACE IS VIA A)A; COROUTINE CALL (CALL @(SP)+) FOLLOWED BY TWO ROUTINE ADDRESSES. D; THE FIRST ROUTINE IS CALLED AND THEN THE SECOND ROUTINE ADDRESS ISD; PUSHED ONTO THE STACK ALONG WITH THE CONTENTS OF R0 AND R1. IT ISD; INTENDED THAT THE SECOND ROUTINE, ALONG WITH THE SAVED CONTENTS OFA; R0 AND R1, CAN UNDO THE ACTION OF THE FIRST ROUTINE IF AN ERRORCH; CONDITION IS ENCOUNTERED LATER. ANOTHER POSSIBILITY IS THAT THE FIRSTH; ROUTINE IS NULL, AND THE SECOND ROUTINE CAN UNDO SOME PREVIOUS ACTION.E; $DRTHR MAY BE CALLED WHEN THE FINAL DESIRED ACTION ON ERROR WILL BEIH; TO RETURN A DIRECTIVE STATUS PASSED IN R5 (IN THE FORM 'DRSTS D.RSX').H; $ERTHR IS A GENERAL ERROR RECOVERY THREADING ROUTINE. EXAMPLE USES OF2; THESE ROUTINES MAY BE FOUND IN THE MODULE DRSPW.;T ; INPUTS:N;T(; AS REQUIRED FOR CALL TO FIRST ROUTINE.; ; OUTPUTS:;F=; C-BIT AND R0-R3 ARE PRESERVED FROM RETURN OF FIRST ROUTINE.I; R4 IS DESTROYED.;- .IF DF P$$OFF .ENABL LSBT'$DRTHR::MOV (SP),R4 ;PICK UP RETURN PCT7 MOV #10$,(SP) ;SET ADDRESS OF ROUTINE TO RETURN STATUSI. CMP -(SP),-(SP) ;ALLOCATE WORDS FOR R0 AND R1( MOV R4,-(SP) ;RESTORE RETURN PC ADDRESS .IF DF K$$DAS($ERTHR::MOV PS,R2 ;SAVE CURRENT PS WORD+ BIC #PMODE,PS ;SET PREVIOUS MODE TO KERNEL  MOV (SP)+,R4 ;POP CALLING PCS( MFPI (R4)+ ;PUSH FIRST ROUTINE ADDRESS+ MFPI (R4)+ ;PUSH RECOVERY ROUTINE ADDRESSE MOV R2,PS ;RESTORE PS WORD! CALL @2(SP) ;CALL FIRST ROUTINEF9 MOV (SP)+,(SP) ;MOVE RECOVERY ROUTINE ADDRESS INTO PLACEE .IFF'$ERTHR::MOV (SP),R4 ;PICK UP RETURN PCE- CALL @(R4)+ ;CALL THE FIRST ROUTINE ADDRESSF2 MOV (R4)+,(SP) ;SAVE THE RECOVERY ROUTINE ADDRESS .ENDC* MOV R1,-(SP) ;SAVE CURRENT CONTENTS OF R1* MOV R0,-(SP) ;SAVE CURRENT CONTENTS OF R0! CALL (R4) ;CALL THE CALLER BACKI BR $ERTHR ;DO IT AGAIN910$: MOV R5,-(SP) ;PUSH DIRECTIVE STATUS TRAP INSTRUCTION  JMP (SP) ;EXECUTE TRAP .DSABL LSB;+"; **-$ERREC-ERROR RECOVERY ROUTINE;+@; THIS ROUTINE IS USED IN CONJUNCTION WITH THE ABOVE ROUTINES TOC; EFFECT A SERIES OF SUBROUTINE CALLS STORED ON THE STACK FOR ERROROC; RECOVERY. THE NORMAL CALLING SEQUENCE IS VIA A JUMP. SUCCESSIVE@; R0 AND R1 CONTENTS ARE POPPED FROM THE STACK WITH CALLS TO THED; SAVED ROUTINE ADDRESSES. THE LAST ROUTINE ON THE STACK MUST FORCE; THE PROCESS TO STOP.;0 ; INPUTS:(; 1; R5=DIRECTIVE STATUS (IF INITIALIZED BY $DRTHR). ;X ; OUTPUTS:;S; NONE.;-)$ERREC::TST (SP)+ ;POP COROUTINE ADDRESSH#10$: MOV (SP)+,R0 ;PICK UP SAVED R0H MOV (SP)+,R1 ;PICK UP SAVED R1A( CALL @(SP)+ ;CALL THE RECOVERY ROUTINE BR 10$ ;;+"; **-$QUEXT-QUEUE EXIT "AST" BLOCK;EA; THIS ROUTINE FILLS IN THE STATUS IN AN OFFSPRING CONTROL BLOCK,T>; AND QUEUES IT AS A SPECIAL AST BLOCK TO THE PARENT TASK TCB.;U ; INPUTS: ;C; R0=EXIT STATUS WORD.; R1=OCB ADDRESS. ; R2=TKTN ABORT CODE (BYTE)S;U ; OUTPUTS:;E; R3 IS PRESERVED.;- .IFTF*$QUEXT:: ;UNCONDITIONALLY DEFINE FOR MCR .IFTR MOV R2,-(SP) ;SAVE ABORT CODE, .IF DF N$$DIR ;IF NAMED DIRECTORY SUPPORT MOV R1,-(SP) ;SAVE OCB ADDRESSE0 MOV O.STAT+10(R1),R1 ;GET CONTEXT B001ibjbkb a a aLOCK POINTER BEQ 5$ ;IF EQ, NONEE# CALL $DLCTX ;DELETE CONTEXT BLOCKC%5$: MOV (SP)+,R1 ;RESTORE OCB POINTERE .ENDC ;DF N$$DIR . MOV O.PTCB(R1),R2 ;PICK UP PARENT TCB ADDRESS# BEQ 30$ ;IF EQ PARENT HAS EXITTEDT( DEC T.RDCT(R2) ;DECREMENT RUNDOWN COUNT3 MOV T.ASTL(R2),(R1) ;LINK OCB TO FRONT OF AST LISTO BNE 10$ ;E MOV R1,T.ASTL+2(R2) ;10$: MOV R1,T.ASTL(R2) ;1 MOV #AK.OCB,A.CBL(R1) ;SET EXIT "AST" BLOCK FLAGO# MOV R0,O.STAT(R1) ;SET EXIT STATUSE. 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 **$;O; SPM HOOKPOINT NUMBER 09.;E); DO NOT CHANGE THE INSTRUCTION FOLLOWING2; LABEL WITHOUT CHECKING SPM;-+$SPH09==. ;SPM CHANGES THE INSTRUCTION AT2 ;THE LOCATION OF THIS LABELT0 CALL @#$SETCR ;SET CONDITIONAL SCHEDULE REQUEST& MOV T.PCB(R0),R0 ;POINT TO PARENT PCB1 CALLR $NXTSK ;REALLOCATE (AST ENTRY CAN UNSTOP)S/30$: MOV R1,R0 ;COPY OCB POINTER TO DEALLOCATEU% TST (SP)+ ;CLEAN STACK (ABORT CODE)C) MOV #O.LGTH,R1 ;SET LENGTH TO DEALLOCATEI CALLR $DEACB ;DEALLOCATE OCB .ENDC;+; **-$STPCT-STOP CURRENT TASKC; **-$STPTK-STOP TASKO;WD; THESE ROUTINES ARE CALLED TO STOP A TASK AND REALLOCATE THE TASK'S ; PARTITION.; ; INPUTS:C;O5; R0=TCB ADDRESS OF TASK TO STOP (IF ENTRY AT $STPTK) ;E ; OUTPUTS:;M; NONE;-:$STPCT::MOV $TKTCB,R0 ;PICK UP ADDRESS OF CURRENT TASK TCB9$STPTK::BIS #T2.STP,T.ST2(R0) ;SET STOP BIT IN TASK'S TCBC .IF DF M$$PRO8 BIT #TS.RUN,T.STAT(R0) ;TASK RUNNING ON SOME PROCESSOR? BEQ 10$ ;IF EQ NOC .IFFO CMP R0,$TKTCB ;TASK RUNNING?$ BNE 10$ ;IF NE NOS .ENDC) CALL $SETCR ;INSURE THAT TASK WILL STOPE(10$: MOV T.PCB(R0),R0 ;POINT TO TASK PCB& BR $NXTSK ;REALLOCATE TASK PARTITION;+$; **-$RLCPS-RELEASE CHECKPOINT SPACE;KE; THIS ROUTINE RELEASES SPACE IN A CHECKPOINT FILE. IF THE SPECIFIEDD?; REGION IS TO BE DELETED, IT ALSO DELETES ANY DISK PCB AND THE ; REGION PCB ITSELF.;. ; INPUTS:O;1; R0=REGION PCB FOR WHICH SPACE IS TO BE DELETED.S;? ; OUTPUTS:; ; NONE.;-$RLCPS::SAVNR ;SAVE R4 AND R5$ MOV R0,R4 ;COPY PCB POINTERC, 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?I BEQ 25$ ;IF EQ NOP+ CALL $RLPR1 ;RELEASE THE CHECKPOINT SPACEE MOV R4,-(SP) ;SAVE PCB ADDRESSI6 MOV P.DPCB(R4),R4 ;POINT TO CHECKPOINT ALLOCATION PCB0 MOV P.MAIN(R4),R4 ;POINT TO CHECKPOINT FILE PCB- TST P.REL(R4) ;CHECKPOINT FILE STILL IN USE?H BEQ 10$ ;IF EQ YES& TST P.SUB(R4) ;CHECKPOINT FILE EMPTY? BNE 10$ ;IF NE NOS MOV #20,R0 ;SET TKTN CODEC# MOV P.UCB(R4),R5 ;PASS UCB ADDRESS;$ CALL $DVMSG ;QUEUE MESSAGE TO TKTN-10$: MOV (SP)+,R4 ;RESTORE REGION PCB ADDRESS % MOV P.DPCB(R4),R0 ;POINT TO DISK PCBP/20$: CLR P.DPCB(R4) ;CLEAR OUT DISK PCB POINTERM) MOV #P.DLGH,R1 ;SET LENGTH TO DEALLOCATE(" CALL $DEACB ;DEALLOCATE DISK PCB925$: BIT #PS.DEL,P.STAT(R4) ;IS REGION MARKED FOR DELETE?T BEQ 30$ ;IF EQ NOI& TST P.ATT(R4) ;ANYONE STILL ATTACHED? BNE 30$ ;IF NE YES% MOV P.DPCB(R4),R0 ;POINT TO DISK PCBE BNE 20$ ;IF NE THERE IS ONED0 MOV R4,R0 ;COPY MAIN PCB POINTER TO DEALLOCATE) MOV #P.LGTH,R1 ;SET LENGTH TO DEALLOCATE+ CALL $DEACB ;DEALLOCATE PCB 30$: RETURN ;,;+"; **-$RLPAR-RELEASE TASK PARTITION; **-$RLPR1-RELEASE PARTITION;VH; THIS ROUTINE IS CALLED TO RELEASE SPACE IN A PARTITION OWNED BY A TASKB; AND TO ATTEMPT TO REALLOCATE THE PARTITION IF THE WAIT QUEUE FOR; THE PARTITION IS NONEMPTY.;N ; INPUTS:A;C>; R0=ADDRESS OF THE TCB OF THE OWNER TASK (IF ENTRY AT $RLPAR)=; R1=ADDR OF SUBPARTITION PCB TO RELEASE (IF ENTRY AT $RLPR1)P;T ; OUTPUTS:;E@; THE SPACE IS RELEASED AND AN ATTEMPT IS MADE TO REASSIGN SPACE=; IN THE PARTITION TO THE NEXT HIGHEST PRIORITY CONTENDER(S).R;-6$RLPAR::MOV T.PCB(R0),R1 ;GET ADDRESS OF PARTITION PCB/$RLPR1::MOV P.MAIN(R1),R0 ;GET MAIN PCB ADDRESS % MOV R0,R3 ;SAVE POINTER TO MAIN PCBE-10$: MOV R0,R2 ;SAVE ADDRESS OF PREVIOUS PCBO* MOV P.SUB(R2)00t__DATADATADATADATA,R0 ;GET ADDRESS OF NEXT PCB CMP R0,R1 ;TASK PCB? BNE 10$ ;IF NE NOT. MOV P.SUB(R0),P.SUB(R2) ;REMOVE PCB FROM LIST, TST P.MAIN(R3) ;RELEASING CHECKPOINT SPACE? BNE 20$ ;IF NE NO  RETURNT20$:;+; ** W A R N I N G ** ;T; SPM HOOKPOINT NUMBER 15.;T); DO NOT CHANGE THE INSTRUCTION FOLLOWING ; LABEL WITHOUT CHECKING SPM;-+$SPH15==. ;SPM CHANGES THE INSTRUCTION ATC ;THE LOCATION OF THIS LABELN NOP ;DROP THROUGH TO $NXTSK TO% NOP ; REALLOCATE RELEASED PARTITIONR;+); **-$NXTSK-ASSIGN NEXT TASK TO PARTITION?;BF; THIS ROUTINE IS CALLED TO ASSIGN SPACE IN A PARTITION TO THE HIGHEST6; PRIORITY CONTENDERS WAITING TO OCCUPY THE PARTITION.;E ; INPUTS:R;@; R0=ADDRESS OF THE PCB OF THE MAIN PARTITION, OR A SUBPARTITION:; PCB WITHIN THE MAIN PARTITION IN WHICH TO ASSIGN SPACE.; ; OUTPUTS:;-@; THIS ROUTINE ATTEMPTS TO ASSIGN SPACE IN THE MAIN PARTITION IN#; AS MANY AS FOUR STEPS AS FOLLOWS:O; A; 1. IT FIRST DETERMINES IF THERE ARE ANY ELIGIBLE CONTENDERS*:; IN THE PARTITION WAIT QUEUE. THE ONLY CONTENDERS WHICH;; CAN BE IN THE WAIT QUEUE WHICH ARE NOT ELIGIBLE ARE TASKO:; PARTITIONS WHICH ARE NOT MAPPED BY OTHER RESIDENT TASKS:; AND FOR WHICH THE CORRESPONDING TASK IS STOPPED WITH NO; PENDING AST QUEUE ENTRIES.H;A:; 2. IF THERE IS AN ELIGIBLE CONTENDER FOR MEMORY, THE9; ROUTINE ATTEMPTS TO ASSIGN SPACE TO THE CONTENDER FROMO!; SPACE WHICH IS CURRENTLY FREE.L;S?; 3. IF THERE IS CURRENTLY INSUFFICIENT FREE SPACE TO BRINGN3; IN THE CONTENDER, AN ATTEMPT IS MADE TO CREATE AO6; CONTIGUOUS FREE SPACE LARGE ENOUGH BY CHECKPOINTING9; ONE OR MORE OF THE CURRENT RESIDENTS OF THE PARTITION. :; (NOTE THAT DURING THIS STEP THE DECISION MAY BE MADE TO:; CHECKPOINT A REGION FOR WHICH CHECKPOINTING HAS ALREADY:; BEEN INITIATED. THIS IS ACCEPTABLE SINCE AN ATTEMPT TO8; INITIATE CHECKPOINTING A SECOND TIME IS EFFECTIVELY A; NOP.);H@; 4. IF SUFFICIENT SPACE CANNOT BE CREATED BY CHECKPOINTING,; THE SHUFFLER IS ACTIVATED. ;-$NXTSK:: .IF DF R$$PRO!A$$CKPT9 TST $NXTLK ;NXTSK LOCK SET? (NEEDED TO MAINTAIN CONTEXT ;DURING CHECKPOINTS) BLE 5$ ;IF LE NO, OK TO ENTER RETURN ;LEAVE NOW5$:T .ENDC ;R$$PRO!A$$CKPD SAVNR ;SAVE R4 AND R52 MOV P.MAIN(R0),R5 ;GET MAIN PARTITION PCB ADDRESS210$: MOV P.WAIT(R5),R4 ;GET FIRST PCB IN WAIT LIST!20$: BEQ 100$ ;IF EQ END OF LISTS6 TSTB P.RMCT(R4) ;ARE THERE ANY RESIDENT MAPPED TASKS?) BNE 40$ ;IF NE YES, ATTEMPT TO BRING INT8 MOV P.TCB(R4),R0 ;GET TCB ADDR (TASK PART. IF P.RMCT=0)6 BIT #TS.STP,T.STAT(R0) ;TASK BLOCKED BY BLOCK COMMAND BNE 30$ ;IF NE YES, SKIP ITH% BIT #T2.STP,T.ST2(R0) ;TASK STOPPED?N BEQ 40$ ;IF EQ NOE, TST T.ASTL(R0) ;BUT ARE THERE PENDING ASTS? BNE 40$ ;IF NE YES130$: MOV (R4),R4 ;POINT TO NEXT PCB IN WAIT LIST0 BR 20$ ;GO AGAIN840$: BIT #PS.CSA,P.STAT(R4) ;CHECKPOINT SPACE ALLOCATED?$ BNE 100$ ;IF NE, YES - JUST RETURN6 CALL $FNDSP ;ATTEMPT TO ALLOCATE SPACE IN MAIN PART.- BCS 50$ ;IF CS NO SPACE CURRENTLY AVAILABLET" MOV R5,R0 ;COPY MAIN PCB ADDRESS- ADD #P.WAIT,R0 ;POINT TO WAIT QUEUE LISTHEADE* 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 .IF DF A$$CKP= MOV P.REL(R4),P.NXBA(R5) ; SET THE NEXT BASE ADDRESS FOR PCBC3 ADD P.SIZE(R4),P.NXBA(R5) ; UPDATE THE INFORMATIONJ .ENDC ;DF,A$$CKPF) CALL $QRMVA ;REMOVE PCB FROM WAIT QUEUE.' CALL $LOADT ;PLACE IT IN LOADER QUEUEI* TALLY$ B.RLOD,XA$$TL ;COUNT A REGION LOAD BR 10$ ;TRY TO LOAD ANOTHERE;SI; ATTEMPT TO CREATE A CONTIGUOUS FREE SPACE LARGE ENOUGH BY CHECKPOINTINGVG; ONE OR MORE TASKS/COMMONS. ON P/OS, START LOOKING FOR THIS CONTIGUOUSAJ; FREE SPACE FOLLOWING THE LAST SUCCESSFUL LOAD. THIS AVOIDS THE THRASHINGF; STATE WHEREBY A TASK IS MAPPING AND UNMAPPING FROM VARIOUS CLUSTEREDJ; LIBRARIES WHICH CHECKPOINT EACH OTHER AS A CONSEQUENCE OF HAVING NO FREE;; SPACE DUE TO A RESIDENT UNMAPPED001ibjbkb a a a COMMON(S) HIGHER IN GEN.L; 50$: .IF DF R$$PRO!A$$CKPD$ TST $NXTLK ;JUST STARTING TO LOOK?5 BGT 53$ ;IF NE NO, WRAP BACK TO BOTTOM OF PARTITIONH- BMI 54$ ; IF MI, USING RSX STYLE CHECKPOINT.5 INCB $NXTLK ;LOCK $NXTSK TO PREVENT LOSS OF CONTEXTE% ;VIA RECURSIVE CALL OUT OF $ICHKPI .IF DF A$$CKP) MOV R5,R2 ; COPY MAIN PCB ADDRESS TO R2N .ENDC ;DF,A$$CKPR) MOV P.SUB(R5),R1 ;GET FIRST SUBPARTITIONT MOV R1,R5 ;SET UP PREVIOUS52$: .IF DF A$$CKP7 CMP P.REL(R1),P.NXBA(R2) ; ABOVE LAST SUCCESSFUL LOAD?L .IFF ;DF,A$$CKP2 CMP P.REL(R1),$NXTBA ;ABOVE LAST SUCCESSFUL LOAD? .ENDC ;DF,A$$CKP  BHIS 65$ ;IF HIS YES MOV R1,R5 ;UPDATE PREVIOUS- MOV P.SUB(R1),R1 ;POINT TO NEXT SUBPARTITION  BNE 52$ ;TRY AGIAN353$: INCB $NXTLK ;INDICATE FULL BOTTOM TO TOP PASSU. MOV P.MAIN(R4),R5 ;SET UP POINTER TO MAIN PCB54$: .ENDC ;R$$PRO!A$$CKPC$ CLR R3 ;INIT BASE OF HOLE REGISTER2 MOV R5,R1 ;COPY MAIN PCB PTR LEAVING PTR TO PREV-55$: ADD P.REL(R5),R3 ;CALCULATE BASE OF HOLEV560$: MOV P.SUB(R1),R1 ;POINT TO NEXT SUBPARTITION PCBR, BEQ 110$ ;IF EQ NONE, FAILED TO CHECKPOINT.65$: CALL $TSTCP ;CAN WAITING PCB CHECKPOINT? BCC 70$ ;IF CC YES+ MOV R1,R5 ;UPDATE POINTER TO PREVIOUS PCB. MOV P.SIZE(R5),R3 ;INIT BASE OF HOLE REGISTER BR 55$ ;TRY AGAINP%70$: CLR R0 ;INITIALIZE SIZE OF HOLER/ MOV P.SUB(R1),R2 ;POINT TO NEXT PCB AFTER HOLEC BNE 80$ ;IF NE THERE IS ONET* MOV P.MAIN(R1),R2 ;ELSE POINT TO MAIN PCB. ADD P.SIZE(R2),R0 ;CALCULATE END OF PARTITION780$: ADD P.REL(R2),R0 ;CALCULATE ADDRESS OF TOP OF HOLET# SUB R3,R0 ;CALCULATE SIZE OF HOLEL+ CMP R0,P.SIZE(R4) ;IS THE HOLE BIG ENOUGH?I BLO 60$ ;IF LO NOB< BIS #PS.CSA,P.STAT(R4) ;INDICATE CHECKPOINT SPACE ALLOCATED% MOV R4,-(SP) ;SAVE PCB IN WAIT QUEUEL( MOV R1,R4 ;MARK LAST PCB TO CHECKPOINT690$: MOV P.SUB(R5),R5 ;POINT TO NEXT PCB TO CHECKPOINT MOV R5,R1 ;COPY ITS ADDRESS8" CALL $ICHKP ;INITIATE CHECKPOINT CMP R5,R4 ;MORE TO CHECKPOINT? BNE 90$ ;IF NE YES* MOV (SP)+,R4 ;RESTORE PCB OF WAITING TASK4 BIC #PS.CSA,P.STAT(R4) ;INDICATE CHECKPOINT IS DONE100$:E .IF DF R$$PRO!A$$CKP. CLRB $NXTLK ;CLEAR $NXTSK LOCK .ENDC ;R$$PRO!A$$CKPS RETURN ;(110$:C .IF DF R$$PRO!A$$CKPC4 CMP $NXTLK,#1 ;WRAP BACK TO BEGINNING OF PARTITION? .IF NDF R$$PROT& BEQ 53$ ; IF EQ, YES, SCAN ONCE MORE1 CLRB $NXTLK ; REMOVE OUR LOCK TO ALLOW RE-ENTRY  .IFF ;NDF,R$$PROH BNE 100$ ;IF NE NO BR 53$ ; .ENDC ;NDF,R$$PRO .ENDC ;DF,R$$PRO!A$$CKP/ MOV $SHFPT,R0 ;PICK UP ADDRESS OF SHUFFLER TCB#( BEQ 100$ ;IF EQ SHUFFLER NOT INSTALLED* TST $SHFTM ;CAN WE REQUEST THE SHUFFER ?+ BNE 100$ ;NO, WAIT FOR NEXT TIME INTERVALP7 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 MAPPINGF MOV $SABPT,KISAR6 ;MAP SABR( BEQ 130$ ;IF EQ, ACCOUNTING NOT ACTIVE2 BIT #BF.LSS,$ACNFE ;SYSTEM ACCOUNTING TURNED ON ? BEQ 130$ ;NO, IF EQ.. ADD #1,@#B.SHF+140002 ;COUNT SHUFFLER STARTUP ADC @#B.SHF+140000 ;F'130$: MOV (SP)+,KISAR6 ;RESTORE MAPPINGI .ENDC/ CALLR $EXRQN ;REQUEST THE SHUFFLER AND RETURN ;+8;**-$TSPAR-TEST IF PARTITION IS IN MEMORY FOR KERNEL AST;F@; THIS ROUTINE IS CALLED TO CHECK A REGION FOR MEMEORY RESIDENCE?; TO DETERMINE IF IT IS SAFE TO SERVICE A KERNEL AST (E.G. COPYI=; A BUFFER) INTO THE REGION. IF THE REGION IS CHECKPOINTED OR#@; CURRENTLY BEING CHECKPOINTED, THEN A REGION LOAD AST IS QUEUED1; AND THE REGION IS ACCESSED ON THE TASKS BEHALF.;C ; INPUTS:0&; R0=ADDRESS OF PACKET PEING PROCESSED; R1=PCB ADDRESS OF REGION#; R5=TCB ADDRESS OF ASSOCIATED TASKR;R ; 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.;-)$TSPAR::CLC ;ASSUME REGION IS IN MEMORYA2 BIT #PS.CKP!PS.OUT,P.STAT(R1) ;REGION IN MEMORY ? BNE 10$ ;IF NE NOD RETURN ;N110$: BIT #PS.AST,P.STAT(R1) ;ALREADY A LOAD AST ?U BNE 20$ ;IF NE YES1 BIS #PS.AST,P.STAT(R1) ;INDICATE LOAD AST00t__DATADATADATADATA QUEUED* CLR P.SWSZ(R1) ;USE P.SWSZ FOR A LISTHEAD520$: MOV P.SWSZ(R1),(R0) ;LINK NEXT BLOCK TO THIS ONET2 MOV R0,P.SWSZ(R1) ;AND SET THIS ONE FIRST IN LIST MOV R0,-(SP) ;SAVE TCB ADDRESSD MOV R5,R0 ;COPY TCB ADDRESST CALL $ACCRG ;ACCESS THE REGION% MOV (SP)+,R0 ;RESTORE PACKET ADDRESSM SEC ;INDICATE AST QUEUED. RETURN ;I;+; **-$ACCRG-ACCESS REGIONN!; **-$ALTRG-ALTER REGION PRIORITYP;AA; EFFECT THE ACCESS OF A NEW RESIDENT MAPPED TASK TO A REGION ANDS.; OPTIONALLY ALTER THE PRIORITY OF THE REGION.; ; INPUTS: ; ); R0=TCB ADDRESS OF RESIDENT MAPPED TASK.N; R1=PCB ADDRESS OF REGION.R;. ; OUTPUTS:;E; NONE.E;- .ENABL LSBV5$ACCRG::MOV T.PCB(R0),R2 ;PICK UP TASK REGION PCB PTRR# CMP R1,R2 ;ACCESSING TASK REGION?N+ BEQ 4$ ;IF EQ YES, DON'T INCREMENT P.RMCTC .IF DF M$$PRO= BIS P.RRM(R1),T.RRM(R0) ;INCLUDE REGION AFFINITY IN TASK AFF- .ENDC- BIT #PS.OUT,P.STAT(R2) ;TASK OUT OF MEMORY ?D% BNE 3$ ;IF NE YES, OK TO INC P.RMCTI- BIT #PS.CKP,P.STAT(R2) ;BEING CHECKPOINTED ? ( BNE 43$ ;IF NE YES, DON'T TOUCH P.RMCT33$: INCB P.RMCT(R1) ;INC RESIDENT MAPPED TASK COUNTU=4$: BIT #PS.CKP,P.STAT(R2) ;IS THIS A CHECKPOINT READ ACCESS?,- BNE $ALTRG ;IF NE YES, SKIP BLOCKING CHECKSA43$: ;REFERENCE LABEL4 BIT #PS.OUT!PS.CKP,P.STAT(R1) ;IS REGION IN MEMORY? BEQ 5$ ;IF EQ YESM# INC T.STAT(R0) ;BLOCK MAPPING TASKT BR 6$ ;F:5$: BIT #PS.CKR,P.STAT(R1) ;IS THERE A CHECKPOINT REQUEST? BEQ 6$ ;IF EQ NO+ BIS #TS.CIP,T.STAT(R0) ;BLOCK MAPPING TASK( 6$: MOV R1,R2 ;SAVE PCB ADDRESS .IF DF M$$PRO: BIT #TS.RUN,T.STAT(R0) ;IS THE TASK RUNNING ON SOME PROC? BEQ 7$ ;NO IF EQ .IFFT) CMP R0,$TKTCB ;IS THIS THE CURRENT TASK?E BNE 7$ ;NO IF NE .ENDC0 CALL $SETCR ;SET SCHEDULE REQUEST TO STOP TASK#7$: MOV R2,R1 ;RESTORE PCB ADDRESS?0$ALTRG::MOVB T.PRI(R0),R2 ;PICK UP TASK PRIORITY- CMP R1,T.PCB(R0) ;ALTERING TASKS OWN REGION?R BNE 10$ ;IF NE NOO4 TSTB P.RMCT(R1) ;OTHER TASKS MAPPED TO TASK REGION? BEQ 15$ ;IF EQ NOS;:; THIS SECTION INSURES THAT THE PRIORITY OF A NON-RESIDENT7; NON-MAPPED REGION STAYS AT ZERO WHEN ALTERED. THIS ISB;; NECESSARY TO INSURE THAT ZERO MAP COUNT COMMONS DON'T GETR;; PUT IN THE PAR. WAIT QUEUE, AND TO INSURE THAT THE REGIONS<; WILL GET LOADED WHEN IT IS MAPPED BY SOME TASKS. NOTE THAT:; IF THE PRIORITY IS NOT ALTERED UPWARD, THE REGION IS NOT<; LOADED. ALSO NOTE THAT THE NEXT TEST WILL NEVER BRANCH FOR3; TASK REGIONS, SINCE WE JUST CHECKED P.RMCT ABOVE.R;O610$: TSTB P.RMCT(R1) ;ANY TASK MAPPED TO THIS REGION ?* BEQ 30$ ;IF EQ NO - DON'T TOUCH PRIORITY( INCB R2 ;INCREMENT FOR COMMON PRIORITY+ CMPB R2,P.PRI(R1) ;IS NEW PRIORITY HIGHER?N BLOS 30$ ;IF LOS NO 115$: MOVB R2,P.PRI(R1) ;STORE NEW REGION PRIORITYR8$LDREG::BIT #PS.OUT,P.STAT(R1) ;IS THE REGION IN MEMORY? BEQ 30$ ;IF EQ YES/ CMP R1,$LDPCB ;IS LOADER CURRENTLY LOADING IT? BEQ 30$ ;IF EQ YES# MOV $LDRPT,R0 ;POINT TO LOADER TCBR0 ADD #T.RCVL,R0 ;POINT TO LOADER'S RECEIVE QUEUE, CALL $QRMVA ;SEE IF PCB IS IN LOADER QUEUE BCS 20$ ;IF CS NOB CALL $QINSP ;ELSE PUT IT BACKR BR 30$ ;20$:;+; ** W A R N I N G **I;; SPM HOOKPOINT NUMBER 06.;R); DO NOT CHANGE THE INSTRUCTION FOLLOWINGM; LABEL WITHOUT CHECKING SPM;-+$SPH06==. ;SPM CHANGES THE INSTRUCTION ATT ;THE LOCATION OF THIS LABELI% MOV P.MAIN(R1),R0 ;POINT TO MAIN PCBL- ADD #P.WAIT,R0 ;POINT TO WAIT QUEUE LISTHEADP6 CALL $QRMVA ;REMOVE FROM CURRENT POSITION (IF THERE)- CALL $QINSP ;INSERT IN PARTITION WAIT QUEUES+25$: MOV R1,R0 ;SET PCB ADDRESS FOR $NXTSK ( CALL $NXTSK ;REALLOCATE MAIN PARTITION30$: RETURN ;R;+; **-$DEARG-DEACCESS REGIONU;RE; THIS ROUTINE DEACCESSES A MAPPED TASK FROM A REGION AND REALLOCATESH<; ITS MAIN PARTITION IF THE REGION HAS NO MORE MAPPED TASKS.; ; INPUTS:T; $; R0=TCB ADDRESS OF DEACCESSING TASK; R1=PCB OF REGION TO DEACESSA;R ; OUTPUTS:;T; NONE.S;-7$DEARG::TSTB T.IOC(R0) ;DOES TASK HAVE OUTSTANDING I/O?) BEQ 35$ ;IF EQ NOR. BIS #T3.MPC,T.ST3(R0) ;00 1ibjbkb a a aSET MAPPING CHANGE BIT<35$: BIT #PS.CKR,P.STAT(R1) ;CHECKPOINT REQUEST THIS REGION? BEQ 40$ ;IF EQ NOR5 BIC #PS.CKR,P.STAT(R1) ;CLEAR CHECKPOINT REQUEST BITE MOV R1,-(SP) ;SAVE REGISTERSA MOV R0,-(SP) ;O- CALL $ICHKP ;ATTEMPT TO INITIATE CHECKPOINTN MOV (SP)+,R0 ;RESTORE REGISTERS MOV (SP)+,R1 ;A#40$: CMP R1,T.PCB(R0) ;TASK REGION?O BNE 45$ ;NO IF NE1 TST @P.ATT(R1) ;OTHER ATTACHES TO TASK'S REGION?I# BEQ 30$ ;IF EQ NO, SAVE SOME TIMEO2 INCB P.RMCT(R1) ;INSURE NO MODIFICATION OF P.RMCT845$: DECB P.RMCT(R1) ;DEC COUNT OF RESIDENT MAPPED TASKS' BNE 30$ ;IF NE THERE ARE STILL OTHERSQ& CLRB P.PRI(R1) ;ASSUME IT IS A COMMON( BIT #PS.COM,P.STAT(R1) ;IS IT A COMMON? BEQ 47$ ;IF EQ NO(0 BIT #PS.OUT,P.STAT(R1) ;REGION OUT OF MEMEORY ?+ BEQ 50$ ; IF EQ NO - REALLOCATE PARTITION(' MOV R0,-(SP) ;SAVE TCB ADDRESS OF TASKE) MOV R1,-(SP) ;SAVE PCB ADDRESS OF REGION12 MOV P.MAIN(R1),R0 ;POINT TO REGION MAIN PARTITION- ADD #P.WAIT,R0 ;POINT TO WAIT QUEUE LISTHEADE) CALL $QRMVA ;REMOVE FROM QUEUE IF THERET" MOV (SP)+,R1 ;RESTORE PCB ADDRESS MOV (SP)+,R0 ;AND TCB ADDRESS% BCS 46$ ;IF CS WASN'T IN WAIT QUEUE 1 BIC #PS.CKR,P.STAT(R1) ;CLEAR CHECKPOINT REQUESTM46$: RETURN ;I(47$: MOV P.TCB(R1),R0 ;POINT TO TASK TCB5 MOVB T.PRI(R0),P.PRI(R1) ;THEN SET TO TASK PRIORITYT!50$: MOV R1,R0 ;COPY PCB ADDRESSR4 CALLR $NXTSK ;REALLOCATE MAIN PARTITION AND RETURN .DSABL LSBI;+"; **-$FNDSP-FIND SPACE IN PCB LIST;DE; THIS ROUTINE IS CALLED TO FIND SPACE WITHIN A DYNAMICALLY ALLOCATEDQC; PCB LIST REPRESENTING THE ALLOCATION STATE OF A SYSTEM CONTROLLEDD'; PARTITION OR DYNAMIC CHECKPOINT FILE.W; ; INPUTS:C;S%; R4=ADDRESS OF PCB TO FIND SPACE FORS7; R5=ADDRESS OF MAIN PCB FOR SPACE IN WHICH TO ALLOCATEK;B ; OUTPUTS:;0"; C=0 IF ALLOCATION WAS SUCCESSFUL); SUB PCB IS LINKED INTO ALLOCATION LISTC; C=1 IF ALLOCATION FAILURE ;T; R0,R1,R2 ARE MODIFIED.;-,$FNDSP::MOV R5,R0 ;COPY ADDRESS OF MAIN PCB8 MOV P.REL(R5),R2 ;SET HIGHEST ADDRESS IN LAST PARTITION.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) ;' CMP (SP)+,P.SIZE(R4) ;HOLE BIG ENOUGH?S BHIS 30$ ;IF HIS YES) MOV R1,R0 ;SAVE ADDRESS OF PREVIOUS PCBU6 MOV P.REL(R1),R2 ;CALCULATE BASE ADDRESS OF NEXT HOLE ADD P.SIZE(R1),R2 ; BR 10$ ;520$: MOV P.REL(R5),-(SP) ;CALCULATE SIZE OF LAST HOLEF ADD P.SIZE(R5),(SP) ; SUB R2,(SP) ;E' CMP (SP)+,P.SIZE(R4) ;HOLE BIG ENOUGH?G BLO 40$ ;IF LO NOP430$: MOV R2,P.REL(R4) ;SET ADDRESS OF TASK PARTITION7 MOV R4,P.SUB(R0) ;LINK ALLOCATED PARTITION TO PREVIOUSA( MOV R1,P.SUB(R4) ;LINK NEXT TO TASK PCB40$: RETURN ;4;+2; **-$TSTCP-TEST IF CHECKPOINT SHOULD BE INITIATED;V ; INPUTS:F;E; R1=ADDRESS OF RESIDENT PCB; R4=ADDRESS OF CONTENDING PCB;E ; OUTPUTS:;1(; C=0 IF CHECKPOINT SHOULD BE INITIATED.,; C=1 IF CHECKPOINT SHOULD NOT BE INITIATED.;, ; R1,R3,R4 AND R5 ARE PRESERVED.;-=$TSTCP::BIT #PS.CHK!PS.FXD,P.STAT(R1) ;IS PCB CHECKPOINTABLE?. BNE 30$ ;IF NE NOO6 TSTB P.RMCT(R1) ;BUT ARE THERE RESIDENT MAPPED TASKS?' BNE 30$ ;IF NE YES, CANNOT CHECKPOINTN9 BIT #PS.COM,P.STAT(R1) ;IS IT AN UNMAPPED COMMON REGION?T BNE 40$ ;IF NE YES, IT CAN GOD8 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 CHECKPOINTE, BIT #T2.STP,T.ST2(R2) ;IS THE TASK STOPPED? BEQ 10$ ;IF EQ NOD. TST T.ASTL(R2) ;BUT DOES IT HAVE PENDING AST? BEQ 40$ ;IF EQ NO, IT CAN GO710$: BIT #TS.STP,T.STAT(R2) ;BLOCKED BY MCR BLOCK CMD ?  BNE 40$ ;IF NE YES, IT CAN GOE .IF DF S$$WPC( MOV $SWPR,R0 ;ASSUME TASK NOT IN MEMORY6 BIT #PS.CKP!PS.CKR!PS.OUT,P.STAT(R1) ;TASK IN MEMORY? BNE 15$ ;IF NE NOB .IF DF X$$HDR5 MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING FOR XTRNL HDRT& MOV P.HDR(R1),R0 ;SAVE HEADER POINTER BNE 12$ ;IF NE INTERNAL HEADER- MOV P.REL(R1),KISAR6 ;MAP TO EXTERNAL HEADERD0 MOV #140000,R0 ;RESET VIRTUAL ADDRESS OF HEADER12$: ;REFERENCE LABEL .IFF 00t__DATADATADATADATA; DF X$$HDRP- MOV P.HDR(R1),R0 ;GET ADDRESS OF TASK HEADER$ .ENDC ; DF X$$HDR6 MOVB H.SPRI(R0),R0 ;PICK UP CURRENT SWAPPING PRIORITY .IF DF X$$HDR0 MOV (SP)+,KISAR6 ;RESTORE PREVIOUS EXEC MAPPING .ENDC ; DF X$$HDR.15$: CLR -(SP) ;EXTRACT TASK PRIORITY AS WORD BISB T.PRI(R2),(SP) ;5 ADD (SP)+,R0 ;ADD TASK PRIORITY TO SWAPPING PRIORITYI. BMI 40$ ;IF MI WAITING TASK IS ALWAYS HIGHER) ;EFFECTIVE PRIORITY AND CAN THEREFOREU ;CHECKPOINTD5 BIT #PS.COM,P.STAT(R4) ;IS WAITING PCB FOR A COMMON?M BEQ 20$ ;IF EQ NOA+ INC R0 ;PRIORITY OF WAITING COMMON IS + 1/20$: CLR R2 ;INIT REGISTER TO EXTRACT PRIORITYR6 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 .IFF2 MOVB T.PRI(R2),R0 ;PICK UP RESIDENT TASK PRIORITY5 BIT #PS.COM,P.STAT(R4) ;IS WAITING PCB FOR A COMMON?  BEQ 20$ ;IF EQ NO + INC R0 ;PRIORITY OF WAITING COMMON IS + 1C320$: CMPB P.PRI(R4),R0 ;CAN WAITING PCB CHECKPOINT?O BHI 40$ ;IF HI YES .ENDC 30$: SEC ;SET CARRY FOR RETURN40$: RETURN ;C;+; **-$ICHKP-INITIATE CHECKPOINTT;H; THIS ROUTINE INITIATES THE CHECKPOINT OF THE SPECIFIED REGION. IT MAYC; BE CALLED ANY TIME REGARDLESS OF THE STATE OF ANY MAPPED TASKS OR.; OUTSTANDING I/O.;, ; INPUTS: ;I@; R1=ADDR OF PCB OF REGION FOR WHICH TO INITIATE THE CHECKPOINT.;M ; OUTPUTS:; A; THIS ROUTINE TAKES ONE OF THE FOLLOWING THREE ACTIONS DEPENDING %; ON THE CURRENT STATE OF THE REGION.T;=; 1. IF THE REGION IS ALREADY BEING CHECKPOINTED, THEN NOE; ACTION IS TAKEN.C;A; 2. IF THE REGION IS CURRENTLY BEING LOADED, OR THERE IS I/OT9; GOING INTO THE REGION, OR A TASK MAPPING THE REGION IS :; RUNNING ON ANOTHER PROCESSOR, THEN A CHECKPOINT REQUEST9; IS POSTED FOR THE REGION TO BE HONORED WHEN THE CONDI-E; TION IS REMOVED.T;EA; 3. IF NONE OF THE ABOVE CONDITIONS ARE TRUE THEN AN ATTEMPTH0; IS MADE TO CHECKPOINT THE REGION IMMEDIATELY.;T<; IF AN ATTEMPT IS TO BE MADE TO CHECKPOINT THE REGION, THIS; OCCURS AS FOLLOWS:;N@; 1. IF THE REGION IS A READ-ONLY INSTALLED REGION, THEN ITS:; SPACE IS SIMPLY DEALLOCATED BY THE LOADER. (HAVING THE;; LOADER DO THE DEALLOCATION SOLVES A PROBLEM OF UNLIMITEDO; RECURSION BACK TO $NXTSK.) ; @; 2. IF THE REGION IS A READ-WRITE INSTALLED REGION, THEN IT); IS CHECKPOINTED BACK TO ITS OWN IMAGE. ;D>; 3. FOR ALL OTHER REGIONS, AN ATTEMPT IS MADE TO ALLOCATE5; SPACE IN A CHECKPOINT FILE. IF THIS FAILS AND THEO9; REGION CONTAINS A TASK WITH CHECKPOINT SPACE ALLOCATED :; IN ITS CHECKPOINT FILE, THEN THIS SPACE IS USED. OTHER-.; WISE TKTN IS REQUESTED TO REPORT THE ERROR.;AA; IN ANY CASE, IF THE CHECKPOINT CAN OCCUR, THE FIRST STATUS WORDE@; 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 NO2 BIS #PS.CKR,P.STAT(R1) ;POST A CHECKPOINT REQUEST BR 70$ ;RETURN@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 ADDRESSR0 TSTB P.IOC(R3) ;ANY I/O IN PROGRESS TO REGION ? BEQ 7$ ;IF EQ NO7 BIS #PS.CKR,P.STAT(R3) ;YES, CAN ONLY POST REQUEST NOWC:7$: MOV P.ATT(R3),R2 ;POINT TO FIRST ATTACHMENT DESCRIPTOR BEQ 36$ ;IF EQ THERE IS NONE320$: TSTB A.MPCT(R2) ;IS THIS ATTACHED TASK MAPPED?G BEQ 35$ ;IF EQ NOF- MOV A.TCB(R2),R0 ;PICK UP TCB OF MAPPED TASKI) CMP R0,$TKTCB ;IS THIS THE CURRENT TASK?K .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 NO4 BIS #TS.CKR,T.STAT(R0) ;NOTE THE CHECKPOINT REQUEST2 BIS #PS.CKR,P.STAT(R3) ;POST A CHECKPOINT REQUEST .IFFE BNE 30$ ;IF NE NOT .ENDC%25$: CALL $SETCR ;FORCE RESCHEDULING3>30$: BIS #TS.CIP,T.STAT(R0) ;BLOCK TASK FOR CHECKPOINT IN PROG635$: MOV (R2),R2 ;POINT TO NEXT ATTACHMENT DESCRIPTOR BNE 20$ ;IF NE THERE001ibjbkb a a a IS ONEC9 BIT #PS.CKR,P.STAT(R3) ;WAS THERE ONLY A REQUEST POSTED?O# BNE 70$ ;IF NE YES, JUST EXIT NOWN: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 PCBC( CALL $ALOCB ;ALLOCATE A CHECKPOINT PCB# BCS 50$ ;IF CS ALLOCATION FAILUREK+ MOV R0,R4 ;SAVE POINTER TO CHECKPOINT PCB2+ ADD R1,R0 ;POINT TO END OF CHECKPOINT PCB23 MOV P.SIZE(R3),-(R0) ;STORE SIZE OF CHECKPOINT PCBS' ADD #7,(R0) ;ROUND TO NEXT DISK BLOCK " ROR (R0) ;CONVERT TO DISK BLOCKS ASR (R0) ; ASR (R0) ;6 MOV #$CFLPT,R5 ;POINT TO CHECKPOINT FILE PCB LISTHEAD440$: MOV (R5),R5 ;POINT TO NEXT CHECKPOINT FILE PCB BNE 80$ ;IF NE THERE IS ONE., MOV R4,R0 ;RETRIEVE CHECKPOINT PCB POINTER) MOV #P.DLGH,R1 ;SET LENGTH TO DEALLOCATE$ MOV R3,R5 ;SAVE PCB ADDRESSM( CALL $DEACB ;DEALLOCATE CHECKPOINT PCB! MOV R5,R3 ;RETRIEVE PCB ADDRESSK%50$: MOV R3,R1 ;RETRIEVE PCB ADDRESSE/ BIT #PS.COM,P.STAT(R1) ;IS THIS A TASK REGION?  BNE 60$ ;IF NE NOR& MOV P.TCB(R1),R0 ;PICK UP TCB ADDRESS; BIT #T3.CAL,T.ST3(R0) ;SPACE ALLOCATED IN TASK IMAGE FILE?  BNE 90$ ;IF NE YES, USE IT% BIC #TS.CIP,T.STAT(R0) ;UNBLOCK TASKB>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 DISPATCHERT/ CALLR $CTMSG ;GO SEND THE MESSAGE IF POSSIBLEH .IFF ;R$$PRO & BEQ 70$ ;IF EQ TKTN IS NOT INSTALLED .ENDC ;R$$PRO)65$: TST T.STAT(R0) ;TKTN ALREADY ACTIVE?N! BPL 70$ ;IF PL YES, JUST RETURNE JMP $EXRQN ;NO, REQUEST TKTN70$: RETURN ;S780$: TST P.REL(R5) ;IS THIS CHECKPOINT FILE TURNED OFF?C BNE 40$ ;IF NE YES3 CALL $FNDSP ;ATTEMPT TO ALLOCATE CHECKPOINT SPACEE# BCS 40$ ;IF CS ALLOCATION FAILURE#, CLR P.UCB(R4) ;P.UCB=0 FOR CHECKPOINT PCB'S6 MOV R5,P.MAIN(R4) ;STORE ADDRESS OF MAIN CKP FILE PCB5 MOV R4,P.DPCB(R3) ;STORE CHECKPOINT FILE PCB ADDRESS7%90$: MOV R3,R1 ;RETRIEVE PCB ADDRESSN7 MOV P.ATT(R1),R3 ;POINT TO FIRST ATTACHMENT DESCRIPTOR BEQ 120$ ;IF EQ THERE IS NONEE?100$: MOVB A.MPCT(R3),R0 ;PICK UP MAPPING COUNT THRU DESCRIPTORL BEQ 110$ ;IF EQ NO/ MOV A.TCB(R3),R2 ;PICK UP MAPPED TCB'S ADDRESS , INC T.STAT(R2) ;ADVANCE TASK BLOCKING COUNT9 BIC #TS.CIP,T.STAT(R2) ;CLEAR CHECKPOINT IN PROGRESS BITC7110$: MOV (R3),R3 ;POINT TO NEXT ATTACHMENT DESCRIPTORS BNE 100$ ;IF NE THERE IS ONE0120$: BIS #PS.CKP,P.STAT(R1) ;SET CHECKPOINT BIT9 BIT #PS.COM,P.STAT(R1) ;IS TARGET REGION A TASK REGION ?I BNE 125$ ;IF NE, NOD) MOV P.TCB(R1),R3 ;GET OWNING TCB ADDRESSE0 TSTB T.IOC(R3) ;TASK HAVE ANY OUTSTANDING I/O ?. BEQ 125$ ;IF EQ, NO NEED TO WORRY ABOUT IOSB7 BIS #T3.MPC,T.ST3(R3) ;SET MAPPING CHANGE TO FORCE ANY # ;OUTSTANDING I/O TO RE-MAP IOSBS125$: ;REFERENCE LABELK .IF DF A$$CNT4 BIT #BF.XTK,$ACNFE ;DOES CHECKPOINT BECAUE OF EXTK$ BNE 140$ ;IF NE YES ' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING) MOV $SABPT,KISAR6 ;MAP SABS( BEQ 130$ ;IF EQ, ACCOUNTING NOT ACTIVE2 BIT #BF.LSS,$ACNFE ;SYSTEM ACCOUNTING TURNED ON ? BEQ 130$ ;NO, IF EQ.( ADD #1,@#B.CKP+140002 ;COUNT CHECKPOINT ADC @#B.CKP+140000 ;F'130$: MOV (SP)+,KISAR6 ;RESTORE MAPPING3$140$: BIC #BF.XTK,$ACNFE ;CLEAR FLAG .ENDC;+&; **-$LOADT-PUT REGION IN LOADER QUEUE;ED; THIS ROUTINE PUTS A REGION IN THE LOADER QUEUE FOR AN INITIAL LOAD?; OR CHECKPOINT OPERATION. IF THE REGION IS A TASK REGION, ALLVE; OTHER REGIONS MAPPED BY THE TASK ARE EITHER ACCESSED OR DEACCESSED,C=; DEPENDING ON WHETHER THE TASK IS COMING IN OR OUT OF MEMORYEC; RESPECTIVELY. NOTE THAT IF THE TASK'S ATTACHMENT QUEUE IS EMPTY,IB; THEN THIS MUST BE THE INITIAL LOAD AND ALL REGIONS LINKED TO THE; TASK ARE MAPPED.;N ; INPUTS:L;; R1=ADDRESS OF PCB OF REGION-; ; OUTPUTS:;R; NONE;-3$LOADT::BIT #PS.COM,P.STAT(R1) ;IS IT A COMMON PCB?  BNE 50$ ;IF NE YES, TST P.ATT(R1)00"t__DATADATADATADATA ;ATTACHED TO TASK REGION YET? BNE 5$ ;IF NE YESE1 TALLY$ B.TLOD,XA$$TL ;COUNT AN INITIAL TASK LOADE$ BR 50$ ;LOADER DOES FIRST ACCESSES5$: ;REFERENCE LABELM MOV R1,-(SP) ;SAVE PCB ADDRESSI MOV R4,-(SP) ;SAVE R4& MOV P.TCB(R1),R4 ;PICK UP TCB ADDRESS: MOV #$ACCRG,-(SP) ;ASSUME ATTACHED REGIONS TO BE ACCESSED5 BIT #PS.OUT,P.STAT(R1) ;IS TASK REGION BEING LOADED?- BNE 10$ ;IF NE YES3 MOV #$DEARG,(SP) ;SET TO DEACCESS ATTACHED REGIONS <10$: MOV @T.ATT(R4),R4 ;PICK UP SECOND ATTACHMENT DESCRIPTOR#20$: BEQ 30$ ;IF EQ AT END OF LISTE. TSTB A.MPCT-A.TCBL(R4) ;IS THE REGION MAPPED? BEQ 25$ ;IF EQ NO;- MOV A.TCB-A.TCBL(R4),R0 ;PICK UP TCB ADDRESSA- MOV A.PCB-A.TCBL(R4),R1 ;PICK UP PCB ADDRESS,. CMP T.PCB(R0),R1 ;ATTACHMENT TO TASK REGION ? BNE 23$ ;IF NE NO-* CMP (SP),#$ACCRG ;ACCESSING TASK REGION ?* BEQ 25$ ;IF EQ YES, SKIP THIS ATTACHMENT.23$: CALL @(SP) ;CALL ACCESS/DEACCESS ROUTINE525$: MOV (R4),R4 ;PICK UP NEXT ATTACHMENT DESCRIPTORT BNE 20$ ;IF NE THERE IS ONEM30$: TST (SP)+ ;CLEAN STACK MOV (SP)+,R4 ;RESTORE R4T# MOV (SP)+,R1 ;RETRIEVE PCB POINTERP150$: MOV $LDRPT,R0 ;PICK UP TCB ADDRESS OF LOADER0;+; ** W A R N I N G **V;P; SPM HOOKPOINT NUMBER 12.;D); DO NOT CHANGE THE INSTRUCTION FOLLOWINGS; LABEL WITHOUT CHECKING SPM;-+$SPH12==. ;SPM CHANGES THE INSTRUCTION ATQ ;THE LOCATION OF THIS LABELH1 TSTB P.PRI(R1) ;CHECKPOINTING UNMAPPED COMMON OR5 ;MULTI-USER SECTION ?X BNE 60$ ;IF NE, NO3 MOVB #251.,P.PRI(R1) ;INSERT PCB AT FRONT OF QUEUEC60$: ;REFERENCE LABEL;+;; **-$EXRQP-EXECUTIVE REQUEST WITH QUEUE INSERT BY PRIORITY,4; **-$EXRQF-EXECUTIVE REQUEST WITH QUEUE INSERT FIFO5; **-$EXRQN-EXECUTIVE REQUEST WITH NO QUEUE INSERTIONC@; **-$EXRQU-EXECUTIVE UNSTOP AND REQUEST WITH NO QUEUE INSERTION6; **-$EXRQS-EXECUTIVE REQUEST WITH NO SCHEDULE REQUEST;LG; THESE ROUTINES PROVIDE A STANDARD INTERFACE TO ALL TASKS REQUESTED BYN; THE EXECUTIVE.; ; INPUTS:;E#; R0=TCB ADDRESS OF TASK TO REQUEST1@; R1=ADDR OF PACKET TO QUEUE TO TASK (IF ENTRY AT $EXRQP/$EXRQF);* ; OUTPUTS:;V0; C=0 IF THE REQUEST WAS SUCCESSFULLY COMPLETED.1; C=1 IF THE TASK WAS NOT SUCCESSFULLY REQUESTED.$!; Z=0 IF PCB ALLOCATION FAILURE.U5; Z=1 IF TASK ACTIVE, BEING REMOVED, OR BEING FIXED.W;- .ENABL LSBI@$EXRQP::MOV #$QINSP,-(SP) ;PUSH ADDR OF QUEUE INSERT BY PRIORITY BR 1$ ;JOIN COMMON CODEA9$EXRQF::MOV #$QINSF,-(SP) ;PUSH ADDR OF QUEUE INSERT FIFO..1$: ADD #T.RCVL,R0 ;POINT TO TASK RECEIVE LIST- CALL @(SP)+ ;INSERT PACKET IN RECEIVE QUEUEK+ SUB #T.RCVL,R0 ;POINT BACK TO START OF TCB5$EXRQN::BIT #T2.STP*2!T2.STP,T.ST2(R0) ;TASK STOPPED?  BEQ 2$ ;IF EQ NO;$EXRQU::BIC #T2.STP*2!T2.STP,T.ST2(R0) ;CLEAR TASK STOP BITE;+; ** W A R N I N G **I;R; SPM HOOKPOINT NUMBER 07.;); DO NOT CHANGE THE INSTRUCTION FOLLOWINGS; LABEL WITHOUT CHECKING SPM;-+$SPH07==. ;SPM CHANGES THE INSTRUCTION ATS ;THE LOCATION OF THIS LABELT1 CALL @#$SETCR ; SET CONDITIONAL SCHEDULE REQUEST$EXRQS:: ;REF LABELA2$: CLR R1 ;USE DEFAULT UIC .DSABL LSBI;+&; **-$TSKRT-TASK REQUEST (DEFAULT UCB)&; **-$TSKRQ-TASK REQUEST (SPECIFY UCB).; **-$TSKRP-TASK REQUEST (SPECIFY DEFAULT UIC);R<; THIS ROUTINE IS CALLED TO REQUEST THE EXECUTION OF A TASK.; ; INPUTS:U;R4; R0=ADDRESS OF THE TCB OF THE TASK TO BE REQUESTED.; R1=REQUEST UIC.C$; R2=UCB ADDRESS IF ENTRY AT $TSKRQ.$; R3=DEFAULT UIC IF ENTRY AT $TSKRP.; ; OUTPUTS:;<; C=1 IF TASK IS ALREADY ACTIVE OR IS BEING FIXED IN MEMORY.%; Z=1 IF TASK ACTIVE OR BEING FIXED.U!; Z=0 IF PCB ALLOCATION FAILURE.S/; C=0 IF THE REQUEST IS SUCCESSFULLY COMPLETED.R;-7$TSKRT::MOV $COPT,R2 ;GET ADDRESS OF COMMAND OUTPUT UCB 0$TSKRQ::MOV R1,R3 ;MAKE CURRENT UIC DEFAULT UIC?$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?Z BEQ 100*1ibjbkb a a a$ ;IF EQ NO5 BIT #PS.OUT!PS.CKP,P.STAT(R1) ;TASK OUT OF MEMORY OR= ;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 UICU% BIC (SP),T.STAT(R0) ;SET TASK ACTIVEM# CLR (SP) ;CLEAR FAILURE INDICATORT;+; ** W A R N I N G **A;A; SPM HOOKPOINT NUMBER 02.;M); DO NOT CHANGE THE INSTRUCTION FOLLOWINGP; LABEL WITHOUT CHECKING SPM;-+$SPH02==. ;SPM CHANGES THE INSTRUCTION ATA ;THE LOCATION OF THIS LABEL * MOV R2,T.UCB(R0) ;SET ADDRESS OF 'TI' UCB. 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 ADDRESS;( MOV (SP)+,R0 ;RETRIEVE TASK TCB ADDRESS ROR (SP) ;CAPTURE CARRY BIT ) BEQ 3$ ;IF EQ ALLOCATION WAS SUCCESSFULT' BIS (SP),T.STAT(R0) ;SET TASK INACTIVES" INC (SP) ;SET ALLOCATION FAILURE' CMP R0,$TKNPT ;TRYING TO REQUEST TKTN?T BEQ 40$ ;IF EQ YES BR 10$ ;3$:D .IF DF N$$DIR$ CALL SETDDS ;SET UP POINTER TO DDS .ENDC ; DF N$$DIR .IF DF A$$CNT0 CALL ACNTSK ;SET UP ACCOUNTING DATA STRUCTURES .ENDC1 MOV T.PCB(R0),R1 ;GET MAIN PARTITION PCB ADDRESSS' MOV R3,R2 ;COPY ALLOCATED PCB ADDRESS / MOV R2,T.PCB(R0) ;SET ADDRESS OF ALLOCATED PCB TST (R2)+ ;SKIP OVER LINK WORD0 CLR (R2)+ ;INIT PRIORITY AND RES. MAPPED COUNT+ MOV P.NAM(R1),(R2)+ ;INSERT PARTITION NAME, MOV P.NAM+2(R1),(R2)+ ;/ CLR (R2)+ ;CLEAR POINTER TO NEXT SUBPARTITION5 MOV R1,(R2)+ ;SET BACK POINTER TO MAIN PARTITION PCBS" CLR (R2)+ ;CLEAR RELOCATION BASE7 MOV T.MXSZ(R0),(R2)+ ;SET PARTITION SIZE IN 32W BLOCKS% CLR (R2)+ ;CLEAR WAIT QUEUE POINTERI9 MOV P.SIZE-P.SWSZ(R2),(R2)+ ;SET SWAP SIZE FROM PAR SIZED" CLR (R2)+ ;ZERO DISK PCB ADDRESS$ MOV R0,(R2)+ ;SET OWNER TCB ADDRESS; MOV #PS.DEL!PS.OUT,(R2)+ ;MARKED FOR DELETE, OUT OF MEMORYC/ BIT #T2.CHK,T.ST2(R0) ;IS TASK CHECKPOINTABLE?, BEQ 4$ ;IF EQ YES2/ BIS #PS.CHK,-2(R2) ;MAKE PCB NONCHECKPOINTABLET.4$: CLR (R2)+ ;INITIALLY CLEAR HEADER POINTER" CLR (R2)+ ;CLEAR PROTECTION WORD0 MOV R2,R1 ;SAVE POINTER TO ATTACHMENT LISTHEAD' CLR (R2)+ ;SET UP ATTACHMENT LISTHEADW MOV R1,(R2)+ ;I .IF DF X$$HDR7 MOVB T.HDLN(R0),(R2)+ ;INIT XTRNL HEADER SIZE (P.HDLN)R .IFF ; DF X$$HDRM& TSTB (R2)+ ;SKIP XTRNL HEADER LENGTH .ENDC ; DF X$$HDR MOV R0,-(SP) ;SAVE TCB ADDRESSB;+; ** W A R N I N G **S;H; SPM HOOKPOINT NUMBER 11.; ); DO NOT CHANGE THE INSTRUCTION FOLLOWINGK; LABEL WITHOUT CHECKING SPM;-+$SPH11==. ;SPM CHANGES THE INSTRUCTION ATO ;THE LOCATION OF THIS LABELO/ CLRB (R2)+ ;ZERO PARTITION I/O COUNT (P.IOC) ! MOV R3,R1 ;RETRIEVE PCB ADDRESS ! CALL $ACCRG ;ACCESS TASK REGIONR BR 30$ ;#10$: MOV R0,-(SP) ;SAVE TCB ADDRESSF4 MOV T.PCB(R0),R0 ;GET ADDRESS OF TASK PARTITION PCB CALL $NXTSK ;SELECT NEXT TASKR BR 30$ ;#20$: MOV R0,-(SP) ;SAVE TCB ADDRESSG .IF DF N$$DIR$ CALL SETDDS ;SET UP POINTER TO DDS .ENDC ; DF N$$DIR .IF DF A$$CNT0 CALL ACNTSK ;SET UP ACCOUNTING DATA STRUCTURES .ENDC) CALL $BILDS ;BUILD A STACK FOR THE TASK)&30$: MOV (SP)+,R0 ;RESTORE TCB ADDRESS .IF DF V$$TRM" TST (SP) ;SUCCESSFUL ACTIVATION? BMI 40$ ;IF MI NO0* MOV T.UCB(R0),R1 ;PICK UP TI: UCB ADDRESS MOV (R1),R2 ;POINT TO DCBS8 CMP D.NAM(R2),#"VT ;IS THE TI: A VIRTUAL TERMINAL UNIT? BNE 40$ ;IF NE NOR2 INCB U.OCNT(R1) ;INCREMENT ACTIVE OFFSPRING COUNT .ENDC40$: .IF DF N$$DIR+ CLR $CTXPT ;CLEAR OUT FOR FUTURE REQUESTSL .ENDC ;DF N$$DIRO+ ASL (SP)+ ;SET SUCCESS/FAILURE INDICATIONL RETURN ;A;RE; LOCAL ROUTINE TO PROPAGATE THE DEFAULT DIRECTORY STRING TO THE TASK; WHICH IS STARTING UP;T .IF DF N$$DIR0SETDDS: MOV $CTXPT,R1 ;GET SPECIAL DDS SPECIFIED BEQ 20$ ;IF EQ, NONE MOV R1,T.CTX(R0) ;PUT INTO TCBI" CLR $CTXPT ;RESET $CTXPT TO ZERO BR 40$ ;BRANCH AROUNDC"20$: MOV T.UCB(R0),R1 ;GET TI: UCB% BIT #DV.PSE,U.CW1(R1);PSEUDO DEVICE002t__DATADATADATADATA? & BNE 60$ ;IF NE, YES - NO CONTEXT PTR, MOV U.CTX(R1),R1 ;GET CONTEXT BLOCK POINTER" BEQ 60$ ;IF EQ, NO CONTEXT BLOCK/ MOV R1,T.CTX(R0) ;PUT POINTER TO DDS INTO TCBA+40$: MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING! MOV R1,KISAR6 ;MAP CONTEXT BLOCKD, INCB C.REF+MAP6 ;INCREMENT REFERNCE COUNTER" MOV (SP)+,KISAR6 ;RESTORE MAPPING 60$: RETURN. .ENDC ;DF N$$DIRI;$G; LOCAL ROUTINE TO SET UP ACCOUNTING DATA STRUCTURES FOR THE TASK BEING) ; ACTIVATEDU; .IF DF A$$CNTACNTSK:E MOV R4,-(SP) ;SAVE R4 MOV R0,R4 ;SAVE TCB ADDRESSC' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGQ MOV T.UCB(R0),R0 ;LOCATE TI UCB CMP $COPT,R0 ;IS TI: = CO:  BEQ 10$ ;IF EQ YES+ MOV U.UAB(R0),R0 ;TRY TO LOCATE TASK'S UABM BNE 30$ ;IF NE, THERE IS A UAB .IF DF V$$TRM( MOV T.UCB(R4),R1 ;LOCATE TASK'S TI: UCB MOV (R1),R0 ;POINT TO DCB.. CMP D.NAM(R0),#"VT ;IS IT A VIRTUAL TERMINAL? BNE 20$ ;IF NE NOD* MOV U.PTCB(R1),R1 ;LOCATE PARENT TASK TCB4 BEQ 20$ ;IF EQ, USE $SYUAB SINCE CAN'T FIND PARENT% MOV T.ACN(R1),R0 ;TRY TO USE ITS UABS' BEQ 20$ ;IF EQ, USE $SYUAB AS DEFAULTN'5$: MOV R0,KISAR6 ;MAP ACCOUNTING BLOCKP) CMPB #BT.UAB,@#B.TYP+140000 ;IS IT A UABY BEQ 30$ ;IF EQ YES1 MOV @#B.PNT+140000,R0 ;GET ADDRESS OF NEXT BLOCK  BR 5$ ;CHECK ITD .IFF ;V$$TRMT# BR 20$ ;USE $SYUAB AS DEFAULT UABV .ENDC ;V$$TRM210$: MOV $CKUAB,R0 ;GET UAB ADDRESS FROM CLQ BLOCK BNE 30$ ;IF NE, THERE IS ONE120$: MOV $SYUAB,R0 ;USE SYSTEM UAB AS LAST RESORT ' BEQ 90$ ;IF EQ, ACCOUNTING NOT ACTIVET30$: MOV R0,KISAR6 ;MAP UABA) INCB @#B.USE+140000 ;INCREMENT USE COUNTN2 INC @#B.ACT+140000 ;INCREMENT ACTIVE TASK COUNTER. MOV #B.TAS,R1 ;GET OFFSET TO TASK COUNT FIELD% CALL $ADAT1 ;INCREMENT TASK COUNTERD MOV #BS.ACT,R1 ;ACTIVATE TABC/ BIT #BF.TSK,$ACNFE ;TASK ACCOUNTING TURNED ON?B BNE 50$ ;IF NE YES7 MOV T.EFLM(R4),-(SP) ;CHECK FOR ANY TIME LIMIT ON TASKM BIS T.EFLM+2(R4),(SP)+ ;E BEQ 80$ ;IF EQ, NO TIME LIMIT00 BIS #BS.TML,R1 ;SET TIME LIMIT ONLY BIT FOR TAB;C; CREATE TAB FOR TASK0;M3; TKTN CANNOT HAVE A TAB, BECAUSE IT GETS REQUESTEDN0; IN THE PROCESSING OF A TAB ALLOCATION FAILURE.;A+50$: CMP $TKNPT,R4 ;IS TKTN BEING REQUESTEDK BEQ 80$ ;IF EQ YES MOV KISAR5,-(SP) ;SAVE KISAR5 MOV R0,-(SP) ;SAVE UAB ADDRESSB# MOV R1,-(SP) ;SAVE VALUE FOR B.STMR MOV #B.TBLK,R1 ;LENGTH OF TAB MOV R3,-(SP) ;SAVE R3 CALL $ALTAB ;ALLOCATE A TABM MOV (SP)+,R3 ;RESTORE$ BCS 75$ ;IF CS, ALLOCATION FAILURE1 MOV R0,2(SP) ;REPLACE UAB ADDR WITH THE TAB ADDR# MOV R0,KISAR5 ;MAP TAB WITH KISAR5N; MOV #!BT.TAB,@#B.TYP+120000 ;TAB IDENTIFACTIONE3 MOV #B.HID+120000,R1 ;POINT TO USER ID AREA OF TABP55$: MOV R1,R2 ;COPY ADDRESS/ MOV 20000(R2),(R1)+ ;COPY WORD FROM UAB TO TABA+ CMP #B.HEND+120000,R1 ;ENTIRE AREA COPIED?, BHI 55$ ;IF HI NO 8 MOV #/2,R2 ;GET NUMBER OF WORDS TO CLEAR060$: CLR (R1)+ ;CLEAR ACCUMULATION FIELD IN TAB SOB R2,60$ ;LOOP2 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)M+ MOV (R1)+,-(SP) ;CHECK IF THERE IS A LIMITD BIS (R1),(SP)+ ;# BEQ 70$ ;IF EQ, NO LIMIT7 MOV -2(R1),@#B.CPU+120000 ;COPY LIMIT INTO B.CPU FIELD2 MOV (R1),@#B.CPU+2+120000 ;0 COM @#B.CPU+120000 ;CONVERT TO 1'S COMPLIMEMENT3 COM @#B.CPU+2+120000 ;TO ENABLE DETECTION WITH BCS/70$: TST (R1)+ ;POINT TO B.PNTR( MOV KISAR6,(R1)+ ;INSERT POINTER TO UAB' CMP T.UCB(R4),$COPT ;IS CO: TASK'S TI:L BNE 73$ ;IF NE NOO# BIS #BS.CO,(SP) ;SET INDICATOR BITR"73$: MOVB (SP),(R1)+ ;INSERT B.STM3 MOVB T.PRI(R4),(R1)+ ;INSERT INITIAL TASK PRIORITYI& MOV T.NAM(R4),(R1)+ ;INSERT TASK NAME MOV T.NAM+2(R4),(R1)+ ;! MOV R4,(R1)+ ;INSERT TCB ADDRESSP MOV R0,R1 ;COPY ADDRESS OF TAB* MOV #B.BEG,R0 ;TASK ACTIVATION TIME FIELD CALL $TMSTP ;TIME STAMP TAB0&75$: TST (SP)+ ;CLEAN B.STM OFF STACK+ MOV (SP)+,R0 ;GET ADDR OF ACCOUNTING BLOCK ! MOV (SP)+,KISAR5 ;RESTORE KISAR5R480$: MOV R0,T.ACN(R4) ;LINK ACCOUNTING BLOCK OFF TCB%90$: MOV (SP)+,KISAR6 ;RESTORE KISAR6: M00:1ibjbkb a a aOV R4,R0 ;RESTORE TCB ADDRESS MOV (SP)+,R4 ;RESTORE R4  RETURNA .ENDC;+1; **-$UISET-ESTABLISH DEFAULT UIC AND CURRENT UIC(;+B; THIS ROUTINE ESTABLISHES DEFAULT AND CURRENT FOR REQUESTED TASKS; IN MULTI-USER SYSTEMS.;T ; INPUTS:E;E; R1=REQUEST UIC2; R2=ADDRESS OF SECOND STATUS WORD OF CURRENT TASK&; R4=ADDRESS OF HEADER OF CURRENT TASK; ; OUTPUTS:;P; R1=CURRENT UIC; R3=DEFAULT UIC4; C=1 IF NONPRIVILEGED TASK IS TRYING TO CHANGE UIC; C=0 OTHERWISE;- .IF DF M$$MUP0$UISET::MOV H.DUIC(R4),R3 ;PROPAGATE DEFAULT UIC TST R1 ;UIC SPECIFIED? BEQ 10$ ;IF EQ NOA MOV R1,R3 ;USE SPECIFIED UIC, BIT #T3.PRV,2(R2) ;CURRENT TASK PRIVILEGED? BNE 20$ ;IF NE YES4 CMP R1,H.CUIC(R4) ;NONPRIVILEGED TASK CHANGING UIC? BEQ 10$ ;IF EQ NO2 SEC ;ELSE RETURN C-BIT SETO810$: MOV H.CUIC(R4),R1 ;FORCE PROPAGATION OF CURRENT UIC20$: RETURN ; .ENDC;+#; **-$MAPTK-MAP TASK ADDRESS WINDOWE; B; THIS ROUTINE IS CALLED TO MAP THE FIRST WINDOW BLOCK IN A TASK'S1; HEADER IN A MAPPED SYSTEM FROM ITS PCB AND TCB.C;T ; INPUTS: ;C;; R1=POINTER TO NUMBER OF WINDOW BLOCKS IN THE TASK HEADER.4; R5=ADDRESS OF THE TASK CONTROL BLOCK FOR THE TASK.;I ; OUTPUTS:;R.; R1=ADDRESS OF LAST PDR IMAGE IN TASK HEADER.; R2 IS MODIFIED.2;-.$MAPTK::TST (R1)+ ;POINT TO TASK WINDOW BLOCK+ MOV T.PCB(R5),R2 ;PICK UP TASK PCB ADDRESST, 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 NO. ADD #W.BLGH-2,R1 ;POINT TO WINDOW 1 (D-SPACE)' MOV R2,(R1)+ ;SET UP TASK PCB (W.BPCB)D2$: ;REFERENCE LABELD .ENDC ; DF U$$DAS .IF DF P$$LAS4 BIT #T3.ROV,T.ST3(R5) ;TASK HAVE RESIDENT OVERLAYS?/ BNE 20$ ;IF NE AS, DON'T CHANGE WINDOW BLOCK .IFTF5 MOV (R1)+,(R1) ;INIT HIGH VIRT ADDR (W.BLVR)(W.BHVR))* MOV P.SIZE(R2),R2 ;PICK UP PARTITION SIZE .IFTS5 SUB T.OFF(R5),R2 ;REDUCE BY TASK OFFSET IN PARTITIONP .IFTF( MOV R2,-(SP) ;PUSH REQUIRED WINDOW SIZE SWAB (SP) ;CONVERT TO BYTESR RORB (SP) ;D ROR (SP) ; ROR (SP) ;7 ADD (SP)+,(R1) ;COMPLETE HIGH VIRTUAL ADDRESS (W.BHVR) DEC (R1)+ ;D .IFT.* TST (R1)+ ;POINT TO WINDOW SIZE (W.BATT)' MOV R2,(R1)+ ;SET WINDOW SIZE (W.BSIZ) 6 MOV T.OFF(R5),(R1)+ ;SET OFFSET IN PARTITION (W.BOFF)" INC R1 ;POINT TO NUMBER OF PDR'S .IFFM5 ADD #W.BNPD-W.BATT,R1 ;POINT TO NUMBER OF PDR'S BYTEB .IFTF$ ASL R2 ;SHIFT # PDR'S TO HIGH BYTE2 SWAB R2 ;# PDR'S TO LO BYTE, LAST PDR SIZE TO HI. SUB #377,R2 ;INC # PDR'S & DEC LAST PDR SIZE. SBC R2 ;IF CS, EVEN BOUNDARY, REDUCE # PDR'S, MOVB R2,(R1)+ ;SET NUMBER OF PDR'S (W.BNPD) ROR R2 ;ADJUST CORRECT SIZE1- MOV R2,(R1) ;SET SIZE FOR LAST PDR (W.BLPD))2 MOVB #6,(R1) ;SET FOR READ/WRITE ACCESS (W.BLPD)10$: RETURN ;T .IFTBA20$: MOV T.OFF(R5),W.BOFF-2(R1) ;SET OFFSET IN PARTITION (W.BOFF)B: ADD #W.BLPD-W.BLVR,R1 ;POINT TO LAST WORD OF WINDOW BLOCK RETURN ;' .ENDC;+"; **-$CALTA-CALCULATE TRAP ADDRESS;IF; THIS ROUTINE IS CALLED TO CALCULATE WHETHER A TRAP ADDRESS SHOULD BEB; STORED ODD (SERVICE IN SUPERVISOR MODE) OR EVEN (SERVICE IN USERC; MODE), ACCORDING TO THE PREVIOUS MODE FROM THE DIRECTIVE CALL ANDOF; THE VALUE OF THE LOW ORDER BIT OF THE ADDRESS SPECIFIED (1 = SERVICE; IN "OTHER" MODE).;F ; INPUTS:M;T; R2=SPECIFIED ADDRESS.T;F ; OUTPUTS:;N; R2=TRAP ADDRESS TO BE STORED.1 ; ALL OTHER REGISTERS PRESERVED.;- .IF DF S$$LIB($CALTA::TST R2 ;TRAP ADDRESS SPECIFIED?# BEQ 20$ ;IF EQ NO, RETURN AS ZEROA2 BIT #^CPSMODE&PMODE,PS ;PREVIOUS MODE SUPERVISOR?& BNE 20$ ;IF NE NO, USE ADDRESS AS IS# BIT #1,R2 ;ODD ADDRESS SPECIFIED?T BEQ 10$ ;IF EQ NOR) DEC R2 ;MAKE ADDRESS EVEN FOR USER MODET BR 20$ ;210$: INC R2 ;MAKE ADDRESS ODD FOR SUPERVISOR MODE20$: RETURN ; .ENDC .ENDSPECIFIED ADDRESS.T;F ; OUTPUTS:;N; R2=TRAP ADDRESS TO BE STORED.1 ; ALL OTHER REGISTERS PRESERVED.;- .IF DF S$$LIB($CALTA::TST R2 ;TRAP ADDRESS SPECIFIED?# BEQ 20$00Bt__DATADATADATADATA .TITLE OLRSR .IDENT /04.03/T;N1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.C; All rights reserved.;1<; 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:M;P; P. J. BEZEREDI; ; MODIFIED BY:;+; J. M. LAWLER 01-JUN-82 04.01;M,; JL110 -- CONDITIONALIZE MODULE ON R$$CON &; ADD SUBROUTINE $VOLSC FOR PHASE 2"; SUPPORT OF AUTOMOUNT/DISMOUNT;; D. Carroll 16-May-1993 04.109; DC210 -- Addition of KS.MRC support for multiprocessors*; KRB simplification of IIST,DT07,MKA11;A; D. Carroll 18-Oct-1995 04.116; DC404 -- Include PSECT definition to allow for full(; expansion of ICB pool during sysgen;F;R;1); ONLINE RECONFIGURATION SERVICE ROUTINESI;  ;DC404. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404;+3; **-$KRBSC-CALL DRIVER AT KRB STATUS CHANGE ENTRY.V;CB; 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 ARE18; DETAILED IN THE ROUTINE BODY. IF THE ENTRY ADDRESS = 09; THEN THE DRIVER OR COMMON INTERRUPT ROUTINE WILL NOT BEF ; CALLED. ;I ; INPUTS:U;I3; $SCDEV=KRB ADDRESS OF CONTROLLER CHANGING STATUS.K"; $SCOFL=BYTE FLAG ONLINE/OFFLINE:;'; -1 --> ONLINE TO OFFLINE TRANSITION. '; 0 --> OFFLINE TO ONLINE TRANSITION.A;; 100 --> OFFLINE TO ONLINE TRANSITION SPECIAL CASE.T;D3; $SCCTB=CTB ADDRESS OF CONTROLLER CHANGING STATUS.H.; $SCURM=URM OF MULTI-URM CONTROLLER TO CHANGE;N ; OUTPUTS:; =; DRIVER HAS BEEN CALLED AT ENTRY. WHEN $SCDEV GOES TO ZERO,TB; THEN $SCERR (BYTE VALUE) CONTAINS STATUS (I.E. WHETHER OPERATION?; WAS ACCEPTED OR REJECTED). NEGATIVE VALUES SIGNAL REJECTION,S$; ONE SIGNALS SUCCESSFUL COMPLETION.;B; $SCDEV MAY TAKE SOME TIME TO GO TO ZERO. ALLOW AT LEAST 60 SECS.; ; NO REGISTERS ARE PRESERVED.O;I"; APR5/APR6 MAPPING IS PRESERVED.;<; NOTE: $KRBSC AND $UCBSC MUST NOT BE USED TOGETHER, AS THEY%; USE COMMON PARAMETER PASSING AREAS.N;-( .IF DF R$$CON ;RECONFIGURATION SUPPORT .ENABL LSB$&$KRBSC::MOV $SCCTB,R3 ;GET CTB ADDRESS$ MOVB #1,$SCERR ;SHOW SUCCESS STATUS' MOV KINAR5,-(SP) ;SAVE I-SPACE MAPPING  .IF DF K$$DAS' MOV KDSAR5,-(SP) ;SAVE D-SPACE MAPPINGM .ENDC8 MOV #REMAP,-(SP) ;SET ADDRESS TO RESTORE KISAR5, KDSAR5+ MOV L.DCB(R3),R4 ;GET DCB POINTER FROM CTB8 BITB #LS.CIN,L.STS(R3) ;IS THIS A COMMON INTERRUPT CTB? BNE 10$ ;IF NE YES;D:; DRIVER IS NOT COMMON INTERRUPT DRIVER -- HAS UCB AND MAY; OR MAY NOT BE LOADED DRIVER.;A1 MOV D.UCB(R4),R5 ;GET ANY UCB FOR DRIVER MAPPINGG, 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 CODE25$: MOV U.SCB(R5),R2 ;GET SCB ADDRESS (OF ANY SCB)) MOV S.KS5(R2),KINAR5 ;MAP DRIVER I SPACE( .IF DF K$$DAS) MOV S.KS5(R2),KDSAR5 ;MAP DRIVER D SPACE .ENDC BR 15$ ;REENTER FLOW910$: ADD #CI.KRB-D.VKRB,R4 ;MAKE R4 LOOK LIKE DDT POINTER15$: ;REFERENCE LABEL .IF DF M$$PRO MOV $SCDEV,R2 ;GET KRB ADDRESS 8 BIT #KS.MRC,K.STS(R2) ; IS THIS A MULTI-URM CONTROLLER?! BNE 18$ ; IF NE YES, USE $SCURMW4 MOV K.URM(R2),$SCURM ; USE CONTROLLER SPECIFIED URM+18$: MOV $SCURM,R2 ; SELECT THE DESIRED URM MOV #20$,R3 ;SET UP FOR $EXROP CALLR $EXROPM .IFTF;C&; AT THIS POINT, WE ARE ON CORRECT CPU;S20$: ;REFERENCE LABEL .IFT% MOV $SCCTB,R3 ;GET CTB ADDRESS AGAINB .ENDC MOV $SCDEV,R2 ;GET KRB ADDRESS:) 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;M>; 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.@; OT00J1ibjbkb a a aHERWISE, TEST THE CSR JUST LIKE WE DO FOR ALL OTHER DEVICES.;E0 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 ZERO:# BEQ 23$ ;IF EQ YES -- NORMAL TESTF;5; CALL COMMON INTERRUPT DRIVER AT CI.CSR ENTRY POINT.;V; ENTRY CONDITIONS:O;S; R2=KRB ADDRESS. ; R3=CTB ADDRESS.S;7; $SGFIN HAS BEEN CALLED, THEREFORE DRIVER IS PROTECTED,5; FROM NXM TRAPS. ON TST INSTRUCTIONS, IF C BIT CLR, 6; THEN LOCATION WAS THERE. IF C BIT SET, THEN LOCATION; CAUSED A NXM TRAP.;.3; NO REGISTERS ARE AVAILABLE FOR USE -- DRIVER MUSTV&; SAVE AND RESTORE ANY REGISTERS USED.;T; EXIT CONDTIONS:K;(; NO REGISTERS CAN BE CHANGED.; ; IF DEVICE PRESENT, C BIT CLR.A#; IF DEVICE NOT PRESENT, C BIT SET.E;Y. CALL @D.VKRB+(R4) ;CALL DRIVER BR 24$ ;REENTER CODE FLOW#23$: TSTB @(R2) ;IS THE CSR THERE?R24$: 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;@; CALL DRIVER AT KRB STATUS CHANGE ENTRY. ENTRY CONDITIONS ARE:;C; INPUTS TO DRIVER:A; ); R2=KRB ADDRESS FOR KRB CHANGING STATUS.C#; R3=CTB ADDRESS FOR THE ABOVE KRB. ); 0(SP)=RETURN ADDRESS FOR COMPLETION.T.; 2(SP)=RETURN ADDRESS TO CALLER OF $KRBSC.'; CARRY BIT CONTAINS STATUS TRANSITION:S;R(; C=1 --> ONLINE TO OFFLINE TRANSITION.(; C=0 --> OFFLINE TO ONLINE TRANSITION.;O ; $SCERR=1. =; $SCOFL=POSITIVE/NON-ZERO IF SPECIAL OFFLINE TO ONLINE CASE.O;I#; 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;IA; AT THIS TIME, THE CARRY BIT CONTAINS INFORMATION FOR THE DRIVERY;T<40$: MOV D.VKRB(R4),R0 ;TEST FOR ZERO WITHOUT CHANGING C-BIT! BEQ 50$ ;IF EQ DONT CALL DRIVER> CALL @D.VKRB(R4) ;CALL DRIVER#50$: MOV $SCDEV,R2 ;GET KRB ADDRESS .IF DF M$$PRO>8 BIT #KS.MRC,K.STS(R2) ; IS THIS A MULTI-URM CONTROLLER?) BNE $OLRNT ; YES, DRIVER RESPONSIBILITY .ENDC ;DF,M$$PROE# MOVB $SCOFL,R0 ;GET DESIRED STATUSI MOVB $SCERR,R1 ;GET ERROR TYPE SXT R1 ;MAKE R1 ALL 1'S OR 0'S- XOR R1,R0 ;FLIP BITS IN R0 IF R1 SHOW ERRORA+ BIC #^C,R0 ;R0 CONTAINS KS.OFL BIT= BIC #KS.OFL,K.STS(R2) ;MAKE SURE OFFLINE BIT IS PROPER STATEB4 BIS R0,K.STS(R2) ;SET OFFLINE BIT TO DESIRED STATUS;+8; **-$OLRNT-ONLINE RECONFIGURATION NOTIFICATION ROUTINE.;$=; THIS ROUTINE WILL CLEAR $SCDEV AND SET EVENT FLAG 1 FOR THE; TASK POINTED TO BY $HRCPT.;S ; INPUTS:.;C; NONE.R; ; OUTPUTS:; ; NONE.R;S; 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 $SETFI7 BIT #T2.SEF,T.ST2(R5) ;IS TASK STOPPED FOR EVENT FLAG?F( 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 ONE 60$: RETURN;+9; **-$UCBSC-CALL DRIVER AT UCB STATUS CHANGE ENTRY POINT.O;P@; THIS ROUTINE WILL CALL A DRIVER AT ITS UCB STATUS CHANGE ENTRY; POINT.;. ; INPUTS:S;B2; $SCDEV=UCB ADDRESS OF UNIT WITH CHANGING STATUS.-; $SCOFL=BYTE VALUE OF DESIRED STATUS CHANGE:T;L'; -1 --> ONLINE TO OFFLINE TRANSITION. (; 0 --> OFFLINE TO ONLINE TRANSITION.;; 100 --> OFFLINE TO ONLINE TRANSITION SPECIAL CASE.A;# ; OUTPUTS:;T>; DRIVER HAS BEEN CALLED AT D.VUCB ENTRY00Rt__DATADATADATADATA. 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. ;-&$UCBSC::MOV $SCDEV,R5 ;GET UCB ADDRESS .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 ADDRESSE) MOV K.URM(R3),S.URM(R4) ;SET URM FOR SCB 65$: ;REFERENCE LABEL .ENDC' MOV KINAR5,-(SP) ;SAVE I-SPACE MAPPING  .IF DF K$$DAS' MOV KDSAR5,-(SP) ;SAVE D-SPACE MAPPINGA .ENDC8 MOV #REMAP,-(SP) ;SET ADDRESS TO RESTORE KISAR5, KDSAR5 .IF DF M$$PRO0 CALL $IFORK ;CONTINUE EXECUTION ON CORRECT CPU .ENDC;D/; WE ARE NOW EXECUTING ON THE CORRECT PROCESSORV;S"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 LOADEDC;5; DRIVER IS NOT LOADED;.$ 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 KRB5( MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX85$: ;REFERENCE LABEL .IF NDF M$$PRON, MOV S.KS5(R4),KINAR5 ;SET UP KERNEL MAPPING .IF DF K$$DAS7 MOV S.KS5(R4),KDSAR5 ;SET UP KERNEL DATA SPACE MAPPINGS .ENDC .ENDC3 TST D.VUCB(R2) ;DOES THE DRIVER WANT TO BE CALLED?E BEQ 90$ ;IF EQ NO 4 ASRB $SCOFL ;SET CARRY BIT FOR DRIVER IF NECESSARY; ); CALL DRIVER AT UCB STATUS CHANGE ENTRY.$;R; INPUTS TO DRIVER:S;M5; R3=CONTROLLER INDEX. IF S.KRB=0 THEN R3 UNDEFINED.R); R4=ADDRESS OF THE STATUS CONTROL BLOCK.X'; R5=ADDRESS OF THE UNIT CONTROL BLOCK.M); 0(SP)=RETURN ADDRESS FOR COMPLETION.N.; 2(SP)=RETURN ADDRESS TO CALLER OF $UCBSC.'; CARRY BIT CONTAINS STATUS TRANSITION:S;(; C=1 --> ONLINE TO OFFLINE TRANSITION.(; C=0 --> OFFLINE TO ONLINE TRANSITION.; ; $SCERR=1.A=; $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.N'; $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.);A,; ALL REGISTERS ARE AVAILABLE TO THE DRIVER.;O 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 CASEO3 BISB R0,U.ST2(R5) ;SET ACTUAL BIT VALUE INTO U.ST2S" BR $OLRNT ;EXIT THRU COMMON CODE .DSABL LSBR; =; REMAP -- RESET KINAR5/(KDSAR5) WITH SAVED VALUE AND RETURN.;:REMAP: ;REFERENCE LABEL .IF DF K$$DAS. MOV (SP)+,KDSAR5 ;RESTORE DATA SPACE REGISTER .ENDC/ MOV (SP)+,KINAR5 ;RESTORE ALTERNATIVE REGISTERB RETURNR;+&; **-$CPUSC-CPU STATUS CHANGE ROUTINE.;C>; THIS ROUTINE WILL PERFORM THE EXECUTIVE ACTIONS NECESSARY TO.; BRING A CPU ONLINE OR TO TAKE A CPU OFFLINE.;S ; INPUTS:R;;C; $SCDEV=MASK WITH BIT SET FOR CPU WHOSE STATUS SHOULD CHANGE. ONLY; ONE BIT SHOULD BE SET. -; $SCOFL=BYTE VALUE OF DESIRED STATUS CHANGE:E;N'; -1 --> ONLINE TO OFFLINE TRANSITION.'; 0 --> OFFLINE TO ONLINE TRANSITION.O;D ; OUTPUTS:;T ; CPU ONLINE:;M4; THE CPU HAS BEEN "BOOTED" THRU THE IIST, AN00Z1ibjbkb a a aD THEN.; INTERRUPTED INTO THE $PENT PROCESSOR ENTRY.7; AT THIS POINT THIS ROUTINE WILL RETURN TO THE CALLERE; WITH:; F; R2=MASK OF PROCESSORS WHO DIDN'T RESET THE INTERRUPT MASKS (IF ANY).;M9; WHEN THE PROCESSOR COMMING ONLINE CALLS $CPNIT (AT THE4; VERY END OF THE $PENT PROCESS) IT WILL ATTEMPT TO9; INTERRUPT THE CURRENTLY ONLINE CPUS TO SEE IF THEY CANI8; RECEIVE FROM IT. IT WILL LEAVE THE MASK OF THOSE WHO4; CAN'T HEAR IT IN $SCRET, AND THEN ENTER $OLRNT TO(; NOTIRY HRC... THAT THE CPU IS ONLINE.;D; CPU OFFLINE:;C9; THE CALLER WILL BE RETURNED TO AFTER THE NECESSARY CPUT8; HAS BEEN INTERRUPTED WITH THE OFFLINE FUNCTION. WHEN9; LOCAL EVENT FLAG ONE IS SET, THE PROCESSOR HAS HALTED.C;O; NO REGISTERS ARE PRESERVED.A;H!; APR5/APR6 MAPPING IS PRESERVED.S;TD; 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. ;- .IF DF M$$PRO($CPUSC::TSTB $SCOFL ;ONLINE OR OFFLINE? BMI 30$ ;IF MI GOING OFFLINE;; BRING CPU ONLINE;E% CLRB $SCERR ;NO IMMEDIATE ERROR YETS% MOV #C.LGTH,R1 ;ALLOCATE CLOCK BLOCKT( CALL $ALOCB ;OF CORRECT SIZE FROM POOL/ BCC 10$ ;IF CC BLOCK ALLOCATED OK, ADDR IN R0A4 MOVB #IE.NOD,$SCERR ;BAD NEWS -- NO POOL SPACE LEFT RETURN ;EXIT BACK TO OLRSRM310$: MOV R0,-(SP) ;SAVE CLOCK QUEUE BLOCK FOR LATERR) BIS $SCDEV,$IIMSK ;SET INTERRUPT MASK UPE/ CALL $IISTM ;MAKE EVERYONE SET UP THEIR MASKS0 MOV R2,-(SP) ;SAVE PEOPLE WHO DIDN'T DO THE JOB/ MOV $SCDEV,R1 ;GET THE CPU COMING ONLINE AGAINE' 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;L); SUBROUTINE FOR INTERPROCESSOR INTERRUPTM;A(20$: MOV R4,R0 ;GET CLOCK BLOCK ADDRESS MOV #C.LGTH,R1 ;SET LENGTHK% CALL $DEACB ;DEALLOCATE CLOCK BLOCKE MOV $SCDEV,R1 ;GET PROCESSOR(S) CALLR $IIXMT ;INTERRUPT THEM;V; BRING CPU OFFLINEP;S&30$: MOV #MP.STP,R2 ;SET STOP FUNCTION% MOV $SCDEV,R1 ;GET CPU'S TO DO IT TO4% CLR $SCRET ;CLEAR OUT STATUS RETURNT& CLRB $SCERR ;CLEAR OUT STATUS RETURN! CALLR $IIFNX ;TRANSMIT FUNCTIONK;+; **-$CPOFF-TAKE CPU OFFLINE.K;RD; THIS ROUTINE WILL TAKE A CPU OFFLINE. IT WILL RESET THE INTERRUPTC; MASKS OF ALL OTHER ONLINE PROCESSORS TO NOT ALLOW INTERRUPTS FROMLD; 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.V;C ; INPUTS: ;'; NONE.T;4 ; OUTPUTS:;;; NONE. ;T; NO REGISTERS ARE PRESERVED.R;-B$CPOFF::BIC $CPBIT,$IIMSK ;PREPARE TO RESET THE INTERRUPT MASKS OF% CALL $IISTM ;ALL OTHER ONLINE CPUS.W: CALL $IIOPN ;INITIALIZE OUR IIST, TO ALLOW INT AND BOOTS1 CLRB $CXDBL ;IN CASE CONTEXT SWITCHING DISABLEDR. BIC $CPBIT,$URMST ;SHOW US NOT ONLINE ANYMORE2 CALLR $DRDSE ;DECLARE SIGNIFICANT EVENT AND EXIT .ENDC .IFF ; DF R$$CONA$KRBSC::$OLRNT::$UCBSC::$CPOFF:: RETURNR .ENDC ; DF R$$CON ; **-$VOLSC-VOLUME STATUS CHANGE; <; THIS SUBROUTINE IS CALLED BY A DRIVER WHEN HARDWARE VOLUME;; VALID STATUS CHANGES. MINIMALLY, $VOLSC RE-SETS SOFTWAREM8; VOLUME VALID. IF THE VOLUME MOUNTED FOREIGN THEN THIS9; IS THE ONLY ACTION TAKEN ON THE UNIT. IF THE VOLUME IST9; MOUNTED FILE-STRUCTURED OR NOT MOUNTED THE VERIFICATIONE8; TASK WILL BE REQUESTED TO EITHER MOUNT OR RE-MOUNT THE5; VOLUME. ADDITIONALLY, I/O WILL BE STALLED TO UNITST0; MOUNTED WITH A FILE-STRUCTURE UNTIL THE VOLUME; STATUS CAN BE VERIFIED.E;A ; INPUTS:;(; R5=UCB ADDRESS OF UNIT WITH TRANSITION;H ; OUTPUTS:;; NONE.T;S; R4,R5 PR00bdt__DATADATADATADATAESERVEDY;V;- .ENABL LSBR $VOLSC:: ;# .IF DF R$$AMD ;AUTOMOUNT/DISMOUNTE SAVNR5 BICB #US.VV,U.STS(R5) ;RE-SET SOFTWARE VOLUME VALIDT1 BITB #US.FOR,U.STS(R5) ;VOLUME MOUNTED FOREIGN ?F* BNE 20$ ;IF NE, YES - NOTHING MORE TO DO) BITB #US.MNT,U.STS(R5) ;VOLUME MOUNTED ?A 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 TASKU0 MOV $VERTK,R0 ;TCB ADDRESS OF VERIFICATION TASK" CALLR $EXRQN ;UNSTOP/REQUEST VER .IFTF ; DF R$$AMD20$: RETURN ;; .DSABL LSBD .ENDC ; DF R$$AMD .ENDR5 BICB #US.VV,U.STS(R5) ;RE-SET SOFTWARE VOLUME VALIDT1 BITB #US.FOR,U.STS(R5) ;VOLUME MOUNTED FOREIGN ?F* BNE 20$ ;IF NE, YES - NOTHING MORE TO DO) BITB #US.MNT,U.STS(R5) ;VOLUME MOUNTED ?A 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 TASKU0 MOV $VERTK,R0 ;TCB ADDRESS OF VERIFICATION TASK" CALLR $EXRQN ;UNSTOP/REQUE .TITLE MSDRV .IDENT /12.02/;1; Copyright (c) 1995-1999 by Mentec Inc., U.S.A.;<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; VERSION 12.02;; PREVIOUSLY MODIFIED BY:;; B. S. MCCARTHY ; C. SESTOKAS;; MODIFIED BY:;; C SESTOKAS 6-NOV-87;6; CS022 -- CORRECT TRPHYS ROUTINE TO HANDLE VECTORED (; I/D AND NON I/D SYSTEMS AT RUN TIME;; D. Carroll 17-Jun-1993 12.027; DC227 -- Allow TRPHYS to be able to handle access tor ; ICB pool9;b .PAGE;c; MACRO LIBRARY CALLSS;W1 .MCALL ABODF$,CLKDF$,HWDDF$,PKTDF$,UCBDF$,UMDIO$  ABODF$ ;TASK ABORT CODESW, CLKDF$ ;CLOCK QUEUE CONTROL BLOCK OFFSETS HWDDF$ ;HARDWARE REGISTERSI PKTDF$ ;I/O PACKET OFFSETS & UCBDF$ ;UNIT CONTROL BLOCK OFFSETS., UMDIO$ ;USER MODE DIAGNOSITIC DEFINITIONS;R:; BIT DEFINITIONS FOR UCB CHARACTERISTICS WORD # 2 (U.CW2); 1M.PEOV= 100000 ;TAPE PAST LOGICAL END OF VOLUME-.M.AEOV= 40000 ;TAPE AT LOGICAL END OF VOLUMEM.BOT= 20000 ;TAPE IS AT BOT.M.1600= 4000 ;UNIT IS 1600 BPI PHASE ENCODED"M.HWL= 2000 ;HARDWARE WRITE LOCK M.RWD= 1000 ;UNIT IS REWINDING'M.SER= 400 ;SELECT ERROR HAS OCCURREDD#M.IWR= 200 ;INHIBIT WRITE RETRIES #M.SWL= 100 ;SOFTWARE WRITE LOCKED 3M.TMK= 40 ;ENCOUNTERED TAPE MARK - FWD DIRECTION.T1M.EOT= 20 ;LAST COMMAND ENCOUNTERED END OF TAPE .M.SWAP= 2 ;SWAP BYTES FOR COMPATIBILITY MODE>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..MOVBTS= M.TMK!M.AEOV ;BITS SET BY TAPE MOTION; 9; FLAG BIT DEFINITIONS FOR CONTROLLER STATUS WORD (CSTAT).;=0CS.SER = 40000 ;'SEL ERR' - UNIT OFFLINE STATE.-CS.WSS = 20000 ;WAITING FOR SUB-SYSTEM READYI-CS.TMO = 10000 ;THIS OPERATION HAS TIMED OUT-!CS.NER = 2000 ;NO ERROR RECOVERY !CS.ABO = 1000 ;ABORT IN PROGRESS.#CS.UMD = 200 ;USER MODE DIAGNOSTICT*CS.SFB = 100 ;SPACE FILES VIA SPACE BLKS.'CS.RSP = 40 ;REWIND/SPACE IN PROGRESS.O/CS.LBA = 20 ;LOADING DEVICE MSG BUFFER ADDRESS.'CS.GST = 10 ;DOING GET CHARACTERISTICS %CS.CIP = 1 ;COMMAND IN PROGRESS FLAGR .PAGE; **-DEVICE REGISTER OFFSETS"TSBA= -2 ;BUS ADDRESS REGISTER"TSDB= -2 ;DATA BUFFER REGISTERTSSR= 0 ;STATUS REGISTERO; **-COMMAND PACKET *CMDHDR= 0 ;#1 COMMAND/CONTROL FUNCTION.+CMDB2= 2 ;#2 DT TRFR - LO ORD BUF @ .OR.U ; NDT TRFR - TMK/RCRD CNT.'CMDB3= 4 ;#3 DT TRFR - HI ORD BUF @..%CMDB4= 6 ;#4 DT TRFR - BYTE COUNT.S; **-STATUS REGISTER0TSSRSV= 10 ;SAVED TSSR DEVICE STATUS REGISTER.; **-MESSAGE PACKET=MSGHDR= 12 ;#1 HEADER WORD - MG.ACK=100000 ; ACK BIT,O ; 70000 ; RESERVED,U ; 1400 ; CLASS CODE BITS,' MG.FMT= 340 ; MESSAGE FORMAT BITS,S% MG.COD= 37 ; MESSAGE CODE BITS; MC.END=20 ; END, MC.FAL=21 ; FAIL,= MC.ERR=22 ; ERROR, MC.ATN=23 ; ATTENTION.! MC.LOG=24 ; LOG (NOT USED).T)MSGLGH= 14 ;#2 M00j1ibjbkb a a aESSAGE LENGHT: #3 - #7.F+RBPCR= 16 ;#3 RESIDUAL BYTE/FRAME COUNT.%XST0= 20 ;#4 EXTENDED STATUS REG 0,RXST1= 22 ;#5 1,XST2= 24 ;#6 2,RXST3= 26 ;#7 3.D; **-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.N/ CH.ERI= 20 ; ENABLE MSG BUFFER RLS INTRUPTS.A .PAGE;; XST0 BIT DEFENITIONS;T$X0.TMK= 100000 ;TAPE MARK DETECTED$X0.RLS= 40000 ;RECORD LENGTH SHORT$X0.LET= 20000 ;LOGICAL END OF TAPE#X0.RLL= 10000 ;RECORD LENGTH LONG 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.0X0.ONL= 100 ;ON LINEX0.IE= 40 ;INTERRUPT ENABLEBX0.VCK= 20 ;VOLUME CHECK#X0.PED= 10 ;* PHASE ENCODED DRIVEN ;* NOT USED - TK25.SX0.WLK= 4 ;WRITE LOCKX0.BOT= 2 ;BEGINNING OF TAPE!X0.EOT= 1 ;END OF TAPE DETECTEDH;T; XST1 BIT DEFENITIONS;EX1.DLT= 100000 ;DATA LATEC; 40000 ;NOT USED.#X1.COR= 20000 ;* CORRECTABLE DATA  ;** NOT USED - TK25."X1.CRS= 10000 ;* CREASE DETECTED ;** NOT USED - TSV05, TU80. X1.TIG= 4000 ;* TRASH IN GAP,X1.NER= 4000 ;* TK25 - NOISE DURING ERASE.$X1.DBF= 2000 ;* DESKEW BUFFER FAILX1.SCK= 1000 ;* SPEED CHECK;% ;** NOT USED - TK25, TSV05, TU80. !X1.RBE= 400 ;! READ BUS PAR ERR ;!! NOT USED - TK25, TS11.!X1.IPR= 200 ;* INVALID PREAMBLEX1.SYN= 100 ;* SYNCH ERROR% ;** NOT USED - TK25, TSV05, TU80.0!X1.TN3= 200 ;$ TAPE TRACK #3. \*.X1.TN2= 100 ;$ | | #2. \ TK25 ONLY.!X1.TN1= 40 ;$ | | #1. / X1.TN0= 20 ;$ TAPE TRACK #0. /!X1.IPO= 40 ;% INVALID POSTAMBLER ;%% NOT USED - TK25, TSV05.R X1.IED= 20 ;* INVALID END DATAX1.POS= 10 ;* POSTAMBLE SHORT $X1.EW= 10 ;* TK25 - EARLY WARNING.X1.POL= 4 ;* POSTAMBLE LONG % ;** NOT USED - TK25, TSV05, TU80.TX1.UNC= 2 ;UNCORRECTABLE DATAE X1.MTE= 1 ;% MULTI-TRACK ERROR ;%% NOT USED - TSV05, TK25.5;0; XST2 BIT DEFENITIONS;R'X2.OPM= 100000 ;OPERATION IN PROGRESS %X2.SIP= 40000 ;* TS11-SILO PAR ERR,|,X2.RCE= 40000 ;* TSV05 - RAM CHECKSUM ERR,.X2.DCF= 40000 ;* TK25 - COMMUNICATION FAULT. ;**NOT USED - TU80.I.X2.BPE= 20000 ;* SERIAL BUS PAR ERR AT DRIVE)X2.DHF= 20000 ;* TK25 - HARDWARE FAULT.  ;** NOT USED - TSV05, TU80.E.X2.SPD= 10000 ;* TK25 - CAPSTAN SPEED ERROR. ;** NOT USED - TSV05, TU80.(X2.TU8= 4000 ;"1"-TU80 IDENTIFICATION.&X2.TK2= 1000 ;"TK25" IDENTIFICATION. ; UNIT BIT 9, 11 ; TS11 0 0 UNIBUS ; TSV05 0 0 Q BUS* ; TU80 0 1 UNIBUS ; TK25 1 0 Q22/UNIBUS& ; TSU05 1 1 TSV05 FOR UNIBUS$X2.WCF= 2000 ;* WRITE CARD FAILURE ;* NOT USED - TK25. 6X2.DTK= 777 ;* TS11/TU80 DATA TRFR: DEAD TRKS P,7-0.) ;* TS11/TU80 WRT CHAR: MICROCODE REV.2* ;* TS11 STATUS: RES CAPSTAN TIC COUNT. ;* TU80 STATUS: 0'S.2X2.REV= 377 ;* TSV05 WRT CHAR: 200 - XND FTR SW,+ ;* 100 - BUFF SW, 77 - MICROCODE REV. " ;* TSV05 DATA TRF/STATUS: 0'S.0X2.EAD= 377 ;* TK25 - ERROR ADDRESS (LO BYTE).2X2.XFS= 200 ;* TK25 - WRT CHAR: XTND FEATURE SW,#X2.MCD= 177 ; MICROCODE REV.;F; XST3 BIT DEFENITIONS;U8X3.MEC= 177400 ;TS11/TSV05/TU80 MICRO-DIAG ERROR CODE.1X3.EAD= 177400 ;TK25 - ERROR ADDRESS (HI BYTE).A%X3.LMX= 200 ;* TAPE LIMIT EXCEEDED. # ;** NOT USED - TK25/TSV05/TU80.T#X3.OPI= 100 ;OPERATION INCOMPLETEW#X3.REV= 40 ;TAPE MOVED BACKWARDS.1)X3.CRF= 20 ;* CAPSTAN RESPONSE FAILURE.T0X3.TCH= 20 ;* TK25 - NO TACHOMETER INDICATION. ;** NOT USED - TSV05, TU80.X.X3.DCK= 10 ;TS11/TSV05/TU80 - DENSITY CHECK.*X3.STP= 10 ;TK25 - SERVO STRIPE FAILURE.'X3.NOI= 4 ;* NOISE - COULD NOT ERASE.4#X3.LXS= 2 ;* REACH00rdt__DATADATADATADATAED TAPE LIMITS.R% ;** NOT USED - TK25, TSV05, TU80.AX3.RIB= 1 ;REVERSE INTO BOT  .PAGE;I; TSSR BIT DEFINITIONS; "SR.SC= 100000 ;SPECIAL CONDITION'SR.UPE= 40000 ;* UNIBUS PARITY ERROR A*SR.SPE= 20000 ;* SERIAL BUS PARITY ERROR" ;* NOT USED - TK25/TSV05/TU80..SR.RMR= 10000 ;REGISTER MODIFICATION REFUSED#SR.NXM= 4000 ;NON-EXISTENT MEMORYS#SR.NBA= 2000 ;NEED BUFFER ADDRESSPSR.A17= 1000 ;BA 17RSR.A16= 400 ;BA 16SR.SSR= 200 ;SUB-SYSTEM READY!SR.OFL= 100 ;DEVICE IS OFF LINER'SR.FC1= 40 ;* FATAL ERROR CLASS BIT 1'SR.FC0= 20 ;* FATAL ERROR CLASS BIT 0I ;* NOT USED - TK25.%SR.TC2= 10 ;TERMINATION CLASS BIT 2N$SR.TC1= 4 ;TERMINATION CLASS BIT 1$SR.TC0= 2 ;TERMINATION CLASS BIT 07SR.TCN= SR.TC2!SR.TC1!SR.TC0 ;TERMINATION CLASS NUMBER.0;GF; TSDBX REGISTER - BYTE REGISTER AT THE TSSR HIGH BYTE; Q22 BUS ONLY.;0;DBX.BT= 20 ;BOOT TAPE - TSDBX DBX.BT '1' AND TSSR SSR '1': 3 ; REWINDS THE TAPE TO BOT, SKIPS THE FIRST TAPE 02 ; RECORD AND READS THE FIRST 512. BYTES OF THE 9 ; SECOND TAPE RECORD TO MEMORY STARTING AT LOCATION 0. , ; TSSR SSR REMAINS CLEARED UNTIL THE BOOT 4 ; SEQUENCE HAS COMPLETED OR A DEVICE ERROR OCCURS. .PAGE; -; COMMAND PACKET HEADER WORD - BIT DEFENITION!;T!CM.ACK= 100000 ;ACKNOWLEDGE BIT#CM.CVC= 40000 ;CLEAR VOLUME CHECK CM.OPP= 20000 ;OPPOSITE BITOCM.SWB= 10000 ;SWAP BYTEST!CM.MOD= 7400 ;COMMAND MODE BITS CM.RTY= 1000 ;RETRY MODE BIT.B*CM.RVS= 400 ;REVERSE DIRECTION MODE BIT.CM.IE= 200 ;INTERRUPT ENABLECM.COD= 37 ;COMMAND CODE BITSM#CM.LOW= 3 ;LOW HALF OF CODE BITS.S.CM.NML= CM.IE!CM.ACK ;NORMAL COMBO. OF FLAGS.;H; COMMAND PACKET HEADER WORD;C)CC.RDN= 0001!CM.NML ;READ NEXT (FORWARD)D-CC.RDP= 0401!CM.NML ;READ PREVIOUS (REVERSE)N:CC.RRP= 1001!CM.NML ;REREAD PREVIOUS (SPACE REV,READ FWD)7CC.RRN= 1401!CM.NML ;REREAD NEXT (SPACE FWD, READ REV)M+CC.WRC= 0004!CM.NML ;WRITE CHARACTERISTICS CC.WRD= 0005!CM.NML ;WRITE DATA=CC.WDR= 1005!CM.NML ;* WRITE RETRY (BCKSPC, ERASE, RE-WRITE)M,CC.WSM= 0006!CM.NML ;WRITE SUBSYSTEM MEMORY+CC.SRF= 0010!CM.NML ;SPACE RECORDS FORWARD +CC.SRR= 0410!CM.NML ;SPACE RECORDS REVERSEK-CC.STF= 1010!CM.NML ;SKIP TAPE MARKS FORWARDD-CC.STR= 1410!CM.NML ;SKIP TAPE MARKS REVERSEE"CC.RWD= 2010!CM.NML!CM.CVC ;REWIND%CC.WTM= 0011!CM.NML ;WRITE TAPE MARK)CC.ERS= 0411!CM.NML ;ERASED;CC.WTR= 1011!CM.NML ;- WTMK RETRY (BCKSPC, ERASE, RE-WTMK)R-CC.UNL= 0412!CM.NML!CM.CVC ;REWIND AND UNLOAD&CC.DRI= 0013!CM.NML ;DRIVE INITIALIZE*CC.GST= 0017!CM.NML ;GET STATUS IMMEDIATE2CC.MST=CC.GST!CM.CVC ;MOUNT & SET CHARACTERISTICS .PAGE;O>; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER);C,CSTAT: .BLKW T$$S11 ;CONTROLLER STATUS WORD)CMDPTR: .BLKW T$$S11 ; > COMMAND PACKET.02INTADD: .BLKW T$$S11 ; > I/O INTERRUPT SERVICING.;SSRRTY: .BLKW T$$S11 ; > I/O RESUMPTION - SUBSYSTEM READY.M8TMOCNT: .BLKW T$$S11 ;SAVED I/O TIMEOUT, (UNIT OFFLINE)(RTYINT: .BLKW T$$S11 ;SAVED INTADD(R3),?CMDSAV: .BLKW T$$S11 ;SAVED COMMAND - WHILE REQUESTING STATUS.M=RTTBL: .BLKW T$$S11 ;RTRY CNT: +0-RTRYS LEFT, +1-TOTAL RTRYSE=RCVCNT: .BLKW T$$S11 ;RECOVERY COUNT - RECOVERY RTRYS (LEFT)M";CLEAN TAPE - PARAMETER SAVE AREA:&CMDPK1: .BLKW T$$S11 ;CMD PKT WRD #1,&CMDPK2: .BLKW T$$S11 ;CMD PKT WRD #2,&CLNRTN: .BLKW T$$S11 ;RCVRY INTRPT @.5CLNCNT= SPCNT ;TAPE CLN CNT - INIT REV/FWD SPC CNT.M3CLNED= SPACED ;CURRENT (CLEAN) BLOCK SPACE COUNT.F$SPCNT: .BLKW T$$S11 ;SPACING COUNT..SPACED: .BLKW T$$S11 ;SPACED (VIA TMK) COUNT.>PRVDIR: .BLKW T$$S11 ;LO BYTE - PREV TAPE DIR:EQ/FWD,NEQ/REV.3 ;HI BYTE - TAPE DIR (WRT,WTMK,RD):EQ/FWD,NEQ/REVR-DEVTYP: .BLKW T$$S11 ;LO BYTE - NE IF TK25, T! ;HI BYTE - NE IF TSV05/TSU05. 1WRTOVR= 32. ; REWRITE WRITE/WTMK UP TO 64 TIMES ( ; FOR MAX EXTENDED IBG UP TO 20 FT.&RDOVR= 40. ; REREAD UP TO 40 TIMES -+REREAD= 8. ; CLEAN TAPE AFTER 8 REREADS. &RDTMO= 12. ; READ TIMEOUT - 12. SEC.0CLNTMO= 2 ; CLEAN TAPE SUBCYCLE TIME - 2 00z1ibjbkb a a aSEC.1CLNCYC= 15. ; CLEAN TAPE - UP TO 15 SUBCYCLES.S!VC$MS = 0 ; Vectored MS driver.E .PAGE; EXECUTIVE VECTOR AREA,4EXEVEC: .WORD 0 ; IF NE - vectors already filled in.DVERR: .WORD $DVERR ; Vectored NDVMSG: .WORD $DVMSG ; Exec FORK: .WORD $FORK ; referencesGTPKT: .WORD $GTPKT ;XHFMSK: .WORD $HFMSK ; IOALT: .WORD $IOALT ; (filledEIODON: .WORD $IODON ; in by SCMOF: .WORD $SCMOF ; MSDRV 1CRPAS: .WORD $CRPAS ; code $DVTMO: .WORD $DVTMO ; at MSKRB)MPUBM: .WORD $MPUBM ; STMAP: .WORD $STMAP ;5FMSK2: .WORD $FMSK2 ; SFRK: .WORD S.FRK ;rSPKT: .WORD S.PKT ;TSCTM: .WORD S.CTM ;XSITM: .WORD S.ITM ; SSTS: .WORD S.STS ;lSST2: .WORD S.ST2 ;DSKRB: .WORD S.KRB ;EXEVCL=<<<.-EXEVEC>/2>-1>$; Driver SCB reference patch table. ;DD; The driver uses this patch table when it is called for the first B; controller on-line request. The driver initially contains SCB ;; offset references of the form S.Vzzz located at Rzzzx. D; The contents of these references are replaced at driver assembly L; time with the value -1 (promote crashes if the vectoring isn't complete).S.VCSR = 177777 S.VOWN = 177777.S.VFRK = 177777RS.VPKT = 177777 S.VCTM = 177777S.VITM = 177777CS.VSTS = 177777rS.VST2 = 177777eS.VKRB = 177777DK.VOWN = 177777sK.VCON = 177777lB; After the driver is LOAded and called for the first controller B; on-line request, the driver replaces these SCB references withE; the vectored equivalents from the driver's Executive vector area.l;d ; Example:s;l); Previous code: MOV S.ITM(R4),S.CTM(R4)h;i,; Vectored code: MOV S.VITM(R4),S.VCTM(R4)+; RITMx=.-4 ; xth occurence of S.VITM and .7; RCTMy=.-2 ; yth occurence of S.VCTM in this driver.S;1/; For this vectored code, this table contains:N; .WORD RITMx,S.ITM7; .WORD RCTMy,S.CTMi; SCBPAT: .WORD RPTK1,SPKT .WORD RPKT2,SPKT .WORD RPKT3,SPKT, .WORD RCTM1,SCTMs .WORD RCTM2,SCTMe .WORD RCTM3,SCTMt .WORD RCTM4,SCTMo .WORD RCTM5,SCTMu .WORD RITM1,SITM .WORD RITM2,SITMl .WORD RITM3,SITM  .WORD RITM4,SITM( .WORD RITM5,SITMe .WORD RITM6,SITM( .WORD RITM7,SITMR .WORD RITM8,SITMr .WORD RITM9,SITM. .WORD RITM10,SITM .WORD RITM11,SITM .WORD RITM12,SITM .WORD RSTS1,SSTSt .WORD RSTS2,SSTSl .WORD RSTS3,SSTSW .WORD RSTS4,SSTS  .WORD RSTS5,SSTSi .WORD RSTS6,SSTSR .WORD RSTS7,SSTSD .WORD RSTS8,SSTSD .WORD RSTS9,SSTSD .WORD RSTS10,SSTS .WORD RSTS11,SSTS .WORD RSTS12,SSTS .WORD RST21,SST2D .WORD RKRB1,SKRBD# .WORD 0 ; Patch table terminator.O .PAGE; ; DRIVER DISPATCH TABLEO;R9 DDT$ MS,T$$S11,,,,NEW ;Generate driver dispatch table.T;T!; TERMINATION CODE DISPATCH TABLE1;IERJTBL: .IRPC X,<01234567> .WORD TCL'X'ERO .ENDM;t; VALID FUNCTION TABLE;D* .MACRO FUNCT FCN, HCC, EXT, TMO, INT, ADR .WORD IO.'FCN ;QIO REQUEST.D" .WORD CC.'HCC ;HARDWARE COMMAND.$ .BYTE EXT ;I/O TIMEOUT ITERATIONS.# .BYTE TMO ;I/O TIMEOUT - SECONDS.S/ .WORD I'INT ;REQUEST INTERRUPT ENDUP ROUTINE.0. .WORD P'ADR ;REQUEST PRE-PROCESSING ROUTINE. .ENDM FUNCT5VFTBL: FUNCT RLB,RDN,1,RDTMO,OCOM,READ ;READ FORWARDi4 FUNCT WLB,WRD,1,12.,OCOM,WRITE ;WRITE LOGICAL BLOCK5 FUNCT RLV,RDP,1,RDTMO,OCOM,READ ;READ REVERSE8 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 UNLOAD0 FUNCT SPB,SRF,250.,6,SPCB,SPACE ; SPACE BLOCKS/ FUNCT SPF,STF,250.,6,SPCF,SPACE ; SPACE FILESR3 FUNCT STC,MST,2.,2.,STAT,SET ;SET CHARACTERISTICSE6 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 TAPETEVFTBL:E; ; MESSAGE HEADER TABLE;E0MESSAG: .IRP X, .WORD MC.'X .ENDM .PAGE;++; **-MSINI- INITIATE MAG TAPE I/O OPERATION ;WB; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/OA; REQUEST IS QUEUED AND AT THE00dt__DATADATADATADATA END OF A PREVIOUS I/O OPERATION TO.E; PROPAGATE THE EXECUTION OF THE DRIVER. IF THE SPECIFIED CONTROLLERE>; IS NOT BUSY, THEN AN ATTEMPT IS MADE TO DEQUEUE THE NEXT I/O<; REQUEST. ELSE A RETURN TO THE CALLER IS EXECUTED. IF THE?; DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPERATION IST6; INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED.; ; INPUTS:I; <; R5 = ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED.;R ; OUTPUTS:;O<; 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.E;-;+;; THE FOLLOWING REGISTERS ARE RETURNED BY THE GTPKT$ MACRO:E;S&; 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 BLOCK9; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATEDO;H; I/O REQUEST PACKET FORMAT:;T&;I.LNK WD. 00 = I/O QUEUE THREAD WORD.,;I.PRI WD. 01 = REQUEST PRIORITY (LOW BYTE)..;I.EFN WD. 01 = EVENT FLAG NUMBER (HIGH BYTE).9;I.TCB WD. 02 = ADDRESS OF THE TCB OF THE REQUESTOR TASK.A;I.LN2 WD. 03 = POINTER TO 2ND LUN WORD IN REQUESTOR TASK HEADER.SG;I.UCB WD. 04 = CONTENTS OF 1ST LUN WORD IN REQUESTOR TASK HEADER (UCB)E>;I.FCN WD. 05 = I/O FUNCTION CODE (IO.RLB/IO.RWD/IO.SPB/ETC.).5;I.IOSB WD. 06 = VIRTUAL ADDRESS OF I/O STATUS BLOCK.E5;IOSB+2 WD. 07 = RELOCATION BIAS OF I/O STATUS BLOCK.T@;IOSB+4 WD. 10 = I/O STATUS BLOCK ADDRESS (DISPLACEMENT+140000).7;I.AST WD. 11 = VIRTUAL ADDRESS OF AST SERVICE ROUTINE.H; ;E:; READ/WRITE LOGICAL FUNCTION DEPENDENT I/O PACKET FORMAT:;G;I.PRM WD. 12 = HIGH 2 BITS (BITS 4 & 5) OF 18 BIT DATA BUFFER ADDRESS.B:;PRM+2 WD. 13 = LOW 16 BITS OF 18 BIT DATA BUFFER ADDRESS.2;PRM+4 WD. 14 = NUMBER OF BYTES TO BE TRANSFERRED.;PRM+6 WD. 15 = NOT USED. ;PRM+10 WD. 16 = NOT USED.;PRM+12 WD. 17 = NOT USED.F;PRM+14 WD. 20 = RELOCATION BIAS OF DIAGNOSTIC REGISTER BLOCK ADDRESS.A;PRM+16 WD. 21 = DIAG. REG. BUFFER ADDRESS (DISPLACEMENT+140000).D;S;F?; BLOCK AND FILE SPACING FUNCTIONS DEPENDENT I/O PACKET FORMAT:E;ND;I.PRM WD. 12 = SPACING COUNT (POSITIVE=FORWARD, NEGATIVE=BACKWARD).;PRM+2 WD. 13 = NOT USED.B;PRM+4 WD. 14 = NOT USED.T;PRM+6 WD. 15 = NOT USED.R;PRM+10 WD. 16 = NOT USED.F;PRM+12 WD. 17 = RELOCATION BIAS OF DIAGNOSTIC REGISTER BLOCK ADDRESS.A;PRM+14 WD. 20 = DIAG. REG. BUFFER ADDRESS (DISPLACEMENT+140000).O;PRM+16 WD. 21 = NOT USED.;LG; (MOUNT AND) SET CHARACTERISTICS FUNCTION DEPENDENT I/O PACKET FORMAT.08; FOR SENSE CHARACTERISTICS, I.PRM (WD. 12) IS NOT USED:;I);I.PRM WD. 12 = NEW CHARACTERISTICS WORD.C;PRM+2 WD. 13 = NOT USED.,;PRM+4 WD. 14 = NOT USED.2;PRM+6 WD. 15 = NOT USED.4;PRM+10 WD. 16 = NOT USED.;PRM+12 WD. 17 = NOT USED.;PRM+14 WD. 20 = NOT USED.;PRM+16 WD. 21 = NOT USED.;IB; WREOF, REWIND, AND UNLOAD FUNCTIONS DEPENDENT I/O PACKET FORMAT:;D;I.PRM WD. 12 = NOT USED.O;PRM+2 WD. 13 = NOT USED..;PRM+4 WD. 14 = NOT USED.R;PRM+6 WD. 15 = NOT USED.E;PRM+10 WD. 16 = NOT USED.F;PRM+12 WD. 17 = RELOCATION BIAS OF DIAGNOSTIC REGISTER BLOCK ADDRESS.A;PRM+14 WD. 20 = DIAG. REG. BUFFER ADDRESS (DISPLACEMENT+140000)..;PRM+16 WD. 21 = NOT USED.;-7MSINI: GTPKT$ MS,T$$S11 ;GET NEXT I/O PACKET TO PROCESSN& CLR CSTAT(R3) ;CLEAR CONTROLLER FLAGS' CLR RCVCNT(R3) ;NOT IN ERROR RECOVERY.W) CLRB PRVDIR+1(R3) ;ASSUME FWD DIRECTION.K CLR R0 ;LABELLED BITB #US.LAB,U.STS(R5) ; TAPE?. BNE 20$ ;IF NE, YES.2 BIS #CH.ESS!CH.ENB,R0 ;STOP TMK/TMK .OR. BOT/TMK.%20$: MOV CMDPTR(R3),R2 ;CMDPTR SETUP?7 BEQ GCR ;IF EQ, NO.I* CMP R0,CHRWD4(R2) ;CHAR PCKT PER REQUEST?) BNE GCR ;IF NE, CHANGE CHARACTERISTICS.E<30$: BIT #SR.NBA,@S.CSR(R4) ;COMMUNICATING WITH TAPE SYSTEM? BNE GCR ;IF NE, NO. 0ILDBA: MOV S.VPKT(R4),R1 ;RELOAD PACKET POINTER. RPTK1=.-2R. MOV #VFTBL,R2 ;POINT AT VALID FUNCTIONS TABLE0 MOV I.FCN(R1),R0 ;GET FUNCTION CODE FROM PACKET) BIT #IQ.X,R0 ;ERROR RECOVERY PROHIBITED?2 BEQ 50$ ;IF EQ NOS+ BIS #CS.NER,CSTAT(R3) ;CORRESPONDING FLAG.) BIC #IQ001ibjbkb a a a.X,R0 ;AND CLEAR BIT FOR COMPARE.B/50$: BITB #IQ.UMD,R0 ;DIAGNOSTIC FUNCTION CALL?K BEQ 60$ ;IF EQ NOG- BIS #CS.UMD,CSTAT(R3) ;COPY DIAGNOSTIC FLAG#- BIC #IQ.UMD,R0 ;CLEAR BIT FOR FUNCTION CHECKE(60$: CMP R0,(R2)+ ;FUNCTION CODES MATCH? BEQ 70$ ;IF EQ YES' ADD #10,R2 ;POINT TO NEXT TABLE ENTRY2 CMP #EVFTBL,R2 ;END OF TABLE? BNE 60$ ;IF NE NOG1 MOV #IE.IFC&377,R0 ;SET UP ILLEGAL FUNCTION CODER BR ALT ;GO TO EXIT)70$: MOV (R2)+,R1 ;R1 - I/O COMMAND CODE. 3 MOVB (R2)+,S.VSTS(R4) ;SET EXTENDED TIMEOUT VALUER RSTS1=.-202 MOVB (R2)+,S.VITM(R4) ;SET INITIAL TIMEOUT VALUE RITM1=.-2N- MOV (R2)+,INTADD(R3);STORE INTERRUPT ADDRESSA5 CALLR @(R2) ;GO TO PRE-PROCESSING FOR THIS FUNCTION:;+); **-GCR-GENERATE CHARACTERISTICS ROUTINEI;Q-; SETUP HARDWARE/SOFTWARE COMMUNICATIONS .OR.0; MODIFY DEVICE LEOV DETECTION CHARACTERISTICS.;-$GCR: MOVB #2,S.VITM(R4) ;SET TIMEOUT RITM2=.-2B+ BIS #CS.LBA,CSTAT(R3) ;SET WRITE CHAR FLAG  MOV R5,R1 ;R1 >" ADD #U.VCB+4,R1 ; DEVICE PKT AREA BIC #3,R1 ; ON MOD4 BOUNDARY. CMP R1,R2 ;PKT AREA SETUP? I BEQ 10$ ;IF EQ, YES. MOV R1,R2 ;R2 >I MOV R1,CMDPTR(R3) ; PKT AREA."10$: ADD #MSGHDR,R1 ;R1 > MSG PKT.; SETUP CHARACTERISTIC PACKET ' CLR -(SP) ;CLEAR HI-ORD ADDRESS AREA.( MOV R1,-(SP) ;PUSH ADDRESS TO TRANSLATE0 CALL TRPHYS ;TRANSLATE TO PHYSICAL (IF NEEDED); MOV (SP)+,CHRWD1(R2) ;STORE CHARACTERISTICS PACKET ADDRESS=+ MOV (SP)+,CHRWD2(R2) ; AND HI-ORD ADDRESS.F) MOV #14.,CHRWD3(R2) ;MSG BUF - 14. WRDS,; MOV R0,CHRWD4(R2) ;DEVICE CHAR.& ADD #CHRWD1-MSGHDR,R1 ;R1 > CHAR PKT.; SETUP COMMAND PACKET$ MOV #CC.WRC,CMDHDR(R2) ;WRITE CHAR,' CLR -(SP) ;CLEAR HI-ORD ADDRESS AREA.R( MOV R1,-(SP) ;PUSH ADDRESS TO TRANSLATE0 CALL TRPHYS ;TRANSLATE TO PHYSICAL (IF NEEDED): MOV (SP)+,CMDB2(R2) ;STORE CHARACTERISTICS PACKET ADDRESS* MOV (SP)+,CMDB3(R2) ; AND HI-ORD ADDRESS. MOV #10,CMDB4(R2) ;4 WORD TRFR. JMP INITIO ;START I/O+ .PAGE;+-; PRE-PROCESSING ROUTINES FOR I/O OPERATIONSS;U ; INPUTS:S; R1 = HARDWARE FUNCTION CODEC; R3 = CONTROLLER INDEX,; R4 = SCB ADDRESS; R5 = UCB ADDRESS;- .ENABL LSBC;D ; WRITE DATA;,3PWRITE: CMP U.CNT(R5),#14. ;ENOUGH BYTES FOR WRITE?P BHIS 75$ ;IF HIS YES TST U.CNT(R5) ;IS IT MAX COUNT? BEQ 75$ ;IF EQ YES0 MOV #IE.SPC&377,R0 ;SET UP PARAMETER ERROR CODE BR ALT ;GO TO EXIT;R; WRITE TAPE MARKR;.(PWRTMK: CLR U.CNT(R5) ;INSURE COUNT IS 0275$: MOV #WRTOVR*2,RTTBL(R3) ;SETUP ERROR RECOVERY* MOVB RTTBL(R3),RTTBL+1(R3) ; RETRY COUNT.2 BIT #M.SWL,U.CW2(R5) ;(USER) DISABLED WRITING? BEQ PIOCOM ;IF EQ NO1 MOV #IE.WLK&377,R0 ;SET UP WRITE LOCK ERROR CODEA BR ALT ;GO TO EXIT;(; READ FWD/REV;T-PRDREV: INCB PRVDIR+1(R3) ;REVERSE DIRECTION.T1PREAD: MOV #RDOVR,RTTBL(R3) ;SETUP ERROR RECOVERY#* MOVB RTTBL(R3),RTTBL+1(R3) ; RETRY COUNT. BR PIOCOM ; . . CONT.R;R; SPACE BLOCKS AND SPACE FILES;.2PSPACE: MOV #IS.SUC&377,R0 ;ASSUME 0 SPACING COUNT4 MOV U.BUF(R5),U.CNT(R5) ;PUT SPACING COUNT IN PLACE2 MOV U.BUF(R5),SPCNT(R3) ;REMEMBER SPACING COUNT.( BEQ ALT ;IF EQ NO I/O NEEDED (U.BUF=0)/ BMI 90$ ;IF MI SPACE REVERSE (U.BUF=NEGATIVE) BIT #M.AEOV,U.CW2(R5) ;AT EOV?D BEQ 80$ ;IF EQ, NO. . MOV #IE.EOV&377,R0 ;SET UP END OF VOLUME CODE)ALT: CALL @IOALT ;TERMINATE THIS REQUEST) JMP MSINI ; AND SERVICE OTHER REQUESTS.580$: BITB #US.LAB,U.STS(R5) ;SPACING LABELLED TAPE? F 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.5 MOV #^C<0>,U.CNT(R5) ;SETUP MAX BLK SPACING COUNT, + CLR SPACED(R3) ; NO TMKS SPACED YET AND#. BIC #CC.STF-CC.SRF,R1 ; SPACING VIA BLOCKS.8 BIS #CS.SFB,CSTAT(R3) ;SPACING FILES VIA SPACE BLOCKS. BR 100$990$: BIS #CC.SRR-CC.SRF,R1 ;MAKE CMND SPACE/SKIP REVERSEE# NEG U.CNT(R5) ;MAKE COUNT POSITIVE5A100$: BIS #CS.RSP,CSTAT(R3) ;SET "REWIND/SPACE IN PROGRESS" FLAGO BR PIOCOM .DSABL LSB ;?-; (MOUNT AND) SET CHARACTERISTICS, GET STATUS;;C6PSET: BI00dt__DATADATADATADATAC #USRBTS,U.CW2(R5) ;CLEAR USER SETTABLE BITS4 BIC #^C,U.BUF(R5) ;REMOVE NON-SETABLE BITS.3 BIS U.BUF(R5),U.CW2(R5) ;UPDATE USER SETABLE BITS.,; 4; GET STATUS (SENSE (MOUNT AND) SET CHARACTERISTICS);L3PGSTAT: BIS #CS.GST,CSTAT(R3) ;SET GET STATUS FLAG.R BR PUNLOD ; . . CONT.I;E ; REWIND TAPET;)5PREWND: BIS #M.RWD,U.CW2(R5);SET TAPE REWINDING FLAG. < BIS #CS.RSP,CSTAT(R3) ;SET "REWIND/SPACE IN PROGRESS" FLAG; ; UNLOAD TAPE ;R(PUNLOD: CLR U.CNT(R5) ;INSURE COUNT IS 0 BR PIOCM1 ;PREPROCESS REQUEST. .PAGE;B&; I/O OPERATION COMMON PRE-PROCESSING;E,PIOCOM: MOV #IE.ABO&377,R0 ;ABORT REQUEST?- BITB #US.PWF,U.STS(R5) ;PWFLD INDICATOR SET?A BNE ALT ;IF NE, YES./PIOCM1: MOV CMDPTR(R3),R2 ;R2 > COMMAND BUFFER.U, MOV R1,(R2)+ ;LOAD COMMAND HEADER IN BUFFER. BIC #^C,R1 ;ISOLATE COMMAND CODE BITS& CMP R1,#CC.GST&CM.COD ;SENSE REQUEST? BEQ 110$ ;IF EQ, YES.E< BIC #M.PEOV!M.AEOV,U.CW2(R5) ;M.PEOV/M.AEOV PER END STATUS.5110$: CMP R1,#CC.SRF&CM.COD ;FILL IN COMPLETE PACKET?U BHIS 130$ ;IF HIS NO; DATA TRANSFER REQUESTC, BIT #M.SWAP,U.CW2(R5) ;SWAP BYTES ON DATA? BEQ 120$ ;IF EQ NO6 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.)$ CALL @STMAP ;SET UP UNIBUS MAPPING MOV R2,-(SP) ;SAVE R2% CALL @MPUBM ;MAP UNIBUS TO TRANSFERC MOV (SP)+,R2 ;RESTORE R204125$: MOV U.BUF+2(R5),(R2)+ ;SET UP LO 16 ADDR BITS.% BIT #DV.EXT,U.CW1(R5) ;22 BIT Q BUS?1 BEQ 127$ ;IF EQ, UNIBUS.# MOVB U.BUF+1(R5),(R2)+ ;SET UP HI  CLRB (R2)+ ; 6 ADDR BITS.# BR 130$ ; . . CONT.Y1127$: MOV U.BUF(R5),(R2) ;SET UP HI 2 ADDR BITS2 ASR (R2) ;AND MOVE FROMA ASR (R2) ;BITS 4 AND 5 ASR (R2) ;TO ASR (R2)+ ;BITS 0 AND 1F5130$: MOV U.CNT(R5),(R2) ;LOAD BYTE/RECORD/FILE COUNTR .PAGE;+; INITIATE I/O OPERATION;U ; INPUTS:E;; COMMAND PACKET SETUP.0;2; R3 = CONTROLLER INDEX ; R4 = SCB ADDRESS; R5 = UCB ADDRESS;-3INITIO: MOVB S.VITM(R4),S.VCTM(R4) ;START THE TIMERV RITM3=.-4, RCTM1=.-2  MTPS #PR5 ;INHIBIT INTERRUPTSS) MOV S.CSR(R4),R2 ;;;RETREIVE CSR ADDRESS. TSTB (R2) ;;;SUBSYSTEM READY?B BPL 140$ ;;;IF PL NO' CLR -(SP) ;CLEAR HI-ORD ADDRESS AREA.(2 MOV CMDPTR(R3),-(SP) ;;;PUSH ADDRESS TO TRANSLATE2 CALL TRPHYS ;;;TRANSLATE TO PHYSICAL (IF NEEDED)0 MOV (SP)+,R1 ;;; SETUP CMD PKT PHYS @ BITS 15-2( BIS (SP)+,R1 ;;; AND BITS 17,16 IN R1. MOV R1,TSDB(R2) ;;; START I/O. 3 BIS #CS.CIP,CSTAT(R3) ;;;SET COMMAND IN PROGRESS M BR 150$ ;;;EXITE%140$: MOVB #4,S.VCTM(R4) ;;;SET TIMER5 RCTM2=.-2T+ BIS #CS.WSS,CSTAT(R3) ;;;SET WAITING FLAGD. 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;A-; ACTIVE I/O REQUESTS ARE MARKED FOR ABORT - ;C; THE I/O REQUEST WILL THEN END NORMALLY AS A RESULT OF INTERRUPT NB; SERVICING .OR. END ABNORMALLY VIA THE TIMEOUT (MSOUT:) ROUTINE.;C ; INPUTS:R ; R0 = ACTIVE I/O PACKET ADDRESS; R1 = CURRENT TCB ADDRESS; R3 = CONTROLLER INDEXB; R4 = SCB ADDRESS; R5 = UCB ADDRESS;-4MSCAN: CMP I.TCB(R0),R1 ;;;IS THIS THE CORRECT TASK? BNE 10$ ;;;IF NE NOP< BIS #CS.ABO!CS.NER,CSTAT(R3) ;ABORT REQUEST - NO ERR RCVRY.10$: RETURN ;;;RETURNY;+!; **-MSPWF- POWERFAIL ENTRY POINTD;R9; US.PWF SET TO DISALLOW NORMAL QIO REQUESTS EXCEPT FOR -R-; IO.RWD, IO.RWU, IO.SMO, IO.SEC AND IO.STC.O;LH; SUCCESSFUL IO.RWD, IO.RWU, IO.SMO RESET US.PWF AND ALLOW QIO REQUESTS.;T ; INPUTS: ; R3 = CONTROLLER INDEX; R4 = SCB ADDRESS; R5 = UCB ADDRESS;-/MSPWF: BCS 10$ ;IF CS, CONTROLLER POWER FAIL. / BISB #US.PWF,U.STS(R5) ; ELSE, UNIT POWER FAILN ; DISALLOW NORMAL QIO'S. BIT #HF.UBM,@HFMSK ;UMRS?R BNE 10$ ;IF NE - MAPPED @.* BIS #DV.EXT,U.CW1(R5) ;ELSE - PHYSICAL @. 10$: RETURNT .PAGE;+; **-MSOUT- TIMEOUT ENTRY POINTR; C; DEVICE TIMEOUT RESULTS IN THE CURRENT OPERATION BEING TERMINATED.,A; IF THE OPERATION WAS DIAGNOS001ibjbkb a a aTIC, THE QIO REQUEST IS TERMINATED. B; TIMEOUTS ARE USUALLY CAUSED BY POWER FAILURE BUT MAY ALSO BE THE>; RESULT OF HARDWARE CONSIDERATIONS. IN PARTICULAR, A LENGTHY<; SPACING OPERATION OR A REWIND ON THIS MODEL TAPE DRIVE MAY,; RESULT IN A TIMEOUT WHICH WILL BE IGNORED.;$ ; INPUTS: ; R0 = LITERAL CONSTANT IE.DNR; R2 = CSR ADDRESS; R3 = CONTROLLER INDEX; R4 = SCB ADDRESS; R5 = UCB ADDRESS;- .ENABL LSBR4MSOUT: BIT #CS.ABO,CSTAT(R3) ;;;BEEN TOLD TO ABORT? BNE 10$ ;;;IF NE YES - ABORT4 BIT #CS.SER,CSTAT(R3) ;;;'SEL ERR' - UNIT OFFLINE? BNE 10$ ;;;IF NE, YES.8 BIT #CS.WSS,CSTAT(R3) ;;;WAITING FOR SUB-SYSTEM READY? BNE 30$ ;;;IF NE YES0 BIT #CS.RSP,CSTAT(R3) ;;;REWIND/SPACE TIMEOUT? BNE 40$ ;;;IF NE YES4 BIS #CS.TMO,CSTAT(R3) ;;;FLAG TIMEOUT BEING LOGGED# CALL MSDTER ;;;LOG DEVICE TIMEOUT=10$: MTPS #0 ;LOWER PRIORITY / BIT #M.SER,U.CW2(R5);SELECT ERROR IN PROGRESS?- BNE NORDY ;IF NE YESMSOUT1: CLR R1 ;CLEAR R1B CALLR IODON ;AND EXIT1*30$: TSTB (R2) ;;;IS THE SUBSYSTEM READY? BPL 40$ ;;;IF PL NO - INCB S.VSTS(R4) ;;;INSURE CONTROLLER IS BUSYS RSTS2=.-2;- BIC #CS.WSS,CSTAT(R3) ;;;CLEAR WAITING FLAG  MTPS #0 ;;;LOWER PRIORITY)# CALLR @SSRRTY(R3) ;RETRY OPERATION 540$: DECB S.VSTS(R4) ;;;SUBSYSTEM RECOVERY TIMED OUT?E RSTS3=.-2C3 BEQ 10$ ;;;IF EQ YES, RETURN WITH DRIVE NOT READYW+ MOVB S.VITM(R4),S.VCTM(R4) ;;;START TIMERR RITM4=.-4S RCTM3=.-2Y RETURNY .DSABL LSB  .PAGE;+; **-NORDY-TAPE UNIT NOT READY;:@; ISSUE 'SEL ERR' MESSAGES AT 15 SEC INTERVALS FOR OFFLINE UNITS;; .OR. END THE REQUEST FOR USER CONTROL PARAMETERS OR ACP.B; 1; INPUTS: R3 - CNTRL INDX, R4 > SCB, R5 > UCB. ;-BNORDY: BIT #CS.NER!CS.UMD!CS.ABO,CSTAT(R3) ;USER CNTRL PARAMETERS? BNE 10$ ;IF NE, YES.Y TST U.ACP(R5) ;ACP REQUEST?Q BEQ 20$ ;IF EQ, NO.410$: 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?S BEQ NORDY0 ;IF EQ, NO.50;SAVE CMD HDR WRD .AND. SETUP FOR SENSE REQUEST." MOV CMDPTR(R3),R2 ;R2 > CMD PKT./ MOV (R2),CMDSAV(R3) ;SAVE CMD PKT HDR WRD ANDC2 MOV #CC.GST,(R2) ; SETUP CMD PKT FOR SENSE RQST.1 MOVB S.VITM(R4),TMOCNT(R3) ;SAVE REQUEST TIMEOUTF RITM5=.-4T< MOVB S.VSTS(R4),TMOCNT+1(R3) ; AND TIMEOUT ITERATION COUNT. RSTS4=.-4N. MOVB #2,S.VITM(R4) ;SETUP SENSE I/O TIMEOUT. RITM6=.-2N/ MOVB #1,S.VSTS(R4) ;FAKE END OF 15 SEC CYCLE.: RSTS5=.-2N7 MOV INTADD(R3),RTYINT(R3) ;SAVE REQUEST ENDUP ADDR AND8 MOV #NORD1,INTADD(R3) ; AND RETURN HERE AFTER SNS RQST.1 BIS #CS.SER,CSTAT(R3) ;'SEL ERR' - UNIT OFFLINE.S&TIME: DECB S.VSTS(R4) ;END OF 15 SEC? RSTS6=.-2C BNE TIMER ;IF NE, NO.( MOV #T.NDSE,R0 ;R0='SEL ERR' MSG CODE . CALL @DVMSG ; AND ISSUE 'SEL ERR' MESSAGE.0 MOVB #15.,S.VSTS(R4) ;15 SEC 'SEL ERR' TIMEOUT RSTS7=.-2T9TIMER: MOVB #1,S.VCTM(R4) ; CHECKED AT 1 SEC INTERVALS.VV RCTM4=.-2E RETURN57; RETURN FROM **-NORDY SENSE REQUEST INTRPT SERVICINGE;QA; INPUTS: R2 > CMD PKT, R3 - CNTRL INDX, R4 > SCB, R5 > UCB.R%NORD1: BIT #M.SER,U.CW2(R5) ;OFFLINE?E BNE TIME ;IF NE, YES./; ONLINE - SETUP CMD PKT AND ISSUE I/O REQUEST.* BIC #CS.SER,CSTAT(R3) ;NOT OFFLINE STATE./ MOV CMDSAV(R3),(R2) ;RESTORE CMD PKT HDR WRD,U4 MOV RTYINT(R3),INTADD(R3) ; INTERRUPT SERVICE ADDR,0 MOVB TMOCNT(R3),S.VITM(R4) ; TIMEOUT COUNT AND RITM7=.-2E: MOVB TMOCNT+1(R3),S.VSTS(R4) ; TIMEOUT ITERATION COUNT. RSTS8=.-2O5NORDY0: JMP INITIO ;GET STS .OR. RE-ISSUE I/O RQST.2 .PAGE;+(; **-$MSINT- SERVICE DEVICE INTERRUPTS. ;-6 INTSE$ MS,PR5,T$$S11 ;;;SAVE REGISTERS & SET PRIORITY/ BIT #CS.CIP,CSTAT(R4) ;;;COMMAND IN PROGRESS?E BNE 5$ ;;;IF NE YEST! RETURN ;;;NO, IGNORE INTERRUPTA*5$: CALL @FORK ;;;CREATE A SYSTEM PROCESS" MOV R4,R3 ;COPY CONTROLLER INDEX& MOV U.SCB(R5),R4 ;PICK UP SCB ADDRESS# MOV CMDPTR(R3),R2 ;R2 > CMD PCKT.0 MOV @S.CSR(R4),TSSRSV(R2) ;SAVE DEVICE STATUS.( MOV TSSRSV(R2),R1 ;R1 - DEVICE STATUS. MOV (R2),-(SP00dt__DATADATADATADATA) ;(SP) -' BIC #^C,(SP) ; COMMAND CODE.I>;STATUS/WRITE CHAR DON'T RETAIN PREVIOUS TAPE MARK INDICATION.) CMP (SP),#CC.GST&CM.COD ;SENSE REQUEST?) BEQ 15$ ;IF EQ, YES.. CMP (SP),#CC.WRC&CM.COD ;WRITE CHAR REQUEST? BEQ 15$ ;IF EQ, YES. 6 BITB #US.LAB,U.STS(R5) ;(NO LEOV FOR) LABELLED TAPE? BNE 8$ ;IF NE, YES.4 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.3 BIT #M.BOT!M.TMK,U.CW2(R5) ;BOT .OR. TMK PREV I/O?O BEQ 8$ ;IF EQ, NO.T<;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.C$ CMP (SP),#CC.RDN&CM.COD ;READ FWD? BNE 6$ ;IF NE, NO.E' CMP RBPCR(R2),CMDB4(R2) ;DATA ON READ?E# BEQ 117$ ;IF EQ, NO - TMK/TMK.I*6$: CMP (SP),#CC.SRF&CM.COD ;SPACING FWD? BNE 8$ ;IF NE, NO.E MOV CMDB2(R2),R0 ;R0 - 0 DEC R0 ; I/O SPACE COUNT-1./ CMP RBPCR(R2),R0 ;SPACED OVER TMK, NO DATA?. BNE 8$ ;IF NE, NO.V0117$: 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?B BNE 10$ ;IF NE, YES.C& BIC #M.TMK,U.CW2(R5) ;ASSUME NOT TMK.) MOV (R2),R0 ;R0 - BIT8:CMND MODE REV, M8 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.R BIT #X0.TMK,XST0(R2) ;TMK? BEQ 10$ ;IF EQ, NO.%9$: BIS #M.TMK,U.CW2(R5) ; ELSE, TMK.I510$: CLRB PRVDIR(R3) ;ASSUME TAPE FORWARD DIRECTION.P) BIT #X3.REV,XST3(R2) ;FORWARD DIRECTION?A BEQ 15$ ;IF EQ, YES. - INCB PRVDIR(R3) ; ELSE - REVERSE DIRECTION.$!15$: TST (SP)+ ;MAINTAIN STACK.(. BIC #NEWBTS,U.CW2(R5) ;STATUS TO BE UPDATED.% BIT #X0.PED,XST0(R2) ;1600 BPI MODE?R BEQ 20$ ;IF EQ, NO.1 BIS #M.1600,U.CW2(R5) ; ELSE 1600 BPI (PE) MODE.20$: BIT #X0.BOT,XST0(R2) ;BOT?N BEQ 30$ ;IF EQ, NO.! BIS #M.BOT,U.CW2(R5) ; ELSE BOT.,30$: BIT #X0.EOT,XST0(R2) ;EOT?E BEQ 50$ ;IF EQ, NO.! BIS #M.EOT,U.CW2(R5) ; ELSE EOT.C(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.#/ BIS #M.SER,U.CW2(R5) ; ELSE SEL ERR - OFFLINE.0)70$: MOV #IS.SUC&377,R0 ;ASSUME SUCCESS.;, BIC #^C,R1 ;R1 - TERMINATION CODE.6 CMPB MSGHDR(R2),MESSAG(R1) ;MESSAGE MATCH TERM CODE? BEQ 80$ ;IF EQ, YES.#, MOV #SR.TC2!SR.TC1,R1 ; ELSE TERM CODE = 6.480$: JMP @ERJTBL(R1) ;SERVICE INTRPT PER TERM CODE. .PAGE;+(; SERVICE INTERRUPT PER TERMINATION CODE;LA; R0 - IS.SUC&377 R1 - TERM CODE R2 - > COMMAND PACKETL2; R3 - CNTRLR INDX R4 - > SCB R5 - > UCB;-); TERMINATION CODE 0 - NORMAL TERMINATIONR7TCL0ER: BIT #CS.LBA,CSTAT(R3) ;WRITTEN CHARACTERISTICSB BEQ TCEXIT ;IF EQ NO, EXIT*; TERMINATION CODE 1 - ATTENTION CONDITION9TCL1ER: BIC #CS.LBA,CSTAT(R3) ;CLEAR BUFFER ADDRESS FLAG2' CLR DEVTYP(R3) ;DETERMINE DEVICE TYPE.P MOV XST2(R2),R1 ;R1 - XSTAT2.4 BIC #^C,R1 ;R1 - DEVICE IDENTIFIER. CMP #X2.TK2,R1 ;TK25? BNE 10$ ;IF NE, NO.T# INC DEVTYP(R3) ;DEVICE TYPE - TK256 MOVB #UD.8K,U.CW3+1(R5) ; AND UPDATE DENSITY SUPPORT. BR 30$N)10$: TST R1 ;TS11/TSV05 .OR. TU80/TSU05?  BNE 20$ ;IF NE, TU80/TSU05.  BIT #HF.UBM,@HFMSK ;UMRS? BNE 30$ ;IF NE, THEN TS11. BR 25$ ; .. CONT.I20$: CMP #X2.TU8,R1 ;TU80? BEQ 30$ ;IF EQ, YES.225$: INCB DEVTYP+1(R3) ;DEVICE TYPE - TSV05/TSU05.%30$: JMP ILDBA ;PROCESS QIO REQUEST.T(; TERMINATION CODE 2 - TAPE STATUS ALERT"TCL2ER: BIT #M.EOT,U.CW2(R5) ;EOT? BEQ 10$ ;IF EQ NOT CMPB #CC.WRD,(R2) ;WRITE DATA?T BEQ 5$ ;IF EQ YESC CMPB #CC.WTM,(R2) ;WTMK?T BEQ 5$ ;IF EQ YES CMPB #CC.ERS,(R2) ;ERASE? BNE 10$ ;IF NE NOE*5$: MOV #IE.EOT&377,R0 ;SET EOT FOR RETURN BR TCEXIT ;END REQUEST.E%10$: BIT #X0.TMK,XST0(R2) ;TAPE MARK?: BEQ 20$ ;IF EQ NO?( MOV #IE.EOF&377,R0 ;ENDING ST001ibjbkb a a aATUS - EOF BR TCEXIT ; AND END REQUEST..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 COMPLETIONT&; TERMINATION CODE 3 - FUNCTION REJECT6TCL3ER: BIT #CS.GST,CSTAT(R3) ;GET STATUS IN PROGRESS? BNE TCEXIT ;IF NE YES) BIT #M.SER,U.CW2(R5) ;OFFLINE?$ BEQ 10$ ;IF EQ NO; CALLR NORDY ;YES, HANDLE IT 410$: 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?T BEQ TCEXIT ;IF EQ NO# MOV #IE.WLK&377,R0 ;SET WRITE LOCKG,TCEXIT: JMP @INTADD(R3) ;GOTO REQUEST ENDUP. FATAL: JMP TCL6ER ;FATAL ERROR. .PAGE<; TERMINATION CODE 4 - RECOVERABLE ERROR: TAPE MOVED 1 BLOCKTCL4ER: TSTB DEVTYP(R3) ;TK25? BEQ 2$ ;IF EQ, NO. MOV (R2),R1 ;R1 - I/O  BIC #^C<17>,R1 ; COMMAND CODE.B CMP #5,R1 ;WRITE TO TAPE?R BEQ 1$ ;IF EQ, YES.! CMP #11,R1 ;WTMK OR ERASE TAPE?( BNE 2$ ;IF NE, NO.-1$: BIT #X1.EW,XST1(R2) ;TK25 EW WRITE ERROR? $ BNE 3$ ;IF NE, YES - DON'T LOG IT.'2$: CALL MSDVER ;LOG THE DEVICE ERROR.L:3$: BIT #CS.NER!CS.UMD,CSTAT(R3) ;ERR RECOVERY INHIBITED?$ BNE 30$ ;IF NE, YES - END REQUEST.+ MOV (R2),R0 ;RETRIEVE COMMAND HEADER WORDM- BIC #^C<6437>,R0 ;R0 - CMND MODE, CMND CODE.+ TST RCVCNT(R3) ;SETUP FOR ERROR RECOVERY?  BNE 20$ ;IF NE, YES. CMPB #1,R0 ;READ?1 BEQ 10$ ;IF EQ, YES. CMPB #5,R0 ;WRITE? BEQ 5$ ;IF EQ, YES.S CMPB #11,R0 ;WTMK?& BNE FATAL ;IF NE, I/O NOT RETRIABLE.25$: BIT #M.IWR,U.CW2(R5) ;(USER) INHIBIT XND GAPS? BNE 30$ ;IF NE, YES.310$: BIS #CM.RTY,(R2) ;I/O REQUEST - RETRY COMMAND.)+ MOV #REREAD,RCVCNT(R3) ;ASSUME READ RETRY.  CMPB #1,R0 ;I/O= READ? BEQ 20$ ;IF EQ, YES., MOV #WRTOVR*2,RCVCNT(R3) ;ELSE, WRITE/WTMK.20$: CMPB #1,R0 ;READ?V BEQ 22$ ;IF EQ, YES. BIT #M.EOT,U.CW2(R5) ;EOT?E BEQ 22$ ;IF EQ, NO.E. CMPB #WRTOVR,RTTBL(R3) ;RECOVERY - NGT 10 FT? BHIS 22$ ;IF HIS, NO.S9 MOVB #WRTOVR,RTTBL(R3) ;ERR RCVRY - NGT 10 FT AFTER EOT.L;SETUP FOR ERROR RECOVERY.#22$: DECB RTTBL(R3) ;RETRY FURTHER?  BEQ PARERR ;IF EQ, NO.!25$: DEC RCVCNT(R3) ;REISSUE I/O?A BNE AGAIN ;IF NEQ, YES.3 CMPB #1,R0 ;READ? *30$: BNE PARERR ;IF NE, NO - END REQUEST.;CLEAN TAPE ON READ. TSTB DEVTYP(R3) ;TK25?M, BNE AGAIN ;IF NE, NO TAPE CLEAN FOR TK25S.3CLEAN: MOV INTADD(R3),CLNRTN(R3) ;RCVRY ISR RETURN,Q* MOV #CLNISR,INTADD(R3) ;CLEAN ISR RETURN.' MOV (R2),CMDPK1(R3) ;CMD PKT HDR WRD,V+ MOV 2(R2),CMDPK2(R3) ; DATA TRFR LO BUF @.T1 MOV #5,CLNCNT(R3) ;IF READ FWD, BCKSPC 5 BLOCKS.B% TSTB PRVDIR+1(R3) ;READ FWD REQUEST?F BEQ 27$ ;IF EQ, YES.* DEC CLNCNT(R3) ;READ REV - BCKSPC 4 BLKS,427$: MOV #CC.SRR,(R2) ;TAPE CLEAN (BCKSPC OVER CLNR)5CLNSET: MOV CLNCNT(R3),CMDB2(R2) ; AND SPACING COUNT.R. BEQ FWDPOS ; IF EQ, Repositioned for RD FWD. CLR CLNED(R3) ;NONE SPACED YET.4CLNAGN: MOVB #CLNTMO,S.VITM(R4) ;CHECK SUBCYCLES AND RITM8=.-2T, MOVB #CLNCYC,S.VSTS(R4) ; SUBCYCLE TIMEOUT. RSTS9=.-2C BR AGAIN ; .. CLEAN TAPE. #CLNISR: MOV CMDB2(R2),-(SP) ;UPDATEK# SUB RBPCR(R2),(SP) ; BLOCKS SPACEDE 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.T BIT #X0.BOT,XST0(R2) ;BOT?o BNE REVDON ;IF NE, DONE.#POSAGN: MOV CLNCNT(R3),-(SP) ;SETUPO SUB CLNED(R3),(SP) ; REMAINING MOV (SP)+,CMDB2(R2) ; SPACE BR CLNAGN ; COUNT.L+REVDON: MOV CLNED(R3),CLNCNT(R3) ;SETUP FOR % TSTB PRVDIR+1(R3) ;READ FWD REQUEST?U BNE 100$ ;IF NE, READ REV. DEC CLNCNT(R3) ;SPACE N-1.N BR 110$ ; .. CONT. 100$: INC CLNCNT(R3) ;SPACE N+1.6110$: MOV #CC.SRF,(R2) ;TAPE CLEAN (FWDSPC OVER CLNR). BR CLNSET ; . . CONT. (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 ANDP) MOV CMDPK2(R3),CMDB2(R2) ; LO ORD BUF @.A MOVB #1,S.VSTS(R4) ;ONE READ RSTS10=.-2& MOVB #RDTMO,S.VITM(R4) ; TIMEOUT AND RITM9=.-2E1 MOV CLN00dt__DATADATADATADATARTN(R3),INTADD(R3) ; > INTRPT PROCESSING.C&AGAIN: JMP INITIO ;RE-INITITIATE I/O. .PAGE8; TERMINATION CODE 5 - RECOVERABLE ERROR: TAPE NOT MOVED%TCL5ER:CALL MSDVER ;LOG DEVICE ERRORS& DECB RTTBL(R3) ;DECREMENT RETRY COUNT BNE AGAIN ;IF NE RETRIES LEFT 0PARERR: MOV #IE.VER&377,R0 ;UNRECOVERABLE ERROR. BR TCEND ;END REQUEST.*; 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 ERRORR:TCL7ER: CLR @S.CSR(R4) ;INITIALIZE DEVICE - ELSE UNUSABLE.7 MOV #TCL6ER,SSRRTY(R3) ;END REQUEST WHEN DEVICE READY.. BIS #CS.WSS,CSTAT(R3) ;WAIT FOR DEVICE READY:7 MOVB #5.,S.VITM(R4) ;TEST FOR DEV RDY AT 5 SEC INTRVL,S RITM10=.-26 MOVB #240.,S.VSTS(R4) ; UP TO 240 TIMES - 20 MINS.V RSTS11=.-2( MOVB S.VITM(R4),S.VCTM(R4) ;START TIMER RITM11=.-4 RCTM5=.-27 RETURNA .PAGE;C; MOUNT COMPLETION;A&IMOUNT: BIT #M.SER,U.CW2(R5) ;OFFLINE?% BNE 10$ ;IF NE YES, IT'S FATAL HERER BIT #M.BOT,U.CW2(R5) ;BOT?) BEQ 10$ ;IF EQ, NO.L- BICB #US.PWF,U.STS(R5) ;ELSE RESET PWFLD INDE BR ISTAT ; AND END REQUEST.S,10$: MOV #IE.FHE&377,R0 ;NO, SET FATAL ERROR;I+; STATUS EXIT FOR SET, SENSE, MOUNT AND SET ;M.ISTAT: MOV U.CW2(R5),R1 ;SET STATUS WORD IN R1 BR IODON ;;+?; **- IRWDU - SUCCESSFUL IO.RWD/IO.RWU RESETS US.PWF INDICATION ;-#IRWDU: TST R0 ;SUCCESSFUL RWD/RWU?O BMI 10$ ;IF MI, NO. . BICB #US.PWF,U.STS(R5) ;ELSE RESET PWFLD IND,! INCB PRVDIR(R3) ; Pre dir - REV.,.10$: BIC #M.RWD,U.CW2(R5) ;RWND, IF ANY, OVER. BR IODON ;END REQUEST. .PAGE;; SPACE BLOCKS COMPLETIONT;#ISPCB: BIT #M.PEOV,U.CW2(R5) ;PEOV?L BEQ IOCOM ;IF EQ, NO.2 MOV #SBRPOS,INTADD(R3) ;RETURN @ AFTER BACKSPACE. BR BCKSPC ;SETUP REQUEST.;+1; **-SBRPOS - POSITIONED AEOV SPACING VIA BLOCKS./;-#SBRPOS: CLR R1 ;NO BLOCKS SPACED,R BR NDAEOV ; AEOV ENDUP.;+$; **- ISPCF - SPACE FILES COMPLETION;-1ISPCF: BIT #CC.STR-CC.STF,(R2) ;SPACING REVERSE?e BNE SFREV ;IF NE, YES.W1 BIT #CS.SFB,CSTAT(R3) ;SPACING FILES VIA BLOCKS?E BNE SPCFB ;IF NE, YES.P BIT #M.PEOV,U.CW2(R5) ;PEOV?S BEQ IOCOM ;IF NE, NO.- SUB RBPCR(R2),SPCNT(R3) ;SPACED FILE COUNT.S9NDSPFB: MOV #SFRPOS,INTADD(R3) ;RETURN @ AFTER BACKSPACE. %BCKSPC: MOV #CC.SRR,(R2) ;BACKSPACE D MOV #1,CMDB2(R2) ; 1 BLOCK./ MOVB #15.,S.VSTS(R4) ;WAIT UP TO 15 SUBCYCLES RSTS12=.-2. MOVB #4,S.VITM(R4) ; 4 SECONDS PER SUBCYCLE. RITM12=.-2 BR AGAIN ;ISSUE I/O.A;+@; **-SFRPOS - RETURN AFTER REPOSITIONING TO AEOV FOR SPACE FILES;-)SFRPOS: DEC SPCNT(R3) ;SPACED FILE COUNTS" 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.V.ISPCFB: INC SPACED(R3) ;SPACED ONE MORE FILE. BIT #M.PEOV,U.CW2(R5) ;PEOV?  BNE 10$ ;IF NE, YES.. CMP SPACED(R3),SPCNT(R3) ;DONE? BNE AGAIN ;IF NE, NO.' MOV #IS.SUC&377,R0 ;R0 - RETURN CODE,S& MOV SPCNT(R3),R1 ;R1 - SPACED COUNT, BR IODON ; END REQUEST.110$: MOV SPACED(R3),SPCNT(R3) ;SPACED FILE COUNT.(! BR NDSPFB ;REPOSITION TO AEOV.R.SFREV: BIT #M.BOT,U.CW2(R5) ;BACKED INTO BOT? BEQ IOCOM ;IF EQ, NO., MOV #IS.SUC&377,R0 ; ELSE - IS.SUC IF BOT.;K7; COMMON EXIT ROUTINE FOR ALL ROUTINES REQUIRING STATUSL;1IOCOM: MOV U.CNT(R5),R1 ;RETRIEVE REQUESTED COUNTS( SUB RBPCR(R2),R1 ; LESS RESIDUAL COUNT. A; ; COMMON EXIT FOR ALL FUNCTIONS ;0/IODON: CALL MSDINT ;CALL DIAGNOSTIC COMPLETIONO1 MOV RTTBL(R3),R2 ; R2 - TOTAL RTRYS, RTRYS LEFT.(2 BIC #CS.CIP,CSTAT(R3) ;CLEAR COMMAND IN PROGRESS CALL @EIODON ;CALL COMPLETIONT) JMP MSINI ;GO CHECK FOR ANOTHER REQUESTI .PAGE;+&; **-MSDVER/MSDTER- LOG DEVICE ERRORS.;C@; THE DRIVER LOGS THE COMMAND PACKET, DEVICE STATUS REGISTER AND?; MESSAGE PACKET (INCLUDING EXTENDED STATUS REGISTERS) LOCATEDN; IN THE DRIVER DATA BASE001ibjbkb a a a.R;D; INPUT:; R3 = CONTROLLER INDEXO; R4 = SCB ADDRESS; R5 = UCB ADDRESS; ;L;- .ENABL LSBTMSDVER: MOV R2,-(SP) ;SAVE R2.0 MOV DVERR,-(SP) ;(SP) - @ TO LOG DEVICE ERRORS. BR 10$ ;MSDTER: MOV R2,-(SP) ;SAVE R2.2 MOV DVTMO,-(SP) ;(SP) - @ TO LOG DEVICE TIMEOUTS.=10$: BIT #CS.UMD,CSTAT(R3) ;USER MODE DIAGNOSTIC IN PROGRESSC BEQ 20$ ;IF EQ NOH TST (SP)+ ;MAINTAIN  TST (SP)+ ; STACK. RETURN ;RETURN TO THE CALLERE(20$: MOV CMDPTR(R3),R2 ; > ERR LOG DATA.. CALL @(SP)+ ;CALL EXEC ERROR LOGGING ROUTINE MOV (SP)+,R2 ;RESTORE R2. RETURN ;A .DSABL LSBL .PAGE;+-; **-MSDINT- DIAGNOSTIC REGISTER PASS ROUTINEE;-@; IF ENTRY WAS FROM A DIAGNOSTIC CONTROL FUNCTION, THEN MOVE THEC; I/O PACKET WORDS 17 & 20 TO WORDS 20 & 21 FOR THE $CRPAS ROUTINE.0;B>; THE DRIVER PASSES THE COMMAND PACKET, DEVICE STATUS REGISTERF; AND MESSAGE PACKET (INCLUDING XTND STS REGS) VIA THE $CRPAS ROUTINE.;R ; INPUTS:E;L; R3 = CONTROLLER INDEX,; R4 = SCB ADDRESS; R5 = UCB ADDRESS;-5MSDINT: BIT #CS.UMD,CSTAT(R3) ;DIAGNOSTIC OPERATION?T BEQ 30$ ;IF EQ NOL MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2* MOV S.VPKT(R4),R1 ;GET I/O PACKET ADDRESS RPKT2=.-2R& MOV CMDPTR(R3),R2 ; > DEVICE PACKETS.3 CMPB #IO.EOF/256.,I.FCN+1(R1) ;WRITE EOF FUNCTION?E BEQ 10$ ;IF EQ YES0 CMPB #IO.RWD/256.,I.FCN+1(R1) ;REWIND FUNCTION? BEQ 10$ ;IF EQ YES3 CALL @CRPAS ;PASS DEVICE REGISTERS TO DIAGNOSTICS BR 20$ ;GO TO EXIT<10$: MOV I.PRM+14(R1),I.PRM+16(R1) ;MOVE PACKET WD20 TO WD218 MOV I.PRM+12(R1),I.PRM+14(R1) ;MOVE PACKET WD17 TO WD203 CALL @CRPAS ;PASS DEVICE REGISTERS TO DIAGNOSTICSR/ MOV S.VPKT(R4),R1 ;RETRIEVE I/O PACKET ADDRESSK RPKT3=.-2 7 MOV I.PRM+14(R1),I.PRM+12(R1) ;MOVE WD20 BACK TO WD 17 6 MOV I.PRM+16(R1),I.PRM+14(R1) ;MOVE WD21 BACK TO WD2020$: MOV (SP)+,R2 ;RESTORE R2. MOV (SP)+,R1 ;RESTORE R1.30$: RETURN ;EXIT TO CALLER  .PAGE;+8;**-TRPHYS-TRANSLATE D-SPACE ADDRESS TO PHYSICAL ADDRESS;MD; THIS ROUTINE IS CALLED TO TRANSLATE A KERNEL DATA SPACE ADDRESS TOC; EQUIVALENT PHYSICAL ADDRESS. IN UNIBUS SYSTEMS, THE UMRS MAP DATAEB; SPACE, SO THE VIRTUAL ADDRESS IS OK. IN ALL NON-I/D SYSTEMS, THEC; VIRTUAL -> PHYSICAL MAPPING OF EXEC ADDRESSES IS DIRECT. THE ONLYKD; SITUATION REQUIRING TRANSLATION IS THEREFORE AN I/D SYSTEM RUNNING ; ON A Q-BUS. ;S; CALLING SEQUENCE:R;R+; CLR -(SP) ; CLEAR HI-ORD ADDRESS AREA.+; MOV ...,-(SP) ;PUSH ADDRESS TO TRANSLATEE; CALL TRPHYS ;TRANSLATE(; MOV (SP)+,... ; GET TRANSLATED LO-ORD'; MOV (SP)+,... ; AND HI-ORD ADDRESS.P;I;-TRPHYS: ; REFERENCE LABEL3 BIT #DV.EXT,U.CW1(R5) ; 22 bit physical @ (Q bus)?.5 BEQ 10$ ; IF EQ, No - UNIBUS (UMRs), no translationP! BIT #F2.DAS,@FMSK2 ; Data space?E+ BEQ 10$ ; IF EQ, Non I/D, no translation.T2 BIT #160000,2(SP) ; IS THIS MAPPED TO LOW MEMORY?& BEQ 10$ ; YES, NO TRANSLATION NEEDED MOV R0,-(SP) ; Save R0R MOV R1,-(SP) ; and R1.H2 MOV @SCMOF,R1 ; Get 32-wd block addr of D-space.' CLR R0 ; and R0=0 for @ translation.8 SUB #200,R1 ; R1 - @ D space starting at virtual 20000% ASHC #6,R0 ; Translate the D pool @C ADD R1,6(SP) ; and  ADC R0 ; return it& BIC #^C<3>,R0 ; (18 bit phys @)! MOV R0,10(SP) ; to user.e MOV (SP)+,R1 ; Restore R1 MOV (SP)+,R0 ; and R0.#10$: RETURN ;RETURN TO CALLERW .PAGE;+-; **-MSKRB - CONTROLLER STATUS CHANGE ROUTINE(-; **-MSUCB - UNIT STATUS CHANGE ROUTINEV;C@; The status change routines are NOPS and are provided only as aB; mechanism to gain control at MSKRB to translate the exec vector.;-.MSKRB: BCS MSUCB ; IF CS - offline call, nop.' TST EXEVEC ; Exec vector translated ? ( BNE MSUCB ; IF NE, Yes - don't repeat.% MOV @#112,R0 ; R0 > table of entriesM2 MOV (R0),R0 ; and apr bias (1st word of table).) MOV KINAR6,-(SP) ; Save I-space mapping.E3 MOV (R0),KINAR6 ; Map common through I-space APR6.& MOV #EXEVEC,R3 ; R3 > Exec vector and. MOV #EXEVCL,R2 ; R2 = length of vector area.' CALL @#140004 ; Translate the vectors. ,00‚Ât__DATADATADATADATA MOV (SP)+,KINAR6 ; Restore I-space mapping.; Patch driver SCB references# MOV #SCBPAT,R0 ; R0 > patch table.E+10$: MOV (R0)+,R2 ; R2 > driver @ to patch B0 BEQ MSUCB ; IF EQ (R0> table terminator), end.0 MOV @(R0)+,(R2) ; Else - patch driver location- BR 10$ ; and continue till driver patched.eMSUCB: JMP MSPWF ; Continue.A .ENDp common through I-space APR6.& MOV #EXEVEC,R3 ; R3 > Exec vector and. MOV #EXEVCL,R2 ; R2 = length of vector area.' CALL @#140004 ; Translate the vectors. , .IIF NDF L$$CDA .TITLE CRASH .IIF DF DL$$CD .TITLE DLCRSHF .IIF DF DU$$CD .TITLE DUCRSH .IIF DF MS$$CD .TITLE MSCRSHT .IIF DF MU$$CD .TITLE MUCRSHC .IIF DF MM$$CD .TITLE MMCRSHR .IIF DF NT$$CD .TITLE NTCRSHO .IDENT /06.11/W ;G0; Copyright (c) 1995-1999 by Mentec Inc., U.S.A.; 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.;E; ; P. J. BEZEREDI 24-OCT-77; $; MODIFIED FOR RSX-11M-PLUS V2.0 BY:;I; P. J. BEZEREDI; B. S. MCCARTHY; R. T. PERRON ; C. SESTOKASI;D$; MODIFIED FOR RSX-11M-PLUS V2.1 BY:;D; P. J. BEZEREDI ; T. LEKAS; B. S. MCCARTHY; J. M. LAWLER ; C. SESTOKASC; S. M. THOMAS;.+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:n; ; J. W. BERZLE; G. N. LARSEN; J. M. LAWLER; B. S. MCCARTHY; M. PETTENGILL; C. SESTOKAS; J. G. WEHNER; P. K. M. WEISS;H$; MODIFIED FOR RSX-11M-PLUS V4.0 BY:; ; C. SESTOKAS- ; K. L. NOEL;D$; MODIFIED FOR RSX-11M-PLUS V4.1 BY:;E; J. W. BERZLE;A$; MODIFIED FOR RSX-11M-PLUS V4.2 BY:; ; A. V. HUDEDR;1?; MODIFIED FOR RSX-11M-PLUS V4.3 - VAX COPROCESSOR/RSX V2.0 BY:T; ; K. L. NOEL; $; MODIFIED FOR RSX-11M-PLUS V4.4 BY:;I ; D. Carroll;U$; MODIFIED FOR RSX-11M-PLUS V4.5 BY:; ; D. Carroll 13-May-1993 06.104; DC210 -- Include support for crash I/O page image/; and allow UMR Map to be 0s on QBUS systemsF;R$; MODIFIED FOR RSX-11M-PLUS V4.6 BY:;; D. Carroll 18-Oct-1995 06.116; DC404 - Set up PSECT definitions to extend ICB pool;F;R; CRASH DUMP ROUTINES; ;V; MACRO LIBRARY CALLSD;R# .MCALL HWDDF$,BTJMP$,UDADF$,BGCK$AR .MCALL CPRDF$ UDADF$  HWDDF$ CPRDF$D;R; LOCAL MACROS;: .MACRO PUSH ARG CLR -(SP) MOV ARG,(SP)M .ENDM PUSH: .IF NDF,L$$CDA ;DC404. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 .ENDC ;DC404l;R*; C$$CDA = 0 LOADABLE CRASH DRIVER SUPPORT*; C$$CDA = N RESIDENT CRASH DRIVER SUPPORT;1B; WHEN RESIDENT CRASH DRIVER SUPPORT IS SELECTED, THIS MODULE WILL@; INCLUDE THE EXECUTIVE CRASH CODE ALONG WITH A SPECIFIC DRIVER.;B; WHEN LOADABLE CRASH DRIVER SUPPORT IS SELECTED, THIS MODULE WILLB; 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 CRASH ;; DRIVER THE FOLLOWING CONDITIONALS ARE DEFINED IN A PREFIXO; FILE:C(; C$$CDA=0 LOADABLE CRASH DRIVER SUPPORT1; L$$CDA=0 LOADABLE CRASH DRIVERS TO BE ASSEMBLEDH#; XX$$CD=0 XX CRASH DRIVER SELECTEDV .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$$CDAS .PAGE .IF DF C$$CDA;+%; **-$CRASH-SYSTEM CRASH DUMP ROUTINE 7; **-$PANIC-SYSTEM CRASH DUMP ROUTINE (REF. ENTRY ONLY) ;RB; 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 A <; DISK OR TAPE. ONCE THE DUMP IS FINISHED THE SYSTEM MAY BE); RE-BOOTED OR ANOTHER DUMP MAY BE TAKEN.A; IF ENTRY IS AT $CRALT, IT IS ASSUMED THAT THE MEMORY MANAGEMENT' ; REGISTERS ARE PROPERLY SET UP.;F ; INPUTS:.;E; KERNEL STACK; ; OUTPUTS:;-<; A CORE IMAGE OF THE SYSTEM IS DUMPED ONTO THE DUMP DEVICE.;-;+,;**-$TRINT-GENERAL TRAP INTERCEPTION ROUTINE; C; THIS ENTRY POINT ADDRESS MAY BE PLACED IN ANY VECTOR TO ALLOW THER+; 00ʂ1ibjbkb a a aSETTING OF THE C BIT AND AN RTI EXECUTED.E;-$TRINT:: ;REFERENCE LABELH1TRP04: BIS #1,2(SP) ;SET CARRY ON TRAPS THROUGH 4A RTI ;RETURN .IFTF ;C$$CDA .IF DF M$$PRO;A=; NOTE: THIS CODE ONLY WORKS PROPERLY FOR UP TO 4 PROCESSORS.T2; MODIFICATIONS WILL HAVE TO BE MADE TO HANDLE THE; DEC HARDWARE ALPHABET.;H-$CRAL1::MOV #$STACK-4,SP ;POINT TO PS PC PAIR+3 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 STACKT3 MOV #$CRMS4,R1 ;GET ADDRESS OF MESSAGE TO BE TYPEDA MOV R5,R3 ;COPY PROCESSOR MASK8WRMSG: CALL $DISAN ;DISABLE SANITY TIMERS (ALL OF THEM)% CLR R0 ;INITIALIZE PROCESSOR NUMBERS"10$: CLC ;CLEAR CARRY FOR ROTATE! ROR R3 ;ROTATE R3 RIGHT ONE BITL BCS 30$ ;IF CS TYPE MESSAGE BEQ 50$ ;IF EQ DONE.1 BR 40$ ;INCREMENT PROCESSOR NUMBER AND GO AGAINI%30$: MOV R0,R2 ;CALCULATE CPU LETTERS ADD #'A,R2 ; MOVB R2,$CRCPU ; & MOV R1,-(SP) ;SAVE ADDRESS OF MESSAGE CALL TYPE ;TYPE MESSAGEC* MOV #$CRCPU,R1 ;GET ADDRESS OF CPU LETTER" CALL TYPE ;TYPE PROCESSOR LETTER) MOV (SP)+,R1 ;RESTORE ADDRESS OF MESSAGEN&40$: INC R0 ;ADVANCE PROCESSOR NUMBER BR 10$ ;GO AGAIN50$: ;REFERNCE LABELR .IF DF D$$DXD' CLR $DXDRL ;INDICATE DON'T JMP TO DXDI .ENDC ; DF D$$DXDQ BR $CRASH ;GO DO THE CRASH .ENDC ;M$$PRO .PAGE;GA; THIS ROUTINE IS ENTERED FROM THE DIRECTIVE DISPATCHER IF AN EMT >; IS DONE AT SYSTEM STATE. THE PC PRIOR TO THE TRAP IS SAVED.;T:; IF WE GOT HERE DUE TO A BUGCHECK (EMT 374 OR 375) AND IFC; THE FACILITY ERROR CODE AT $BCFAC IS ZERO THEN THE NEXT TWO WORDSEF; 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.F; THIS ROUTINE IS ALSO CALLED WHEN AN IOT HAS OCCURED IN SYSTEM STATE.B; 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.D; THIS IS ALSO CALLED FOR A TRAP OR NON BUGCHECK EMT IN SYSTEM STATE?; IN THIS CASE THE FACILITY AND ERROR CODES ARE FILLED IN AND AC; CRASH IS DONE.;N.$CREMT::MOV (SP),$BCPC ;SAVE THE PRE-CRASH PC1 TST $BCFAC ;HAVE THE CODES BEEN SAVED ALREADY?S BNE $CRENT ;NE YES - GO CRASH+ MOV (SP),-(SP) ;DUPLICATE PC ON THE STACK 1 SUB #2,(SP) ;POINT AT THE TRAP/EMT INSTRUCTION " MFPI @(SP) ;GET THE INSTRUCTION& BIC #1,(SP) ;GET READY FOR THE TEST1 CMP (PC)+,(SP) ;IS THIS EMT 374/375 (BUGCHECK)?S EMT 374& BEQ 20$ ;IF EQ YES - SAVE THE CODES6 BGCK$A BF.INT,BE.EMT,INTERNAL ;ASSUME EMT INSTRUCTION, CMPB #&377,1(SP) ;EMT INSTRUCTION? BEQ 10$ ;IF EQ YES - GO CRASH0 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 STACKS* 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 CODE$ MOV (SP)+,$BCERR ;STORE IT;B .PAGE=; IF CDA SUPPORT IS INCLUDED IN THE SYSTEM THIS ENTRY WILL DO3?; A CRASH DUMP. IF CDA SUPPORT IS NOT INCLUDED AND THIS IS NOTC@; A P/OS SYSTEM A HALT WILL BE DONE. IF THERE IS NO CDA SUPPORT?; AND THIS IS A P/OS SYSTEM R0 AND R1 WILL BE SETTUP AND A JUMPAB; INTO THE BOOT ROM WILL BE DONE TO DISPLAY THE FACILITY AND ERROR; CODES.;F$CRENT::$PANIC:: ;REFERENCE LABELT$CRASH:: .IFF ;C$$CDAR .IF DF R$$PRO% MOV $BCFAC,R0 ;GET THE FACILITY CODEM" MOV $BCERR,R1 ;GET THE ERROR CODE( BTJMP$ ;HAVE THE ROM SHOW THE MESSAGE .IFF ;R$$PROI(60$: HALT ;WE DON'T HAVE CRASH SO HALT BR 60$ ;OH NO YOU DON'T! .ENDC ;R$$PRO .IFT ;C$$CDA.7 MOV #TRP04,@#4 ;SET UP TO SET CARRY ON TRAPS THROUGH 4A .IF DF M$$PRO& 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 PROCESSORM .ENDC. MOV (SP)+,$CRUPC ;SAVE 00҂Ât__DATADATADATADATAUSER PC FROM THE STACK. MOV (SP)+,$CRUST ;SAVE USER PS FROM THE STACK<$CRALT:: ;ALTERNATE ENTRY POINT USED BY 'X' COMMAND TO XDT .IF DF M$$PRO2 CALL $DISAN ;DISABLE SANITY TIMERS (ALL OF THEM) .ENDC .IF DF D$$DXD& MOV KINAR5,$DXDK5 ;SAVE APR 5 FOR DXD MOV $DXDRL,KINAR5 ;MAP TO DXD# BEQ CRSH ;IF EQ DXD NOT INSTALLEDO& JMP @$DXDEP ;JUMP TO DXD ENTRY POINT.$DXDRT::MOV $DXDK5,KINAR5 ;RESTORE KERNEL APR5" RTT ;RETURN FROM WHENCE WE CAME6CRSH: MOV $DXDK5,KINAR5 ;RESTORE MAPPING FOR THE CRASH .ENDC ; DF D$$DXD7 MOV #TRP04,@#4 ;SET UP TO SET CARRY ON TRAPS THROUGH 4  .IF DF M$$PRO! CACHE$ BYPASS ;BYPASS THE CACHEC .ENDC .PAGE?; DUMP ALL VOLATILE PROCESSOR REGISTERS TO CRASH STACK ($CRSST)N2 TSTB $CRDMP ;HAVE REGISTERS ALREADY BEEN DUMPED? BEQ 5$ ;NO IF EQ JMP 70$ ;O 5$: MOV PS,$CRSST ;STORE FULL PS; MOV #PMODE!PR7,PS ;LOCK OUT INTERRUPTS, PREVIOUS MODE USER  MOV SP,$CRSST-2 ;;;SAVE SPN0 MOV $CRUPC,$CRSST-4 ;;;SAVE PC BEFORE IOT CRASH0 MOV $CRUST,$CRSST-6 ;;;SAVE PS BEFORE IOT CRASH/ MOV #$CRSST-6,SP ;;;RESET SP TO INTERNAL STACK  MFPI SP ;;;SAVE USER'S SPE .IF DF S$$LIB1 MOV #PSMODE!PR7,PS ;;;SET PREVIOUS MODE TO SUPER  .ENDC MFPI SP ;;;GET SUPER SPT( PUSH CPUERR ;;;SAVE CPU ERROR REGISTER+ NOP ;;;THIS INSTRUCTION MUST BE HERE FOR ) ;;;THE 11/60. UNLESS THE APPROPRIATE#& ;;;ECO HAS BEEN APPLIED, ACCESSING" ;;;THE CPU ERROR REGISTER WILL! ;;;CAUSE THE NEXT INSTRUCTIONA ;;;TO BE SKIPPED2 PUSH MEMERR ;;;SAVE MEMORY SYSTEM ERROR REGISTER- PUSH MEMCTL ;;;SAVE MEMORY CONTROL REGISTER $ MOV R0,-(SP) ;;;SAVE REGISTER SET 1 MOV R1,-(SP) ;;;V MOV R2,-(SP) ;;;S MOV R3,-(SP) ;;;  MOV R4,-(SP) ;;; MOV R5,-(SP) ;;;S. PUSH SR0 ;;;SAVE MEMORY MANAGEMENT REGISTERS PUSH SR0+2 ;;; PUSH SR0+4 ;;; PUSH SR3 ;;;# BIC #40,SR3 ;;;DISABLE UNIBUS MAPT2 MOV #UINDR0,R0 ;;;SETUP TO SAVE FIRST SET OF APRS MOV #32.,R1 ;;;E10$: PUSH (R0) ;;;SAVE APR  ADD #2,R0 ;;;MOVE TO NEXT ONED( SOB R1,10$ ;;;LOOP UNTIL ALL ARE SAVED4 MOV #SISDR0,R0 ;;;SETUP TO SAVE SECOND SET OF APR'S MOV #64.,R1 ;;; 20$: PUSH (R0) ;;;SAVE APRR 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 SAVE30$: PUSH (R0) ;;;SAVE A UMR ADD #2,R0 ;;;MOVE TO NEXT ONEA( SOB R1,30$ ;;;LOOP UNTIL ALL ARE SAVED4 INCB $CRDMP ;;;PROCESSOR REGISTERS HAVE BEEN SAVED .PAGE;D8; AT THIS POINT, THE FORMAT OF THE CRASH STACK (STARTING!; FROM THE BOTTOM, IS AS FOLLOWS:T;T#; OFFSET REGISTER NAME ADDRESS,$; ------ ------------- -------;A9; - - - - - - UNIBUS MAPPING REGISTERS - - - - - -A;A6; $CRSST-540 UNIBUS MAP REGISTER 31 (HIGH HALF) 1703665; $CRSST-536 UNIBUS MAP REGISTER 31 (LOW HALF) 170364 ; ... ...6; $CRSST-350 UNIBUS MAP REGISTER 1 (HIGH HALF) 1702025; $CRSST-346 UNIBUS MAP REGISTER 1 (LOW HALF) 170200S;S<; - - - - - - MEMORY MANAGEMENT REGISTERS - - - - - -;E7; $CRSST-344 KERNEL DATA SPACE ADDRESS REG. 7 172376T ; ... ...7; $CRSST-326 KERNEL DATA SPACE ADDRESS REG. 0 172360 7; $CRSST-324 KERNEL INST SPACE ADDRESS REG. 7 172356T ; ... ...7; $CRSST-306 KERNEL INST SPACE ADDRESS REG. 0 172340 7; $CRSST-304 KERNEL DATA SPACE DESCRIPTOR REG. 7 1723360 ; ... ...7; $CRSST-266 KERNEL DATA SPACE DESCRIPTOR REG. 0 17232027; $CRSST-264 KERNEL INST SPACE DESCRIPTOR REG. 7 172316S ; ... ...7; $CRSST-246 KERNEL INST SPACE DESCRIPTOR REG. 0 172300E7; $CRSST-244 SUPER DATA SPACE ADDRESS REG. 7 172276T ; ... ...7; $CRSST-226 SUPER DATA SPACE ADDRESS REG. 0 172260 7; $CRSST-224 SUPER INST SPACE ADDRESS REG. 7 172256T ; ... ...7; $CRSST-206 SUPER INST SPACE ADDRESS REG. 0 172240 7; $CRSST-204 SUPER DATA SPACE DESCRIPTOR REG. 7 1722360 ; ... ...7; $CRSST-166 SUPER DATA SPACE DESCRIPTOR REG. 0 17222027; $CRSST-164 SUPER INST SPACE DESCRIPTOR REG. 7 172216S ; ... ...7; $CRSST-146 SUPER INST SPACE DESCRIPTOR REG. 000ڂ1ibjbkb a a a 172200E7; $CRSST-144 USER DATA SPACE ADDRESS REG. 7 177676T ; ... ...7; $CRSST-126 USER DATA SPACE ADDRESS REG. 0 177660 7; $CRSST-124 USER INST SPACE ADDRESS REG. 7 177656T ; ... ...7; $CRSST-106 USER INST SPACE ADDRESS REG. 0 177640 7; $CRSST-104 USER DATA SPACE DESCRIPTOR REG. 7 1776360 ; ... ...7; $CRSST-066 USER DATA SPACE DESCRIPTOR REG. 0 17762027; $CRSST-064 USER INST SPACE DESCRIPTOR REG. 7 177616S ; ... ...7; $CRSST-046 USER INST SPACE DESCRIPTOR REG. 0 177600E .PAGE#; OFFSET REGISTER NAME ADDRESS.#; ------ ------------- -------U; >; - - - - - - MEMORY MANAGEMENT CONTROL REGISTERS - - - - - -;A!; $CRSST-044 SR3 (MMR3) 172516 !; $CRSST-042 SR2 (MMR2) 177576E!; $CRSST-040 SR1 (MMR1) 177574T!; $CRSST-036 SR0 (MMR0) 177572E;78; - - - - - - USERS GENERAL REGISTERS - - - - - -;O; $CRSST-034 USER R5 ; ... ...; $CRSST-022 USER R0; ?; - - - - - - MEMORY CONTROL/ERROR REGISTERS - - - - - -P; -; $CRSST-020 MEMORY CONTROL REGISTER 177746N1; $CRSST-016 MEMORY SYSTEM ERROR REGISTER 177744U(; $CRSST-014 CPU ERROR REGISTER 177766;L>; - - - - - - STACK POINTERS, CRASH CONTEXT - - - - - -;C%; $CRSST-012 SUPERVISOR STACK POINTERT; $CRSST-010 USER STACK POINTERS; $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 DUMP- .IF DF M$$PRO+ MOVB $PROC2,R0 ;;;GET PROCESSOR NUMBER * 2R .IFF 1 CLR R0 ;;;USE PROC 0 ON SINGLE PROCESSOR SYSTEMR .IFTF6 INC $CRFLG(R0) ;;;INDICATE (TO OTHER PROCESSORS) THAT) ;;;THIS PROCESSOR HAS DUMPED ITS REGSE .IFF- .IF DF K$$DAS( BIS #4,SR3 ;;;ENABLE KERNEL DATA SPACE .ENDC( BIS #1,SR0 ;;;MAKE SURE MEM MGMT IS ON .IFTR6 TSTB $CRFPR ;;;IS THIS THE FIRST PROCESSOR TO CRASH? BGE 31$ ;;;IF GE NO+ MOVB $PROCN,$CRFPR ;;;SAVE ID OF PROCESSOR .IF NE M$$PRO-1- MOV $URMST,R1 ;;;DETERMINE ONLINE PROCESSORSF BIC $CPMSK,R1 ;;;( BIC $CPBIT,R1 ;;;EXCLUDE THIS PROCESSOR* MOV #MP.CRH,R2 ;;;GET CRASH FUNCTION CODE1 CALL $IIFNX ;;;NOTIFY OTHER PROCESSORS TO CRASHD1 CACHE$ BYPASS ;;;SET THE CACHE BYPASS BIT AGAIN# .IFTF%31$: CALL $IIOPN ;;;OPEN UP THE IISTB .IFT  .ENDC ; NE M$$PRO-1 .IFTF ; DF M$$PRO;+?; IF WE HAVE AN I/O PAGE REGION, MAKE A COPY OF THE CURRENT I/OE ; PAGE ...;-* MOV $CRIOP,R0 ;;; GET I/O PAGE REGION PCB# BEQ 314$ ;;; IF EQ, NO PCB TO USEE/ BIT #P2.LMA,P.ST2(R0) ;;; IS THIS REALLY OURS?$ BEQ 314$ ;;; IF EQ NOPE ...S6 MOV @#KISAR6,-(SP) ;;; SAVE THE CONTENTS FOR A MOMENT6 MOV P.REL(R0),@#KISAR6 ;;; MAP TO THE REGION VIA PAR6, MOV #77406,@#KISDR6 ;;; AND 4.KW R/W ACCESS .IFT ;DF M$$PRO+ MOVB $PROCN,R0 ;;; GET THE PROCESSOR INDEXN SWAB R0 ;;; MULTIPLY BY 256O! ASR R0 ;;; AND DOWN TO 4.KW/CPUO1 ADD R0,@#KISAR6 ;;; AND ADJUST TO CORRECT REGION .IFTF ;DF M$$PROT5 BIS #60,@#SR3 ;;; INSURE 22-BIT ADDRESSING IS ON ...E CLR R0 ;;; START AT ABSOLUTE 0' MOV #160000,R1 ;;; AND THE TOP OF APR6N.312$: MOV #-1,-(R1) ;;; INITIALIZE TO NXM INFO# MOV -(R0),(R1) ;;; AND COPY A WORDS CMP R0,#160000 ;;; ARE WE DONE6' BNE 312$ ;;; IF NE, KEEP ON GOING ...C3 MOV (SP)+,@#KISAR6 ;;; RESTORE KERNEL APR6 MAPPING 314$: ;;; REFERENCE LABEL;T>; IF WE'RE HERE DUE TO A BUGCHECK, OUTPUT THE BUGCHECK MESSAGE;;% .IF NDF, C$$NCO ;;; NO LOCAL CONSOLEF' TST $BCFAC ;;;BUGCHECK FACILITY SET ?  BEQ 315$ ;;;IF EQ NO) MOV #$BCMSG,R0 ;;;POINT TO FIRST MESSAGEV# MOV $BCPC,R3 ;;;GET PC OF BUGCHECK CALL OCTSTR ;;;OUTPUT MESSAGEI* MOV $BCFAC,R3 ;;;GET FACILITY OF BUGCHECK CALL OCTSTR ;;;OUTPUT MESSAGE , MOV $BCERR,R3 ;;;GET ERROR CODE OF BUGCHECK CALL OCTSTR ;;;OUTPUT MESSAGEE CALL TYPE ;;;OUTPUT TRAILER1315$: ;;;REFERENCE LABELT .ENDC ; C$$NCO  .IFT ; DF M$$PROT .IF NE M$$PRO-10 MOV #$CRMS2,R1 ;;;INDICATE REGS HAVE BEEN SAVED CALL TYPE ;;;TYPE THE MESSAGE . MOV $CRKRB,R1 ;;;GET CRASH DEVICE00Ât__DATADATADATADATA KRB ADDRESS. BEQ 35$ ;;;IF EQ ASSUME PROCESSOR HAS ACCESS= BIT K.URM(R1),@$CPURM ;;;DOES THIS PROC HAVE ACCESS TO DISK?, BNE 35$ ;;;YES IF NE32$: JMP $CRSHT ;;;HALT(35$: ASRB $CRLCK ;;;LOCK THE CRASH LOCK# BCC 32$ ;;;HALT IF LOCK IS LOCKEDO7 MOV #$CRMS1,R1 ;;;PROC IS WAITING FOR OTHERS TO FINISH; CALL TYPE ;;;TYPE THE MESSAGEC540$: MOV #,R0 ;;;GET NUMBER OF PROCESSORSC750$: BIT $BTMSK(R0),$URMST ;;;IS THIS PROCESSOR ONLINE?T BEQ 55$ ;;;NO IF EQ$6 TST $CRFLG(R0) ;;;HAS PROCESSOR DUMPED ITS REGISTERS?1 BEQ 40$ ;;;IF EQ NO, WAIT FOR ALL PROCS TO DUMPC'55$: SUB #2,R0 ;;;CHECK NEXT PROCESSORK BGE 50$ ;;;GO AGAIN  .ENDC .ENDC270$: MOV #PR7,PS ;;;MAKE SURE WE'RE AT PRIORITY 7. .IF EQ, C$$CDA ;LOADABLE CRASH DRIVER SUPPORT, BIS #60,@#SR3 ;;; TURN ON MEMORY MANAGEMENT8 MOV @#$CRPAR,@#KINAR5 ;;; RELATIVE ADDRESS OF CRASH PAR .IF DF K$$DAS+ MOV @#$CRPAR,@#KDSAR5 ;;; MAP D SPACE ALSOS .ENDC ;DF K$$DAS$ BNE 80$ ;;; CRASH DRIVER IS LOADED' MOV #$CRMS7,R1 ;;; MOVE IN THE MESSAGE  CALL TYPE ;;; TYPE IT OUTC75$: HALT ;;; AND STOP BR 75$ ;;; STOP !S,80$: JMP @120000 ;;; JMP TO CRASH PARTITION .ENDC ; EQ, C$$CDA, .ENDC ; DF C$$CDA .ENDC ; DF L$$CDA# .IF DF, C$$CDA ;CRASH DUMP SUPPORTP& .IF EQ C$$CDA-20 ; CRASH THROUGH KXJ+PBNH== 0 ; SET UP TO IGNORE THIS IN LOWCRVPBNL== 01 MOV $CSFSV,@#KXCSRF ;;; SET ALL OF MEMORY SHARED5 MOV $CSHSV,@#KXCSRH ;;; ...2 MOV $KXPTR,R0 ;;; GET ADDRESS OF KXJ DRIVER'S DCB( MOV D.UCB(R0),R0 ;;; GET ADDRESS OF UCB( MOV U.SCB(R0),R0 ;;; GET ADDRESS OF SCB( MOV S.KRB(R0),R0 ;;; GET ADDRESS OF KRB& MOV K.CSR(R0),R0 ;;; GET TPR0 ADDRESS2 MOV #RI$CRH,4(R0) ;;; SET CRASH NOTIFICATION CODE. MOV $KXVC1,R1 ;;; GET ADDRESS OF FIRST VECTOR, ADD #4,R1 ;;; GET ADDRESS OF SECOND VECTOR5 MOV R1,@#KXJQIR ;;; NOTIFY HOST THROUGH VECTOR 2B,90$: HALT ;;; HALT TO LET HOST COPY MEMORY BR 90$ ;;; DON'T CONTINUE .IFF ; EQ C$$CDA-20<; 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 SUPPORT;; IS SELECTED.6 .IF DF, L$$CDA!R$CRSH ;RESIDENT CRASH OR CRASH DRIVER;C ; TYPE MESSAGE AND WAIT FOR USER;AGAIN:% .IF NDF, C$$NCO ;;; NO LOCAL CONSOLEV .IF DF, L$$CDA;# MOV CRMS0,R1 ;;; TYPE USER MESSAGEH .IFF & MOV #$CRMS0,R1 ;;; USER CRASH MESSAGE .ENDC ; DF L$$CDA CALL TYPE ;;; HALT ;;; WAIT FOR THE USER  .ENDC ; C$$NCOX JMP DUMP ;;; GO DUMP MEMORYM .IFTF ; DF L$$CDA!R$CRSH ;+5; **-OCTSTR-OUTPUT AN ASCIZ STRING, THEN OCTAL NUMBER *; **-OCTOUT-OUTPUT OCTAL NUMBER TO CONSOLE;$ ; INPUTS:E&; R0=ADDRESS OF ASCIZ STRING IF OCTSTR; (RETURNED UPDATED); R3=BINARY VALUE TO OUTPUTO;-,OCTSTR: MOV R0,R1 ;;;COPY ADDRESS OF STRING CALL TYPE ;;;OUTPUT IT$ MOV R1,R0 ;;;UPDATE OUTPUT POINTER .IF DF, L$$CDA ; GL003;5OCTOUT: MOV BCBUF,R1 ;;;POINT TO SCRATCH AREA ; GL003U .IFF ; DF L$$CDA ; GL003J/OCTOUT: MOV #$BCBUF,R1 ;;;POINT TO SCRATCH AREAC .ENDC ; DF L$$CDA ; GL003 MOV #6,R2 ;;;SET LOOP COUNTERN10$: MOV R3,R4 ;;;COPY RESIDUEN4 BIC #177770,R4 ;;;STRIP OFF ALL BUT LAST OCT. DIGIT* ADD #60,R4 ;;;MAKE IT AN ASCII CHARACTER% MOVB R4,-(R1) ;;;STORE THE CHARACTERC, ROR R3 ;;;SHIFT RESIDUE ONE RIGHT (WE KNOW% ;;;C IS CLEAR FROM THE ADD ABOVE)U. ASR R3 ;;;SHIFT TWO (C MAY NOT BE CLEAR, BUT ;;;NOW WE KNOW SIGN BIT IS ASR R3 ;;;SHIFT THREEU) SOB R2,10$ ;;;LOOP UNTIL SIX CHARACTERSO( ;;;FALL THROUGH TO TYPE ROUTINE WITH" ;;;R1 POINTING TO SCRATCH AREA;+; **-TYPE-TYPE AN ASCIZ MESSAGER;4 ; INPUTS:E; R1=ADDRESS OF TEXT STRINGR;-7TYPE: MOV #C$$RSH,R5 ;;;GET CSR ADDRESS OF PRINT DEVICEI#10$: MOVB (R1)+,R2 ;;;GET CHARACTERH! BEQ 40$ ;;;IF EQ END OF MESSAGEI CALL 30$ ;;;PRINT CHARACTERC1 CMPB #15,R2 ;;;CARRIAGE RETURN (OR LINE FEED) ?W BLT 10$ ;;;IF LT NOT EITHER ' CLR R2 ;;;OUTPUT SOME FILL CHARACTERSH" MOV #5,R4 ;;;FIVE WILL B001ibjbkb a a aE ENOUGH20$: CALL 30$ ;;;OUTPUT A FILLH SOB R4,20$ ;;;LOOP UNTIL DONE; BR 10$ ;;;LOOP#30$: TSTB (R5) ;;;IS DEVICE READY?I BPL 30$ ;;;IF PL NOS! MOVB R2,2(R5) ;;;PRINT CHARACTER-40$: RETURN ;;;S .IFT ; DF L$$CDA!R$CRSH;+,; **-CKSUM-VERIFY CHECKSUM OF DEVICE ADDRESS;42; THIS ROUTINE WILL VERIFY THAT THE DEVICE ADDRESS&; HAS NOT BEEN CORRUPTED BY THE CRASH.;- .IF DF, L$$CDA ; GL0036CKSUM: MOV @CRSBN,-(SP) ;;;GET HIGH ORDER BITS ; GL003. ADD @CRSB2,(SP) ;;;ADD LOW ORDER BITS ; GL0031 CMP (SP)+,@CRSCS ;;;COMPARE WITH CHECKSUM; GL003L .IFF ; DF L$$CDA ; GL003:0CKSUM: 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 OK4 HALT ;;;WAIT FOR USER BR CKSUM ;;;TRY AGAINS10$: RETURN ;;;R;+; **-DUMP-DUMP THE SYSTEM IMAGEL;D>; THIS ROUTINE IS USED TO DUMP THE SYSTEM IMAGE ONTO THE CRASHA; DUMP MEDIA. WHEN THE DUMP IS FINISHED THE SYSTEM MAY BE EITHERR); RE-BOOTED OR ANOTHER DUMP MAY BE TAKEN.F; ; INPUTS: ; NONE.;U ; OUTUTS:R; IMAGE DUMPED.H;-!DUMP: ;;;DUMP IMAGE ONTO MEDIAD( .IF DF, L$$CDA ; LOADABLE CRASH DRIVER6 MOV @CRKRB,R0 ;;; GET DUMP DEVICE KRB ADDRESS ; GL003+ BNE 5$ ;;; IF NE GET CSR FROM KRB ; GL003B6 MOV CRCSR,R0 ;;; GET ADDRESS OF WORD WITH CSR ADDRESS35$: MOV (R0),R0 ;;; GET CSR OF DUMP DEVICE ; GL003D+ ;;; (K.CSR IS GUARANTEED TO BE 0);GL003U+ MOV @CRSUN,R3 ;;; GET UNIT NUMBER ; GL003E .IFF ; DF L$$CDA ; GL003 / MOV @#$CRKRB,R0 ;;;GET DUMP DEVICE KRB ADDRESSO" BNE 5$ ;;;IF NE GET CSR FROM KRB7 MOV #$CRCSR,R0 ;;;GET ADDRESS OF WORD WITH CSR ADDRESSL*5$: MOV (R0),R0 ;;;GET CSR OF DUMP DEVICE$ ;;;(K.CSR IS GUARANTEED TO BE 0)# MOV @#$CRSUN,R3 ;;;GET UNIT NUMBERO .ENDC ; DF L$$CDA ; GL003-DUMP1: ;;;DUMMY LABEL SO DUMP ROUTINES CAN ' ;;;USE ANY LOCAL LABEL THEY WANT TO0 ;;;USE .IFTF ; DF L$$CDA!R$CRSHL .IF EQ C$$CDA-1;T; DT;R>; THIS ROUTINE DUMPS ALL OF PHYSICAL MEMORY UP TO A MAXIMUM OF ; 124K WORDS;R*PBNH== 0 ;;;HIGH ORDER TC11 BLOCK NUMBER)PBNL== 1 ;;;LOW ORDER TC11 BLOCK NUMBER 3 CALL CKSUM ;;;CHECK BLOCK NUMBER AGAINST CHECKSUME SWAB R3 ;;;POSITION UNIT BITSB MOV R3,R1 ;;;COPY3, BIS #4003,R1 ;;;SET FOR READ LBN IN REVERSE MOV R1,(R0) ;;;START THE TAPES(10$: BIT #100200,(R0) ;;;ERROR OR READY? BEQ 10$ ;;;IF EQ NO & BPL DUMP ;;;IF PL MOVE UNTIL ENDZONE%20$: MOV R3,R1 ;;;RETRIEVE UNIT BITSR& BIS #3,R1 ;;;SET TO READ LBN FORWARD MOV R1,(R0) ;;;START THE TAPEW(30$: BIT #100200,(R0) ;;;ERROR OR READY?" BMI DUMP ;;;IF MI ERROR, RESTART BEQ 30$ ;;;IF EQ WAIT4 SUB @#$CRSBN+2,6(R0);;;ARE WE AT THE BLOCK WE WANT? BNE 20$ ;;;IF NE NON- CLR 2(R0) ;;;SET WRITE ALL OF MEMORY (UP TO;, CLR 4(R0) ;;;TO 124K) IN 64K WORD SEGMENTS! MOV R3,R1 ;;;RETRIEVE UNIT BITS() BIS #15,R1 ;;;SET TO WRITE DATA FORWARDN! MOV R1,(R0) ;;;WRITE ALL MEMORYE50$: CLR 2(R0) ;;;KEEP WRITINGV TST (R0) ;;;ANY ERRORS?; BPL 50$ ;;;IF PL NOD' BIT #400,-2(R0) ;;;NONEXISTENT MEMORY?B BEQ WERR ;;;IF EQ NO, RETRYD BIS #1,R3 ;;;SET TO STOP TAPES MOV R3,(R0) ;;;STOP TAPE BR $CRSHT ;;;SUCCESS, FINISH .ENDC .IF EQ C$$CDA-2;;; DK;;; IF THE EXECUTIVE DOES NOT SUPPORT 22-BIT ADDRESSING, THIS;9; ROUTINE DUMPS ALL OF PHYSICAL MEMORY UP TO A MAXIMUM OFT ; 124K WORDS.5; ;; IF THE EXECUTIVE SUPPORTS 22-BIT ADDRESSING, THIS ROUTINEM<; DUMPS ALL OF PHYSICAL MEMORY UP A MAXIMUM OF APPROXIMATELY.; 1.2 MEGAWORDS OF MEMORY (FILLS UP THE RK05).;O*PBNH== 0 ;;;HIGH ORDER RK11 DISK ADDRESS)PBNL== 1 ;;;LOW ORDER RK11 DISK ADDRESSV3 CALL CKSUM ;;;CHECK DISK ADDRESS AGAINST CHECKSUM# ASH #13.,R3 ;;;POSITION UNIT BITS' MOV #401,(R0) ;;;RESET RK11 CONTROLLERU/ BIS @#$CRSBN+2,R3 ;;;SET STARTING DISK ADDRESSL! MOV R3,6(R0) ;;;SET DISK ADDRESSM% CLR @#UBMPR ;;;INITIALIZE FIRST UMRU CLR @#UBMPR+2 ;;;...D6 BIS #60,@#SR3 ;;;ENABLE 22-BIT MAPPING AND UNIBUS MAP0 ;;00Ât__DATADATADATADATA;(KERNEL D HAS BEEN CONDITIONALLY ENABLED)%40$: MOV 6(R0),R3 ;;;GET DISK ADDRESS=/ BIC #160017,R3 ;;;EXTRACT CYLINDER AND SURFACE;. CMP #14420,R3 ;;;ABOUT TO WRITE CYLINDER THAT! ;;;CANNOT ORDINARILY BE READ?U' BEQ $CRSHT ;;;IF EQ YES, STOP WRITING* CLR 4(R0) ;;;INITIALIZE TRANSFER ADDRESS0 MOV #-6000,2(R0) ;;;WRITE 3K WORDS (1 CYLINDER)! MOV #403,(R0) ;;;START THE WRITEC(45$: BIT #100200,(R0) ;;;ERROR OR READY? BEQ 45$ ;;;IF EQ NOS BMI 50$ ;;;IF MI ERROR4 ADD #14000,@#UBMPR ;;;POINT TO NEXT 3K WORD SEGMENT ADC @#UBMPR+2 ;;;...0( BR 40$ ;;;GO AGAIN UNTIL END OF MEMORY,50$: BIT #2000,-2(R0) ;;;NONEXISTENT MEMORY? BNE $CRSHT ;;;YES IF NE HALT .ENDC .IF EQ C$$CDA-3;I; MT;U<; THIS ROUTINE DUMPS ALL OF PHYSICAL MEMORY (UP TO A MAXIMUM9; OF 124K WORDS) IN 512 BYTE RECORDS AT 800 BPI (9-TRACK)D;1+PBNH== 0 ;;;BLOCK NUMBER IGNORED FOR TM11PBNL== 0 ;;;& SWAB R3 ;;;POSITION UNIT SELECT BITS+ BIS #60001,R3 ;;;MERGE DENSITY AND GO BITS, MOV R3,R2 ;;;COPYE# BIS #16,R2 ;;;SET REWIND FUNCTION;! MOV R2,(R0) ;;;START THE REWINDD(10$: BIT #100200,(R0) ;;;ERROR OR READY? BMI WERR ;;;IF MI ERROR, 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 BIT;" MOV R2,(R0) ;;;LOAD MTC REGISTER130$: MOV #500,R1 ;;;WAIT FOR TAPE TO SETTLE DOWNI35$: DEC R1 ;;;WAIT BNE 35$ ;;;IF NE LOOP,* 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 NOI! BPL 30$ ;;;IF PL WRITE FINISHED1$ TSTB -2(R0) ;;;NONEXISTENT MEMORY? BPL WERR ;;;IF PL NO, RETRYA MOV R3,R2 ;;;RETRIEVE MTC BITS$ BIS #10000,R2 ;;;SET CLEAR FUNCTION MOV R2,(R0) ;;;LOAD FUNCTION50$: TSTB (R0) ;;;READY?V BPL 50$ ;;;IF PL NOE% BIS #6,R3 ;;;SET WRITE EOF FUNCTIONA! MOV R3,(R0) ;;;DO THE WRITE EOF;60$: TSTB (R0) ;;;READY?O BPL 60$ ;;;IF PL NO; CLR (R0) ;;;CLEAR MTC REGISTER$ BR $CRSHT ;;;SUCCESSFUL COMPLETION .ENDC .IIF EQ C$$CDA-4 CDA$MM=0 .IF DF CDA$MM!MM$$CD ;I; MM;17; THIS ROUTINE DUMPS ALL OF PHYSICAL MEMORY IN 512 BYTEP; RECORDS AT 800 BPI; ,PBNH== 0 ;;;BLOCK NUMBER IGNORED FOR TJU16PBNL== 0 ;;;% BIS (PC)+,R3 ;;;SET MODE AND DENSITY)6$TDNSY::.WORD 1300 ;;;DEFAULT TO 800 BPI, NORMAL MODE .IF DF L$$CDA+ MOV @CRSFM,R2 ;;;RETRIEVE FORMATTER NUMBERT .IFF ; DF L$$CDAB- MOV @#$CRSFM,R2 ;;;RETRIEVE FORMATTER NUMBERI .ENDC ; DF L$$CDA$ CALL 120$ ;;;SELECT FORMATTER/UNIT/ MOV 26(R0),R4 ;;;RETRIEVE DEVICE TYPE REGISTER) BIT #40000,R4 ;;;IS THIS A MASSBUS TAPE?O BEQ 10$ ;;;IF EQ NO2) BIT #10000,10(R0) ;;;NON EXISTENT DRIVE?0 BNE WERR ;;;IF NE, YES.F! BIT #50,R4 ;;;TM02/3 FORMATTER?C BNE 20$ ;;;IF NE YES .IF DF L$$CDA'10$: MOV CRMS6,R1 ;;;NO, ILLEGAL DEVICEE .IFF ; DF L$$CDA)10$: MOV #$CRMS6,R1 ;;;NO, ILLEGAL DEVICE .ENDC ; DF L$$CDA- BR WERR1 ;;;PRINT OUT MESSAGE AND TRY AGAIN+20$: BIT #2000,R4 ;;;IS SLAVE UNIT PRESENT?  BEQ WERR ;;;IF EQ NO .IF DF L$$CDA# CLR @CRBAE ;;;INITIALIZE BAE FLAG; .IFF ; DF L$$CDAA$ CLR @#$CRBAE ;;;INITIALIZE BAE FLAG .ENDC ; DF L$$CDA MOV R0,R4 ;;;;COPY CSR ADDRESS1 ADD #26,R4 ;;;ADD OFFSET TO DRIVE TYPE REGISTER;130$: ADD #2,R4 ;;; R4 > REGISTER (11/24 PROBLEM);% TST (R4) ;;; DEVICE REGISTER THERE?D BCC 30$ ;;;IF CC IT EXISTS- SUB #34,R4 ;;;SUB # OF DEVICE REGISTERS + 2  SUB R0,R4 ;;;U* BNE 40$ ;;;IF NE IT'S AN RH70 CONTROLLER .IF DF L$$CDA( COM @CRBAE ;;;IT'S NOT, RESET BAE FLAG .IFF ; DF L$$CDA ) COM @#$CRBAE ;;;IT'S NOT, RESET BAE FLAGA .ENDC ; DF L$$CDA0 CLR @#UBMPR ;;;AND INITIALIZE FIRST UNIBUS ...( CLR @#UBMPR+2 ;;;;... MAPPING REGISTERS:40$: BIS #60,@#SR3 ;;;ENABLE 22 BIT MAPPING AND UNIBUS MAP5 MOV #<4*4>,R5 ;;;NUMBER OF 512 BYTE RECORDS/4K BLOCKT$ CALL 120$ ;;;SELECT FORMATTER/UNIT) MOV #7,(R0) ;;;START THE TAPE REWINDINGR MOV #4000001ibjbkb a a a0,R1 ;;;PAUSE'50$: SOB R1,50$ ;;;LOOP FOR DELAY TIMER860$: BIT #20000,12(R0) ;;;POSITIONING STILL IN PROGRESS? BNE 60$ ;;;IF NE YES TSTB 12(R0) ;;;DRIVE READY?, BPL 60$ ;;;IF PL NON( MOV #60,(R0) ;;;LOAD THE WRITE FUNCTION) CLR 4(R0) ;;;SET TO WRITE ALL OF MEMORY;'70$: MOV #-256.,2(R0) ;;;SET WORD COUNT3$ MOV #-512.,6(R0) ;;;SET FRAME COUNT- BIS #1,(R0) ;;;START TO WRITE ALL OF MEMORYS!80$: TSTB 12(R0) ;;;DRIVE READY?O BPL 80$ ;;;IF PL NOR! DEC R5 ;;;DECREMENT BLOCK COUNTM BNE 100$ ;;;IF NE USE SAME UMR .IF DF L$$CDA* TST @CRBAE ;;;IS THE BAE REGISTER THERE? .IFF ; DF L$$CDAS+ TST @#$CRBAE ;;;IS THE BAE REGISTER THERE?I .ENDC ; DF L$$CDA BEQ 90$ ;;;IF EQ YES= ADD #<1024.*4*2>,@#UBMPR ;;;NO, POINT UMR TO NEXT 4K OF MEMF! ADC @#UBMPR+2 ;;;DOUBLE WORD ADDS CLR 4(R0) ;;;RESET BUS ADDRESS.90$: MOV #<4*4>,R5 ;;;RESET TO # BLOCKS PER 4K)100$: BIT #40000,(R0) ;;;TRANSFER ERRORS?I 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 REGISTER $ BR $CRSHT ;;;SUCCESSFUL COMPLETION+120$: BIS #40,10(R0) ;;;RESET RH CONTROLLER@" MOV R2,10(R0) ;;;SELECT FORMATTER MOV R3,32(R0) ;;;SELECT UNIT:.130$: TSTB 12(R0) ;;;IS THE TAPE DRIVE READY? BPL 130$ ;;;IF PL NO RETURN ;;;EXITQ .ENDC ; DF CDA$$MM!MM$$CD .IIF EQ C$$CDA-5 CDA$DB=0 ;;;W .IIF EQ C$$CDA-11 CDA$DR=0 ;;; .IF DF CDA$DB!CDA$DR#;0 ; DB AND DRF; <; THE LOCAL SYMBOLS REFERENCED ABOVE, CDA$DB AND CDA$DR, ARE8; USED WITHING THE FOLLOWING COMMON CODE DRIVER BELOW TO:; DIFFERENTIATE BETWEEN RP04/5/6 AND RM02/3/5 TYPE DRIVES.; +; THIS ROUTINE DUMPS ALL OF PHYSICAL MEMORYA;R&PBNH== 0 ;;;DEFAULT CYLINDER ADDRESS.PBNL== 1 ;;;DEFAULT TRACK AND SECTOR ADDRESS3 CALL CKSUM ;;;CHECK DISK ADDRESS AGAINST CHECKSUMM& MOV #40,10(R0) ;;;RESET RH CONTROLLER MOVB R3,10(R0) ;;;SELECT UNIT/ MOV 26(R0),R4 ;;;RETRIEVE DEVICE TYPE REGISTERA) BIT #40000,R4 ;;;IS THIS A MASSBUS DISK?A BNE 5$ ;;;IF NE NO' BIC #^C<777>,R4 ;;;CLR EXTRANEOUS BITSO) BIT #20,R4 ;;;IS IT A DISK OF INTEREST?W BEQ 5$ ;;;IF EQ NO) CMP #25,R4 ;;;IS IT RP04/5/6 OR RM02/3?A BHIS 10$ ;;;IF HIS YES CMP #27,R4 ;;;IS IT RM05?I BEQ 10$ ;;;IF EQ YES(5$: MOV #$CRMS6,R1 ;;;NO, ILLEGAL DEVICE) BR WERR1 ;;;PRINT MESSAGE AND TRY AGAINE(10$: CLR @#$CRBAE ;;;INITIALIZE BAE FLAG MOV R0,R4 ;;;;COPY CSR ADDRESS1 ADD #26,R4 ;;;ADD OFFSET TO DRIVE TYPE REGISTERA<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 + 2O SUB R0,R4 ;;;;* BNE 30$ ;;;IF NE IT'S AN RH70 CONTROLLER) COM @#$CRBAE ;;;IT'S NOT, RESET BAE FLAGQ0 CLR @#UBMPR ;;;AND INITIALIZE FIRST UNIBUS ...( CLR @#UBMPR+2 ;;;;... MAPPING REGISTERS:30$: BIS #60,@#SR3 ;;;ENABLE 22 BIT MAPPING AND UNIBUS MAP# MOV #40,10(R0) ;;;CLEAR CONTROLLER6 MOVB R3,10(R0) ;;;SELECT UNIT& MOV #23,(R0) ;;;DO A PACK ACKNOWLEDGE' MOV @#$CRSBN,34(R0) ;;;SELECT CYLINDER4, MOV @#$CRSBN+2,6(R0);;;SET SECTOR AND TRACK" CLR 4(R0) ;;;ZERO BUFFER ADDRESS' MOV #14000,32(R0) ;;;SET 16-BIT FORMATB540$: MOV #-<256.*4*4>,2(R0) ;;;WORD COUNT = 4K WORDS . MOVB #61,(R0) ;;;START TO WRITE ALL OF MEMORY050$: MOV #10,-(SP) ;;; Stack - delay loop count.651$: BIS -(SP),(SP)+ ;;; Delay for 11/84 (DR) problem. DEC (SP) ;;; End of delay?* BNE 51$ ;;; IF NE, No - delay some more. TST (SP)+ ;;; Maintain stack.($ BIT #100200,(R0) ;;;READY OR ERROR? BEQ 50$ ;;;IF EQ NEITHER, TST @#$CRBAE ;;;;IS THE BAE REGISTER THERE? BEQ 60$ ;;;IF EQ YES= ADD #<1024.*4*2>,@#UBMPR ;;;NO, POINT UMR TO NEXT 4K OF MEM:! ADC @#UBMPR+2 ;;;DOUBLE WORD ADDU CLR 4(R0) ;;;RESET BUS ADDRESS'60$: BIT #40000,(R0) ;;;TRANSFER ERROR?0 BEQ 40$ ;;;IF EQ NOy. BIT #4000,10(R0) ;;;NONEXISTENT MEMORY ERROR?) BNE $CRSHT ;;;IF NE YES, ELSE I/O ERROR  .ENDC00Ât__DATADATADATADATA .IF EQ C$$CDA-6;a; DM;.;; IF THE EXECUTIVE DOES NOT SUPPORT 22-BIT ADDRESSING, THISY9; ROUTINE DUMPS ALL OF PHYSICAL MEMORY UP TO A MAXIMUM OFS ; 124K WORDS.E;H;; IF THE EXECUTIVE SUPPORTS 22-BIT ADDRESSING, THIS ROUTINEO; DUMPS ALL OF PHYSICAL MEMORY.A;@:; NOTE THAT THE STANDARD METHOD OF DUMPING ALL OF PHYSICAL:; MEMORY (DUMPING UNTIL THE CONTROLLER DETECTS NONEXISTENTB; MEMORY) DOES NOT WORK, BECAUSE THE RK611 WRITES AN UNCORRECTABLE@; ECC ERROR IN THE LAST SECTOR IT WRITES UNDER THOSE CONDITIONS.;a+PBNH== 0 ;;;RK06 DEFAULT CYLINDER ADDRESSR.PBNL== 1 ;;;DEFAULT SECTOR AND TRACK ADDRESS3 MOV #TRP04,@#114 ;;;POSITION TRAP CATCHER FOR NON-! ;;;EXISTENT MEMORY TRAPS WHENB% ;;;SIZE REGISTER > SIZE OF MEMORYL3 CALL CKSUM ;;;CHECK BLOCK NUMBER AGAINST CHECKSUMM# CLR R2 ;;;ASSUME DRIVE IS AN RK06E, MOV #40,10(R0) ;;;CLEAR THE RK611 SUBSYSTEM! MOV R3,10(R0) ;;;SELECT THE UNITB* MOV #1,(R0) ;;;SELECT THE DRIVE FUNCTION10$: TSTB (R0) ;;;READY?R BPL 10$ ;;;IF PL NOC$ BIT #400,12(R0) ;;;IF THIS AN RK07?# BEQ 20$ ;;;IF EQ NO, IT'S AN RK06; BIS #2000,R2 ;;;SET RK07 BITE020$: MOV #40,10(R0) ;;;CLEAR THE RK611 SUBSYSTEM! MOV R3,10(R0) ;;;SELECT THE UNITA" MOV R2,R1 ;;;COPY DRIVE TYPE BIT) BIS #3,R1 ;;;GET PACK ACK FUNCTION CODEU& MOV R1,(R0) ;;;DO A PACK ACKNOWLEDGE30$: TSTB (R0) ;;;READY?# BPL 30$ ;;;IF PL NOR" MOV 12(R0),R1 ;;;GET DRIVE STATUS COM R1 ;;;COMPLEMENT% BIT #100301,R1 ;;;DRIVE READY TO GO?:! BNE WERR ;;;IF NE NO, TRY AGAIN;% MOV @#$CRSBN,20(R0) ;;;LOAD CYLINDER ) MOV @#$CRSBN+2,6(R0);;;LOAD SECTOR/TRACK0" BIS #23,R2 ;;;SET WRITE FUNCTION% CLR @#UBMPR ;;;INITIALIZE FIRST UMRS CLR @#UBMPR+2 ;;;...)6 BIS #60,@#SR3 ;;;ENABLE 22-BIT MAPPING AND UNIBUS MAP0 ;;;(KERNEL D HAS BEEN CONDITIONALLY ENABLED)* MOV #140000,R5 ;;;SET TO MAP THROUGH APR6/ CLR @#KISAR6 ;;;POINT AT FIRST BYTE OF 4K WORD1 MOV #77406,@#KISDR6 ;;;SEGMENTM350$: CLR 4(R0) ;;;START AT BEGINNING OF MEMORY ...  ;;;... OR UNIBUS MAP0 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 ERRORR4 ADD #4000,@#UBMPR ;;;POINT TO NEXT 1K WORD BOUNDARY ADC @#UBMPR+2 ;;;0 ADD #40,@#KISAR6 ;;;POINT AT FIRST WORD OF NEXT ;;;TRANSFER ; CMP #170000,@#KISAR6 ;;;IS IT ABOVE HIGHEST POSSIBLE WORD?Y BEQ $CRSHT ;;;IF EQ YES,. TST (R5) ;;;DOES FIRST WORD OF NEXT TRANSFER ;;;EXIST?M BCC 50$ ;;;IF CC YES BR $CRSHT ;;;DONE2 .ENDC .IIF EQ C$$CDA-7 CDA$DL=0 .IF DF CDA$DL!DL$$CD!H$$GEN;#; DL; C; IF THE EXECUTIVE DOES NOT SUPPORT 22-BIT ADDRESSING, THIS ROUTINER=; DUMPS ALL OF PHYSICAL MEMORY UP TO A MAXIMUM OF 124K WORDS.C;U;; IF THE EXECUTIVE SUPPORTS 22-BIT ADDRESSING, THIS ROUTINE; DUMPS ALL OF PHYSICAL MEMORY.K;R:; NOTE THAT THE STANDARD METHOD OF DUMPING ALL OF PHYSICAL>; MEMORY (DUMP MEMORY UNTIL THE CONTROLLER DETECTS NONEXISTENTB; MEMORY) DOES NOT WORK ON A Q-BUS CPU WHERE SOME MEMORY IS UNUSEDC; BECAUSE IT "OVERLAPS" THE I/O PAGE. FOR EXAMPLE, A 124K WORD CPU#?; WITH FOUR 32K WORD MEMORY BOARDS. UNDER THOSE CIRCUMSTANCES,NA; 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.;Y" .IF NE C$$CDA ;IF RESIDENT CRASHPBNH== 0 ;;;NOT USED/PBNL== 2 ;;;RL01/02 CYLINDER,TRACK AND SECTORC .ENDC ; EQ C$$CDA;O&; **** IMPORTANT - PLEASE NOTE ****;YB; WITH LOADABLE CRASH DUMP SUPPORT, PBNL AND PBNH ARE DEFINED WITH<; GLOBAL DEFINITIONS IN THE BUILD FILE FOR EACH DRIVER. ANYB; MODIFICATIONS MADE HERE TO PBNL OR PBNH MUST BE ALSO MADE IN THE; CORRESPONDING BUILD FILE. ;I .IF DF H$$GEN .IF DF, L$$CDA ; GL003DLDU: INCB CRDEV ; GL003R% CMPB #'L,@CRDEV ;;;IS THIS THE RL11?I .IFF ; DF L$$CDA0,DLDU: CMPB #'L,$CRDEV+1 ;;;IS THIS THE RL11? .ENDC ; DF L$$CDA BEQ RL11 ;;;IF EQ YES*$ ;;;ONLY DL/DU FOR P$$GEN S00 1ibjbkb a a aYSTEMS( JMP MSCPDV ;;;GO TO MSCP CRASH ROUTINE .ENDC*RL11: CALL CKSUM ;;;CHECKSUM DISK ADDRESS .IF DF, L$$CDA ; GL003+ CLR @CRBAE ;;;INITIALIZE BAE FLAG ; GL003T .IFF ; DF L$$CDA ; GL003S CLR @#$CRBAEE .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 SETS BEQ 3$ ;;;IF EQ YESD .IF DF, L$$CDA ; GL003-2$: COM @CRBAE ;;;NO, RESET BAE FLAG ; GL003J .IFF ; DF L$$CDA ; GL003H&2$: COM @#$CRBAE ;;;NO, RESET BAE FLAG .ENDC ; DF L$$CDA ; GL0030 CLR @#UBMPR ;;;AND INITIALIZE FIRST UNIBUS ...( CLR @#UBMPR+2 ;;;;... MAPPING REGISTERS93$: BIS #60,@#SR3 ;;;ENABLE 22 BIT MAPPING AND UNIBUS MAPB9 MOV #<2044.*4>,-(SP) ;;;NUMBER OF BLOCKS IN 2044K WORDSL/ MOV #<4*4>,R5 ;;;NUMBER OF BLOCKS PER 4K WORDSE* SWAB R3 ;;;MOVE UNIT NUMBER TO HIGH BYTE& BIS #4,R3 ;;;SET GET STATUS FUNCTION+ MOV #13,4(R0) ;;;SET CODES TO CLEAR DRIVERB% MOV R3,(R0) ;;;EXECUTE THE FUNCTION (10$: BIT #100200,(R0) ;;;READY OR ERROR? BEQ 10$ ;;;IF EQ NEITHER! BMI WERRX ;;;IF MINUS I/O ERRORI. ADD #4,R3 ;;;CONVERT TO READ HEADER FUNCTION .IF DF, L$$CDA ; GL0035 MOV @CRSB2,R4 ;;; SAVE STARTING DISK ADDRESS ; GL003# .IFF ; DF L$$CDA ; GL003 0 MOV @#$CRSBN+2,R4 ;;;SAVE STARTING DISK ADDRESS .ENDC ; DF L$$CDA ; GL0031 CLR 2(R0) ;;;SET BUFFER ADDRESS FOR FIRST WRITET 15$: MOV R3,(R0) ;;;READ HEADER'20$: BIT #100200,(R0) ;;;DONE OR ERROR?, BEQ 20$ ;;;IF EQ NEITHER! BMI WERRX ;;;IF MINUS I/O ERRORO' MOV 6(R0),R1 ;;;GET HEADER INFORMATIONI( 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 REQUIREDD( MOV R4,R2 ;;;COPY DESIRED DISK ADDRESS) BIC #177,R1 ;;;ISOLATE CYLINDER ADDRESSI1 BIC #177,R2 ;;;ISOLATE CYLINDER ADDRESS DESIREDR+ SUB R2,R1 ;;;SUBTRACT DESIRED FROM ACTUAL5% BHIS 25$ ;;;IF HIS ACTUAL >=DESIREDT- NEG R1 ;;;ACTUAL < DESIRED, MAKE POS. DIFF.I2 BIS #4,R1 ;;;SET SIGN FOR MOVE TO CENTER OF DISK25$: 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 WORDE' SUB #2,R3 ;;;CONVERT TO SEEK FUNCTION  MOV R3,(R0) ;;;START THE SEEKO(35$: BIT #100200,(R0) ;;;READY OR ERROR? BEQ 35$ ;;;IF EQ NEITHER BMI WERRX ;;;IF MI I/O ERROR.40$: MOV R4,4(R0) ;;;LOAD DESIRED DISK ADDRESS. MOV #-256.,6(R0) ;;;LOAD ONE BLOCK WORD COUNT$ BIC #17,R3 ;;;REMOVE FUNCTION BITS" BIS #12,R3 ;;;SET WRITE FUNCTION MOV R3,(R0) ;;;START THE WRITE(45$: BIT #100200,(R0) ;;;ERROR OR READY? BEQ 45$ ;;;IF EQ NEITHER BMI 70$ ;;;IF MI ERROR. DEC (SP) ;;;DUMPED MAXIMUM AMOUNT OF MEMORY? BEQ 72$ ;;;IF EQ YES! DEC R5 ;;;DECREMENT BLOCK COUNTE BNE 60$ ;;;IF NE USE SAME UMRY .IF DF, L$$CDA ; GL0032 TST @CRBAE ;;;IS THE BAE REGISTER THERE? ; GL003 .IFF ; DF L$$CDA ; GL003A3 TST @#$CRBAE ;;;IS THE BAE REGISTER THERE? ; GL003 .ENDC ; DF L$$CDA ; GL003 BEQ 50$ ;;;IF EQ YES= ADD #<1024.*4*2>,@#UBMPR ;;;NO, POINT UMR TO NEXT 4K OF MEM0! ADC @#UBMPR+2 ;;;DOUBLE WORD ADD4 CLR 2(R0) ;;;RESET BUS ADDRESS350$: MOV #<4*4>,R5 ;;;NUMBER OF BLOCKS PER 4K WORDSM60$: MOV (R0),R3 ;;;GET CSR1 BIC #^C<1460>,R3 ;;;ISOLATE UNIT AND EX MEM BITSI" ADD #2,R4 ;;;MOVE TO NEXT SECTOR MOV R4,R1 ;;;COPY DISK ADDRESS& BIC #^C<77>,R1 ;;;GET THE SECTOR BITS CMP #50,R1 ;;;OVERRUN COMING?R BNE 40$ ;;;IF NE NOT" BIS #77,R4 ;;;INCREMENT TRACK... INC R4 ;;;...SET SECTOR TO 0( BIS #10,R3 ;;;SET READ HEADER FUNCTION BR 15$ ;;;AND GO AGAIN+70$: BIT #20000,(R0) ;;;NONEXISTENT MEMORY?2 BEQ WERRX ;;;IF EQ I/O ERROR"72$: TST (SP)+ ;;;CLEAN THE STACK .IF NDF H$$GENV BR $CRSHT ;;;DUMP DONE .IFFR JMP $CRSHT ;;;DUMP DONEB .IFTF$WERRX: TST (SP)+ ;;;CLEAN THE STACK .IFFP! JMP WERR ;;;GO TO ERROR HANDLERT .ENDC .ENDC ; DF CDA$DL!H$$GEN!DL$$CD .IF EQ C$$CDA-10N;B00Ât__DATADATADATADATA; DD;;<; THIS ROUTINE DUMPS ALL OF PHYSICAL MEMORY UP TO A LIMIT OF ; 124K WORDS;H-PBNH== 0 ;;;NOT USED BY TU58 TAPE CARTRIDGET#PBNL== 1 ;;;STARTING BLOCK NUMBERD; THIS CODE INTERFACES WITH A TU58 VIA A DL11 ASYNCHRONOUS INTERFACE. CALL CKSUM ;;;CHECKSUM STARTING BLOCK NUMBER5 MOV #TRP04,@#114 ;;;POSITION NONEXISTENT MEMORY TRAPT* ;;;CATCHER FOR CPU'S WHERE MEMORY SIZE ;;;REGISTER > SIZE OF MEMORY1 CLR @#KISAR6 ;;;WANT TO POINT TO PHYSICAL MEMORY$ MOV #77406,@#KISDR6 ;;;THROUGH APR6; INITIALIZE TU58A% CLR -(SP) ;;;RESERVE SPACE ON STACK ! MOV R3,-(SP) ;;;SAVE UNIT NUMBER  BIS #1,4(R0) ;;;SEND BREAK" MOV #6,R2 ;;;SET TO SEND 6 NULLS5$: CLRB 6(R0) ;;;SEND A NULL CALL XWAIT ;;; SOB R2,5$ ;;;LOOPE CLR 4(R0) ;;;CLEAR BREAK# TST 2(R0) ;;;DUMP RECEIVER BUFFER# MOVB #4,6(R0) ;;;SEND INITE CALL XWAIT ;;;WAIT# MOVB #4,6(R0) ;;;SEND ANOTHER INIT  CALL XWAIT ;;;WAIT#10$: TSTB (R0) ;;;RECEIVED A BYTE?T BPL 10$ ;;;IF PL NOM' CMPB #20,2(R0) ;;;RECEIVED A CONTINUE?N BNE 35$ ;;;IF NE NO, I/O ERROR; SEND COMMAND PACKETM0 MOV @#$CRSBN+2,R2 ;;;SAVE STARTING TU58 ADDRESS715$: MOV #140000,R1 ;;;INITIALIZE POINTER TO FIRST BYTE6 ;;;MAPPED BY APR6C# MOVB #2,6(R0) ;;;SEND COMMAND FLAG CALL XWAIT ;;;WAIT1 MOVB #12,6(R0) ;;;SEND COMMAND PACKET BYTE COUNT49 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 BYTER/ MOV #3,R5 ;;;UPDATE PACKET CHECKSUM FOR THOSEE! CALL CKSM ;;;TWO BYTES AND WAITM$ 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 DL11O CLR 6(R0) ;;;SEND A NULL SOB R3,20$ ;;;LOOP1 MOV (SP),R5 ;;;UPDATE PACKET CHECKSUM FOR FIRST)+ CALL CKSM ;;;FOUR OF THOSE BYTES AND WAIT5 MOVB #<1024.*2/400>,6(R0) ;;;SEND HIGH ORDER BYTE OF ' ;;;NUMBER OF BYTES TO TRANSFERL0 MOV #<1024.*2>,R5 ;;;UPDATE PACKET CHECKSUM FOR0 CALL CKSM ;;;TRANSFER BYTE COUNT AND THEN WAIT- MOV R2,R3 ;;;COPY TU58 LOGICAL BLOCK NUMBERU( MOVB R3,6(R0) ;;;SEND LOW ORDER BYTE OF ;;;LOGICAL BLOCK NUMBERB SWAB R3 ;;;: CALL XWAIT ;;;WAIT FOR DL11) MOVB R3,6(R0) ;;;SEND HIGH ORDER BYTE OF; ;;;LOGICAL BLOCK NUMBER ) MOV R2,R5 ;;;UPDATE PACKET CHECKSUM FORF, CALL CKSM ;;;LOGICAL BLOCK NUMBER AND WAIT1 MOVB R4,6(R0) ;;;SEND LOW ORDER BYTE OF CHECKSUM; SWAB R4 ;;;  CALL XWAIT ;;;WAIT FOR DL1152 MOVB R4,6(R0) ;;;SEND HIGH ORDER BYTE OF CHECKSUM0; SEND PROMISED DATA TO TU58 IN 128 BYTE PACKETS8 MOV #<1024.*2/128.>,2(SP) ;;;NUMBER OF 128 BYTE PACKETS# ;;;PER 1K WORDS OF MEMORY(30$: TSTB (R0) ;;;RECEIVED A CHARACTER? BPL 30$ ;;;IF PL NO;' CMPB #20,2(R0) ;;;RECEIVED A CONTINUE?B%35$: BNE DEND ;;;IF NE NO, I/O ERRORK/ MOV #<128./2>,R3 ;;;NUMBER OF WORDS PER PACKETM CALL XWAIT ;;;WAIT FOR DL11;/ MOVB #1,6(R0) ;;;SEND DATA PACKET COMMAND FLAG CALL XWAIT ;;;WAIT FOR DL112 MOVB #128.,6(R0) ;;;SEND NUMBER OF DATA BYTES PER ;;;DATA PACKET8 MOV #<128.*400+1>,R4 ;;;INITIALIZE DATA PACKET CHECKSUM CALL XWAIT ;;;WAIT FOR DL11S340$: MOV (R1),R5 ;;;WILL USE DATA WORD IN CHECKSUM)1 MOVB (R1)+,6(R0) ;;;SEND FIRST BYTE OF DATA WORD CALL XWAIT ;;;WAIT FOR DL11O% MOVB (R1)+,6(R0) ;;;SEND SECOND BYTE/- CALL CKSM ;;;FACTOR DATA WORD INTO CHECKSUMP ;;;AND THEN WAIT1 SOB R3,40$ ;;;LOOP FOR EACH DATA WORD OF PACKETA1 MOVB R4,6(R0) ;;;SEND LOW ORDER BYTE OF CHECKSUM SWAB R4 ;;;0 CALL XWAIT ;;;WAIT FOR DL11P2 MOVB R4,6(R0) ;;;SEND HIGH ORDER BYTE OF CHECKSUM% DEC 2(SP) ;;;DECREMENT PACKET COUNTI& BNE 30$ ;;;IF NE SEND ANOTHER PACKET(; CLEAR OUT END PACKET MESSAGE FROM TU581 MOV #14.,R3 ;;;NUMBER OF BYTES IN AN END PACKETI(50$: TSTB (R0) ;;;RECEIVED A CHARACTER? BPL 50$ ;;;IF PL NOL TST 2(R0) ;;;DUMP CHARARACTERC SOB R3,50$ ;;;LOOP1 CMP #<7600-40>,@#KISAR6 ;;;HA001ibjbkb a a aVE SENT 124K WORDS?F BNE 70$ ;;;IF NE NO;'60$: CMP (SP)+,(SP)+ ;;;CLEAN OFF STACK4 BR $CRSHT ;;;SUCCESS270$: TST (R1) ;;;DOES NEXT MEMORY LOCATION EXIST?) BCS 60$ ;;;IF CS NO (NONEXISTENT MEMORYC% ;;;TRAP CATCHER CAUGHT REFERENCE)T/ ADD #4,R2 ;;;UPDATE TU58 LOGICAL BLOCK NUMBER . ADD #40,@#KISAR6 ;;;POINT AT NEXT 1K WORDS OF ;;;PHYSICAL MEMORY$ JMP 15$ ;;;REPEAT 1K WORD TRANSFER.CKSM: ADD R5,R4 ;;;ADD 2ND WORD TO FIRST WITH) ADC R4 ;;;END AROUND TREATMENT OF C-BITA*XWAIT: TSTB 4(R0) ;;;DL11 TRANSMIT READY? BPL XWAIT ;;;IF PL NOP RETURN ;;;A&DEND: CMP (SP)+,(SP)+ ;;;RESTORE STACK .ENDC .IIF EQ, C$$CDA-12 CDA$MS=08 .IF DF CDA$MS!MS$$CD ;LOADABLE OR RESIDENT CRASH DRIVER; ; MS;R;; IF THE EXECUTIVE DOES NOT SUPPORT 22-BIT ADDRESSING, THISD:; ROUTINE DUMPS ALL OF PHYSICAL MEMORY (UP TO A MAXIMUM OF-; 124K WORDS) IN 512 BYTE BLOCKS AT 1600 BPI.;M;; IF THE EXECUTIVE SUPPORTS 22-BIT ADDRESSING, THIS ROUTINER>; 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 TS11.PBNL== 0 ;;; .ENDC ; EQ C$$CDA;F&; **** IMPORTANT - PLEASE NOTE ****;SB; WITH LOADABLE CRASH DUMP SUPPORT, PBNL AND PBNH ARE DEFINED WITH<; GLOBAL DEFINITIONS IN THE BUILD FILE FOR EACH DRIVER. ANYB; MODIFICATIONS MADE HERE TO PBNL OR PBNH MUST BE ALSO MADE IN THE; CORRESPONDING BUILD FILE.O;  .IF DF, L$$CDA  ADD #12,MSCR10 MOV MSCR1,R5 ;;; ADDRESS OF COMMAND PACKET MUST .IFF ; DF L$$CDA ; GL003 7 MOV #<$MSCR1+12>,R5 ;;; ADDRESS OF COMMAND PACKET MUSTF .ENDC ; DF L$$CDA ; GL003+ BIC #3,R5 ;;;BE ON A DOUBLE WORD BOUNDARYP3 MOV #8.,-(R5) ;;;LENGTH OF COMMAND PACKET IN BYTESO- CLR -(R5) ;;;UPPER 2 BITS OF COMMAND PACKETF ;;;ADDRESS .IF DF, L$$CDA & MOV MSCR2,-(R5) ;;; LOW ORDER 16 BITS .IFF ; DF L$$CDA ( MOV #$MSCR2,-(R5) ;;; LOW ORDER 16 BITS .ENDC ; DF L$$CDA5 MOV #100004,-(R5) ;;;WANT TO "WRITE CHARACTERISTICS"C. MOV R5,R4 ;;;COPY POINTER TO COMMAND PACKET.% ;;;IF R4.EQ.R5, MS: BEING SET UP. . MOV R0,R1 ;;;FORM POINTER TO STATUS REGISTER TST -(R1) ;;; 1 CALL 200$ ;;;ISSUE COMMAND, WAIT FOR SUBSYSTEM,;# ;;;READY, AND HANDLE ANY ERRORSC2 MOV #142010,(R5) ;;;REWIND AND CLEAR VOLUME CHECK% CALL 200$ ;;;ISSUE COMMAND AND WAITC# MOV #100005,(R5)+ ;;;WANT TO WRITEF4 MOV #20000,(R5) ;;;ASSUME DATA TRANSFER VIA UMR #1. .IF DF, L$$CDA ; GL003 BIT #HF.UBM,@HFMSK ;;;UMPs ?W .IFF ; DF L$$CDA ; GL003R BIT #HF.UBM,@#$HFMSK ;;;UMPs ?C .ENDC ; DF L$$CDA ; GL003* BNE 10$ ;;;IF NE, YES. DT TRFR - UMR #1./ CLR (R5) ;;;Q BUS - NO UMR'S; START FROM @ 0.;*10$: TST (R5)+ ;;;R5 > CMD PKT, 3RD WORD.! CLR (R5)+ ;;;CLR HI ORD @ BITS.V. MOV #512.,(R5) ;;;512 BYTE PER DATA TRANSFER.% CLR @#UBMPR+4 ;;;INITIALIZE UMR #1 -. CLR @#UBMPR+6 ;;; USED TO MAP DATA TRANSFERS.7 BIS #60,@#SR3 ;;;ENABLE 22 BIT MAPPING AND UNIBUS MAP.$/ MOV #<2044./4>,R3 ;;;R3 - MAX # OF 4KW BLOCKS.;40$: MOV #<4*4>,R2 ;;;R2 - #512 BYTE RECORDS/4KW MEM BLOCK.C!50$: MOV #9.,R5 ;;;RETRY COUNT+1B# CALL 200$ ;;;ISSUE WRITE AND WAIT#. ADD #512.,2(R4) ;;;BUMP START ADDRESS OF DATA ADC 4(R4) ;;;5- SOB R2,50$ ;;;LOOP UNTIL REACH RECORD LIMITC ;;; (OR UNTIL ERROR IN 200$)7 ADD #<1024.*4*2>,@#UBMPR+4 ;;;BUMP ADDRESS OF UMR 1 BYA ADC @#UBMPR+6 ;;;4K WORDS; .IF DF, L$$CDA ; GL003, BIT #HF.UBM,@HFMSK ;;;USING UMR'S? ; GL003 .IFF ; DF L$$CDA ; GL0033% BIT #HF.UBM,@#$HFMSK ;;;USING UMR'S?# .ENDC ; DF L$$CDA ; GL003 BEQ 60$ ;;;IF EQ, NO.M) MOV #20000,2(R4) ;;;DT TRF PER UMR #1 @.;'60$: DEC R3 ;;;WROTE MAX # 4KW BLOCKS?; BNE 40$ ;;;IF NE, NO.A;AA; NOTE THAT THE FOLLOWING BRANCH IS NEVER TAKEN IF 180$ IS FALLEN @; 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);D,180$: CMP R4,R5 ;;; MS: DEVICE BEING SETUP?# BEQ 280$ ;;;IF EQ YES, ERROR EXITD1 MOV #100011,(R4) ;;;WANT TO FORMAT (WRITE A T00"Ât__DATADATADATADATAAPE# ;;;MARK) MOV R4,(R1) ;;;ISSUE COMMAND$190$: TSTB (R0) ;;;SUBSYSTEM READY? BPL 190$ ;;;IF PL NO' JMP $CRSHT ;;; SUCCESSFUL TERMINATIONE(200$: MOV R3,-(SP) ;;;SAVE BLOCK COUNTER#210$: MOV R4,(R1) ;;;ISSUE COMMAND0$225$: TSTB (R0) ;;;SUBSYSTEM READY? BPL 225$ ;;;IF PL NO MOV (R0),R3 ;;;GET STATUSA BMI 250$ ;;;IF MI ERRORC& MOV (SP)+,R3 ;;;RESTORE BLOCK COUNTER/ BIC #1000,(R4) ;;;MAKE SURE "WRITE DATA RETRY"E ;;;BIT IS CLEARM RETURN ;;;  .IF DF, L$$CDA ; GL003250$: ADD #6,MSCR3 ; GL003, BIT #1,@MSCR3 ;;;END OF TAPE SEEN? ; GL003 .IFF ; DF L$$CDA ; GL003 ,250$: BIT #1,@#$MSCR3+6 ;;;END OF TAPE SEEN? .ENDC ; DF L$$CDA ; GL003 BNE 180$ ;;;IF NE YES1$ BIT #4000,R3 ;;;NONEXISTENT MEMORY? BNE 180$ ;;;IF NE YESL+ BIC #^C<16>,R3 ;;;ISOLATE TERMINATION CODEU+ CMP #12,R3 ;;;RECOVERABLE ERROR (TAPE HAS  ;;;NOT MOVED)? BEQ 270$ ;;;IF EQ YESM+ CMP #10,R3 ;;;RECOVERABLE ERROR (TAPE HASL ;;;MOVED ONE RECORD)?! BNE 280$ ;;;IF NE NO, I/O ERRORD4 BIS #1000,(R4) ;;;CHANGE COMMAND TO "SPACE REVERSE, ;;;ERASE, WRITE DATA"$'270$: DEC R5 ;;;EXHAUSTED RETRY COUNT?; BNE 210$ ;;;IF NE NO*280$: TST (SP)+ ;;;DISCARD RETURN ADDRESS .ENDC ; DF CDA$MS!MS$$CDX8 .IIF EQ C$$CDA-13 .ERROR C$$CDA ;DX CRASH NOT SUPPORTED8 .IIF EQ C$$CDA-14 .ERROR C$$CDA ;DY CRASH NOT SUPPORTED8 .IIF EQ C$$CDA-15 .ERROR C$$CDA ;MF CRASH NOT SUPPORTED .IIF EQ C$$CDA-21 CDA$NT=0  .IF DF CDA$NT!NT$$CDD;R; NT - NETWORK DUMP;;NE; THIS ROUTINE DUMPS ALL OF MEMORY OVER THE NETWORK TO A WILLING HOST; # .IF NE C$$CDA ; IF RESIDENT CRASHE'PBNH== 0 ;;;STARTING BLOCK NUMBER ... PBNL== 1 ;;;... .ENDC ; EQ C$$CDA& JMP $PANIC ;;; JUMP TO NETPAN MODULE .ENDC ; CDA$NT!NT$$CD .IIF EQ C$$CDA-16 CDA$DU=0 .IF DF CDA$DU!H$$GEN!DU$$CD;A; DU;O>; THIS ROUTINE DUMPS ALL OF MEMORY ONTO A REMOVABLE MEDIA MSCP?; TYPE DEVICE. CURRENTLY THE VALID DEVICES ARE RA60, RC25, AND ; RX50.T;K" .IF NE C$$CDA ;IF RESIDENT CRASH'PBNH== 0 ;;;STARTING BLOCK NUMBER ... PBNL== 1 ;;;...A .ENDC ; EQ C$$CDA;B&; **** IMPORTANT - PLEASE NOTE ****;LB; WITH LOADABLE CRASH DUMP SUPPORT, PBNL AND PBNH ARE DEFINED WITH<; GLOBAL DEFINITIONS IN THE BUILD FILE FOR EACH DRIVER. ANYB; MODIFICATIONS MADE HERE TO PBNL OR PBNH MUST BE ALSO MADE IN THE; CORRESPONDING BUILD FILE.O; ,MSCPDV: CALL CKSUM ;;;CHECKSUM DISK ADDRESS; ; AT THIS TIME: ;0; R0=CSR ADDRESS; R3=UNIT NUMBER#; CONTROLLER IS IN AN UNKNOWN STATEB;= .IF EQ,C$$CDA ; LOADABLE CRASH% CLR RELOC ;;;CLEAR RELOCATION WORDS CLR RELOC+2 .ENDC ; EQ C$$CDA5 MOV #$DUCSH,R2 ;;;GET ADDRESS OF INTIALIZATION TABLED. MOV (R2)+,R4 ;;;GET ADDRESS OF COMMAND PACKET/ MOV (R2)+,R5 ;;;GET ADDRESS OF RESPONSE PACKETI: MOVB R3,P.UNIT(R4) ;;;STORE UNIT NUMBER IN COMMAND PACKET* CLR R3 ;;;ASSUME EXTENDED MEMORY SUPPORT! MOV #4000,R1 ;;;SETUP FOR STEP 1* MOV R1,(R0)+ ;;;INITIALIZE PORT INTERFACE(10$: TST (R0) ;;;ANY CONTROLLER ERRORS? BPL 12$ ;;;IF PL NOF JMP WERR ;;;ERROR ROUTINE112$: BIT R1,(R0) ;;;IS CONTROLLER AT RIGHT STEP?C BEQ 10$ ;;;IF EQ NO, WAITM' CMP #4000,R1 ;;;DID WE JUST DO STEP 1?T BNE 15$ ;;;IF NE NOR .IF EQ,C$$CDA ; LOADABLE CRASH;(; FIGURE RELOCATION WORD:EC; - IF 22 BIT ADDRESSING, THEN THE RELOCATION BIAS WILL BE ADDED TOA8; THE VIRTUAL ADDRESS TO GIVE A 22 BIT PHYSICAL ADDRESSE; - IF NOT, THE RELOCATION BIAS WILL BE USED AS THE UMR VALUE AND THE.; PHYSICAL ADDRESS WILL BE MAPPED USING UMR 5; , MOV @KISA5,RELOC ;;;ADDRESS OF CODE ; GL003 .REPT 6 ASL RELOC ;;;CHANGE TO 22 BITP ROL RELOC+2 .ENDR CLR 4(R2) ;;;CLEAR HIGH WORD% MOV #RINGS,2(R2) ;;;ADDRESS OF RINGSN6 BIT #1000,(R0) ;;;CONTROLLER SUPPORT EXTENDED MEMORY?$ BEQ 13$ ;;; EQ, NO - MUST USE UMRS- SUB #120000,RELOC ;;;SUBTRACT VIRTUAL 120000A/ SBC RELOC+2 ;;;TO MAKE ADDR RELOCATION EASIERL. ADD RELOC,2(R2) ;;;ADD RELOCATION (LOW WORD) ADC 4(R2) ;;;ADD THE CARRY0 ADD RELOC+2,400*1ibjbkb a a a(R2) ;;;ADD RELOCATION (HIGH WORD)( BR 15$ ;;;BRANCH AROUND UMR SETUP CODE213$: 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 CRASH6 BIT #1000,(R0) ;;;CONTROLLER SUPPORT EXTENDED MEMORY? BNE 15$ ;;;IF EQ YES COM R3 ;;;NO, SET UMR FLAG .ENDC ; NE C$$CDA315$: MOV (R2)+,(R0) ;;;SEND STEP WORD TO CONTROLLER; ASL R1 ;;;MOVE STEP BIT) BPL 10$ ;;;IF PL KEEP STEPINGA- MOV (R2)+,R2 ;;;GET ADDRESS OF RESPONSE RING .IF EQ, C$$CDA ; LOADABLE CRASH# TST R3 ;;;EXTENDED MEMORY SUPPORTP$ BNE 17$ ;;;NE, NO - MUST USE UMR'S$ MOV R5,(R2) ;;;RESET RESPONSE RING- ADD RELOC,(R2)+ ;;;ADD RELOCATION (LOW WORD)E+ MOV RELOC+2,(R2) ;;;RELOCATION (HIGH WORD)  ADC (R2)+ ;;;ADD THE CARRY# MOV R4,(R2) ;;;RESET COMMAND RINGE- ADD RELOC,(R2)+ ;;;ADD RELOCATION (LOW WORD)2+ MOV RELOC+2,(R2) ;;;RELOCATION (HIGH WORD)L ADC (R2) ;;;ADD THE CARRY1% CMP -(R2),-(R2) ;;;DECREMENT 2 WORDSR BR 18$ ;;;BRANCH AROUND RESETS .ENDC ; EQ C$$CDA(17$: MOV R5,(R2)+ ;;;RESET RESPONSE RING# MOV R4,2(R2) ;;;RESET COMMAND RINGT018$: CALL RSET ;;;RESET OWNERSHIP WORDS IN RING;D; CONTROLLER IS NOW INITIALIZEDO&; NEXT, PUT CONTROLLER AND UNIT ONLINE;H; R0=CSR ADDRESS +2+; R1=100000 ("OWN")M,; R2=ADDRESS OF SECOND WORD OF RESPONSE RING; R3=EXTENDED MEMORY FLAGO; R4=COMMAND PACKET ADDRESS;; R5=RESPONSE PACKET ADDRESS;26 MOVB #OP.ONL,P.OPCD(R4) ;;;LOAD ONLINE FUNCTION CODE' CLR P.BCNT(R4) ;;;NO WORD COUNT NEEDED# CALL IO ;;;DO THE ONLINE FUNCTION): MOVB #OP.GUS,P.OPCD(R4) ;;;LOAD GET UNIT STATUS FUNCTION CALL IO ;;;DO THE GET STATUS< BIT #UF.RMV,P.UNFL(R5) ;;;IS THIS A REMOVEABLE MEDIA UNIT? BNE 20$ ;;;IF NE YES# .IF DF, L$$CDA ;;; LOADABLE CRASH MOV CRMS6,R1 ;;; ILLEGAL DEVICE .IFF ; DF L$$CDAO! MOV #$CRMS6,R1 ;;;ILLEGAL DEVICE .ENDC ; DF L$$CDA) BR WERR1 ;;;PRINT MESSAGE AND TRY AGAINV=20$: MOVB #OP.WR,P.OPCD(R4) ;;;LOAD WRITE DATA FUNCTION CODE(2 MOV #<512.*4*4>,P.BCNT(R4) ;;;BYTE COUNT FOR 4KW$ .IF DF, L$$CDA ;;; LOADABLE CRASH* MOV @CRSB2,P.LBN(R4) ;;; SET STARTING LBN MOV @CRSBN,P.LBN+2(R4) ;;; ...V .IFF ; DF L$$CDAI. MOV @#$CRSBN+2,P.LBN(R4) ;;; SET STARTING LBN! MOV @#$CRSBN,P.LBN+2(R4) ;;; ...R .ENDC ; DF L$$CDA& CLR P.BUFF(R4) ;;;START AT PHYSICAL 0 CLR P.BUFF+2(R4) ;;;.... CLR R1 ;;;Init counter for every 4KW written( BIS #60,@#SR3 ;;;ENABLE 22-BIT AND UMRS* TST R3 ;;;EXTENDED ADDRESSING SUPPORTED? BEQ 30$ ;;;IF EQ YES CLR @#UBMPR+4 ;;;NO, USE UMRS CLR @#UBMPR+6 ;;;... 8 MOV #20000,P.BUFF(R4) ;;;SET BUFFER ADDRESS THRU UMR 1;G7; ALL INITIAL VALUES ARE SETUP. NOW TRANSFER THE DATA.D;"30$: CALL IO ;;;WRITE 4KW TO DISK) INC R1 ;;; # of 4KW count <== count + 1 8 CMP #511.,R1 ;;; Wrote MAX memory (511.*4KW = 2044KW) ?$ BEQ $CRSHT ;;; If EQ, yes all done1 ADD #<4*4>,P.LBN(R4);;;MOVE TO NEXT STARTING LBNS ADC P.LBN+2(R4) ;;;...I& TST R3 ;;;EXTENDED MEMORY SUPPORTED? BEQ 40$ ;;;IF EQ YES0 ADD P.BCNT(R4),@#UBMPR+4 ;;;UPDATE UMR ADDRESS ADC @#UBMPR+6 ;;;...M BR 30$ ;;;KEEP WRITING840$: ADD P.BCNT(R4),P.BUFF(R4) ;;;UPDATE BUFFER ADDRESS ADC P.BUFF+2(R4) ;;;... BR 30$ ;;;;C=; DO THE I/O AND CHECK FOR ERRORS. THE ONLY VALID ERRORS AREo*; NON-EXISTANT MEMORY AND INVALID COMMAND.;1 .ENABL LSBK4IO: TST -2(R0) ;;;FORCE CONTROLLER TO LOOK AT RINGS*10$: TST (R0) ;;;CONTROLLER STILL ONLINE? BMI 20$ ;;;IF MI, NO.T. TST (R2) ;;;CONTROLLER SEND BACK A RESPONSE?1 BMI 10$ ;;;IF MI NO, IT STILL "OWNS" THE PACKETU TST P.STS(R5) ;;;ANY ERRORS?. BNE 20$ ;;;IF NE YES1RSET: BIS #100000,(R2) ;;;SET OWN FLAG INTO RINGSF BIS #100000,4(R2) ;;;...4 RETURN ;;;0 20$: TST (SP)+ ;;;CLEANUP STACK/ CMP #ST.NXM,P.STS(R5) ;;;NON-EXISTANT MEMORY?X# BEQ $CRSHT ;;;IF EQ YES, ALL DONE14 CMPB #ST.CMD,P.STS(R5) ;;;DID WE OVERRUN THE DISK?# BEQ $CRSHT ;;;IF EQ YES, ALL DONET! ;;;NO, FATAL ERROR, FALL THRUI .DSABL LSBT .ENDC ; DF CDA$DU!H$$GEN!DU$$CD .002Ât__DATADATADATADATAPAGE .IIF EQ, C$$CDA-17 CDA$MU=08 .IF DF CDA$MU!MU$$CD ;LOADABLE OR RESIDENT CRASH DRIVER; ; MU;SF; IF 22-BIT ADDRESSING IS NOT SUPPORTED, THEN THIS ROUTINE DUMPS ALLB; OF PHYSICAL MEMORY (TO A MAX OF 124K WORDS) IN 512 BYTE BLOCKS.;M>; IF 22-BIT ADDRESSING IS SUPPORTED, THEN THIS ROUTINE DUMPS-; ALL OF PHYSICAL MEMORY IN 512 BYTE BLOCKS.O;R" .IF NE C$$CDA ;IF RESIDENT CRASH1PBNH== 0 ;;;BLOCK NUMBER IGNORED FOR MU: DEVICESPBNL== 0 ;;; .ENDC ; NE C$$CDA; RESTRICTION:;I?; WITH LOADABLE CRASH DUMP SUPPORT, PBNL .AND. PBNH ARE DEFINEDS=; WITH GLOBAL DEFINITIONS IN THE BUILD FILE FOR EACH DRIVER.O;U?; ANY MODIFICATIONS MADE HERE TO PBNL OR PBNH MUST BE ALSO MADE #; IN THE CORRESPONDING BUILD FILE.K;7; R0 - CSR, R3 = UNIT NUMBER, CNTRL IN AN UNKNOWN STATEE .IF EQ C$$CDA ; LOADABLE CRASH& CLR RELOC ;;; Clear relocation words CLR RELOC+2 .ENDC ; EQ C$$CDA1 MOV #$MUCSH,R2 ;;; R2 > MU: Initialization table;% MOV (R2)+,R4 ;;; R4 > Command packet:& MOV (R2)+,R5 ;;; R5 > Response packet6 MOVB R3,P.UNIT(R4) ;;; Command packet <-- Unit number' CLR R3 ;;; R3 - IF EQ, THEN 22 bit @.U( MOV #4000,R1 ;;; R1 - setup for Step 1./ MOV R1,(R0)+ ;;; Initialize the MU: controller %10$: TST (R0) ;;; Controller errors?I BPL 12$ ;;; IF PL, No.& JMP WERR ;;; Else - indicate error.112$: BIT R1,(R0) ;;; Controller at correct step?R& 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:(; >; If 22 bit @, THEN the relocation bias will be added to the(; virtual @ to give a 22 bit physical @.;rB; If not, THEN the relocation bias will be used as the UMR value0; and the physical @ will be mapped using UMR 5./ MOV @KISA5,RELOC ;;; > MU: crash code. ; GL0032 .REPT 6 ASL RELOC ;;; Convert to ROL RELOC+2 ;;; 22 bit @., .ENDR# CLR 4(R2) ;;; Clear high (@) wordl) MOV #RINGS,2(R2) ;;; and setup Rings @.A4 BIT #1000,(R0) ;;; MU: controller in 22 bit @ mode?# BEQ 13$ ;;; IF EQ, NO - use UMRS.E; Setup 22 bit RING @.& SUB #120000,RELOC ;;; Subtract APR #5' SBC RELOC+2 ;;; virtual @ (120000).N( 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.L; 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 CRASH4 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.& BPL 10$ ;;; IF PL, more Init phases.% MOV (R2)+,R2 ;;; R2 > Response ring.V .PAGE .IF EQ C$$CDA ; LOADABLE CRASH TST R3 ;;; 22 bit @ mode?.# BNE 17$ ;;; IF NE, No - use UMRs.g; 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) ;;; Command5 ADC (R2) ;;; ring.t CMP -(R2),-(R2) ;;; R2 > RSP+2A BR 18$ ;;; and cont.x .ENDC ; EQ C$$CDA ; Use UMRs017$: 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.m9; Controller initialized - put controller and unit onlineM;R!; R0 > Device SA register (CSR+2)2; R1 = 100000 ("OWN" mask) ; R2 > RSP+2); R3 IF EQ - 22 BIT @, ELSE NE - UMRs.(+; R4 > Command packet R5 > Response packet;P"; Clear the command packet fields.) MOV R4,R1 ;;; R1 > Command packet area.s5 MOV -4(R4),-(SP) ;;; Stack has size of CMD PKT area..(117$: CLR (R1)+ ;;; Clear CMD PKT area.- SUB #2,(SP) ;;; At the end of CMD PKT area?.) BNE 117$ ;;; IF NE, No - keep clearing.t#00:1ibjbkb a a a TST (SP)+ ;;; Maintain the stack.c#; Setup controller characteristics.>= MOVB #OP.SCC,P.OPCD(R4) ;;; Setup CONTROLLER characteristics>3 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.( CALL IO ;;; Issue request.;Rewind the unit2 MOVB #OP.REP,P.OPCD(R4) ;;; Setup to Reposition -0 MOV #MD.CSE!MD.RWD,P.MOD(R4) ;;; Rewind to BOT. CALL IO ;;; Issue request.'; Write 512. byte memory areas to tape. ; MOVB #OP.WR,P.OPCD(R4) ;;; Setup WRITE DATA function code,;/ MOV #512.,P.BCNT(R4) ;;; 512. byte count andN3 MOV #MD.CSE,P.MOD(R4) ;;; no serious exceptions.; CLR (R4) ;;; CMD Ref <-- 0.c' CLR P.BUFF(R4) ;;; Assume 22 bit @ andS, CLR P.BUFF+2(R4) ;;; start at physical 0.1 BIS #60,@#SR3 ;;; Enable 22-bit @ mode and UMRS.t TST R3 ;;; 22 bit @ mode?; BEQ 20$ ;;; IF EQ, Yes.V& CLR @#UBMPR+4 ;;; Initialize UMR #1 -/ CLR @#UBMPR+6 ;;; used to map data transfers.b: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.4)30$: CALL IO ;;; Write 512. byte record. 3 CMP #<2044.*4>,(R4) ;;; Wrote max allowed memory ?t+ BEQ WTMK ;;; If EQ yes, write TMK, & donet% ADD #512.,P.BUFF(R4) ;;; > next 512. & ADC P.BUFF+2(R4) ;;; byte of memory.1 SOB R1,25$ ;;; Keep writing until 4KW boundary.6 TST R3 ;;; 22 bit @ mode?e BEQ 20$ ;;; IF EQ, Yes.F0 ADD #<1024.*4*2>,@#UBMPR+4 ;;; Increment UMR #1 ADC @#UBMPR+6 ;;; by 4KW.o) BR 19$ ;;; Write next 4KW memory block.RH; Start I/O and check for errors - only valid error is non-existing mem.'; All other errors are unrecoverable.R .ENABL LSBm4IO: MOV #60,-4(R5) ;;; Response packet - max lenght.4 TST -2(R0) ;;; Start I/O - Controller polls rings.)10$: TST (R0) ;;; Controller yet ONLINE?B BPL 15$ ;;; IF PL, OK.& TST (SP)+ ;;; Else - maintain stack,( MOV #SAMSG,R1 ;;; R1 > SA error message BR WERR1 ;;; and issue it./15$: TST (R2) ;;; Controller yet own RSP ring?9 BMI 10$ ;;; IF MI, Yes.y MOV P.STS(R5),-(SP) ;;; Isolate BIC #^C<37>,(SP) ;;; end code. TST (SP)+ ;;; Success?0 BNE 20$ ;;; IF NE, No -error, can't handle it.,RSET: BIS #100000,(R2) ;;; Controller 'OWNS'# BIS #100000,4(R2) ;;; the rings.r RETURNl#20$: TST (SP)+ ;;; Maintain stack. / CMP #ST.NXM,P.STS(R5) ;;; Non-existing memory?+. BEQ WTMK ;;; IF EQ, Yes - write TMK and end.. CMP #ST.HST,P.STS(R5) ;;; Max allowed memory?. BEQ WTMK ;;; IF EQ, Yes - write TMK and end.5 MOV #PSTMSG,R1 ;;; Else - R1 > P.STS error message.-/; Write a TMK and complete Crash to MU: device.8WTMK: CMPB #OP.WTM,P.OPCD(R4) ;;; Already tried to WTMK?, BEQ WERR1 ;;; IF EQ, Yes - then end crash., MOVB #OP.WTM,P.OPCD(R4) ;;; Write a TMK and3 MOV #MD.CSE,P.MOD(R4) ;;; no serious exceptions.s* CALL RSET ;;; Controller owns the rings. CALL IO ;;; Issue request.& CMP #PSTMSG,R1 ;;; Had a P.STS error?, BEQ WERR1 ;;; IF EQ, Yes - then end crash. BR $CRSHT ;;; All done. .DSABL LSBM .ENDC ; DF CDA$MU!MU$$CD> .PAGE .IFT ; DF L$$CDA!R$CRSH;+E; WHEN AN ERROR IS DETECTED BY A CRASH ROUTINE, CONTROL IS TRANSFERED E; HERE EITHER BY A JUMP, BR, OR BY SIMPLY FALLING THRU TO THIS SIMPLE.; ERROR HANDLER.;- .IF DF, L$$CDAD)WERR: MOV CRMS3,R1 ;;; INDICATE I/O ERROR .IFF ; DF L$$CDAo*WERR: MOV #$CRMS3,R1 ;;;INDICATE I/O ERROR .ENDC ; DF L$$CDA%WERR1: CALL TYPE ;;;TYPE OUT MESSAGEF JMP AGAIN ;;;WAIT FOR THE USER;+E; AFTER THE DUMP HAS SUCCESSFULLY COMPLETED, THE CRASH ROUTINE SHOULDE; BRANCH TO HERE SO THAT THE PROCESSOR MAY BE HALTED AND ANOTHER DUMPH ; BE TAKEN.T;-$CRSHT: HALT ;;;WAIT FOR USERJ .IF DF L$$CDA JMP @CRALTU .IFF ;DF L$$CDA JMP @#$CRALT- .ENDC ;DF L$$CDAD .PAGE* .IF DF DU$$CD!MU$$CD ; DU/MU CRASH DRIVER#; CRASH DATA BASE FOR DU/MU DEVICES;I; RESTRICTION - any changes 00BEt__DATADATADATADATAto this table must ALSO BE MADE IN LOWCR.MAC.S8; For Resident crash - this is in exec CRASH module area8; and for loadable CRASH, it's in the DU/MU crash area.; COMMAND AND RESPONSE PACKETS .WORD 60 ; Packet length - 48.3 .WORD 1 ; Virtual circuit and credit/debit field.J'CMDPKT: .WORD 1 ; Command packet area. .REPT 23. .WORD 0 ; initially - 0s. .ENDR .BLKW 2 ; Envelope.D*RSPPKT: .BLKW 24. ; Response packet area.; COMMAND RINGSI .BLKW 2RINGS:+RSP: .WORD RSPPKT ; Response packet ring -E/ .WORD 100000 ; Packet "owned" by controller.i*CMD: .WORD CMDPKT ; Command packet ring -/ .WORD 100000 ; Packet "owned" by controller.; INITIALIZATION TABLE$DUCSH::%$MUCSH::.WORD CMDPKT ; > CMD packet.  .WORD RSPPKT ; > RSP packet.7 .WORD 100000 ; STEP 1 - lenght of rings,IE,Int vec/4.E .WORD RINGS ; 2 - lo ord0, .WORD 0 ; 3 - and hi ord @ of Rings. .WORD 1 ; 4.  .WORD RSP ; > Response ringI#RELOC: .WORD 0,0 ;RELOCATION WORDS; .ENDC ; DF DU$$CD!MU$$CD.' .IF DF CDA$MU!MU$$CD ; MU CRASH DRIVERrP.NDCD = P.OPCDK .NLIST BEXc;SAMSG: .ASCIZ <15><12><12>!CRASH -- I/O [SA] DEVICE ERROR;!?PSTMSG: .ASCIZ <15><12><12>!CRASH -- I/O (P.STS) DEVICE ERROR;! .LIST BEX .ENDC ; DF CDA$MU!MU$$CDe .PAGE .IF DF H$$GEN, .IIF EQ C$$CDA-7, PBNL==2 ;DEFAULT TO RL11 .ENDC .ENDC ; DF L$$CDA!R$CRSH  .ENDC ; EQ C$$CDA-20 .ENDC ;C$$CDA .ENDD RSP ; > Response ringI#RELOC: .WORD 0,0 ;RELOCATION WORD" .TITLE DCCTL - Control Operations .IDENT /05.00/e .IF DF D$$CHE;2; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reserved.; ; Original author:; John Gemignani;-; Modified by:; ; J. Kauffman 29-Mar-88 03.01;N'; Re-mastered for RSX-11M-PLUS V4.4 by:;V; L.B.McCulley 29-Dec-91 4.00o; D. Carroll 19-Jul-92 4.00e ; D. Carroll 05-August-1992 4.01; L. B. McCulley 8-Aug-92 4.01au; D. Carroll 30-Oct-1992 4.03 ;r$; Modified for RSX-11M-PLUS V4.5 by:;d; D. Carroll 07-June-1993 4.043; DC221 - Correct implicit deactivation path if noC; fork is ever required.;c$; Modified for RSX-11M-PLUS V4.6 by:; ; D. Carroll 08-Jan-1996 05.00*; DC430 - Include support for 32-bit LBNs;9;rH; This module contains the code to perform the cache operations required"; QIOs with IO.STC function codes.;- .MCALL PCBDF$ PCBDF$- .PSECT DC$CTL, RO, I  u8 .SBTTL DCCTL1 - Control operations phase 1 - dispatcher;+C; IO.STC function code QIOs are used to communicate with the cacher;D(; There are two types of interest to us:H; (a third, I.PRM+2 equal VV$SIZ (only negative value expected for I.PRMK; goes immediately to the driver with no processing or implication in cache ;s; I.PRM+2 = VV$CHE<; this explicitly identifies control functions intended for<; the data cache code. I.PRM+4 is a specific function code;; These are sent by the MCR SET /CACHE commands (in ST5OV)o>; and by the block deallocation routines in F11ACP (in SMDEL); /; I.PRM+2 not equal VV$SIZ and not equal VV$CHE <; this is an implicit termination of caching for the device;Z;nH; (there is no implementation of automatic activation of cache on mountsI; although vestigial code for this is present and commented out prior toxM; M-PLUS V4.4. this code is untested and should be regarded as very suspectP;4; ; Passed:f; UCBX mapped in APR6a;; X.CSTS := Unit's cache status (i.e. selected operations) ; ; R1 -> I/O packet; I.PRM+2 := Operation code ; R5 -> UCB ; ; Returned:a; All registers preservedi;s-; Otherwise N/A - control is passed to $DRQRQi; ; Action:t;e; Notes::; QIOs which are NOT transfer functions do not have I.PRMs7; adjusted for the address doublewords. Therefore, allo;; parameters will be in the same cells within I.PRM as theylB; are issued (hence the Px definitions in DCPRE should not be used;-6DCCTL1::TST I.PRM+2(R1) ; Is this a "size" operation?* BMI 90$ ; If MI, yes, forward to driver7 CMP #VV$CHE, I.PRM+2(R100J1ibjbkb a a a) ; A cache directed operation?e$ BEQ CHEFUN ; If EQ, yes, go do it8 BITB #XC.ACT, APR6.BASE+X.CSTS ; Is this device caching* BEQ 90$ ; If EQ, no, send to driver now;+H; This block of code is entered by IO.STC functions with I.PRM not equalI; to either VV$SIZ or VV$CHE. It implements the implicit deactivation of(I; cache for all other disk device IO.STC functions except for port-specic+H; set functions (because they could be HRC bringing the second port of aJ; dual-ported unit online and should not deactivate cache if it is already; active on the first port).;-. .IF DF M$$ACD ; multi-access device support6 CMP I.PRM+2(R1),#VV$SET ; is this a set VV operation?) BNE 70$ ; if NE, nope deactivate cachec- TST I.PRM+4(R1) ; is this port relative I/O & BLE 70$ ; nope, continue processing; BIT #S2.MAD,S.ST2(R4) ; this better be a multi-port devices/ BNE 90$ ; if NE, yes, don't deactivate cachee .ENDC ;DF M$$ACDi;+G; The implicit deactivation of cache is deemed to indicate a transitiontL; of VV$SET or VV$CLR, either of which should imply that file volume contentL; is not meaningful. Thus all extents are flushed without regard to whetherM; they are deferred temporary file extents that have not been written to disktL; The implication of a transition in volume valid is that temp files are not; valid either. ;-@70$: BITB #X2.DEA,APR6.BASE+X.CST2 ; is cache being deactivated?( BEQ DACJMP ; no, go ahead and process1 CALLR Q2DRVR ; yes, this one waits for rundowna%90$: SEC ; else no, give to drivere RETURNw1 .SBTTL DCCTL2 - Cache Control Phase 2 processinga;+H; DCCTL2 - Phase 2 processing for control functions simply restarts themD; because they were queued to some busy extent until it went unbusy.; ; Input: ; R1 - URPo; R5 - UCB addresst ; UCBX mappeda;-:DCCTL2::CMP #VV$CHE,I.PRM+2(R1) ; explicit cache function?( BEQ SUBFUN ; yes, dispatch it (again)8DACJMP: JMP CHEDAC ; no, must be implicit deactivation a5 .SBTTL + CHEFUN - Cache Function (VV$CHE) processinge;+/; **-CHEFUN- Cache Function (VV$CHE) processinge;p ; Passed:; R1 -> I/O packet; I.TCB -> TCB of issuing taskn-; T.ST3 := T3.PRV indicates privileged tasku;t ; Returned:x%;;; N/A - control is passed to $IOFINu; ; Action:o; B; This code validates the cache function as issued by a privilegedB; user, and initializes the word at I.PRM as zero for the count ofC; bytes returned by the function. Function processing routines setaC; the count as needed, and deactivation uses this word as a flag toE; show Phase II invocation.p;e2CHEFUN: CLR I.PRM(R1) ; Clear byte count returned+ MOV I.TCB(R1), R0 ; Get the TCB of issueri BNE 10$ ; If EQ, got it FATAL$ BE.UCB410$: BIT #T3.PRV, T.ST3(R0) ; Is the task privileged, BNE SUBFUN ; NE, ok, dispatch subfunction ; If EQ, no, error!8FUNPRI: MOV #,R0 ; Set "privilege violation"+ BR FUNEXT ; Proceed to common exit pointo3FUNBAD: MOV #,R0 ; Set "bad parameters"d+ BR FUNEXT ; Proceed to common exit pointh;+; SUBFUN routines common exit ; >; Common local I/O completion occurs here. Offset I.PRM+P6.1?; will contain the primary status, and I.PRM+P6.2 will containE(; the secondary status (or byte count).;-3FUNSUC: MOV #IS.SUC,R0 ; Return successful statusu1FUNEXT: MOV R1, R3 ; Establish context for IOCE+ MOV I.PRM(R3), R1 ; Set secondary status ' CALL $IOFIN ; Complete this request" CLR R1 ; Tell $DRQRQ we did it RETURNe d, .SBTTL SUBFUN - Cache-specific Subfunctions;+(; **-SUBFUN- Cache-specific Subfunctions;m ; Passed:/; R1 -> I/O packet; I.PRM+4 := Subfunction code;o ; Returned:m; ; Action: 5; This routine will process the various subfunctions:y;c%; 1. FUNENA - Enable cache processingR&; 2. FUNDIS - Disable cache processing'; 3. FUNACT - Activate cache processingV); 4. FUNDAC - Deactivate cache processing#; 5. FUNRCS - Read cache parameterss"; 6. FUNSCS - Set cache parameters%00REt__DATADATADATADATA; 7. FUNCSB - Clear statistics bufferc$; 8. FUNRSB - Read statistics bufferD; 9. FUNDEL - Delete blocks from cache (called from SMDEL in F11ACP);I;M; Notes:=; The first two words of the parameter list may be needed forwB; Phase 2 processing to identify the VV$CHE subfunction of IO.STC.?; They were previously used to return the status to the callingCD; routine (which handled the call to $IOFIN). This has been changedB; IS.SUC is now assumed to be the primary status, with routines toA; the error code to be returned in R0 if otherwise. I.PRM is noweE; secondary status (byte count). I.PRM is also used to flag Phase IIoB; for deactivation requests, so that multiple deactivations can beB; prevented (to avoid messy races). I.PRM is initially cleared inC; CHEFUN which validates the function code before calling SUBFUN torC; dispatch the function. Phase II enters DCCTL2 which calls SUBFUNOE; directly, avoiding the initialization of I.PRM to preserve the flag B; status across Phase II dispatch. It is not possible to allocate4; a CRP because a cache partition cannot be assumed.;-<SUBFUN: MOV I.PRM+4(R1), R0 ; Get the subfunction code (P3) DEC R0 ; normalize indexi4 BLE FUNBAD ; not a valid code if zero or negative' CMP R0, #DC$MAX ; within valid range?i BGT FUNBAD ; no, erroro5 CMP R0, #DC$CSB-1 ; is cache required to be active?h% BLO 10$ ; if LO, nope, do the workO2 BITB #XC.ACT, APR6.BASE+X.CSTS ; is cache active?0 BEQ FUNPRI ; nope, return privilege violation4 BITB #X2.DEA, APR6.BASE+X.CST2 ; being deactivated?, BNE FUNPRI ; if NE, return priv violation!10$: ASL R0 ; form a word indexu+ CALLR @20$(R0) ; and dispatch by functioni20$: FUNENA ; enable cachee FUNDIS ; disable cache FUNACT ; activate cachen FUNDAC ; deactivate cacheo FUNRCS ; read cache status FUNSET ; set cache options$ FUNCSB ; clear statistics buffer# FUNRSB ; read statistics bufferc FUNDEL ; delete extentsoDC$MAX= .-20$ / 2v i .SBTTL + DC$ENA - Enable CacheC; 8; This function is simple, since it does not require any8; form of validation. It is merely used to set a status; bit.;dFUNENA: 8; BISB #XC.ENA, APR6.BASE+X.CSTS ; Set autoactivation on BR FUNSUC$ .SBTTL + DC$DIS - Disable the cache; 8; This function is simple, since it does not require any:; form of validation. It is merely used to clear a status; bit.;N@FUNDIS: BICB #XC.ENA, APR6.BASE+X.CSTS ; Clear autoactivation on BR FUNSUC! .SBTTL + FUNACT - Activate cache ;h ; Passed:h; UCBX mapped in APR6s;e ; R5 -> UCBr;i ; Action:o;; This function will activate cache for a device which does9; not have caching currently activated for it. Note thatt<; this operation can be used to "bypass" the "autoactivation9; on mount" bit (XC.ENA=1). In other words, if the cachee:; is disabled for a device, FUNACT can turn caching on for9; the device regardless of the setting of XC.ENA. FUNACTC;; will not change the setting of XC.ENA either. Therefore,t:; a disk with autoactivation disabled will remain that way; independent of FUNACT.;-@FUNACT: BITB #X2.DEA, APR6.BASE+X.CST2 ; deactivation in process( BNE FUNPRI ; yes, punt w/ priv error" ; to avoid racing deactivate8 BITB #XC.ACT, APR6.BASE+X.CSTS ; Cache already activate) BNE FUNSUC ; If NE, yes - don't botherd2 CALL CHEACT ;Activate the cache for this device- BCC FUNSUC ;Return success if carry clear,A, BR FUNPRI ;Privilege violation if failure N# .SBTTL + FUNDAC - deactivate cache ;o ; Passed:d; UCBX mapped in APR6t; R1 -> packet ; R5 -> UCB.;- ; Action:ID; Errors will be returned if cache is not active, or if deactivationD; is already in progress (this is necessary to avoid races, multipleC; decrements of P.RMCT, etc.). The internal routine CHEDAC will be G; used for processing common to both implicit and explicit deactivation ;i;-8FUNDAC: BITB #XC.ACT, APR6.BASE+X.CSTS ; Cache activate?& BEQ FUNPRI ; no, return priv error) TST I00Z1ibjbkb a a a.PRM(R1) ; byte cnt flags Phase Ia# BNE 10$ ; Phase II, skip status-8 BITB #X2.DEA, APR6.BASE+X.CST2 ; deactivation in proces( BNE FUNPRI ; yes, punt w/ priv error.10$: INC I.PRM(R1) ; show Phase II next pass& CALLR CHEDAC ; finish deactivation .( .SBTTL + DC$RCS - Read cache parameters;l<; This function will return the current setting of the cache4; in the second status word of the I/O status block.;+>FUNRCS: MOVB APR6.BASE+X.CSTS, I.PRM(R1) ; Set the status bits BR FUNSUC' .SBTTL + DC$SET - Set cache parameters$; ; Passed: ; UCBX mapped in APR6X@; X.CSTS := XC.ACT indicates unit is active (in terms of cache)2; X.CPCB -> PCB of region unit is caching through; ; R1 -> I/O packet; I.PRM+6 := Set parametersi"; I.PRM+10 -> Cache partition PCB; I.PRM+12 -> Extent limits;n ; Returned:t; R1 -> I/O packet!; I.PRM, +2 := Completion statust;s ; Action:eB; This function will set the lower cache status bits of the X.CSTS;tD; The high bit of the word indicates that the partition PCB has been@; passed in parameter 5 and which should be plugged into X.CPCB.;e; Note: C; To enable/disable and activate/deactivate cache use correspondingg; subfunction codes.; GVALID= B% .IIF DF,CHEWBH, VALID = VALID!DC$WBHeINVALID=^C/2FUNSET: MOV I.PRM+6(R1), R0 ; Get the status bits* BIT #INVALID, R0 ; Invalid bits in here?- BNE FUNBAD ; Return "bad parameters" errort .IFDF CHEDFRc8 BITB #XC.DFR,R0 ; Is deferred writes on in new version# BEQ 15$ ; If EQ, no, don't worryC0 BITB #XC.DAT,R0 ; Is virtual turned on as well# BEQ FUNBAD ; If EQ, no, disallowg15$: .ENDC ;IFDF,CHEDFR6 MOV I.PRM+10(R1), R0 ; Get address of requested cache0 CALL VALPCB ; validate the PCB address passed BCS FUNBAD ; nfgD8 BITB #XC.ACT, APR6.BASE+X.CSTS ; Is current PCB address BNE 19$ ; If NE, yes. MOV R0, APR6.BASE+X.CPCB ; Load into the UCBX BR 20$ 19$:5 CMP R0, APR6.BASE+X.CPCB ; Do they match each other?r BNE PRIJMP ; If NE, noQ20$:- MOV R1, -(SP) ; Save the I/O packet addresss5 MOV I.PRM+12(R1), R0 ; Get virtual address of extentd, MOV #5, R1 ; Length of extent limit table CALL $ACHKB ; Address check BCC 21$ ; If CC, okay, MOV (SP)+, R1 ; Restore I/O packet address- JMP FUNBAD ; Otherwise part not in virtual 21$:0 CALL $RELOC ; Calculate parameters for $BLXIO;, ; Context:2; R1 := Physical addess of table in 32-word blocks"; R2 := Offset of table, bias APR6;o, MOV #5, R0 ; Length of extent limit table* SUB #20000, R2 ; Change into APR5 offset+ MOV KISAR6, R3 ; Physical address of UCBX : MOV #APR6.BASE+X.XDAT, R4 ; Offset of table in UCBX, bias CALL $BLXIO, MOV (SP)+, R1 ; Restore I/O packet address;(; Note: 6; DC$PAR bit is ignored by following byte instruction.;a6 BICB #VALID, APR6.BASE+X.CSTS ; Clear original status9 BISB I.PRM+6(R1), APR6.BASE+X.CSTS ; Set new status bits  .IF DF CHEWBH; BICB #X2.WBH,APR6.BASE+X.CST2 ; remove write behind status 0 BIT #DC$WBH,I.PRM+6(R1) ; should we enable it? BEQ 22$ ; nope, skip this ...< BISB #X2.WBH,APR6.BASE+X.CST2 ; allow write-behind to occur22$: .ENDC ;DF,CHEWBHC3 BIT #DC$DBG,I.PRM+6(R1) ; should debug be enabled?  BEQ 23$ ; nope, continue ...C! MP.PAR ; map to the partition / BISB #CS.DBG,APRD.BASE+H.CSTS ; set the status;623$: JMP FUNSUC ; ok, we are done now, return statusPRIJMP: JMP FUNPRI * .SBTTL + FUNCSB - Clear statistics buffer;;*; This function maps the statistics buffer#; (if any) and fills it with nulls.B;26; The statistics buffer is allocated in secondary pool2; and is a single 32-word block of 16 doublewords.;E3; NOTE: Access to the UCBX is lost by this routine!l4; There is currently no reason to save (reload) this-; address since the UCBX is no longer needed.+;SBFUNCSB: MOV APR6.BASE+X.CSBA,KISAR6 ;Map statistics buffer in APR6- BEQ 20$ ;Ooops, statistics buffer not here # MOV #00bEt__DATADATADATADATAAPR6.BASE,R0 ;Point R0 to it+ MOV #S.SIZE/4,R3 ;Count of cells to clear &10$: CLR (R0)+ ;Clear out first word# CLR (R0)+ ;Clear out second wordi" SOB R3, 10$ ;More to clear out?)20$: JMP FUNSUC ;Proceed to common exit  e) .SBTTL + DC$RSB - Read statistics buffer ;r ; Passed:t; UCBX mapped in APR6e;d; R1 -> I/O packet,; I.PRM+6 -> User buffer (virtual address)"; I.PRM+10 -> Size of user buffer;i ; Returned:i;P ; Action:$5; This function will return the contents of the cacheS8; statistics buffer for a particular device. The caller3; must pass the address and length of his buffer inC8; parameters 5 and 6 (respectively). The user's context7; is currently loaded, and $ACHCK is called to validate 6; the buffer. The buffer could be any size smaller or6; equal to the stats buffer. It should NOT be allowed1; to be larger, since this will allow him to readI6; either the rest of secondary pool, or off the end of6; secondary pool (into a task, common, or non-existent8; memory). Nonexistent memory (odd addresses) in kernel; mode spells instant doom.r; 7; $BLXIO will be used to teleport the stats buffer fromc&; secondary pool to the user's buffer.;y>; NOTE: $ACHCK is used instead of $CKBFx because the operation7; will be completed immediately (while the user remainsb6; loaded). $RELOC is called to create the context for; $BLXIO (address doubleword).;h:FUNRSB: TST APR6.BASE+X.CSBA ;Statistics buffer available?, BEQ PRIJMP ;No buffer if EQ; return error) MOV R1,-(SP) ;Save the packet's address)5 MOV I.PRM+6(R1),R0 ;Load the user's virtual addressl4 MOV I.PRM+10(R1),R1 ;Load the user's buffer length/ CALL $ACHCK ;Address check loaded user spaceK- BCC 5$ ;Address check failed, return errorn$ MOV (SP)+,R1 ;Get packet's address& JMP FUNBAD ;Return "bad parameters"45$: CALL $RELOC ;Now create the address doubleword, MOV R1, R3 ;Prepare parameters for $BLXIO MOV R2, R4f) MOV (SP),R1 ;Get back packet's addressQ5 MOV I.PRM+10(R1),R0 ;Get the count of bytes to mover0 CMP R0,#S.SIZE ;User want more than available?# BLOS 10$ ; If LOS, no, accept ita$ MOV #S.SIZE,R0 ;Else enforce limit-10$: MOV R0,I.PRM(R1) ;Return the byte count 8 MOV APR6.BASE+X.CSBA,R1 ;Get statistics buffer APR bias) MOV #APR5.BASE,R2 ;Set the displacementb. CALL $BLXIO ;Transfer the statistics buffer& MOV (SP)+,R1 ;Packet's address to R1% JMP FUNSUC ;Proceed to common exitf M3 .SBTTL + FUNDEL - Cache delete extents subfunction1;1 ; Invoked:A; from SMDEL in F11ACP to delete corresponding extents from cache @; when blocks are deleted from file (implying contents no longerE; valid for file-structured operations; the transition from allocatedA; to deallocated file blocks also implies that the data contained59; in the block is not of sufficient interest to cache fort#; non-file-structured logical i/o). ;a ; Passed:e'; R1 -> I/O packet from SMDEL in F11ACPn:; P4,P5 = LBN of first block (P4 is MSP of dbl prec value; P6.1,9; P6.2 = number of blocks (P6.1 is MSP of dbl prec valueg;t ; Action:aB; All extents containing the deleted blocks are purged from cache.; ; Returns:=; IO.SUC (no special status is set, nor any checked in SMDEL)o;a=FUNDEL: CMP I.TCB(R1),U.ACP(R5) ; is the requestor the owner?n% BNE PRIJMP ; nope, give priv errort8 MOV #1,I.PRM+P2(R1) ; phoney up rqst length for search/ CALL SEARCH ; search for CED position in LBNn# BCS 90$ ; no overlapping extentss< MOV I.PRM+P4(R1),-(SP) ; extract the high order LBN ;DC4302 BIT #DV.32B,U.CW1(R5) ; 32-bit LBNs used ;DC4301 BNE 5$ ; if NE, yes, handle 32-BIT LBNs ;DC430o ;DC4305 CLRB 1(SP) ; clear the high byte for 24-bit ;DC430c ;DC430<5$: CMP (SP)+,E.LBNL+2(R0) ; CED start before delete ;DC430) BLO 15$ ; if LO, yes, continue ;**-1$ BHI 10$ ; nope, shorten it up ...6 CMP I.PRM+P5(R1),E.LBNL(R0) ; how about low order LBN+ BLOS 15$ ; if LO, delete the whole thinge;+E; Since we are dele00j1ibjbkb a a ating in the middle of an extent, we must retainVF; the "front-end" of this CED, and drop the remaining blocks from thisJ; CED. We also do NOT want to force an I/O for this housekeeping operation;-.10$: MOV E.LBNH(R0),R3 ; get the high end LBN3 SUB I.PRM+P5(R1),R3 ; compute how much is dropped1;+=; The one additional check is if the area to delete is only a E; portion of a single CED. At this point, if the amount to be deleted I; is greater than the total number of blocks to delete, then simply leave ; the entire CED intact ...u;r0; R3 :== number of blocks to be removed from CED;-8 TSTB I.PRM+P6.1(R1) ; more than 65.K blocks to remove?* BNE 13$ ; if NE, yup, we can shorten it8 CMP R3,I.PRM+P6.2(R1) ; can we delete this many blocks?* BHI 90$ ; if HI, nope, leave CED intact/13$: MOVB E.SIZE(R0),R2 ; get current CED size  SUB R3,R2 ; compute new sizef' MOVB R2,E.SIZE(R0) ; set the new sizen< MOV I.PRM+P4(R1),-(SP) ; extract the high order LBN ;DC4309 BIT #DV.32B,U.CW1(R5) ; are we using 32-bit LBNs ;DC430* BNE 14$ ; if NE, yes, continue ;DC430 ;DC4304 CLRB 1(SP) ; clean up the high order part ;DC430 ;DC430@14$: MOV (SP)+,E.LBNH+2(R0) ; update this CED ending LBN ;DC430> MOV I.PRM+P5(R1),E.LBNH(R0) ; and the ending block LSP ;**-10 MOV E.LNXT(R0),R0 ; get the next, if available$ BEQ 90$ ; nothing more to overlap215$: MOV I.PRM+P4(R1),R3 ; reset request base LBN3 BIT #DV.32B,U.CW1(R5) ; using 32-bit LBNs ;DC430#* BNE 16$ ; if NE, yes, contunue ;DC4305 BIC #177400,R3 ; clean off high order stuff ;DC430  ;DC430%16$: MOV I.PRM+P5(R1),R2 ;DC430a> ADD I.PRM+P6.2(R1),R2 ; double precision count from ACP ;**-1 ADC R3E1 ADD I.PRM+P6.1(R1),R3 ; calculate end of request;;20$: CMP R3,E.LBNL+2(R0) ; R0 -> CED within range? ;DC430 3 BHI 40$ ; yep, delete it and keep on going ;**-1l, BLO 90$ ; nope, we've fallen out of range. CMP R2,E.LBNL(R0) ; double precision compare BLOS 90$ ; we're done40$:. CALL ATTCED ; queue to extent, test if busy BCC 50$ ; not busy, trash it3& CLC ; busy, and we're queued to it RETURN ; let Phase 2 revisit750$: MOV E.LNXT(R0),-(SP) ; save pointer to next extentE;+B; Determine whether the entire extent should be deleted, or only; a part of the extent ...;-= CMP R3,E.LBNH+2(R0) ; does this extent cover extras? ;DC430-4 BHI 70$ ; if HI, no, delete the whole exent ;**-1% BLO 60$ ; if LO, yes, update sizesa' CMP R2,E.LBNH(R0) ; now check the LSPT' BHIS 70$ ; if HIS, delete the extentB;+7; Update the size parameter, and compute the new sizeu;-*60$: CALL UPDLBN ; update LBN parameters& BCC 70$ ; if CC, just delete it ...# CLR (SP) ; no more CED's to scane! BR 80$ ; and continue the scane870$: BICB #ES.WDF,E.STAT(R0) ; Extent not deferred, now.0 BISB #ES.DEL,E.STAT(R0) ; Extent to be deleted.&80$: CALL DETCED ; detach and delete$ MOV (SP)+,R0 ; get ptr to next CED# BNE 20$ ; and go for next if oneo+90$: JMP FUNSUC ; go to $IOFIN and returnt e .SBTTL Partition routines; .SBTTL + VALPCB - Validate a partition given a PCB addressN;; ; Passed: ; R0 -> PCB to validatei;C ; Returned: ; CC: PCB is valid; CS: PCB is not valid;0VALPCB: MOV R1,-(SP) ; Work register (main PCB)( MOV R2,-(SP) ; Work register (sub PCB)# MOV #$PARHD,R1 ; Get PCB listheado)10$: MOV (R1),R1 ; Get a main partition  BEQ 40$ ; End of list if EQ/ MOV R1,R2 ; Use R2 to run through subpartionn-20$: MOV P.SUB(R2),R2 ; Get the next sub PCBr BEQ 10$ ; Isn't one if EQ CMP R0,R2 ; Does this match? % BNE 20$ ; If NE, no - try next onea6 BIT #PS.COM, P.STAT(R2) ; Is this a common partition? BEQ 40$ ; If EQ, no2 BIT #P2.CHE,P.ST2(R2) ;Is this a cache partition?, BEQ 40$ ;No if EQ; don't activate caching. MOV KISAR6,-(SP) ; save kernel APR6 ;DC430; MOV P.REL(R2),KISAR6 ; map to the partition header ;DC430o< MOVB #1,@#140000+H.CVER ; load in the cache version ;DC4301 MOV00rEt__DATADATADATADATA (SP)+,KISAR6 ; restore kernel APR6 ;DC430 ;DC4305 TST (PC)+ ; Match in PCB address, return CC ;DC430$ ;DC430)40$: SEC ; No match, return CS ;**-1I MOV (SP)+,R2a MOV (SP)+,R14 RETURNQ o .SBTTL Cache control routines. .SBTTL + CHEACT - Activate cache for a device; ; Passed:c; UCBX mapped in APR6P;; ; Returned:A; R0 := Contents lostL;) ; Action:a9; This routine will attempt to activate the cache for theR<; device. If the UCBX specifies a PCB, it will be validated#; if it is valid then the map count >; of the partition (P.RMCT) will be incremented, and the cache; activated for the device. ;o4CHEACT: MOV APR6.BASE+X.CPCB,R0 ;Get the PCB address+ BEQ 40$ ;None present if EQ; can't start & CALL VALPCB ;Validate the partition* BCS 40$ ;Failed if CS; skip the startup. INCB P.RMCT(R0) ;Attach us to this partition8 BIS #P2.LMA, P.ST2(R0) ; Don't let partition be removed0 MOV R0, R3 ;Save PCB address in safe register# MOV R1,-(SP) ;Save packet address ! MOV #SECSIZE,R1 ;Set size in R1t' CALL $ALSEC ;Allocate secondary pool, BCS 35$ ;Couldn't if CS; ; Context:; R0 -> Newly allocated blockP;R9 MOV R0,APR6.BASE+X.CSBA ;Set the cache statistics buffer'8 MOV #</2>,R1 ;Size for initialization to zero% MOV KISAR6,-(SP) ;Save UCBX mapping# MOV R0,KISAR6 ;Map the new bufferp' MOV #APR6.BASE,R0 ;Set up its address '23$: CLR (R0)+ ;Initialize the buffer  SOB R1, 23$ ;loop ;DC430* MOV R3, R0 ;Prepare parameter to $QSPIF4 ADD #P.CSBA, R0 ;Calculate the stat block listhead+ MOV KISAR6, R1 ;Point at new block to add- CALL $QSPIF ;Add it to the end of the list+ MOV R5, APR6.BASE+S.UCB ;Point back to UCBi' MOV (SP)+,KISAR6 ;Reload UCBX mapping 135$: MOV (SP)+,R1 ;Get back saved packet addressU> BISB #XC.ACT,APR6.BASE+X.CSTS ;Cache is now activated and PCB TST (PC)+ ; CLC, skip SEC+40$: SEC ; return failure flag to caller," RETURN ;All done in validation ,0 .SBTTL + CHEDAC - Deactivate cache for a device; ; Passed:t; UCBX mapped in APR6;V ; Action: 9; This routine will deactivate caching for a cached unit. =; First all activity must be run down, then the active statusi%; and context information is cleared.n;B; This routine handles the rundown, and the local internal routine?; DCDACT completes deactivation after all rundown is completed. ;CA; If any CEDs exist, they will be purged. If any of them is busy C; packet will be queued to it and rundown will be propogated during B; Phase II. When the last CED is purged the packet will be queuedA; completion during the next passs through Phase II (this ensuressD; requests in the Phase II queue from the last CED will be completed%; before the deactivation completes).r@; When the deactivation request finds no CEDs exist at entry theF; local internal routine DCDACT will be entered to finish deactivation;D;xC; Deactivation must handle queueing to interlock with busy extents.q;eD; We set the flag X2.DEA when deactivation is started, and queue allD; I/O transfer requests while it is set. Control functions (IO.STC)H; directed to cache for the unit being deactivated will generally returnF; privilege errors to avoid races and other nasty conditions ("SET" is"; an exception believed safe now).; KCHEDAC: BISB #X2.DEA,APR6.BASE+X.CST2 ; show cache deactivation in progresse: MOV APR6.BASE+X.CCED,R0 ; get first extent address if any. BEQ DCDACT ; none, all CEDs deleted, finish MP.PAR ; map cache par:20$: CALL ATTCED ; make sure we can free CED (busy, etc). BCS 999$ ; it's busy and we're queued, exit6 MOV E.LNXT(R0),-(SP) ; Save ptr to next extent in LBN4 BISB #ES.DEL,E.STAT(R0) ; tell detach to delete CED; BICB #ES.ERR,E.STAT(R0) ; reset the error so it will writen* CALL DETCED ; detach and delete the CED BCC 30$ ; if CC, it is gone!!1 CALL ATTCED ; attach to the CED w/ I/O pendingn TST (SP)+ ; clean the stack& BR 999$ ; and pause for a00zibjbkb a a a while ...030$: MOV (SP)+,R0 ; Get next extent in LBN list+ BNE 20$ ; keep on looping until all done / CALLR Q2PHS2 ; finish after Phase 2 syncs in(( ; other requests still running down-999$: CLC ; send request to further procese RETURNC R0 .SBTTL + DCDACT - Deactivate cache - completion;L>; DCDACT - Rundown of all cache activity is done, now send all>; transfer requests queued during rundown along to the driver,=; then clear the status flags in the UCBX (XC.ACT and X2.DEA)i<; and detach 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.). Finally,n=; return the I/O status for explicit deactivation requests orT<; pass the request to the driver for implicit deactivations.;L,DCDACT: MOV R1, -(SP) ; Save packet address(10$: MP.PAR ; ensure partition mapped/ MOV #APRD.BASE+H.DACTQ,R1 ; get queue listheadr.12$: MOV R1,R0 ; hold previous chain element1 MOV (R0),R1 ; get the next list entry (if any)h BEQ 20$ ; no, exitu3 CMP I.UCB(R1),R5 ; is this packet for our device? ) BNE 12$ ; if NE, nope, try next packets' MOV (R1),(R0) ; remove, close up list  BNE 17$ ; not at end yets8 MOV R0,APRD.BASE+H.DACTQ+2 ; set end pointer to new end$17$: CALL .DRQRQ ; queue to driver! BR 10$ ; and see if more to go *20$: MP.UCBX ; make sure UCBX is mapped7 BICB #XC.ACT, APR6.BASE+X.CSTS ; show cache not activel8 BICB #X2.DEA,APR6.BASE+X.CST2 ; show cache rundown done< MOV APR6.BASE+X.CPCB, R0 ; Get the PCB address of cache par- DECB P.RMCT(R0) ; Detach from the partition;. BNE 50$ ; If NE, other devices still cached+ ; release fork block and clear pointera MOV R0,-(SP) ; save pcb ptr.& MOV KISAR6,-(SP) ; save UCBX mapping$ MP.PAR ; and map cache partition+ MOV H.FRK+APRD.BASE,R0 ; get frk block ptr. BEQ 40$ ; never got one* MOV 2(R0),H.FRK+APRD.BASE ; clear pointer BEQ 30$ ; was not used, ok.- FATAL$ BE.IDC ; internal consistency error130$: TST -(R0) ; back up to deallocate UMR maskc1 MOV #<6*2>,R1 ; set R1 to length to deallocatedo CALL $DEACB ; free pool-40$: MOV (SP)+,KISAR6 ; restore UCBX mapping ! MOV (SP)+,R0 ; restore register;8 BIC #P2.LMA, P.ST2(R0) ; Otherwise this is the last one;50$: MOV APR6.BASE+X.CSBA, R1 ; Get cache statistics buffer  BEQ 100$ ; None if EQ1 ADD #P.CSBA, R0 ; Calculate address of listheadp CALL $GTSPK BCC 60$ ; If CC, sanity check& FATAL$ BE.DDA ; double deallocation!60$: TST (R0)+ ; Is list empty?o BNE 70$ ; If NE, no- CLR (R0) ; P.DPCB must be null when REMingL/70$: MOV R1, R0 ; Prepare parameter to $DESECr8SECSIZE= /100 ; Size of CSB in secpol blocks. MOV #SECSIZE, R1 ; Set size for deallocation1 CALL $DESEC ; Deallocate secondary pool bufferh2 CLR APR6.BASE+X.CSBA ; Initialize the CSB pointer-100$: MOV (SP)+, R1 ; Pop I/O packet addressC0 CMP I.PRM+2(R1),#VV$CHE ; explicit or implicit?/ BNE 990$ ; implicit, send it along to driver0/ CALLR FUNSUC ; explicit, rundown is finishedC/990$: CALL .DRQRQ ; implicit rundown complete:, CLR R1 ; no packet to forward, in case we ; never forked> RETURN ; to caller .ENDC ; .IF DF D$$CHE .END; Set size for deallocation1 CALL $DESEC ; Deallocate secondary pool bufferh2 CLR APR6.BASE+X.CSBA ; Initialize the CSB pointer-100$: MOV (SP)+, R1 ; Pop I/O packet addressC0 CMP I.PRM+2(R1),#VV$CHE ; explicit or .TITLE DRGIN .IDENT /07.01/ ;0; Copyright (c) 1995-1999 by Mentec Inc., U.S.A.; 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:;; JIM KAUFFMAN; ERIC POSTPISCHIL ; K. L. NOEL;$; MODIFIED FOR RSX-11M-PLUS V4.2 BY:; ; K.L. NOEL ; R.D. HANEY; L.M. PETERSON; B.S. MCCARTHY ; K. L. NOEL;$; MODIFIED FOR RSX-11M-PLUS V4.3 BY:; ; J.W. B00Et__DATADATADATADATAERZLEI; $; MODIFIED FOR RSX-11M-PLUS V4.5 BY:;i; D. CARROLL 15-JUN-1993 07.01 ;.1; DC226 -- ALLOW $SFFMK TO RETURN $FMSK6 AS WELLF;I;U ; LOCAL DATA;D8 GBLMSK = 7 ;SEARCH INHIBIT MASK TO ONLY SYSTEM LOGICALS7 USRMSK = 15 ;SEARCH INHIBIT MASK TO ONLY USER LOGICALS ' MAP6 = 140000 ;OFFSET TO START OF APR6 ;; MACRO LIBRARY CALLS1;P% .IF DF C$$RMT ; REMOTE TASK SUPPORTH .MCALL CPRDF$ CPRDF$. .ENDC ; C$$RMTL .PAGE;); DEFINE SUBFUNCTION DISPATCH TABLE ENTRY ;.&; SFDIR FLAGS,DPBSIZ,BUFSIZ,ADDR,COND;4; WHERE:; A; FLAGS= SF.IN SET IF THE SUBFUNCTION RETURNS SYSTEM INFORMATION.U+; SF.PRV IF THE SUBFUNCTION IS PRIVILEGED.D/; (BITS 15-13 IN THE FIRST WORD OF THE ENTRY). ; DPBSIZ=DPB SIZE IN WORDS.H.; (BITS 12-8 IN THE FIRST WORD OF THE ENTRY).6; BUFSIZ=SIZE OF THE MINIMUM BUFFER REQUIRED IN WORDS.-; (BITS 7-0 IN THE FIRST WORD OF THE ENTRY).H2; ADDR=ADDRESS OF ROUTINE TO PERFORM THE FUNCTION.; (SECOND WORD OF THE ENTRY).8; COND=EXPRESSION ON WHICH DIRECTIVE IS CONDITIONALIZED.2; DEFAULT OF $SFTBL IS USED FOR CONVENIENCE (I.E.; UNCONDITIONAL).;T2 .MACRO SFDIR FLAGS,DPBSIZ,BUFSIZ,ADDR,COND=$SFTBL .IF DF COND# .WORD FLAGS!! .WORD ADDRB .IFFW .WORD 0 .WORD 0 .ENDC .ENDM .PAGE;+C; SUBFUNCTION DISPATCH TABLE FOR THE GET/SET INFORMATION DIRECTIVE.H;-F$SFTBL::SFDIR SF.PRV!SF.IN, 8., 6.,$SFGAS ;000.-GET ASSIGNMENT INFO> SFDIR SF.IN, 4., 5.,$SFUIC ;001.-GET SYSUIC, LIBUIC,6 SFDIR 0, 3., 0.,$SFDEF ;002.-SET DEFAULT UICA SFDIR SF.IN, 4., 9.,$SFFMK ;003.-GET FEATURE MASK WORDSG= SFDIR 0, 4., 2.,$SFQMC ;004.-QUEUE MCR COMMAND LINEA, SFDIR 0, 6., ,$SFUAB,A$$CNT# ;005.-GET USER ACCOUNT BLKA SFDIR SF.IN, 6., 1.,$SFDEV ;006.-GET DEVICE INFORMATIONT9 SFDIR 0, 3., 0.,$SFSPR ;007.-SET TASK PRIVILEGES7 SFDIR 0, 4., 0.,$SFREN ;008.-CHANGE TASK NAMES8 SFDIR SF.IN, 4.,97.,$SFAPR ;009.-READ ALL APRSA SFDIR SF.IN, 6., 2.,$SFFTK ;010.-FIND AND GET TASK INFO 7 SFDIR 0, 10.,0,$SFPMN ;011.-SET PMON PARMSD6 SFDIR 0, 4., 1.,$SFCFG ;012.-GET CONFIG. TAB6 SFDIR 0, 4., 3.,$SFSSN ;013.-GET SYS. SERIAL6 SFDIR 0, 4., 2.,$SFABO ;014.-ABORT ALL TASKS< SFDIR SF.IN, 4., 2.,$SFVEC ;015.-TRANSLATE VECTORB SFDIR 0, 0., 0., 0,NEVER ;016.-GET MASS STORAGE (P/OS)6 SFDIR SF.IN, 4., 5.,$SFUPD ;017.-UPDATE UICS< SFDIR SF.IN, 6., 1.,$SFDEV ;018.-SON OF GET DEVICE ; INFORMATION$SFHI==<.-$SFTBL/4-1> ;+); **-$DRGIN-GENERAL INFORMATION DIRECTIVED;0@; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO PERFORM THE SUBFUNCTION; INDICATED IN THE DPB.S=; THE FUNCTIONS CAN EITHER SET PARAMETERS OR GET INFORMATION.S;B;*****************************************************************; 6; CAUTION! THIS DIRECTIVE IS INTENDED FOR USE ONLY BY1; DEC SOFTWARE. THERE IS NO GUARANTEE THAT THIS /; DIRECTIVE WILL BE IN FUTURE RELEASES OR THATS#; THE FORMAT WILL REMAIN THE SAME.R;IB;*****************************************************************;T ; DPB FORMAT:S;R); WD. 00 -- DIC(169.),DPB SIZE(VARIABLE).S(; WD. 01 -- SUBFUNCTION CODE (LOW BYTE).); WD. 02 -- PARAMETER 1 (BUFFER ADDRESS).T/; WD. 03 -- PARAMETER 2 (BUFFER SIZE IN WORDS).*4; WD. N -- PARAMETER N (MAX DPB SIZE IS 32. WORDS).;S ; INPUTS:I;N3; R2=ADDRESS OF SECOND STATUS WORD OF CURRENT TASK. !; R3=POINTER TO WD. 1 IN THE DPB.W/; 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) ;M-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.L&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.B7; DIRECTIVE STATUS OF 'D.RS99' IS RETURNED IF THE TASK -; HAS SPECIFIED AN INVALID SUBFUNCTION CODE ; OR THE DPB SIZE IS INVALID.N7; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE USER ; BUFFER FAILS ADDRESS CHECKS.2; DIR00ibjbkb a a aECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE5; SUBFUNCTION REQUIRES PRIVILEGE AND THE REQUESTINGT; TASK IS NOT PRIVILEGED.E;N=; NOTE: IF A USER BUFFER IS SPECIFIED, THE SERVICE ROUTINE ISL9; ENTERED WITH R3 POINTING TO THE BUFFER AND R4 POINTINGE; TO WORD 4 OF THE DPB.;S9; IF NO USER BUFFER IS SPECIFIED, THE SERVICE ROUTINE ISE1; ENTERED WITH R3 POINTING TO WORD 2 OF THE DPB. ;I;-  D .IF DF D$$PAR$DRGN1:: .IFF ; DF D$$PARE$DRGIN:: .ENDC ; DF D$$PAR# MOV (R3)+,R4 ;GET SUBFUNCTION CODER" CMP R4,#$SFHI ;CODE WITHIN RANGE? BHI 90$ ;IF HI NOE. ASH #2,R4 ;CONVERT CODE TO DOUBLE WORD INDEX, ADD #$SFTBL,R4 ;POINT TO PROPER TABLE ENTRY0 MOV (R4)+,R1 ;GET FLAGS AND MINIMUM BUFFER SIZE$ BEQ 90$ ;IF EQ INVALID SUBFUNCTION .IF DF R$$PRO .IFF ;R$$PROU) BPL 10$ ;IF PL NO PRIVILEGE IS REQUIRED 0 BIT #T3.PRV,T.ST3(R5) ;CURRENT TASK PRIVILEGED?( BEQ 80$ ;IF EQ NO, PRIVILEGE VIOLATION .IFTF ;R$$PRO10$: MOV R1,R2 ;COPY DPB SIZE SWAB R2 ;MOVE IT TO LOW BYTE& BIC #^C<37>,R2 ;CLEAR IRRELEVANT BITS$ CMPB R2,$DICSV+1 ;CORRECT DPB SIZE? BNE 90$ ;IF NE NO , 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?I BLO 90$ ;IF LO NOR4 MOV (R3),-(SP) ;SAVE NUMBER OF WORDS IN USER BUFFER8 SUB R1,(SP) ;CALCULATE # OF EXTRA WORDS IN USER BUFFER8 MOV (R3)+,R1 ;GET SIZE OF USER BUFFER FOR ADDRESS CHECK ASL R1 ;CONVERT SIZE TO BYTESC MOV -(R4),R2 ;GET FLAGS MOV R3,R4 ;COPY DPB ADDRESS?1 MOV R0,R3 ;COPY USER BUFFER ADDR FOR ADDR CHECKE- BIT #SF.IN,R2 ;IS THIS A READ ONLY FUNCTION?S BEQ 20$ ;IF EQ YES2 CALL $ACHKP ;ADDRESS CHECK BUFFER FOR R/W ACCESS BR 25$ ;520$: CALL $ACHRO ;ADDRESS CHECK BUFFER FOR RO ACCESSI) BCS 70$ ;IF CS ADDRESS CHECK HAS FAILEDO& CALL $RELOC ;RELOCATE BUFFER ADDRESS& MOV R1,KISAR6 ;MAP TO THE USER BUFFER- MOV R2,R3 ;REDEFINE PARAMETER BLOCK ADDRESSS;25$: MOV (SP)+,R2 ;GET NUMBER OF EXTRA WORDS IN USER BUFFERF730$: CALLR @(SP)+ ;DISPATCH TO THE APPROPRIATE ROUTINES(70$: DRSTS D.RS98 ;SET DIRECTIVE STATUS .IFF ;R$$PROE'80$: DRSTS D.RS16 ;PRIVILEGE VIOLATIONC .IFTF ;R$$PRO.90$: ;REF. LABLE FOR ERROR RETURN OF IE.SDP .IFT ;R$$PROE1$SFGAS:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSE1$SFUIC:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSR1$SFDEF:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSM1$SFFMK:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSM1$SFQMC:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSE1$SFDEV:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OS 1$SFSPR:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OS1$SFREN:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSI1$SFAPR:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSO1$SFFTK:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSS1$SFABO:: ;REF. LABEL TO NOP SUBFUNCTION ON P/OSC .IFTF ;R$$PRO .IF NDF P$$MONN$SFPMN:: .ENDC ;P$$MON .IF NDF P$$3XX 3$SFCFG:: ;REF. LABEL TO NOP SUBFUNCTION ON M-PLUSN3$SFSSN:: ;REF. LABEL TO NOP SUBFUNCTION ON M-PLUSP .ENDC ; DF P$$3XX2 DRSTS D.RS99 ;INVALID SUBFUNCTION CODE OR BUFFER .IFF ;R$$PRON ;+#; **-SFGAS-GET ASSIGNED DEVICE NAMEU;NH; THIS SUBFUNCTION SEARCHES THE ASSIGNMENT LIST FOR A SPECIFIED LOGICAL K; NAME AND RETURNS THE NAME OF THE PHYSICAL DEVICE TO WHICH IT IS ASSIGNED.U;N ; DPB FORMAT:;.#; WD. 00 -- DIC(169.),DPB SIZE(8.).S-; WD. 01 -- SUB FUNCTION CODE (0) (LOW BYTE).S"; WD. 02 -- OUTPUT BUFFER ADDRESS.*; WD. 03 -- OUTPUT BUFFER SIZE (IN WORDS). ; WD. 04 -- LOGICAL DEVICE NAME."; WD. 05 -- LOGICAL DEVICE NUMBER.D; WD. 06 -- TI NAME FOR WHICH THIS ASSIGNMENT HOLDS. (0 FOR GLOBAL).; WD. 07 -- TI DEVICE NUMBER.:; (IF HIGH BIT OF UNIT NUMBER IS SET, GET LOGIN ASSIGN); ; BUFFER FORMAT:;R$; WD. 00 -- NAME OF ASSIGNED DEVICE.:; WD. 01 -- UNIT NUMBER OF ASSIGNED DEVICE AND FLAGS BYTE..; WD. 02 -- FIRST DEVICE CHARACTERISTICS WORD./; WD. 03 -- SECOND DEVICE CHARACTERISTICS WORD.B.; WD. 04 -- THIRD DEVICE CHA00Et__DATADATADATADATARACTERISTICS WORD.0; WD. 05. -- FOURTH DEVICE CHARACTERISTICS WORD.;5 ; INPUTS: ;I*; R2=NUMBER OF EXTRA WORDS IN USER BUFFER./; R3=ADDRESS OF THE LOGICAL NAME IN THE BUFFER. "; R4=ADDRESS OF WD. 04 IN THE DPB./; R5=ADDRESS OF THE TCB OF THE REQUESTING TASK. ;F5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; *; C=0 IF DIRECTIVE SUCCESSFULLY COMPLETED.&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.O0; DIRECTIVE STATUS OF 'D.RS5' IS RETURNED IF NO5; ASSIGNMENT EXISTS FOR THE SPECIFIED LOGICAL NAME.I8; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF SPECIFIED; DEVICE IS NOT A TERMINAL.:; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF REQUESTING ; TASK IS NOT PRIVILEGED.5;D;- $SFGAS::. .IF DF L$$GCL ;EXTENDED LOGICAL NAME SUPPORT> MOV #GBLMSK,$TONYL ;INITIALIZE SEARCH ONLY TO SYSTEM LOGICALS .IFTF ;DF L$$GCLR' MOV R3,-(SP) ;SAVE USER BUFFER ADDRESSD. CLR R2 ;ASSUME NO TERMINAL SPECIFIED, UCB=0 MOV 4(R4),R0 ;GET TERMINAL NAME& BEQ 10$ ;IF EQ DON'T LOOK FOR TI UCB# MOV 6(R4),R1 ;GET TI DEVICE NUMBER27 BIC #177400,R1 ;STRIP OFF HIGH BYTE (LOGIN/LOCAL FLAG)3 CALL $CVDVN ;CONVERT DEVICE NAME TO A UCB ADDRESSE! BCS 70$ ;IF CS DEVICE NOT FOUND5) BIT #DV.TTY,U.CW1(R2) ;IS IT A TERMINAL?E BEQ 70$ ;IF EQ NOS10$:& .IF DF C$$RTK ;REMOTE DEVICE SUPPORT. BIT #F5.RTK,$FMSK5 ;REMOTE DEVICE SUPPORT ON? BEQ 17$ ;IF EQ NOS;BJ; FOR REMOTE HOST SYSTEMS, WE DO NOT ALLOW GET ASSIGNED DEVICE FOR A LOCALH; LOGICAL NAME WHERE THE TI IS NOT OUR OWN. THIS IS BECAUSE THE CPRAME F; SERVICING THE REQUEST DOES NOT HAVE ACCESS TO ANOTHER AME'S LOGICALS; & TST R2 ;WAS THERE A TI UCB SPECIFIED BEQ 15$ ;IF EQ NO" CMP R2,T.UCB(R5) ;IS THIS OUR TI? BNE 70$ ;IF NE NO);S&; GIN$ DIRECTIVE MUST BE DONE REMOTELY;0)15$: MOV R4,R3 ;PUT ADDRESS OF DPB IN R3 SUB #4,R3 ;AND POINT TO WORD 2! CLR R2 ;INDICATE NO UCB ADDRESSS' JMP $RTINF ;JOIN COMMON CODE IN GLUN A .ENDC ;C$$RTK I#17$: TST R2 ;WAS TI UCB SPECIFIED?T/ BEQ 20$ ;IF EQ NO, LOOK FOR GLOBAL ASSIGNMENT  .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 NOD$ 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 NOC, TSTB 7(R4) ;LOOKING FOR LOGIN ASSIGNMENT ? BPL 50$ ;IF PL NOB2 CMPB #-1,L.TYPE(R1) ;IS THIS A LOGIN ASSIGNMENT ? BNE 30$ ;IF NE NOD+50$: CMP L.NAM(R1),(R4) ;DEVICE NAME MATCH?O BNE 30$ ;IF NE NOH* CMPB L.UNIT(R1),2(R4) ;UNIT NUMBER MATCH? BNE 30$ ;IF NE NO & MOVB 7(R4),R2 ;SAVE LOGIN ASSIGN FLAG- MOV L.ASG(R1),R4 ;GET ASSIGNMENT UCB ADDRESST% TST R0 ;LOOKING FOR GLOBAL ASSIGN ?3$ BEQ 65$ ;IF EQ YES - USE UCB AS IS, TST R2 ;WAS IT A LOGIN ASSIGNMENT LOOKUP ?* BPL 65$ ;IF PL NO, USE "RAW" UCB ADDRESS .IFT ;DF L$$GCL3 BIT #U2.LOG,U.CW2(R2) ;IS THIS TERMINAL LOGGED ON?T, BNE 80$ ;IF NE, NO, THERE ARE NO LOGICALS $ MOV R2,R1 ;GET COPY OF UCB ADDRESS1 CALL $GTUSR ;SET UP THE USER HASH TABLE ADDRESSR> MOV #USRMSK,$TONYL ;INITIALIZE TO INHIBIT ALL BUT USER TABLES7 MOVB #LB.LOG,R3 ;SET UP THE LOGIN MOD VALUE BY DEFAULTC+ TSTB 7(R4) ;SEE IF THIS IS A LOGIN LOOKUPG4 BMI 25$ ;IF MI, IT IS, KEEP THE INITIALIZED VALUES320$: CLR R3 ;ZERO MOD VALUE TO PICK UP ANY LOGICALN&25$: MOV (R4),R2 ;GET DEVICE MNEMONIC MOV 2(R4),R0 ;GET UNIT NUMBER0 MOV R4,-(SP) ;SAVE THE DPB ADDRESS ACROSS CALLS' MOV #$LNTSL,-(SP) ;CALL LOOKUP ROUTINET( CALL $MPDC3 ;IN THIRD DIRECTIVE COMMON, BCC 30$ ;IF CC, SUCCESSFUL LOOKUP IN TABLE+ TST R3 ;SEE IF THERE REALLY WAS A LOGICALL1 BEQ 80$ ;IF EQ, NO LOGICAL ASSOCIATED WITH NAME ) MOV (SP)+,R4 ;RESTORE THE BUFFER ADDRESSG4 BR 70$ ;TRANSLATION OCCURRED TO BAD DEVICE OR LOOP)30$: MOV (SP)+,R4 ;RESTORE ADDRESS TO DPB 8 MOV R2,(R4) ;PUT EQUIVALENCE NAME MNEMONIC BACK IN DPB' MOV R0,2(R4) ;SAME FOR THE UNIT NUMBERR+00ibjbkb a a a MOV $DEVHD,R2 ;GET ADDRESS OF DEVICE TABLEM-35$: CMP (R4),D.NAM(R2) ;IS THIS THE DEVICE ?M BEQ 45$ ;YES,40$: MOV D.LNK(R2),R2 ;NO, POINT TO NEXT DCB BNE 35$ ;GOT ONE BR 70$ ;END OF DEVICES, ERROR "45$: MOV 2(R4),R5 ;GET UNIT NUMBER) CMPB R5,D.UNIT(R2) ;IS UNIT ON THIS DCB?S BLO 40$ ;NO  CMPB R5,D.UNIT+1(R2) ;MAYBE BHI 40$ ;NO! CLR R3 ;GET FIRST UNIT NUMBERR BISB D.UNIT(R2),R3 ;P( MOV D.UCB(R2),R1 ;GET FIRST UCB ADDRESS) SUB R3,R5 ;COMPUTE RELATIVE UNIT NUMBER  BEQ 55$ ;FOUND ITV-50$: ADD D.UCBL(R2),R1 ;NO, POINT TO NEXT UCBC DEC R5 ;FOUND IT YET?S BNE 50$ ;NO, LOOP4*55$: MOVB 7(R4),-(SP) ;SAVE THE LOGIN FLAG* MOV R1,R4 ;GET A COPY OF THE UCB ADDRESS7 TSTB (SP)+ ;SEE IF THIS WAS A LOGIN ASSIGNMENT LOOKUP- BPL 65$ ;IF PL, NO, LEAVE UCB ADDRESS AS ISO .ENDC ;DF L$$GCLD,60$: CMP U.RED(R4),R4 ;END OF REDIRECT CHAIN BEQ 65$ ;IF EQ YES, FINISHED$ MOV U.RED(R4),R4 ;POINT TO NEXT UCB BR 60$ ;AND GO AGAIN65$: ;REFERENCE LABEL T. MOV (SP)+,R3 ;RESTORE THE USER BUFFER ADDRESS4 CALLR $GLINF ;CONTINUE THROUGH GET LUN INFORMATION"70$: DRSTS D.RS92 ;INVALID DEVICE(80$: DRSTS D.RS5 ;NO DEVICE IS ASSIGNED ;+J; **-$SFUIC-GET SYSUIC, LIBUIC, CURRENT UIC, PROTECTION UIC, AND LOGIN UIC;O?; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO RETURN THE SYSTEM UIC,F>; THE LIBRARY UIC, AND THE TASK'S CURRENT AND PROTECTION UICS,E; AND TI LOGIN UIC. IF SPACE IS AVAILABLE, TRANSFER OTHER UIC AND CLI ; INFORMATION.;: ; DPB FORMAT:L;L#; WD. 00 -- DIC(169.),DPB SIZE(4.).U,; WD. 01 -- SUBFUNCTION CODE (1) (LOW BYTE).; WD. 02 -- BUFFER ADDRESS.S#; WD. 03 -- BUFFER SIZE (IN WORDS).S;R; BUFFER FORMAT:;I; WD. 00 -- SYSTEM UIC.-; WD. 01 -- LIBRARY UIC.+; WD. 02 -- H.DUIC FOR THE REQUESTING TASK.H+; WD. 03 -- H.CUIC FOR THE REQUESTING TASK.H; WD. 04 -- LOGIN UIC.;R ; INPUTS:T; *; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.&; R3=ADDRESS OF WD. 00. OF THE BUFFER.(; R5=TCB ADDRESS OF THE REQUESTING TASK.; ; OUTPUTS:;L=; THE USER'S BUFFER IS FILLED WITH THE REQUESTED INFORMATION. ;E;- O8$SFUIC::MOV $SYUIC,(R3)+ ;MOVE SYSTEM UIC TO USER BUFFER# MOV $LBUIC,(R3)+ ;MOVE LIBRARY UICA .IF DF X$$HDR# CLR -(SP) ;RESERVE SPACE ON STACK. CLR -(SP) ; . MOV KISAR6,-(SP) ;SAVE MAPPING TO USER BUFFER0 MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER2 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 UICU# MOV (SP)+,KISAR6 ;RESTORE MAPPING H" MOV (SP)+,(R3)+ ;COPY CURRENT UIC3 MOV (SP)+,(R3)+ ;AND PROTECTION UIC TO USER BUFFERC .IFFO2 MOV $HEADR,R4 ;GET HEADER ADDRESS OF CURRENT TASK7 MOV H.DUIC(R4),(R3)+ ;MOVE CURRENT UIC TO USER BUFFERA: MOV H.CUIC(R4),(R3)+ ;MOVE PROTECTION UIC TO USER BUFFER .ENDC ;X$$HDR MOV T.UCB(R5),R1 ;GET TI UCBT S E .IF DF A$$CNT 4 .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 ONEO3$: MOV R0,KISAR6 ;MAP IT3+ MOV @#B.PNT+140000,R0 ;POINT TO NEXT BLOCKR+ CMPB #BT.UAB,@#B.TYP+140000 ;IS THIS A UABV BNE 3$ ;IF NE NO/ MOV @#B.UUIC+140000,R0 ;GET LOGIN UIC FROM UAB BR 6$ ;E$5$: MOV U.LUIC(R1),R0 ;GET LOGIN UIC16$: MOV (SP)+,KISAR6 ;RESTORE USER BUFFER MAPPINGN. MOV R0,(R3)+ ;RETURN LOGIN UIC TO USER BUFFER .IFF ;D$$PAR$0 MOV T.ACN(R5),R0 ;LOCATE FIRST ACCOUNTING BLOCK! BEQ 10$ ;IF EQ, THERE ISN'T ONER'7$: MOV R0,KISAR5 ;MAP ACCOUNTING BLOCK + MOV @#B.PNT+120000,R0 ;POINT TO NEXT BLOCKM+ CMPB #BT.UAB,@#B.TYP+120000 ;IS THIS A UAB  BNE 7$ ;IF NE NO7 MOV @#B.UUIC+120000,(R3)+ ;GET LOGIN UIC FROM THE UABV BR 20$ ;GO MOVE MORE DATAN110$: MOV U.LUIC(R1),(R3)+ ;GET LOGIN UIC FROM UCBG .ENDC ;D$$PAR ) .IFF ; DF A$$CNTR- MOV U.LUIC(R1),(R3)+ ;GET LOGIN UIC FROM UCB  .ENDC ; DF A$$CNT $ $;ME; IN ORDER TO OBTAIN THE REMAINING DATA, THE USER MUST HAVE ALLOCATED ; AT LEAST A 32. WORD BUFFER.M;A@20$: SUB #<32.-5.>,R2 ;IS THERE ROOM FOR THE NEXT BLOCK OF DATA? BMI 100Et__DATADATADATADATA10$ ;IF MI NO. MOV U.UIC(R1),(R3)+ ;PUT CURRENT TERMINAL UIC/ MOV U.MUP(R1),R1 ;PICK UP INDEX TO COB POINTERV' BIC #^C,R1 ;AND ONLY THE INDEXU& MOV $CPTBL(R1),R1 ;GET POINTER TO CPB% MOV (R1),R2 ;GET TCB ADDRESS OF CLIF. MOV @#KISAR6,-(SP) ;SAVE CURRENT APR6 MAPPING/ BIT #CP.POL,C.PSTS(R1) ;TCB IN SECONDARY POOL? BEQ 40$ ;IF EQ NOT MOV R2,KISAR6 ;MAP TCBE MOV #140000,R2 ;AND POINT TO IT'40$: MOV T.NAM(R2),R1 ;GET CLI TASKNAME5 MOV T.NAM+2(R2),R2 ;R) MOV (SP)+,@#KISAR6 ;RESTORE APR6 MAPPING 5 MOV R1,(R3)+ ;AND COPY CLI TASKNAME INTO USER BUFFERV MOV R2,(R3)+ ;C% MOV #$SYSNM,R1 ;POINT TO SYSTEM NAME.6 MOV (R1)+,(R3)+ ;SHUFFLE THE 6-CHARACTER NAME TO USER MOV (R1)+,(R3)+ ;..., MOV (R1)+,(R3)+ ;... ) MOV $NTUIC,(R3)+ ;SUPPLY THE NETWORK UIC64 MOV $SYSIZ,(R3)+ ;AND SYSTEM SIZE IN 32 WORD BLOCKS .IF DF A$$CNT! MOV #9.,-(SP) ;MAX LENGTH OF DDSM+ MOV KISAR6,-(SP) ;SAVE USER BUFFER MAPPINGM, MOV T.ACN(R5),R1 ;POINT TO ACCOUNTING BLOCK BEQ 70$ ;IF EQ THERE ISN'T ONE50$: MOV R1,KISAR6 ;MAP IT+ MOV @#B.PNT+140000,R1 ;POINT TO NEXT BLOCKM+ CMPB #BT.UAB,@#B.TYP+140000 ;IS THIS A UABT BNE 50$ ;IF NE NO(3 MOVB @#B.LDS+140000,R0 ;GET LENGTH OF DDS FROM UAB+ BEQ 70$ ;IF EQ, NO DDS% SUB R0,2(SP) ;SUBTRACT LENGTH OF DDSH, MOV #B.LDS+120000,R2 ;ADDRESS OF DDS IN UAB% MOV R3,R4 ;DISPLACEMENT INTO BUFFERT' MOV (SP),R3 ;USER BUFFER MAPPING BIASM INC R0 ;COPY SIZE BYTE ALSOE MOV KISAR6,R1 ;RESTORE UAB BIAS7 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 LENGTH190$: CLRB (R4)+ ;ZERO OUT REMAINING BUFFER SPACEU% DEC (SP) ;LENGTH REMAINING ON STACKE BNE 90$ ;LOOP UNTIL DONE100$: TST (SP)+ ;CLEAN STACKY .ENDC ;A$$CNTM 110$: RETURN R;+ ; **-$SFDEF-SET TASK DEFAULT UIC;AD; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SET THE DEFAULT UIC FOR THEG; REQUESTING TASK. IF THE TASK IS NON-PRIVILEGED, ONLY THE DEFAULT UIC I; IS CHANGED. IF THE TASK IS PRIVILEGED, BOTH THE DEAFULT AND PROTECTIONT; UICS ARE MODIFIED.;B ; DPB FORMAT:D;A#; WD. 00 -- DIC(169.),DPB SIZE(3.).O,; WD. 01 -- SUBFUNCTION CODE (2) (LOW BYTE).; WD. 02 -- DEFAULT UIC.;$ ; INPUTS:I;O'; R3=ADDRESS OF DEFAULT UIC IN THE DPB.N%; R5=TCB ADDRESS OF THE CURRENT TASK. ;$ ; OUTPUTS:;D1; THE DEAFULT UIC IS SET FOR THE REQUESTING TASK.E;O;- E5$SFDEF::TSTB T.GGF(R5) ;IS THER A GGF CONTEXT ACTIVE?S BEQ 5$ ;IF EQ, NO # DRSTS D.RS17 ;RETURN IE.RSU ERRORH#5$: MOV (R3),R1 ;GET SPECIFIED UICT BEQ 100$ ;IF EQ UIC IS INVALID$ .IF DF C$$RMT ;REMOTE TASK SUPPORT3 BIT #F5.RTK,$FMSK5 ;REMOTE TASK SUPPORT TURNED ON?E BEQ 40$ ;IF EQ, NO;2"; GET A REQUEST PACKET FROM CPRBUF;  MOV R3,R5 ;SAVE DPB POINTERE B MOV #1,R1 ;ALLOCATE ONE BLOCKN9 MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT STARTT" CALL $CPALO ;ALLOCATE THE BUFFER;F; FILL IN PACKET;T MOV R0,KISAR6 ;MAP PACKET% MOV #MAP6,R1 ;GET ADDRESS OF PACKET E+ MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUESTC CLRB H$ICNT(R1) ;NO ITEMS! ADD #P$DPB,R1 ;POINT TO DPB AREA ) MOV -4(R5),(R1)+ ;COPY FIRST WORD OF DPB # MOV -2(R5),(R1)+ ;COPY SECOND WORDQ MOV (R5),(R1)+ ;AND THIRD;E; SEND PACKET ;P! SUB #MAP6,R1 ;GET SIZE OF PACKETN CPSEN$ #SN$DIR,KISAR6,R1 ; ; GET RESULTS ;  MOV R0,KISAR6 ;MAP PACKET+ MOV #MAP6,R3 ;POINT TO BEGINNING OF PACKETT( CMP #IS.SUC,H$STAT(R3) ;DID IT SUCCEED? BEQ 20$ ;IF EQ YES3 CMP #IE.PRI,H$STAT(R3) ;FAIL BECAUSE NO PRIVILEGE?, BEQ 20$ ;YESV, CALLR $CPDEA ;DEALLOCATE PACKET AND RETURN20$:;;.; DEALLOCATE PACKET AND SET UP FOR COMMON CODE;O+ MOV H$STAT(R3),-(SP) ;SAVE RETURNED STATUSR ADD #P$DPB,R3 ;POINT TO DPB MOV 4(R3),-(SP) ;SAVE UIC CALL $CPDEA ;DEALLOCATE PACKET MOV (SP)+,R1 ;GET UIC MOV $TKTCB,R5 ;GET TCB ADDRESSR40$: .ENDC ; C$$RMTM .IF DF X$$HDR# MOV00ibjbkb a a a $SAHDB,KISAR6 ;MAP TASK HEADERH' MOV $SAHPT,R2 ;GET TASK HEADER ADDRESS; .IFF ; DF X$$HDRP' MOV $HEADR,R2 ;GET TASK HEADER ADDRESS Q .ENDC ; DF X$$HDR# MOV R1,H.DUIC(R2) ;SET DEFAULT UIC$ .IF DF C$$RMT ;REMOTE TASK SUPPORT3 BIT #F5.RTK,$FMSK5 ;REMOTE TASK SUPPORT TURNED ON?N BEQ 45$ ;IF EQ, NO7 CMP #IE.PRI,(SP)+ ;REMOTE HAVE INSUFFICIENT PRIVILEGE?D% BNE 45$ ;NO, CONTINUE TO SET H.CUICG/ MOV #IS.SUC,-(SP) ;PUT SUCCESS STATUS ON STACK.! BIC #1,$UMPS ;CLEAR USER'S CARRY5 MTPD$ @#H.DSW ;PUT SUCCESS IN DIRECTIVE STATUS WORDE BR 50$ ;AND EXIT ;45$: .ENDC ; DF C$$RMT( BIT #T3.PRV,T.ST3(R5) ;TASK PRIVILEGED? BEQ 50$ ;IF EQ NO( MOV R1,H.CUIC(R2) ;SET PROTECTION UIC 50$: RETURNR 100$: DRSTS D.RS91 ;INVALID UIC;+; **-$SFSPR-SET TASK PRIVILEGE;EC; THIS DIRECTIVE REQUEST THE SET/CLEAR OF THE TASK PRIVILEGE BIT INCC; THE TCB. THE PRIVILEGE BIT MAY BE CLEARED IN ANY STATE BUT MAY BEC(; SET ONLY IF IT WAS PREVIOUSLY CLEARED.;, ; DPB FORMAT:E; "; WD. 00 -- DIC(169.),DPB SIZE(3.) ; WD. 01 -- SUBFUNCTION CODE (7)&; WD. 02 -- NEW PRIVILEGE FLAG (BIT 0);; INPUT:;T$; R3=ADDRESS OF PRIVILGE FLAG IN DPB ; R5=TCB ADDRESS OF CURRENT TASK; ; OUTPUT:U;C; THE T3.PRV BIT IS SET OR CLEARED. THE PREVIOUS STATE OF T3.PRV ISA; SAVED IN T4.PRV.H;-/$SFSPR::MOV T.ST3(R5),R2 ;GET CURRENT PRIVILEGEE. BIC #^C,R2 ;AND ISOLATE PRIVILEGE BIT) BEQ 30$ ;IF EQ NOT CURRENTLY PRIVILEGEDI. BIS #T4.PRV,T.ST4(R5) ;COPY PRIVILEGED STATE) BEQ 30$ ;IF EQ NOT CURRENTLY PRIVILEGED # TST (R3) ;SET OR CLEAR PRIVILEGE? ' BNE 40$ ;IF NE SETTING PRIVILEGED BITN" BIC R2,T.ST3(R5) ;CLEAR PRIVILEGE RETURN ; '30$: TST (R3) ;SET OR CLEAR PRIVILEGE?T) BEQ 50$ ;IF EQ CLEARING. THIS IS A NOP /40$: BIT #T4.PRV,T.ST4(R5) ;WAS IT PRIVILEGED?P/ BEQ 60$ ;IF EQ NO, CAN'T MAKE SELF PRIVILEGED + BIS #T3.PRV,T.ST3(R5) ;MAKE IT PRIVILEGEDP50$: RETURN ;Q$60$: DRSTS D.RS16 ; PRIVILEGE ERROR;+; **-$SFREN-RENAME TASK ;VD; THIS DIRECTIVE RENAMES THE ISSUING TASK TO THE SUPPLIED TASK NAME.; ; DPB FORMAT:E; "; WD. 00 -- DIC(169.),DPB SIZE(3.) ; WD. 01 -- SUBFUNCTION CODE (7); WD. 02-03 -- NEW TASK NAME;T; INPUT:;R$; R3=ADDRESS OF NEW TASK NAME IN DPB ; R5=TCB ADDRESS OF CURRENT TASK;4 ; OUTPUT:R; >; THE NEW NAME IS CHECKED FOR UNIQUENESS AND IF NOT FOUND, THE*; ISSUING TASK IS RENAMED TO THE NEW NAME.;-A$SFREN::CMP #^R...,(R3) ;DON'T ALLOW RENAME TO A DOT-DOT-DOT FORM  BEQ 10$ ;IF EQ ILLEGAL NAMEH: CALL $SRPRO ;SEARCH PROTOTYPE TCB AND TCB LISTS FOR NAME" BCC 10$ ;IF CC NAME FOUND, ERROR6 MOV (R3),T.NAM+0(R5);ESTABLISH NEW NAME FOR THIS TASK MOV 2(R3),T.NAM+2(R5) ;... RETURNT510$: DRSTS D.RS17 ;NAME ALREADY IN USE(IE.RSU ERROR)  B;+H; **-$SFFMK-GET FEATURE MASK WORDS, BASE LEVEL, VERSION, AND SYSTEM TYPE;EF; THIS DIRECTIVE RETURNS THE FEATURE MASK WORDS TO THE REUESTING TASK.; ; DPB FORMAT:^;.#; WD. 00 -- DIC(169.),DPB SIZE(4.).T,; WD. 01 -- SUBFUNCTION CODE (3) (LOW BYTE).; WD. 02 -- BUFFER ADDRESS. !; WD. 03 -- BUFFER SIZE IN WORDS.$;I; BUFFER FORMAT:;R$; 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.S#; WD. 05 - 06 -- SYSTEM BASE LEVEL.E ; WD. 07 - 10 -- SYSTEM VERSION.9; WD. 11 - 16 -- SYSTEM TYPE (RETURNED ONLY IF BUFFER IS T!; AT LEAST 15. WORDS LONG)I;; WD. 11 - 17 -- FIFTH FEATURE MASK WORD (RETURNED ONLY IF ,; BUFFER IS AT LEAST 16. WORDS LONG):; WD. 11 - 20 -- SIXTH FEATURE MASK WORD (RETURNED ONLY IF,; BUFFER IS AT LEAST 17. WORDS LONG); ; INPUTS:D;2*; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.&; R3=ADDRESS OF WD. 00. OF THE BUFFER.%; R5=TCB ADDRESS OF THE CURRENT TASK.0;- ; OUTPUTS:;V,; THE INFORMATION IS RETURNED TO THE CALLER.;-;- S3$SFFMK::MOV #$FMASK,R0 ;GET ADDRESS OF FEATURE MASK . MOV (R0)+,(R3)+ ;MOVE FIRST FEATURE MASK WORD/ MOV (R0)+,(R3)+ ;MOVE SECOND FEATURE MASK00Et__DATADATADATADATA WORDU. MOV (R0)+,(R3)+ ;MOVE THIRD FEATURE MASK WORD/ MOV (R0)+,(R3)+ ;MOVE FOURTH FEATURE MASK WORD 2 MOV $HFMSK,(R3)+ ;MOVE HARDWARE FEATURE MASK WORD1 MOV $SYSID,(R3)+ ;MOVE BASE LEVEL TO USER BUFFER. MOV $SYSID+2,(R3)+ ;05 MOV $VERSN,(R3)+ ;MOVE SYSTEM VERSION TO USER BUFFER0 MOV $VERSN+2,(R3)+ ; ; P; SYSTEM TYPE IS RETURNED ONLY IF THERE ARE AT LEAST 6 EXTRA WORDS IN THE BUFFER;S$ SUB #6,R2 ;AT LEAST 6 EXTRA WORDS? BMI 10$ ;NO, RETURN NOWD' MOV #$SYTYP,R0 ;ADDRESS OF SYSTEM TYPEA MOV #6,R1 ;WORD COUNT+45$: MOV (R0)+,(R3)+ ;MOVE SYSTEM TYPE TO USER BUFFER SOB R1,5$ ;ALL SIX BYTES DEC R2 ;AT LEAST 1 EXTRA WORD? BMI 10$ ;NO, RETURN NOWI9 MOV $FMSK5,(R3)+ ;MOVE FIFTH FEATURE MASK TO USER BUFFER) DEC R2 ; ONE MORE WORD?V BMI 10$ ; NOPE, QUIT NOW ...< MOV $FMSK6,(R3)+ ; MOVE SIXTH FEATURE MASK WORD INTO BUFFER10$: RETURN ;A E;+"; **-$SFQMC-QUEUE MCR COMMAND LINE;AD; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A COMMAND LINE TO THE"; TASK'S COMMAND LINE INTERPRETER.;R; DPB FORMAT:;R#; WD. 00 -- DIC(169.),DPB SIZE(4.).U&; WD. 01 -- CODE FOR SFQMC (LOW BYTE).; WD. 02 -- BUFFER ADDRESS.B#; WD. 03 -- BUFFER SIZE (IN WORDS).,;); BUFFER FORMAT:; +; WD. 00 THRU N -- COMMAND LINE CHARACTERS.D; ; INPUTS: ;E*; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.#; R3=ADDRESS OF USER BUFFER WD. 00.:!; R5=TCB ADDRESS OF CURRENT TASK.-;U ; OUTPUTS:;I.; C=0 IF THE DIRECTIVE SUCCESSFULLY COMPLETED.&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.D3; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF THERE,; IS INSUFFICIENT DYNAMIC MEMORY AVAILABLE.;-;- R$SFQMC::   .IF DF V$$TRM I MOV T.UCB(R5),R1 ;GET TI: UCB MOV U.DCB(R1),R0 ;GET DCB. CMP D.NAM(R0),#"VT ;IS TI A VIRTUAL TERMINAL? BNE 5$ ;IF NE NO. TST U.PTCB(R1) ;IS VT MARKED FOR ELIMINATION? BEQ 90$ ;IF EQ YES S .ENDC  K75$: MOV #M$$CRB,R1 ;GET SIZE OF MCR COMMAND LINE BUFFERL CALL $ALOCB ;ALLOCATE A BUFFER$ BCS 100$ ;IF CS ALLOCATION FAILURE MOV R0,R1 ;COPY BUFFER ADDRESS+ TST (R0)+ ;POINT TO UCB ADDRESS IN BUFFERU( MOV T.UCB(R5),(R0)+ ;SET TI UCB ADDRESS! MOV #M$$CRB-4,R2 ;SET LOOP COUNTT110$: MOVB (R3)+,(R0) ;MOVE COMMAND TO POOL BUFFERR CMPB (R0),#15 ;CARRIAGE RETURN? BEQ 50$ ;IF EQ YES CMPB (R0)+,#33 ;ESCAPE? BEQ 50$ ;IF EQ YES1 SOB R2,10$ ;CONTINUE MOVING COMMAND TO THE POOLS0 MOVB #33,-(R0) ;TERMINATE BUFFER WITH AN ESCAPE550$: CALLR $QMCRL ;QUEUE THE COMMAND LINE TO THE CLIF;90$: DRSTS D.RS92 ;VIRTUAL TERMINAL MARKED FOR ELIMINATIONU&100$: DRSTS D.RS1 ;ALLOCATION FAILURE R;+"; **-$SFUAB-GET USER ACCOUNT BLOCK;I?; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO MOVE THE CONTENTS OF A,&; USER ACCOUNT BLOCK TO A USER BUFFER.;R ; DPB FORMAT:E;T"; WD. 00 -- DIC(169.),DPB SIZE(6.),; WD. 01 -- SUBFUNCTION CODE (5) (LOW BYTE).; WD. 02 -- BUFFER ADDRESS.N#; WD. 03 -- BUFFER SIZE (IN WORDS).I.; WD. 04 -- TERMINAL NAME (0 FOR CALLER'S TI).; WD. 05 -- TERMINAL NUMBER.; ; INPUTS:S;R*; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.#; R3=ADDRESS OF USER BUFFER WD. 00.I#; R4=POINTER TO WORD 04 OF THE DPB.C%; R5=TCB ADDRESS OF THE CURRENT TASK.C;T ; OUTPUTS:;V.; C=0 IF THE DIRECTIVE SUCCESSFULLY COMPLETED.&; DIRECTIVE STATUS OF +1 IS RETURNED.#; C=1 IF THE DIRECTIVE IS REJECTED.D/; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF 2.; A NON-PRIVILEGED USER SPECIFIES A TERMINAL..; DIRECTIVE STATUS OF 'D.RS92' IS RETURNED IF,; THE SPECIFIED DEVICE IS NOT A TERMINAL OR%; IF THERE IS NO UAB FOR THE DEVICE.R;I;- B E  .IF DF A$$CNT R7$SFUAB::MOV T.UCB(R5),R2 ;ASSUME TERMINAL NOT SPECIFIED ( MOV T.ST3(R5),R1 ;GET THIRD STATUS WORD% MOV R3,R5 ;COPY USER BUFFER ADDRESSS- 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 NOR" MOV (R4),R1 ;GET TERMINAL NUMBER CALL $CVDVN ;GET UCB ADDRESS! BCS 90$ ;IF CS DEVICE NOT FOUNDE- BIT #DV.TTY,U.CW1(R2) ;IS DEVICE A TERMINAL?  BEQ 90$ ;IF EQ NO " CMP $CO00ibjbkb a a aPT,R2 ;IS UCB EQUAL TO CO? BNE 10$ ;IF NE NO .IF DF D$$PAR* MOV $SYUAB,R1 ;PICK UP BIAS TO SYSTEM UAB BR 15$ ;*10$: MOV U.UAB(R2),R1 ;PICK UP BIAS TO UAB$15$: BEQ 90$ ;IF EQ THERE IS NO UAB+ MOV #B.ULEN,R0 ;SET COUNT OF WORDS TO MOVEI+ MOV #120000,R2 ;DISPLACEMENT (APR5) TO UABI' MOV KISAR6,R3 ;GET USER BUFFER MAPPING,3 MOV R5,R4 ;GET DISPLACEMENT TO USER BUFFER (APR6)E& CALL $BLXIO ;MOVE UAB TO USER BUFFER .IFF ;D$$PAR1) MOV $SYUAB,KISAR5 ;MAP TO THE SYSTEM UABQ BR 15$ ;410$: MOV U.UAB(R2),KISAR5 ;MAP THE UAB THROUGH APR 6$15$: BEQ 90$ ;IF EQ THERE IS NO UAB- MOV #B.ULEN/2,R0 ;SET COUNT OF WORDS TO MOVEU# MOV #120000,R1 ;SET SOURCE ADDRESSB-20$: MOV (R1)+,(R5)+ ;COPY UAB TO USER BUFFER  SOB R0,20$ ;LOOP UNTIL DONEM .ENDC ;D$$PAR RETURN ;)'80$: DRSTS D.RS16 ;PRIVILEGE VIOLATION ,90$: DRSTS D.RS92 ;INVALID DEVICE SPECIFIED .ENDC ;A$$CNT ;+"; **-$SFDEV-GET DEVICE INFORMATION;D;A+; THE GET DEVICE INFORMATION GIN DIRECTIVE:A;B; THIS GIN SUBFUNCTION RETURNS INFORMATION ABOUT A PARTICULAR 9; DEVICE. THE DEVICE ON WHICH INFORMATION IS RETURNED, ISCA; DETERMINED BY FIRST PERFORMING A LOGICAL ASSIGNMENT IF REQUIREDM=; AND THE FOLLOWING ANY REDIRECTS. DEVICE ASSIGNMENTS WILL BET=; CHECKED IF THE HIGH BIT IN THE FLAGS BYTE IS CLEAR, ELSE NO;; CHECK IS MADE.;=; ONLY THE FIRST WORD OF THE BUFFER IS REQUIRED TO BE PRESENT:; (IE: A BUFFER SIZE OF 1 WORD). ADDITIONAL INFORMATION IS7; RETURNED ONLY IF THERE IS ROOM IN THE BUFFER AND THATB; INFORMATION IS AVAILABLE. ;T ; INPUTS:A; +; R2 = EXTRA WDS. AVAILABLE IN USER BUFFER 5; R3 = POINTER TO USER BUFFER (MAPPED THROUGH APR 6)G"; R4 = POINTER TO "G.IDNM" IN DPB"; R5 = CURRENT TASK'S TCB ADDRESS;I;E; ; DPB FORMAT:C; A; +-----------------------------+-------------------------------+D; | DPBLEN=6. | DIC=169. |A; +-----------------------------+-------------------------------+ !; | GIN SUBFUNCTION CODE (6) | A; +-------------------------------------------------------------+O; | BUFFER ADDRESS |UA; +-----------------------------+-------------------------------+N; | BUFFER SIZE (WORDS!!) |A; +-----------------------------+-------------------------------+K; | ASCII DEVICE NAME | A; +-----------------------------+-------------------------------+-"; | FLAGS | DEVICE UNIT NUMBER |A; +-----------------------------+-------------------------------+-;-;-; #; DPB OFFSETS AND FLAG DEFINITIONS:-;-'G.INSF=2 ; LOCATION OF SUBFUNCTION CODE-%G.IDNM=10 ;TWO BYTE ASCII DEVICE NAME #G.IDUN=12 ;LOGICAL UNIT NUMBER BYTE-G.IDFG=13 ;FLAGS BYTES9GI.NAS=200 ;FLAG INDICATING NOT TO FOLLOW ANY ASSIGNMENTS-;-;-; USER BUFFER FORMAT:-;-;-C; +-------------------------------+-------------------------------+-C; | U | A | A | C | U | U | W | U | O | U | U | U | U | A | A | W | C; | N | T | L | O | S | S | A | N | F | S | S | S | S | T | L | A |C; | L | T | L | N | . | . | S | I | F | . | . | . | . | T | L | S |TC; | O | C | O | T | U | P | | T | L | M | F | M | L | A | O | |DC; | A | H | C | R | M | U | R | | I | N | O | D | A | C | C | A |2C; | D | 2 | 2 | | D | B | E | O | N | T | R | M | B | H | A | S |BC; | E | U | U | O | | | D | F | E | | | | | E | T | N |-C; | D | S | S | F | | | C | L | | | | | | D | E | D | C; | | | | L | | | T | | | | | | | | D | | C; +-------------------------------+-------------------------------+ ; | |; | U.CW1 |; | |C; +-------------------------------+-------------------------------+ ; | |; | U.PRM |; | |C; +---------------------------------------------------------------+ ; | |; | U.PRM+2 |; | |C; +---------------------------------------------------------------+ ; | |; | ASCII DEVICE NAME | ; | |C; +-------------------------------+-------------------------------+ ; | | | 2; | L.TYPE if 00ƒEt__DATADATADATADATA"WAS ASND" | DEVICE LOGICAL UNIT |.; | L.NTBL - EXTENDED LOG | NUMBER |C; +---------------------------------------------------------------+-; | |3; |--- ATTACHEE'S RAD50 TASKNAME ---| ; | ( IF ATTACHED ) |C; +---------------------------------------------------------------+-1; | ASCII TERMINAL DEVICE NAME OF ALLOCATOR |E&; |--- ( IF ALLOCATED ) ---|,; | LOGICAL UNIT NUMBER OF ALLOCATOR |C; +---------------------------------------------------------------+ ; | |%; |--- RAD50 ACP NAME ---|M; | ( IF MOUNTED ) |-C; +---------------------------------------------------------------+-; | | |'!; |--- -+- ---| ; | | | !; |--- -+- ---|-; | | |-!; |--- -+- ---|T; | VOLUME LABEL |T!; |--- -+- ---| ; | | | !; |--- -+- ---| ; | | |-C; +---------------------------------------------------------------+ ;;-;R%; OFFSET AND STATUS WORD DEFINITIONS:F;U/G.IDEV=0 ;GENERAL DEVICE STATUS WORD (REQUIRED)-0 ;NOTE THAT REQUIRED WORDS ARE NOT REFLECTED IN4 ;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 UCBT#G.IPR2=6 ;U.PRM+2 FROM DEVICE'S UCB-%G.IDNM=10 ;RESOLVED ASCII DEVICE NAME &G.IUNM=12 ;RESOLVED DEVICE UNIT NUMBER.G.ILTP=13 ;TYPE OF LOGICAL ASSIGNMENT FOLLOWED9G.IATT=14 ;RAD50 TASK NAME OF ATTACHER IF DEVICE ATTACHED ?G.IALL=20 ;ASCII TERMINAL NAME OF ALLOCATOR IF DEVICE ALLOCATEDI(G.IACP=24 ;NAME OF ACP IF DEVICE MOUNTED2G.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 TAPEC#G.IEND=G.IVOL+14;END OF USER BUFFERC;."; 'G.IDEV' STATUS WORD DEFINITION:;D:GI.ASN=000001 ;A LOGICAL ASSIGNMENT WAS FOLLOWED (1=YES))GI.ALL=000002 ;DEVICE ALLOCATED (1=YES)S(GI.ATT=000004 ;DEVICE ATTACHED (1=YES).GI.LAB=000010 ;UNIT HAS LABELED TAPE (1=YES)(GI.MDM=000020 ;(US.MDM) UNIT IS MARKED" ; FOR DISMOUNT (1=YES)4GI.FOR=000040 ;(US.FOR) UNIT IS MOUNTED AS FOREIGN ; VOLUME (1=YES)1GI.MNT=000100 ;(US.MNT) UNIT IS MOUNTED (0=YES)M+GI.OFL=000200 ;UNIT OR CONTROLLER OFFLINES.GI.UOF=000400 ;(US.OFL) UNIT OFFLINE (1=YES) GI.RED=001000A7GI.PUB=002000 ;(US.PUB) UNIT IS PUBLIC DEVICE (1=YES)I+GI.UMD=004000 ;(US.UMD) UNIT ATTACHED FORA! ; DIAGNOSTICS (1=YES))$GI.COF=010000 ;DEVICE'S CONTROLLER ; WAS OFFLINE (1=YES)(,GI.ALU=020000 ;DEVICE WAS ALLOCATED BY THE ; ISSUER'S TI: (1=YES)6GI.ATU=040000 ;DEVICE WAS ATTACHED BY ISSUER (1=YES)3GI.UNL=100000 ;DEVICE'S DRIVER NOT LOADED (1=YES) ;S,; DEFINE UCB AND MAGTAPE DEFINITIONS LOCALLY; .MCALL MTADF$,UCBDF$L) MTADF$ ;DEFINE MAGTAPE DATA STRUCTURESP$ UCBDF$ ;DEFINE UCB DATA STRUCTURE;C8; SINCE MANY OF THE STATUS BITS ARE DIRECTLY COPIED FROM;; U.STS AND U.ST2 OF THE UCB, WE MUST ASSUME THE FOLLOWING: ;  ASSUME GI.MDM,US.MDML ASSUME GI.FOR,US.FOR0 ASSUME GI.MNT,US.MNTA ASSUME GI.UOF, ASSUME GI.PUB, ASSUME GI.UMD,;E;; THE FOLLOWING BITS IN THE STATUS WORD ARE NOT COPIED FROMS>; U.STS AND U.ST2 OF THE DEVICE'S UCB. THEREFORE THE FOLLOWING0; BIT MASK IS USED TO CLEAR OUT THE UNUSED BITS.;PECLRMSK=GI.UNL!GI.ATU!GI.ALU!GI.RED!GI.OFL!GI.ATT!GI.ALL!GI.ASN!GI.LABT;I8; THE FOLLOWING SECTION OF THIS GIN FUNCTION ATTEMPTS;; TO LOCATE THE CORRECT UCB ADDRESS OF THE DEVICE SPECIFIEDI9; IN THE DPB. INITIALLY, A SEARCH IS MADE TO DETERMINE IFL9; A LOGICAL ASSIGNMENT IS IN EFFECT FOR THE ISSUING TASK.D?; THE LOGICAL ASSIGNMENT MAY BE SYSTEM WIDE (GLOBAL), LOGIN, ORDA; LOCAL TO THE TI: OF THE TASK AS SPECIFIED BY THE "L.TYPE" FIELDI>; 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.;O@; 00ʃibjbkb a a aTHIS CODE TO FIND THE UCB OF THE SPECIFIED DEVICE IS SHARED BY0; THE SON OF GET DEVICE INFORMATION SUBFUNCTION.;S$SFDEV::$ MOV R2,-(SP) ;SAVE EXTRA WORD COUNT- CLR -(SP) ;INITIALIZE SCRATCH WORD IN WHICH ' ;THE 'GI.RED' AND 'GI.ASN' IS SAVEDO. CLR $TEMP0 ;INITIALIZE SCRATCH WORD IN WHICH ;WE WILL SAVE L.TYPE( MOV R3,R1 ;COPY POINTER TO USER BUFFER&10$: CLR (R1)+ ;CLEAR OUT USER BUFFER% DEC R2 ; NOTE THAT USER BUFFER SIZES" BPL 10$ ; IS EXTRA WD. COUNT + 11 MOV (R4)+,R1 ;GET DEVICE NAME (TWO ASCII CHARS.)F/ MOV (R4),R0 ;GET UNIT NUMBER (LOW ORDER BYTE)G% ;AND FLAGS BYTE (HIGH ORDER BYTE) D+ .IF NDF C$$RMT ;IF NO REMOTE TASK SUPPORT0 MOV G.INSF-G.IUNM(R4),R4 ; GET SUBFUNCTION WORD* TST R0 ; RESET CONDITION CODES FOR LATER .IFFN4 BIT #F5.RTK,$FMSK5 ; REMOTE TASK SUPPORT TURNED ON? BNE 11$ ; IF NE, YES0 MOV G.INSF-G.IUNM(R4),R4 ; GET SUBFUNCTION WORD TST R0 ; JMP 44$ ; JOIN NON REMOTE CODE511$: ADD #4,SP ; CLEAN STACK, WILL BE RETURNED LATERG;D"; GET A REQUEST PACKET FROM CPRBUF;4- SUB #12,R4 ; POINT BACK TO BEGINNING OF DPBA" MOV 6(R4),R1 ; GET SIZE OF BUFFER) CMP R1,#44 ; IS IT LARGER THAN MAXIMUM?R BLE 12$ ; IF LE, OKAYR MOV #22,R1 ; SET LENGTH TO 22T+ MOV #22,6(R4) ; SET LENGTH IN DPB ALSO (?)F12$: ASL R1 ; * 2K@ ADD #H$SIZE+14+4,R1 ; ADD SIZE OF HEADER, DPB AND STORAGE AREA + ADD #77,R1 ; ROUND TO NEAREST 32 WD BLOCKT ASH #-6,R1 ;" MOV R2,R5 ; SAVE EXTA WORD COUNT: MOV #AL$BCK!AL$IMP,R0 ; BLOCK THE TASK, DO IMPLICIT START# CALL $CPALO ; ALLOCATE THE BUFFER#;R; FILL IN PACKET;G MOV R0,KISAR6 ; MAP PACKET & MOV #MAP6,R1 ; GET ADDRESS OF PACKET , MOVB #HT$DIR,H$TYPE(R1) ; DIRECTIVE REQUEST CLRB H$ICNT(R1) ; NO ITEMST" ADD #P$DPB,R1 ; POINT TO DPB AREA+ MOV R1,R3 ; SAVE ADDRESS OF DPB IN PACKETA& CLR R0 ; MAKE SURE HIGH BYTE IS ZERO) MOVB 1(R4),R0 ; GET SIZE OF DPB IN WORDST"20$: MOV (R4)+,(R1)+ ; COPY A WORD SOB R0,20$ ; LOOP UNTIL DONE. MOV 4(R3),(R1)+ ; SAVE ADDRESS OF USER BUFFER& MOV R5,(R1)+ ; SAVE EXTRA WORD COUNT + MOV R1,4(R3) ; PUT OFFSET TO BUFFER IN DPBV$ SUB #MAP6,4(R3) ; MAKE IT AN OFFSET" MOV 6(R3),R0 ; GET SIZE OF BUFFER ASL R0 ; IN BYTES ADD R0,R1 ; GET SIZE OF PACKET SUB #MAP6,R1 ; IN BYTES;;I; SEND PACKET TO AME;3 CPSEN$ #SN$DIR,KISAR6,R1 ;E; GET ADDRESS OF USER BUFFER;Y MOV R0,KISAR6 ; MAP PACKETG" MOV #MAP6+P$DPB,R3 ; POINT TO DPB+ MOV 14(R3),R0 ; GET ADDRESS OF USER BUFFER , CALL $RELOC ; GET BIAS AND OFFSET IN R1,R2;U; GET RESULTS ; , MOV #MAP6,R4 ; POINT TO BEGINNING OF PACKET) CMP #IS.SUC,H$STAT(R4) ; DID IT SUCCEED?4 BEQ 30$ ; IF EQ YEST) CMP #IE.IDU,H$STAT(R4) ; INVALID DEVICE?R/ BEQ 25$ ; IF EQ, SETUP TO CHECK LOCAL DEVICES MOV KISAR6,R0 ; GET PACKET BIAS- CALLR $CPDEA ; DEALLOCATE PACKET AND RETURNR;.; ILLEGAL DEVICE RETURNED, CHECK LOCAL DEVICES$; R1,R2 - BIAS OFFSET OF USER BUFFER ; R3 - POINTER TO DPB IN PACKET;T25$:$ MOV 2(R3),R4 ; GET SUBFUNCTION WORD7 CLR $TEMP0 ; MAKE SURE $TEMP0 HASN'T BEEN MUCKED WITH#( MOV 16(R3),-(SP) ; GET EXTRA WORD COUNT# CLR -(SP) ; GET BACK SCRATCH WORDD( MOV R1,-(SP) ; SAVE BIAS OF USER BUFFER# MOV R2,-(SP) ; SAVE BUFFER ADDRESS$$ MOV 10(R3),-(SP) ; SAVE DEVICE NAME$ MOV 12(R3),-(SP) ; AND UNIT NUMBER MOV KISAR6,R0 ; GET PACKET BIAS! CALL $CPDEA ; DEALLOCATE PACKETR MOV (SP)+,R0 ; GET UNIT NUMBER1 MOV (SP)+,R1 ; AND DEVICE NAME" MOV (SP)+,R3 ; GET BUFFER ADDRESS# MOV (SP)+,KISAR6 ; MAP USER BUFFERO TST R0 ; JMP 44$ ; JOIN COMMON CODE; 5; SUCCESS RETURNED, COPY INFORMATION INTO USER BUFFERC$; R1,R2 - BIAS OFFSET OF USER BUFFER ; R3 - POINTER TO DPB IN PACKET;E30$: R" MOV 6(R3),R0 ; GET SIZE OF BUFFER ASL R0 ; IN BYTES D;WE COULD CHECK THAT THE BUFFER IS AT LEAST 12 BYTES, BUT WHY BOTHERG; IF THE WORD HAPPENS TO BE $I OR $O WE'RE JUST MUCKING OUR OWN BUFFER CMP #"$I,30(R3) ; IS DEVICE $I? BEQ 31$ ; IF EQ YES( CMP #"$O,30(R3) ; IS DEVICE $O? BNE 33$ ; IF NE NO,31$: MOV $TKTCB,R5 ; GET TCB ADDRESS OF TASK MOV T.UCB(R5),R00҃Et__DATADATADATADATA5 ; GET TI: UCBO MOV U.DCB(R5),R4 ; GET TI: DCB# MOV D.NAM(R4),30(R3) ; CHANGE NAME> MOVB U.UNIT(R5),32(R3) ; GET UNIT NUMBER FROM UCB (ASSUME HT)# CMP #"VT,D.NAM(R4) ; IS THIS A VT? $ BNE 33$ ; IF NE, U.UNIT IS CORRECT2 MOVB D.UNIT(R4),32(R3) ; IF VT, D.UNIT IS CORRECT33$:+ MOV 4(R3),-(SP) ; BIAS OF BUFFER IN PACKETE% MOV R1,R3 ; GET BIAS OF DESTINATIONB MOV R2,R4 ; AND OFFSET# MOV KISAR6,R1 ; GET SOURCE BIAS MOV (SP)+,R2 ; AND OFFSETC& ADD #120000,R2 ; MAKE IT AN APR5 BIAS+ CALL $BLXIO ; COPY INFO INTO USER BUFFER MOV KISAR6,R0 ; GET PACKET BIAS- CALLR $CPDEA ; DEALLOCATE PACKET AND RETURNN;N; COMMON CODE WITH LOCAL GI.DEV#; ; AT THIS POINT:; R1 - DEVICE NAME ; R0 - UNIT NUMBER/; R3 - ADDRESS OF USER BUFFER (MAPPED IN APR6)R&; R4 - WORD CONTAINING SUBFUNTION CODE; 2(SP) - EXTRA WORD COUNT ; (SP) - SCRATCH WORD44$: .ENDC ; C$$RMTO: ASSUME GI.NAS, 200 ;ASSUME THAT THE "INHIBIT ASSIGNMENTS" ;FLAG IS THE SIGN BIT * ASSUME G.IDFG, G.IDUN+1 ;IN THE HIGH BYTE% BMI 57$ ;IF MI, INHIBIT ASSIGNMENTS09 BIT #T3.SLV,T.ST3(R5) ;IS THE ISSUING TASK A SLAVE TASK?R( BNE 57$ ;IF NE, YES..AVOID ASSIGNMENTS .IF DF L$$GCL8 MOV R3,-(SP) ;SAVE THE BUFFER ADDRESS ACROSS PROCESSING1 MOV R1,-(SP) ;SAVE THE DEVICE MNEMONIC FOR LATERR4 MOV T.UCB(R5),R1 ;GET THE UCB ADDRESS FOR THIS TASK6 CALL $GTUSR ;GET THE USER LOGICAL HASH TABLE ADDRESS* MOV (SP)+,R2 ;RESTORE THE DEVICE MNEMONIC- CALL $LNTD1 ;DO RECURSIVE LOOKUP FOR DEVICEM# BCC 45$ ;IF CC, SUCCESSFUL LOOKUP$ TST R3 ;SEE IF NO LOGICAL OR ERROR6 BNE 40$ ;IF NE, BAD LOGICAL OR RECURSION LIMIT ERROR BR 50$ ;NO LOGICAL EXISTS.545$: MOV KISAR6,-(SP) ;SAVE APR6 MAPPING FOR A MOMENTS MOV R3,KISAR6 ;MAP THE LNB E MOVB MAP6+L.NTBL,$TEMP0 ;SAVE THE TABLE NUMBER FOR THE OUTPUT BUFFERU' MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPINGA0 INC 2(SP) ;INDICATE AN ASSIGNMENT WAS FOLLOWED( BR 55$ ;GO FIND UCB IN PHYSICAL TABLES .IFF ;DF L$$GCL5 MOV #$LOGHD,R2 ;GET LOGICAL ASSIGNMENT LIST LISTHEAD 920$: MOV (R2),R2 ;POINT TO NEXT LOGICAL ASSIGNMENT BLOCKB BEQ 50$ ;IF EQ, END OF LISTR5 MOVB L.TYPE(R2),$TEMP0 ;IS THIS A GLOBAL ASSIGNMENT?:' ;SAVE TYPE TO RETURN TO USER LATER.A" ;(NOTE, L.TYPE MUST BE USED IN) ;CONJUNCTION WITH THE "GI.ATT" STATUSE( ;BIT SINCE L.TYPE IS ZERO FOR GLOBAL ;ASSIGNMENTS.)( BEQ 30$ ;IF EQ YES, DO NOT CHECK L.UCB: CMP L.UCB(R2),T.UCB(R5) ;VALID ASSIGNMENT FOR TASK'S TI:? BNE 20$ ;IF NE NO)30$: CMP R1,L.NAM(R2) ;DEVICE NAME MATCH?I BNE 20$ ;IF NE NOV' CMPB R0,L.UNIT(R2) ;UNIT NUMBER MATCH?N BNE 20$ ;IF NE NOI- MOV L.ASG(R2),R1 ;GET ASSIGNMENT UCB ADDRESS  ASSUME GI.ASN,1/ INC (SP) ;INDICATE AN ASSIGNMENT WAS FOLLOWED ) BR 70$ ;GO FINISH RESOLVING DEVICE NAMEU .IFTF ;DF L$$GCLT40$:% .IF DF C$$RMT ; REMOTE TASK SUPPORTL4 BIT #F5.RTK,$FMSK5 ; REMOTE TASK SUPPORT TURNED ON? BEQ 48$ ; IF EQ NO1 RETURN ; KX DRIVER HAS ALREADY RETURNED STATUSE48$: .ENDC, DRSTS D.RS92 ; RETURN INVALID DEVICE ERROR;2?; AT THIS POINT, WE MUST CHECK THE SYSTEM DEVICE TABLES FOR THE$B; A DEVICE WITH THE NAME SPECIFIED IN THE DPB SINCE FOR ONE REASON?; OR ANOTHER THE SCAN OF THE LOGICAL ASSIGNMENTS CAME UP EMPTY.B; A CALL TO $CVDVN WILL NOT FUNCTION CORRECTLY AT THIS POINT SINCE3; PSEUDO DEVICES ARE IGNORED BY THE $SCDVT ROUTINE.#;R650$: CLR $TEMP0 ;INIT WORD CONTAINING ASSIGNMENT TYPE) ;SINCE WE EITHER COULDN'T FIND ONE OR 55$: .IFT ;DF L$$GCL6 MOV R2,R1 ;RESTORE DEVICE MNEMONIC FOR PHYSICAL SCAN0 MOV (SP)+,R3 ;RESTORE THE OUTPUT BUFFER ADDRESS .ENDC ;DF L$$GCL %57$: MOV #$DEVHD,R2 ;GET DCB LISTHEADP# ;(PHYSICAL SYSTEM DEVICE TABLE)T60$: MOV (R2),R2 ;GET NEXT DCBS) BEQ 40$ ;IF EQ, DEVICE IS NOT IN SYSTEMO% CMP R1,D.NAM(R2) ;DEVICE NAME MATCH?E BNE 60$ ;IF NE NOE< CMPB R0,D.UNIT(R2) ;IS THIS THE DCB FOR THE SPECIFIED UNIT? BLO 60$ ;IF LO NOG CMPB R0,D.UNIT+1(R2) ;REALLY? BHI 60$ ;IF HI NO 3 SUB D.UNIT(R2),R0 ;CONVERT TO RELATIVE UNIT NUMBERC' BIC #177400,R0 ;CLEAR MUNGED HIGH00ڃibjbkb a a a BYTER. MOV D.UCBL(R2),R1 ;GET LENGTH OF UCB IN BYTES- CALL $MUL ;CALCULATE OFFSET FOR DESIRED UCBH+ ADD D.UCB(R2),R1 ;CALCUALTE ADDRESS OF UCB0;ME; AT THIS POINT, WE'VE FOUND A RAW UCB. THAT IS TO SAY, THE REDIRECTSD; HAVE NOT BEEN FOLLOWED AND THE VIRTUAL TERMINAL CHECK HAS NOT BEENA; PERFORMED. ONLY THE PARENT OR OFFSPRING TASK OF A GIVEN VT UNIT B; MAY RETRIEVE INFO ON THE UNIT SINCE THEIR EXISTENCE IS ACCOUNTED; FOR IN THE VT USE COUNT.;V ; CURRENTLY:; R1 = RAW UCB ADDRESSM; R3 = POINTER TO USER BUFFER2; R5 = TCB ADDRESS OF ISSUING TASK (ALSO CURRENT); 2(SP) = EXTRA WORD COUNT; (SP) = SCRATCH STATUS WORD;S70$: .IF DF V$$TRM7 ASSUME U.DCB,0 ;ASSUME THAT THE FIRST WORD OF THE UCB ;IS THE POINTER TO THE DCB" MOV (R1),R2 ;POINT TO UNIT'S DCB6 CMP D.NAM(R2),#"VT ;IS THE DEVICE A VIRTUAL TERMINAL? BNE 80$ ;IF NE NOE/ CMP U.PTCB(R1),R5 ;IS ISSUING TASK THE PARENT?A BEQ 80$ ;IF EQ YES0 CMP R1,T.UCB(R5) ;IS ISSUING TASK AN OFFSPRING?! BNE 40$ ;IF NE NO, RETURN ERRORU .ENDC ;V$$TRM%80$: MOV R1,R0 ;COPY RAW UCB ADDRESSS& CALL $MPLND ;MAP TO REAL UCB ADDRESS! CMP R1,R0 ;WAS UNIT REDIRECTED?  BEQ 90$ ;IF EQ, NO/ BIS #GI.RED,(SP) ;REMEMBER UNIT WAS REDIRECTED 90$:;OK; THE GET DEVICE INFORMATION AND SON OF GET DEVICE INFORMATION SUBFUNCTIONS ; DIVERGE AT THIS POINT.;?/ CMPB #6,R4 ; IS IT "GET DEVICE INFORMATION"?S BEQ 91$ ; YES, CONTINUE.8+ JMP $SFDVJ ; NO, USE THE JUNIOR VERSION. 91$:;F:; NOW THAT WE HAVE A "REAL" UCB ADDRESS, THE DEVICE STATUS@; RETURNED IN "G.IDEV" IS DETERMINED. ALONG THE WAY, THE USER'SB; VARIABLE LENGTH BUFFER IS FILLED IN WHEN NEEDED AND IF POSSIBLE.;I2 MOVB U.STS(R0),(R3)+ ; PLACE U.STS IN USER BUFFER MOVB U.ST2(R0),R1 ;* MOVB R1,(R3)+ ;PLACE U.ST2 IN USER BUFFER+ BIC #CLRMSK,-(R3) ;CLEAR OUT UNNEEDED BITST& 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 STATUS5 BIS (SP)+,(R3) ;'OR' IN ASSIGNMENT AND REDIRECT INFOT( 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 WORDSM& CALL XMIT ;COPY U.CW1 TO USER BUFFER" MOV U.PRM(R0),R1 ;DITTO FOR U.PRM CALL XMIT ;R& MOV U.PRM+2(R0),R1 ;DITTO FOR U.PRM+2 CALL XMIT ;S( MOV R0,R1 ;RETURN 'TARGET' DEVICE NAME100$: CALL DNFILL ;0 BCS 110$ ;IF CS, NO USER BUFFER ROOM TO RETURN ;L.TYPE INFO+ MOVB $TEMP0,-1(R3) ;RETURN ASSIGNMENT INFOU+110$: MOV U.ATT(R0),R1 ;IS DEVICE ATTACHED?L BEQ 120$ ;IF EQ NO BIS #GI.ATT,(R5) ;TELL ISSUER0 CMP R1,(SP) ;IS IT THE ISSUER WHO IS ATTACHED? BNE 120$ ; NO, DO NOT SET BIT.- BIS #GI.ATU,(R5) ;RETURN THIS STATUS AS WELLV0120$: CALL TNFILL ;RETURN TASK NAME OF ATTACHEE MOV (SP)+,R2 ;GET ISSUER'S TCBM' MOV U.OWN(R0),R1 ;IS DEVICE ALLOCATED?T BEQ 130$ ;IF EQ NO BIS #GI.ALL,(R5) ;RETURN STATUS1 CMP T.UCB(R2),R1 ;IS ALLOCATOR THE ISSUER'S TI:?O BNE 130$ ;IF NE NO- BIS #GI.ALU,(R5) ;RETURN THIS STATUS AS WELL13130$: CALL DNFILL ;RETURN DEVICE NAME OF ALLOCATORI MOV U.SCB(R0),R1 ;VIA THE SCB..' MOV S.KRB(R1),R1 ;GET THE DEVICE'S KRBB. BEQ 140$ ;IF EQ, CANN'T DETERMINE CONTROLLER ;STATUS.8 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 USERA/140$: MOV U.DCB(R0),R1 ;CHECK IF DRIVER LOADED?5 TST D.DSP(R1) ;LOADED?U BNE 150$ ;IF NE YES BIS #GI.UNL,(R5) ;RETURN STATUS' BR 190$ ;NOTHING MORE TO RETURN..EXITA'150$: COM (SP) ;COMPLEMENT SAVED U.CW1D< 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 VCB,0 BEQ 190$ ;BAIL OUT..CAN'T TOUCH U.ACP TILL VCB ;SET UP;) MOV U.ACP(R0),R1 ;GET TCB ADDRESS OF ACPE2 CALL TNFILL ;SO ACP NAME CAN BE RETURNED TO US00Et__DATADATADATADATAER4 BIT #DV.SQD,(SP) ;IS DEVICE AN ANSI LABLED MAGTAPE?3 BNE 155$ ;IF NE NO (COPY OF U.CW1 IS COMPLEMENTEDR ;ON STACK)' BITB #US.LAB,U.STS(R0) ;IS IT "LABLED"W BEQ 155$ ;IF EQ NO BIS #GI.LAB,(R5) ;RETURN STATUSB155$: CMP R4,#/2 ;USER BUFFER BIG ENOUGH FOR LABLE? BLT 190$ ;IF LT NO ADD #V.LABL,R2 ;POINT TO LABLEC/ MOV (R2)+,(R3)+ ;COPY FIRST SIX BYTES OF LABLEI MOV (R2)+,(R3)+ ; MOV (R2)+,(R3)+ ;, BIT #GI.LAB,(R5) ;IS IT A LABLED ANSI TAPE? BEQ 180$ ;IF EQ NO9 MOV V.MVL(R0),R1 ;POINT TO FIRST MOUNTED VOL. LIST ENTRYP3 BEQ 180$ ;IF EQ THERE ISN'T ONE,JUST RETURN LABELE9160$: CMP M.UCB(R1),R0 ;DEVICE UCB MATCH WITH THIS ENTRY?W BEQ 170$ ;IF EQ YES& MOV M.NXT(R1),R1 ;GET NEXT LIST ENTRY BNE 160$ ;CONTINUE SCANU1 BR 180$ ;ELSE AT END OF LIST..JUST RETURN LABLE .170$: MOV R1,R2 ;COMPUTE ADDRESS OF VOLUME ID ADD #M.VIDP,R2 ;S4180$: MOV (R2)+,(R3)+ ;FINISH RETURNING VOLUME LABLE MOV (R2)+,(R3)+ ;OR VOLUME ID MOV (R2)+,(R3)+ ;190$: TST (SP)+ ;CLEAN STACKL )! .IF DF C$$RMT ; IF REMOTE TASKSS$ BIC #1,$UMPS ; CLEAR USER CARRY BIT0 MOV #IS.SUC,-(SP) ; PUT SUCCESS STATUS ON STACK5 MTPD$ @#H.DSW ; PUT STATUS IN DIRECTIVE STATUS WORD .ENDC ; C$$RMT  RETURN ;ALL DONE..RETURN .ENABLE LSB-TNFILL: TST R1 ;WAS A TCB ADDRESS SPECIFIED? ' BEQ 20$ ;IF EQ NO..GO ADJUST POINTERSL/ MOV T.NAM+2(R1),-(SP) ;GET SECOND HALF OF NAME ! MOV T.NAM(R1),R1 ;AND FIRST HALFV BR 10$ ;DNFILL:M& 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 WORD4 SUB (R2)+,R1 ;CALCULATE OFFSET INTO CONTIGUOUS UCBS! MOV (R2)+,-(SP) ;GET DEVICE NAMEV- MOV (R2)+,-(SP) ;GET LOW LOGICAL UNIT NUMBER  MOV (R2)+,R2 ;GET UCB SIZEE-5$: SUB R2,R1 ;DETERMINE LOGICAL UNIT NUMBERE BMI 6$ ; INC (SP) ; BR 5$ ;U!6$: MOV 2(SP),R1 ;GET DEVICE NAME) MOV (SP)+,(SP) ;CLEAN UP STACKT5 BIC #^C<377>,(SP) ;CLEAR OUT HIGH ORDER GARBAGE BYTET.10$: CALL XMIT ;FILL IN A WORD IN USER BUFFER MOV (SP)+,R1 ;GET NEXT WORDXMIT: CLC ;ASSUME SUCCESST% DEC R4 ;ENOUGH ROOM IN USER BUFFER?  BMI 40$ ;IF MI NOO) MOV R1,(R3)+ ;RETURN WORD TO USER BUFFERI BR 30$ ;EXIT GRACEFULLY;"20$: SUB #2,R4 ;ADJUST WORD COUNT+ BMI 40$ ;IF MI WE'RE AT THE END OF BUFFERM ADD #4,R3 ;ADJUST POINTERI30$: TST (PC)+ ;RETURN SUCCESS40$: SEC ;RETURN ERROR STATUS) RETURN ;( .DSABL LSBT;+); **-$SFDVJ-SON OF GET DEVICE INFORMATIONT;=; THIS GIN SUBFUNCTION RETURNS INFORMATION ABOUT A PARTICULARG=; DEVICE. THE DPB AND METHOD OF DETERMINING THE DEVICE TO BEO6; EXAMINED ARE IDENTICAL TO THE GET DEVICE INFORMATION?; SUBFUNCTION, EXCEPT THAT THE SUBFUNCTION IS 18 RATHER THAN 6.B;,7; THE CURRENT MINIMUM AND MAXIMUM BUFFER LENGTH IS ONE. ;B=; INPUT AT THIS POINT (AFTER COMMON PROCESSING IN $SFDEV) IS:U;S#; R1 -- UCB OF DEVICE TO BE CHECKED ; R3 -- POINTER TO USER'S BUFFER%; R5 -- POINTER TO ISSUING TASK'S TCB :; STACK -- TWO UNNEEDED WORDS ARE ON THE STACK (ALONG WITH1; THE RETURN ADDRESS AND REMAINING INFORMATION). ;D; OUTPUT IN THE USER BUFFER IS:X;N ; FIRST WORD:L:; NEGATIVE -- CODE INDICATING WHY DEVICE CANNOT CURRENTLY$; BE ACCESSED AS A MOUNTED DEVICE.<; NON-NEGATIVE -- BITS DESCRIBING ACCESS TO MOUNTED DEVICE:+; BITS 0 TO 3: WHICH TYPES OF ACCESS ARES*; PROHIBITED (R, W, E, D, LOW TO HIGH),; BIT 4: DEVICE IS PUBLIC,N*; BIT 5: DEVICE IS ALLOCATED TO ISSUER,"; BIT 6: DEVICE IS FOREIGN, AND*; BIT 7: THE FOREIGN DEVICE HAS AN ACP.0; NOTE THAT BITS 4 AND 5 OFF TOGETHER INDICATE0; THE DEVICE IS MOUNTED BY THE ISSUER, BUT NOT; ALLOCATED OR PUBLIC.;-; DEFINE PROTECTION BITS.RR = 000001 ; READW = 000002 ; WRITECC = 000004 ; CREATED = 000010 ; DELETE; DEFINE OTHER BITS.$GJ.PUB = 000020 ; DEVICE IS PUBLIC.1GJ.ALL = 000040 ; DEVICE IS PRIVATE (ALLOCATED).%GJ.FOR = 000100 ; DEVICE IS FOREIGN. *GJ.ACP = 000200 ; FOREIGN DEVICE HAS ACP.; DEFINE OTHER CODES.A=GJ.NMM = -1 ; DEVICE IS NOT BOTH MASS00ibjbkb a a a-STORAGE AND MOUNTABLE.I0GJ.NMO = -2 ; DEVICE IS NOT MOUNTED FOR ISSUER. O$SFDVJ:T- MOV R0,R1 ; PUT UCB IN PREFERRED REGISTER.-5 CMP (SP)+,(SP)+ ; POP UNNEEDED BITS AND WORD COUNT. 4 MOV U.CW1(R1),R0 ; GET FIRST CHARACTERISTICS WORD." COM R0 ; REVERSE SENSE OF BITS.6 BIT #DV.MNT!DV.MSD,R0 ; IS IT NOT MASS STORAGE OR NOT ; MOUNTABLE?A BNE 90$ ; YES, RETURN CODE.0 BITB #US.MNT,U.STS(R1) ; IS DEVICE NOT MOUNTED?% BNE 95$ ; YES, THERE IS NO ACCESS.M: MOV #GJ.PUB,(R3) ; ASSUME PUBLIC UNTIL PROVEN OTHERWISE.+ BITB #US.PUB,U.ST2(R1) ; IS DEVICE PUBLIC?., BNE 20$ ; YES, SKIP REST OF MOUNT CHECKS.; MOV #GJ.ALL,(R3) ; ASSUME PRIVATE UNTIL PROVEN OTHERWISE.O2 MOV T.UCB(R5),R0 ; GET ISSUER'S TI: UCB ADDRESS.3 CMP U.OWN(R1),R0 ; DOES ISSUER HAVE IT ALLOCATED?T) BEQ 20$ ; YES, IT IS MOUNTED FOR USER. & TST U.OWN(R1) ; IS DEVICE ALLOCATED?1 BNE 95$ ; YES, DEVICE IS NOT MOUNTED FOR USER.V& CLR (R3) ; IT MUST BE SEMI-PRIVATE.. BIT #T3.PRV,T.ST3(R5) ; IS ISSUER PRIVILEGED?) BNE 20$ ; YES, IT IS MOUNTED FOR USER.,+ MOV #$MOULS,R2 ; GET START OF MOUNT LIST.Y10$: MOV (R2),R2 ; GET NEXT ENTRY., BEQ 95$ ; DEVICE IS NOT MOUNTED FOR USER.1 CMPB #MT.MLS,M.TYPE(R2) ; CORRECT TYPE OF ENTRY?D BNE 10$ ; NO, GO ON TO NEXT. 9 CMP M.DEV(R2),R1 ; IS IT THE DEVICE WE ARE LOOKING FOR?  BNE 10$ ; NO, GO ON.)1 CMP M.TI(R2),R0 ; IS THIS ENTRY FOR OUR ISSUER?I BNE 10$ ; NO, GO ON."; DEVICE IS MOUNTED FOR THIS USER.20$:4 BITB #US.FOR,U.STS(R1) ; IS DEVICE MOUNTED FOREIGN?) BEQ 100$ ; NO, HANDLE FILES-11 DEVICE.M. BIS #GJ.FOR,(R3) ; YES, REPORT THAT TO USER." TST U.ACP(R1) ; IS THERE AN ACP? BEQ 80$ ; NO, LEAVE.T& BIS #GJ.ACP,(R3) ; YES, REPORT THAT.80$: BR 99$ ; RETURN WITH STATUS90$: 6 MOV #GJ.NMM,(R3) ; INDICATE DEVICE IS NOT MOUNTABLE. BR 99$ ; RETURN WITH STATUS95$:7 MOV #GJ.NMO,(R3) ; INDICATE DEVICE IS NOT MOUNTED FOR99$: $" .IF DF C$$RMT ; IF REMOTE TASKS% BIC #1,$UMPS ; CLEAR USER CARRY BITT1 MOV #IS.SUC,-(SP) ; PUT SUCCESS STATUS ON STACKO6 MTPD$ @#H.DSW ; PUT STATUS IN DIRECTIVE STATUS WORD .ENDC ; C$$RMT ; USER. RETURNE100$:C. BIT #T3.PRV,T.ST3(R5) ; IS ISSUER PRIVILEGED?/ BNE 190$ ; YES, THEY CAN DO ALMOST ANYTHING.T MOV KISAR6,-(SP) ; SAVE APR.! MOV $SAHDB,KISAR6 ; MAP HEADER.A( MOV $SAHPT,R2 ; GET ADDRESS OF HEADER.& MOV H.DUIC(R2),R0 ; GET DEFAULT UIC.3 MOV H.CUIC(R2),R2 ; GET CURRENT (PROTECTION) UIC.O! MOV (SP)+,KISAR6 ; RESTORE APR.U' CLR -(SP) ; ASSUME NO SYSTEM ACCESS. 3 CMP R2,#10*400+377 ; IS ISSUER IN A SYSTEM GROUP?U1 BHI 120$ ; NO, DO NOT GIVE THEM SYSTEM ACCESS. ! INC (SP) ; FLAG SYSTEM ACCESS.3120$:S: MOV U.VCB(R1),R4 ; GET LOCATION OF VOLUME CONTROL BLOCK.6 BIT #FE.MUP,$FMASK ; IS THIS A MULTI-USER PROTECTION ; SYSTEM?# BEQ 140$ ; NO, SKIP USER CHECKS.E7 CMP T.UCB(R5),U.OWN(R1) ; DOES ISSUER OWN THIS DEVICE?I+ BEQ 130$ ; YES, GIVE THEM SYSTEM ACCESS.T TST (SP) ; SYSTEM GROUP? + BNE 140$ ; YES, SKIP VOLUME OWNER CHECK.S3 CMP T.UCB(R5),V.VOWN(R4) ; DOES ISSUER OWN VOLUME?Y- BNE 140$ ; NO, DO NOT GRANT SYSTEM ACCESS.M130$: , INC (SP) ; THIS ISSUER HAS SYSTEM ACCESS. MOV R0,R2 ; USE DEFAULT UIC.L140$:  SWAB R2 ; REFORMAT UIC.' MOV V.VOWN(R4),R0 ; GET VOLUME OWNER. , MOV V.VPRO(R4),R4 ; GET VOLUME PROTECTION. SWAB R0 ; REFORMAT UIC.! COM R4 ; CHANGE SENSE OF BITS.T/ TSTB (SP)+ ; DOES ISSUER HAVE SYSTEM ACCESS? / BNE 150$ ; YES, DO NOT REFUSE SYSTEM ACCESS. 0 CMPB R2,#10 ; DOES ISSUER HAVE SYSTEM ACCESS?0 BLOS 150$ ; YES, DO NOT REFUSE SYSTEM ACCESS.3 BIC #R!W!C!D,R4 ; ELIMINATE SYSTEM ACCESS RIGHTS.P150$:H CMP R2,R0 ; IS ISSUER OWNER?V. BEQ 160$ ; YES, DO NOT REFUSE OWNER ACCESS.6 BIC #*20,R4 ; ELIMINATE OWNER ACCESS RIGHTS.160$:V+ CMPB R0,R2 ; IS ISSUER IN OWNER'S GROUP?A. BEQ 170$ ; YES, DO NOT REFUSE GROUP ACCESS.7 BIC #*400,R4 ; ELIMINATE GROUP ACCESS RIGHTS.S170$:E% MOV R4,-(SP) ; COPY REMAINING BITS.E* SWAB (SP) ; MOVE HIGH BYTE TO LOW BYTE.*00Et__DATADATADATADATA BIS R4,(SP) ; MERGE HIGH AND LOW BYTES. MOV (SP),R4 ; COPY RESULT.,+ ASR R4 ; MOVE HIGH NYBBLE TO LOW NYBBLE.H ASR R4 ; ASR R4 ;O ASR R4 ;1, BIS (SP)+,R4 ; MERGE HIGH AND LOW NYBBLES.# COM R4 ; RESTORE ORIGINAL SENSE.C3 BIC #^C,R4 ; GET RID OF EXTRANEOUS BITS.N BR 200$190$:Q# CLR R4 ; GIVE ISSUER EVERYTHING.C200$:B- BIT #DV.SWL,U.CW1(R1) ; DEVICE WRITE-LOCKED?I# BEQ 210$ ; NO, LEAVE BITS ALONE. . BIS #W!C!D,R4 ; ONLY READ ACCESS IS ALLOWED.210$:B. BIS R4,(R3) ; PASS DENIED ACCESSES TO USER. JMP 99$ ; RETURN WITH STATUS R;+; **-$SFAPR-GET TASK APRSB;HC; THIS SUBFUNCTION FILLS A 97. WORD BUFFER WITH THE CONTENTS OF THEGE; PARS/PDRS FOR ALL THE SPACES. THE FIRST WORD INDICATES WHICH OF THEC!; SUBSEQUENT WORDS ARE FILLED IN.S;; SPACE WORD 0. BIT&; ----------------------- -----------;T*; KERNEL I SPACE PAR'S (UNCONDITIONAL)*; KERNEL I SPACE PDR'S (UNCONDITIONAL)#; KERNEL D SPACE PAR'S (000001)E#; KERNEL D SPACE PDR'S (000001)I*; USER I SPACE PAR'S (UNCONDITIONAL)*; USER I SPACE PDR'S (UNCONDITIONAL)#; USER D SPACE PAR'S (000002)A#; USER D SPACE PDR'S (000002) #; SUPER I SPACE PAR'S (000004) #; SUPER I SPACE PDR'S (000004)C#; SUPER D SPACE PAR'S (000004)#; SUPER D SPACE PDR'S (000004)-;- ; DPB FORMAT:-;-"; WD. 00 -- DIC(169.),DPB SIZE(4.) ; WD. 01 -- SUBFUNCTION CODE (9); WD. 02 -- BUFFER ADDRESS ; WD. 03 -- BUFFER SIZE IN WORDS; ; INPUTS: ;A); R3=ADDRESS OF FIRST WORD OF USER BUFFERA ; R5=TCB ADDRESS OF CURRENT TASK;A ; OUTPUTS:;O$; THE BUFFER IS FILLED WITH THE APRS;- MASK = 0R .IIF DF K$$DAS, MASK=MASK!1 .IIF DF U$$DAS, MASK=MASK!2 .IIF DF S$$LIB, MASK=MASK!48$SFAPR::MOV #MASK,(R3)+ ;INSERT MASK OF WHAT WILL FOLLOW' MOV #$APRTB,R0 ;GET TABLE OF ADDRESSESP'10$: MOV (R0)+,R1 ;GET NEXT APR ADDRESS  BEQ 20$ ;IF EQ END OF LIST! MOV (R1)+,(R3)+ ;MOVE A REGISTERD! MOV (R1)+,(R3)+ ;MOVE A REGISTERR! MOV (R1)+,(R3)+ ;MOVE A REGISTERS! MOV (R1)+,(R3)+ ;MOVE A REGISTER5! MOV (R1)+,(R3)+ ;MOVE A REGISTER ! MOV (R1)+,(R3)+ ;MOVE A REGISTERD! MOV (R1)+,(R3)+ ;MOVE A REGISTER.! MOV (R1)+,(R3)+ ;MOVE A REGISTERF BR 10$ ;GO AGAIN20$: RETURN ;,;+); **-SFFTK-FIND TASK AND RETURN TASK INFOA;O7; THIS GIN FUNCTION RETURNS INFORMATION ON A TASK WHICHEB; MAY HAVE ITS TCB IN SECONDARY OR PRIMARY POOL. GIVEN A TASKNAME,B; THIS GIN FUNCTION WILL ATTEMPT TO FIND A TASK AS DESCRIBED BELOW; IN THE $SRTTK ROUTINE.; D; THE INFORMATION IS RETURNED TO A USER BUFFER HAVING A MINIMUM SIZEB; OF TWO WORDS AND A MAXIMUM SIZE OF SIX WORDS. THIS FUNCTION WILLG; RETURN AS MUCH OF THE FOLLOWING INFORMATION AS THE USER BUFFER'S SIZEA ; ALLOWS FOR.R; ; ; DPB FORMAT:K;N; +---------------+K; | 6. | 169. |G; +---------------+N; |SUBFUNCTION=10.|H; +---------------+T; | BUFFER ADDRESS|I; +---------------+S; | BUFFER WDSIZE |N; +---------------+ ; | |; +- TASKNAME -+W; | |; +---------------+ ; ; USER BUFFER FORMAT:R; ; +---------------+ | ; | | |7; +- TASKNAME -+ | THE FIRST TWO WORDS ARE REQUIRED.S; | | |; +---------------+ |O; | T.STAT |; +---------------+E ; | T.ST2 |A; +---------------+ ; | T.ST3 |T; +---------------+- ; | T.ST4 |.; +---------------+-; | |; +- P.NAM -+.; | |; +---------------+ ;-1$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 TCBT# BCS 30$ ;IF CS TASK NOT INSTALLED|* 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 IT45$: MOV #$TNAME,R1 ;POINT TO TEMP LOCATIONS IN SYSCM" ADD #T.NAM,R0 ;POINT TO TASK NAME8 MOV (R0)+,(R1)+ ;COPY TASKNAME INTO TEMPORARY LOCATIONS MOV (R0)+,(R1)+ ;* ADD #T.STAT-,R0 ;POINT TO T.STAT MOV (R0)+,(R1)+ ;COPY T.STAT  MOV (R0)+,(R1)+00ibjbkb a a a ;COPY T.ST2 MOV (R0),(R1) ;COPY T.ST3# MOV T.ST4-T.ST3(R0),R2 ;COPY T.ST4,# MOV T.PCB-T.ST3(R0),R4 ;COPY T.PCB#7 MOV (SP)+,KISAR6 ;RESTORE APR6 MAPPING ( USER BUFFER )C' MOV (SP)+,R5 ;RESTORE EXTRA WORD COUNTO- MOV (SP)+,R3 ;RESTORE POINTER TO USER BUFFERN$ 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.STAT< DEC R5 ;ROOM FOR MORE?  BMI 20$ ;IF MI NOO MOV (R1)+,(R3)+ ;COPY T.ST2 DEC R5 ;ROOM FOR MORE?  BMI 20$ ;IF MI NO4 MOV (R1)+,(R3)+ ;COPY T.ST3 DEC R5 ;ROOM FOR MORE?  BMI 20$ ;IF MI NOS MOV R2,(R3)+ ;COPY T.ST4 + CMP R5,#2 ;TWO MORE WORDS LEFT FOR P.NAM?W BLT 20$ ;IF LT NO+ MOV P.NAM(R4),(R3)+ ;COPY P.NAM MOV P.NAM+2(R4),(R3)+ 20$: RETURN 330$: DRSTS D.RS2 ;RETURN DIRECTIVE ERROR OF IE.INS;+H; **-$SRTTK-SEARCH FOR PROTOTYPE OR NON-PROTOTYPE OR MULTI-USER TASK TCB;DG; THIS ROUTINE SEARCHES FOR A TCB WHICH IS ASSOCIATED WITH THE TASKNAMES ; AS FOLLOWS:O;F>; IF THE TASKNAME IS OF THE FORM "...XXX" THEN A CHECK IS MADE@; FOR THE MULTI-USER TASKNAME "XXXTNN" WHERE NN IS DERIVED FROM@; THE UCB ADDRESS PASSED IN R0. IF NOT FOUND THEN THE PROTOTYPE; IS SEARCHED FOR.N?; IF THE TASKNAME IS OF THE FORM "XXX$$$" THEN A SEARCH IS MADE0;; ONLY FOR THE PROTOTYPE AS A DIFFERENT FORM OF MULTI-USER*?; TASKNAME EXISTS FOR DECNET PROTOTYPES SINCE THIS NAME IS NOTT ; DERIVED FROM THE UCB ADDRESS.?; IF THE TASKNAME IS OF NEITHER OF THE ABOVE FORMS, A SEARCH OFF;; PRIMARY POOL IS MADE FOR A NON-PROTOTYPE TCB BEARING THEA; TASKNAME SPECIFIED.@; IF THIS TASKNAME COULD NOT BE FOUND AND IT IS LIMITED TO THREE@; CHARACTERS THEN AN ADDITIONAL SEARCH IS MADE FOR A MULTI-USER; TASK OR PROTOTYPE.O;H ; INPUTS:$; (; R3=ADDRESS OF TASK NAME TO SEARCH FOR.;T ; OUTPUTS:;E9; C=1 IF TASK NAME OR THE PERMUTATIONS COULD NOT BE FOUNDT ; 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:;.@; A MULTI-USER TASK NAME WILL BE DERIVED FROM THE UCB ADDRESS OF@; 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? BNE 50$ ;IF NE NO 2 TST (R3) ;DOES 2ND HALF NAME HAVE NAME OF PROTO? BEQ 50$ ;IF EQ NO)% MOV (R3),R1 ;PICK UP PROTOTYPE NAMEI-10$: CALL $SRMUT ;SEARCH FOR MULTI-USER TASK . BCC 90$ ;IF CC FOUND IT AS "XXXTnn"..SUCCESS7 MOV (R3)+,(R3) ;TRY FOR PROTYPE..FORM NAME FROM $TNAMEE MOV #^R...,-(R3) ;INTO "...XXX"420$: CALL $SRPRO ;SEARCH SECONDARY AND PRIMARY POOL' BR 90$ ;ALL THAT CAN BE DONE HAS BEEN 650$: CMP (R3),#^R$$$ ;2ND HALF OF NAME INDICATE DECNET ;OR SPECIAL PROTOTYPE? BNE 60$ ;IF NE NOI, MOV -(R3),R1 ;DOES DECNET PROTO HAVE A NAME) ;ALSO POINT TO BEGINNING OF TASK NAME(/ BEQ 70$ ;IF EQ NO NOT DECNET PROTOTYPE JUST AT ;"$$$" TASKT BR 20$ ;GO FIND IT960$: MOV -(R3),R1 ;POINT TO BEGINNING OF TASKNAME AND GETY+ ;FIRST HALF OF NAME FOR LATER IF NEEDEDR.70$: MOV R0,R2 ;SAVE POSSIBLE TI: UCB POINTER4 CALL $SRSTD ;SEARCH PRIMARY POOL FOR NON-PROTOTYPE+ BCC 90$ ;IF CC FOUND IT .. RETURN SUCCESS MOV R2,R0 ;RESTORE UCB ADDRESS TST 2(R3) ;3 CHAR NAME ONLY?. BEQ 10$ ;IF EQ YES TREAT IT AS THE NAME OF A ;PROTOTYPE+80$: SEC ;COULDN'T FIND IT RETURN FAILURE790$: RETURN ;ALL DONEP .IFTF ; DF R$$PRO .IF DF P$$3XX;+*; **-$SFCFG-GET SYSTEM CONFIGURATION TABLE; 7; THIS DIRECTIVE RETURNS THE SYSTEM CONFIGURATION TABLEF:; TO A USER BUFFER, TURNING IT UPSIDE DOWN IN THE PROCESS!?; THE TABLE IS VARIABLE LENGTH LOCATED AT THE HIGHEST AVAILABLE C; ADDRESS OF MEMORY DOWNWARDS. THE BYTE DESCRIBING THE SIZE OF THIST@; TABLE IS AT THE HIGHEST ADDRESS. THIS DIRECTIVE WILL RETURN AS6; MUCH OF TH00Et__DATADATADATADATAE TABLE THAT WILL FIT IN THE USER'S BUFFER;R ; DPB FORMAT::;T!; WD 00 -- DIC(169.),DPB SIZE(4.)$!; WD 01 -- SUBFUNCTION CODE (12.)$; WD 02 -- BUFFER ADDRESSI; WD 03 -- BUFFER SIZE IN WORDST;S ; INPUTS: ;F&; R2 =NUMBER OF WORDS IN USER BUFFER-1; R3 =APR6 USER BUFFER ADDRESS;! ; OUPUTS:L;S4; THE USER'S BUFFER IS FILLED WITH THE REUESTED INFO2; THE DSW CONTAINS THE NUMBER OF WORDS TRANSFERRED;-$SFCFG:: INC R2 ;CORRECT WORD COUNT. BIT #H2.BRG,$HFMSK+2 ;IS THIS A PROFESSIONAL? BNE NOTPRO ;IF NE NO0 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 NO CMP P.NAM+2(R0),#^RTBL ;MAYBE BNE 10$ ;IF NE NO TRY NEXT( MOV P.REL(R0),R1 ;GET BASE OF PARTITION% MOV P.SIZE(R0),R0 ;GET SIZE OF TABLEO' ASH #5,R0 ;CONVERT TO NUMBER OF WORDST2 CMP R0,R2 ;USER EXPECT MORE THAN WE CAN DELIVER? BHIS 20$ ;IF HIS NOS2 MOV R0,R2 ;SET WORD CNT TO CNFTBL PARTITION SIZE(20$: ASL R0 ;CONVERT WD COUNT TO OFFSET ADD #120000,R0 ;ADD KISAR5 BIAS; CMP R0,#140000-64. ;COULD WE BLOW AWAY BIAS TO USER BUFFER BLOS 30$ ;IF LOS NOI( DRSTS D.RS99 ;RETURN ERROR OF 'IE.SDP'530$: MOV R2,2(SP) ;RETURN NUMBER OF WORDS TRANSFERREDT) CALLR $FLIPM ;EXIT TO FLIP MOVE ROUTINE/NOTPRO: DRSTS D.RS92 ;RETURN ERROR OF 'IE.IDU'0 IDROM=173600$SFSSN::- BIT #H2.BRG,$HFMSK+2 ;IS THIS A PROFESSIONALE BNE NOTPRO ;IF NE NO& MOV #IDROM,R0 ;GET ADDRESS OF ID PROM2 MOV #6,R1 ;SET UP LOOP COUNT TO TRANSFER 6 BYTES CLR R2 ;CLEAR VALIDITY FLAGK'10$: MOVB (R0),(R3)+ ;GET A BYTE OF SSN 3 BIS (R0),R2 ;'OR' WITH FLAG TO DETECT A 0 IDVALUEI& ADD #2,R0 ;POINT TO NEXT BYTE OF SSN SOB R1,10$ ;LOOP TILL DONE TST R2 ;SSN ALL ZEROS?4 BEQ NOTPRO ;IF EQ YES, IT COULDN'T HAVE BEEN A PRO RETURN ;RETURN SUCCESSO .ENDC ; DF P$$3XX .IFF ; DF R$$PROB;+F; **-$SFABO - ABORT ALL TASKS CURRENTLY ACTIVE ON A SPECIFIED TERMINAL;,K; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO ABORT ALL TASKS THAT ARE CURRENTLYS-; ACTIVE ON THE TERMINAL SPECIFIED IN THE DPB);3 ; DPB FORMAT:O;S#; WD. 00 -- DIC(169.),DPB SIZE(4.).D,; WD. 01 -- SUBFUNCTION CODE (1) (LOW BYTE).; WD. 02 -- BUFFER ADDRESS.O#; WD. 03 -- BUFFER SIZE (IN WORDS).?;B; BUFFER FORMAT:;,); WD. 00 -- TERMINAL DEVICE NAME IN ASCIIT%; WD. 01 -- OCTAL NUMBER OF TERMINAL ;F ; INPUTS:R; *; R2=NUMBER OF EXTRA WORDS IN USER BUFFER.&; R3=ADDRESS OF WD. 00. OF THE BUFFER.(; R5=TCB ADDRESS OF THE REQUESTING TASK.;AI; THIS ROUTINE WILL TRY TO ABORT ALL TASKS CURRENTLY RUNNING OR ABOUT TO )I; RUN ON A TERMINAL SPECIFIED BY THE ASCII NAME AND OCTAL UNIT NUMBER IN H; THE BUFFER POINTED TO BY R3 IF THAT TASK HAS T3.MCR SET (IE. INITIATEDM; BY MCR AT SOME POINT. ALL OFFSPRING TASKS WILL ALSO BE ABORTED IF THEY CANCJ; BE TRACED BACK TO THE EARLIEST PARENT TASK THAT HAS T3.MCR SET (IE. THE L; OFFSPRING DOES NOT NEED TO HAVE IT SET TO BE ABORTED). A PROMPT PACKET IS J; ISSUED FOR THE TERMINAL BECAUSE T3.MCR WILL BE CLEARED IN DREIF FOR ALL H; TASKS THAT ARE ABORTED HERE. SLAVED TASKS AND THOSE NOT MATCHING THE K; SPECIFIED TI: WILL NOT BE ABORTED EVEN THOUGH THEY MAY HAVE PARENTS THAT TM; WILL BE. PRIVILEGED TASKS WILL BE ABORTED IF THE TERMINAL IS PRIVILEGED. LN; 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.;NI; AN INITIAL PASS IS MADE TO SET T4.CTC FOR ANY TASK THAT HAS T3.MCR SET,EI; DOES NOT HAVE A PARENT, AND MATCHES THE SPECIFIED TI:. THAT TASK WILL EK; ALSO TRY TO BE ABORTED. IF ANY TASKS ARE FOUND IN THIS INITIAL PASS THATLG; HAVE T4.CTC SET, ANOTHER PASS IS MADE THROUGH THE STD. THIS TIME THEVK; PARENTS OFF ALL TASKS ARE CHECKED TO SEE IF THEY HAVE T4.CTC SET. IF SO,TF; THE ORIGINAL (OFFSPRING) TASK ALSO HAS T4.CTC SET AND IS TRIED TO BEK; ABORTED. IF ANY OF THESE TASKS ARE FOUND, ANOTHER PASS THROUGH THE STD IS G; DONE. EVENTUALLY NO TASKS WILL BE FOUND AND PROCESSING 00 ibjbkb a a aIS COMPLETED. J; THIS SCHEME ONLY REQUIRES 1 PASS IF NO TASKS CAN BE ABORTED; IT REQUIRESJ; A MINIMUM OF 2 PASSES IF ANY TASKS MUST BE ABORTED AND MAY REQUIRE UP TOH; N PASSES WHERE N IS THE LONGEST LINKAGE OF ANY RELATIONSHIP CHAIN THAT ; DOESN'T WRAP AROUND ON ITSELF.;H@; (IS A PASS TO CLEAR T4.CTC FOR ANY TASK NOT ABORTED REQUIRED?);- .MCALL ABODF$ ABODF$$SFABO:: .IF DF A$$CLI&C$$CTCF9 BIT #T3.PRV!T3.CLI,T.ST3(R5) ;IS TASK PRIVILEGED OR CLI?O BNE 10$ ;IF NE, YESD# DRSTS D.RS16 ;PRIVILEGE VIOLATIONH+10$: MOV (R3)+,R0 ;GET ASCII NAME OF DEVICEB$ MOV (R3),R1 ;GET OCTAL UNIT NUMBER1 CALL $CVDVN ;CONVERT DEVICE NAME TO UCB ADDRESSU BCC 20$ ;IF CC, SUCCESSFUL"15$: DRSTS D.RS92 ;INVALID DEVICE420$: BIT #DV.TTY,U.CW1(R2);IS THIS DEVICE A TERMINAL BEQ 15$ ;IF EQ, NO2 MOV R2,-(SP) ;SAVE UCB ADDRESS ACROSS PROMPT CALL@ MOV #CC.EXT!CC.TTD,R1 ;ISSUE TASK EXIT PROMPT (AND FORCE SNCMD).25$: CALL $QCNTP ;ISSUE PROMPT REQUEST TO MCR" MOV (SP)+,R3 ;RESTORE UCB ADDRESS;DL; FIRST PASS TO LOOK FOR TASKS WITH MATCHING TI:, T3.MCR SET, AND NOT SLAVED;(0 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 STDT# BEQ 40$ ;IF EQ, THIS IS NULL TASKE TST T.STAT(R1) ;IS TASK ACTIVEV BMI 40$ ;IF MI, NO, IGNORE* BIT #T3.CLI,T.ST3(R1);IS THIS A CLI TASK?$ BNE 40$ ;IF NE, YES, SKIP THIS ONE6 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?I BNE 40$ ;IF NE, YES, IGNOREV7 BIT #T3.MCR,T.ST3(R1);IS TASK ACTIVATED FROM TERMINAL?% BEQ 40$ ;IF EQ, NO, IGNORE THIS ONE < 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 WORD3 BNE 30$ ;IF NE, THERE ARE MORE TASKS IN THIS PASS,/ TST $DICSV ;CHECK IF ANY TASKS WERE PROCESSEDB. BEQ 100$ ;IF EQ, NO, SKIP ANY FURTHER PASSES;II; NEXT SET OF PASSES WILL GET THE OFFSPRING OF THE TASKS RECOGNIZED ABOVE); 150$: CLR $DICSV ;RESTORE THE TASK PROCESSED FLAGO+ MOV $TSKHD,R1 ;GET POINTER TO START OF STDA;55$: MOV T.TCBL(R1),-(SP);STORE POINTER TO NEXT TASK IN STDD# BEQ 80$ ;IF EQ, THIS IS NULL TASKL TST T.STAT(R1) ;IS TASK ACTIVEB BMI 80$ ;IF MI, NO, IGNORE* BIT #T3.CLI,T.ST3(R1);IS THIS A CLI TASK?$ BNE 80$ ;IF NE, YES, SKIP THIS ONE0 BIT #T4.CTC,T.ST4(R1);IS TASK ALREADY PROCESSED BNE 80$ ;IF NE, YES, IGNORES6 MOV T.OCBH(R1),R4 ;GET POINTER TO LISTHEAD OF PARENTS9 BEQ 80$ ;IF EQ, ALREADY PROCESSED IN FIRST PASS, IGNOREH?60$: MOV O.PTCB(R4),R5 ;GET NEXT PARENT TCB ADDRESS IN OCB LISTT+ BEQ 70$ ;IF EQ, PARENT HAS EXITED, IGNOREO3 BIT #T4.CTC,T.ST4(R5) ;CHECK IF PARENT HAS BIT SETS' BEQ 70$ ;IF EQ, NO, GO ON TO NEXT OCBI0 INC $DICSV ;INDICATE A TASK HAS BEEN PROCESSED; BIS #T4.CTC,T.ST4(R1) ;INDICATE THIS TASK IS PART OF CHAINT$ BR 75$ ;GO TRY TO ABORT IT AS WELL'70$: MOV (R4),R4 ;GET NEXT OCB ADDRESSM BNE 60$ ;IF NE, THERE ARE MORE5 BR 80$ ;NO PARENT HAS T4.CTC SET, GO ON TO NEXT TCB =75$: CMP R3,T.UCB(R1) ;DOES THIS TASK MATCH THE SPECIFIED TI: 4 BNE 80$ ;IF NE, NO, DON'T ABORT, BUT MARK AS CHAIN& BIT #T3.SLV,T.ST3(R1);CHECK IF SLAVED6 BNE 80$ ;IF NE, IT IS, DON'T ABORT BUT MARK AS CHAIN# CALL ABORT ;TRY TO ABORT THE TASKA680$: MOV (SP)+,R1 ;RESTORE THE POINTER TO THE NEXT TCB) BNE 55$ ;IF NE, NO MORE TO DO THIS PASS 0 TST $DICSV ;CHECK IF ANOTHER PASS IS NECESSARY BNE 50$ ;IF NE, YESB100$:  .IFTF ;A$$CLI&C$$CTCB RETURNP .IFT ;A$$CLI&C$$CTC;O2; SUBROUTINE TO ATTEMPT TO ABORT A PARTICULAR TASK ; INPUTS:C(; R1 - TCB ADDRESS OF TASK TO BE ABORTED; R3 - UCB OF TI:A;1ABORT: MOV R3,-(SP) ;SAVE THE TI: UCB ACROSS CALLI! TSTB T.ST2(R1) ;IS TASK EXITING?S BMI 20$ ;IF MI, NO, IGNORE8 MOV #AB.CTC,R2 ;SET UP THE DEFAULT SECONDARY ABORT CODE6 BIT #U2.PRV,U.CW2(R3) ;IS ISSUING TERMINAL PRIVILEGED. BNE 10$ ;IF NE, YES, ANY TASK MAY BE ABORTED>00Et__DATADATADATADATA BIS #AB.NPV,R2 ;INDICATE TERM NONPRIV IN SECONDARY ABORT CODE7 BIT #T3.PRV,T.ST3(R1);IS TASK TO BE ABORTED PRIVILEGEDT. BEQ 10$ ;IF EQ, NO, CAN BE ABORTED BY ANYONE+ MOV R1,-(SP) ;SAVE THE CURRENT TCB POINTER-* MOV R1,R5 ;COPY THE TCB ADDRESS FOR CALL8 MOV #AS.REA,R4 ;GET EXIT AST CODE TO SEARCH IN LIST FOR) CALL $SRAST ;SEARCH FOR AST IN TCB LISTC& MOV (SP)+,R1 ;RESTORE THE TCB ADDRESS2 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 ABORTED7 BIT #T2.REX,T.ST2(R1);SEE IF ABORT AST BEING PROCESSED), 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 R1C220$: MOV (SP)+,R3 ;RESTORE THE TI: UCB ACROSS CALL RETURNR .ENDC ;A$$CLI&C$$CTCA .ENDC ;R$$PRO;+.; **-$SFPMN-SET PERFORMANCE MONITOR PARAMETERS;S;; THIS DIRECTIVE PASSES USER PARAMETERS P1 TO P8 IN THE DPB0?; TO THE PERFORMANCE MONITOR USING THE SPM HOOKPOINT MECHANISM.A?; SPM HOOKPOINTS ARE TURNED ON AND OFF ON THE FLY BY REPLACING G; TWO INSTRUCTION WORDS WITH AN INSTRUCTION TO TRANSFER CONTROL TO SPM.R; ; DPB FORMAT:D;T#; WD. 00 -- DIC(169.),DPB SIZE(10.) .; 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 #7; WD. 09.-- PARAMETER #8;O ; INPUTS:T;U!; R3=ADDRESS OF WD. 02 IN THE DPB$; R5=TCB ADDRESS OF THE CURRENT TASK; ; OUTPUTS:;A>; THE 8. DPB PARAMETERS ARE PASSED TO THE PERFORMANCE MONITOR.;T;- M .IF DF P$$MONM;+; ** W A R N I N G **.;P; SPM HOOKPOINT NUMBER 34.;N); DO NOT CHANGE THE INSTRUCTION FOLLOWINGA; LABEL WITHOUT CHECKING SPM;-+$SPH34==. ;SPM CHANGES THE INSTRUCTION ATE ;THE LOCATION OF THIS LABEL$SFPMN:: NOP NOP RETURN ;  .ENDC 7;+.; **-$SFUPD-UPDATE UICS AND DEFAULT DIRECTORY !; ALTERNATE ENTRY POINT TO $SFUIC5;BF; THIS DIRECTIVE TAKES THE DEFAULT UIC AND THE PROTECTION UIC FROM THEL; UCB OF THE TERMINAL (U.UIC AND U.LUIC) AND COPIES THEM INTO THE HEADER OF K; THE TASK (H.DUIC AND H.CUIC RESPECTIVELY). IT SETS THE DEFAULT DIRECTORY I; OF THE TASK TO BE THE SAME AS THE DEFAULT DIRECTORY OF THE TERMINAL, IF &; DIFFERENT. IT THEN JUMPS TO $SFUIC.;L ; DPB FORMAT: ;E#; WD. 00 -- DIC(169.),DPB SIZE(4.). .; WD. 01 -- SUBFUNCTION CODE (17.) (LOW BYTE).; WD. 02 -- BUFFER ADDRESS.T#; WD. 03 -- BUFFER SIZE (IN WORDS).D;C; BUFFER FORMAT:;T%; DESCRIBED (AND FILLED IN) IN $SFUIC ; ; INPUTS:I; /; R2 - NUMBER OF EXTRA WORDS IN THE USER BUFFERR&; R3 - ADDRESS OF WD. 00 IN THE BUFFER-; R5 - ADDRESS OF THE TCB OF THE CURRENT TASKF;E ; OUTPUTS:; <; THE UICS IN THE HEADER OF THE REQUESTING TASK ARE UPDATED.K; THE DEFAULT DIRECTORY STRING FOR THE TASK IS SET TO THAT OF THE TERMINAL.P;I;4;- .MCALL LNMDF$ LNMDF$ $SFUPD:: .IF DF X$$HDR& MOV KISAR6,-(SP) ;SAVE BUFFER MAPPING# MOV $SAHDB,KISAR6 ;MAP TASK HEADERR' MOV $SAHPT,R0 ;GET TASK HEADER ADDRESS$ .IFF ;DF X$$HDR' MOV $HEADR,R0 ;GET TASK HEADER ADDRESS  R .IFTF ; DF X$$HDR MOV T.UCB(R5),R1 ;GET TI: UCB-8 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$$HDR ; RESET DEFAULT DIRECTORY STRING) .IF DF N$$DIR ; NAMED DIRECTORY SUPPORTV; CMP T.CTX(R5),U.CTX(R1) ;IS TERMINAL CONTEXT SAME AS TASK?A" BEQ 10$ ;IF EQ, INDICATE SUCCESS' MOV T.CTX(R5),R1 ;GET TERMINAL CONTEXTA+ 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 MAPPING.( MOV U.CTX(R1),KISAR6 ;MAP CONTEXT BLOCK- INCB C.REF+140000 ;INCREMENT REFERENCE COUNTE" MOV (SP)+,KISAR6 ;RESTORE MAPPING .ENDC ;DF N$$DIRI T*1000ibjbkb a a a$: JMP $SFUIC ;FILL IN BUFFER WITH INFO .ENDONTEXT SAME AS TASK?A" BEQ 10$ ;IF EQ, INDICATE SUCCESS' MOV T.CTX(R5),R1 ;GET TERMINAL CONTEXTA+ 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 MAPPING.( MOV U.CTX(R1),KISAR6 ;MAP CONTEXT BLOCK- INCB C.REF+140000 ;INCREMENT REFERENCE COUNTE" MOV (SP)+,KISAR6 ;RESTORE MAPPING .ENDC ;DF N$$DIRI T*10 .TITLE TTLH .IDENT /04.03/;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; 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.;; Authors: BEN LEVIN 14-JUN-84; Tony Lekas;; Modified By:;; S. C. Adams 14-Jun-89 04.00;7; SA498 -- Report error on set/get speed, parity, and ; character length ;; J. Mickalide 28-Jun-89 04.01 ; D; JEM001 -- Correct routine LHOUT to save space in buffer for data_b;; slot but not to move any data and to fill in a slot sizes; of six in the header.;R; D. Carroll 23-March-92 04.02;MB; DTC001 -- Correct problem when using special echo from within an>; ACD in which the echo buffer is externally mapped, and does.; not reside within pool, the UCBX, or TTCOM.;.; D. Carroll 22-Aug-1994 04.03; >; DC299 -- Correct DTC001 to only map external buffer when the8; output request is not buffered output ... (Instinet);H; 7; Controller-Dependent routine for LH Device (LAT HOST)v;nE; LH devices are considered to be remote terminals, connected throughCE; the LAT-multiplexer and are always setup in the data base as remotee ; terminals.;t; LH port data base structure:F; LH port belongs to a 'TT' device and has its own DCB (Generic device; name is 'TT')./; LH port data base has one contigious SCB/KRB.C@; LH controller has a CTB, linked to CTB list ($CTLST) and has a2; generic controller name (L.NAM) 'LH' (LAT host).;o; Calls:; From port to process:e0; The SCB/KRB block will contain two words with8; LAT process bias/virtual address. $MPPRO routine will; map and call it.s; From process to port:s9; The first address in the driver dispatch table for the:; LH controller will be used by LCP to set up the calling#; information for the LAT process.r;a .IF DF T$$LTH;o; UCB Extentions for LH devices ; -----------------------------) ; Status/control information; U.LINS ; Link status2; U.CREN ; Transmit credits counter (low 4 bits)3 ; Link Status Extension (High 4 bits of U.CREN)e# ; Server/circuit identificationn; U.SRVN ; Server number; U.SESN ; Session numberT ; Parametrs on receive datas; U.RSBB ; Receive slot bias(; U.RBHA ; Receive slot header virtual!; U.RSDV ; Receive data virtualo# ; XMT intermediate buffer chain !; U.TRLH ; XMT listhead address-); U.TRSC ; XMT remained bytes in buffern%; U.SLSZ ; Maximum slot size on XMTt ; Virtual circuit CCBr#; U.CCBA ; CCB address (low core)S; &; Link Status Word U.LINS word in UCB; ----------------;#########################;modify UCBDF for these #; UL.TRS=1 ; 1-XMT stopped, 0-Notn# ; >255 Char. for slot. Hold it.e&; UL.TDA=2 ; 1-XMT data avail, 0-Not% ; Data in XMT queue (set by port)i, UL.XON=4 ; 1-Notify the process of an XON) ; 0-Notify the process of output dataC'; UL.RDA=10 ; 1-RCV data avail, 0-NotZ% ; Data in RCV queue (set by proc)i/ UL.NTO=20 ; 1-Non task output pending, o-Not 4 UL.NOD=40 ; 1-ODONE call defered because too much ; data was buffered, 0 - Not%; UL.RSS=100 ; 1-RCV stopped, 0-NotL% ; RCV stopped by TTDRV on receive  ; if no resources available%; UL.LEN=200 ; 1-Link enable, 0-Not % ; toggled by start/stop link call;.4; Link Statue Extension bits (High 4 bits of U.CREN);t!;LE.HIP=20 ; hangup in progressR) ; set if LHMTIM is called by terminala& ; driv00"Et__DATADATADATADATAer before all available data ; has been sent to server., ; subsequent I/O will not complete until, ; data has been sent, and bit is cleared ;t&;LE.TDC=40 ; Transmit data completed' ; Bit set during .HIP when the data  ; has all been transmitted. ;L&;LE.CIP=100 ; Connection in progress- ; Bit set when a connection to a terminalS* ; server is pending. Set after output3 ; has been attempted to a Lat Application Term,f/ ; but no connection has been established tor- ; the terminal server associated with ther ; terminal.q ;O5LE.ORG=200 ; Bit set by $LHSTS if connection result % ; of IO.ORG (Explicit connection)T ; ;a;m ; Error Codesi ; -----------IE; NOTE: Do not change there codes without checking LAT process module >; LATPRT. Some of there codes are common to both, and are not;; globaly defined. Adding a code will not cause a problem. ER$SUC=0 ; Sucess #ER$MLE=-1 ; Maximum links exeededc"ER$IDN=-2 ; Incorrect identifyer#ER$SYN=-3 ; Synchronization errorw&ER$UDC=-4 ; Undefined operation code(ER$NDR=-5 ; No data ready for transmit%ER$LND=-6 ; LH data base not loadedn#ER$NRR=-7 ; No receive data readye#ER$OVR=-10 ; Data overrun occuredaER$SIU=-11 ; Service In Useg ER$PNU=-12 ; Port Name Unknown"ER$SNO=-13 ; Service Not offered;a&; Process-to-Port Call Operation Codes&; ------------------------------------PR$STS=0 ; Start sessionPR$RCV=2 ; ReceivePR$XMT=4 ; TransmitoPR$DSC=6 ; Stop session 1PR$GTD=10 ; Get transmit data for app. terminal ;PR$TMO=12 ; Connect request timed out in implicit connectL;-!; Port-to-Process Operation CodesN!; -------------------------------R)PO$DSC=0 ; Stop session ("BYE" by task)-(;PO$FLO=2 ; Flow control status change;PO$HST=2 ; Host sync toggledr#;PO$TST=4 ; Terminal sync toggeldrPO$XON=6 ; XON+;PO$XOF=10 ; XOFF (possible data overrun)PO$ABO=12 ; Abort outputPO$OUT=14 ; Start output,PO$MSD==16 ; Mark a session for disconnect<PO$CNT=20 ; initiate implicit connection from terminal ser-PO$ORG==22 ; ininate connection from IO.ORGcPO$GQD==24 ; Get QUEUE depth)PO$MAP==26 ; Set/Get Mapping parameters-;; LAT Message Header Offsets; --------------------------SL$SID=1 ; Slot identSL$SBC=2 ; Slot byte countSL$TYP=3 ; Slot typeSL$SDS=4 ; Slot data start;; Buffer type codesp; -----------------4BF$NOR=0 ; Normal data. Includes non task output."BF$RPR=1 ; IO.RPR Prompt string.&BF$FLO=2 ; Flow control information.; "; Maximum number of queued buffers"; --------------------------------;cMAXBUF=4;;;+++;E# .MCALL DCBDF$,UCBDF$,CTBDF$,SCBDF$g .MCALL UCBDF$,CCBDF$  DCBDF$ ; Define DCB UCBDF$ ,,TTDEF ; Define UCBS CTBDF$ ; Define CTB SCBDF$ ; Define SCB CCBDF$ ; Define CCB .PSECT MAP6; 9; $LHGTD - Get transmit data from task, and start output.A; this is called by LAT process upon terminal server establishing;I; connection to Lat Application Terminal during an IMPLICIT connection.iC; Completion of I/O is delayed until connection is established and; must be re-started..;.!; Inputs: R5 - pointer to U.TSTA;C$$LHGTD::MOV R1,R5 ; Point to U.TSTA CALL MUCBX ; Map the UCBXf TST U.TCO(R4) ; Task output?B4 BNE LHSTAX ; if so, fall through to start output." TSTB U.TOC(R4) ; Non-Task output?% BNE LHSTAX ; if NE, yes - go do it.- RETURN ; Else return - could be bad call.. ;v;e#; LHSTAX - Start Output Entry Pointp;c; Input:?; Registers R2-R5 are standard for controller-dependent routinea; ; R2 - Phisical unit number * 2n$; (only if multiplexers in system); ); R3 - CSR address (unused for LH device)1; R4 - UCBX addressA; R5 - Pointer to U.TSTA;f;T;ULHSTAX::2 CLRB U.TOTI(R4) ; LAT process deals with timers MOV R1,-(SP) ; Save R1O MOV R2,-(SP) ; Save R2B;L: BIT #S6.LAT,U.TST6-U.TSTA(R5) ; Lat Application Terminal?( BEQ 7$ ; if EQ - no, normal output../ BITB 00*ibjbkb a a a#UL.LEN,U.LINS-U.TSTA(R5) ; link Enabled?r$ BNE 7$ ; If NE - Yes, continue..;dI; here, we have output, but no link is enabled on an application terminalrD; We must call the LAT process, and try to establish the connection.; = BISB #LE.CIP,U.CREN-U.TSTA(R5) ; Show connection in progress = BISB #US.DSB,U.STS-U.TSTA(R5) ; Toggle read/write so no more " ; I/O is possible to this TT" ; until connection completes' MOV #PO$CNT,R3 ; show connect reason;# CALL LTPRC ; call LAT process..U# MOV (SP)+,R2 ; Restore Registersd MOV (SP)+,R1 ; And- RETURN ; Return7$: ;h ; Buffer chain in U.TFOB" ; Check high priority output6 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!)0 BIT #S5.XOF,U.TST5-U.TSTA(R5) ; Output an XOFF? BEQ 10$ ; Branch if not 3 BIC #S5.XOF,U.TST5-U.TSTA(R5) ; Yes-clear XOFF bitt5 BISB #UL.RSS,U.LINS-U.TSTA(R5) ; RCV-STOPPED on linkP BR IODON ; All done for nowV;P; Not XOFF, must be XON ; 210$: BIC #S5.XON,U.TST5-U.TSTA(R5) ; Clear XON bit5 BICB #UL.RSS,U.LINS-U.TSTA(R5) ; RCV-STOPPED cleared-5 BISB #UL.XON,U.LINS-U.TSTA(R5) ; Set reason for forka$ BR DOFORK ; Jump to call process.OUTPUT: ; Continue normal priority output8 BICB #UL.XON,U.LINS-U.TSTA(R5) ; Settup reason for fork TST U.TCO(R4) ; Task output?5& BNE 5$ ; If NE yes - go process it( CALL PRNTO ; Process non task output BR DOFORK ; And exit5$:A8 MOV U.TRLH-U.TSTA(R5),R1 ; R1-XMT buffers chain starts- BEQ 30$ ; Branch if there is no XMT chainB)10$: TST (R1) ; There is an XMT chain-  BEQ 20$ ; Find end ofI MOV (R1),R1 ; XMTs BR 10$ ; Chain820$: MOV U.TFOB(R4),(R1) ; Link new chain to XMT chain& BR 50$ ; And go to stamp new chainD30$: MOV U.TFOB(R4),U.TRLH-U.TSTA(R5) ; No XMT chain-create it (link! ; new buffers to xmt chain)r" ; Stamp all new chain with 0 ; In the left byte of then$ ; Second word-don't deallocate ; this buffer in LHOUT750$: MOV U.TFOB(R4),R1 ; R1-first buffer in new chain:0 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 from  ; the class driver*60$: MOVB R3,3(R1) ; Set the buffer type TST (R1) ; Last buffer?h+ BEQ 100$ ; If 0-YES, chain done, branch ( 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=04 BISB #UL.TDA,U.LINS-U.TSTA(R5) ; Set XMT-DATA-AVAILDOFORK:t" CALL PRIFRK ; Do priority fork!IODON: MOV (SP)+,R2 ; Registers0 MOV (SP)+,R1 ; Andn% MTPS #TTPRI ; Raise to priority 5t' SAVNR ; Save and restore R4 and R5r) CALL TTSET1 ; Go put TT fork block ony ; fork queue if needed MTPS #0 ; Back to zero RETURNn b;c?; Called by terminal driver on IO.KILL. All data in XMT buffersp:; will be lost. LAT processor will be called to cancel all*; pending transmit and receive operations.;ULHABOX::% CALL CLEAN ; Clean up the buffersR& MOV #PO$ABO,R3 ; Param-abort output! CALL LTPRC ; Call LAT processR RETURNn;M ;P4; Terminal driver calls to do a time-out processing.?; This entry point will be called on IO.HNG or "BYE" command to -; disconnect link and logoff remote terminal. ;oB; If and transmit data is still outstanding, the session is markedD; for hangup (HIP) in the status extension. The LAT process is thenD; called to mark the session block disconnect in progress (DIP), theD; IO.HNG or IO.DET I/O packet is saved and a return is executed back.; to PPHNG in TTATT, which calls this routine.B; The terminal is disabled from receiving any new data I/O packets; (US.DSB set).i;wE; Once all the transmit data has been sent to the server, the sessionoD; block is clean002Et__DATADATADATADATAed up, the session is disonnected, and the IO.HNG or%; IO.DET is finished ($IOFIN called).I;iC; If this routine is called a 2nd time, for any reason, the sessione!; is unconditionaly disconnected.s;D;,; INPUTS: IF DF T$$OVL; R5 - U.TSTA of terminalr;r); 6(SP) = IRP Address of IO.HNG or IO.DETi; 4(SP) = Return PC in PPHNG; 2(SP) = KINAR5 or TTATTe; (SP) = Return PC in MPROT;; .IF NDF T$$OVL; R5 - U.TSTA of terminal ;a); 2(SP) = IRP Address of IO.HNG or IO.DET; (SP) = Return PC in TTATT;nLHMTIM::? BITB #UL.TDA,U.LINS-U.TSTA(R5) ; is there transmit data avail?' BEQ 5$ ; if EQ - no, hang up line..e5 BITB #LE.HIP,U.CREN-U.TSTA(R5) ; Hangup In progress?c% BNE 5$ ; if NE - yes, hang it up!O9 BISB #LE.HIP,U.CREN-U.TSTA(R5) ; show hangup in progressf2 BISB #US.DSB,U.STS-U.TSTA(R5) ; Toggle read/write .IF DF T$$OVL% MOV 6(SP),R0 ; Recover IRP address! CLR 6(SP) ; Clear IRP addresst .IFF ;T$$OVL(% MOV 2(SP),R0 ; Recover IRP address ! CLR 2(SP) ; Clear IRP addressT .ENDC ;T$$OVL2 MOV #PO$MSD,R3 ; Function - Mark SES disconnect( CALL LTPRC ; Call LAT process direct% TST R0 ; Did LAT take I/O packet?p) BEQ 20$ ; if EQ, yes - Let LAT try toa" ; send remaining data before ; hanging up linep .IF DF T$$OVL% MOV R0,6(SP) ; Recover IRP addressi .IFF ;T$$OVLO% MOV R0,2(SP) ; Recover IRP addresss .ENDC ;T$$OVL: BICB #LE.HIP,U.CREN-U.TSTA(R5) ; Clear Hangup in Progress;o45$: MOV #PO$DSC,R3 ; Function code-disconnect line7$: MOV R1,-(SP) ; Save R12 BICB #17,U.CREN-U.TSTA(R5) ; Clear credits field( CALL LTPRC ; Call LAT process direct) MOV R5,R1 ; R1-UCB address for $LHSTP * CALL $LHSTP ; Stop line-will call MHUP ; And clear the line? BIT #S6.LAT,U.TST6-U.TSTA(R5) ; Is this a Lat Application TermR! BEQ 10$ ; if not, just returnV# MOV #-1,R3 ; Set up R3 for call" CALL LHST1 ; Reset terminal...&10$: MOV (SP)+,R1 ; Restore register 20$: RETURNP;,E; Line parameters have changed. Only flow control change informationCD; is processed for now. A buffer will be allocated and the info put; in it.;iLHLPAR:: MOV R1,-(SP)U* BEQ 40$ ; If EQ, Nothing being changed MOV R0,-(SP)l MOV R2,-(SP) & CALL ALTB ; Allocate T$$BFL buffer- BCS 30$ ; If CS, No buffer - report errorB! ; Link word cleared in ALTBM$ MOVB #BF$FLO,3(R2) ; Set the type, MOVB R1,4(R2) ; Fill in the control flags+ MOV U.SCB-U.TSTA(R5),R0 ; Get SCB address,7 MOVB S.KRB+6(R0),2(R2) ; Fill in the Data_b slot sizeg/ MOV R5,R0 ; Compute address of buffer chaini ADD #U.TRLH-U.TSTA,R0 ; ...t10$:+ TST (R0) ; Any link? (Also clear carry) ' BEQ 20$ ; If EQ, End of chain found,* MOV (R0),R0 ; Get next buffer in chain) BR 10$ ; Loop till end of chain found 20$:" MOV R2,(R0) ; New end of chain30$:# MOV (SP)+,R2 ; Restore registerse MOV (SP)+,R0 ; ...R MOV (SP)+,R1 ; ... ;**-1 RETURN ; Return40$: ;SA498* MOV (SP)+,R1 ; Restore register ;SA498( CALLR YLLPAR ; Report error ;SA498;r7; If CON ONL set the write disabled bit and let it rip.:>; If CON OFF return an error so nobody can muck with our TT's.;,LHUONL::: BISB #US.DSB,U.STS-U.TSTA(R5) ; disable read/writes on TT RETURNLLHUOFF::4 MOVB #IE.DNR,$SCERR ; Return error code in $SCERR RETURN0LHSTOX::< BIC #S2.CTS,-U.TSTA(R5) ; We can't be XOFFed from ; a serverLHCOFF::LHCONL::LHCPUP::LHUPUP::LHPWUP::LHRESX:: RETURN ; And exit PRIFRK:C MOV R4,-(SP) ; Save R4o) MOV #FR.LAT,R3 ; LAT fork mask bit sete% MTPS #TTPRI ; Raise to priority 5N- CALL FORK ; Queue fork block (R4 altered)r MTPS #0 ; Back to zero MOV (SP)+,R4 ; Restore R4 RETURN/ t;oL; Data message received from server. Each UCB contains bias/virtual addressI; of a slot header for that link. The slot header contains the slot datae ; size byte.; L; Look through UCB chain and send to TTDRV all slots where the "re00:ibjbkb a a aceive data; available" bit is set.;MG; If a slot is done, then the data counter in the slot header will be 0PO; and the C.STS word in the CCB (number of slots in buffer) will be decrementedr; by 1.0; F; If "RCV-STOPPED" state is set (TTDRV back-offed with XOFF because ofF; resources allocation failure) data will not be copied from the slot.+; Check RSV-STOPPED on entry and after eachd>; return from ttdrv when outputting a character (ICHAR1 call).G; In this case data slot counter will contain number of characters leftbE; in slot, and U.RSDV will contain address (virtual) of the next byteh+; to output. C.STS will not be decremented. ; ; Note:fH; UL.RDA bit is set by lat process only for lines, that have information"; available for current operation.; ; Input:; None ; Output:a ; R3-status: 0-success, <0-error; R1,R2-Destroyed; Other registers - preservedd; Usage:%; R5 - U.TSTA address of current UCB ; R2 - LH'S DCB address.; $LHINP:: CLR R3 ; Assume successt CLR R2 ; First entry in DCB &10$: CALL FNDUCB ; Find next LH UCB TST R5 ; Next UCB found? BNE 20$ ; Branch if yese ; No more UCBS RETURN ; And exit(20$: ; R5-next (first) UCB'S U.TSTA. BITB #UL.LEN,U.LINS-U.TSTA(R5) ; Link enable? BEQ 10$ ; No-get next UCBt9 BITB #UL.RDA,U.LINS-U.TSTA(R5) ; Receive data available?  BEQ 10$ ; No-get next UCB ;gC; The following code can be used when the LAT architecture providesF; a way to send the XOFF charcter to stop the server from sending moreF; data. Meanwhile, the LAT Process tests this bit, and will not extendE; any more credits to the server until it is cleared. Note - there isn?; still room in the typeahead buffer for a few more characters!,;I<; BITB #UL.RSS,U.LINS-U.TSTA(R5) ; RCV-STOPPED on that link?; BEQ 25$ ; No-copy slot5; BR 10$ ; And get next UCB'25$: ; UCB found-prepare copy slotl" MOV R2,-(SP) ; Save DCB address6 MOV U.RBHA-U.TSTA(R5),R1 ; R1-slot header V.A. start2 ADD #SL$SBC,R1 ; R1-slot size byte virtual addr& MOV R1,R4 ; Save it (needed later)+ MOV #-1,R2 ; R2<0 (get char. operation) - CALL GCHR ; Returns R2-slot size on right  CLR R0 ; Prepeare R0 BISB R2,R0 ; R0-slot sizee5 MOV U.RSDV-U.TSTA(R5),R1 ; R1-slot data virt. startD(30$: ; Loop-move slot char. in loop+ MOV #-1,R2 ; R2<0 (get char. operation) + CALL GCHR ; Get character (R2 on right) MOV R0,-(SP) ; Save registers MOV R1,-(SP) ;- MOV R4,-(SP) ;a% MTPS #TTPRI ; Raise to priority 5t- CALL ICHAR1 ; Move char. from R2 to TTDRV  MTPS #0 ; Back to zero# MOV (SP)+,R4 ; Restore registers  MOV (SP)+,R1 ;  MOV (SP)+,R0 ;R$ INC R1 ; Point to next character; BITB #UL.RSS,U.LINS-U.TSTA(R5) ; RCV-STOPPED on that link?t BNE 40$ ; Yes-process it$ SOB R0,30$ ; Copy all characters/35$: MOV U.CCBA-U.TSTA(R5),R2 ; R2-CCB addresse( 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;1I; When the entire slot has been processed do not update the slot counter.RE; This is not necessary and it allows the LAT process to use one slotR(; for multiple start session slots.;,! BR 50$ ; Slot done-process itt 40$: ; Slot done or stopped' DEC R0 ; Was not decremented by SOBs) BEQ 35$ ; Branch if it is really doned7 MOV R1,U.RSDV-U.TSTA(R5) ; Store current data virtualS. MOV R4,R1 ; Restore slot data counter addr# MOV R0,R2 ; R2>=0-put operationa* CALL GCHR ; Put counter in slot header)50$: MOV (SP)+,R2 ; Restore DCB addresst" CLR R3 ; Return status-success BR 10$ ; Get next UCBu o;#########################;update comments;.<; The port scans the UCB chain to find the corresponding UCB=; (session/server IDS) and fills the output buffer. The scan3%; starts from the specified UCB (R1).M;RB; After filling each slot the credits counter is decremented by 1.A; If the credits counter is 0, no informat00BEt__DATADATADATADATAion will be transferreda0; to the output buffer for this particular link.;VC; Operation fills the output buffer according to next set of rules:s<; - Go through all UCBs and fill all slots for UCBs with the; UL.TDA bit set;5; - Stop when there is no more room in output buffer;g@; - If there is room in the buffer after the path through all of?; the UCBs has been made and there is XMT-STOPPED links starta-; again if there are any credits available;.E; - the message is filled until the message maximum length is reached ,; or until all of the data has been moved.;V; Input:D; R1 - UCB address to start scanning or 0 (start from the beginning); R2 - Server number"; R4 - Address of CCB, containing:; Buffer bias C.BUFt5; Buffer virtual addr C.BUF+2 -After message headerf,; Buffer length C.CNT -Without MSG header.; Maximum slot length to fill out is in U.SLSZ;i ; Output:E(; R1 - UCB address were scan was stopped; R2 - Server numberK; R3 - Status: 0-success, >0-number of links in XMT-STOPPED state, <0-errorr"; R4 - Address of CCB, containing:; Buffer bias C.BUF-4; Virtual end of data C.BUF+2 (next available byte); Remaining in buffer C.CNT; ;-; Note:oA; U.TRSC, U.TRSA and UL.TDA are cleared when all of the XMT chainCI; has been copied into the output buffer and all XMT buffers deallocated.r; ; Note:l#; Register 1 is used as a bit mask:i?; - Bit 1 is set if R1, provided on call from LAT processr8; contained address of the UCB in the middle of the UCB8; chain or terminal driver call LHSTAX from ODONE call.9; In that case we need to repeate loop once more.BA; - Bit 2 is set if any of the links has a transmit credit. ;e;$LHOUT:: MOV R1,-(SP) ; Save R1e MOV R2,-(SP) ; Save R2C( CLR R3 ; Prepare XMT stopped counter% CLR R2 ; Start from the beginning / CALL FNDUCB ; Ret. DCB (R2) & 1-st UCB (R5) . 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 calla$ TST R1 ; LAT calls with 0 in R1?, BEQ 15$ ; Yes-start proc. First UCB (R5)& ; R1 not EQL 1-st UCB, and not 0" ; -LAT calls with UCB in the ; Middle of the UCB chainR* MOV R1,R5 ; In R5-UCB address to start' MOV #1,R1 ; Set repetition bit maskU! BR 15$ ; And process that UCB5%2$: ; Look through all UCB chainC CLR R2 ; Start from firstf CLR R1 ; Clear bit maskR 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? ) BNE 2$ ; Yes-start from the beginningd ; And clear all mask ; At least once we already ; Processed all UCBs) TST R3 ; Any links have been stopped?a" BEQ 10$ ; No-all done, get out ; There are stopped linkso& BIT #2,R1 ; Any link has a credit?* BNE 2$ ; Yes-repeat from the beginning ; No-get out*10$: ; All done-went through all UCBS# ; No XMT stopped links, or no " ; More credits, or buffer is ; Full-returne MOV (SP)+,R2 ; Restore;- MOV R5,R1 ; UCB address were scan stoppeda TST (SP)+ ; Registersa RETURN ; And exit315$: BITB #UL.LEN,U.LINS-U.TSTA(R5) ; Link enabled?n BEQ 5$ ; No-get next linkl1 CMP (SP),U.SRVN-U.TSTA(R5) ; Requested circuit? BNE 5$ ; Not-get next link914$: BITB #LE.HIP,U.CREN-U.TSTA(R5) ; hangup in progress?o$ BEQ 114$ ; IF eq - normal output< BITB #UL.TDA!UL.NTO,U.LINS-U.TSTA(R5) ; XMT data available?) BNE 114$ ; if NE, something availabler= BISB #LE.TDC,U.CREN-U.TSTA(R5) ; Set Transmit data completed  BR 16$ ; Format STOP slot ; :114$: BITB #UL.TDA,U.LINS-U.TSTA(R5) ; XMT data available?* BNE 16$ ; If set -check next condition ; UL.TDA not set5 BITB #UL.NTO,U.LINS-U.TSTA(R5) ; Did we have stalled; ; non task output?+ BEQ00Jibjbkb a a a 5$ ; No UL.TDA & no UL.NTO-next UCBr ; Yes, we did, we did!0 CALL PRNTO ; Try to put it into output queue= BITB #UL.TDA,U.LINS-U.TSTA(R5) ; Now is there any to output?v BEQ 5$ ; If EQ no - next UCB ASSUME S2.CTS,100000o16$:;N; The following lines of code have been commented out because the architectureI; doesn't allow flow control between server and host with characters, butnM; instead uses credits to control the flow of data. Therefore, if we have the %; the credits, we will send the data.n;L.; TST -U.TSTA(R5) ; XOFFED by user?; BMI 5$ ; Yes-get next link ;p4; Of course there is a buffer! (Used for debug only)3; TST C.BUF+2(R4) ; Check if output buffer addr 0; BEQ 5$ ; Yes-get next link:" ; Test for available credits& ; Should always be the last test) MOVB U.CREN-U.TSTA(R5),R0 ; Get creditse BIC #177760,R0 ; * $ TSTB R0 ; any credits available? BLE 5$ ; No-get next link . BIS #2,R1 ; Set bit mask-credits available ; UCB found (R5); . BIT #1,C.BUF+2(R4) ; Slot on even boundary? BEQ 18$ ; Branch if yesp! INC C.BUF+2(R4) ; Make it evens/ DEC C.CNT(R4) ; Decrement I/O buffer counterf18$:6 BITB #UL.TDA,U.LINS-U.TSTA(R5) ; Transmit data avail?& BNE 119$ ; if NE, yes - go get it! ; Else must be completionV ; of .HIP57 CMP C.CNT(R4),#SL$SDS ; I/O buff avail > slot header?  BHI 19$ ; Branch if yesE7 BISB #UL.TRS,U.LINS-U.TSTA(R5) ; Set transmitt stoppedc BR 10$ ; and exit ;C>19$: BICB #LE.HIP,U.CREN-U.TSTA(R5) ; Clear hangup in progress, BICB #17,U.CREN-U.TSTA(R5) ; Clear credits MOV R3,-(SP) ; Save R3C MOV R2,-(SP) ; Save R2O2 SUB #SL$SDS,C.CNT(R4) ; Subtract out slot header/ MOV C.BUF+2(R4),R2 ; Get slot header addressE5 ADD #SL$SDS,C.BUF+2(R4) ; Point at next avail. byte - MOV #321,R3 ; Slot type, reason code DIAGu( CALL FILSH ; Fill in the slot header MOV (SP)+,R2 ; Restore R2 MOV (SP)+,R3 ; Restore R3 BR 5$ ; Go do next UCB)119$: ; Copy XMT chain in I/O buffer5" MOV R2,-(SP) ; Save DCB address/ MOV R3,-(SP) ; Save R3 (XMT-STOPPED counter)(( CLR -(SP) ; Initialize the slot type# ; to zero which is for Data_at0 MOV C.BUF+2(R4),-(SP) ; Save start of the slot9 MOV U.TRLH-U.TSTA(R5),R2 ; R2-first buffer in XMT chain ! ; U.TRSC=0 if new XMT chaint, TST U.TRSC-U.TSTA(R5) ; All new XMT chain? BNE 20$ ; No-branchV ; Yes, new chain? MOVB 2(R2),U.TRSC-U.TSTA(R5) ; U.TRSC-bytes in first XMT buff$;20$: CMP C.CNT(R4),#SL$SDS ; I/O buff avail > slot header?e BHI 25$ ; Branch if yes " ; I/O buff avail=15$: BIT #S6.LAT,U.TST6-U.TSTA(R5) ; Is this Lat App Terminal? BEQ 20$ ; If no, just branch/ BIT #40000,R1 ; Is this solicited connectioni+ BEQ 5$ ; If EQ - no, don't give this TT 320$: BITB #UL.LEN,U.LINS-U.TSTA(R5) ; Link enabled? BNE 5$ ; Get next if enabled; BIT #1,U.CCBA-U.TSTA(R5) ; Reserved Application Terminal?N% BNE 5$ ; if NE, yes - Check next.U1 BIT #F4.NCT,$FMASK+6 ; Does system have NCT...?E, BEQ 30$ ; If no, don't check for NCT att TST $NCTPT+4 ; Is NCT active?* BEQ 30$ ; If not, no need to check ATT= CMP U.ATT-U.TSTA(R5),$NCTPT+4 ; Does NCT have this unit att?,+ BEQ 5$ ; If EQ yes, try for another TT:  ;Q@30$: BIT #U2.LOG,U.CW2-U.TSTA(R5) ; Is terminal still logged in? BEQ 5$ ; If eq, yes  .IF DF T$$SPL) TST U.TAPR-U.TSTA(R5) ; UCBX allocated? & BEQ 5$ ; If EQ this one is no good .ENDC ;DF T$$SPLU$ ; Found disabled/requested UCB2 MOV (SP),U.SRVN-U.TSTA(R5) ; Store server number CLR R3 ; Return successNLLHST1: BICB #US.OFL!US.PDF,U.ST2-U.TSTA(R5) ; Set unit online and clear priv9 BICB #US.DSB!US.CRW,U.STS-U.TSTA(R5) ; Toggle read/writeQ, CLRB U.LINS-U.TSTA(R5) ; clear link status1 CLR U.TRSC-U.TSTA(R5) ; Clear XMT queue counterd. CLRB U.CREN-U.TSTA(R5) ; Clear credits field# TST R3 ; New session (R3 Clear)c) BNE 5$ ; if NE, no - don't set IO.ORGo BIT #10000,R1 ; IO.ORG? BEQ 5$ ; if EQ, no= BISB #LE.ORG,U.CREN-U.TSTA(R5) ; Set bit in status extensionr65$: MOVB U.SESN-U.TSTA(R5),R1 ; Return session number00bEt__DATADATADATADATA! ; And link status extensionn9 BIC #S2.CTS,-U.TSTA(R5) ; Make sure not XOFFedo0 BISB #U2.RMT,U.CW2-U.TSTA(R5) ; Set line remote, BIC #100000,6(R5) ; No autobaud detection: BIT #S6.LAT,U.TST6-U.TSTA(R5) ; Lat Application Terminal?# BEQ 10$ ; if EQ - no, call MANSC& CLR U.TST5-U.TSTA(R5) ; Reset U.TST5, CLRB U.TMTI-U.TSTA(R5) ; Clear modem timer& BR 20$ ; Continue in common code..;T)10$: MTPS #TTPRI ; Raise to priority 5O( CALL MANS ; Answer the call-sets all% ; Characteristics & line enableo MTPS #0 ; Back to zero;S$20$: TST R3 ; Called from LHMTIM?' BNE RET1 ; if NE - yes, just returne3 BISB #UL.LEN,U.LINS-U.TSTA(R5) ; Show link enabled#"SEXIT: MOV (SP)+,R2 ; Restore R2 RET1: RETURN B;1%; **-$LHTMO - A solicit has timed outT;-E; This routine is called by LAT Process when a solicit has timed out.rF; Any outstanding I/O is killed, and the current I/O is completed with>; Error status in R3 returned in the IOSB of the issuing task.; ; INPUT: R1 - U.TSTA of terminal; R2 - Error code;o; OUTPUT: R1 - Unchanged!; R3 - 0 If success, <0 if error ;-; Other registers preserved.;,9$LHTMO::BIT #S6.LAT,U.TST6-U.TSTA(R1) ; Is this a L.A.T.?  BEQ ERR1 ; If not, error! MOV R0,-(SP) ; Save R0i MOV R2,R0 ; Move error codeu! SWAB R0 ; Get code to hi bytea' BISB #IE.DNR,R0 ; Get DNR to lo byten& BR STP ; Finish I/O, clean up, etc;p;e;; The LAT process calls this entry point to stop a session.i2; In R1 is the UCB address of the session to stop.; ; Input:; R1 - UCB address ; Output:; R1 - Unchanged ; R3 - 0 if success, <0 if error; R5 - modified;; Other registers preservedT;($LHSTP::/ BITB #UL.LEN,U.LINS-U.TSTA(R1) ; Line enabled?M BNE STP1 ; Branch if Yes&ERR1: MOV #ER$SYN,R3 ; Synchr. error RETURN ; And return;S;ISTP1: MOV R0,-(SP) ; Save R00 MOV #IE.DNR&377,R0 ; Return DNR error to task% ; Save reg. destroyed by LHMHUPt"STP: MOV R1,R5 ; R5-UCB address MOV R1,-(SP) ; Save R1  MOV R2,-(SP) ; Save R21 MOV R4,-(SP) ; Save R4 MOV R0,-(SP) ; Save statusu% CALL MUCBX ; Map UCBX buffer (R4) CALL CLEAN ; Cleanup buffers2 BISB #US.DSB,U.STS-U.TSTA(R5) ; Toggle read/write0 CLRB U.LINS-U.TSTA(R5) ; Clear all link states MOV (SP)+,R0 ; Restore status% MTPS #TTPRI ; Raise to priority 5 1 CALL LHMHUP ; Kill all I/Os and hang the linen ; Clobbers R0,R1,R2,R3 MTPS #0 ; Back to zero CLR R3 ; Return successa MOV (SP)+,R4 ; Restorea MOV (SP)+,R2 ; Registerse MOV (SP)+,R1 ;  MOV (SP)+,R0 ;R RETURN  aH; --* LHDET - Check to see if Lat Application Terminal session should be; disconnected.;.;,=; A session is disconnected if the original connection to the;=; application terminal at the terminal server was an implicit <; connection. Lat Process is mapped and called to check the; status in the circuit block.;b; Called by TTATTM; !; Inputs: R5 - U.TSTA of terminalR;r*; Outputs: CS if terminal is to be hung up; CC if not.;tBLHDET:: BITB #LE.ORG,U.CREN-U.TSTA(R5) ; Session result of IO.ORG?) BNE 10$ ; if NE yes, don't hang up TTn5 BITB #LE.HIP,U.CREN-U.TSTA(R5) ; Hangup in progress?s) BNE 10$ ; if NE, yes - don't hang up.i& SEC ; show terminal to be hung up 10$: RETURNr ; ; Common Subroutines;n; FNDUCB-find next LH UCBd7; Returns LH port first UCB and next/first UCB address.; Input:#; R2-DCB address (0 if first entry)f!; R5-Current UCB's U.TSTA addressr ; Output: ; 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 foundt; R2=DCB on input:; R2-UnchangedT,; R5-Next UCB's address (0 if no more UCBs);NFNDUCB:d TST R2 ; First entry?s BNE 30$ ; Branch if not0% MOV $CTLST,R2 ; First CTB in chains&10$: CMP L.NAM(R2),#"LH ; TT device? BEQ 20$ ; BR if yes  MOV (R2),R2 ; Next CTB# BNE 10$ ; If NE, Check next onee SEC ; CTB not found)00jibjbkb a a a RETURN ; Return with no LH data baseu(20$: MOV L.DCB(R2),R2 ; R2-DCB address* MOV D.UCB(R2),R5 ; R5-First UCB address ADD #U.TSTA,R5 ; R5-U.TSTA2 CLC ; CTB found" RETURN ; R2-DCB, R5-First UCB=30$: CMPB U.SESN-U.TSTA(R5),D.UNIT+1(R2) ; Current unit-last?B BLO 40$ ; BR if not0( CLR R5 ; No more units (return R5=0) BR 50$ ; And exit '40$: ADD D.UCBL(R2),R5 ; R5-Next unit50$: RETURN ; And exit;1/; MOVSB - Move source buffer into output buffert; Input:; R0 - Number of bytes to copy; R5 - UCB address, were:R#; U.TRLH-U.TSTA - Source addressR+; U.TRSC-U.TSTA - Number of bytes leftR+; Send word in U.TRLH buffer-buffer sizeR6; R4 - CCB address, containing output buffer bias/virt3; Output buffer should be biased through APR6. ; Output:I; C.BUF+2(R4) Modified - points to the first free byte in the output buffD;; C.CNT(R4) Modified - remaining bytes in the output buffer;; Note: B; Algorithm works for I/D space and non-I/D space systems. KISARi,9; found for source buffer mapping always maps data space.A;S; All registers preservedS;.MOVSB: MOV R0,-(SP) ; Save R0S MOV R1,-(SP) ; Save R1u MOV R2,-(SP) ; Save R2e MOV R3,-(SP) ; Save R3r MOV R4,-(SP) ; Save R4u0 SUB R0,C.CNT(R4) ; C.CNT-Avail. in I/O buffer5 MOV U.TRLH-U.TSTA(R5),R2 ; R2-Source buffer addressi CLR R1 ; Settup for BISB/ BISB 2(R2),R1 ; R1-Number of bytes in buffer( ADD #4,R2 ; R2-Bytes start in buffer ADD R1,R2 ; R2-End of buffer6 SUB U.TRSC-U.TSTA(R5),R2 ; R2-Current byte in buffer! MOV R2,R1 ; R1-Source addresss% ; Make R2 APR5 biased for BLXIOe, 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 onlyS' BIC #177761,R1 ; Clear all junk bitsb' MOV KISAR0(R1),R1 ; R1-Buffer bias2) MOV C.BUF(R4),R3 ; R3-Destination biasd. MOV C.BUF+2(R4),R4 ; R4-Destination address CALL $BLXIO ; Move data  ; R0-Changed ; R2-Last source byte+1  ; R4-Last output byte+1  ; R1,R3-Preserved MOV R4,R1 ; Store R4# MOV (SP)+,R4 ; Restore CCB in R4 6 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 RETURN1; 2; MUCBX - Map UCBX buffer on call from LAT process;i; Note:A; Need that only if UCBX is being used on calls from LAT process. ;e; Input: ; R5 - U.TSTAg; ; Output:L; None;bMUCBX: .IF DF T$$SPL ; I/D space systemsR* MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ; Map UCBX+ MOV #120000,R4 ; R4-Virtual UCBX addressU .IFF ;T$$SPLu ; Non I/D space systems($ MOV U.TUX-U.TSTA(R5),R4 ; Get UCBX .ENDC ;T$$SPL RETURN  ;t"; PRNTO - Process non task output.;R7; Allocate buffers and move the output into the buffersp,; 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.); ;; If enough buffers cannot be allocated exit with U.TOC andX=; U.TOP+2 settup for the remainder. Else U.TOC will be zero.u; <; If the buffer resides in APR6, and U.TOP is non-zero, then=; insure that the external buffer is mapped to move data fromo; one spot to the next.o;e1; If any buffers were added to U.TRLH set UL.TDA.p;i; Input:; R5-UCB address;cPRNTO: MOV R0,-(SP) ;e MOV R1,-(SP) ; Save MOV R2,-(SP) ; Registerst MOV R3,-(SP) ;N MOV R4,-(SP) ;o( CALL MUCBX ; Returns UCBX addr in R4# TSTB U.TOC(R4) ; anything to do? " BEQ 70$ ; if EQ, just return..45$: MOV U.TRLH-U.TSTA(R5),R1 ; R1-XMT buffers chain) BEQ 30$ ; Branch if there is no chainu$10$: TST (R1) ; There is a chain- BEQ 20$ ; Find end ofp" MOV (R1),R1 ; Terminal buffers BR 10$ ; Chain" ; R1-addr of t00rEt__DATADATADATADATAhe last buffer:20$: CMPB #BF$FLO,3(R1) ; Is this a Flow control buffer?+ BEQ 30$ ; If EQ yes - Don't put in dataR+ CMPB #T$$BFL-4,2(R1) ; Is this one full?B% BEQ 30$ ; If EQ yes - get new one.,25$: MOV R1,R2 ; Settup register for call% CALL MOVBFR ; Move the charactersT 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 pointer0 ASSUME BF$NOR,0$ CLR 2(R2) ; Clear count and type% CALL MOVBFR ; Move the charactersn% TST R1 ; Is there a U.TRLH chain?i BNE 45$ ; Yes-branch4 MOV R2,U.TRLH-U.TSTA(R5) ; No-new buffer-first one BR 50$ ; And out$45$: ; R1 points to last buffer- MOV R2,(R1) ; Link buffer to U.TRLH chain -50$: TSTB U.TOC(R4) ; Did we do it all yet?i BNE 5$ ; If NE no - Go onr BR 70$ ; All done960$: BISB #UL.NTO,U.LINS-U.TSTA(R5) ; Note waiting outputs70$: MOV (SP)+,R4 ; Restore  MOV (SP)+,R3 ;) MOV (SP)+,R2 ; RegistersC MOV (SP)+,R1 ;e MOV (SP)+,R0 ;T RETURN ; And exit H;a0; CLEAN - Cleanup after an abort or stop session;(9; Deallocate all buffers other than prompt buffers. Clear 7; transmit data available flag. An IO.RPR buffer chainf:; will be the last thing in the list except for a possible8; DATA_B buffer which will be deallocated along with the; IO.RPR chain later..;,CLEAN: MOV R1,-(SP) ; Save R1o MOV R2,-(SP) ; Save R2 - MOV U.TRLH-U.TSTA(R5),R2 ; Get the listhead " BEQ 30$ ; Branch if no buffers+10$: CMPB #BF$RPR,3(R2) ; Is this IO.RPR?* BEQ 30$ ; If EQ yes - Don't deallocate' MOV (R2),-(SP) ; Get the next bufferh" CALL DETB ; Delete this buffer% MOV (SP)+,R2 ; Get the next bufferb' BNE 10$ ; And go on if there is one ;30$: BICB #UL.TDA!UL.NOD,U.LINS-U.TSTA(R5) ; Clear the flag ) CLR U.TRLH-U.TSTA(R5) ; Clear XMT queuel- CLR U.TRSC-U.TSTA(R5) ; Clear queue counterM MOV (SP)+,R2 MOV (SP)+,R1U RETURN ; And all done l .PSECT MAP5;+:; **-MOVBFR- Copy buffer data into TTDRV buffers, and link; into the pending data chain;e<; Note: The buffer may need to be mapped, and therefore this-; code must reside in APR5 to work correctly.+; .; Move the data and update counts and pointers;f; R2 - Buffer addressC;U MOVBFR: 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 / SUB (SP),R0 ; get remaining space in bufferf! CLR R3 ; Prepare for the BISBk& BISB U.TOC(R4),R3 ; R3-string count CMPB R3,R0 ; Will it fit? & BHI 20$ ; If HI no - Do one buffer MOV R3,R0 ; Move all of it)20$: SUB R0,R3 ; Compute the remainingn# MOVB R3,U.TOC(R4) ; And store itC) ADD R0,(SP) ; Add in these charactersR1 MOVB (SP)+,2(R2) ; Move byte counter in bufferG6 MOV U.TOP+2(R4),R3 ; R3-source buffer start address) ADD R0,U.TOP+2(R4) ; Update the sources, ADD #4,R2 ; Data start address in buffer1 ADD (SP)+,R2 ; Address in buffer for this data  .IF DF,T$$ACD ; ACD support?C4 BIT #S2.OBF,2(R5) ; Are we doing buffered output?, BNE 60$ ; If NE, yes, buffer is in TTCOM& TST U.TOP(R4) ; is a bias provided?) BEQ 60$ ; if EQ, nope, no need to mapD* CMP R3,#140000 ; is the buffer in APR6?% BLO 60$ ; if LO, nope, no mappingf, MOV @#KISAR6,-(SP) ; save current mapping740$: MOV U.TOP(R4),@#KISAR6 ; map the buffer if neededA# MOVB (R3)+,-(SP) ; copy the byteu# MOV 2(SP),@#KISAR6 ; remap TTCOMf0 MOVB (SP)+,(R2)+ ; Move byte from echo buffer SOB R0,40$ ; until all donee TST (SP)+ ; clean the stack$ BR 80$ ; skip the byte copyC .IFTF ;DF,T$$ACD ,60$: MOVB (R3)+,(R2)+ ; copy the character SOB R0,60$ ; Move all bytes0 .ENDC ;DF,T$$ACD 80$: ; reference label, ; Destination buffer built7 BISB #UL.TDA,U.LINS-U.TSTA(R5) ; Data i00zibjbkb a a as now availableK MOV (SP)+,R2 ; Restore R2 RETURNV R;,B; FILSH - Fill in slot header session number and slot length bytes;S; Input:; R2 - Slot header address; R3 - Slot type1; C.BUF+2(R4) - Next available byte in I/O bufferc; U.SESN - Slot number;y ; Output:; Bytes filled in slot header ;)FILSH: MOV R1,-(SP) ; Save R1B. MOV C.BUF+2(R4),R1 ; R1-Next available byte. SUB R2,R1 ; R1-Filled bytes in slot (+HDR)/ SUB #SL$SDS,R1 ; Filled bytes without header5# MOV @#KISAR6,-(SP) ; Save APR6+. MOV C.BUF(R4),@#KISAR6 ; Map output buffer3 MOVB R1,SL$SBC(R2) ; Fill slot counter in headert9 MOVB U.SESN-U.TSTA(R5),SL$SID(R2) ; Fill slot identifyery- MOVB R3,SL$TYP(R2) ; Fill in the slot typeb) CMPB #240,R3 ; Data_b slot? ;JEM001t BNE 10$ ;JEM001t. MOVB #4,SL$SDS(R2) ; Control flag ;JEM00110$: ;JEM001 ) MOV (SP)+,@#KISAR6 ; Restore mapping1 MOV (SP)+,R1 ; Restore R1 RETURNS; 4; GCHR - Get/Put character from/into unmapped buffer; ; Input:; U.RSBB - Buffer bias; R1 - Byte virtual addressM; R2-S(; <0 - Get character from buffer to R2*; >=0 - Put character from R2 into buffer;t"; Output for R2<0 - low byte in R2;iGCHR:h$ MOV @#KISAR6,-(SP) ; Save APR 64 MOV U.RSBB-U.TSTA(R5),@#KISAR6 ; Map input buffer TST R2 ; Test R2 BGE 10$ ; Branch if >=0  CLR R2 ; Prepare R2@' BISB (R1),R2 ; Move character in R2R BR 20$ ; DoneR-10$: MOVB R2,(R1) ; Move character from R2n20$:. MOV (SP)+,@#KISAR6 ; Restore APR6 mapping RETURN-; &; Call to LAT process: (APR 5 always).;a9; 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.@;S+FPLAT:: ; This entry included in FRKTB ; Table in TTDAT moduleC; ); Call from fork process comes here with:h; R4-UCBX address; R5-UCB address:;V MOV R3,-(SP) ; Save R3e1 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 code  BR CALLT ; Call LAT process 10$: MOV R0,-(SP) ; Save R0o: 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 calll;oN; Find out how many data buffers we have. If it is too many don't call ODONE.;R CLR R0 ; Init the countU. MOV U.TRLH-U.TSTA(R5),R3 ; Get start of list$ BEQ 30$ ; Branch if no more list!20$: INC R0 ; Update the countB% MOV (R3),R3 ; Get the next bufferV$ BNE 20$ ; Branch if there is one!30$: CMP R0,#MAXBUF ; Too many? BLOS 35$ ; If LOS no - Go on4 BISB #UL.NOD,U.LINS-U.TSTA(R5) ; Note no ODONE call! BR 40$ ; And call LAT process4"35$: BIC #S1.DSI,(R5) ; Clear it% MTPS #TTPRI ; Raise to priority 5a$ CALL ODONE ; Process the request MTPS #0 ; Back to zero6 BIS #S1.DSI,(R5) ; Reset S1.DSI for other processes40$: MOV (SP)+,R0n) MOV #PO$OUT,R3 ; Set the function code  BR CALLT ; Call LAT process ;e=; Direct call if priority message has to go out. In this caseM; LAT should not call $LHOUT. ; Input parametrs:; R3-Operation code;S; R5-UCB addressn;DLTPRC:: MOV R3,-(SP) ; Save R3rCALLT: MOV R4,-(SP) ; Save R4 * MOV U.SCB-U.TSTA(R5),R4 ; R4-SCB address MOV S.KRB+2(R4),-(SP) ; Bias! MOV S.KRB+4(R4),-(SP) ; Virtual , CALL $MPPRO ; Maps and calls LAT process ; Restores SPM MOV (SP)+,R4 ; Restore R4 MOV (SP)+,R3 ; Restore R3 RETURN ; And exit; 6; The LAT process calls LAT port at common entry point; with the function code in R3.c; "$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 againi RETURN ; Exit thr00t__DATADATADATADATAough 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 addressr- MOV S.KRB+10(R5),R1 ; Get input parametersi MOV S.KRB+12(R5),R2 ; ... MOV S.KRB+14(R5),R3 ; ... MOV S.KRB+16(R5),R4 ; ...% MOV R5,-(SP) ; Save address of SCBs" CALL @LHDSP(R3) ; Call function% MOV (SP)+,R0 ; Restore SCB addresst3 MOV R1,S.KRB+10(R0) ; Return function parametersP MOV R2,S.KRB+12(R0) ; ....T MOV R3,S.KRB+14(R0) ; ... MOV R4,S.KRB+16(R0) ; ... MOV R5,S.KRB+20(R0) ; ... RETURN  .ENDC ;T$$LTH .END MOV U.SCB-U.TSTA(R5),R5 ; Get SCB addressr- MOV S.KRB+10(R5),R1 ; Get input parametersi MOV S.KRB+12(R5),R2 ; ... MOV S.KRB+14(R5),R3 ; ... MOV S.KRB+16(R5),R4 ; ...% MOV R5,-(SP) ; Save address of SCBs" CALL @LHDSP(R3) ; Call function% MOV (SP)+,R0 ; Restore SCB addresst3 MOV R1,S.KRB+10(R0) ; Return function parametersP MOV R2,S.KRB+12(R0) ; ....T MOV R3,S.KRB+14 .TITLE MPENTC .IDENT /03.03/ ;N1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.N; All rights reservedB;UA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDN9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.D;R; K. E. KINNEAR 26-JAN-79 ;'; MULTIPROCESSOR CPU STARTUP PROCESSING;V; MODIFIED BY:;E; J. W. BERZLE;4$; MODIFIED FOR RSX-11M-PLUS V4.4 BY:; !; D. T. CARROLL 30-MAY-1992 03.01V;P6; DC103 -- Insure the clock vector is set correctly0; for the P-clock when an L-clock is in use;i$; MODIFIED FOR RSX-11M-PLUS V4.5 BY:;N; D. CARROLL 17-JUN-1993 03.027; DC227 -- Handle possible UNIBUS memory configurationE;E$; Modified for RSX-11M-PLUS V4.6 by:;R; D. Carroll 18-Oct-1995 03.03:; DC404 - Include PSECT definitions to allow extention of ; ICB pool;I;DC; THE FOLLOWING CODE IS DUPLICATED IN INITL.MAC, AND IS USED TO SET C; THE MAPPING FOR STARTUP OF A CPU. ANY MODIFICATIONS HERE MUST BEo); REFLECTED IN THE SIMILAR CODE IN INITL.P;o;e; MACRO LIBRARY CALLS; .MCALL BGCK$A ;DC404. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 .IF DF M$$PROA$PENT:: MOV #PMODE!PR7,PS ;;;INIT MODE BITS & LOCK OUT INTERRUPTS:1 MOV #$STACK-20,SP ;;;SET UP KERNEL STACK POINTERc4 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 5$ ;;;IF NE DATA SPACE LOADEDU# TST $URMST ;;;IS THIS FROM INITL?D) BNE 5$ ;;;IF NE NO -- REGULAR CPU ENTRYL8 MOV #$MESS1,R4 ;;;SPECIFY DATA SPACE NOT LOADED MESSAGE. CALL $FATAL ;;;PRINT OUT FATAL ERROR MESSAGE2 BGCK$A BF.MP,BE.NDS,HALT ;;;DATA SPACE NOT LOADED5$: SUB #200,R2 ;;; .IFTF6$: ;;;REFERENCE LABELC .IFTc2 MOV #77406,KDSDR0-KINAR0(R5) ;;;SET D SPACE 4K RW3 MOV R2,KDSAR0-KINAR0(R5) ;;;SET D SPACE APR OFFSET + ADD #200,R2 ;;;ADVANCE D SPACE APR OFFSETR2 MOV #77402,KINDR0-KINAR0(R5) ;;;SET I SPACE 4K RO .IFF;2 MOV #77406,KINDR0-KINAR0(R5) ;;;SET I SPACE 4K RW .IFTF' MOV R1,(R5)+ ;;;SET I SPACE APR OFFSETO' ADD #200,R1 ;;;ADVANCE I SPACE OFFSETO CMP R5,#KINAR7 ;;;DONE YET? BLOS 6$ ;;;IF LOS NO. MOV #177600,KINAR7 ;;;SET UP I/O PAGE MAPPING .IFT$3 MOV #177600,KDSAR6+2 ;;;SET UP D-SPACE MAPPING TOO0& CLR (R5) ;;;CLEAR DSPACE APR0 OFFSET .ENDC .IF DF K$$DAS!M$$EXT!S$$LIB MOV #S3$BTS,SR3 ;;;SET UP SR3 .ENDC! INC SR0 ;;;START MEMORY MAPPINGS;S=; WE HAVE, WITH THE LAST INSTRUCTION, JUST CHANGE THE MAPPINGS<; THROUGH WHICH THE CPU IS FETCHING INSTRUCTIONS. IF WE ARE=; ON CPA THEN NO ACTUAL CHANGE WAS MADE, BUT IF ON SOME OTHER;B; CPU, THEN WE ARE NOW FETCHING INSTRUCTIONS FROM THE NEW MAPPING.;A* 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 STARTUP02$MAPCP::MOV $IICTB,R1 ;;;GET AN IIST KRB (ANY ONE)+ MOV #9$,-(SP) ;00ibjbkb a a a;;SET UP RETURN FROM $SGFIN& 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 BYTEC( BIC #177770,R0 ;;;CLEAR EXTRANEOUS BITS' CMPB R0,$NCPU ;;;TOO HIGH A PROCESSOR? ' BGE 8$ ;;;IF GT YES -- MAKE CPA AGAIN;$ ASL R0 ;;;MAKE CPU INTO WORD INDEX1 MOV $IICTB(R0),R1 ;;;GET PROPER IIST KRB ADDRESS;9 BIC #KS.OFL,K.STS(R1) ;;;CLEAR OFFLINE BIT FOR THIS IISTE6 MOV (R1),$PWCSR ;;;SAVE IIST CSR FOR POWER UP ROUTINE! ;;;IN CPA'S CPU SPECIFIC AREAI RETURN8$: CLR R0 ;;;FORCE TO CPAR RETURNI19$: MOV $K6TAB(R0),KINAR0 ;;;SET UP LOCAL MAPPING' .IF DF K$$DAS2 MOV $K6TAB(R0),KDSAR0 ;;;SET UP FIRST D SPACE PAR .ENDC. MOV #$STACK-20,SP ;;;SET UP PROPER STACK AREA* MOV R5,-(SP) ;;;MAKE INTO SUBROUTINE CALL .IF DF X$$DBT; BIT $CPBIT,$XDTFL ;;;HAS XDT BEEN INITIALIZED ON THIS CPU?C BNE 12$ ;;;IF NE YES CALL $XDTIN ;;;INITIALIZE XDTM>12$: MOV #PMODE!PR7,PS ;;;SET UP MODE BITS AFTER XDT SCREWS IT .ENDC;CD; INITIALIZE THE UNIBUS MAPPING REGISTERS ON THIS PROCESSOR IF IT IS; A PDP-11/7X TYPE PROCESSOR.A;N2 CALL $SGFIN ;;;CATCH MEMORY FAULTS AND SET CARRY4 MOV #UBMPR,R0 ;;;POINT TO FIRST UNIBUS MAP REGISTER% BIC #HF.UBM,$HFMSK ;;;ASSUME NO UMRS( TST (R0) ;;;ARE UMRS PRESENT? BCS 20$ ;;;IF CS NOB5 BIS #HF.UBM,$HFMSK ;;;INDICATE THAT UMRS ARE PRESENTU- MOV KINAR0,R3 ;;;GET MAPPING OF VIRTUAL ZEROI( CLR R2 ;;;CLEAR HIGH PART OF UMR VALUE2 ASHC #6,R2 ;;;CONVERT TO DOUBLE WORD BYTE OFFSET .IF DF P$$D74- BIS #100000,R2 ;;; FORCE CACHE BYPASS ON UMRF .ENDC ;DF,P$$D747' MOV R3,(R0)+ ;;;SET UP LOW HALF OF UMR % MOV R2,(R0)+ ;;;AND HIGH HALF OF UMRM .IF DF K$$DAS. MOV $SCMOF,R3 ;;;PICK UP OFFSET TO DATA SPACE CLR R2 ;;;SET FOR CONVERSION2 ASHC #6,R2 ;;;CONVERT TO DOUBLE WORD BYTE OFFSET) MOV #4,R1 ;;;SET COUNT OF UMR'S TO LOADR .IF DF P$$D740 BIS #100000,R2 ;;; INCLUDE CACHE BYPASS AS WELL .ENDC ;DF,P$$D74F015$: 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 ;;;...R! SOB R1,15$ ;;;LOOP FOR ALL UMRSV .IFF  CLR R1 ;;;INIT UMR OFFSET.3 MOV #4,R2 ;;;SET NUMBER OF REGISTER PAIRS TO LOADA(15$: ADD #20000,R1 ;;;ADVANCE UMR OFFSET, MOV R1,(R0)+ ;;;LOAD LOW 16 BITS OF ADDRESS .IF DF P$$D740 MOV #100000,(R0)+ ;;;INIT WITH CACHE BYPASS SET .IFF ;0+ CLR (R0)+ ;;;CLEAR HIGH 6 BITS OF ADDRESSC .ENDC ;DF,P$$D74M! SOB R2,15$ ;;;LOOP FOR ALL UMRSA .ENDC .IF DF U$$BME+ MOV #UBMPR+174,R1 ;;; SET LAST UMR ADDRESSP)17$: MOV #160000,(R0)+ ;;; ZERO OUT A UMRB$ BCS 18$ ;;; IF CS, UMR NOT PRESENT! .IF DF P$$D74 ;;; 11/74 SYSTEM?3 MOV #100077,(R0)+ ;;; AND MAP TO NEVER, NEVER LAND .IFF ;#/ MOV #77,(R0)+ ;;; AND MAP TO NEVER, NEVER LANDL .ENDC ;DF,P$$D74A! CMP R1,R0 ;;; DONE ALL OF THEM?0 BNE 17$ ;;; NOPE, CONTINUE118$: SUB R0,R1 ;;; DETERMINE HOW MANY UMRS EXIST , ADD #4,R1 ;;; AND ACCOUNT FOR THE LAST UMR/ MOV R0,$UBUMR+M.UMRA ;;; SET THE FIRST NXM UMR' MOV R1,$UBUMR+M.UMRN ;;; AND THE COUNTS .ENDC ;DF,U$$BME(20$: RETURN ;;;M;B@; SCAN PARITY MEMORY CSR REGISTERS AND CREATE TABLE FOR THIS CPU;2PARTB: MOV #$DIRXT,-(SP) ;;;EXIT FINALLY TO $DIRXT/ CALL $SGFIN ;;;CATCH TRAPS TO 4 AND SET CARRYN2 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 TABLE 316$: MOVB (R4)+,R3 ;;;GET NUMBER OF CSR'S TO SET UP  BEQ 22$ ;;;IF EQ DONER" CLR R2 ;;;INITIALIZE CSR ADDRESS' BISB (R4)+,R2 ;;;CALCULATE CSR ADDRESSN) SWAB R2 ;;;GET HIGH BYTE OF CSR ADDRESSL- BISB (R4)+,R2 ;;;GET LOW BYTE OF CSR ADDRESS;17$: TST (R2) ;;;CSR PRESENT? BCS 19$ ;;;IF CS NOT! MOV R2,(R1)+ ;;;SAVE CSR ADDRESS BR 20$ ;;;119$: M00t__DATADATADATADATAOV R0,(R1)+ ;;;POINT TO FIRST WORD OF TABLEF$20$: ADD #2,R2 ;;;POINT TO NEXT CSR SOB R3,17$ ;;;LOOP UNTIL DONEB2 BR 16$ ;;;CONTINUE THROUGH THE REST OF THE TABLE;EA; CLOCK INITIALIZATION -- CLOCKS ON ALL SECONDARY PROCESSORS MUST;C; BE THE SAME TYPE AS THE PRIMARY PROCESSOR (I.E. EITHER ALL KW11-LA; OR KW11-P) OR WE WILL HALT;R+22$: TST @$CKCSR ;;;IS THE CLOCK AVAILABLER BCC 25$ ;;;IF CC YES4 BGCK$A BF.MP,BE.NCK,HALT ;;;NO -- CLOCK UNAVAILABLE'25$: CMP #172540,$CKCSR ;;;IS IT KW11-PV BNE 30$ ;;;IF NE NOI- MOV #$CKINT,@#104 ;;;SET UP KW11-P INTERRUPT  .IF DF E$$NSI, MOV #$NS1,@#100 ;;;DISABLE KW11-L INTERRUPT .IFF ;E$$NSIR. MOV #$NONSI,@#100 ;;;DISABLE KW11-L INTERRUPT .ENDC ;E$$NSI BR 40$ 30$: .IF DF E$$NSI, MOV #$NS1,@#104 ;;;DISABLE KW11-P INTERRUPT .IFF ;E$$NSI1. MOV #$NONSI,@#104 ;;;DISABLE KW11-P INTERRUPT .ENDC ;E$$NSI- MOV #$CKINT,@#100 ;;;SET UP KW11-L INTERRUPT* TST $CKCSR ;;;DOES THE CLOCK HAVE A CSR? BEQ 45$ ;;;IF EQ NO5540$: MOV $CKLDC,@$CKCNT ;;;SETUP CLOCK COUNT REGISTERV# MOV #K$$IEN,@$CKCSR ;;;START CLOCKR45$: ;;;REFERENCE SYMBOLN .IF DF F$$LPP& TST PIRQ ;;;IS THERE A PIRQ REGISTER BCS 50$ ;;;IF CS NOW( MOV #$FPPRQ,@#240 ;;;SET UP PIRQ VECTOR9 MOV #$FPPR8,@#244 ;;;SET UP FLOATING POINT EXCEPTION VECR50$: ;;;REFERENCE LABEL .ENDCG; MOVE $HFMSK FROM CPA'S LOWCR INTO THAT OF THE PROCESSOR COMING ONLINEK0 MOV KISAR6,-(SP) ;;;SAVE CURRENT KERNEL MAPPING* CLR KISAR6 ;;;MAP TO CPA'S LOW CORE AREA7 MOV $HFMSK+140000,$HFMSK ;;;PROPAGATE TO NEW PROCESSORN+ MOV (SP)+,KISAR6 ;;;RESTORE KERNEL MAPPINGE LOCK$ $EXECL,WAIT: LOCK$ $IIFNL,SPIN ;;;LOCK THE MULTIPROCESSOR FUNCTION TBL. BIC #MP.STP,@$MPSWT ;;;CLEAR OUT OUR STOP BIT* ULOCK$ $IIFNL,SPIN ;;;UNLOCK THE FN TABLE# CALL $CPNIT ;;;START UP PROCESSORR .IF NDF X$$DBT0$XDTIN:: ;;;REFERENCE LABEL -- NULL SUBROUTINE .IFTF RETURNN .ENDC .ENDC .ENDRENT KERNEL MAPPING* CLR KISAR6 ;;;MAP TO CPA'S LOW CORE AREA7 MOV $HFMS .TITLE DREIF .IDENT /17.04/;0; Copyright (c) 1995-1999 by Mentec Inc., U.S.A.; 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 13-SEP-73;;+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:; ; J. W. BERZLE; J. R. KAUFFMAN; J. M. LAWLER; B. S. MCCARTHY; L. B. MCCULLEY;$; MODIFIED FOR RSX-11M-PLUS V4.0 BY:;; B. S. MCCARTHY; L. M. ZIEGLER ; K. L. NOEL;.$; MODIFIED FOR RSX-11M-PLUS V4.1 BY:;y ; K. L. NOEL1; P. K. M. WEISS; Eric Postpischil; L. B. McCulley;H$; MODIFIED FOR RSX-11M-PLUS V4.2 BY:;A; P. K. M. WEISS; L. M. PETERSON;O$; MODIFIED FOR RSX-11M-PLUS V4.3 BY:; ; K. L. NOELR;-$; MODIFIED FOR RSX-11M-PLUS V4.5 BY:;U ; D. CARROLL 15-Feb-1993 17.03;E5; DC101 -- CORRECT KERNEL AST DISPATCH ON MP SYSTEMS -; DURING EXIT PROCESSING (THEY CAN HAPPEN) ;0; D. Carroll 05-Jan-1995 17.04M;I:; DC350 -- Allow CP/RSX to return exit status back out to; to the VMS parent process;W;S; EXIT DIRECTIVESl; ; MACRO LIBRARY CALLSO;I1 .MCALL ABODF$,HDRDF$,PCBDF$,PKTDF$,TCBDF$,BGCK$A  .MCALL CPRDF$  CPRDF$D R" ABODF$ ;DEFINE TASK ABORT CODES% HDRDF$ ;DEFINE TASK HEADER OFFSETS 1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS E A .IF DF A$$CNT . .MCALL ACNDF$* ACNDF$ ;DEFINE ACCOUNTING BLOCK OFFSETS e .ENDC t .IF DF L$$GCL .MCALL LNMDF$ LNMDF$e .ENDC ;D; LOCAL SYMBOL DEFINITIONR; 0CLRMSK=T2.AST!T2.DST!T2.SEF!T2.HLT!T2.ABO!T2.REX?CLRMSK=CLRMSK!<*2>!T2.STP!T2.SPN!T2.WFR MAP6=140000 ;APR 6;+; **-$DREIF-EXIT IFF;TG; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF THE A; ISSUING TASK IF, AND ONLY IF, AN INDICATED EVENT FLAG IS CLEAR.E;A ; DPB FORMAT:T;."; WD. 00 -- DIC(53.),DPB SIZE(2.).?; WD. 01 -- EV00ibjbkb a a aENT FLAG NUMBER OF EVENT FLAG THAT MUST BE CLEAR.L;N ; INPUTS:M;e; R0=EVENT FLAG MASK WORD.; R1=EVENT FLAG MASK ADDRESS.M9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.!+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.F/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.T,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;O5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)D;L-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. <; DIRECTIVE STATUS OF 'D.RS22' IS RETURNED IF THE SPECIFIED; EVENT FLAG IS SET.; C=1 IF DIRECTIVE IS REJECTED.9; DIRECTIVE STATUS OF 'D.RS97' IF NO OR AN INVALID EVENTF; FLAG NUMBER IS SPECIFIED.S;- .ENABL LSB  .IF NDF D$$PAR!'$DREIF::BIT R0,(R1) ;EVENT FLAG CLEAR?2 BEQ $DREXT ;IF EQ YESE$ DRSTS D.RS22 ;SET DIRECTIVE STATUS;+; **-$DREXT-EXIT;TG; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO TERMINATE THE EXECUTION OF THE ; ISSUING TASK.I;U ; DPB FORMAT:L;D"; WD. 00 -- DIC(51.),DPB SIZE(1.).;R ; INPUTS:T;S9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.E+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.D,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;=; NOTE: THIS DIRECTIVE IS ALSO CALLED FROM THE DISPATCHER AND 7; THEREFORE ONLY REQUIRES R5 TO BE LOADED ON ENTRANCE.R;-=; PRIVILEGED TASKS WHICH DESIRE TO CALL $DREXT DIRECTLYE=; SHOULD SWITCH TO SYSTEM STATE AND IMMEDIATELY CALL $DREXT .; WITHOUT CALLING ANY OTHER EXEC SUBROUTINES./; THIS IS BECAUSE OF POSSIBLE SIDE EFFECTS OF ); OTHER EXEC ROUTINES (SUCH AS $TSKRP). R;N0; BECAUSE MANY PRIVILEGED TASKS CALL $DREXT, WE3; WILL UNCONDITIONALLY MAP THE TASK HEADER SO THATT1; THIS CODE DOES NOT HAVE TO BE ADDED ELSEWHERE.M;E;S5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)D; @; NO STATUS IS RETURNED TO THE ISSUING TASK SINCE THIS DIRECTIVE; TERMINATES ITS EXECUTION.H;-$DREXT:: ;REFERENCE LABEL  .IF DF X$$HDR+ MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADERO .ENDC ; DF X$$HDR  .IF DF P$$OFF A ' BIT #T3.ACP,T.ST3(R5) ;IS TASK AN ACP?L BNE $DREX1 ;IF NE YESO5 MOV #EX$SUC,T.EFLG+2(R5) ;SET SUCCESSFUL EXIT STATUSD>$DREX2::MOV #S.CEXT,T.EFLG(R5) ;SET SUCCESS CODE IN ABORT CODE  .ENDC $DREX1:: .IFF ; NDF D$$PAR,$DREX3:: ;REFERENCE LABEL FOR STUB ROUTINE ;IN DRSUBT .IF DF K$$DAS9 MOV KINAR5,KDSAR5 ;REMAP IN D SPACE (IN CASE CALLED FROM; ;SCHEDULER)H .ENDC ; DF K$$DAS .ENDC ; NDF D$$PAR. .IF DF, G$$GEF* BIT #T2.AST,T.ST2(R5) ;TASK IN AST STATE? BEQ 56$ ;IF EQ NOF. BIT #T2.WFR*2,T.ST2(R5) ;WAS TASK IN AST WFR? BEQ 56$ ;IF EQ NOE/ MOV H.EFSV(R4),R3 ;GET EVENT FLAG MASK ADDRESSB0 CALL $DEAGF ;DEACCESS GROUP GLOBAL EVENT FLAGS56$:* MOV $SAHPT,R4 ;GET ADDRESS OF TASK HEADER. CALL $UNLCK ;UNLOCK GROUP GLOBAL EVENT FLAGS! BCS 57$ ;IF CS ALREADY UNLOCKEDK) CALL $ELIM ;ELIMINATE THEM IF NECESSARYL'57$: MOV $TKTCB,R5 ;RESTORE TCB POINTER  .ENDC ; DF G$$GEF( CALL $DRCMT ;CANCEL MARK TIME REQUESTS T S .IF DF D$$MND 2 CMP $TKTCB,$DITCB ;IS DIAMOND WATCHING THIS TASK? BNE 101$ ;IF NE NO' BIC #1,@$DICSR ;RESET DIAMOND REGISTER, CLR $DITCB ;CLEAR TCB ADDRESS101$: ;REFERENCE SYMBOL L .ENDC  .IF DF C$$INT T $ MOV T.PCB(R5),R4 ;POINT TO TASK PCB; BIT #PS.CHK,P.STAT(R4) ;DOES TASK POSSIBLY HAVE ANY ITB'S?L BEQ 2$ ;IF EQ NO /1$: MOV P.DPCB(R4),R1 ;PICK UP NEXT ITB POINTER. BEQ 2$ ;IF EQ NONE LEFT  .IF DF D$$PAR3 MOV #$DISIN,-(SP) ;PUSH ADDRESS OF DISABLE ROUTINE,, CALL $MPDC2 ;CALL THROUGH INDIRECT ROUTINE .IFF ; DF D$$PAR#, CALL $DISIN ;DISCONNECT INTERRUPT VECTOR  .ENDC ; DF D$$PAR BR 1$ ; 2$: ;REF LABEL  .ENDC  .IF DF M$$PRO V' CLR T.RRM(R5) ;REMOVE ALL CPU AFFINITYS K .ENDC  E A P .IF DF D$$PAR B/ MOV $DRAPR,KINAR5 ;MAP THE DIRECTIVE PARTITIONR P .00t__DATADATADATADATAENDC  + CALL $RLMCB ;RELEASE MCR COMMAND BUFFER D. 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 TASK + CLRB $CXDBL ;CLEAR CONTEXT DISABLE FLAG B6 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 LIST34$: 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 TAILK) CLR T.SAST(R5) ;ASTS NO LONGER SPECIFIED !5$: JSR R5,MTQUE ;EMPTY AST QUEUEC, .WORD T.ASTL ;OFFSET TO AST QUEUE LISTHEAD/ .WORD $DEACB ;ADDRESS OF DEALLOCATION ROUTINEB5 BIT #T3.NSD!T3.ACP,T.ST3(R5) ;FLUSH RECEIVE QUEUE? D BNE 7$ ;IF NE NO F .IF DF P$$OOL ! CALL MTRCVL ;EMPTY RECEIVE LISTE S .IFFT S" JSR R5,MTQUE ;EMPTY RECEIVE QUEUE0 .WORD T.RCVL ;OFFSET TO RECEIVE QUEUE LISTHEAD/ .WORD $DEPKT ;ADDRESS OF DEALLOCATION ROUTINEI H .ENDC V ,7$: ;REF LABELI C .IF DF X$$HDR/ MOV $SAHPT,R4 ;GET CURRENT TASK HEADER ADDRESSS .IFF/ MOV $HEADR,R4 ;GET CURRENT TASK HEADER ADDRESSD .ENDC .IF DF P$$LAS T #( BIT #T3.REM,T.ST3(R5) ;REMOVE ON EXIT ?4 BNE 71$ ;IF NE, YES - $REMOV WILL HANDLE THIS CASE MOV R5,R0 ;COPY TCB ADDRESSE. CALL $CLSRF ;REMOVE IT FROM ALL RREF PACKETS71$: ;REFERENCE LABEL/ JSR R5,MTQUE ;EMPTY RECEIVE BY REFERENCE QUEUER1 .WORD T.RRFL ;OFFSET TO RECEIVE BY REF LISTHEAD$/ .WORD $DEPKT ;ADDRESS OF DEALLOCATION ROUTINEM .ENDC<8$: MOV #SCNLN,-(SP) ;SET ADDRESS OF LUT SCANNING CO-ROUTINE% TSTB T.IOC(R5) ;ANY I/O OUTSTANDING?N BNE 9$ ;IF NE YESS3 TSTB T.TIO(R5) ;TASK HAVE OUTSTANDING BUFFERED I/OO BEQ 30$ ;IF EQ NO E9$: .IF DF C$$RTK ;IF REMOTE TASK 0 BIT #F5.RTK,$FMSK5 ;ARE REMOTE TASKS BEING USED BEQ 99$ ;IF EQ NOE;B; ALLOCATE A PACKET FOR THE GENERIC DRIVER TO USE TO KILL I/O WITH;U CLR $CPPKT ;ASSUME NO PACKET+ CLR $CPLUN ;INDICATE ALL I/O TO BE KILLEDS0 TSTB T.TKI(R5) ;TASK HAD ANY CONTACT WITH HOST?/ BEQ 99$ ;IF EQ NO, NO NEED TO ALLOCATE CPRBUFE? MOV #AL$SWS,R0 ;INDICATE THAT WE ARE CALLING FROM SYSTEM STATET MOV #1,R1 ;GET JUST ONE BLOCKG CALL $CPALO ;ALLOCATE A PACKET( BCC 92$ ;IF CC - ALLOCATION SUCCEEDED  CLR R0 ;INDICATE NO PACKET:92$: MOV R0,$CPPKT ;SAVE PACKET ADDRESS FOR GENERIC DRIVER .ENDC ;C$$RTK 99$:5 BIT #T2.ABO,T.ST2(R5) ;TASK ALREADY MARKED FOR ABORTS BNE 10$ ;IF NE YES% MOV #S.IOMG,R0 ;SET REASON FOR ABORT! CALL $ABCTK ;ABORT CURRENT TASKTA10$: MOV (SP),-(SP) ;DUPLICATE ADDRESS OF LUT SCANNING CO-ROUTINE(20$: CALL @(SP)+ ;GET NEXT ASSIGNED LUN* BCS 30$ ;IF CS END OF LOGICAL UNIT TABLE0 CALL $IOKIL ;KILL I/O ON UNIT FOR CURRENT TASK BR 20$ ;GO AGAIN30$: .IF DF C$$RTK R1 BIT #F5.RTK,$FMSK5 ;ARE REMOTE TASKS BEING USED?C BEQ 35$ ;IF EQ NOI, MOV $CPPKT,R0 ;GET ADDRESS OF CPRBUF PACKET. BEQ 35$ ;IF NONE, IT WAS ALREADY DEALLOCATED+ CALL $CPDEA ;OTHERWISE, DEALLOCATE IT NOW  .ENDC ;C$$RTK35$:$ CALL @(SP)+ ;GET NEXT ASSIGNED LUN+ BCS 100$ ;IF CS END OF LOGICAL UNIT TABLEO .IF DF M$$NET&T$$LTH + CALL LTPRE ;TELL LAT PROCESS IF NECESSARY  .ENDC ; DF M$$NET&T$$LTHK5 CMP $TKTCB,U.ATT(R5) ;UNIT ATTACHED TO CURRENT TASK?N BNE 40$ ;IF NE NOK( MOV #IO.DET,R4 ;SET DETACH I/O FUNCTION BR 50$ ;%40$: MOV (R1),R2 ;FILE OPEN ON UNIT?, BEQ 30$ ;IF EQ NOR% ASR R2 ;ACCESS OR DEACCESS PENDING?A BCS 30$ ;IF CS YES7 ASL R2 ;RESTORE WINDOW BLOCK ADDRESS (INTERLOCK CLRD)R' BIT $WCFLG,U.CW1(R5) ;DEVICE FILES-11?D$ BEQ 45$ ;IF EQ NO, ALWAYS DEACCESS6 TSTB W.IOC(R2) ;I/O IN PROGRESS THROUGH WINDOW BLOCK?$ BNE 30$ ;IF NE YES, DON'T DEACCESS/45$: MOV #IO.CLN,R4 ;SET CLOSE LUN I/O FUNCTIONU!50$: CMP (SP)+,(SP)+ ;CLEAN STACKE. MOV R1,-(SP) ;SAVE ADDRESS OF SECOND LUN WORD+ MOV #I.LGTH,R1 ;SET LENGTH OF BLOCK NEEDEDL" CALL $ALOCB ;ALLOCATE I/O PACKET2 MOV (SP)+,R3 ;RETRIEVE ADDRESS 00ibjbkb a a aOF SECOND LUN WORD& BCS TKWSE ;IF CS NO CORE AVAILABLE ) MOV R0,R1 ;COPY ADDRESS OF I/O PACKET ,! TST (R0)+ ;POINT TO SECOND WORD42 MOV $TKTCB,R2 ;GET ADDRESS OF TCB OF CURRENT TASK0 MOVB T.IOC(R2),-(SP) ;SAVE CURRENT I/O COUNT 0 INCB T.IOC(R2) ;INCREMENT OUTSTANDING I/O COUNT+ MOVB T.PRI(R2),(R0)+ ;SET REQUEST PRIORITY;% CLRB (R0)+ ;CLEAR EVENT FLAG NUMBERS. MOV R2,(R0)+ ;INSERT CURRENT TASK TCB ADDRESS0 MOV R3,(R0)+ ;INSERT ADDRESS OF SECOND LUN WORD! MOV R5,(R0)+ ;INSERT UCB ADDRESSS' MOV R4,(R0)+ ;INSERT I/O FUNCTION CODEN> MOV #/2,-(SP) ; WORDS REMAINING IN I/O PACKET/55$: CLR (R0)+ ; CLEAR REMAINDER OF I/O PACKET2 DEC (SP) ; DONE? BNE 55$ ; IF NE NO* MOV #$DRQRQ,(SP) ; ASSUME QUEUE TO DRIVER) CMP #IO.CLN,R4 ; CLOSE LUN I/O FUNCTION?O BNE 70$ ; IF NE NO" MOV (R3),R4 ; GET WINDOW ADDRESS INC (R3) ; INTERLOCK LUN0 MOV U.VCB(R5),R3 ; GET VCB ADDRESS, REALLY ONE? BEQ 60$ ; IF EQ NO/ INC (R3) ; INCREMENT VOLUME TRANSACTION COUNTI) 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 ** ;A; SPM HOOKPOINT NUMBER 21.;C); DO NOT CHANGE THE INSTRUCTION FOLLOWING#; LABEL WITHOUT CHECKING SPM;-+$SPH21==. ;SPM CHANGES THE INSTRUCTION AT ;THE LOCATION OF THIS LABEL4 MOV U.ACP(R5),R0 ; SET ACP TCB;) MOV #$EXRQP,(SP) ; QUEUE DIRECTLY TO ACP /60$: BISB #200,I.EFN(R1) ; SET VIRTUAL I/O FLAG(3 MOV T.ATT(R2),R3 ; GET FIRST ATTACHMENT DESCRIPTORF) INCB A.IOC-A.TCBL(R3) ; LOCK DOWN HEADER 3 MOV A.PCB-A.TCBL(R3),R3 ; POINT TO TASK REGION PCBU2 INCB P.IOC(R3) ; LOCK REGION BY INC'ING I/O COUNT70$: .IF DF C$$RTK1 BIT #F5.RTK,$FMSK5 ;ARE REMOTE TASKS BEING USED?H BEQ 72$ ;IF EQ NO+ CMP (R5),$XXLOW ;IS THIS A GENERIC DEVICE? BLO 72$ ;IF LO NOT! CMP (R5),$XXHGH ;GENERIC DEVICE?E BHI 72$ ;IF HI NOR< INC I.FCN(R1) ;SET BIT TO TELL XX DRIVER WE ARE COMING FROM ; DREIFO72$: .ENDC ;C$$RTKR ) CALL @(SP)+ ;QUEUE THE PACKET SOMEWHEREO .IF DF X$$HDR$ MOV $SAHDB,KISAR6 ; RESTORE MAPPING .ENDC2 MOV $TKTCB,R5 ;GET ADDRESS OF TCB OF CURRENT TASK2 CMPB T.IOC(R5),(SP)+ ;REQUEST ALREADY FINISHED?  BHI 80$ ;IF HI NO JMP 8$ ;680$: MOV T.ASTL(R5),R0 ;GET ADDRESS OF FIRST AST BLOCK BEQ 85$ ;IF EQ THERE IS NONE TSTB A.CBL(R0) ;KERNEL AST ?E2 BMI TKWSE ;IF MI YES, RUNDOWN BIT MIGHT DEADLOCK885$: BIS #TS.RDN,T.STAT(R5) ;SET I/O RUNDOWN IN PROGRESS/TKWSE: CALLR $TKWSE ;WAITFOR SIGNIFICANT EVENTE0100$: TSTB T.IOC(R5) ;ANY I/O STILL OUTSTANDING? BNE 80$ ;IF NE YES3 TSTB T.TIO(R5) ;TASK HAVE OUTSTANDING BUFFERED I/OF BNE 80$ ;IF NE YES .DSABL LSB5+RNDWN: ;PARENT/OFFSPRING-RELATED RUNDOWN$ .IF DF C$$RTK2 BIT #F5.RTK,$FMSK5 ; ARE REMOTE TASKS BEING USED?$ BEQ 16$ ; NO, SKIP DETACH SUPPORT.1 ; THE AME WILL AUTOMATICALLY PERFORM DETACHESI0 ; IN ITS OWN DATA STRUCTURES WHEN IT SEES. ; TASK TERMINATION. WE SUPPORT THIS BY+ ; DELETING THE ACBS ON THE RSX SIDE.E3 MOV #SCNLN,-(SP) ; SET UP LUN-SCANNING CO-ROUTINE.B10$:$ CALL @(SP)+ ; GET NEXT ACTIVE LUN.' BCS 16$ ; THERE IS NONE; WE ARE DONE.I MOV R5,R3 ; COPY UCB ADDRESS.  MOV (R3),R0 ; GET DCB ADDRESS$% CMP D.NAM(R0),#"HT ; IS THIS AN HT?  BEQ 11$ ; IF EQ YESG% CMP D.NAM(R0),#"NS ; IS THIS AN NS?P% BNE 10$ ; IF NE NO, NO U.RAST FIELDP11$:% ADD #U.RAST,R3 ; POINT TO ACB QUEUE.R0 MOV R3,R0 ; COPY POINTER; KEEP HEADER POINTER.12$: MOV R0,R2 ; COPY POINTER.N MOV (R2),R0 ; GET NEXT ACB.M* BEQ 10$ ; THERE IS NONE; GO TO NEXT LUN.7 CMP A.PRM+14(R0),$TKTCB ; IS ACB FOR TERMINATING TASK?1 BNE 12$ ; NO, CHECK NEXT ACB.I5 MOV (R0),(R2) ; MAKE PREVIOUS ACB POINT TO NEXT ACB. 5 BNE 13$ ; THERE IS A NEXT ACB, SO LEAVE TAIL ALONE.B: MOV R2,2(R3) ; SET TAIL POINTER TO POINT TO NEW LAST ACB.13$:) MOVB A.PRM+4(R0),R1 ; GET LENGTH OF ACB.A+ CMP -(R0),-(R0) ; BACK UP TO START OF ACB.,# CALL $DEACB ; DEALLOCATE THE ACB.E8 BR 10$ ; PROCESS NEXT LUN (ONE ACB PER LUN IS ENOUGH).16$: .ENDC ; C$$RTK 00t__DATADATADATADATA .IF DF P$$OFF1 MOV $TSKHD,R0 ;POINT TO FIRST INSTALLED TASK TCB 620$: TST T.RDCT(R5) ;ANY RUNDOWN OPERATIONS REMAINING? BEQ 60$ ;IF EQ NOR: 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 TASK3.25$: MOV (R0),R0 ;POINT TO NEXT ENTRY IN LIST BEQ 30$ ;IF EQ THERE IS NONE/ CMP O.PTCB(R0),R5 ;IS EXITING TASK THE PARENT?E BNE 25$ ;IF NE NON( DEC T.RDCT(R5) ;DECREMENT RUNDOWN COUNT1 CLR O.PTCB(R0) ;INDICATE PARENT TASK HAS EXITTED, .IF DF G$$GEF. CMP O.EFN(R0),#64. ;GROUP GLOBAL EVENT FLAG ? BLOS 25$ ;IF LOS NON MOV R0,-(SP) ;SAVE OCB POINTERT( MOV O.EFN(R0),R0 ;GET EVENT FLAG NUMBER. CALL $CEFI ;CONVERT TO MASK AND MASK ADDRESS) MOV R1,R3 ;COPY EVENT FLAG MASK ADDRESSF0 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 O BNE 20$ ;IF NE NO  .IF DF V$$TRM $ 5 MOV $VTDCB,R1 ;POINT TO SECOND VIRTUAL TERMINAL UCB ;840$: TST T.RDCT(R5) ;ANY OUTSTANDING CREATED VT: UNITS?  BEQ 60$ ;IF EQ NO B4 CMP D.NAM(R1),#"VT ;STILL GOING THROUGH VT UNITS?  BEQ 45$ ;IF EQ YES 0 RETURN ;ELSE $ALOCB FAILURE IN $ELMVT - WAIT /45$: MOV (R1),-(SP) ;SAVE ADDRESS OF NEXT DCB R2 MOV D.UCB(R1),R0 ;POINT TO VIRTUAL TERMINAL UCB ; CMP U.PTCB(R0),R5 ;WAS THIS UNIT CREATED BY EXITING TASK? 2 BNE 50$ ;IF NE NO + CALL $ELMVT ;MARK UNIT FOR DEALLOCATION '50$: MOV (SP)+,R1 ;POINT TO NEXT DCB I BR 40$ ; B  .ENDC  .ENDC 560$: ADD #T.ST2,R5 ;POINT TO SECOND TASK STATUS WORD 4, BIT #T2.ABO,(R5) ;TASK MARKED FOR ABORT?  BEQ 110$ ;IF EQ NO8 MOV $TKNPT,R0 ;GET TERMINATION NOTIFICATION TCB ADDRESS .IF DF R$$PRO@ .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?T/ BNE 110$ ;IF NE YES - OK, GO ON WITH THE EXITA BGCK$A BF.XIT,BE.NPA,FATAL ;A SYSTEM TASK (ONE WITHOUT A PARENT) $ ;ABORTED WITH NO TKTN - BUGCHECK .IFF ;R$$PROT+ BEQ 110$ ;IF EQ TKTN IS NOT IN THE SYSTEM# .ENDC ;R$$PROE2000$: CMP $TKTCB,R0 ;TERMINATION NOTIFICATION TASK BEING TERMINATED?O BEQ 103$ ;IF EQ YESE? CMPB #S.CTKN,T.EFLG-T.ST2(R5) ;PREVENT TKTN FROM BEING CALLED?A BNE 101$ ;IF NE, NOB BIC #T3.MCR!T3.CMD,T.ST3-T.ST2(R5) ;DON'T ISSUE PROMPT OR SNCMD  BR 110$ ;CONTINUE PROCESSING101$: 1 BIS #TS.MSG,-(R5) ;SET ABORT MESSAGE IN PROGRESSA4 CALL $EXRQN ;REQUEST TERMINATION NOTIFICATION TASK) CALLR $TKWSE ;WAITFOR SIGNIFICANT EVENTT-103$: MOV $ACTHD,R0 ;GET ADDRESS OF FIRST TCB#7107$: BIC #TS.MSG,T.STAT(R0) ;CLEAR WAITING FOR MESSAGEO. BIC #T2.ABO,T.ST2(R0) ;CLEAR MARKED FOR ABORT+ MOV T.ACTL(R0),R0 ;GET ADDRESS OF NEXT TCBR TST T.ACTL(R0) ;NULL TASK?A 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 BITSS BIC #CLRMSK,(R5)+ ;= MOVB T.DPRI-T.ST3(R5),T.PRI-T.ST3(R5) ;RESTORE TASK PRIORITYT .IF DF L$$GCL' MOV R5,R0 ;GET POINTER TO CURRENT TCB0 SUB #T.ST3,R0 ;IN R0 9 MOV #LT.TSK,R1 ;INDICATE THAT DELETING ALL TASK LOGICALSA7 MOV #$LDELX,-(SP) ;JMP TO DELETE ROUTINE IN 4TH DIRCOMF0 CALL $MPDC3 ;MAP THE COMMON AND JMP TO ROUTINE .ENDC* MOV T.PCB-T.ST3(R5),R0 ;POINT TO TASK PCB T O .IF DF M$$PRO ,B CLR T.RRM-T.ST3(R5) ;ASSUME TASK WAS NOT INSTALLLED WITH AFFINITY? BIT #T2.AFF,T.ST2-T.ST3(R5) ;WAS TASK INSTALLED WITH AFFINITY?) BEQ 115$ ;NO IF EQ: MOV P.RRM(R0),T.RRM-T.ST3(R5) ;RESTORE INSTALLED AFFINITY R .ENDC  03115$: BIT #PS.FXD,P.STAT(R0) ;TASK FIXED IN MEMORY?H BNE 130$ ;IF NE YESGC120$: BIS #PS.COM,P.STAT(R0) ;CONVERT TASK REGION TO UNNAMED COMMONL CLR P.ST2(R0) ; CLR P.NAM(R0) ; CLR P.NAM+2(R0) ;, MOV P.MAIN(R0),-(SP) ;SAVE MAIN PCB POINTER0 MOV R5,-(SP) ;SAVE ADDRESS OF THIRD S00ibjbkb a a aTATUS WORD8125$: 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 NONEM8 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 PCBE! TSTB A.MPCT(R5) ;IS TASK MAPPED?O BEQ 1257$ ;NO IF EQN+ CLRB P.PRI(R1) ;INITIALIZE REGION PRIORITY) MOV R1,R2 ;COPY PCB ADDRESSM( ADD #P.ATT,R2 ;POINT TO ATTACHMENT LIST31251$: MOV (R2),R2 ;GET NEXT ATTACHMENT DESCRIPTORO BEQ 1252$ ;IF EQ END OF LIST( TSTB A.MPCT-A.PCBL(R2) ;IS TASK MAPPED? BEQ 1251$ ;IF EQ NON) MOV A.TCB-A.PCBL(R2),R3 ;GET TCB ADDRESSN6 ADD #T.ST3,R3 ;CALCULATE ADDRESS OF THIRD STATUS WORD$ CMP R3,(SP) ;SAME AS CURRENT TASK? BEQ 1251$ ;IF EQ YES1 CMPB T.PRI-T.ST3(R3),P.PRI(R1) ;HIGHER PRIORITY?D BLO 1251$ ;IF LO NOE- MOVB T.PRI-T.ST3(R3),P.PRI(R1) ;SET PRIORITY)5 INCB P.PRI(R1) ;PRIO OF COMMON IS ONE MORE THAN TASK  BR 1251$ ;GO AGAIN71252$: CLRB A.MPCT(R5) ;CLEAR MAPPING COUNT INTO REGION1 $ I .IF DF M$$PRO T+ CALL $RESBP ;RESET BYPASS AS APPROPRRIATE1 $ .ENDC N M CALL $DEARG ;DEACCESS REGION&1257$: CALL $DETRG ;DETACH THE REGION BR 125$ ;S8126$: MOV (SP)+,R5 ;RESTORE ADDRESS OF THIRD STATUS WORD7 TST T.STAT-T.ST3(R5) ;TASK REACTIVATED DURING $DXXRG ?R# ;HAPPENS WHEN $NXTSK IS CALLEDV% ;FROM $DXXRG WHEN TKTN EXITS ANDT% ;A CHECKPOINT ALLOCATION FAILUREO ;CAUSES TKTN TO RUN AGAIN) BPL 127$ ;IF PL YES, DON'T MODIFY T.PCBP1 MOV (SP),T.PCB-T.ST3(R5) ;RESET TASK PCB ADDRESS/127$: TST (SP)+ ;REMOVE PCB ADDRESS FROM STACK& BIT #T3.RST,(R5) ;RESTRICTED TASK? / BNE 130$ ;IF NE YES, DO NOT DEALLOCATE HEADERB .IF DF X$$HDR. TSTB T.HDLN-T.ST3(R5) ;RESIDENT TASK HEADER ?, BNE 130$ ;IF NE, NO. NOTHING TO DEALLOCATE .ENDC) MOV R4,R0 ;SET ADDRESS OF TASK HEADER 1 MOV H.HDLN(R0),R1 ;GET LENGTH OF HEADER IN BYTESI CALL $DEACB ;DEALLOCATE HEADER130$: ;+; ** W A R N I N G **F; ; SPM HOOKPOINT NUMBER 03.;(); DO NOT CHANGE THE INSTRUCTION FOLLOWING; LABEL WITHOUT CHECKING SPM;-+$SPH03==. ;SPM CHANGES THE INSTRUCTION AT  ;THE LOCATION OF THIS LABELD, MOV @#$TKTCB,R0 ;GET ADDRESS OF CURRENT TCB . N .IF DF N$$DIR$ MOV T.CTX(R0),R1 ;GET CONTEXT BLOCK# BEQ 133$ ;IF EQ, NO CONTEXT BLOCK' CALL $DLCTX ;DEALLOCATE CONTEXT BLOCK ! CLR T.CTX(R0) ;CLEAR CTX POINTER 133$: ;REFERENCE POINTERB .ENDC ; DF N$$DIR $ .IF DF A$$CNT N- CLR T.EFLM(R0) ;ASSUME NO TIME LIMIT ON TASK CLR T.EFLM+2(R0) ;N, TST T.ACN(R0) ;IS THERE AN ACCOUNTING BLOCK BEQ 160$ ;IF EQ NO MOV R0,R4 ;SAVE TCB ADDRESSA1 TSTB $BILNG ;IS CPU TIME CURRENTLY BEING BILLEDC BNE 135$ ;IF NE NO6 CALL $CPUTM ;CALCULATE LAST SEGMENT OF CPU TIME USED7135$: 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 TAB$ BNE 140$ ;IF NE NO. MOV @#B.PNT+140000,-(SP) ;SAVE POINTER TO UAB; MOV @#B.CPUL+140000,T.EFLM(R4) ;PUT TIME LIMIT BACK IN TCBO% MOV @#B.CPUL+2+140000,T.EFLM+2(R4) ;V8 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 TABC BR 138$ ; >137$: MOV T.EFLG+2(R4),@#B.EXST+140000 ;PUT EXIT STATUS IN TAB9 MOVB T.EFLG(R4),R0 ;GET TKTN ABORT CODE WITH SIGN EXTEND,5 MOV R0,@#B.EXST+2+140000 ;PUT TKTN ABORT CODE IN TABM, BICB #BS.ACT,@#B.STM+140000 ;DEACTIVATE TAB# CALL $QACNT ;OUTPUT TAB TO SYSLOGT!138$: MOV (SP)+,R1 ;POINT TO UAB U MOV R1,KISAR6 ;MAP UABV5140$: DEC @#B.ACT+140000 ;DECREMENT ACTIVE TASK COUNTN0 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 SYSLOG;0150$: MOV (SP)+,KISAR6 ;RESTORE ORIGINAL MAPPING MOV R4,R0 ;RESTORE TCB ADDRESS- CLR T.ACN(R0) ;ZERO ACCOUNTING BLOCK POINTERI160$: C .ENDC # T? BIC #T4.C00„t__DATADATADATADATATC,T.ST4-T.ST3(R5) ;CLEAR THE ^C ABORT PROCESSING BIT3. CALL $ACTRM ;REMOVE TCB FROM THE ATL QUEUE 0 BIT #T3.MCR,(R5) ;MCR EXTERNAL FUNCTION TASK?  BEQ 175$ ;IF EQ NO+ MOV T.UCB-T.ST3(R5),R1 ;GET TI UCB ADDRESS-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?N BEQ 175$ ;IF EQ NO( MOV T.UCB-T.ST3(R5),R2 ;GET UCB ADDRESS' MOV #CC.EXT,R1 ;ISSUE TASK EXIT PROMPT0 BIT #T3.CMD,(R5) ;IS TASK EXECUTING CLI COMMAND BEQ 173$ ;IF EQ NO0 BIS #CC.TTD,R1 ;FORCE $SNCMD TO BE CALLED LATER/173$: CALL $QCNTP ;ISSUE PROMPT REQUEST TO MCRT BR 177$ ;15175$: BIT #T3.CMD,(R5) ;IS TASK EXECUTING CLI COMMANDR BEQ 180$ ;IF EQ NO( MOV T.UCB-T.ST3(R5),R0 ;GET UCB ADDRESS8 CALL $SNCMD ;TELL TTDRV TO SEND NEXT COMMAND TO MCR...0177$: BIC #T3.MCR!T3.CMD,(R5) ;CLEAR STATUS BITS180$: ;REFERENCE LABEL  .IF DF P$$OFF S / MOV R5,R0 ;COPY POINTER TO THIRD STATUS WORD I4 ADD #T.OCBH-T.ST3,R0 ;POINT TO OCB QUEUE LISTHEAD ! CALL $QRMVF ;REMOVE NEXT OCB A" BCS 190$ ;IF CS THERE IS NONE 6 MOV T.EFLG+2-T.ST3(R5),R0 ;PICK UP SAVED EXIT STATUS . MOVB T.EFLG-T.ST3(R5),R2 ;GET TKTN ABORT CODE, CALL $QUEXT ;QUEUE EXIT STATUS TO PARENT  BR 180$ ;GO AGAIN E190$: ;REFERENCE LABEL  .ENDC .IF DF C$$RTK ;IF REMOTE TASK 0 BIT #F5.RTK,$FMSK5 ;ARE REMOTE TASKS BEING USED BEQ 199$ ;IF EQ NO;0/; SEND TASK TERMINATION REQUST TO REMOTE SYSTEMC;T$ MOV $TKTCB,R5 ;GET CURRENT TASK TCB8 CMPB T.TKI(R5),$RMTSK ;IS THIS ONE OF THE STATIC TASKS?( BLOS 198$ ;IF LOS YES, DON'T TERMINATE% CMPB #-1,T.TKI(R5) ;TASK'S AME GONE?F& BEQ 198$ ;YES, DON'T TRY TERMINATION7 TSTB T.TKI(R5) ;DID THE AME EVER KNOW ABOUT THIS TASK? 7 BEQ 197$ ;NO, DON'T TERMINATE, BUT DISABLE TASK INDEX MOV #AL$SWS,R0 ;SET FLAG AS SWS$ MOV #1,R1 ;ONLY NEED ONE 32W BLOCK) MOV R2,-(SP) ;SAVE A COUPLE OF REGISTERSE MOV R3,-(SP)D CALL $CPALO ;ALLOCATE A BLOCK BCC 196$ ;CC = OKAY KEEP GOING, ADD #4,SP ;CLR OFF STACK - DONT NEED REG'S JMP TKWSE ;RETRY LATER.?,196$: MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING" MOV R0,KISAR6 ;MAP REQUEST PACKET3 MOVB #HT$TKN,H$TYPE+MAP6 ;TYPE IS TASK TERMINATION58 MOV T.EFLG+2(R5),H$STAT+MAP6 ; GIVE PRIMARY EXIT STATUS4 MOV T.EFLG(R5),H$STAT+2+MAP6 ; AND SECONDARY STATUS" MOV (SP)+,KISAR6 ;RESTORE MAPPING MOV R4,-(SP)3 MOV R5,-(SP)R8 CPSEN$ #SN$DET,R0,#H$SIZE ;SEND PKT AS DETACHED REQUEST* MOV (SP)+,R5 ;RESTORE ALL SAVED REGISTERS MOV (SP)+,R4I MOV (SP)+,R3 MOV (SP)+,R2-@197$: MOVB #-1,T.TKI(R5) ;SIGNAL TASK HAS NO AME OR IS DISABLED3198$: ADD #T.ST3,R5 ;RESTORE R5 BACK TO STATUS WORDS199$:T .ENDC ;C$$RTK .IF DF V$$TRM&P$$OFF 6 CALL $TICLR ;CLEAR OUT POSSIBLE TI:=VTNN: ASSIGNMENT .ENDC1 BIT #T3.REM,(R5) ;REMOVE TASK AT EXIT? (T.ST3) T BEQ 300$ ;IF EQ NO/ MOV R5,R0 ;COPY POINTER TO THIRD STATUS WORD ( SUB #T.ST3,R0 ;POINT TO START OF TCB ( CALL $REMOV ;REMOVE TASK FROM SYSTEM  .IF DF C$$RTK ;IF REMOTE TASKM0 BIT #F5.RTK,$FMSK5 ;ARE REMOTE TASKS BEING USED BEQ 300$ ;IF EQ NO> BIT #T4.RIN,T.ST4-T.ST3(R5) ;WAS THIS TASK REMOTLY INSTALLED? BEQ 300$ ;IF EQ NO;C%; SEND REMOVE REQUST TO REMOTE SYSTEMC; MOV #AL$SWS,R0 ;SET FLAG AS SWS$ MOV #1,R1 ;ONLY NEED ONE 32W BLOCK) MOV R2,-(SP) ;SAVE A COUPLE OF REGISTERSB MOV R3,-(SP)  CALL $CPALO ;ALLOCATE A BLOCKT BCC 200$ ;CC = OKAY KEEP GOING, ADD #4,SP ;CLR OFF STACK - DONT NEED REG'S JMP TKWSE ;RETRY LATER..200$:$' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGM" MOV R0,KISAR6 ;MAP REQUEST PACKET) MOVB #HT$REM,H$TYPE+MAP6 ;TYPE IS REMOVE30 MOV T.IID-T.ST3(R5),P$IID+MAP6 ;GET IMAGE INDEX" CLR P$IID+2+MAP6 ;CLEAR NEXT WORD" MOV (SP)+,KISAR6 ;RESTORE MAPPING MOV R4,-(SP)S MOV R5,-(SP)1: CPSEN$ #SN$DET,R0,#H$SIZE+4 ;SEND PKT AS DETACHED REQUEST* MOV (SP)+,R5 ;RESTORE ALL SAVED REGISTERS MOV (SP)+,R4T MOV (SP)+,R3C MOV (SP)+,R2I .ENDC ;C$$RTK300$:S .IF DF X$$HDR1 CLR00ʄibjbkb a a a $SAHPT ;DO NOT SAVE CONTEXT OF CURRENT TASKR .IFFS1 CLR $HEADR ;DO NOT SAVE CONTEXT OF CURRENT TASKK  .ENDC" CLR $TKTCB ;SHOW NO CURRENT TASK T D .IF DF M$$PRO P) CLR @$TKPTR ;SAME HERE FOR COMMON TABLER X .ENDC V P+ CALLR $DRDSE ;DECLARE SIGNIFICANT EVENT M 1;C; SUBROUTINE TO EMPTY QUEUEE;P H R .IF DF K$$DAS R<MTQUE: BIC #PMODE,PS ;SET PREVIOUS MODE TO KERNEL FOR PARAMS* MFPI (R5)+ ;GET OFFSET TO QUEUE LISTHEAD MOV (SP)+,R4 ;10$: ;REF LABEL V .IFFX F1MTQUE: MOV (R5)+,R4 ;GET OFFSET TO QUEUE LISTHEADV*10$: TST (R5)+ ;ADVANCE TO RETURN ADDRESS $ .IFTF W&13$: MOV (SP),R0 ;PICK UP TCB ADDRESS$ ADD R4,R0 ;POINT TO QUEUE LISTHEAD) CALL $QRMVF ;REMOVE AN ENTRY FROM QUEUES BCS 40$ ;IF CS NO ENTRIES LEFT/ MOV R1,R0 ;SET ADDRESS OF BLOCK TO DEALLOCATE CMP R4,#T.ASTL ;AST?  BNE 20$ ;IF NE NOC4 MOVB 2(R0),R1 ;SET LENGTH OF BLOCK (FOR AST'S ONLY). BGT 20$ ;IF GT LENGTH SPECIFIED (AST'S ONLY)8 .IF DF,R$$IIC&M$$PRO!C$$RTK ; are kernel ASTs supported' BEQ 16$ ; If EQ, do a few more checks;+A; In a multiprocessor system it is possible for a task to have PB; kernel ASTs queued at the time of task exit. If the exiting task@; goes into the executive lock routine while another task is in @; the process of exiting, an offspring OCB will be queued to the?; task at the exeutive lock. Once the lock is freed, the kernelH7; AST will then be dequeued, and the system will crash.F; C; The code included below will resolve this contention ... Dittod;; for CPRSX some executive functions being handled remotelyi;c;- MOV R5,-(SP) ; save R5o MOV R4,-(SP) ; and R4, MOV $TKTCB,R5 ; get our current TCB address' CALL $DSPKA ; dispatch the kernel ASTo MOV (SP)+,R4 ; restore R4 MOV (SP)+,R5 ; and R5i& BR 13$ ; and process the next packet .IFF ;DF,R$$IIC&M$$PRO!C$$RTK BMI 30$ ;o .ENDC ;DF,R$$IIC&M$$PRO!C$$RTKi16$: ; Reference labele- TST 2(R0) ;IS IT UNSOLICITED CHARACTER AST?d( BNE 18$ ;IF NE NO IT'S A SPECIFIED AST MOV R4,-(SP) ;SAVE R4 MOV R5,-(SP) ;SAVE R55 CMP -(R0),-(R0) ;POINT TO KISAR5 VALUE OF DEALL SUBRM+ MOV (R0)+,-(SP) ;GET MAPPING OF SUBROUTINEt3 MOV (R0)+,-(SP) ;GET ADDRESS OF DEALLOCATE ROUTINEe( CALL $MPPRO ;CALL DEALLOCATION ROUTINE MOV (SP)+,R5 ;RESTORE R5i MOV (SP)+,R4 ;RESTORE R4e BR 13$ ;GO AGAIN118$: MOV #C.LGTH,R1 ;SET SIZE OF BLOCK TO RELEASER8 CMPB 3(R0),#AS.PEA ;IS THIS A PARITY AST CONTROL BLOCK? BNE 20$ ;IF NE NOD$ MOV #A.PLGH,R1 ;GET LENGTH OF BLOCK+20$: CMP R4,#T.RRFL ;PROCESSING RREF QUEUE? BNE 23$ ;IF NE NO5' MOV 2(R0),R1 ;GET SENDER'S TCB ADDRESS / BEQ 23$ ;IF EQ NO EVENT FLAG RUNDOWN POSSIBLES' 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 BLOCKP, ADD #T.ASTL,R1 ;POINT TO SENDER'S AST QUEUE4 MOV (R1),(R0) ;ESTABLISH PACKET'S POSITION IN QUEUE$ BNE 21$ ;IF NE QUEUE WAS NOT EMPTY% MOV R0,2(R1) ;ESTABLISH END OF QUEUE#/21$: MOV R0,(R1) ;ESTABLISH BEGINNING OF QUEUEF BR 13$ ;DEALLOCATE NEXT PACKET23$: .IFT ;K$$DASR. MFPI (R5) ;PUSH DEALLOCATION ROUTINE ADDRESS CALL @(SP)+ ;CALL ROUTINEL .IFF ;K$$DAS1$ CALL @-(R5) ;DEALLOCATE CORE BLOCK .IFTF ;K$$DAS BR 10$ ;GO AGAIN30$: ;REFERENCE LABEL < BGCK$A BF.XIT,BE.SGN,FATAL ;NO KERNEL ASTS SHOULD EXIST NOW40$: ;REF LABEL A .IFTA T/ TST (R5)+ ;ADVANCE R5 TO EQUAL RETURN ADDRESSN- BIS #PMODE,PS ;RESTORE PREVIOUS MODE TO USER# 1 .ENDC R  RTS R5 ;RETURN TO CALLER ; ; EMPTY THE RECEIVE LIST.T9; IN A SYSTEM SUPPORTING SECONDARY POOL, THE RECEIVE LISTR:; CONTAINS DATA PACKETS ALLOCATED FROM THE SECONDARY POOL.; C  .IF DF P$$OOL 8MTRCVL: MOV KISAR6,-(SP) ;SAVE KERNEL MAPPING REGISTER 5 MOV R5,R4 ;COPY TCB ADDRESS & ADD #T.RCVL,R4 ;POINT TO RECEIVE LIST&10$: MOV R4,R0 ;GET LIST HEAD ADDRESS3 CALL $QSPRF ;REMOVE THE NEXT PACKET FROM THE LISTR BCS 100$ ;IF CS DONE .IF DF V$$TRM' MOV R1,-(SP) ;S00҄t__DATADATADATADATAAVE PACKET ADDRESS BIASE MOV R1,KISAR6 ;MAP PACKET' MOV @#140002,-(SP) ;GET SIZE OF PACKETP- BIT #T3.SLV,T.ST3(R5) ;IS THIS A SLAVE TASK?T& BEQ 50$ ;IF EQ NO RUN DOWN NECESSARY. MOV (SP),R1 ;CALCULATE ADDRESS OF UCB IN PKT! ASL R1 ;CONVERT OFFSET TO BYTES * MOV 140004(R1),R0 ;GET UCB ADDRESS IN PKT MOV @R0,R1 ;GET DCB ADDRESST" CMP D.NAM(R1),#"VT ;IS THIS A VT? BNE 50$ ;IF NE NOC. DECB U.OCNT(R0) ;DECREMENT VT OFFSPRING COUNT' BNE 50$ ;IF NE THERE'S MORE OFFSPRINGT* TST U.PTCB(R0) ;HAS THE PARENT GONE AWAY? BNE 50$ ;IF NE NOA .IF DF D$$PAR .IF NDF K$$DASS1 MOV 4(SP),KISAR6 ;REMAP APR6 TO ORIGINAL MAPPINGV ;WHICH MUST SHARE KISAR5 .ENDC .ENDC, CALL $DEAVT ;DEALLOCATE VT DATA STRUCTURES&50$: MOV (SP)+,R1 ;RESTORE PACKET SIZE- MOV (SP)+,R0 ;RESTORE ADDRESS BIAS OF PACKET@ .IF DF D$$PAR .IF NDF K$$DASM MOV R0,KISAR6 ;REMAP PACKET .ENDC .ENDC .IFFT4 MOV R1,R0 ;COPY PACKET ADDRESS FOR DEALLOC ROUTINE. MOV R1,KISAR6 ;MAP TO THE PACKET THROUGH APR5' MOV @#140002,R1 ;CALCULATE PACKET SIZE .ENDC ;V$$TRM .IF DF N$$DIR V1 BIT #T3.SLV,T.ST3(R5) ;IS RECEIVER A SLAVE TASK? + BEQ 80$ ;IF EQ, NO - NO CONTEXT BLOCK PTR MOV R1,-(SP) ;SAVE SIZE ASL R1 ;CONVERT TO BYTES- MOV 140014(R1),R1 ;GET CONTEXT BLOCK POINTERR BEQ 70$ ;IF EQ, NONE# CALL $DLCTX ;DELETE CONTEXT BLOCK$70$: MOV (SP)+,R1 ;RESTORE SIZEK+80$: ADD #<7.+37>,R1 ;INCLUDE CONTROL WORDS  .IFFK' ADD #<6.+37>,R1 ;INCLUDE CONTROL WORDSA .ENDC ;DF N$$DIR ' ASH #-5,R1 ;CONVERT TO 32. WORD UNITSA$ CALL $DESEC ;DEALLOCATE THE PACKET BR 10$ ;GO AGAIN2100$: MOV (SP)+,KISAR6 ;RESTORE MAPPING REGISTER 5 RETURN ;O N .ENDC L ; '; CO-ROUTINE TO SCAN LOGICAL UNIT TABLET; ((SCNLN: MOV (SP),R3 ;SAVE RETURN ADDRESS CLR (SP) ;START AT LUN ZERO 310$: MOV $TKTCB,R5 ;GET ADDRESS OF CURRENT TASK TCBZ .IF DF X$$HDR' MOV $SAHPT,R4 ;GET CURRENT TASK HEADER MOV $SAHDB,KISAR6 ;MAP IT .IFFD' MOV $HEADR,R4 ;GET CURRENT TASK HEADERO .ENDC&20$: MOV (SP),R1 ;GET NEXT LUN NUMBER INC (SP) ;INCREMENT LUN NUMBER! CMP H.NLUN(R4),(SP) ;END OF LUT?N 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 NO Z( CMP U.ATT(R2),R5 ;SPOOLER TASK EXIT?  BEQ 25$ ;IF EQ YES . MOV R0,R2 ;ELSE USE INTERMEDIATE DEVICE UCB % CLC ;INSURE C - CLEAR FOR RETURN F-25$: MOV R2,R5 ;SET UCB ADDRESS FOR RETURN $ CALL (R3) ;CALL THE CALLER BACK & MOV (SP)+,R3 ;RETRIEVE RETURN ADDRESS BR 10$ ;GO AGAIN%30$: MOV R3,(SP) ;SET RETURN ADDRESSO RETURN ;M L;+5; ** - LTPRE - CALL LAT PROCESS FOR EXIT NOTIFICATIONE;OF; THIS ROUTINE NOTIFIES THE LAT PROCESS WHEN AN EXITING TASK HAS A LUNO; ASSIGNED TO A LAT APPLICATIONS TERMINAL SO THAT A DISCONNECT MAY BE PERFORMEDV;, ; INPUTS:S; R5 = UCB ADDRESS;C ; OUTPUTS:$; LAT PROCESS NOTIFIED IF NECESSARY.;- .IF DF M$$NET&T$$LTHR(LTPRE: MOV U.DCB(R5),R0 ;GET DCB ADDRESS) CMP #"TT,D.NAM(R0) ;IS IT A TT TERMINAL?S BNE 10$ ;IF NE NO2 BIT #S6.LAT,U.TST6(R5) ;LAT APPLICATION TERMINAL? BEQ 10$ ;IF EQ NOL! MOV U.SCB(R5),R4 ;R4-SCB ADDRESST MOV S.KRB+2(R4),-(SP) ;BIAS, MOV $LTEEP,-(SP) ;VIRT ADDR = LAT PROC EXIT ;ENTRY POINT) CALL $MPPRO ;MAPS AND CALLS LAT PROCESSI ;RESTORES SP 10$: RETURN .ENDC ; DF M$$NET&T$$LTHS;+5; **-$RLMCB-RELEASE COMMAND BUFFERS QUEUED FOR A TASK.;D ; INPUTS:$;R?; R5=ADDRESS OF TCB OF THE TASK WHOSE BUFFERS SHOULD BE DELETED ; ; OUTPUTS:;L-; ALL COMMAND LINES FOR THE TASK ARE RELEASED(; ;-.$RLMCB::MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING/10$: CALL $SCMDQ ;FIND A COMMAND FOR THIS TASKR BCS 30$ ;IF CS, NO MOREE MOV R0,R1 ;COPY ADDRESSO" MOV #$CLICQ,R0 ;POINT TO LISTHEAD CALL $GTSPK ;UNLINK IT MOV R1,KISAR6 ;MAP BLOCK0< BIT #CC.TTD,@#C.CSTS+140000 ;DID COMMAND ORIGINATE IN TTDRV BEQ 20$ ;IF EQ NOR( MOV @#C.CUCB+140000,R0 ;GET UCB00ڄۄibjbkb a a a ADDRESS. CALL $SNCMD ;TELL TTDRV TO SEND NEXT COMMAND20$: MOV KISAR6,R0 ;GET ADDRESS" MOVB C.CBLK+140000,R1 ;GET LENGTH CALL $DESEC ;DEALLOCATE IT BR 10$ ;CHECK FOR ANY MORE&30$: MOV (SP)+,KISAR6 ;RESTORE MAPPING DUN: RETURNH .END BCS 30$ ;IF CS, NO MOREE MOV R0,R1 ;COPY ADDRESSO" MOV #$CLICQ,R0 ;POINT TO LISTHEAD CALL $GTSPK ;UNLINK IT MOV R1,KISAR6 ;MAP BLOCK0< BIT #CC.TTD,@#C.CSTS+140000 ;DID COMMAND ORIGINATE IN TTDRV BEQ 20$ ;IF EQ NOR( MOV @#C.CUCB+140000,R0 ;GET UCB .TITLE SYSXT  .IDENT /16.07/E;R1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.N; 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 10-AUG-73;C+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:$;; B. S. MCCARTHY; J. R. KAUFFMAN ; T. LEKASE; J. M. LAWLER; +; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:N; ; J. W. BERZLE; D. R. DONCHINA; J. R. KAUFFMAN ; T. LEKASI; B. S. MCCARTHY; L. B. MCCULLEY; C. A. SILVER;1+; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:s;e; B. S. MCCARTHY ; K. L. NOEL;D+; MODIFIED FOR RSX-11M-PLUS VERSION 4.2 BY: ;Y; P. K. M. WEISS; B. S. MCCARTHY; L. B. MCCULLEY;N$; MODIFIED FOR RSX-11M-PLUS V4.4 BY:;X!; J. W. BERZLE 22-MAY-1990 16.00.; :; JWB231 -- FIX PROBLEM WHERE CONTEXT SWITCHING NO LONGER-; DISABLES WITH $CXDBL (FROM DAVE CARROLL)N; !; J. C. FRANZINI 21-AUG-90 16.01:; JCF398 -- $FINXT: FIX PROBLEM WHERE CARRY WAS BEING SET&; WHEN ESB WAS AT 100000 OR ABOVE;R!; J. C. FRANZINI 18-MAY-92 16.02<; JCF405 -- SCHEDULE TASKS WITH TS.CIP SET IF THEY HAVE ANY/; KERNEL ASTS. PREVIOUSLY, THESE TASKS WERE 1; SCHEDULED ONLY IF THEY WERE WAITING TO EXIT.1;P$; MODIFIED FOR RSX-11M-PLUS V4.5 BY:;1; D. CARROLL 06-MAY-1993 16.03P+; DC203 -- INCLUDE SUPPORT FOR RON ACCESS ;S; D. CARROLL 17-JUN-1993 16.04O7; DC227 -- INCLUDE SUPPORT IN $SGFIN FOR UNIBUS MEMORY-;I; D. CARROLL 13-SEP-1993 16.05B9; DC235 -- DON'T USE R4 FOR AST CHECK WHEN TS.CIP IS SETC; UVO-100068 (AALSMEER); ; D. CARROLL 17-JAN-1995 16.06.9; DC248 -- ALLOW PRIV TASKS MAPPED TO THE EXEC TO ACCESSE+; POOL WHICH MAY BE RESIDENT IN ICB POOLE;W$; Modified for RSX-11M-PLUS V4.6 by:;1; D. Carroll 18-Oct-1995 16.07L8; DC404 - Include psect definition to allow ICB pool to; be fully utilized.; ;J2; SYSTEM ENTRANCE, EXIT, AND PROCESSOR DISPATCHING;O; MACRO LIBRARY CALLS ;C* .MCALL ABODF$,HDRDF$,HWDDF$,PCBDF$,TCBDF$ .MCALL PKTDF$,ITBDF$,BGCK$A" ABODF$ ;DEFINE TASK ABORT CODES% HDRDF$ ;DEFINE TASK HEADER OFFSETS $ HWDDF$ ;DEFINE HARDWARE REGISTERS1 PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS , TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS2 ITBDF$ ;DEFINE INTERRUPT TRANSFER BLOCK OFFSETS' PKTDF$ ;DEFINE AST OFFSETS AND CODESI. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;DC404;+; **-$DIRSV-DIRECTIVE SAVE;AH; THIS ROUTINE IS CALLED FROM DIRECTIVE LEVEL TRAP SERVICE ROUTINES. THEE; STACK DEPTH IS +1, THUS A SWITCH TO THE SYSTEM STACK IS ALWAYS NEC-FD; ESSARY. AT THE END OF TRAP PROCESSING A RETURN IS EXECUTED TO EXIT; FROM THE SYSTEM.;T ; INPUTS:O;L; 4(SP)=PS WORD PUSHED BY TRAP.A; 2(SP)=PC WORD PUSHED BY TRAP. +; 0(SP)=SAVED R5 PUSHED BY 'JSR R5,$DIRSV'.P;F ; OUTPUTS:; @; REGISTER R4 IS PUSHED ONTO THE CURRENT STACK AND THEN A SWITCH;; TO THE SYSTEM STACK IS EXECUTED. REGISTERS R3 THRU R0 AREH;; PUSHED ON THE SYSTEM STACK, THE NEW PROCESSOR PRIORITY ISE,; SET, AND A CALL TO THE CALLER IS EXECUTED.;-($DIRSV::MOV R4,-(SP) ;;;SAVE REGISTER R4;+; ** W A R N I N G ** ;U; SPM HOOKPOINT NUMBER 26.;T); DO NOT CHANGE THE INSTRUCTION FOLLOWINGW; LABEL WITHOUT CHECKING SPM;-+$SPH26==. ;SPM CHANGES THE INSTRUCTION ATY ;THE LOCATION OF THIS LABEL:' 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$$PR00t__DATADATADATADATAO 10$: ;;; REFERENCE LABEL  .IFTF ; NDF M$$PROD MTPS #0 ;;;ALLOW INTERRUPTS. LOCK$ $EXECL,WAIT .IFF ; NDF M$$PRO!10$: MTPS #0 ;;;ALLOW INTERRUPTSU .ENDC ; NDF M$$PROR( MOV R3,-(SP) ;SAVE REGISTERS R3 THRU R0 MOV R2,-(SP) ;  MOV R1,-(SP) ;S MOV R0,-(SP) ;= .IF DF M$$PRO' MOV $TKTCB,R0 ;GET CURRENT TCB ADDRESS 4 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 ? ( BEQ 20$ ;IF EQ YES - NO ACTION ALLOWED(15$: MOV (SP),R0 ;RESTORE R0 FOR $SWSTK .ENDC .IF DF R$$WPT3 MOV R5,$WPLST ;SAVE ADDRESS OF LAST SYSTEM ROUTINE, .ENDC ; DF R$$WPT* CALL (R5) ;CALL SYNCHRONOUS TRAP ROUTINE20$: JMP $DIRXT=;+; **-$IFORK-INDEPENDANT $CFORK;ED; THIS ROUTINE IS SIMILAR TO $CFORK (SEE BELOW) BUT DOES NOT USE THED; FORK BLOCK IN THE SCB. INSTEAD IT ALLOCATES A FORK BLOCK FROM THEF; POOL, TRANSFERS EXECUTION TO ANOTHER PROCESSOR, AND THEN DEALLOCATES; THE FORK BLOCK.S;N ; INPUTS:L;D; R4=ANYTHING (THIS IS SAVED).; R5=UCB ADDRESS.N ; 0(SP)=CALLER'S RETURN ADDRESS.*; 2(SP)=RETURN ADDRESS OF CALLER'S CALLER.; ; OUTPUTS:;$; R4=SAVED R4.; R5=UCB ADDRESS.U;R@; EXECUTION IS ON CORRECT PROCESSOR. DRIVERS WITHOUT KRB'S HAVED; 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 ;$EXDOPO;+/; **-$EXDOP-EXECUTE DRIVER ROUTINE ON PROCESSORK(; **-$EXROP-EXECUTE ROUTINE ON PROCESSOR;TB; THIS ROUTINE IS USED TO EXECUTE A PARTICULAR ROUTINE (USUALLY INF; A DRIVER) UNDER CONTROL OF A SPECIFIC PROCESSOR (POSSIBLY THIS ONE.)A; THE CODE SEGMENT TO BE EXECUTED MUST BE TERMINATED BY A RETURN.O; @; 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, THE@; FORK BLOCK WILL BE DEALLOCATED PRIOR TO CALLING THE ROUTINE TO?; BE EXECUTED. THIS ENTIRE OPERATION IS INDEPENDANT OF WHAT ISO=; ON THE STACK, I.E. CONTROL WILL ALWAYS RETURN TO THE CALLER?; WHETHER OR NOT THE ROUTINE CAN BE EXECUTED ON THIS PROCESSOR.;A ; THE FORM OF THE FORK BLOCK IS:;R$; *-------------------------------*; 0 ! UNIBUS RUN MASK !$; *-------------------------------*; 2 ! FORK LINK !$; *-------------------------------*; 4 ! FORK PC !T$; *-------------------------------*; 6 ! FORK R5 !C$; *-------------------------------*; 10 ! FORK R4 !$; *-------------------------------*; 12 ! DRIVER KISAR5 !.$; *-------------------------------*; 14 ! ROUTINE ADDRESS !E$; *-------------------------------*;R ; INPUTS:H;O#; R2=UNIBUS RUN MASK ($EXROP ONLY).-'; R3=ADDRESS OF ROUTINE TO BE EXECUTED.S; R4=ANYTHING (THIS IS SAVED).; R5=UCB ADDRESS ($EXDOP ONLY).N ; 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./; R5=SAVED R5 (UCB ADDRESS IF ENTRY AT $EXDOP).-; 0(SP)=RETURN ADDRESS. ;*; THE CALLING ROUTINE IS RETURNED TO WITH:;U1; C=0 IF THE ROUTINE TO BE EXECUTED HAS EXECUTED.-"; C=1 IF A FORK HAD TO BE CREATED.; 0; NOTE: ONLY R5 IS PRESERVED TO CALLING ROUTINE!;X5; THE CONTENTS OF KERNEL INSTR AND DATA APR 5 AT THEE"; TIME OF THE CALL ARE DESTROYED.;T;- .ENABL LSBP)$EXDOP::MOV U.SCB(R5),R2 ;GET SCB ADDRESS , 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 URMW8$EXROP::BIT R2,@$CPURM ;CAN WE EXECUTE ON THIS PROCESSOR BEQ 20$ ;IF EQ NO, MUST FORK;."; EXECUTE THE ROUTINE HERE AND NOW;A+10$: MOV R5,-(SP) ;SAVE R5 FROM THE ROUTINEN CALL (R3) ;CALL RO00ۄibjbkb a a aUTINE MOV (SP)+,R5 ;RESTORE SAVED R5." CLC ;TELL CALLER THAT WE DID IT RETURN5020$: MOV #7.*2,R1 ;SET BLOCK SIZE FOR FORK BLOCK" MOV R2,-(SP) ;SAVE R2 FROM $ALOCB* CALL $ALOCB ;WE ASSUME IT SAVES R3,R4,R5 BCC 30$ ;IF CC ALLOCATION OK;(.; ***** THIS IS A RATHER NASTY SITUATION *****;8; WE CANNOT GET TO THE CORRECT PROCESSOR, SINCE WE CAN'T8; ALLOCATE A FORK BLOCK. NEITHER CAN WE EXIT THE EXEC TO8; LET ANYONE ELSE IN WHO MIGHT POTENTIALLY FREE UP POOL,;; SINCE WE HAVE NO IDEA WHAT THE CALLER WAS DOING. IT WOULDS7; BE NICE IF IN THE FUTURE SOME WAY OUT OF THIS PROBLEM; COULD BE DEVISED.T;O% BGCK$A BF.MP,BE.NPL,FATAL ;POOL FULLV-30$: MOV (SP)+,(R0) ;INSERT URM IN FORK BLOCKE$ ADD #14.,R0 ;POINT AT END OF BLOCK% MOV R3,-(R0) ;INSERT ROUTINE ADDRESSS, MOV KINAR5,-(R0) ;PUT MAPPING IN FORK BLOCK MOV R4,-(R0) ;INSERT R4 MOV R0,R4 ;SET UP FOR $FORK12 CALL $FORK1 ;WE ASSUME $FORK ALWAYS RETURNS C=1.;W0; AT THIS POINT THE CALLER HAS BEEN RETURNED TO.;O?; WHEN WE EXECUTE THE CODE BELOW WE ARE ON THE TARGET PROCESSORU; AND THE REGISTERS LOOK LIKE:;&; R3=ADDRESS OF PC WORD IN FORK BLOCK.; R4=SAVED R4.8; R5=SAVED R5 (POSSIBLY UCB ADDRESS IF ENTRY AT $EXDOP).;+ MOV R3,R0 ;POINT AT PC WORD IN FORK BLOCK(" SUB #4,R0 ;POINT AT TOP OF BLOCK MOV #7.*2,R1 ;SET BLOCK LENGTHB* MOV 14(R0),-(SP) ;SAVE ADDRESS OF ROUTINE5 CALLR $DEACB ;DEALLOCATE BLOCK (ASSUME R4,R5 SAVED)Y. .DSABL LSB ;AND EXIT TO OUR ROUTINE WHO WILL$ ;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 CALLEDS?; AT EXECUTIVE LEVEL, SINCE IT USES REGISTERS OTHER THAN R4 ANDA; R5.R;N ; INPUTS:(;S; R4=ANYTHING.; R5=UCB ADDRESS.M;# ; OUTPUTS:;O; R4=SAVED R4.; R5=UCB ADDRESS. ;R@; EXECUTION IS ON CORRECT PROCESSOR. NOTE: DRIVERS WITHOUT KRBS;; HAVE NO "CORRECT PROCESSOR" SO $CFORK WILL ALWAYS RETURN.I;-)$CFORK::MOV U.SCB(R5),R2 ;GET SCB ADDRESSO* TALLY$ B.CFCL,XA$$CF ;COUNT A $CFORK CALL* TST S.URM(R2) ;IS THERE A UNIBUS RUN MASK BEQ $INTXT ;IF EQ NO -- RETURN' BIT S.URM(R2),@$CPURM ;OK ON THIS CPU? ! BNE $INTXT ;IF NE YES -- RETURNR;A*; 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;+); **-$FORK-FORK AND CREATE SYSTEM PROCESSU;RK; THIS ROUTINE IS CALLED FROM AN I/O DRIVER TO CREATE A SYSTEM PROCESS THATRE; WILL RETURN TO THE DRIVER AT STACK DEPTH ZERO TO FINISH PROCESSING.;R ; INPUTS:U;N5; R5=ADDRESS OF THE UCB FOR THE UNIT BEING PROCESSED.C!; 0(SP)=RETURN ADDRESS TO CALLER. ); 2(SP)=RETURN ADDRESS TO CALLERS CALLER.D;. ; OUTPUTS:; @; REGISTERS R5 AND R4 ARE SAVED IN THE CONTROLLER FORK BLOCK AND@; A SYSTEM PROCESS IS CREATED. THE PROCESS IS LINKED TO THE FORK); QUEUE AND A JUMP TO $INTXT IS EXECUTED.R;- .ENABL LSBR&$FORK:: MOV R4,-(SP) ;SAVE REGISTER R43 MOV U.SCB(R5),R4 ;POINT TO CONTROLLER STATUS BLOCKI 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 BLOCK ;+*; **-$FORK1-FORK AND CREATE SYSTEM PROCESS;EC; THIS ROUTINE IS AN ALTERNATE ENTRY TO CREATE A SYSTEM PROCESS AND ; SAVE REGISTER R5.E;O ; INPUTS:D; <; R4=ADDRESS OF THE LAST WORD OF A 3 WORD FORK BLOCK PLUS 2.,; R5=REGISTER TO BE SAVED IN THE FORK BLOCK.; ; OUTPUTS:;?; REGISTER R5 IS SAVED IN THE SPECIFIED FORK BLOCK AND A SYSTEMT=; PROCESS IS CREATED. THE PROCESS IS LINKED TO THE FORK QUEUEA#; AND A JUMP TO $INTXT IS EXECUTED.B%; R5 IS PRESERVED FOR CALLERS CALLER.F;-&$FORK1::MOV R5,-(R4) ;SAVE REGISTER R5;+*; **-$FORK0-FORK AND CREATE SYSTEM PROCESS;T@; THIS ROUTINE IS AN ALTERNATE ENTRY TO CREATE A SYSTEM PROCESS.;S ; INPUTS:4;D<; R4=ADDRESS OF TH00t__DATADATADATADATAE LAST WORD OF A 2 WORD FORK BLOCK PLUS 2.;E ; OUTPUTS:;N=; A SYSTEM PROCESS IS CREATED, LINKED TO THE FORK QUEUE AND A ; JUMP TO $INTXT IS EXECUTED.S;-$$FORK0::MOV (SP)+,-(R4) ;SET FORK PC* CLR -(R4) ;CLEAR LINK TO NEXT FORK BLOCK;+2; **-$QFORK-INSERT FORK BLOCK AT END OF FORK QUEUE;:; 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.; ; INPUTS:;; R4=ADDRESS OF A FORK BLOCK.F;2 ; OUTPUTS:;K9; THE FORK BLOCK SUPPLIED IN R4 IS LINKED INTO THE SYSTEM,5; FORK QUEUE, AND A RETURN TO THE CALLER IS EXECUTED.X;-9$QFORK::MFPS -(SP) ;SAVE PRIORITY AROUND QUEUE INSERTION , MTPS #PR7 ;CAN'T INTERRUPT QUEUE INSERTION/ LOCK$ $FORKL,SPIN ;;;SERIALIZE ACCESS TO QUEUE  .IF DF R$$FRK MOV R4,-(SP) ;;;FREE A REGISTER( MOV #$FRKHD,R4 ;;;GET THE FORK LISTHEAD510$: MOV (R4),R4 ;;;GET THE NEXT ELEMENT IN THE LIST " BEQ 15$ ;;;IF EQ NO MORE - GO ON. 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 FORK15$: MOV (SP)+,R4 ;;;RESTORE R4 .ENDC ;R$$FRK/ MOV R4,@$FRKHD+2 ;;;LINK NEW ENTRY TO OLD LAST7+ MOV R4,$FRKHD+2 ;;;SET ADDRESS OF NEW LASTO .IF DF M$$PRO;E"; ADD ITEM TO FORK LIST WAIT MASK.;R& TST -(R4) ;;;IS IT LEGAL FORK BLOCK? BEQ 40$ ;;;IF EQ YES" BIT (R4),$URMST ;;;IS URM ONLINE? BNE 40$ ;;;IF NE YES8 BGCK$A BF.MP,BE.URM,FATAL ;;;FORK BLOCK FOR OFFLINE URM.40$: BIS (R4)+,$IIPND ;;;ADD TO FORK WAIT MASK .ENDC) TSTB $IDLFL ;;;ARE WE IN IDLE LOOP NOW?  BLE 50$ ;;;IF LE NOR;+; ** W A R N I N G **$;K; SPM HOOKPOINT NUMBER 32.;E); DO NOT CHANGE THE INSTRUCTION FOLLOWINGE; LABEL WITHOUT CHECKING SPM;-+$SPH32==. ;SPM CHANGES THE INSTRUCTION ATS ;THE LOCATION OF THIS LABELG .IF DF M$$PRO( COMB @#$IDLFL ;;;SHOW WE HAVE BEEN HERE= MOV #DIRXT2,$STACK-24 ;;;FORCE SYSTEM BACK THRU $IIPND CHECK; .IFFO* CLRB @#$IDLFL ;;;NOT IN IDLE LOOP ANYMORE> MOV #$DIRXT,$STACK-24 ;;;FORCE SYSTEM BACK THRU LOCK AND INTO ;;;EXECB .ENDC50$: ULOCK$ $FORKL,SPINN$ MTPS (SP)+ ;;;RESTORE OLD PRIORITY/ SEC ;RETURN WITH CARRY SET TO CALLERS CALLERN RETURN ;I .DSABL LSBG;+4; **-$FORK2-FORK ROUTINE FOR USE IN CONJUNCTION WITH; THE CINT$ DIRECTIVE.;E ; INPUTS:F; !; R5=ADDRESS OF FORK BLOCK IN ITB ;E ; OUTPUTS:;V9; IF THE FORK BLOCK IS ALREADY IN USE (FORK PC NON-ZERO),=; A SYSTEM PROCESS IS CREATED, LINKED TO THE FORK QUEUE AND AV; JUMP TO $INTXT IS EXECUTED.T8; ELSE THE INTERRUPT IS DISMISSED (NO RETURN TO CALLER).;U8; IMMEDIATELY ON RETURN FROM THIS ROUTINE, THE FOLLOWING!; INSTRUCTION SHOULD BE EXECUTED:L;S ; CLR @R3;R%; WHICH DECLARES THE FORK BLOCK FREE.-;- .IF DF C$$INT0$FORK2::TST 2(R5) ;;;FORK BLOCK ALREADY IN USE? BNE 10$ ;;;Y - JUMPS& MOV R4,6(R5) ;;;SAVE R4 IN FORK BLOCK MOV R5,R4 ;;; 1 ADD #6,R4 ;;;POINT JUST AFTER 3-WORD FORK BLOCKY BR $FORK1 ;;;R10$: TST (SP)+ ;;;CLEAR STACK ;;;FALL THRU TO $INTXT .ENDC;+; **-$INTXT-INTERRUPT EXIT; A; THIS ROUTINE MAY BE CALLED VIA A JMP TO EXIT FROM AN INTERRUPT.T;F ; INPUTS: ;T&; 0(SP)=INTERRUPT SAVE RETURN ADDRESS.;3 ; OUTPUTS:;E); A RETURN TO INTERRUPT SAVE IS EXECUTED. ;-$INTXT::RETURN ;;+A; **-$INTSI-INTERRUPT SAVE (CALLED FROM INTERRUPT CONTROL BLOCKS);;VB; THIS ROUTINE IS CALLED FROM AN INTERRUPT CONTROL BLOCK. IT PUTSD; THE WORLD IN ORDER FOR ENTRY TO A DRIVER INTERRUPT ENTRY POINT AND; MAPS TO THE DRIVER.I;T ; INPUTS:;#; 4(SP)=PS WORD PUSHED BY INTERRUPT #; 2(SP)=PC WORD PUSHED BY INTERRUPTT*; 0(SP)=SAVED R5 PUSHED BY 'JSR R5,$INTSI'; 0(R5)=SCRATCH WORD OF ICBT(; 2(R5)=WORD FOR APR5 (TO MAP TO DRIVER)%; 4(R5)=BYTE FOR PS (DEVICE PRIORITY)7; 6(R5)=DRIVER INTERRUPT ENTRY POINT (BIASED BY 120000)A;D ; OUTPUTS:; !; R4 IS PUSHED ONTO CURRENT STACKE$; R4 IS SET TO CONTROLLER NUMBER * 2=; STACK DEPTH IS DECREMENTED AND, IF R00ۄibjbkb a a aESULT IS ZERO, A SWITCHR"; TO THE SYSTEM STACK IS EXECUTED; KERNEL APR5 MAPPING IS SAVED*; CPU PRIORITY IS SET TO PRIORITY FROM ICBA; DRIVER INTERRUPT ENTRY POINT IS CALLED AS A COROUTINE (SO AFTERN"; A RETURN, APR5 CAN BE RESTORED);-5$INTSI::JSR R4,(PC) ;;;SAVE R4 WHILE PRESERVING CC'S & MFPS R4 ;;;RETRIEVE CONTROLLER INDEX2 BIC #177760,R4 ;;;CLEAR ALL BUT CONTROLLER NUMBER! ASL R4 ;;;CONVERT TO WORD INDEXT;+; ** W A R N I N G **L; ; SPM HOOKPOINT NUMBER 27.;C); DO NOT CHANGE THE INSTRUCTION FOLLOWING; LABEL WITHOUT CHECKING SPM;-+$SPH27==. ;SPM CHANGES THE INSTRUCTION ATY ;THE LOCATION OF THIS LABELR DEC @#$STKDP ;;;SWITCH STACKS?D510$: MOV KINAR5,-(SP) ;;;SAVE KERNEL INSTRUCTION APR5E .IF DF K$$DAS* MOV KDSAR5,-(SP) ;;;SAVE KERNEL DATA APR5! MOV (R5),KDSAR5 ;;;MAP TO DRIVERD .ENDC MOV (R5)+,KINAR5 ;;;C .IF DF C$$INT& BR $INTS2 ;;;CONTINUE IN COMMON CODE .IFFI< .IIF NE <.-$INTS2>, .ERROR ;$INTS2 NOT THE NEXT INSTRUCTION .ENDC;+;; **-$INTSC-INTERRUPT SAVE (INTERRUPT FROM VECTOR CONNECTEDA; TO VIA CINT$ DIRECTIVE).;T%; CALLS ISR WITH R4 AND R5 SAVED AND:T; !; R5 POINTER TO FORK BLOCK IN ITBN; PRI TAKEN FROM ITB;I;- .IF DF C$$INT$INTSC::MOV R4,-(SP) ;;;SAVE R4;;+; ** W A R N I N G **V;5; SPM HOOKPOINT NUMBER 28.;.); DO NOT CHANGE THE INSTRUCTION FOLLOWINGD; LABEL WITHOUT CHECKING SPM;-+$SPH28==. ;SPM CHANGES THE INSTRUCTION AT2 ;THE LOCATION OF THIS LABELS DEC @#$STKDP ;;;SWITCH STACKS?$510$: MOV KINAR5,-(SP) ;;;SAVE KERNEL INSTRUCTION APR5O .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 ;;; .ENDC($INTS2: MTPS (R5)+ ;;;LOAD ISR PRIORITY3 BISB (R5)+,R4 ;;;ADD CONSTANT TO CONTROLLER NUMBERC+ CACHE$ SAVE ;;;SAVE BYPASS STATE OF CACHEH .IF DF R$$RSV MOV R3,-(SP) ;;;SAVE REGISTERSS MOV R2,-(SP) ;;;T MOV R1,-(SP) ;;;  MOV R0,-(SP) ;;;T .IFTF $WPIN0::CALL @(R5)+ ;;;CALL ISR .IF DF R$$WPT& NOP ;;;SPACE TO PLUG WATCHPOINT JSR .ENDC ; R$$WPT; .IFTL5 CMP (SP)+,R0 ;;;MAKE SURE DRIVER DIDN'T DESTROY REGS# BEQ 30$ ;;;IF EQ R0 IS UNMODIFIEDR?20$: BGCK$A BF.INT,BE.ISR,FATAL ;;;DRIVER DESTROYED REGS IN ISRB*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 .ENDC0 CACHE$ UNSAVE ;;;RESTORE BYPASS STATE OF CACHE .IF DF K$$DAS- MOV (SP)+,KDSAR5 ;;;RESTORE KERNEL DATA APR5; .ENDC4 MOV (SP)+,KINAR5 ;;;RESTORE KERNEL INSTRUCTION APR5" BR $INTX1 ;;;EXIT FROM INTERRUPT .IF DF R$$WPT:$WPIN3::MOV R5,$WPLST ;SAVE ADDRESS OF LAST SYSTEM ROUTINE! CALL (R5) ;CALL THE CALLER BACKF! BR WPIN4 ;FINISH IN COMMON CODE(<$WPIN2::MOV (R5),$WPLST ;SAVE ADDRESS OF LAST SYSTEM ROUTINE CALL @(R5)+ ;CALL ISRM9WPIN4:: CMP $WPVAL,@$WPADR ;DID WATCHED LOCATION CHANGE ?A, BEQ 1$ ;IF EQ NO (ONE OF THESE IS NOP'D BY* BNE 1$ ;IF NE NO THE SET WATCH COMMAND) BPT ;LET XDT KNOW ABOUT IT21$: RETURN ;RETURN TO PROPER REAL INTS.. ROUTINE .ENDC ; DF R$$WPT;+; **-$INTSV-INTERRUPT SAVE3; **-$INTSE-INTERRUPT SAVE FOR ERRORLOGGING DEVICESM;UB; THIS ROUTINE IS CALLED FROM AN INTERRUPT SERVICE ROUTINE WHEN ANA; INTERRUPT IS NOT GOING TO BE IMMEDIATELY DISMISSED. A SWITCH TOIE; THE SYSTEM STACK IS EXECUTED IF THE CURRENT STACK DEPTH IS +1. WHENOH; THE INTERRUPT SERVICE ROUTINE FINISHES ITS PROCESSING, IT EITHER FORKS*; , JUMPS TO $INTXT, OR EXECUTES A RETURN.;D ; INPUTS:T;$; 4(SP)=PS WORD PUSHED BY INTERRUPT.$; 2(SP)=PC WORD PUSHED BY INTERRUPT.+; 0(SP)=SAVED R5 PUSHED BY 'JSR R5,$INTSV'.-; 0(R5)=NEW PROCESSOR PRIORITY.E;E ; OUTPUTS:;R>; REGISTER R4 IS PUSHED ONTO THE CURRENT STACK AND THE CURRENT9; STACK DEPTH IS DECREMENTED. IF THE RESULT IS ZERO, THENT=; A SWITCH TO THE SYSTEM STACK IS EXECUTED. THE NEW PROCESSORS?; ST00t__DATADATADATADATAATUS IS SET AND A CO-ROUTINE CALL TO THE CALLER IS EXECUTEDN<; R4 IS SET WITH THE CONTROLLER INDEX*2, WHICH IS DETERMINED; FROM THE PSW AT ENTRY.;-$INTSE:: ;;;REFERENCE LABEL(5$INTSV::JSR R4,(PC) ;;;SAVE R4 WHILE PRESERVING CC'SE& MFPS R4 ;;;RETRIEVE CONTROLLER INDEX- BIC #177760,R4 ;;;MASK OFF CONTROLLER NUMBERR! ASL R4 ;;;CONVERT TO WORD INDEXK2$:T;+; ** W A R N I N G **S;C; SPM HOOKPOINT NUMBER 29.;,); DO NOT CHANGE THE INSTRUCTION FOLLOWINGX; LABEL WITHOUT CHECKING SPM;-+$SPH29==. ;SPM CHANGES THE INSTRUCTION ATS ;THE LOCATION OF THIS LABELC DEC @#$STKDP ;;;SWITCH STACKS?N .IF DF K$$DAS(3$: MOV PS,-(SP) ;;;SAVE CURRENT PS WORD- BIC #PMODE,PS ;;;SET PREVIOUS MODE TO KERNELR4 MFPI (R5)+ ;;;RETRIEVE CLEAR MASK FOR NEW PRIORITY) BIC (SP)+,(SP) ;;;CLEAR FOR NEW PRIORITYR! MOV (SP)+,PS ;;;SET NEW PRIORITYK .IFF+%3$: BIC (R5)+,PS ;;;LOAD NEW PRIORITYO .ENDC+ CACHE$ SAVE ;;;SAVE BYPASS STATE OF CACHEN*$WPIN1::CALL (R5) ;;;CALL THE CALLER BACK .IF DF R$$WPT& NOP ;;;SPACE TO PLUG WATCHPOINT JSR .ENDC ; R$$WPTD7$INTSF::CACHE$ UNSAVE ;;;RESTORE BYPASS STATE OF CACHEO;+; **-$INTXT-INTERRUPT EXIT;BH; THIS ROUTINE IS ENTERED VIA A RETURN TO EXIT FROM AN INTERRUPT. IF THE@; STACK DEPTH IS NOT EQUAL TO ZERO, THEN REGISTERS R4 AND R5 ARE>; RESTORED AND AN RTI IS EXECUTED. ELSE A CHECK IS MADE TO SEEB; IF THERE ARE ANY ENTRIES IN THE FORK QUEUE. IF NONE, THEN R4 AND@; R5 ARE RESTORED AND AN RTI IS EXECUTED. ELSE REGISTERS R3 THRUE; R0 ARE SAVED ON THE CURRENT STACK AND A DIRECTIVE EXIT IS EXECUTED.$;D; INPUTS: (MAPPED SYSTEM);;E%; 06(SP)=PS WORD PUSHED BY INTERRUPT.*%; 04(SP)=PC WORD PUSHED BY INTERRUPT.I; 02(SP)=SAVED R5.; 00(SP)=SAVED R4.;- .ENABL LSBE)$INTX1::MTPS #PR7 ;;;LOCK OUT INTERRUPTSR! TST $STKDP ;;;STACK DEPTH ZERO?A BEQ 2$ ;;;IF EQ YESE JMP 10$ ;;;IF NE NOS2$: ;;;REFERENCE LABELI .IF NDF M$$PRO ' TST $FRKHD ;;;ANYTHING IN FORK QUEUE?  BEQ 10$ ;;;IF EQ NOE .IFFS+ CACHE$ BYPASS ;;;SEE IF THERE IS ANY WORK & MOV $IIPND,R4 ;;;GET URM NEEDING WORK- MOV $IICPU,R5 ;;;GET THOSE WITH INTS PENDINGS CACHE$ RESTOR7 BIC @$CPURM,R5 ;;;DON'T CONSIDER OURSELVES INTERRUPTEDD3 BIC R5,R4 ;;;CLEAR THOSE PEOPLE WITH INTS PENDING:/ BEQ 10$ ;;;IF EQ NO WORK FOR US OR ANYONE NOT; ;;;ALREADY INTERRUPTED .ENDC;D; ENTER THE EXECUTIVE. THERE IS EITHER WORK SPECIFICALLY FOR US, OR-; WORK FOR SOMEONE NOT CURRENTLY INTERRUPTED.;Q 3$: MTPS #0 ;;;ALLOW INTERRUPTS( MOV R3,-(SP) ;SAVE REGISTERS R3 THRU R0 MOV R2,-(SP) ;; MOV R1,-(SP) ;  MOV R0,-(SP) ;,4$: LOCK$ $EXECL,WAITT;+; **-$DIRXT-DIRECTIVE EXIT;UD; THIS ROUTINE IS CALLED VIA A JUMP TO EXIT FROM A DIRECTIVE OR TRAPC; SERVICE ROUTINE. IF THERE ARE ANY ENTRIES IN THE FORK QUEUE, THENAC; THE FIRST ENTRY IS REMOVED AND THE FORK ROUTINE IS EXECUTED. ELSE D; A CHECK IS MADE TO SEE IF REDISPATCHING OF THE PROCESSOR IS NECES-A; SARY. IF NOT, THEN REGISTERS R0 THRU R5 ARE RESTORED AND AN RTIE>; IS EXECUTED. ELSE THE PROCESSOR IS REDISPATCHED AND THE EXIT; SEQUENCE IS EXECUTED AGAIN.(; ; INPUTS: (MAPPED SYSTEM);+-; 16(SP)=PS WORD PUSHED BY INTERRUPT OR TRAP.E-; 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 POINTER )DIRXT1: 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 THEN ;;;WATCHPOINTS!$WPBR:: BEQ 1$ ;;;IF EQ STILL OKD BNE 1$ ;;;IF NE STILL OK BPT ;;;OOOOOOPPPPPSSS!!!Y1$: ;;;REFERENCE LABELS .ENDC ; DF R$$WPT CACHE$ BYPASS) MOV $IIPND,R3 ;;;ANY WORK IN FORK QUEUE?S CACHE$ RESTOR BIT @$CPURM,R3 ;;;ANY WORK? BNE 20$ ;;;IF NE YES .IFFI)$DIRXT::MTPS #PR7 ;;;LOCK OUT INTERRUPTSK .IF DF R$$WPT, CMP $WPVAL,@$WPADR ;;;WATCHPOINT ST00 ۄibjbkb a a aILL OK ?$ ;;;ONE OF THE FOLLOWING BRANCHES% ;;;SHOULD BE NO-OPED TO START THEP ;;;WATCHPOINTS!$WPBR:: BEQ 1$ ;;;IF EQ STILL OK; BNE 1$ ;;;IF NE STILL OK BPT ;;;OOOOOOPPPPPSSS!!!O1$: ;;;REFERENCE LABEL; .ENDC ; DF R$$WPT( MOV $FRKHD,R3 ;;;ANYTHING IN FORK QUEUE BNE 20$ ;;;IF NE YES .ENDC;CG; EVEN IF CONTEXT SWITCHING IS DISABLED, WE STILL NEED TO SERVICE ASTS.IA; AND WE NEED TO SERVICE KERNAL ASTS EVEN IF THE TASK IS EXITING.;P/ TSTB $CXDBL ;;;IS CONTEXT SWITCHING DISABLED?O BEQ 5$ ;;;IF EQ NO2 MOV $TKTCB,R5 ;;;PICK UP CURRENT TASK TCB ADDRESS/ MOV T.ASTL(R5),R4 ;;;AST QUEUED FOR THIS TASK?; BNE 53$ ;;;IF NE YES/ TSTB T.ST2(R5) ;;;TASK EXITING (DUE TO ABORT)?E BPL 6$ ;;;IF PL NO%52$: JMP TEXIT ;;;INITIATE TASK EXITI+53$: TSTB A.CBL(R4) ;;; KERNEL AST PENDING?.$ BMI 54$ ;;; ALWAYS DO KERNEL AST'S! TSTB T.ST2(R5) ;;; TASK EXITING?V BMI 52$ ;;; CONTINUE RUNDOWN;E8; CHECK IF USER MODE AST'S ARE IN PROGRESS, OR DISABLED.; 9 BIT #T2.AST!T2.DST,T.ST2(R5) ;;; AST ACTIVE OR DISBLED?M* BNE 6$ ;;; IF NE, YES, DON'T EXECUTE AST!54$: MTPS #0 ;;;ALLOW INTERRUPTSU JMP TAST ;GO DO THE AST$+5$: MOV @$RQSCH,R5 ;;;SCHEDULING REQUESTED?N BEQ 6$ ;;;IF EQ NO JMP 40$ ;;;IF NE YES+6$: ULOCK$ $EXECL,WAIT ;;;RELEASE EXECUTIVE ;(<; CHECK TO SEE IF THERE IS ANY WORK FOR THE EXECUTIVE TO DO.;S=; THIS SECTION OF CODE MAY BE ENTERED FROM A NUMBER OF AREAS:N;N2; 1. FROM THE ENTRANCE TO THE IDLE LOOP AFTER PR7; UNLOCKING THE EXECUTIVE.;.1; 2. AFTER UNLOCKING THE EXECUTIVE IN $DIRXT PR7 (; JUST PRIOR TO RESTORING THE REGISTERS.; 1; 3. FROM ANY NON-PR7 SECTION OF CODE IN THE PR0$); IDLE LOOP. IN THIS CASE, WE CAN NOT BED); JERKED OUT OF THIS CODE SINCE $IDLFL ISE(; NEGATIVE, INFORMING $QFORK NOT TO CRAM'; THE STACK WITH THE ADDRESS OF DIRXT2.S;Y ; --------- ;C*; THIS SECTION OF CODE HAS THREE OUTCOMES:; ;E>; 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$.;T?; 8$: THERE IS NO WORK FOR US AND NO WORK PENDING FOR ANY OTHERN:; CPU. WE WILL EXIT BACK TO WHENCE WE CAME; THE IDLE LOOP; OR AN ACTIVE USER TASK.E;DA; 15$: THERE DEFINATELY WORK FOR US, SO WE REENTER THE EXECUTIVE,T:; CLEARING THE IDLE FLAG ($IDLFL) IN CASE WE CAME FROM THE ; IDLE LOOP.;H .IF DF M$$PRODIRXT2: CACHE$ BYPASSE! MOV $IIPND,R4 ;;;GET PENDING URMR BEQ 8$ ;;;IF EQ NO WORKR" BIT @$CPURM,R4 ;;;ANY WORK FOR US BNE 15$ ;;;IF NE YES1 BIC $IICPU,R4 ;;;CLEAR THOSE ALREADY INTERRUPTED  BEQ 8$ ;;;IF EQ NO NEW WORKE3 MOVB $EXECL+1,R5 ;;;GET PROCESSOR IN EXEC (IF ANY)E BMI 7$ ;;;IF MI NO ONE IN EXEC' ASL R5 ;;;MAKE CPU ID INTO WORD INDEXF. BIC $URMTB(R5),R4 ;;;ANY WORK HE CAN'T HANDLE BEQ 8$ ;;;IF EQ NO;G; INTERRUPT OTHER CPUM;R7$: CACHE$ RESTOR" CALL $IISVC ;INTERRUPT OTHER CPU# CACHE$ BYPASS ;;;AVOID STALE DATAE0 BIT @$CPURM,$IIPND ;;;ANY LAST NSEC WORK FOR US$ BNE 15$ ;;;IF NE YES -- ENTER EXEC;E*; EXIT EXECUTIVE TO USER TASK OR IDLE LOOP;E8$: CACHE$ RESTOR;$ TSTB $IDLFL ;;;ARE WE IN IDLE LOOP BEQ 9$ ;;;IF EQ NO# MOVB #1,$IDLFL ;;;SET IN IDLE LOOPE1 MOV #$IDLPT,R1 ;;;RESTORE REGISTER FOR IDLE LOOP MTPS #0 ;;;ALLOW INTERRUPTSH" JMP IDLE ;EXIT BACK TO IDLE LOOP .IFTF09$: MOV (SP)+,R0 ;;;RESTORE REGISTERS R0 THRU R3 MOV (SP)+,R1 ;;;T MOV (SP)+,R2 ;;;  MOV (SP)+,R3 ;;;A10$:;+; ** W A R N I N G **Y;S; SPM HOOKPOINT NUMBER 30.;;); DO NOT CHANGE THE INSTRUCTION FOLLOWINGU; LABEL WITHOUT CHECKING SPM;-+$SPH30==. ;SPM CHANGES THE INSTRUCTION AT  ;THE LOCATION OF THIS LABELO& INC @#$STKDP ;;;INCREMENT STACK DEPTH, MOV (SP)+,R4 ;;;RESTORE REGISTERS R4 AND R5 MOV (SP)+,R5 ;;;L;+; NONSENSE INTERRUPT ENTRY/EXITO;-$NONSI::RTI ;;;$ .IFT);;8; ENTER EXECUTIVE FROM EXIT OF $DIRXT OR FROM IDLE LOOP.;RD; THE ONLY DIFFERENCE BETWEEN THE TWO ENTRY CONDITIONS IS THAT IF WED; ARE ENTERING FROM THE IDLE LOOP, THEN WE MUST CL00t__DATADATADATADATAEAR OUT THE $IDLFLI; SINCE WE ARE NOT GOING TO BE IDLE ANYMORE. OTHERWISE $IDLFL IS ALREADYC; ZERO.; *15$: CACHE$ RESTOR ;;;RESTORE CACHE STATE6 CLRB $IDLFL ;;;SHOW NOT IN IDLE LOOP WHETHER WE WERE MTPS #0 ;;;OR NOT( BR 4$ ;;;ENTER EXECUTIVE .ENDC ; DF M$$PRO;; EXECUTE FORK ROUTINE;F:; FORK ROUTINES ARE ENTERED VIA A CALL WITH THE ARGUMENTS:;L2; R3=ADDRESS OF THE BEGINNING OF THE FORK BLOCK+2.; R4=RESTORED FROM FORK BLOCK.; R5=RESTORED FROM FORK BLOCK.; 20$: MTPS #PR7 LOCK$ $FORKL,SPIN .IF DF M$$PRO& MOV #$FRKHD,R3 ;;;GET "CURRENT" ENTRY322$: MOV R3,R2 ;;;MAKE CURRENT INTO PREVIOUS ENTRYC3 MOV (R2),R3 ;;;GET NEW CURRENT -- AT END OF LIST?E BNE 24$ ;;;IF NE NO ; D; END OF FORK LIST. IF WE GET TO HERE THEN WE HAVENT FOUND ANYTHING=; TO DO IN THIS PASS. WE CAN NOW CLEAR OUT OUR URM BITS FROMT; THE PENDING URM MASK, $IIPND.S; ) BIC @$CPURM,$IIPND ;;;CLEAR OUT OUR BITSO) BIC @$CPURM,$IICPU ;;;CLEAR OUT OUR BITSR% BR 30$ ;;;EXIT FROM FORK PROCESSING$524$: BIT -2(R3),@$CPURM ;;;IS THIS FORK BLOCK FOR US?" BNE 26$ ;;;IF NE YES' TST -2(R3) ;;;CAN ANY CPU PROCESS IT?R( BNE 22$ ;;;IF NE NO -- GO GET NEXT ONE,26$: INC $FRKCT ;;;BUMP FORK DEQUEUED COUNT' MOV (R3),(R2) ;;;LINK NEXT TO PREVIOUSE BNE 30$ ;;;IF NE NOT NEW LASTD MOV R2,$FRKHD+2 ;;;SET NEW LAST .IFFR! MOV $FRKHD,R3 ;;;GET FIRST ENTRY 0 MOV (R3),$FRKHD ;;;REMOVE ENTRY FROM FORK QUEUE BNE 30$ ;;;IF NE NOT LAST 2 MOV #$FRKHD,$FRKHD+2 ;;;RESET FORK QUEUE LISTHEAD .ENDC30$: ULOCK$ $FORKL,SPIN; 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 AGAIN$35$: ;REFERENCE LABEL .ENDC MTPS #0 ;;;ALLOW INTERRUPTSI! ADD #10,R3 ;POINT PAST SAVED R4S .IF DF K$$DAS MOV (R3),KDSAR5 ;MAP DRIVER .ENDC;+; ** W A R N I N G **3;F; SPM HOOKPOINT NUMBER 72.;Q); DO NOT CHANGE THE INSTRUCTION FOLLOWINGF; LABEL WITHOUT CHECKING SPM;-+$SPH72==. ;SPM CHANGES THE INSTRUCTION AT; ;THE LOCATION OF THIS LABEL MOV (R3),@#KINAR5 ;* MOV -(R3),R4 ;RESTORE REGISTERS R4 AND R5 MOV -(R3),R5 ;; .IF DF R$$WPT7 MOV -2(R3),$WPLST ;SAVE ADDRESS OF LAST SYSTEM ROUTINE0 .ENDC ; DF R$$WPT CALL @-(R3) ;CALL FORK ROUTINE JMP $DIRXT ;TRY EXIT AGAIN;D; RESCHEDULING OR POWERFAIL;+!40$: MTPS #0 ;;;ALLOW INTERRUPTSO .IF DF P$$RFL TST $PWRFL ;POWER FAILURE? BEQ RESCH ;IF EQ NOE. CALL $POWER ;EXECUTE POWER RECOVERY ROUTINES .IF DF M$$PRO2 MOV @$RQSCH,R5 ;RENEW VALUE OF RESCHEDULE POINTER .IFF;$ JMP $DIRXT ;CYCLE BACK THRU $DIRXT .ENDC .ENDC ; DF P$$RFL .DSABL LSBV;3; RESCHEDULING REQUESTED;T .ENABL LSB0,RESCH: CLR @$RQSCH ;CLEAR SCHEDULE REQUESTS .IF DF M$$PRO;+; ** W A R N I N G **;E; SPM HOOKPOINT NUMBER 71.;); DO NOT CHANGE THE INSTRUCTION FOLLOWINGD; LABEL WITHOUT CHECKING SPM;-+$SPH71==. ;SPM CHANGES THE INSTRUCTION ATE ;THE LOCATION OF THIS LABEL( MOV @#$TKTCB,R4 ;FETCH CURRENT TASK TCB BEQ 4$ ;IF EQ NO CURRENT TCB+ BIC #TS.RUN,T.STAT(R4) ;REMOVE RUNNING BIT8 BIT #TS.CKR,T.STAT(R4) ;CHECKPOINT REQUESTED THIS TASK? BEQ 4$ ;IF EQ NO* BIC #TS.CKR,T.STAT(R4) ;CLEAR THE REQUEST2 ADD #T.ATT,R4 ;POINT TO ATTACHMENT DESCR LISTHEAD+3$: MOV (R4),R4 ;GET NEXT ATTACHMENT DESCRB BEQ 4$ ;IF EQ THERE IS NONE / MOV A.PCB-A.TCBL(R4),R1 ;POINT TO ATTACHED PCBS5 BIT #PS.CKR,P.STAT(R1) ;CHECKPOINT REQUEST THIS PCB? BEQ 3$ ;IF EQ NO1 BIC #PS.CKR,P.STAT(R1) ;CLEAR CHECKPOINT REQUESTK$ CALL $ICHKP ;TRY TO CHECKPOINT NOW BR 3$ ;N;AE; IF CPU IS GOING OFFLINE, THEN GO STRAIGHT TO IDLE LOOP. DON'T ENTERE5; SCHEDULING LOOP. DON'T PASS GO. DON'T COLLECT 200$.4;C,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$$PROA;+; ** W A R N I N G **C; ; SPM HOOKPOINT NUMBER 71.;C); DO NOT CHANGE THE INSTRUCTION 00ۄibjbkb a a aFOLLOWINGE; LABEL WITHOUT CHECKING SPM;-+$SPH71==. ;SPM CHANGES THE INSTRUCTION ATH ;THE LOCATION OF THIS LABEL  .ENDC;5$: MOV #T2.STP!T2.SPN!T2.WFR,R1 ;SET STP,SPN, AND WFR MASK! MOV #T2.WFR,R4 ;SET WAITFOR MASKO! MOV #T2.SEF,R0 ;SET STOPFOR MASKC=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$$PRO7 BIT @$CPCRM,T.RRM(R5) ;CAN TASK RUN ON THIS PROCESSOR?R BNE 30$ ;NO IF NEA= BIT #T4.SNC,T.ST4(R5) ;TASK USE COMMONS FOR SYNCHRONIZATION?- BEQ 15$ ;IF EQ NOC8 BIT #T2.ABO!T2.HLT,T.ST2(R5) ;TASK EXITTING OR ABORTED? BNE 15$ ;IF NE YES IT CAN RUNN. MOV T.PCB(R5),R2 ;GET TASK REGION PCB ADDRESS .IF DF X$$HDR3 MOV P.HDR(R2),-(SP) ;GET VIRTUAL ADDRESS OF HEADERT! BNE 12$ ;IF NE, RESIDENT HEADERC- MOV P.REL(R2),KISAR6 ;MAP TO EXTERNAL HEADERK0 MOV #140000,(SP) ;SET VIRTUAL ADDRESS OF HEADER012$: MOV (SP)+,R2 ;GET VIRTUAL ADDRESS OF HEADER .IFF ; DF X$$HDR ( MOV P.HDR(R2),R2 ;GET ADDRESS OF HEADER .IFTF ; DF X$$HDR3 CALL $CKMAP ;ANOTHER TASK MAPPED TO SAME REGION ?5 .ENDC ; DF X$$HDR$ BCS 30$ ;IF CS YES, SKIP THIS TASK9 MOV T.ST2(R5),R3 ;RESTORE CONTENTS OF SECOND STATUS WORD 15$: ;REFERENCE SYMBOLS .ENDC MOV T.ASTL(R5),R2 ;AST QUEUED?I BEQ 20$ ;IF EQ NOC4 BIT #T2.AST!T2.DST,R3 ;AST IN PROGRESS OR DISABLED? BEQ 70$ ;IF EQ NOR& TSTB A.CBL(R2) ;BUFFERED I/O REQUEST? BMI 70$ ;IF MI YES620$: BIT R1,R3 ;IS TASK STOPPED,SUSPENDED, OR IN WFR? BEQ 60$ ;NO, RESTART THIS TASK BIT R4,R3 ;WAITFOR STATE?O# BEQ 30$ ;IF EQ NO, SKIP THIS TASK+ ASSUME T2.HLT,200 ;T2.HLT MUST BE SIGN BITP0 TSTB T.ST2(R5) ;TASK MARKED FOR EXIT OR ABORT ? BMI 50$ ;IF MI YES2 BIT T.EFLM(R5),@T.EFLM+2(R5) ;WAITFOR SATISFIED ? BNE 50$ ;IF NE YES$ BIT R0,R3 ;TASK IN STOPFOR STATE ? BEQ 30$ ;IF EQ NOS5 BIT #T2.AST!T2.STP,R3 ;TASK STOPPED OR AT AST STATE?B BNE 30$ ;IF NE YES. BIT #T2.SEF,R3 ;TASK STOPPED FOR EVENT FLAG ? BNE 24$ ;IF NE YES0 TSTB T.TIO(R5) ;TASK HAVE ACTIVE BUFFERED I/O ?$ BEQ 30$ ;IF EQ NO, GO TO NEXT TASK!24$: MOV R5,R0 ;COPY TCB ADDRESSH CALL $STPTK ;STOP THE TASK) BR 5$ ;BRANCH TO SET UP REGISTERS AGAIN 725$: BIC #TS.BLC,R2 ;TASK BLOCKED FOR CHECKPOINT ONLY ?+- BNE 29$ ;IF NE NO, CANNOT REQUEST THIS TASKS BIT #T2.STP,R3 ;TASK STOPPEDS! BEQ 30$ ;IF EQ NO, DON'T UNSTOP#$ BIT R0,R3 ;TASK IN STOPFOR STATE ?* BEQ 30$ ;IF EQ NO, DON'T TRY TO SCHEDULE2 BIT T.EFLM(R5),@T.EFLM+2(R5) ;STOPFOR SATISFIED ?! BEQ 30$ ;IF EQ NO, DON'T UNSTOPA1 MOV T.ACTL(R5),-(SP) ;REMEMEBER TCB OF NEXT TASKX MOV R5,R0 ;COPY TCB ADDRESSC, BIC #T2.STP*2!T2.STP,T.ST2(R0) ;UNSTOP TASK" CALL $EXRQS ;REQUEST TASK TO RUN' MOV (SP)+,R5 ;RESTORE NEXT TCB ADDRESS ) CLR @$RQSCH ;CLEAR POSSIBLE RESCHEDULESN. BR 5$ ;RESET REGISTERS AND CONTINUE ATL SCANB29$: CMP #TS.CIP,T.STAT(R5) ;ONLY WAITING FOR CHECKPOINT TO OCCUR?. BNE 30$ ;IF NE NO, CAN'T ATTEMPT TO SCHEDULE$ MOV T.ASTL(R5),R2 ;ANY ASTS QUEUED? BEQ 295$ ;IF EQ, NO$ MOVB A.CBL(R2),R2 ;ANY KERNEL ASTS?, BMI 70$ ;IF MI, YES DON'T DISTURB AST FLAG ASSUME T2.HLT,200+295$: TSTB T.ST2(R5) ;TASK WAITING TO EXIT?U BMI 60$ ;IF MI, YESS/30$: MOV T.ACTL(R5),R5 ;GET ADDRESS OF NEXT TCBX BNE 10$ ;IF NE OKAYR33$: ;REFERENCE LABEL3 TALLY$ B.IDCT,XA$$ID,CPU ;COUNT AN IDLE LOOP ENTRY .IF DF A$$CNT* TSTB $BILNG ;ARE WE BILLING CPU TIME NOW BNE 35$ ;IF NE NO,+ CALL $CPUTM ;TERMINATE BILLING HERE SINCE2" ;WE PROBABLY WILL GO IDLE, AND,35$: ;DEFINITELY WILL DO A CONTEXT SWITCH .ENDC;; GO VISIT THE IDLE LOOP IN ITS NEW HOME AT THE END OF THIS 5; MODULE. THIS KEEPS THE BRANCHES ABOVE FROM BREAKINGI JMP IDOL ;SORRY ABOUT THE NAME ;I COULDN'T RESIST;I$; WAITFOR SATISFIED-CLEAR WAIT STATE; .IF DF D$$PAR450$: MOV KINAR5,-(SP) ;SAVE KERNEL INSTRUCTION APR 52 MOV $DRAPR,KINAR5 ;MAP TO THE DIRECTIVE PARTITION .IFF,50$: ;REFERENCE SYMBOLL .IFTF1 MOV T.PCB(R5),R4 ;GET ADDRESS OF TASK REGION PCBD .00"t__DATADATADATADATAIF DF X$$HDR3 MOV P.HDR(R4),-(SP) ;GET VIRTUAL ADDRESS OF HEADERP, BNE 55$ ;IF NE NOT AN EXTERNAL TASK HEADER- MOV P.REL(R4),KISAR6 ;MAP TO EXTERNAL HEADER0 MOV #140000,(SP) ;SET VIRTUAL ADDRESS OF HEADER055$: MOV (SP)+,R4 ;GET VIRTUAL ADDRESS OF HEADER .IFF ; DF X$$HDRF* MOV P.HDR(R4),R4 ;GET TASK HEADER ADDRESS .IFTF4 MOV T.EFLM+2(R5),R3 ;GET ADDRESS OF EVENT FLAG WORD .ENDC ;DF X$$HDR0 .IF DF G$$GEF0 CALL $DEAGF ;DEACCESS GROUP GLOBAL EVENT FLAGS .ENDC ; DF G$$GEF .IFTR" MOV (SP)+,KINAR5 ;RESTORE MAPPING .ENDC# DEC T.ST2(R5) ;CLEAR WAITFOR STATEL% BMI 60$ ;IF MI TASK IS AT AST STATEP2 BIC #T2.SEF!T2.STP,T.ST2(R5) ;CLEAR STOPFOR STATE;E; RESTART OR CONTINUE A TASK;G160$: CLR R4 ;SET FLAG TO SIGNIFY RESTART OF TASK670$: MOVB T.PRI(R5),@$CURPR ;SET CURRENT TASK PRIORITY .IF DF M$$PRO0 BIS #TS.RUN,T.STAT(R5) ;SHOW TASK ACTIVE ON CPU .IFTF2STCTX: ;REFERENCE LABEL FOR ENTRY FROM THE IDLE ;LOOP272$: MOV #H.DSW,R0 ;POINT TO DIRECTIVE STATUS WORD2 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 HEADER  .ENDC ; DF X$$HDR) CMP R5,$TKTCB ;NEW TASK SAME AS CURRENT?: BNE 73$ ;IF NE NO  .IFTE MOV $TKTCB,R2 ;GET TCB ADDRESS, ASSUME T2.HLT,200! TSTB T.ST2(R2) ;IS TASK HALTED?B0 BMI 73$ ;IF MI YES -- SAVE AND RESTORE CONTEXT .ENDC' JMP 130$ ;NO CONTEXT SWITCH NECESSARY ;; SAVE CONTEXT OF CURRENT TASK;N73$:;+; ** W A R N I N G **A;,; SPM HOOKPOINT NUMBER 04.; ); DO NOT CHANGE THE INSTRUCTION FOLLOWING; LABEL WITHOUT CHECKING SPM;-+$SPH04==. ;SPM CHANGES THE INSTRUCTION ATP ;THE LOCATION OF THIS LABELE. MOV H.GARD(R3),R2 ;POINT TO HEADER GUARD WORD MOV SP,R1 ;POINT TO SAVED R0 MOV (R1)+,-(R2) ;SAVE R02 MOV (R1)+,-(R2) ;SAVE R17 MOV (R1)+,-(R2) ;SAVE R2R MOV (R1)+,-(R2) ;SAVE R3 MOV (R1)+,-(R2) ;SAVE R4I MOV (R1)+,-(R2) ;SAVE R5E MOV (R1)+,-(R2) ;SAVE PCN MOV (R1),-(R2) ;SAVE PS! MFPI SP ;GET USER STACK POINTERB2 MOV (SP)+,(R3) ;SAVE USER STACK POINTER IN HEADER375$: MOV (R0),H.DSW(R3) ;SAVE DIRECTIVE STATUS WORDS .IF DF F$$LPP5 MOV H.FPSA(R3),R2 ;POINT TO FLOATING POINT SAVE AREAR1 BEQ 77$ ;IF EQ TASK DOES NOT USE FLOATING POINT $ TST $HFMSK ;PROCESSOR HAVE A FPP ?% BMI 77$ ;IF MI NO, SKIP CTX STORAGEM/ MOV $TKTCB,R3 ;GET TCB ADDRESS OF CURRENT TASKR4 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$$LAS2 ADD T.OFF(R3),KISAR6 ;ADD IN OFFSET TO TASK IMAGE .ENDC76$: ;REF LABEL) STFPS (R2)+ ;SAVE FLOATING POINT STATUS ! SETD ;SET FLOATING DOUBLE MODEP, STD R0,(R2)+ ;SAVE FLOATING POINT REGISTERS LDD R4,R0 ;E STD R0,(R2)+ ;C LDD R5,R0 ;M STD R0,(R2)+ ;G STD R1,(R2)+ ;K STD R2,(R2)+ ; STD R3,(R2)+ ; .ENDC 77$: ;  .IF DF A$$CNT* TSTB $BILNG ;ARE WE BILLING CPU TIME NOW BNE 80$ ;IF NE NOM/ CALL $CPUTM ;ADD TIME USED TO USER ACCOUNTING.3 MOV #H.DSW,R0 ;RESTORE DIRECTIVE STATUS WORD TO R0T .ENDC;.; LOAD CONTEXT OF NEW TASK;S*80$: MOV R5,$TKTCB ;SET ADDRESS OF NEW TCB .IF DF M$$PRO .IF DF X$$HDR1 CLR $SAHPT ;CLEAR HEADER PTR IN CASE $TKTCB = 0 .IFFR CLR $HEADR ;CLEAR HEADER .ENDC- MOV R5,@$TKPTR ;SET NEW TCB ADDRESS IN TABLE)$ BNE 81$ ;IF NE CURRENT TASK EXISTS JMP IDLE1 ;RE-ENTER IDLE LOOPE981$: BIT #T2.ABO!T2.HLT,T.ST2(R5) ;TASK MARKED FOR ABORT?M BNE 82$ ;IF NE YES4 MOVB $PROCN,T.CPU(R5) ;SAVE PROCESSOR NUMBER IN TCB82$: ;REF SYMBOLN .ENDC1 TALLY$ B.CTXP,XA$$CX,CPU ;COUNT A CONTEXT SWITCH; .IF DF A$$CNT MOV KISAR6,-(SP) ;SAVE MAPPING + MOV T.ACN(R5),KISAR6 ;MAP ACCOUNTING BLOCKA BEQ 825$ ;IF EQ, NO ACCOUNTING+ CMPB #BT.TAB,@#B.TYP+140000 ;IS THIS A TABK BNE 825$ ;IF NE NO# ADD #1,@#B.CTXT+200*ۄibjbkb a a a+140000 ;COUNT ITT ADC @#B.CTXT+140000 ;825$: MOV (SP)+,KISAR6 ;RESTORE# .ENDC ;A$$CNT .IF DF D$$MND) TST $DITCB ;IS DIAMOND WATCHING A TASK?N BEQ 83$ ;IF EQ NOE1 BIC #1,@$DICSR ;ASSUME NOT WATCHING CURRENT TASK5 CMP $TKTCB,$DITCB ;IS DIAMOND WATCHING CURRENT TASK? BNE 83$ ;IF NE NO% BIS #1,@$DICSR ;SET DIAMOND REGISTERT83$: ;REFERENCE SYMBOLT .ENDC .IF DF S$$LIB, MOV #PMODE,PS ;INSURE PREVIOUS MODE IS USER .ENDC4 MOV T.PCB(R5),R3 ;GET ADDRESS OF TASK PARTITION PCB- MOV P.HDR(R3),R2 ;GET ADDRESS OF TASK HEADERI .IF DF X$$HDR# BNE 84$ ;IF NE HEADER IS RESIDENTT5 MOV #$SAVSP,$HEADR ;POINT TO STACK POINTER SAVE AREA 6 MOV #140000,R2 ;POINT TO START OF NON-RESIDENT HEADER1 MOV P.REL(R3),KISAR6 ;MAP TO NON-RESIDENT HEADER 8 MOV P.REL(R3),$SAHDB ;REMEMBER TASK HEADER MAPPING BIAS BR 841$ ;AND JOIN COMMON CODEM784$: MOV R2,$HEADR ;POINT TO HEADER SAVED STACK POINTERU .ENDC ; DF X$$HDR0841$: MOV R2,$SAHPT ;SAVE ADDRESS OF TASK HEADER .IF DF F$$MAP&X$$HDR&P$$LAS5 MOV H.FMAP(R2),$FMAPP ;LOAD FAST MAP CONTEXT POINTERB .ENDC ; DF F$$MAP&X$$HDR&P$$LAS# MOV R4,-(SP) ;SAVE EFFECT AST FLAGN3 MOV H.WND(R2),R4 ;POINT TO NUMBER OF WINDOW BLOCKSN. TST W.BLVR+2(R4) ;IS TASK MAPPED TO THE EXEC? BEQ 85$ ;IF EQ NO( MOV R2,R1 ;COPY ADDRESS OF TASK HEADER+ ADD R0,R1 ;POINT TO DIRECTIVE STATUS WORDD/ MOV (R1)+,(R0)+ ;RESTORE DIRECTIVE STATUS WORDC4 MOV (R1)+,(R0)+ ;RESTORE POINTER TO FCS IMPURE AREA8 MOV (R1)+,(R0)+ ;RESTORE POINTER TO FORTRAN IMPURE AREA8 MOV (R1)+,(R0)+ ;RESTORE POINTER TO OVERLAY IMPURE AREA6 MOV (R1)+,(R0)+ ;RESTORE PTR TO VECTOR OF IMPURE PTRS1 MOV #UINDR0,R0 ;POINT TO USER I DESCRIPTOR REG 0T .IF DF K$$DAS!M$$PRO .IF DF I$$CBP< MOV #<<<<$ICTOP+77>*4>-400>&77400>!6,(R0)+ ;MIN SIZE NEEDED .IFF ;DF,I$$CBP< MOV #<<<<$UTEND+77>*4>-400>&77400>!6,(R0)+ ;MIN SIZE NEEDED .ENDC ;DF,I$$CBPI .IFTF .IF DF M$$PRO6 MOV #177406,(R0) ;SETUP PRIV TASK PDR FOR 4K BYPASSED .IFFE< MOV #77406,(R0) ;SETUP PRIVILEGED TASK DESCRIPTOR REGISTERS .ENDC .IFFP MOV (R0)+,(R0) ;( .ENDC3 MOV (R0),UINDR0+14. ;ALLOW FULL ACCESS TO I/O PAGET;+J; If the task is installed, with T4.RON set, then pool will be protectedJ; from accidental harm when the privileged task is in user mode. Note thatK; APR0 must be mapped R/W, since the system will attempt to store directiveF$; status in $DSW, which is in LOWCR.;-: BIT #T4.RON,T.ST4(R5) ; TASK SET FOR R/O EXECUTIVE ACCESS2 BEQ 842$ ; IF EQ, NOPE, LEAVE R/W ACCESS TO POOL# BIC #4,(R0) ; FORCE ACCESS TO R/O842$: MOV (R0)+,(R0) ; MOV (R0)+,(R0) ;D MOV (R0)+,(R0) ;A. MOV #UINAR0,R1 ;POINT TO USER I ADDRESS REG 03 MOV #KISAR0,R0 ;POINT TO KERNAL ADDRESS REGISTER 0 9 MOV (R0)+,(R1)+ ;SETUP PRIVILEGED TASK ADDRESS REGISTERSd MOV (R0)+,(R1)+ ; MOV (R0)+,(R1)+ ; MOV (R0)+,(R1)+ ; MOV (R0),(R1) ;7 MOV #177600,UINAR0+14. ;SET ADDRESS REG 7 FOR I/O PAGEB BR 90$ ;585$: MOV #UINDR0,R0 ;POINT TO USER I DESCRIPTOR REG 0 /86$: CLR (R0)+ ;CLEAR ALL DESCRIPTOR REGISTERS# CLR (R0)+ ; CLR (R0)+ ; CLR (R0)+ ;) CLR (R0)+ ;( CLR (R0)+ ;M CLR (R0)+ ;A CLR (R0) ;90$: ;REFERENCE LABEL .IF DF S$$LIB1 BIC #10,SR3 ;ASSUME NEXT TASK DOESN'T USE SUPER+# ;MODE (DISABLE CSM INSTRUCTION) ) TSTB $SIRWF ;SUPERVISOR MODE R/W PDR'S?( BEQ 95$ ;IF EQ NO1 CLRB $SIRWF ;CLEAR FLAGV1 MOV #SISDR0,R0 ;POINT TO FIRST SUPER I SPACE PDRB# BR 86$ ;CLEAR SUPER I SPACE PDR'SI495$: MOVB #-1,$SUPFL ;INDICATE NO SUPERVISOR WINDOWS .ENDC. MOV (R4)+,-(SP) ;PUSH NUMBER OF WINDOW BLOCKS5100$: ADD #W.BLGH,R4 ;POINT PAST CURRENT WINDOW BLOCK+- MOV -W.BLGH(R4),R3 ;PICK UP NEXT PCB ADDRESS& BEQ 115$ ;IF EQ WINDOW IS NOT MAPPED, CMP -(R4),-(R4) ;POINT TO FIRST PDR ADDRESS4 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 002t__DATADATADATADATA;COUNT A SUPERVISOR MODE WINDOWC& BNE 102$ ;IF NE THIS ISN'T THE FIRST7 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 ROI:102$: ADD #SISDR0,R1 ;POINT TO FIRST SUPER INSTRUCTION PDR7 BIT #4,W.BLPD-W.BNPD(R4) ;R/W ACCESS TO SUPER I SPACE? BEQ 105$ ;IF EQ NO6 INCB $SIRWF ;SET FLAG FOR SUPER I SPACE WRITE ACCESS .ENDC4105$: MOVB (R4)+,R3 ;PICK UP NUMBER OF PDR'S TO LOAD6110$: MOVB (R4),(R1)+ ;SET USER DESCRIPTOR ACCESS CODE" MOVB #177,(R1)+ ;SET BLOCK LENGTH .IF DF M$$PRO!C$$CBPI! BIT #WB.BPS,(R4) ;ALWAYS BYPASS?E BEQ 111$ ;NO IF EQ0 BISB #200,-1(R1) ;SET UP TO ALWAYS BYPASS CACHE BR 112$ ;KA111$: BIT #WB.NBP,(R4) ;CACHE BYPASS NOT DESIRED FOR THIS WINDOW?B* BNE 112$ ;YES IF NE, DO NOT BYPASS CACHE8 BISB 1(R4),-1(R1) ;SET BYPASS BIT IN PDR AS APPROPRIATE .ENDC ; DF M$$PRO!C$$CBPS<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?1 BGT 110$ ;IF GT NO4 MOV (R4)+,-(R1) ;LOAD LAST USER DESCRIPTOR REGISTER .IF DF M$$PRO!C$$CBPI# BIT #WB.BPS,-2(R4) ;ALWAYS BYPASS?Y BEQ 113$ ;IF EQ NO0 BIS #100000,(R1) ;SET UP TO ALWAYS BYPASS CACHE BR 115$ ;IC113$: BIT #WB.NBP,-2(R4) ;CACHE BYPASS NOT DESIRED FOR THIS WINDOW?11 BEQ 115$ ;NO IF EQ, BYPASS CACHE AS APPROPRIATEC& BIC #100000,(R1) ;DO NOT BYPASS CACHE .ENDC ; DF M$$PRO!C$$CBP (115$: DEC (SP) ;ANY MORE WINDOW BLOCKS? BGT 100$ ;IF GT YES  .IF DF S$$LIB- INCB $SUPFL ;ADJUST SUPER MODE WINDOW COUNTL .ENDC ; DF S$$LIB' MOV (R2),(SP) ;LOAD USER STACK POINTER# MTPI SP ; 2 MOV #$UMR4,(R2) ;POINT SAVED SP VALUE AT SAVED R4>; IF A USER D SYSTEM, UPDATE THE USER D PAR'S/PDR'S TO OVERMAP!; USER I SPACE WHERE APPROPRIATE.D .IF DF U$$DAS1 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 72 MOVB H.DMAP(R2),R2 ;GET USER D SPACE MAPPING MASK" BNE 118$ ;IF NE MAPPING IS MIXED9; NONE OF USER D HAS DISCRETE MAPPING. COPY ALL REGISTERSE ; FROM USER I MOV -(R0),-(R3) ;PAR 7E MOV -(R1),-(R4) ;PDR 7O MOV -(R0),-(R3) ;6A MOV -(R1),-(R4) ; MOV -(R0),-(R3) ;5 MOV -(R1),-(R4) ; MOV -(R0),-(R3) ;4  MOV -(R1),-(R4) ; MOV -(R0),-(R3) ;3  MOV -(R1),-(R4) ; MOV -(R0),-(R3) ;2S MOV -(R1),-(R4) ; MOV -(R0),-(R3) ;1P MOV -(R1),-(R4) ; MOV -(R0),-(R3) ;0T MOV -(R1),-(R4) ;! BR 119$ ;SKIP MIXED UPDATE CODEC>; USER D SPACE MAPPING IS A MIXTURE (OR ALL D SPACE). TEST FOR*; LATTER CASE, THEN UPDATE AS APPROPRIATE.)118$: COMB R2 ;REVERSE SENSE OF BIT MASKE+ ;(1 NOW MEANS APR IS MAPPED TO I SPACE);. BEQ 119$ ;IF EQ, ALL APRS MAPPED BY DISCRETE' ;D SPACE WINDOWS, NO UPDATE NEEDED.M- BMI 1182$ ;IF MI, APR 7 IS MAPPED TO USER IR1; THIS SECTION HANDLES APRS WITH DISCRETE MAPPING-1181$: CMP -(R0),-(R3) ;ADVANCE PAR ADDRESSESR' CMP -(R1),-(R4) ;ADVANCE PDR ADDRESSES$ ASLB R2 ;TEST FOR NEXT APR. BEQ 119$ ;IF EQ END OF LOOP OR ALL REMAINING ;APRS HAVE DISCRETE MAPPINGE1 BPL 1181$ ;IF PL NEXT APR HAS DISCRETE MAPPING, $ ;BUT AT LEAST ONE MORE DOES NOT.2; THIS SECTION HANDLES APRS MAPPED TO USER I SPACE51182$: MOV -(R0),-(R3) ;COPY USER I PAR TO USER D PARD/ MOV -(R1),-(R4) ;COPY USER I PDR TO USER D PDR  ASLB R2 ;TEST FOR NEXT APR' BMI 1182$ ;NEXT APR MAPS USER I SPACE-/ BNE 1181$ ;IF NE, NEXT APR IS NOT OVERMAPPED,R ;BUT AT LEAST ONE MORE ISL/119$: MOV (SP)+,R2 ;RESTORE TASK HEADER ADDRESSL .ENDC ; DF U$$DAS+ MOV (SP)+,R4 ;RESTORE EFFECT AST INDICATORI .IF DF F$$LPP5 MOV H.FPSA(R2),R0 ;POINT TO FLOATING POINT SAVE AREA2 BEQ 120$ ;IF EQ TASK DOES NOT USE FLOATING POINT1 TST $HFMSK ;PROCESSOR HAVE A FLOATING PT UNIT ? + BMI 120$ ;IF MI NO, DON'T TRY TO LOAD CTXE2 MOV T.PCB(R5),R1 ;GET ADDRESS OF TCB OF NEXT TASK, MOV P.REL(R1),KISAR6 ;MAP TO TA00:ۄibjbkb a a aSK PARTITION .IF DF X$$HDR+ TST P.HDR(R1) ;TASK HAVE EXTERNAL HEADER ? BEQ 121$ ;IF EQ, YES .IFTF ;DF X$$HDRR .IF DF P$$LAS2 ADD T.OFF(R5),KISAR6 ;ADD IN OFFSET TO TASK IMAGE .ENDC .IFT ;DF X$$HDR121$: ;REFERENCE LABELO .ENDC ;DF X$$HDR14 TST (R0)+ ;POINT TO SAVED FLOATING POINT REGISTERS0 LDFPS #200 ;SET FLOATING DOUBLE MODE, NO TRAPS/ LDD (R0)+,R0 ;RESTORE FLOATING POINT REGISTERSR LDD (R0)+,R1 ; STD R1,R4 ;K LDD (R0)+,R1 ;K STD R1,R5 ;A LDD (R0)+,R1 ;. LDD (R0)+,R2 ;T LDD (R0)+,R3 ;K1 LDFPS @H.FPSA(R2) ;RESTORE FLOATING POINT STATUS .ENDC120$:;+; ** W A R N I N G **T;F; SPM HOOKPOINT NUMBER 05.;A); DO NOT CHANGE THE INSTRUCTION FOLLOWING; LABEL WITHOUT CHECKING SPM;-+$SPH05==. ;SPM CHANGES THE INSTRUCTION ATE ;THE LOCATION OF THIS LABELS. MOV H.GARD(R2),R0 ;POINT TO HEADER GUARD WORD% MOV SP,R1 ;POINT TO CURRENT CONTEXTR 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 PSK130$:U .IF DF A$$CNT2 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 YESI2 MOV $ACCLK+2,$STRTM+2 ;SAVE CURRENT ABSOLUTE TIME MOV $ACCLK,$STRTM ;( CLRB $BILNG ;INDICATE START OF BILLING .ENDC2; A FEW DESCRIPTIVE WORDS ABOUT AST CONTROL BLOCKS;R@; AST CONTROL BLOCKS FALL INTO SEVERAL DISTINCT CATEGORIES BASED/; UPON THE VALUES IN A.CBL AND A.BYT. THESE AREE;R; A.CBL A.BYT DESCRIPTION; ----- ----- -----------;C5; <0 X KERNEL AST. BIT 6 OF A.CBL IS SET IF $SGFINK/; SHOULD NOT BE CALLED PRIOR TO EXECUTING THE .; KERNEL AST CODE. BITS 0 THROUGH 5 OF A.CBL,; REPRESENT AN INDEX (DIVIDED BY 2) INTO A1; TABLE OF AST ADDRESSES ($KATBL). DEALLOCATION 4; IS THE RESPONSIBILITY OF THE PROCESSING ROUTINE.3; THESE ARE EXEC LEVEL FUNCTIONS SUCH AS BUFFERED 1; I/O COMPLETION WHICH MUST TAKE PLACE WHEN THEV; TASK CONTEXT IS LOADED.S;R:; 0 0 AST DEQUEUED BY A SYSTEM SUBROUTINE. THE ROUTINE2; IS MAPPED BY THE CONTENTS OF A.KSR5 AND CALLED2; VIA THE ADDRESS IN A.DQSR. DEALLOCATION IS THE-; RESPONSIBILITY OF THE DEQUEUE ROUTINE. AN 2; EXAMPLE IS THE PROCESSING OF UNSOLICITED INPUT"; ASTS BY THE FULL DUPLEX TTDRV.;.8; 0 N THIS IS A SPECIFIED AST BLOCK OF LENGTH C.LGTH5; (A.PLGH FOR PARITY ERROR ASTS) N IS THE SPECIFIEDB/; AST TYPE. THESE BLOCKS ARE RE-LINKED IN THEE6; T.SAST LIST AFTER THE AST IS DECLARED (EXCEPT FOR)3; PARITY ERROR ASTS, WHICH ARE ALWAYS DEALLOCATED 1; AFTER USE, AND REQUESTED EXIT ASTS, WHICH ARE 3; DEALLOCATED AFTER USE BY A NON-PRIVILEGED TASK.E;N:; >0 0 THIS IS A DYNAMIC AST (I/O COMPLETION, MARK TIME3; OF LENGTH A.CBL. AFTER THE PARAMETERS ARE MOVEDP4; TO THE TASK STACK AND THE AST EFFECTED THE BLOCK; IS DEALLOCATED. ;A132$: TST R4 ;EFFECT AST? BNE TAST ;IF NE YES  JMP 190$ ;NO3TAST: MOV R5,R0 ;CALCULATE ADDRESS OF AST LISTHEADH ADD #T.ASTL,R0 ;E* CALL $QRMVF ;REMOVE AST ENTRY FROM QUEUE MOVB A.CBL(R1),R4 ;KERNEL AST ? BPL 135$ ;IF PL NO JMP 210$ ;2135$: MOV R5,R4 ;CALCULATE ADDRESS OF STATUS WORD ADD #T.ST2,R4 ;- MOVB (R4),-(SP) ;COPY CURRENT EXTENSION BYTEI= BIC #^C,(SP) ;CLEAR ALL BUT WAIT STATEO) ASL (SP) ;SHIFT INTO POSITITON FOR SAVEO: 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 ADDRESS - MOV R3,-(SP) ;SAVE AST CONTROL BLOCK ADDRESSB6 CMP (R3)+,(R3)+ ;POINT TO NUMBER OF BYTES TO ALLOCATE .IF DF X$$HDR, MOV $SAHPT,R4 ;POINT TO CURRENT TASK HEADER .IFFM, MOV $HEADR,R4 ;POINT TO CURRENT TASK HEADER .ENDC ;X$$HDR$ MFPI SP ;GET CURRENT STACK POINTER MOV (SP)+,R0 ;H6 MOV (R3)+,R1 ;GET NUMBER OF BYTES TO ALLOCATE ON TASK' SUB R1,00Bt__DATADATADATADATAR0 ;CALCULATE NEW TOP OF STACKP( 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 HEADERA .IFTF ; DF X$$HDR) MOV R0,-(SP) ;SET NEW TASK STACK POINTERO MTPI SP ;T- CALL $RELOM ;RELOCATE AND MAP STACK ADDRESST) MOV SP,R1 ;CALCULATE ADDRESS OF TRAP PCM .IFF ; DF X$$HDRE ADD #7*2,R1 ;A .IFT ; DF X$$HDR0 ADD #8.*2,R1 ;P .ENDC ; DF X$$HDR! MOV (R1)+,-(SP) ;SAVE PC AT TRAP1 MOV (R1),R2 ;SAVE PS AT TRAP' MOV #CMODE!PMODE,(R1) ;SET AST TRAP PS;! MOV (R3)+,-(R1) ;SET AST TRAP PCF2 MOV (R3)+,-(SP) ;GET NUMBER OF PARAMETERS TO MOVE .IFTA# BIT #1,(R1) ;SUPERVISOR MODE AST?$ BEQ 140$ ;IF EQ NO" DEC (R1)+ ;CLEAR SUPERVISOR FLAG- TSTB $SUPFL ;TASK HAVE SUPER MODE LINKAGE ?D+ BEQ 140$ ;IF EQ NO, DON'T ALLOW SUPER ASTP: BIC #^CCSMODE&CMODE,(R1) ;SET SUPERVISOR MODE IN STACK PS .ENDC-140$: DEC (SP) ;ANY MORE PARAMETERS TO MOVE?1 BLT 150$ ;IF LT NO. MOV (R3)+,(R0)+ ;MOVE PARAMETER TO USER STACK BR 140$ ;;150$: TST (SP)+ ;CLEAN STACKR MFPD$ @#H.DSW ;GET USER DSW+( MOV (SP)+,(R0)+ ;MOVE DSW TO TASK STACK/ MOV (SP)+,(R0)+ ;MOVE PC AT TRAP TO TASK STACK, MOV R2,(R0)+ ;MOVE PS AT TRAP TO TASK STACK, MOV T.EFLM(R5),(R0) ;SAVE WAITFOR MASK WORD .IF DF X$$HDR7 MOV (SP)+,KISAR6 ;RESTORE MAPPING TO XTRNL TASK HEADERO .ENDC7 MOV T.EFLM+2(R5),H.EFSV(R4) ;SAVE WAITFOR MASK ADDRESS) BR 170$ ;TAKE COMMON EXIT1#160$: MOV #S.CAST,R0 ;SET AST ABORT0! CALL $ABCTK ;ABORT CURRENT TASKB6170$: MOV (SP)+,R0 ;RETRIEVE AST CONTROL BLOCK ADDRESS1 MOV A.CBL(R0),R1 ;GET LENGTH OF BLOCK TO RELEASEA BNE 175$ ;JUMP IF NON-ZERO( CMP -(R0),-(R0) ;ZERO - POINT TO A.KSR5 .IF DF K$$DAS3 MOV (R0),KDSAR5 ;MAP DEQUEUE ROUTINE IN DATA SPACEO .ENDC5 MOV (R0)+,KINAR5 ;MAP DEQUEUE ROUTINE IN INSTR SPACEA& CALL @(R0)+ ;CALL DEQUEUE SUBROUTINE BR 200$ ;EXITE 175$: TSTB R1 ;LENGTH NON-ZERO? BNE 180$ ;Y - JUMP SWAB R1 ;GET AST CODE ) CMPB R1,#AS.PEA ;PARITY ERROR AST BLOCK?S% BEQ 1781$ ;IF EQ YES, DEALLOCATE ITN .IF DF A$$CLI+ CMPB R1,#AS.CAA ;COMMAND ARRIVAL AST BLOCKS BNE 176$ ;IF NE NO2 TST A.PRM+2(R0) ;SHOULD AST BLOCK BE DEALLOCATED? BEQ 177$ ;IF EQ YES BR 178$ ;RELINK BLOCKU 176$: ; .ENDC ;A$$CLI+ CMPB R1,#AS.REA ;REQUESTED EXIT AST BLOCK?I BNE 179$ ;IF NE NO( BIT #T3.PRV,T.ST3(R5) ;TASK PRIVILEGED? BNE 178$ ;IF NE YES 0177$: CALL $DECLK ;DEALLOCATE AST CONTROL BLOCK BR 200$ ;D6178$: BIC #T2.REX,T.ST2(R5) ;ALLOW AST RESPECIFICATION;179$: MOV T.SAST(R5),(R0) ;LINK AST CONTROL BLOCK BACK INTO1( MOV R0,T.SAST(R5) ;THE HEAD OF THE LIST BR 200$ ;TRY EXIT AGAINM+1781$: MOV #A.PLGH,R1 ;GET LENGTH OF PACKETQ,180$: CALL $DEACB ;DEALLOCATE CONTROL BLOCK BR 200$ ;TRY EXIT AGAINI(190$: TSTB T.ST2(R5) ;TASK BEING HALTED? BPL 200$ ;IF PL NOTEXIT: ;REFERENCE LABEL .IF DF X$$HDR+ MOV $SAHDB,KISAR6 ;MAP CURRENT TASK HEADERL .ENDC ; DF X$$HDR) CALL $DREX1 ;CONTINUE TASK EXIT PROCESS.200$: ;REF LABELS .IF DF S$$LIB1 TSTB $SUPFL ;DOES TASK HAVE SUPERVISOR WINDOWS?1 BEQ 205$ ;IF EQ NO- CALL LSUPD1 ;LOAD SUPERVISOR DATA REGISTERSM( 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 STACKA0 ADD #4,(SP) ;MAKE USER SP 4 MORE THAN SUPER SP) MOV #PMODE,PS ;SET PREVIOUS MODE TO USER$" MTPI SP ;LOAD USER STACK POINTER8 BIC #^CPSMODE&PMODE,PS ;SET PREVIOUS MODE TO SUPERVISOR( MTPI SP ;LOAD SUPERVISOR STACK POINTER .ENDC .IF NDF M$$PRO 205$: JMP $DIRXT ;N .IFFB205$: JMP DIRXT1 ;L .ENDC+210$: MOV #$DIRXT,-(SP) ;SET RETURN ADDRESSG- MOV R1,R0 ;SET ADDRESS OF AST CONTROL BLOCK- CLR (R0) ;INDICATE THIS IS A SCHEDULER CALL,5211$: ASLB R4 ;CONVERT AST INDEX TO WORD, TST $SGFINS$ BMI 215$ ;IF MI NO $SGFIN REQUIRED- CALL $SGFIN ;SETUP TO IGNORE S00Jۄibjbkb a a aEGMENT FAULTSA .IF DF R$$WPT; MOV $KATBL+256.(R4),$WPLST ;SAVE LAST SYSTEM STATE ADDRESS .ENDC ; DF R$$WPT1 JMP @$KATBL+256.(R4) ;DISPATCH TO PROPER ROUTINER215$:0 .IF DF R$$WPT; MOV $KATBL+128.(R4),$WPLST ;SAVE LAST SYSTEM STATE ADDRESS$ .ENDC ; DF R$$WPT1 JMP @$KATBL+128.(R4) ;DISPATCH TO PROPER ROUTINEL;+;**-$DSPKA-DISPATCH KERNEL AST;L>; THIS ROUTINE IS CALLED WHEN A KERNEL AST IS TO BE DISPATCHED;; BY A COMPONENT OTHER THAN THE SCHEDULER (SPECIFICALLY THET&; LOADER TO DISPATCH REGION LOAD ASTS.; ; INPUTS:+ ; R0=ADDRESS OF KERNEL AST BLOCK;T ; OUTPUTS:; THE AST IS SERVICEDJ;@=; NOTE: THE TASK CONTEXT IS NOT GUARANTEED LOADED, SO THE AST$@; MAY ONLY BE USED TO PERFORM SERVICES DEPENDENT UPON CONDITIONS+; GUARANTEED BY THE CALLER OF THIS ROUTINE.(;-5$DSPKA::MOV KINAR5,-(SP) ;SAVE CURRRENT APR 5 MAPPING  .IF DF K$$DAS' MOV KDSAR5,-(SP) ;SAVE D SPACE MAPPING  .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 AST .IF DF K$$DAS- MOV (SP)+,KDSAR5 ;RESTORE PREVIOUS D MAPPINGT .ENDC ; DF K$$DAS+ MOV (SP)+,KINAR5 ;RESTORE PREVIOUS MAPPING RETURN ;E .DSABL LSBO;+5; **-$GGFRN-GROUP GLOBAL EVENT FLAG USE COUNT RUNDOWNO;IA; DEACCESS THIS TASK'S GROUP GLOBAL EVENT FLAGS IF THE EVENT FLAGKC; MASK IN THE AST CONTROL BLOCK IS GROUP GLOBAL, AND DEALLOCATE THEB; THE AST CONTROL BLOCK.;M ; INPUTS: ;T,; R0=ADDRESS OF THE KERNEL AST CONTROL BLOCK;R9; TASK HEADER IS EITHER RESIDENT OR MAPPED THROUGH KISAR63; AND $SAHPT IS ASSUMED TO BE VALID AT THIS POINT.N;; ; OUTPUTS:;M1; THE GROUP GLOBAL EVENT FLAGS ARE DEACCESSED ANDR#; THE CONTROL BLOCK IS DEALLOCATED.*;G"; FORMAT OF THE AST CONTROL BLOCK:;U; WD. 00 -- UNKNOWNS#; WD. 01 -- KERNEL AST TYP = AK.GGF ; WD. 02 -- UNKNOWN #; WD. 03 -- EVENT FLAG MASK ADDRESSP;O;- .IF DF G$$GEF8$GGFRN::MOV $SAHPT,R4 ;GET CURRENT TASK'S HEADER ADDRESS) MOV R0,-(SP) ;SAVE CONTROL BLOCK ADDRESSK* MOV 6(R0),R3 ;GET EVENT FLAG MASK ADDRESS' CALL $DEAGF ;DEACCESS IF GROUP GLOBALV, MOV (SP)+,R0 ;RESTORE CONTROL BLOCK ADDRESS+ CALL $DEPKT ;DEALLOCATE THE CONTROL BLOCKR% CALLR $SETRT ;INSURE RESCAN OF TASK .ENDC ; DF G$$GEF .IF DF P$$OFF;+1; **-$FINXT-FINISH OFFSPRING TASK EXIT PROCESSING.; D; THIS ROUTINE IS CALLED TO OPTIONALLY SET AN EVENT FLAG, DECLARE ANE; AST AND RETURN EXIT STATUS TO A PARENT TASK ONCE THAT TASK HAS BEENA ; SCHEDULED.;( ; INPUTS:O;O(; R0=ADDRESS OF OFFSPRING CONTROL BLOCK.;A ; OUTPUTS:;B; ALL EXIT CONDITIONS ARE EFFECTED AND THE OFFSPRING CONTROL BLOCK;; IS DEALLOCATED IF IT IS NOT USED AS AN AST CONTROL BLOCK.C;-$$FINXT::MOV R0,R3 ;COPY OCB POINTER MOV R0,R4 ;COPY OCB POINTER ( TST (R3)+ ;SKIP OVER LINK WORD (O.LNK): MOV #O.LGTH,(R3)+ ;SET LENGTH TO DEALLOCATE (O.LNK=A.CBL)5 MOV (R3),R5 ;PICK UP PARENT TCB ADDR (O.PTCB=A.BYT)E4 MOV #8.*2,(R3)+ ;BYTES ON USER STACK (O.PTCB=A.BYT)- TST (R3)+ ;SKIP OVER AST WORD (O.AST=A.AST)O/ MOV (R3),R0 ;PICK UP EFN NUMBER (O.EFN=A.NPR) / CALL $SETFG ;SET EFN AND UNLOCK IF GRP GLOBALG4 MOV #1,(R3)+ ;SET NUMBER OF AST PARMS (O.EFN=A.NPR)5 MOV (R3)+,R0 ;PICK UP VIRTUAL ESB ADDR (O.ESB=A.PRM)O) MOV #1,R2 ;ASSUME ONE WORD STATUS BLOCK! ASR R0 ;ONE WORD STATUS BLOCK ?.* BEQ 40$ ;IF EQ NO STATUS BLOCK SPECIFIED% BCC 5$ ;IF CC ONE WORD STATUS BLOCKC% MOV #8.,R2 ;SET SIZE TO EIGHT WORDSM)5$: ASL R0 ;SET ADDRESS BACK TO ORIGINAL=5 CLC ;MAKE SURE CARRY IS CLEAR TO DETECT MTPD$ TRAP6 MOV R0,-2(R3) ;CORRECT ADDRESS IN AST BLOCK FOR STACK+10$: MOV (R3)+,-(SP) ;GET A WORD OF THE ESBM. MTPD$ (R0)+ ;STORE IN USER BUFFER (CAN TRAP)- BCS 40$ ;IF CS TRAPPED, NO POINT CONTINUINGE SOB R2,10$ ;CONTINUE WITH COPY40$: TST O.AST(R4) ;EFFECT AST?N BEQ 50$ ;IF EQ NO.# MOV R5,R0 ;SET PARENT TCB ADDRESSE" MOV R4,R1 ;SET AST BLOCK ADDRESS/ CALLR $QASTT ;QUEUE AST FOR PARENT AND RETURNM*50$: MOV R4,R0 ;POINT TO BLOCK TO RELEASE(00Rt__DATADATADATADATA MOV #O.LGTH,R1 ;PICK UP SIZE TO RELEASE CALL $DEACB ;DEALLOCATE OCB;% CALLR $SETRT ;INSURE RESCAN OF TASK .IFF ;DF P$$OFFN$FINXT::BGCK$A BF.KAS,BE.SGN,FATAL ;SHOULDN'T HAVE AK.OCB IN NON P$$OFF SYSTEM .ENDC;+E; **-$DBTRP-SET T BIT IN SAVED PS TO CAUSE TASK TO TRAP INTO DEBUGGERT;)>; THIS LOCAL ROUTINE IS CALLED AS A KERNEL AST TO FORCE A TASK=; TO TRAP INTO A DEBUGER. IT IS CALLED AS A RESULT OF THE MCR;/; "DEBUG" COMMAND QUEUEING THE KERNEL AST BLOCK ;I ; INPUTS: ;R ; R0=ADDRESS OF KERNEL AST BLOCK#; R5=ADDRESS OF TCB OF CURRENT TASKC; ; OUTPUTS:;EB; THE "T" BIT IS SET IN THE SAVED PS IN THE TASK'S HEADER TO CAUSED; ITTO TRAP. THE AST BLOCK IS DEALLOCATED. IF THE TASK DOES NOT HAVEB; A DEBUGGER SST VECTOR SPECIFIED, OR IS EXITING, THE T BIT IS NOT>; SET, AND THE AST BLOCK IS USED TO QUEUE A MESSAGE REQUEST TO; TKTN FOR OUTPUT.;T;-A$DBTRP::BIT #T2.ABO!T2.HLT,T.ST2(R5) ;IS TASK EXITING OR ABORTINGN BNE 20$ ;IF NE YES" MOV T.PCB(R5),R4 ;FIND TASK'S PCB .IF DF X$$HDR9 MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING IN CASE XTRNL HDRT* MOV P.HDR(R4),-(SP) ;POINT TO TASK HEADER BNE 5$ ;IF NE RESIDENT HEADER - MOV P.REL(R4),KISAR6 ;MAP TO EXTERNAL HEADER 5 MOV #140000,(SP) ;POINT TO VIRTUAL ADDRESS OF HEADERO/5$: MOV (SP)+,R4 ;GET VIRTUAL ADDRESS OF HEADERT& MOV H.ODVA(R4),R4 ;GET VECTOR ADDRESS* MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING% TST R4 ;IS A DEBUGGER SST SPECIFIEDX .IFF ; DF X$$HDRB" 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 NO ? BIC #T2.SEF!T2.STP!T2.SPN!T2.WFR,T.ST2(R5) ;MAKE TASK RUNNABLE * 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 TASKR"20$: TST $TKNPT ;TKTN INSTALLED ?' BEQ 10$ ;IF EQ NO, DEACLLOCATE PACKETS& MOV #T.NDEB,R3 ;NO DEBUGGER SPECIFIED1 MOV T.NAM+2(R5),R4 ;GET SECOND HALF OF TASK NAMEP! MOV T.NAM(R5),R5 ;AND FIRST HALFH, CALLR $DVMG1 ;REQUEST TKTN USING AST BLOCK;++; **-$GENBF-GENERAL BUFFERED I/O COMPLETIONT;TC; THIS ROUTINE IS CALLED TO TRANSFER KERNEL AST CONTROL TO A DRIVERSB; FOR PROCESSING OF FUNCTIONS WHICH MUST BE DONE WITH TASK CONTEXT.; LOADED. THE AST CONTROL BLOCK IS AS FOLLOWS:;S!; +-----------------------------+N!; ! LINK WORD !D!; +-----------------------------+ !; ! A.BYT=0 ! A.CBL=AK.GBI !2!; +-----------------------------+M!; ! SUBROUTINE KISAR5 BIAS !L!; +-----------------------------+I!; ! SUBROUTINE ADDRESS !E!; +-----------------------------+;H ; INPUTS:I;A!; R0=ADDRESS OF AST CONTROL BLOCK ;A ; OUTPUTS:; ;+,$GENBF::SAVNR ;SAVE NON-VOLATILE REGISTERS+ MOV R0,R3 ;COPY AST CONTROL BLOCK ADDRESSA, MOV $TKTCB,R0 ;GET CURRENT TASK TCB POINTER0 CALL $SETCR ;FORCE RE-DISPATCHING OF PROCESSOR( MOV 4(R3),KISAR5 ;MAP TO DRIVER ROUTINE .IF DF K$$DAS2 MOV 4(R3),KINAR5 ;MAP TO DRIVER ROUTINE (I SPACE) .ENDC ; DF K$$DAS. CALLR @6(R3) ;CALL DRIVER ACCEPTANCE ROUTINE;+.; **-$FINBF-FINISH TERMINAL INPUT BUFFERED I/O;>; THIS ROUTINE IS CALLED TO COMPLETE A BUFFERED TERMINAL INPUTF; REQUEST THAT HAS BEEN PLACED IN THE AST QUEUE, OR TO COMPLETE AN I/OB; REQUEST FOR A TASK WHICH MAY HAVE UNMAPPED ITS I/O STATUS BLOCK.;T ; INPUTS:;L; R0=ADDRESS OF I/O PACKET.N:; R4=0 FOR BUFFERED I/O OR 100 FOR POSSIBLE UNMAP OF IOSB.;F; REQUIRED I/O PACKET FIELDS: ;P&; I.FCN+1=I/O FUNCTION CODE OF REQUEST+; I.PRM=RELATIVE KISAR6 BIAS OF USER BUFFERE,; I.PRM+2=KISAR6 DISPLACEMENT OF USER BUFFER; I.PRM+6=FIRST I/O STATUS WORDS>; I.PRM+10=2ND I/O STATUS WORD (AND COUNT FOR $BLXIO TRANSFER)5; I.PRM+12=PTR TO LINKED LIST OF BUFFERS OR 0 IF NONET'; I.PRM+14=KISAR5 BIAS OF DRIVER BUFFERH0; I.PRM+16=PCB ADDRESS FOR PARTITION OF TRANSFER;L?; NOTE: ONLY THE I/O STATUS IN I.PRM+6 AND I.PRM+10 IS REQUIREDR ; IF R4=100. ; OUTPUTS:; B; THE BUFFERED I/O REQUEST IS COMPLETED AND $IOFIN IS CALLED. THED; DRIVER IS CALLED TO 00Zۄibjbkb a a aDEALLOCATE ANY BUFFERS. IF THE BUFFER ADDRESSC; IS ODD, THE BUFFER IS NOT COPIED AND INSTEAD THE DRIVER IS CALLED+C; DIRECTLY. THIS CASE ALLOWS FOR NON-STANDARD BUFFER FORMATS. THERE; DRIVER IS RESPONSIBLE FOR TRANSFERRING THE DATA TO THE USER BUFFER.V=; IF THE PCB ADDRESS IS ODD, THE BUFFER IS IN SECONDARY POOL.L;- .ENABL LSBI+$FINBF::SAVNR ;SAVE NONVOLITILE REGISTERS 2 MOV I.PRM+16(R0),R1 ;GET ADDRESS OF BUFFER REGION+ BIC #1,R1 ;CLEAR SECONDARY POOL INDICATOR CALL $TSPAR ;BUFFER RESIDENT ? BCC 5$ ;IF CC YESF# BR 50$ ;IF CS NO, LOAD AST QUEUEDO,$FINDI::SAVNR ;SAVE NON-VOLATILE REGISTERS'5$: MOV R0,R3 ;COPY I/O PACKET ADDRESSA) BIT #1,(R3) ;IS THIS A REGION LOAD AST?N2 BNE 10$ ;IF NE YES, DON'T WRITE I/O STATUS BLOCK0 MOV I.IOSB(R3),R0 ;PICK UP VIRTUAL IOSB ADDRESS BEQ 10$ ;IF EQ NONE SPECIFIEDI5 MOV I.PRM+6(R3),-(SP) ;PUSH FIRST WORD OF I/O STATUSM4 MTPD$ (R0)+ ;WRITE IN USER IOSB (ANY TRAP IGNORED)7 MOV I.PRM+10(R3),-(SP) ;PUSH SECOND WORD OF I/O STATUSB6 MTPD$ (R0)+ ;WRITE IN USER IOSB+2 (ANY TRAP IGNORED)1 CLR I.IOSB+4(R3) ;NO I/O STATUS BLOCK FOR $IOFINA10$:6 ASSUME AK.BUF,200 ;BUFFERED I/O LOW BITS MUST BE ZERO TSTB R4 ;BUFFERED I/O? BNE 30$ ;IF NE NO , MOV I.TCB(R3),R5 ;RETRIEVE TASK TCB ADDRESS- DECB T.TIO(R5) ;DECREMENT BUFFERED I/O COUNTB0 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(0 BIC #1,R2 ;CLEAR POSSIBLE SEC POOL BUFFER FLAG6 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)6 MOV -(R3),R2 ;PICK UP INPUT BUFFER ADDRESS (I.PRM+12) BEQ 20$ ;IF EQ THERE IS NONE. 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$$TSAS*11$: BIT #1,R5 ;BUFFER IN SECONDARY POOL? BEQ 13$ ;IF EQ NOR/12$: MOV R2,R1 ;BUFFER ADDRESS IS MAPPING BIASD& 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 NO0 MOV R2,R1 ;COPY BUFFER ADDRESS/ BIC #77,R1 ;REMOVE DISPLACEMENT IN BLOCK BITSF3 SUB #120000,R1 ;CALC OFFSET IN DRIVER PAR IN BYTES,. SUB R1,R2 ;REDUCE ADDRESS TO FIT IN KERNEL 5+ ASL R1 ;CONVERT BYTE OFFSET TO 32W BLOCKS$ ASL R1 ; SWAB R1 ;#/ ADD 2(R3),R1 ;CALCULATE PHYSICAL MEMORY OFFSETQ14$: MOV R1,KISAR5 ;MAP BUFFER115$: MOV (R2)+,-(SP) ;SAVE POINTER TO NEXT BUFFERI$ MOV (R2)+,R0 ;PICK UP SIZE OF BLOCK) SUB #4,R0 ;REDUCE COUNT BY HEADER BYTES ' SUB R0,-(R3) ;IS THERE THAT MUCH LEFT?M BCC 16$ ;IF CC YES% ADD (R3),R0 ;ELSE SET CORRECT COUNTM& CLR (R3) ;CLEAR REMAINING BYTE COUNT016$: MOV -10(R3),R3 ;PICK UP KISAR6 BIAS (I.PRM)& CALL $BLXIO ;TRANSFER TO USER BUFFER. 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)A BNE 11$ ;IF NE YES317$: MOV (R3),R0 ;POINT TO FIRST BUFFER (I.PRM+12)02 MOV @I.UCB-(R3),R2 ;POINT TO DRIVER DCB& MOV D.PCB(R2),R3 ;POINT TO DRIVER PCB .IF DF K$$DAS/ MOV P.REL(R3),KDSAR5 ;MAP DRIVER IN DATA SPACEN .ENDC0 MOV P.REL(R3),KINAR5 ;MAP DRIVER IN INSTR SPACE1 MOV D.DSP(R2),R2 ;POINT TO DRIVER DISPATCH TABLER3 CALL @D.VDEB(R2) ;CALL DRIVER DEALLOCATION ROUTINET)20$: MOV (SP)+,R3 ;RESTORE PACKET ADDRESS  TST (R3) ;REGION LOAD AST ?+' BNE 40$ ;IF NE YES, RE-QUEUE TASK AST )30$: CALLR $IOFIN ;COMPLETE I/O REQUESTU&40$: MOV I.TCB(R3),R0 ;SET TCB ADDRESS4 MOVB #AK.DIO,A.CBL(R3) ;CHANGE AST TYPE TO "DELAYED ;I/O COMPLETION"' CALLR $REQUE ;RE-QUEUE TASK LEVEL ASTI*50$: INCB T.TIO(R5) ;RE-COUNT BUFFERED I/O ;FORCE I/O RUNDOWN IF TASK ;EXITS DURING LOAD AST RETURN ;D .DSABL LSB00bt__DATADATADATADATA;V; EXECUTIVE IDLE LOOPA;CF; THE EXECUTIVE IDLE LOOP IS ENTERED WHEN THERE ARE NO RUNNABLE TASKS.E; THE NULL TCB AT THE END OF THE TASK LIST IS ALWAYS GUARANTEED TO BERF; BLOCKED. TWO FLAGS ARE SET FOR OTHER EXECUTIVE ROUTINES IN THE IDLE; LOOP. ;.H; 1. THE ADDRESS OF THE NULL TCB (#$ACTHD) IS SET INTO THE RESCHEDULEB; POINTER ($RQSCH) TO PREVENT $DIRXT FROM EVER RETURNING TO SYSTEMB; STATE WHILE THE EXEC IS IDLE. THIS FORCES EXECUTION BACK TO THE/; IDLE LOOP IN LIEU OF A REAL SCHEDULE REQUEST.X;TG; 2. AN IDLE FLAG IS SET ($IDLFL) FOR THE FORK ROUTINES TO CAUSE THEMO=; TO FORCE CONTROL BACK TO $DIRXT WHEN NECESSARY TO DEQUEUE A @; FORK. (IT IS IMPOSSIBLE FOR THE IDLE LOOP TO ALWAYS RETURN TO@; $DIRXT WHEN NECESSARY BECAUSE OF A WINDOW BETWEEN THE CHECK OF*; THE FORK LIST AND THE WAIT INSTRUCTION.);EE; THE STACK CANNOT BE USED IF $IDLFL IS SET TO A ONE AND THE PRIORITYMD; IS OTHER THAN PR7, BECAUSE WE COULD SUSTAIN AN INTERRUPT RESULTINGD; IN A FORK WHICH WOULD FORCE $QFORK TO JAM AN ADDRESS DIRECTLY INTOD; THE STACK. IF WE ARE USING THE STACK, THEN IT WOULDN'T KNOW WHERE; TO PUT THE ADDRESS.H;N .ENABL LSBE>IDOL: MOV #$ACTHD,@$RQSCH ;PREVENT $DIRXT RETURN TO USER STATE+ CLRB @$CURPR ;CLEAR CURRENT TASK PRIORITYA;+; ** W A R N I N G **;H; SPM HOOKPOINT NUMBER 31.;C); DO NOT CHANGE THE INSTRUCTION FOLLOWINGI; LABEL WITHOUT CHECKING SPM;-+$SPH31==. ;SPM CHANGES THE INSTRUCTION ATT ;THE LOCATION OF THIS LABELA .IF DF M$$PRO. MOV @#$TKTCB,R0 ;;;GET CURRENT TASK ; BM079" BEQ 40$ ;;;IF EQ NO CURRENT TASK6 BIT @$CPCRM,T.RRM(R0) ;CAN THIS TASK RUN ON THIS CPU?) BNE 72$ ;IF NE NO -- REMOVE HIS CONTEXTP: 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 CONTEXTT*IDLE1: ;;;REF. LABEL FOR CONTEXT SWITCH"40$: MTPS #PR7 ;;;UP OUR PRIORITY+ BIT $CPBIT,$URMST ;;;ARE WE GOING OFFLINE?M BNE 42$ ;;;IF NE NOS0 CALL $OLRNT ;;;TELL HRC... WE MADE IT THIS FAR5 ULOCK$ $EXECL,WAIT ;;;CLEAR OUT AND LET THE WORLD INE HALT ;;;COME TO A DEAD STOP! 842$: DECB $IDLFL ;;;SHOW IN IDLE LOOP - UNINTERRUPTABLE;+; ** W A R N I N G ** ;Y; SPM HOOKPOINT NUMBER 33.;R); DO NOT CHANGE THE INSTRUCTION FOLLOWINGT; LABEL WITHOUT CHECKING SPM;-+$SPH33==. ;SPM CHANGES THE INSTRUCTION ATO ;THE LOCATION OF THIS LABEL7+ MOV #$IDLPT,R1 ;;;SET UP FOR LIGHT PATTERN ' ULOCK$ $EXECL,WAIT ;;;UNLOCK EXECUTIVES' JMP DIRXT2 ;;;CHECK FOR WAITING FORKS  .IFF2 MOV #$IDLPT,R1 ;;;SET FOR IDLE LOOP LIGHT PATTERN" INCB $IDLFL ;;;SHOW IN IDLE LOOP% TST $FRKHD ;;;ANYTHING IN FORK LIST-) BEQ IDLE ;;;IF EQ NO -- ENTER IDLE LOOP ;+; ** W A R N I N G **R;.; SPM HOOKPOINT NUMBER 33.;U); DO NOT CHANGE THE INSTRUCTION FOLLOWINGS; LABEL WITHOUT CHECKING SPM;-+$SPH33==. ;SPM CHANGES THE INSTRUCTION AT  ;THE LOCATION OF THIS LABELU0 CLRB @#$IDLFL ;;;NOT IN IDLE LOOP NOW ; BM079! JMP $DIRXT ;;;EXECUTE THE FORKSO ;;;ENTER EXECUTIVE .ENDC.; INTERMEDIATE TARGET TO JUMP TO STORE CONTEXT)72$: JMP STCTX ;GO STORE CONTEXT OF TASK 1IDLE: CACHE$ RESTOR ;RESTORE CACHE TO NON-BYPASS % MOV (R1)+,(R1) ;RESTORE IDLE PATTERNG$ DECB $IDLCT ;TIME TO MOVE PATTERN? BGE 45$ ;IF GE NOH MOVB #2,$IDLCT ;RESET COUNT# ASLB (R1)+ ;MOVE PATTERN ($IDLPT)3 RORB (R1) ;($IDLPT+1)S ADCB -(R1) ;($IDLPT)745$: MOV (R1),R0 ;PUT IT WHERE IT CAN BE SEEN ($IDLPT)O$ MOV R0,-(R1) ;SAVE IT FOR NEXT TIME WAIT ;OF; IF $IIPND HAS ANY OF OUR URMS SET, WE SHOULDN'T BE IN THE IDLE LOOP.D; IF WE HAVE JUST POWERFAILED, THEN THIS CODE PATH MAY BE TAKEN. IFG; NOT, WE SHOULD NEVER EXECUTE IT. STILL, ITS NICE BELT AND SUSPENDERS 3; TECHNIQUE. NOT MUCH ELSE TO DO IN THE IDLE LOOP.4;  .IF DF M$$PRO0 CACHE$ BYPASS ;MAKE SURE WE GET THE REAL THING% BIT @$CPURM,$IIPN00jۄibjbkb a a aD ;ANY WORK FOR US? + BEQ IDLE ;IF EQ NO, IDLE AROUND SOME MOREH" JMP DIRXT2 ;GO FIND OUT FOR SURE .IFFS BR IDLE ;IF NO MULTIPROCESSING .ENDC .DSABL LSBR;+6; **-$SGFIN-SEGMENT FAULT AND TRAP 4 INTERCEPT ROUTINE;OE; THIS ROUTINE IS A CO-ROUTINE WHICH SETS UP TO IGNORE SEGMENT FAULTSR; AND TRAPS THROUGH 4.;C ; INPUTS:S;E; NONE. ;H ; OUTPUTS:;H; NONE.D;-5$SGFIN::MOV @#4,-(SP) ;SAVE CONTENTS OF TRAP 4 VECTORS .IF DF P$$D701 MOV $SGFFR,-(SP) ;SAVE LAST $SGFIN FRAME POINTER 5 MOV @#114,-(SP) ;SAVE MAIN MEMORY TIMEOUT AND PARITYR% MOV 6(SP),-(SP) ;COPY RETURN ADDRESS, MOV @#250,10(SP) ;SAVE SEGMENT TRAP ADDRESS" MOV #20$,@#114 ;TRAP THESE FAULTS .IFF % MOV 2(SP),-(SP) ;COPY RETURN ADDRESSR7 MOV @#250,4(SP) ;SAVE CONTENTS OF SEGMENT FAULT VECTORU .IFTF, MOV #10$,@#4 ;POINT TO ROUTINE TO SET CARRY MOV #10$,@#250 ;H;O"; CONTENTS OF STACK AT THIS POINT:; +; 0(SP)=COROUTINE RETURN ADDRESS TO CALLER.0(; 2(SP)=CONTENTS OF @#114 (IF DF P$$D70)'; 4(SP)=SAVE $SGFFR CELL (IF DF P$$D70) ; 6(SP)=CONTENTS OF @#4R; 10(SP)=CONTENTS OF @#250;  .IFTM" MOV SP,$SGFFR ;SAVE FRAME POINTER/ ADD #6,$SGFFR ;ADJUST TO POINT TO SAVED TRAP 4  .IFTF CALL @(SP)+ ;RETURN TO CALLERM .IFT42 MOV (SP)+,@#114 ;RESTORE MAIN MEMORY TIMEOUT TRAP. MOV (SP)+,$SGFFR ;RESTORE SAVED FRAME POINTER .IFTF% MOV (SP)+,@#4 ;RESTORE TRAP 4 VECTORT3 BIC #160000,@#SR0 ;UNFREEZE MEMORY MANAGEMENT UNITA. MOV (SP)+,@#250 ;RESTORE SEGMENT FAULT VECTOR$ RETURN ;RETURN TO CALLER'S CALLER10$: ;REFERENCE LABEL .IFTS;N*; TRAP 4 SERVICE FOR 11/70 CLASS MACHINES.;RC; THIS TRAP SERVICE RESETS THE VECTOR AT FOUR, AND THEN ATTEMPTS TO E; CLEAR THE CPU ERROR REGISTER. IF THE REGISTER ISN'T THERE, WE WILL@C; TRAP THRU FOUR, AND GO TO 15$, WHERE WE WILL CLEAR THE EQUAL BIT,VG; SET THE CARRY BIT, AND RTI. AFTER THE ATTEMPT TO CLEAR THE CPU ERRORCD; REGISTER, WE CHECK THE CARRY TO SEE IF IT WAS REALLY THERE, AND IFC; IT WAS, THEN WE CHECK IT TO SEE IF THIS WAS ONE OF THE CONDITIONS0C; THAT WE EXPECT IN $SGFIN. IF IT ISN'T, THEN WE ACT LIKE THIS WASA; A NORMAL TRAP TO FOUR.; ) MOV #15$,@#4 ;RESET TRAP TO FOUR ADDRESST! CLC ;SET UP CARRY PROPERLY NOWE/ BIC #60,@#177766 ;CLEAR OUT CPU ERROR REGISTER % BCS 12$ ;IF CS REGISTER ISN'T THERE & BEQ 12$ ;IF EQ WE CLEARED IT ALL OUT;IC; HERE WE HAVE FOUND A PROBLEM: WE HAVE TAKEN A TRAP THROUGH VECTOREA; LOCATION 4, BUT THE REASON WAS NOT FOR NON-EXISTANT MEMORY. INHF; THIS CASE, WE WISH TO SIMULATE A TRAP THROUGH THE CONTENTS OF VECTORF; FOUR PRIOR TO THE TIME THAT $SGFIN PLACED ITS OWN VALUE IN IT. THISH; IS POINTED TO ON THE STACK BY THE $SGFFR POINTER. IT SEEMS REASONABLEF; TO SIMPLY DISPATCH THROUGH THAT LOCATION, WHICH WE WILL DO. IF THISD; IS NOT A GOOD IDEA, THIS IMPLEMENTATION WILL ALLOW UNTHREADING THEC; STACK UNTIL THE ULTIMATE RESOLUTION OF THE NESTED CALLS TO $SGFINT; IS EFFECTED.;O* MOV @$SGFFR,-(SP) ;GET ADDRESS TO JUMP TO JMP @(SP)+ ;JUMP THEREA11$: MOV #104001,@#177744 ;CLEAR OUT MEMORY SYSTEM ERROR REGISTERO<12$: MOV #10$,@#4 ;RESET TRAP 4 (WHETHER IT NEEDS IT OR NOT) .IFTF"15$: BIC #4,2(SP) ;CLEAR EQUAL BIT BIS #1,2(SP) ;SET CARRY BIT RTI .IFTI;H; TRAP 114 SERVICE; D; THIS TRAP SERVICE ACCEPTS TRAPS TO 114 ON PDP-11/70 CLASS MACHINESD; SO THAT ATTEMPTS TO REFERENCE NON-EXISTANT MEMORY BELOW THE SYSTEMD; SIZE REGISTER DOESN'T LOOK LIKE A PARITY ERROR. THIS SERVICE ALSOA; ATTEMPTS TO VERIFY IF THE CAUSE OF THE TRAP TO 114 IS IN FACT A@A; NON-EXISTANT MEMORY CONDITION, OR IF IT WAS SOME OTHER PROBLEM. D; IF IT WAS SOME OTHER PROBLEM, TRANSFER IS MADE TO THE PARITY ERRORD; SERVICE ROUTINE. IF IT WAS NON-EXISTANT MEMORY, THEN THE REGISTER0; IS CLEARED AND THE NORMAL CODE FLOW REENTERED.;TE; A SPECIAL CASE EXISTS IN THE CASE WHERE A TRAP 114 OCCURRED, AND WEEC; ARE NOT ON A SYSTEM WITH A MEMORY SYSTEM ERROR REGISTER. IN THISKG; CASE, THE CMP ACCESS WILL FAIL, TRAPPING THRU 4, WHICH WILL ENCOUNTERSG; THE 00rt__DATADATADATADATACODE IN $SGFIN MENTIONED ABOVE. THIS CODE WILL CLEAR THE EQ BIT,FD; SO THAT THE COMPARISON WILL FAIL, CAUSING A TRANSFER TO THE PARITYH; ERROR SERVICE ROUTINE. THIS IS THE DESIRED RESULT, SINCE THE ONLY WAYJ; WE COULD TRAP TO 114 ON A MACHINE WITHOUT A MEMORY SYSTEM ERROR REGISTERA; (OR SYSTEM SIZE REGISTER) WAS TO ENCOUNTER A REAL PARITY ERROR.A;W720$: CMP #104001,@#177744 ;IS THIS MAIN MEMORY TIMEOUT?E, BEQ 11$ ;IF EQ YES -- SET CARRY AND RETURN .IF DF U$$BMEW5 BCS 25$ ; IF CS, MEM SYS ERR REGISTER DOESN'T EXISTE+ BIT #20000,@#177744 ; UNIBUS PARITY ERROR?A+ BEQ 25$ ; IF EQ, NOPE, SOMETHING ELSE ...R5 MOV @#177744,@#177744 ; CLEAR OUT THE ERROR REGISTERI BIS #2,2(SP) ; SET THE V BIT RTI ; BACK TO SOURCE 25$: .ENDC ;DF,U$$BMES .IF DF P$$RTY( JMP $PARER ;NO -- THIS IS PARITY ERROR .IFF ; DF P$$RTYE< BGCK$A BF.PAR,BE.SGN,HALT ;PARITY ERROR, P$$RTY NOT DEFINED .ENDC ; DF P$$RTY .ENDC;+; **$SWSTK-SWITCH STACKS;W@; THIS ROUTINE IS CALLED FROM TASK LEVEL TO SWITCH TO THE SYSTEM@; STACK THUS INHIBITING TASK SWITCHING. THE CALLING TASK MUST BEB; PRIVILEGED IF RUNNING IN A MAPPED SYSTEM AND MAPPED TO THE EXEC.B; CONTROL IS PASSED HERE FROM DRDSP AFTER THE TRAP HAS OCCURED AND; $DIRSV HAS BEEN CALLED.;F; CALLING SEQUENCE:A; #; EMT 376 ;TRAP TO $EMSST IN DRDSP /; .WORD ADDR ;ADDRESS FOR RETURN TO USER STATEY;R; INPUTS AT THIS POINT:;N,; R3=ADDRESS OF PC WORD OF TRAP ON STACK + 2;I; MAPPED SYSTEM:;R; 22(SP)=PS PUSHED BY TRAP; 20(SP)=PC PUSHED BY TRAP; 16(SP)=SAVED R5B; 14(SP)=SAVED R4G; 12(SP)=SAVED R3M; 10(SP)=SAVED R2D; 06(SP)=SAVED R1P; 04(SP)=SAVED R0E'; 02(SP)=RETURN ADDRESS FOR SYSTEM EXITF; 00(SP)=104376H;R ; OUTPUTS:;A@; THE USER IS CALLED BACK ON THE SYSTEM STACK WITH ALL REGISTERS@; PRESERVED. TO RETURN TO TASK LEVEL THE CALLER MERELY EXECUTES ; A RETURN.T;=; NOTE: PRIVILEGED TASKS MAY ONLY CALL $SWSTK FROM SUPERVISORA9; MODE IF BOTH SUPERVISOR MODE AND KERNEL DATA SPACE AREH9; SUPPORTED IN THE EXEC. FURTHERMORE, THEY MUST ONLY DO); SO WITH CODE RUNNING IN APRS 5, 6 & 7.0;-+$SWSTK::BICB #357,(R3) ;SET INITIAL PS WORDR .IF DF K$$DAS&S$$LIBS) TST $STACK-2 ;CALL FROM SUPERVISOR MODE?U BMI 5$ ;IF MI NO# MOV SDSAR5,KDSAR5 ;COPY SUPERVISOR MOV SDSAR6,KDSAR6 ;DATA MAPPING, MOV SISAR5,KINAR5 ;COPY SUPER INSTR MAPPING MOV SISAR6,KINAR6 ; MOV SISAR7,KINAR7 ; BR 10$ ;FINISH IN COMMON CODEP .ENDC)5$: MOV #UINAR5,R5 ;POINT TO USER I APR 5  .IF DF K$$DAS .IF DF U$$DAS3 MOV UDSAR0-UINAR0(R5),KDSAR5 ;SET UP KERNEL DATA 5N .IFF ; DF U$$DAS0& MOV (R5),KDSAR5 ;SET UP KERNEL DATA 5 .ENDC ; DF U$$DAS .IFTF ; DF K$$DAS' MOV (R5)+,KINAR5 ;SET UP KERNEL INST 5I .IFT ; DF K$$DASS .IF DF U$$DAS3 MOV UDSAR0-UINAR0(R5),KDSAR6 ;SET UP KERNEL DATA 6S .IFF ;DF U$$DAS& MOV (R5),KDSAR6 ;SET UP KERNEL DATA 6 .ENDC ;DF U$$DASB .ENDC ;DF K$$DASM .IF DF K$$DAS&U$$DAS$' MOV (R5)+,KINAR6 ;SET UP KERNEL INST 6' MOV (R5)+,KINAR7 ;SET UP KERNEL INST 7U .IFFA& MOV (R5),KINAR6 ;SET UP KERNEL INST 6 .ENDC ;DF K$$DAS&U$$DAS'10$: MOV -(R3),R5 ;PICK UP TRAP PC WORD  .IF DF U$$DAS!K$$DAS&S$$LIB2 MFPI (R5)+ ;GET ADDRESS FOR RETURN TO USER STATE. MOV (SP)+,(R3) ;FROM CORRECT SPACE AND SET IT .IFF ; DF U$$DAS!K$$DAS&S$$LIB5 MOV (R5)+,(R3) ;SET ADDRESS FOR RETURN TO USER STATEA .ENDC ; DF U$$DAS!K$$DAS&S$$LIB# MOV R5,(SP) ;SET CALLER'S ADDRESS MOV -(R3),R5 ;RESTORE R5E MOV 12(SP),R3 ;RESTORE R3;+; ** W A R N I N G **;.; SPM HOOKPOINT NUMBER 70.;P); DO NOT CHANGE THE INSTRUCTION FOLLOWING; LABEL WITHOUT CHECKING SPM;-+$SPH70==. ;SPM CHANGES THE INSTRUCTION ATM ;THE LOCATION OF THIS LABELN CALLR @(SP)+ ;CALL THE CALLERO;+&; **-$LSUPD-LOAD SUPERVISOR DATA SPACE;$A; THIS ROUTINE IS CALLED BEFORE TRANSFERRING CONTROL TO A TASK INT?; SUPERVISOR MODE TO LOAD SUPERVISOR D SPACE FROM USER I SPACE.E; ; INPUTS:M;-; NONE.R;O ; OUTPUTS:;(; R2 A00zۄibjbkb a a aND R3 ARE PRESERVED.;- .IF DF S$$LIBB$LSUPD::BIC #^CPSMODE&PMODE,PS ;SWITCH PREVIOUS MODE TO SUPERVISOR-$LSUP1:: ;GLOBAL ENTRY WHICH DOESN'T AFFECT0 ;MODE BITS IN THE PSWR,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 REGISTER  .IF DF X$$HDR, MOV KISAR6,-(SP) ;SAVE CURRENT EXEC MAPPING- MOV $SAHDB,KISAR6 ;MAP TO HEADER IF EXTERNALS .IFTF ; DF X$$HDR* MOV $SAHPT,R3 ;GET ADDRESS OF TASK HEADER% MOVB H.SMAP(R3),R3 ;GET MAPPING MASKP! BNE 30$ ;IF NE MAPPING IS MIXEDEF; THIS SECTION HANDLES THE UNMIXED CASE (ALL SUPER D MAPPED TO USER D)-; IN STRAIGHT LINE CODE FOR PERFORMANCE SAKE.C210$: MOV (R0)+,(R1)+ ;COPY USER I TO SUPER D SPACE MOV (R0)+,(R1)+ ; MOV (R0)+,(R1)+ ; MOV (R0)+,(R1)+ ; MOV (R0)+,(R1)+ ; MOV (R0)+,(R1)+ ; MOV (R0)+,(R1)+ ; MOV (R0),(R1) ; CMP R1,#SDSAR7 ;DONE YET? BEQ 20$ ;IF EQ YES% MOV #UISAR0,R0 ;POINT TO USER I APR0P& MOV #SDSAR0,R1 ;POINT TO SUPER D APR0 BR 10$ ;PERFORM COPY20$: .IFT ; DF X$$HDRE0 MOV (SP)+,KISAR6 ;RESTORE PREVIOUS EXEC MAPPING .IFTF ; DF X$$HDR$ MOV (SP)+,R3 ;RESTORE WORK REGISTER RETURN ;RE; THIS SECTION HANDLES THE MIXED CASE WHERE SOME OF SUPER D IS MAPPED(@; TO USER D AND SOME IS MAPPED TO SUPER I BY INTERPRETING H.SMAP(30$: MOV R2,-(SP) ;SAVE ANOTHER REGISTER+ MOV #SISDR0,R2 ;POINT TO SUPER I REGISTERSE0 BIS #100000,R3 ;SET DONE FLAG BIT INTO REGISTER( ASLB R3 ;ADJUST REGISTER FOR FACT THAT( ;BIT ZERO OF MAP CORRESPONDS TO APR1'40$: ASR R3 ;CHECK NEXT BIT (NEXT APR) + BCC 50$ ;IF CC NEXT APR MAPS USER D SPACE 5 MOV SISAR0-SISDR0(R2),SDSAR0-SDSDR0(R1) ;SET ADDRESS ' MOV (R2)+,(R1)+ ;SET ACCESS AND LENGTHC" TST (R0)+ ;ADJUST USER D POINTER BR 60$ ;ON TO NEXT ONE950$: MOV UISAR0-UISDR0(R0),SDSAR0-SDSDR0(R1) ;SET ADDRESSP' MOV (R0)+,(R1)+ ;SET ACCESS AND LENGTH # TST (R2)+ ;ADJUST SUPER I POINTER060$: TSTB R3 ;MORE TO GO ?T BPL 40$ ;IF PL YES MOV (SP)+,R2 ;RESTORE REGISTERS .IFT ; DF X$$HDRR0 MOV (SP)+,KISAR6 ;RESTORE PREVIOUS EXEC MAPPING .ENDC ; DF X$$HDR MOV (SP)+,R3 ;FOR RETURN RETURN ;- .ENDC;+=; **-CKMAP-CHECK TASK MAPPING TO DETERMINE IF IT CAN RUN NOW.C;TD; THIS ROUTINE DETERMINES IF THERE ARE MULTIPLE RUNNING TASKS MAPPED; TO THE SAME REGION.-;D ; INPUTS: ;RA; R2=HEADER ADDRESS FOR TASK BEING TESTED FOR ELIGIBILITY TO RUN. >; R5=TCB ADDRESS FOR TASK BEING TESTED FOR ELIGIBILITY TO RUN.;S ; OUTPUTS:; ; C=0 IF TASK CAN RUN NOW.<; C=1 IF TASK CANNOT RUN NOW BECAUSE THERE ARE OTHER RUNNING9; TASKS MAPPED TO A REGION WHICH THIS TASK IS MAPPED TO.T; ;-$CKMAP:: .IF DF M$$PRO$ CLR -(SP) ;ASSUME TASK CAN RUN NOW MOV R0,-(SP) ;SAVE REGISTERSE MOV R1,-(SP) ;E MOV R2,-(SP) ;U MOV R3,-(SP) ;D MOV R4,-(SP) ;E .IF DF X$$HDR' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGG .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 WINDOWSS10$: ;REFERENCE LABEL .IFT ; DF X$$HDRC0 MOV #$DICSV,R3 ;POINT TO INTERMEDIATE SAVE AREA" MOV R0,(R3)+ ;SAVE WINDOW ADDRESS .REPT - MOV (R0)+,(R3)+ ;COPY ADDR WNDW TO SAVE AREAR .ENDR4 SUB #W.BLGH,R3 ;POINTER TO BEGINNING OF WINDOW AREA) MOV R3,R0 ;POINT TO WINDOW IN SAVE AREAE .IFTF ; DF X$$HDR TST (R0) ;IS WINDOW MAPPED?P BEQ 90$ ;IF EQ NO$ .IFTF ; DF X$$HDR- MOV #M$$PRO,R1 ;GET THE NUMBER OF PROCESSORS(# MOV #$TKTAB,R2 ;POINT TO TCB TABLES'20$: MOV (R2)+,R3 ;GET NEXT TCB ADDRESSX1 BEQ 80$ ;IF EQ THERE IS NO CURRENT TASK ON PROCV CMP R5,R3 ;IS THIS OUR TCB?D BEQ 80$ ;IF EQ YES SKIP IT; BIT #T4.SNC,T.ST4(R3) ;DOES TASK SYNCHRONIZE THRU COMMONS?N BEQ 80$ ;IF EQ NO - BIT #^C,T.STAT(R3) ;IS TASK BLOCKED?0 BNE 80$ ;IF NE YES= BIT #T2.STP!T2.WFR,T.ST2(R3) ;IS TASK STOPPED OR IN WAITFOR?P BNE 80$ ;IF NE YES1 MOV T.PCB(R3),R3 ;GET ADDRESS OF TASK REGION PCBT .IFT ; DF X$$HDRS* MOV P.REL(R3),KIS00t__DATADATADATADATAAR6 ;MAP EXTERNAL HEADER* MOV P.HDR(R3),R3 ;GET TASK HEADER ADDRESS& BNE 25$ ;IF NE, TASK HAS POOL HEADER2 MOV #140000,R3 ;OTHERWISE, TASK HAS EXTRNL HEADER25$: ;REFERENCE LABEL .IFF ; DF X$$HDRT- MOV P.HDR(R3),R3 ;GET ADDRESS OF TASK HEADERN .IFTF ; DF X$$HDR- MOV H.WND(R3),R3 ;POINT TO NUMBER OF WINDOWSS+ MOV (R3)+,-(SP) ;GET THE NUMBER OF WINDOWSP.30$: CMP (R0),(R3) ;MAPPED TO THE SAME REGION? BNE 70$ ;IF NE NOE= CMP W.BOFF(R0),W.BOFF(R3) ;DOES TASK TO BE RUN HAVE A REGIONK( ;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 RUN0 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 TASK00 ADD W.BSIZ(R3),R4 ;CALCULATE END OF MAPPED AREA( CMP R4,W.BOFF(R0) ;DO REGIONS OVERLAP? BLOS 70$ ;IF LOS NOG760$: INC 16(SP) ;INDICATE OVERLAP, TASK CANNOT RUN NOWI TST (SP)+ ;CLEAN THE STACK BR 100$ ;Y970$: ADD #W.BLGH,R3 ;POINT TO NEXT WINDOW IN RUNNING TASKN DEC (SP) ;ANY MORE WINDOWS?D BNE 30$ ;IF NE YES TST (SP)+ ;CLEAN THE STACK680$: SOB R1,20$ ;CONTINUE SCAN WITH NEXT RUNNING TASK .IFF ; DF X$$HDRN;90$: ADD #W.BLGH,R0 ;POINT TO NEXT WINDOW OF TASK TO BE RUNI .IFT ; DF X$$HDR(?90$: MOV 2(SP),KISAR6 ;RESTORE POSSIBLE MAPPING TO XTRNL HEADERN1 ADD #W.BLGH,-(R0) ;SET UP POINTER TO NEXT WINDOW  MOV (R0),R0 ;P .IFTF ; DF X$$HDR DEC (SP) ;ANY MORE WINDOWS?B BNE 10$ ;IF NE YES!100$: TST (SP)+ ;CLEAN THE STACKR .IFT ; DF X$$HDRP+ MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPINGT .ENDC ; DF X$$HDR MOV (SP)+,R4 ;RESTORE REGISTERS MOV (SP)+,R3 ;N MOV (SP)+,R2 ;  MOV (SP)+,R1 ;: MOV (SP)+,R0 ;P3 ROR (SP)+ ;CLEAN STACK AND RETURN STATUS IN CARRYX RETURN ;: .ENDC .ENDSTORE POSSIBLE MAPPING TO XTRNL HEADERN1 ADD #W.BLGH,-(R0) ;SET UP POINTER TO .TITLE INITLi .IDENT /17.11/r;C1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.c; All rights reservede;y;x<; 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;G+; MODIFIED FOR RSX-11M-PLUS VERSION 2.1 BY:M;C; B. S. MCCARTHY; P. J. BEZEREDI;t+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:e; ; J. W. BERZLE; J. M. LAWLER; B. S. MCCARTHY; M. PETTENGILL; J. G. WEHNER; P. K. M. WEISS;+; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY:9;y; B. S. MCCARTHY; J. W. BERZLE; L. B. MCCULLEY;+; MODIFIED FOR RSX-11M-PLUS VERSION 4.4 BY:A;M; B. S. MCCARTHY ; D. Carroll;O+; Modified for RSX-11M-PLUS Version 4.5 by: ;N ; D. Carroll;3+; Modified for RSX-11M-PLUS Version 4.6 by: ;M; D. Carroll 18-Oct-1995 16.102; DC403 - Correct problem with size of space used2; if including both resident crash, and resident0; XDT. Conditionalize all of the mP support in ; the code.; ; D. Carroll 28-Oct-1995 17.00<; DC410 - Conditionalize for support with virtual disks and&; partitioned disks being booted ...;O; D. Carroll 08-Jan-1996 17.101; DC430 - Include support for 32-bit LBN devicess; (Happy birthday, Ann!);; D. Carroll 28-Jul-1997 17.111; DC483 - Correct selecting of alternate devices0; ;4;-; MACRO LIBRARY CALLSi;o .MCALL HWDDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS;e; MACRO DEFINITIONSn;z .MACRO BREAK TYPE .IF DF X$$DBT .WORD 3 .IFF- HALT1 .ENDC .IF IDN ,p BR .-2r .ENDC .ENDM;e'; INITIALIZE PROPER BIT SETTING FOR SR3l;- S3$BTS==0 ;INIT TO NO BITS SET .IF DF M$$EXT5S3$BTS==S3$BTS!60 ;ENABLE 22 BIT MODE AND UNIBUS MAP2 .ENDC .IF DF K$$DAS(S3$BTS==S3$BTS!4 ;ENABLE KERNEL D SPACE .ENDC .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 S00ۄibjbkb a a aPACE .ENDC ; DF U$$DAS; ; LOCAL DATA; ; SYSTEM IDENTIFICATION MESSAGES;p .NLIST BEX.0SYSMG: .ASCII <15><177><177><12>/ V/SYSVR: .ASCII / BL/ SYSID: .ASCIZ / /<15><12><12>7MESS0: .ASCIZ /Directive partition not fixed in memory/E0$MESS1::.ASCIZ /Executive data space not loaded/ .IF DF M$$PRO ;DC403?MESS2: .ASCIZ /No CPU partition created in MP system/ ;DC403A .ENDC ;DF,M$$PRO ;DC403?MESS3: .ASCII /Boot device not found in system tables:/ ;**-1 .BYTE 15,177,177,122 .ASCII /R0=device type (ASCII)/<15><177><177><12>3 .ASCII /R1=Physical unit number/<15><177><177><12>7 .ASCII /R2=CSR address/ .IF DF M$$PRO* .ASCIZ <15><177><177><12>/R3=CPU ordinal/ .IFFr .BYTE 0 .ENDC .EVENMESS4: .ASCII /Device /XX: .ASCIZ /XX -- /l!MESS5: .ASCIZ /Driver not loaded/37MESS6: .ASCIZ /Driver does not support controller type/ +MESS7: .ASCIZ /Vector address above V$$CTR/SMESS10: .ASCIZ /Vector in use/ .IF DF M$$PRO ;DC4035MESS11: .ASCIZ /Unibus run not accessible/ ;DC4031 .ENDC ;DF,M$$PRO ;DC403=MESS12: .ASCIZ /Driver didn't return control after / ;**-1/'MESS13: .ASCIZ /controller online call/<177><177><12> MESS22: .ASCIZ /Fatal error -- /4MESS23: .ASCIZ /Secondary pool not created with VMR/MESS24: .ASCIZ /Warning -- / .IF DF C$$CDA ;DC410 .IF NE C$$CDA ;DC410BMESS25: .ASCII /Crash device not found in system tables:/<15><177>; .ASCII <177><12>/R0=device type (ASCII)/<15><177><177><12>.9 .ASCII /R1=logical unit number/<15><177><177><12>/Enter/C8 .ASCII / CSR address in R2, physical unit number in R1/ .ASCII <15><177><177><12>/and / .IF DF X$$DBT .ASCII /type P/ .IFF2 .ASCII /hit continue/ .ENDC .ENDC ;DC403d .ENDC ;DC403 ;**-1A5NULL: .BYTE 0 ;NOTE -- THIS MUST FOLLOW PREVIOUS TEXTN&CTLET: .ASCII /ABCDEFHJKLMNPRSTUVWXYZ/ .IF DF K$$DAS.MESS26: .ASCIZ /ICB pool overmaps kernel APR1/ .ENDC ;DF,K$$DASe .IF DF V$$DSK ;DC410=MESS27: .ASCIZ /Device does not support partitions/ ;DC410S<MESS28: .ASCIZ /Virtual device is nested too deep/ ;DC410 .IF NDF E$$LBN ;DC410.DMESS29: .ASCIZ /Device is too big, requires 32-bit support/ ;DC410 .ENDC ;NDF,E$$LBN ;DC410 .IFF ;DF,V$$DSK ;DC410 BMESS29: .ASCIZ "Virtual/partitioned drives not supported" ;DC410 .ENDC ;DF,V$$DSK ;DC410 .EVEN; 8; TABLE OF ERROR MESSAGES INDEXED BY GETVEC INITIAL CODE;CGETERR: .WORD MESS5$ .WORD MESS6 .WORD MESS7 .WORD MESS10d .IF DF M$$PRO ;DC403 .WORD MESS11 ;DC403t .ENDC ;DF,M$$PRO ;DC403&PROMT: .ASCIZ <15><12>/>/ ; ;**-1 .EVEN;C/; DATA AREA FOR DATA-SPACE INITIALIZATION TABLE ;4; FORMAT OF THE TABLE IS: ;C.; DTBL: .WORD ADDRESS ;ADDRESS FOR NEXT VALUE,; .WORD DATA ;DATA TO PLUG AT ABOVE ADDRESS; ; .; .; .; 5; .WORD 0 ;ZERO IN ADDRESS POSITION TERMINATES TABLEE;  .IF DF K$$DASDTBL: ;REFERENCE LABEL$ .IF DF M$$PRO7 .WORD $IITBX ;INTERPROCESSOR INTERRUPT COMMON INT TBLO& .WORD $IIINT ;IIST INTERRUPT ADDRESS9 .WORD $IITBX+CI.PWF ;IIST COMMON INT TBL POWERFAIL ENTRY.* .WORD $IIPWF ;ENTRY POINT IN IIST MODULE .ENDC .IF DF R$$HDV1 .WORD $RHTBX ;RH COMMON INTERRUPT TABLE ADDRESSS* .WORD $RHALT ;RH COMMON INTERRUT ADDRESS7 .WORD $RHTBX+CI.KRB ;RH COMMON CONTROLLER ONLINE ENTRYR5 .WORD $RHKRB ;ADDRESS OF RH CONTROLLER ONLINE ENTRY/ .WORD $RHTBX+CI.PWF ;RH COMMON POWERFAIL ENTRY- .WORD $RHPWF ;ADDRESS OF RH POWERFAIL ENTRYS/ .WORD $RHTBX+CI.CSR ;ADDRESS OF CSR TEST ENTRYT! .WORD $RHCSR ;RH CSR TEST ENTRYI .ENDC .IF DF R$$6111 .WORD $DMTBX ;DM COMMON INTERRUPT TABLE ADDR00t__DATADATADATADATAESSU+ .WORD $DMALT ;DM COMMON INTERRUPT ADDRESSH8 .WORD $DMTBX+CI.KRB ;DM CONTROLLER ONLINE/OFFLINE ENTRY+ .WORD $DMKRB ;DM CONTROLLER ENTRY ADDRESSK3 .WORD $DMTBX+CI.PWF ;DM CONTROLLER POWERFAIL ENTRY / .WORD $DMPWF ;DM CONTROLLER POWERFAIL ADDRESS$4 .WORD $DMTBX+CI.CSR ;DM CONTROLLER CSR TEST ADDRESS .WORD $DMCSR ;CSR TEST ADDRESS .ENDC; KERNEL AST TABLE ENTRIES/; KEEP THIS TABLE IN SYNCH WITH $KATBL IN SYSCMN. .WORD $KATBL+00,$FINBF ;AK.BUF - BUFFERED I/O0 .WORD $KATBL+02,$FINXT ;AK.OCB - OFFSPRING EXIT6 .WORD $KATBL+04,$GENBF ;AK.GBI - GENERAL BUFFERED I/O3 .WORD $KATBL+06,$DBTRP ;AK.TBT - FORCED T-BIT TRAPE3 .WORD $KATBL+10,$FINDI ;AK.DIO - DELAYED I/O COMP. 3 .WORD $KATBL+12,$GGFRN ;AK.GGF - GRP. GBL. RUNDWN.F$; SPM VECTOR FOR ACP HOOKPOINT ENTRY .WORD $SPV01T .WORD $SPVEXD; AND LOADER HOOKPOINT ENTRIES .WORD $SPV02A .WORD $SPVEXS .WORD $SPV03 .WORD $SPVEXW; !; LAT DISCONNECT CALL ENTRY POINT0;I .IF DF M$$NET&T$$LTHI .WORD $LTEEP+ .WORD $SPVEXC .ENDC ; DF M$$NET&T$$LTHA .WORD 0 ;END OF TABLEA .ENDC;.0; TEMPORARY STORAGE AREA FOR $SYSIZ INFORMATION.; (K$$DAS SYSTEMS ONLY) ;. .IF DF K$$DAS+$SYALT::.WORD 0,0,0,0,0 ;STORAGE FOR $SYSIZL .IF DF,E$$LBN ;DC430R7 .WORD 0 ;extra word for 32-bit device support ;DC430 .ENDC ;DF,E$$LBN ;DC430 .ENDC .LIST BEX .IF DF R$$PRO;5; THIS ROUTINE IS TAKEN FROM THE MODULE POWER. IT IS:; HERE BECAUSE THE EXEC HAS NO POWER FAIL CODE OF ITS OWN.;=$POWER: CALL $DRDSE ;ALWAYS DECLARE SIG. EVENT AT CPU PWRUP.C MOV #$SCDVT,-(SP)'30$: CALL @(SP)+ ;GET NEXT UCB ADDRESS  BCC 40$ ;IF CC GOT ONE% CLRB $PWRFL ;CPU POWERFAIL COMPLETE, 35$: RETURNA'40$: MOV #30$,-(SP) ;SET RETURN ADDRESSR0 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 BEQ 45$ ;IF EQ NO KRB ADDRESSA244$: BIT #KS.OFL,K.STS(R2) ;IS CONTROLLER OFFLINE? BNE 35$ ;IF NE YES@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 TABLEA" BEQ 35$ ;IF EQ DRIVER NOT LOADED. CALLR $LDPWF ;CALL DRIVER AT POWERFAIL ENTRY .ENDC ; DF R$$PRO;+#; **-$INITL-SYSTEM TRANSFER ADDRESSN;IJ; THIS ROUTINE CONTAINS THE TRANSFER POINT OF THE RESIDENT EXECUTIVE. WHENJ; THE SYSTEM IS BOOTED, CONTROL IS TRANSFERED HERE TO INITIALIZE AND START; UP THE SYSTEMW;- $INITL::RESET ;RESET PROCESSOR+ MOV R0,@#46 ;SAVE BOOT DEVICE CSR ADDRESS5= MOV R3,@#50 ;AND ALSO PARTITION/VIRTUAL DEVICE INFO ;DC430 ? MOV #$SYALT+2,R0 ;POINT TO SYSTEM CONFIGURATION VECTOR ;DC430O* MOVB R3,(R0)+ ;SAVE UNIT NUMBER ;DC430 .IF DF E$$LBN ;DC4306 CLRB (R0)+ ; ZERO HIGH ORDER PORTION OF UNIT ;DC430 .IFF ;DF,E$$LBN ;DC4300 MOVB R1,(R0)+ ;SAVE LBN OF LOAD IMAGE ;DC430 .IFTF ;DF,E$$LBN ;DC430 MOV R2,(R0)+ ; ;**-3 MOV R4,(R0)+ ;SAVE DEVICE NAMEI' MOV R5,(R0)+ ;SAVE LENGTH OF LOAD FILE# .IFT ;DF,E$$LBN ;DC4306 MOV R1,(R0)+ ;SAVE FULL HIGH ORDER DEVICE LBN ;DC430 .ENDC ;DF,E$$LBN ;DC430I ;**-1I .IF DF M$$PRO) JMP $PENT ;USE COMMON CODE IF AVAILABLE  .IFF.9 MOV #PMODE+PR7,PS ;SET MODE BITS AND LOCK OUT INTERRUPTSI, MOV #$STACK-20,SP ;SETUP EXEC STACK POINTER2 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 IT2 MOV #$MESS1,R4 ;SPECIFY MESSAGE TO TYPE ON CONSOL- CALL $FATAL ;PREFACE WITH FATAL DESIGNATION./ BREAK FATAL ;IF D SPACE NOT LOADED HANG IT UP.3$: SUB #200,R2 ;ADJUST TO BE RIGHT FOR APR 1/ BIT #^C<17777>,#$ICTOP ; IS ICB POOL TOO HIGH? BEQ 5$ ; IF EQ, NOPE, CONTINUE' MOV #MESS26,R4 ; SET THE ERROR MESSAGET- CALL $FATAL ;PREFACE WITH FATAL DESIGNATIONG0 BREAK FATAL ;IF ICB POOL INTO APR1, HANG IT UP .IFTF5$: ;REFERENCE LA00ۄibjbkb a a aBELT .IFTM0 MOV #77406,KDSDR0-KINAR0(R5) ;SET D SPACE 4K RW1 MOV R2,KDSAR0-KINAR0(R5) ;SET D SPACE APR OFFSETL/ ADD #200,R2 ;ADVANCE D SPACE APR OFFSET BY 4K 0 MOV #77402,KINDR0-KINAR0(R5) ;SET I SPACE 4K RO .IFFT0 MOV #77406,KINDR0-KINAR0(R5) ;SET I SPACE 4K RW .IFTF% MOV R1,(R5)+ ;SET I SPACE APR OFFSETT% ADD #200,R1 ;ADVANCE I SPACE OFFSET  CMP R5,#KINAR7 ;DONE YET? BLOS 5$ ;IF LOS NO, MOV #177600,KISAR7 ;SET UP I/O PAGE MAPPING .IFTP% CLR (R5) ;CLEAR D SPACE APR0 OFFSET .ENDC .IF DF K$$DAS!M$$EXT!S$$LIB MOV #S3$BTS,SR3 ;SET UP SR3 .ENDC INC SR0 ;ENABLE MAPPING# .ENDC;DC; IN A D-SPACE SYSTEM SET UP SPECIAL WORDS IN D-SPACE THAT CAN'T BE4; LINKED AT TASK BUILD TIME.;D$INITM:: ;REFERENCE LABELW .IF DF P$$OOL6 MOV $PLPAR,R0 ;LOCATE PCB OF SECONDARY POOL PARTITION BNE 502$ ;IF NE, THERE IS ONED3 MOV #MESS23,R4 ;SPECIFIY MESSAGE TO TYPE ON CONSOLS- CALL $FATAL ;PREFACE WITH FATAL DESIGNATION;4 BREAK FATAL ;VMR HAS NOT SET UP SECONDARY POOL PAR502$: ;REF LABELM .ENDC .IF DF D$$PAR/ TST $DRAPR ;IS THE DIRECTIVE PARTITION FIXED? BNE 505$ ;IF NE YESS2 MOV #MESS0,R4 ;SPECIFY MESSAGE TO TYPE ON CONSOLE- CALL $FATAL ;PREFACE WITH FATAL DESIGNATION;3 BREAK FATAL ;DIRECTIVE PARTITION NOT FIXED IN MEM0505$: ;REFERENCE SYMBOL .ENDC;E0; INITIALIZE THE POOL MONITOR CONTROL STRUCTURE.;I .IF DF P$$CTL5 MOV $CRAVL,R0 ;GET POINTER TO SECOND FREE POOL BLOCK;! CLR R1 ;INITIALIZE SIZE COUNTER 1507$: ADD 2(R0),R1 ;ADD LENGTH OF FREE POOL BLOCK4 MOV (R0),R0 ;POINT TO NEXT FREE POOL BLOCK IN LIST BNE 507$ ;IF NE THERE IS ONE2 MOV R1,$PRISZ ;STORE IT AWAY FOR THE POOL MONITOR- CLR $POLST ;INITIALIZE EXEC/POOL TASK FLAGSI .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 ADDRESSR BR 6$ ;GO BACK FOR MOREN .ENDC;;(; HAS VMR SET UP THE PER CPU PARTITIONS?;D;7$: MOV @#46,$TEMP0 ;PUT CSR ADDR WHERE WE CAN GET IT LATERT> MOV @#50,$TEMP1 ;AND THE VIRTUAL UNIT/PARTITION FLAG ;DC410 ;**-1; .IF DF M$$PRO .IF GT M$$PRO-1* TST $CPPAR ;HAS VMR SET UP CPU PARTITION BNE 8$ ;IF NE YES$1 MOV #MESS2,R4 ;SPECIFY MESSAGE TO TYPE ON CONSOL- CALL $FATAL ;PREFACE WITH FATAL DESIGNATIONB( BREAK FATAL ;CPU PARTITIONS NOT SET UP8$: ;REFERENCE LABELR .ENDC;KH; IF THIS IS A I+D SPACE SYSTEM, WE MUST TRANSFER THE $SYSIZ INFORMATIONE; FROM THE AREA IN LOW MEMORY WHERE WE HAVE SAVED IT TO SYSCM, MAPPED@; IN DATA SPACE.;I .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)+ .IF DF E$$LBN ;DC430? MOV (R0)+,(R1)+ ; COPY THE HIGH ORDER LBN OF SYS IMAGE ;DC430  .ENDC ;DF,E$$LBN ;DC430 ;DC430 .ENDC .IFTI# MOV #TYPMSG,R5 ;SET RETURN ADDRESSS1 JMP $MAPCP ;SET UP MAPPING FOR KDSAR0 AND UBMAPR .IFF  .IF DF M$$EXT* MOV #$DIRXT,-(SP) ;SETUP EXIT FROM $SGFIN4 CALL $SGFIN ;CATCH MEMORY FAULTS AND SET CARRY BIT4 CLR @#CPUERR ;CLEAR CPU ERROR REGISTER IF IT EXISTS1 MOV #UBMPR,R0 ;POINT TO FIRST UNIBUS MAPPING REGM# BIC #HF.UBM,$HFMSK ;ASSUME NO UMRS  TST (R0) ;UMRS PRESENT?C BCS INTRO ;IF CS NO UMRS3 BIS #HF.UBM,$HFMSK ;INDICATE THAT UMRS ARE PRESENT  .IF DF K$$DAS* CLR (R0)+ ;CLEAR FIRST UMR REGISTER PAIR CLR (R0)+ ;$+ MOV $SCMOF,R3 ;PICKUP OFFSET TO DATA SPACE CLR R2 ;SET FOR CONVERSION0 ASHC #6,R2 ;CONVERT TO DOUBLE WORD BYTE OFFSET& MOV #4,R1 ;SET COUNT OF UMRS TO LOAD.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 ;...U SOB R1,11$ ;LOOP BR INTRO ; .IFFO% CLR R1 ;SET INITIAL ADDRESS TO ZEROC2 MOV #5.,R2 ;SET NUMBER OF REGISTER PAIRS TO LOAD.11$: MOV R1,(R0)+ ;LOAD LOW 16 BIT00t__DATADATADATADATAS OF ADDRESS) CLR (R0)+ ;CLEAR HIGH 6 BITS OF ADDRESSD ADD #20000,R1 ;ADVANCE 8K BYTES SOB R2,11$ ;LOOP BR INTRO ; .ENDC .ENDC .ENDC2TYPMSG: MOV #$DIRXT,-(SP) ;SET UP EXIT FROM $SGFIN4 CALL $SGFIN ;CATCH MEMORY FAULTS AND SET CARRY BIT4 CLR @#CPUERR ;CLEAR CPU ERROR REGISTER IF IT EXISTS+INTRO: MOV #$SYTYP,R0 ;POINT TO SYSTEM TYPE 3 MOV #SYSMG+4,R1 ;POINT INTO IDENTIFICATION MESSAGER# MOV (R0)+,(R1)+ ;MOVE INTO MESSAGET MOV (R0)+,(R1)+ ;...M MOV (R0)+,(R1)+ ;...6 MOV (R0)+,(R1)+ ;...( MOV (R0)+,(R1)+ ;...S MOV (R0)+,(R1)+ ;...0/ MOV #$VERSN,R0 ;POINT TO SYSTEM VERSION NUMBERN1 MOV #SYSVR,R1 ;POINT INTO IDENTIFICATION MESSAGEG# MOV (R0)+,(R1)+ ;MOVE INTO MESSAGE  MOV (R0)+,(R1)+ ;...C/ MOV #$SYSID,R0 ;POINT TO SYSTEM IDENTIFICATIONR/ MOV #SYSID,R1 ;POINT TO IDENTIFICATION MESSAGEM9 MOV (R0)+,(R1)+ ;MOVE SYSTEM IDENTIFICATION INTO MESSAGEN MOV (R0)+,(R1)+ ;. JSR R5,OPMSG ;TELL EVERYBODY WE'RE ON THE AIR .WORD SYSMG ;++ MOV #140000,R0 ;SET INITIAL MEMORY ADDRESS1- CLR R1 ;ZERO NUMBER OF 32W BLOCKS IN SYSTEM1 MOV #KISAR6,R2 ;POINT TO APR6+ MOV #10000,R3 ;ASSUME UPPER LIMIT OF 128KWO MOV R3,(R2) ;POINT TO 128KWG, MOV (R1),-(SP) ;SAVE CONTENTS OF LOCATION 0- MOV (R0),R5 ;SAVE CONTENTS OF LOCATION 128KT2 MOV SP,(R1) ;MOVE NON-ZERO VALUE INTO LOCATION 0* CLR (R0) ;ATTEMPT TO ACCESS WORD AT 128K. TST (R1) ;ADDRESS WRAP-AROUND AT LOCATION 0?+ BEQ 1$ ;IF EQ YES, THIS IS A 128KW SYSTEMT1 MOV #170000,R3 ;NO, UPPER LIMIT CAN BE UP TO 2MWI'1$: MOV R5,(R0) ;RESTORE LOCATION 128K # MOV (SP)+,(R1) ;RESTORE LOCATION 06$ CLR (R2) ;SET ZERO RELOCATION BIAS(2$: TST (R0) ;DOES THIS 1K BLOCK EXIST?# BCS 14$ ;IF CS NO, NO MEMORY LEFTV/ ADD #40,R1 ;UPDATE NUMBER OF 32W BLOCKS BY 1KT/ MOV R1,(R2) ;POINT TO NEXT 1K BLOCK OF MEMORYE# CMP (R2),R3 ;UPPER LIMIT REACHED?; BLO 2$ ;IF LO NO414$: MOV R1,$SYSIZ ;SET SIZE OF MEMORY IN 32W BLOCKS;"; INITIALIZE THE FEATURE MASK BITS;S"; HF.EIS - SYSTEM HAS EIS HARDWARE-; HF.FPP - SYSTEM HAS FLOATING POINT HARDWARE 4; HF.CIS - SYSTEM HAS CIS HARDWARE (DONE BY SAV.TSK)6; HF.SWR - SYSTEM HAS HARDWARE SWITCH REGISTER PRESENT;H4 BIS #HF.SWR,$HFMSK ; ASSUME SWITCH REGISTER PRESENT$ MOV @#4,-(SP) ; SAVE TRAP VECTOR 04> MOV #TRP10,@#4 ; POINT TRAP VECTOR 04 AT ROUTINE TO SET CARRY3 TST SWR ; TEST SWR - BUS TIMES OUT IF NOT PRESENT ? MOV (SP)+,@#4 ; RESTORE TRAP VECTOR 04, LEAVE CARRY UNAFFECTED " BCC 150$ ; READ OK, IT WAS THERE5 BIC #HF.SWR,$HFMSK ; NOT THERE, $SGFIN SET CARRY BIT / CLR $SWR ; BE NICE, INIT CLEAR SW (SYSCM) SWRA150$:A5 BIC #HF.CIS,$HFMSK ;SAV.TSK WILL FIGURE THIS ONE OUTE0 BIS #HF.EIS,$HFMSK ;EVERY M-PLUS SYSTEM HAS EIS0 MOV @#10,-(SP) ;SAVE ILLEGAL INSTRUCTION VECTOR MOV #TRP10,@#10 ;SET VECTOR- BIS #HF.FPP,$HFMSK ;ASSUME NO FLOATING POINTS CLC ;CLEAR CARRY + SETI ;ISSUE A FLOATING POINT INSTRUCTIONV BCS 15$ ;IF CS FPP NOT PRESENT% BIC #HF.FPP,$HFMSK ;SHOW FPP PRESENT;15$: ;REFERENCE LABEL .IF DF P$$3XX- CLR $HFMSK+2 ;ASSUME NOT BRIDGE, NOT PRO-3XXB MFPT ;GET CPU TYPES' BCS 152$ ;IF CS NOT A BRIDGE OR A PROS) CMPB #3,R0 ;IS THIS A F11 BASED SYSTEM?E% 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-3XXB4151$: TST @#177750 ;LOOK AT THE MAINTENANCE REGISTER- BCS 152$ ;IF CS NOT THERE, CAN'T BE PRO-3XXN& BNE 152$ ;IF NE ISN'T PRO-3XX EITHER; BIS #H2.PRO,$HFMSK+2 ;SET PRO BIT IN HARDWARE FEATURE MASKN BR 153$ ;BACK TO COMMON CODE%152$: TST @#176010 ;IS THIS A BRIDGE?- BCS 153$ ;IF CS NO- BIS #H2.BRG,$HFMSK+2 ;INDICATE BRIDGE SYSTEMS .ENDC ; DF P$$3XX8153$: MOV (SP)+,@#10 ;RESTORE ILLEGAL INSTRUCTION VECTOR .IF DF M$$PRO$ BIC #MP.STP,@$MPSWT ;CLEAR STOP BIT- MOV $CPBIT,$URMST ;SET ONLINE PROCESSOR MASKO, MOV $CPBIT,$IIMSK ;SET IIST CONNECTION MASK, MOV $CPBIT,$CKURM ;WE WILL HANDLE THE CLOCK' LOCK$ $EXECL,WAIT ;GRAB EXECUTIVE LOCK$ .ENDC;BE; SEARCH FOR SYSTEM DEVICE USING CSR ADDRESS AND PHYSICAL UNIT NUMBER E; AS KEYS. WHEN IT 00ۄibjbkb a a aIS FOUND, SET UNIT AND CONTROLLER ONLINE, AND SET+8; UP $SYSIZ VECTOR WITH THE CORRECT LOGICAL UNIT NUMBER.; 2 CLR .SY0+2 ;CLEAR FLAG THAT WE FOUND SYSTEM DISK1 MOV #$DEVHD,R5 ;GET ADDRESS OF FIRST DCB ADDRESST*20$: MOV (R5),R5 ;GET ADDRESS OF NEXT DCB# BNE 25$ ;IF NE YES -- KEEP TRYINGN ;DC4102 MOV $TEMP2,R4 ; GET POSSIBLE UCB ADDRESS ;DC410# BEQ 22$ ; NONE PRESENT ;DC410N ;DC410- MOV (R4),R5 ; GET THE DCB ADDRESS ;DC410I1 MOV U.SCB(R4),R3 ; AND THE SCB ADDRESS ;DC410 1 MOV $TEMP0,@S.KRB(R3) ; STUFF A NEW CSR ;DC410E: MOVB $TEMP3,-(SP) ; SAVE THE LOGICAL UNIT NUMBER ;DC410) CLR -(SP) ; AND AN EXTRA WORD ;DC410M" BR 45$ ; AND CONTINUE ;DC410 ;DC410A22$: MOV #MESS3,R4 ;SPECIFY MESSAGE TO BE TYPED ON CONSOL ;DC410P6 CALL $FATAL ;PREFACE WITH "FATAL ERROR -- " ;DC4102 MOV $SYSIZ+6,R0 ;PLACE DEVICE NAME IN R0 ;DC410. MOV $TEMP1,R1 ;POINT TO FLAGS WORD ;DC410) MOV $TEMP0,R2 ;PLACE CSR IN R2 ;DC410R ;**-8D .IF DF M$$PRO- MOVB $PROCN,R3 ;PLACE PROCESSOR NUMBER IN R31 .ENDC6 BREAK FATAL ;COULD NOT FIND LOAD DEVICE IN THIS SYS.)25$: MOV D.UCB(R5),R4 ;POINT TO FIRST UCB5& BIT #DV.PSE,U.CW1(R4) ;PSEUDO DEVICE? BNE 20$ ;IF NE YES8 MOVB D.UNIT(R5),-(SP) ;SET STARTING LOGICAL UNIT NUMBER; MOVB D.UNIT+1(R5),-(SP) ;CALCULATE NUMBER OF UCB'S TO SCANI SUB D.UNIT(R5),(SP) ; INCB (SP) ;0&40$: MOV U.SCB(R4),R3 ;GET SCB ADDRESS" MOV S.KRB(R3),R0 ;GET KRB ADDRESS2 BEQ 50$ ;IF EQ NO KRB ADDRESS -- NOT SYSTEM DEV./ CMP $SYSIZ+6,D.NAM(R5) ;DO DEVICE NAMES MATCH? BNE 50$ ;IF NE NOF: CMPB $SYSIZ+2,U.UNIT(R4) ;DO PHYSICAL UNIT NUMBERS MATCH? BNE 50$ ;IF NE NOI) CMP $TEMP0,(R0) ;DO CSR ADDRESSES MATCH?V .IF DF M$$PRO ;**-3 & BNE 43$ ;IF NE ADDRESSES DON'T MATCH/ BIT @$CPURM,K.URM(R0) ;IS IT ON THIS PROCESSORB$ BNE 45$ ;IF NE YES -- USE THIS ONE43$: ;DC40 .IFF ;**-1R$ BEQ 45$ ;IF EQ YES -- USE THIS ONE .ENDC .IF DF M$$ACD ;DC483 ;DC483E;F; THE S.KRB KRB IS NOT THE ONE WE WANT. IF THE DEVICE IS DUAL-ACCESS,F; THEN WE WILL SEE IF THE OTHER PORT IS THE ONE TO WHICH WE ARE REALLY ; CONNECTED.;E1 MOV #S2.MAD!S2.LDS,R1 ;GET STATUS BITS ;DC483OA BIC S.ST2(R3),R1 ;ARE THEY ALL SET? (IS THIS DUAL-ACCESS) ;DC483U- BEQ 435$ ; IF EQ, YES, DUAL ACCESS ;DC483$ ;DC4835 TST $TEMP2 ; ALREADY HAVE A TARGET DEFINED ;DC483 BNE 50$ ; YUP .. ;DC483H ;DC483 .IFTF ;DF,M$$ACD ;DC483 ;DC483. MOV R4,$TEMP2 ; SAVE ADDRESS OF UCB ;DC4834 MOVB 2(SP),$TEMP3 ; SAVE THE LOGICAL UNIT ;DC483 ;DC483 .IFT ;DF,M$$ACD ;DC483 ;DC483+ BR 50$ ; AND CONTINUE THE SCAN ;DC483;; ;**-4F; UNIT IS MULTI-ACCESS, AND WE CAN CONTROL THE VALUE OF S.KRB. CAN WE,; FIND THE PORT THRU WHICH WE ARE CONNECTED.;3435$: ;DC4832 MOV S.KTB(R3),R0 ;ASSUME THIS IS THE KRB ;**-16 CMP R0,S.KRB(R3) ;IS THIS THE ONE WE ALREADY CHECKED?# BNE 44$ ;IF NE NO -- USE THIS ONEM& MOV S.KTB+2(R3),R0 ;USE THE OTHER ONE*44$: CMP $TEMP0,(R0) ;IS THE CSR THE SAME?4 BEQ 445$ ;IF NE NO -- NO WAY OUT THIS TIME ;DC483 ;DC483 .IFTF ;DF,M$$ACD ;DC483 ;DC483  ;DC483550$: INCB 2(SP) ;UPDATE LOGICAL UNIT NUMBER ;DC483R: ADD D.UCBL(R5),R4 ;CALCULATE ADDRESS OF NEXT UCB ;DC483- DECB (SP) ;ANY MORE UCB'S TO SCAN? ;DC483S BNE 40$ ;IF NE YES ;DC483P, CMP (SP)+,(SP)+ ; CLEAN THE STACK ;DC483* BR 20$ ; AND CONTINUE THE LOOP ;DC483 ;DC483445$: ;DC483 .IF DF M$$PRO ;**-6R2 BIT @$CPURM,K.URM(R0) ;IS IT ATTACHED TO THIS CPU BEQ 50$ ;IF EQ NO  .ENDC .IFT ;DF,M$$ACD ;DC483  ;DC483 0 MOV R0,S.KRB(R3) ;SET NEW KRB POINTER ;DC483 ;DC483 .ENDC ;DF,M$$ACD ;DC483 ;**-4 ?45$: BISB #US.VV,U.STS(R4) ;SET VOLUME VALID BIT IN SYS DEV UCB < MOV R4,$TEMP2 ; SAVE UCB ADDRESS OF PHYSICAL DEVICE ;DC4109 TST $TEMP1 ;IS THI00t__DATADATADATADATAS A VIRTUAL DISK/OR PARTITION ;DC410 < BPL 49$ ;IF PL, NOPE, SKIP VIRTUAL/PART INFORMATION ;DC410 ;DC410D .IF DF V$$DSK ; BOOTABLE VIRTUAL DISK AND PARTITION SUPPORT ;DC410 ;DC410< CLR @#KISAR6 ; MAP APR6 TO LOW MEMORY FOR LBN PAIRS ;DC4101 MOV #140000,R2 ; POINT TO PHYSICAL ZERO ;DC410;7 BIS (R2),R2 ; AND MAP TO THE TOP OF THE PAIRS ;DC410.3 BIC #100000,$TEMP1 ; REMOVE VIRTUAL FLAG ;DC410M ;DC4107 MOVB $TEMP1+1,R1 ; GET THE SUB-UNIT SPECIFIER ;DC410S0 BEQ 47$ ; IF EQ, ONLY VIRTUAL DEVICES ;DC410;+ ;DC410K; This section will process a partitioned drive, and allow a disk ;DC410BL; which has been partitioned to boot normally. The only drives which ;DC410L; are supported are MSCP class device, and those device will reserve ;DC410K; the high byte of U.CW2 for the partition designation. All devices ;DC410.M; which can be partitioned will have S2.PRT set in the SCB, to insure ;DC410 B; that we are not going beyond the ability of the driver. ;DC410;- ;DC410> BIT #S2.PRT,S.ST2(R3) ; IS THIS DEVICE PARTITIONABLE? ;DC410) BNE 46$ ; YES, WE CAN PROCEED ;DC4101 ;DC410* MOV #MESS27,R4 ; ERROR MESSAGE ;DC410-455$: CALL $FATAL ; SHOW THE ERROR ;DC410a) BREAK FATAL ; AND WE ARE DONE ;DC410D ;DC410C46$: BIS #UU.PRT,U.UTIL(R4) ; SHOW DRIVE W/ ACTIVE PARTITION ;DC410h2 DECB R1 ; NORMALIZE THE PARTITION INDEX ;DC410; MOVB R1,U.PRM(R4) ; AND SET UP THE PARTITION INDEX ;DC410i( TSTB -1(R2) ; USING 32-BITS ;DC410* BEQ 465$ ; IF EQ, ONLY 24-BITS ;DC410. .IF DF E$$LBN ; 32-BIT LBN SUPPORT ;DC410B BIS #DV.32B,U.CW1(R4) ; SHOW WE HAVE A 32-BIT SIZED DEVICE ;DC410 .IFF ;DF,E$$LBN ;DC410A6463$: MOV #MESS29,R4 ; SET THE ERROR MESSAGE ;DC410* BR 455$ ; and report the error ;DC410 .ENDC ;DF,E$$LBN ;DC410:465$: MOV -(R2),U.CW2(R4) ; LOAD THE DEVICE SIZE ;DC4106 MOV -(R2),U.CW3(R4) ; AND THE LOW ORDER SIZE ;DC410A MOV -(R2),U.PART(R4) ; LOAD PARTITION HIGH ORDER BASE LBN ;DC410DF MOV -(R2),U.PART+2(R4) ; AND LOW ORDER BASE LBN (NOTE: 32BITS) ;DC410 ;DC410647$: MOV R2,R3 ;COPY LBN STACK POINTER TO R3 ;DC410/ MOV #.VF0,R5 ; POINT TO FIRST VF: UCB ;DC410A7 MOVB $VFDCB+D.UNIT+1,(SP) ; SAVE HIGHEST UNIT ;DC410, INC (SP) ; AND ACCOUNT FOR UNIT 0 ;DC410 ;DC4108475$: MOV -(R3),R0 ; GET HIGH ORDER DEVICE SIZE ;DC4102 MOV -(R3),R1 ; AND LOW ORDER DEVICE SIZE ;DC410) BIS R0,(R3) ; ARE WE THROUGH? ;DC410O- BEQ 49$ ; IF EQ, YES, CONTINUE ... ;DC410- ;DC410- TST (SP) ; ENOUGH UNITS AVIALABLE? ;DC410* BNE 48$ ; IF NE, YES, CONTINUE ;DC410 ;DC4107476$: MOV #MESS28,R4 ; DEVICE NESTING TOO DEEP ;DC4101 ;DC410 .IFF ;DF,V$$DSK ;DC410T ;DC410; MOV #MESS29,R4 ; NO VIRTUAL/PARTITION DISK SUPPORT ;DC410$ ;DC410 .IFTF ;DF,V$$DSK ;DC410 ;DC410* CALL $FATAL ; REPORT THE ERROR ;DC410# BREAK FATAL ; ALL DONE ;DC410 ;DC410 .IFT ;DF,V$$DSK ;DC410  ;DC410548$: MOV R0,U.CW2(R5) ; LOAD IN DEVICE SIZE ;DC410 - MOV R1,U.CW3(R5) ; BOTH HALVES ... ;DC4104 ;DC4102 MOV #FX.SIZ,R1 ; SIZE OF POOL NEEDED ... ;DC410 ;DC410- CLRB R0 ; CLEAR THE LOW ORDER PART ;DC410#1 BISB -1(R3),R0 ; IS EITHER PART 32-BITS ;DC4101/ BEQ 485$ ; IF EQ, NOPE, JUST 24-BITS ;DC4104 .IF DF E$$LBN ;DC410; BIS #DV.32B,U.CW1(R5) ; SHOW 32-BIT DEVICE SUPPORT ;DC410 - TST (R1)+ ; ADD AN ADDITIONAL WORD ;DC410  .IFF ;DF,E$$LBN ;DC4101 BR 463$ ; 32-BIT DEVICES NOT SUPPORTED ;DC4101 .IFTF ;DF,E$$LBN ;DC410$485$: ; REFERENCE LABEL ;DC410- CALL $ALOCB ; AND ALLOCATE IT ... ;DC4104* BCS 476$ ; CAN'T ALLOCATE POOL ;DC410 ;DC410 .IFT ;DF,E$$LBN ;DC410T5 BIT #DV.32B,U.CW1(R5) ; 32-BIT LOGIC IN USE ;DC410U# BEQ 487$ ; IF EQ, NOPE ;DC410 9 MOV -(R3),(R0)+ ; SAVE THE HIGH ORDER LBN SETUP ;DC410U$487$: ; REFERENCE LABEL ;DC41000ۄibjbkb a a a .IFTF ;DF,E$$LBN ;DC4102 MOV R0,U.FCBX(R5) ; INITIALIZE THE FCBX ;DC410, MOV R4,(R0)+ ; TARGET UCB ADDRESS ;DC410) CLR (R0)+ ; NO WINDOW PRESENT ;DC410D .IFT ;DF,E$$LBN ;DC410A4 BIT #DV.32B,U.CW1(R5) ; USING 32-BIT LOGIC ;DC4107 BEQ 488$ ; IF EQ, NOPE, LOAD IN THE HIGH BITS ;DC4101< CLR (R3)+ ; INSURE WE LOAD A ZERO FOR HIGH LBN/FLAG ;DC410#488$: .ENDC ;DF,E$$LBN ;DC410M2 MOV -(R3),(R0)+ ; HIGH ORDER TARGET LBN ;DC4104 MOV -(R3),(R0)+ ; AND LOW ORDER TARGET LBN ;DC410; MOV -(R3),(R0)+ ; NOW FOR THE FILE SEQUENCE NUMBER ;DC410X, MOV -(R3),(R0)+ ; AND FILE NUMBER ;DC410A MOVB U.UNIT(R5),2(SP) ; UPDATE SYSTEM DEVICE LOGICAL UNIT ;DC410$9 MOV #"VF,$SYSIZ+6 ; AND SHOW VF: AS SYSTEM DISK ;DC410O9 MOVB U.CTL(R4),U.CTL(R5) ; PROPOGATE NPR STATUS ;DC410T? BICB #UC.QUE,U.CTL(R5) ; BUT DON'T CALL BEFORE QUEUEING ;DC410 8 MOV R5,R4 ; COPY PREVIOUS VF TO LINK CORRECTLY ;DC4107 ADD $VFDCB+D.UCBL,R5 ; ADJUST TO THE NEXT UNIT ;DC410;. DEC (SP) ; DROP THE COUNT AVAILABLE ;DC410- BR 475$ ; AND PROCESS ANOTHER UNIT ;DC410X ;DC410 .ENDC ;DF,V$$DSK ;DC410 ;DC410:49$: MOV R4,.SY0+2 ;REDIRECT SYSTEM DEVICE (SY0:) ;DC4106 MOV R4,.LB0+2 ;REDIRECT SYSTEM DEVICE (LB0:) ;DC410 ;**-2  .IF NDF R$$PROT5 MOV R4,.SP0+2 ;REDIRECT SPOOL DEVICE (SP0:) ;DC410B ;**-1C .ENDC ; NDF R$$PROO7 TST (SP)+ ; CLEAN THE STACK (REMAINING UNITS) ;DC410LB MOVB (SP)+,$SYSIZ+2 ;SET LOGICAL UNIT NUMBER OF LOAD DEV. ;DC410: MOV $TEMP2,R4 ;RETREIVE THE UCB W/ THE CONTROLLER ;DC410; ;**-9;; SCAN CTB LIST TO FIND THE CORRECT CTB FOR THE LOAD DEVICE:;V<; A CTB MUST BE FOUND THAT POINTS TO THE CORRECT KRB OR THIS!; CODE WILL NOT EXECUTE PROPERLY. ;D*52$: MOV #$CTLST,R5 ;GET START OF CTB LIST54$: MOV (R5),R5 ;GET NEXT CTBC/ ;THE CTB CONTAINING OUR KRB M U S T EXISTF+ MOV L.DCB(R5),R2 ;GET DCB POINTER FROM CTBM< BITB #LS.CIN,L.STS(R5) ;IS IT A COMMON INTERRUPT CONTROLLER0 BNE 55$ ;IF NE YES -- SEARCH THE TABLE FOR DCB* CMP R2,U.DCB(R4) ;IS THIS THE CORRECT CTB BNE 54$ ;IF NE NOC/ BR 65$ ;YES -- CREATE VECTOR FOR THIS KRB/CTBC;V-; CONTROLLER IS A COMMON INTERRUPT CONTROLLERE;K.55$: TST (R2)+ ;SKIP COMMON INTERRUPT ADDRESS,60$: TST (R2) ;IS THIS THE END OF THE TABLE BEQ 54$ ;IF EQ YES1 CMP (R2)+,U.DCB(R4) ;DOES THE DCB MATCH OUR DCB?S BNE 60$ ;IF NE NOB;R*; CREATE VECTOR FOR THE SYSTEM LOAD DEVICE;TB65$: MOV $TEMP2,R3 ;GET UCB ADDRESS OF SYSTEM PHYSICAL DISK ;DC410+ MOV U.SCB(R3),R4 ;GET SCB ADDRESS ;**-1 * MOV S.KRB(R4),R4 ;GET KRB ADDRESS INTO R43 BIT #KS.SLO,K.STS(R4) ;IS THIS A SLOW CONTROLLER?V BEQ 70$ ;IF EQ NOO* MOV #PMODE,PS ;YES, ALLOW DISK INTERRUPTS570$: CALL ONLIN ;CREATE VECTOR AND PUT DEVICE ONLINES& MOV #PMODE+PR7,PS ;LOCKOUT INTERRUPTS ;DC430/ .IF DF,V$$DSK ; VIRTUAL DISK SUPPORT ;DC4306 ;DC4305 MOV .SY0+2,R5 ; GET SYSTEM DISK UCB ADDRESS ;DC4305 ;DC430;705$: CMP R5,$TEMP2 ; IS THIS THE "PHYSICAL DISK"? ;DC430)- BEQ 71$ ; IF EQ, YES, ALL DONE ... ;DC430R ;DC430/ CALL ONLINU ; BRING THE UNIT ONLINE ;DC430 7 BISB #US.VV,U.STS(R5) ; AND SHOW VOLUME VALID ;DC430A: MOV @U.FCBX(R5),R5 ; GET NEXT DEVICE IN THE LIST ;DC430, BR 705$ ; AND HANDLE ANOTHER UNIT ;DC430 ;DC430#71$: ; REFERENCE LABEL ;DC430D .ENDC ;DF,V$$DSK ;DC430;4; SET TERMINAL ONLINET;S .IF DF M$$PRO/ MOVB $PROC2,R0 ;GET PROCESSOR ID AS WORD INDEX 6 MOV $YLCTB(R0),R4 ;GET KRB ADDRESS OF CONSOL TERMINAL5 MOV K.OWN(R4),R5 ;GET UCB ADDRESS OF CONSOL TERMINAL  MOV R5,.CO0+2 ;REDIRECT CO: MOV R5,.CL0+2 ;REDIRECT CL: .IFFA" MOV #.TT0,R5 ;GET TT0 UCB ADDRESS) MOV #$YLA,R4 ;GET FIRST DL11 KRB ADDRESS  .ENDC* BIC #U2.LOG,U.CW2(R5) ;SHOW CO: LOGGED IN+ BIS #U2.PRV,U.CW2(R5) ;MAKE CO: PRIVILEGED;. MOV #$YLCTB-L.KRB,R5 ;GENERATE YL CTB ADDRESS;E); CREATE VECTOR AND PLACE TERMINAL ONLINEM; " MOV K.OWN(R4),R3 ;GET UCB ADDRESS CALL ONLINL00…t__DATADATADATADATA;0*; SET UP DUMP DEVICE KRB ADDRESS FOR CRASH;K .IF DF C$$CDA6 BIT #F4.LCD,$FMASK+6 ;LOADABLE CRASH DRIVER SUPPORT ?2 BNE 77$ ;IF EQ, NO - DRIVER IS RESIDENT ;DC430 ;DC430 .IF NE C$$CDA ;DC430 ;**-4R1 MOV #$DEVHD,R2 ;GET ADDRESS OF DEVICE TABLE HEAD:*72$: MOV (R2),R2 ;GET ADDRESS OF NEXT DCB BNE 73$ ;IF NO, GOT ONEL MOV #MESS25,R4 # CALL WARN ;SEND MESSAGE TO CONSOL / CLR -(SP) ;PICK UP TWO BYTE, NON-WORD ALIGNEDR$ MOVB $CRDEV,(SP) ;CRASH DEVICE TYPE( MOVB $CRDEV+1,1(SP) ;AND PLACE ON STACK2 MOV (SP)+,R0 ;AND THEN INTO R0 FOR PUBLIC VIEWING' MOV $CRSUN,R1 ;GET LOGICAL UNIT NUMBER$% CLR R2 ;CLEAR POTENTIAL CSR ADDRESS4 BREAK/ MOV R1,$CRSUN ;GET WHAT IS NOW CONSIDERED AS A  ;PHYSICAL UNIT NUMBER 4 MOV R2,$CRCSR ;GET THE CSR ADDRESS WHICH USER TYPED& MOV #3,R2 ; set up a count of digits- MOV #$CRUNT+3,R0 ; point to the storage areaN4725$: MOVB R1,-(R0) ; store the physical unit number+ BICB #^C<7>,(R0) ; isolate the unit numberC& BISB #'0,(R0) ; and create ASCII text' ASH #-3,R1 ; shift for the next digit * SOB R2,725$ ; loop through three digits. BR 77$ ;EXIT CRASH PROCESSINGOF73$: CMPB D.NAM(R2),$CRDEV ;IS THIS THE DCB FOR THE CRASH DUMP DEVICE?% BNE 72$ ;NO IF NE, LOOK AT NEXT DCBV7 CMPB D.NAM+1(R2),$CRDEV+1 ;MAYBE, CHECK NEXT CHARACTER,% BNE 72$ ;NO IF NE, LOOK AT NEXT DCBC4 MOV $CRSUN,R1 ;GET CRASH DEVICE LOGICAL UNIT NUMBER1 MOVB D.UNIT(R2),R0 ;GET LOWEST UNIT FOR THIS DCB<1 CMP R1,R0 ;IS CRASH DEVICE HANDLED BY THIS DCB?; BLO 72$ ;NO IF LOt= CMPB R1,D.UNIT+1(R2) ;MAYBE, CHECK HIGHEST UNIT FOR THIS DCBp BHI 72$ ;NO IF HI.+ SUB R0,R1 ;CALCULATE NUMBER OF PROPER UCBP" 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?, BLT 76$ ;YES IF LT ADD R0,R2 ;POINT TO NEXT UCB BR 74$ ;GO AGAIN676$: MOVB U.UNIT(R2),$CRSUN ;SAVE PHYSICAL UNIT NUMBER" MOV U.SCB(R2),R2 ;GET SCB ADDRESS' MOV S.KRB(R2),$CRKRB ;SAVE KRB ADDRESS  .ENDC ; NE C$$CDA ;DC403O77$: .ENDC ; DF C$$CDA;+; CREATE VECTOR FOR IIST KRB;F .IF DF M$$PRO MOVB $PROC2,R0B MOV $IICTB(R0),R40 BIT #KS.OFL,K.STS(R4) ;DO WE HAVE ONE OF THESE? BNE 80$ ;IF NE NO)0 MOV #$IICTB-L.KRB,R5 ;GENERATE IIST KRB ADDRESS CLR R3 ;SHOW NO UCB ADDRESS CALL ONLINA .ENDC;T3; SCAN PARITY MEMORY CSR REGISTERS AND CREATE TABLE$;U 80$: ;UNCONDITIONAL REFERENCE .IF DF P$$RTY0 MOV #$PARTB,R0 ;GET ADDRESS OF PARITY CSR TABLE" MOV R0,R1 ;COPY ADDRESS OF TABLE0 MOV #1,(R1)+ ;INSERT A ONE IN FIRST TABLE ENTRY) MOV #$CSRTB,R4 ;GET ADDRESS OF CSR TABLEM185$: MOVB (R4)+,R3 ;GET NUMBER OF CSR'S TO SET UPS BEQ 105$ ;IF EQ DONE CLR R2 ;INITIALIZE CSR ADDRESS% BISB (R4)+,R2 ;CALCULATE CSR ADDRESSA' SWAB R2 ;GET HIGH BYTE OF CSR ADDRESSC+ BISB (R4)+,R2 ;GET LOW BYTE OF CSR ADDRESSE90$: TST (R2) ;CSR PRESENT? BCS 95$ ;IF CS NO  MOV R2,(R1)+ ;SAVE CSR ADDRESS BR 100$ ;V/95$: MOV R0,(R1)+ ;POINT TO FIRST WORD OF TABLEV#100$: ADD #2,R2 ;POINT TO NEXT CSR#& SOB R3,90$ ;LOOP UNTIL NONE ARE LEFT0 BR 85$ ;CONTINUE THROUGH THE REST OF THE TABLE105$: ;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 VECTOR106$: ;REF LABEL; .ENDC, JSR R5,OPMSG ;OUTPUT INITIAL PROMPT MESSAGE .WORD PROMT ;$ .IF DF P$$3XX0 BIT #H2.PRO,$HFMSK+2 ;IS THIS A PRO-3XX SYSTEM?& BEQ 107$ ;IF EQ NO, SKIP CLOCK CODE2 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 TICKLE/ BICB #177,-4(R0) ;CLEAR ANY SELECTED FUNCTIONS;- BISB #52,-4(R0) ;SET DEFAULT DIVIDER CONTROLF+ MOV #64.,$TKPS ;SET TICK RATE FOR THE EXEC  CLR $CKLDC ;NO LOAD COUNT, CLR $CKCNT ;NO PLACE TO COUNTA+ MOV #$CKINT,@#230 ;INITIALIZE CLOCK VECTORT MOV #340,@#232 ; ...H6 MOV #106,-200ʅۄibjbkb a a a(R0) ;ENABLE INTERRUPTS, BINARY DATA, 24HR. MOV #57,@#173202 ;ENABLE INTERRUPT CONTROLLER? BIS #H2.ITF,$HFMSK+2 ;SET THE TIME BAD DUE TO BATTERY FAILURE?C% BR 130$ ;SKIP NORMAL Q/U CLOCK CODEE107$: ;REFERENCE LABELB .ENDC ; DF P$$3XX( MOV $CKCSR,R0 ;GET ADDRESS OF CLOCK CSR- TST (R0) ;IS THE GENERATED CLOCK AVAILABLE?S BCC 110$ ;IF CC YESE* MOV #172540,R0 ;GET ADDRESS OF KW11-P CSR MOV R0,$CKCSR ;SETUP FOR KW11-P MOV #172542,$CKCNT ;O2 MOV #K$$LDC,$CKLDC ;SET COUNT REGISTER LOAD COUNT( MOV #K$$TPS,$TKPS ;SET TICKS PER SECOND TST (R0) ;KW11-P?L BCC 110$ ;IF CC YES* 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 FREQUENCY110$:D .IF DF E$$NSI# MOV #$NS1,100 ;RESET KW11-L VECTORA .IFF ; DF E$$NSI0% MOV #$NONSI,100 ;RESET KW11-L VECTORD .ENDC ; E$$NSIR% MOV #$CKINT,104 ;SETUP KW11-P VECTOR# CMP #172540,R0 ;KW11-P? BEQ 120$ ;IF EQ YESR% MOV #$CKINT,100 ;SETUP KW11-L VECTOR; .IF DF E$$NSI# MOV #$NS1,104 ;RESET KW11-P VECTOR; .IFF ; DF E$$NSI7% MOV #$NONSI,104 ;RESET KW11-P VECTORV .ENDC ; E$$NSI + TST (R0) ;FREE RUNNING CLOCK WITH NO CSR?M BCC 120$ ;IF CC NO CLR $CKCSR ;CLEAR CSR ADDRESSY" CLR $CKCNT ;CLEAR COUNT REGISTER BR 130$ ; 2120$: MOV $CKCNT,R1 ;GET ADDRESS OF COUNT REGISTER, MOV $CKLDC,(R1) ;SETUP CLOCK COUNT REGISTER MOV #K$$IEN,(R0) ;START CLOCK7130$: MOV #PMODE+PR7,PS ;MAKE SURE PS IS SETUP PROPERLYM .IF NDF R$$PROU# CALL $CPNIT ;INITIALIZE PROCESSORV .IFF4 CALL $POWER .ENDC ; NDF R$$PROS .IF DF M$$PRO, MOVB $NCPU,R4 ;GET NUMBER OF CPUS IN SYSTEM ASL R4 ;FORM WORD INDEXW. ADD #$K6TAB,R4 ;AND POINT PAST LAST PROCESSOR0 MTPS #PR7 ;DISABLE INTERRUPTS SINCE LOWCR WILL ;BE UNMAPPED+ MOV KISAR0,$TEMP0 ;;;SAVE REAL CPU MAPPING +10$: MOV -(R4),KISAR0 ;;;MAP TO A PROCESSOR  .IFTF ; DF M$$PRO/ MOV #SYSMG,R0 ;SET ADDRESS OF BLOCK TO RELEASEU- MOV #$ICAVL-2,R3 ;POINT TO ICB POOL LISTHEAD% ADD (R3),R0 ;ROUND TO NEXT BOUNDARY BIC (R3),R0 ;P: MOV #&^C3,R1 ;SET LENGTH OF BLOCK TO RELEASE .IFF ; DF M$$PRO . CALLR $DEAC1 ;DEALLOCATE INITIALIZATION CODE .IFT ; DF M$$PROP" CALL $DEAC1 ;;;DEALLOCATE A COPY! CMP #$K6TAB,R4 ;;;FINISHED YET ? % BLO 10$ ;;;IF LO NO, GO TO NEXT CPUE- MOV $TEMP0,KISAR0 ;;;REMAP TO REAL PROCESSORP MTPS #0 ;;;ALLOW INTERRUPTS RETURN ;V .ENDC ; DF M$$PRO;O=; ROUTINE TO SET CARRY ON TRAPS THRU 10 FOR FPP DETERMINATION;D%TRP10: BIS #1,2(SP) ;SET CARRY IN PSW( RTI ;;V?; SUBROUTINE TO OUTPUT A MESSAGE TO THE SYSTEM CONSOLE TERMINAL ;M2OPMSG: MOV (R5)+,R1 ;GET ADDRESS OF OUTPUT MESSAGEOPMSG1: ;REFERENCE LABELC+10$: MOVB (R1)+,R0 ;GET NEXT BYTE TO OUTPUTB BEQ 30$ ;IF EQ DONE* MOVB R0,TPS+2 ;LOAD BYTE IN OUTPUT BUFFER20$: TSTB TPS ;PRINTER BUSY? $ BCS 30$ ;IF CS NO CONSOLE TERMINAL BPL 20$ ;IF PL YES BR 10$ ;GO AGAIN30$: RTS R5 ;;S?; **-WARN-WRITE "WARNING -- " ON CONSOL AND THEN PRINT MESSAGE.S;, ; INPUTS:C;Y; R4=MESSAGE ADDRESS.V; ; OUTPUTS:;U; NONE.S;E; ALL REGISTERS ARE PRESERVED.;M .ENABL LSB( .IF NDF R$$PROS4WARN: MOV R4,-(SP) ;SAVE MESSAGE SPECIFIED FOR LATER# MOV #MESS24,R4 ;PRINT "WARNING --"B BR 5$ ;ENTER FATAL ROUTINE .ENDC ; NDF R$$PROO; E; **-$FATAL-WRITE "FATAL ERROR -- " ON CONSOL AND THEN PRINT MESSAGE.M;LB; THIS ROUTINE WILL WRITE "FATAL ERROR -- " ON THE CONSOL AND THEN@; PRINT THE MESSAGE ON THE CONSOL. PRIOR TO THIS, IT WILL PRINT%; OUT A CR, TWO FILLS, AND THEN A LF.V; ; INPUTS::;U; R4=MESSAGE ADDRESS;I ; OUTPUTS:;R; NONE.;.; ALL REGISTERS PRESERVED.;'$FATAL::MOV R4,-(SP) ;SAVE R4 FOR LATERD& MOV #MESS22,R4 ;SET THE FATAL MESSAGE(5$: CALL WRITLN ;WRITE WITH CR/LF FIRST. MOV (SP)+,R4 ;RESTORE R4 WITH MESSAGE ADDRESS;L6; **-WRITE-WRITE A LINE TO CONSOL WITH NO CR/LF FIRST.;R ; INPUTS: ;T; R4=MESSAGE ADDRESS;E ; OUTPUTS:;N; NONE. ; ; ALL REGIST00҅t__DATADATADATADATAERS PRESERVED.;O .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$$PROT!10$: MOV R4,R1 ;SET UP FOR OPMSG JSR R5,OPMSG1 ;DO LINE OUTPUT MOV (SP)+,R1 ;RESTORE R1R MOV (SP)+,R0 ;RESTORE R0( RETURNR;E?; **-WRITLN-WRITE A LINE WITH CR, FILLS, AND A LINE FEED FIRST. ;H ; INPUTS:I;.; R4=ADDRESS OF MESSAGE.;S ; OUTPUTS:;E; NONE.T;; ALL REGISTERS ARE PRESERVED.;R;WRITLN: CALL $SGFIN ;IF NO TERMINAL, DON'T GO OFF DEEP ENDO MOV R0,-(SP) ;SAVE R0 FOR LATER MOV R1,-(SP) ;SAVE R1 FOR LATER JSR R5,OPMSG ;SEND MESSAGET .WORD FILL ;FILLS$" BR 10$ ;ENTER WRITE, IN PROGRESS .DSABL LSBR;S.; **-ONLIN-PUT DEVICE ONLINE AND CREATE VECTOR;V<; THIS ROUTINE WILL CREATE THE VECTORS FOR A DEVICE AND THEN;; PLACE THE DEVICE ONLINE. IT WILL CALL THE DRIVER AT BOTH.>; THE KRB STATUS CHANGE ENTRY AND THE UCB STATUS CHANGE ENTRY.; ; INPUTS:R;R; R3=UCB ADDRESS.T/; R4=KRB ADDRESS OF CONTROLLER NEEDING VECTORS.E#; R5=CTB ADDRESS FOR THE KRB IN R4.T; ; OUTPUTS:;S;; VECTORS HAVE BEEN CREATED WHEN CONTROL RETURNS TO CALLER.;$; THE DEVICE HAS BEEN PLACED ONLINE.;S .ENABL LSB ;DC403#ONLIN: ;REFERENCE LABEL ;**-1T .IF DF R$$CON MOV R3,-(SP) ;SAVE UCB ADDRESSD MOV R4,-(SP) ;SAVE KRB ADDRESSE MOV R5,-(SP) ;SAVE CTB ADDRESS  .IFTF ; DF R$$CON/ MOV #GETVC,-(SP) ;PREPARE FOR COORTOUTINE CALL*10$: CALL @(SP)+ ;GET NEXT VECTOR ADDRESS! BCS 30$ ;IF CS RETURN TO CALLERV BEQ 20$ ;IF EQ NO ERRORS .IFT ; DF R$$CON, MOV R0,-(SP) ;SAVE IMPORTANT VALUES IN CASE MOV R2,-(SP) ;USER WANTS TO MOV R4,-(SP) ;CONTINUE FROM MOV R5,-(SP) ;A WARNING MESSAGE4 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 ONE6 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 MESSAGEM12$: SUB #2,R1 MOV R1,R2 SUB #4,R1 ;IS IT FATAL?M BPL 15$ ;IF PL NO CALL $FATAL BR 17$ ;RENTER FLOWE 15$: CALL WARN ;WARNING MESSAGE17$: MOV #GETERR,R4 ;B# ADD R2,R4 ;POINT TO ERROR ADDRESSV! MOV (R4),R4 ;GET ACTUAL MESSAGE CALL WRITE'( MOV (SP)+,R5 ;RESTORE SAVED VALUES FROM, MOV (SP)+,R4 ;BEFORE ERROR MESSAGE PRINTOUT MOV (SP)+,R2T MOV (SP)+,R0P! BREAK ;AN ERROR CODE IS IN R1.( .IFF ; DF R$$CONM HALT ;HALT ON ERROR .IFTF ; DF R$$CON;FD; CHECK THE ERROR CODE IN R1 AND SEE WHAT IT MEANS BY CONSULTING THEE; TABLE OF $GETVC ERROR CODES BELOW. IF THE ERROR IS A WARNING, THENCD; YOU MAY PROCEED OR CONTINUE IF DESIRED. IF THE ERROR IS FATAL, DOE; NOT ATTEMPT TO PROCEED FURTHER. TAKE REMEDIAL ACTION AND TRY AGAIN.M;(+20$: MOV R2,(R0)+ ;PLUG PC WORD INTO MEMORYR CLR (R0) ;SET UP FOR PS WORD6 BISB K.CON(R4),(R0) ;PUT CONTROLLER NUMBER IN PS WORD ASR (R0) ;MAKE IT REAL NUMBERM2 BIS #PR7,(R0) ;AND PRIORITY 7 INTERRUPT INITIALLY& TST -(R0) ;BACK UP POINTER FOR GTVEC BR 10$ ;GET NEXT VECTORG30$: ;REFERENCE LABEL .IFT ; DF R$$CONT, MOV (SP)+,$SCCTB ;SET CTB FOR STATUS CHANGE8 MOV (SP),$SCDEV ;SET UP KRB ARGUMENT FOR KRB STATUS CHG1 MOVB #100,$SCOFL ;SHOW SPECIAL ONLINE TRANSITIOND1 CALL $KRBSC ;CALL DRIVER AT STATUS CHANGE ENTRY ;MI; ALL DEVICES THAT THIS ROUTINE DEALS WITH (I.E. DISKS, CONSOL TERMINALS,RF; AND IIST) MUST NOT MAKE USE OF THE DELAYED RETURN FEATURE OF $KRBSC.G; IF, HOWEVER, THE KS.SLO BIT IS SET IN K.STS WE WILL WAIT (UP TO ABOUTH; 45 SECONDS) FOR THE DRIVER TO HANDLE THE SLOW CONTROLLER ONLINE TRANS-G; ITION. IT IS THE DRIVERS RESPONSIBILITY TO HANDLE INTERUPTS FROM THEPE; CONTROLLER ($FORK MAY NOT BE CALLED) AND TO RESTORE $SCERR WHEN THEEG; ONLINE IS COMPLETE. IF THE FOLLOWING "BREAK" IS ENCOUNTERED, THEN IT H; IS A SOFTWARE DESIGN PROBLEM, OR A BROKEN CONTROLLER IF KS.S00څۄibjbkb a a aLO IS SET,!; AND AN SPR SHOULD BE SUBMITTED.E;L MOV (SP)+,R3 ;GET KRB ADDRESS3 BIT #KS.SLO,K.STS(R3) ;IS THIS A SLOW CONTROLLER?A BNE 31$ ;IF NE YES' TST $SCDEV ;DID THE DRIVER FINISH UP?O BEQ 40$ ;IF EQ YES BR 35$ ;NO, FATAL 531$: MOV #2000,R4 ;GET VALUE FOR 45 SECOND OUTER LOOPP032$: MOV #-1,R2 ;GET COUNT FOR INNER DELAY LOOP933$: TSTB $SCERR ;IS THE CONTROLLER STILL COMING ONLINE?W" BNE 40$ ;IF NE NO, IT'S FINISHED SOB R2,33$ ;INNER LOOP DELAY SOB R4,32$ ;OUTER LOOP DELAY035$: MOV #MESS12,R4 ;SPECIFY MESSAGE FOR CONSOLE# CALL $FATAL ;FATAL ERROR PRINTOUTB( MOV #MESS13,R4 ;SPECIFY ANOTHER MESSAGE' CALL WRITE ;WRITE WITHOUT CR/LF FIRSTE MOV #MESS15,R4R% CALL WRITLN ;WRITE WITH CR/LF FIRST BREAK FATAL640$: MOV $SCCTB,R4 ;GET CTB ADDRESS FROM PREVIOUS CALL* MOV R4,$TEMP1 ;SAVE CTB ADDRESS FOR LATER( MOV L.NAM(R4),UU ;PLACE NAME IN MESSAGE/ MOV #UU+2,R2 ;SET INITIAL VALUE FOR CHARACTERS'% MOVB K.CON(R3),R5 ;GET CONTROLLER IDL ASR R5 ;MAKE IT REAL IDP CLR R4 ;SET UP FOR DIVIDES& DIV #22.,R4 ;TWO POSSIBLE CHARACTERS# BEQ 45$ ;IF EQ NO FIRST CHARACTER34 MOVB CTLET(R4),(R2)+ ;PLACE FIRST LETTER IN MESSAGE945$: MOVB CTLET(R5),(R2)+ ;PLACE SECOND LETTER IN MESSAGET4 MOV R2,$TEMP0 ;SAVE POINTER INTO CONTROLLER MESSAGE CLRB (R2)+ ;SHOW END OF STRING: BIT #KS.OFL,K.STS(R3) ;DID ONLINE FUNCTION WORK PROPERLY? BEQ 50$ ;IF EQ YES;MB; IF THE FOLLOWING BREAK IS ENCOUNTERED, THEN A DEVICE DIDN'T COMEF; ONLINE PROPERLY. POSSIBLE CAUSES INCLUDE: THE CSR ADDRESS SPECIFIEDI; IN THE KRB IS INCORRECT; THE DRIVER FOUND SOME CONDITION THAT PROHIBITSR"; THE DEVICE FROM BEING USED; ETC.;R% MOVB $SCERR,R1 ;PUT ERROR CODE IN R1, MOV #MESS16,R4 ;SPECIFY MESSAGE, CALL $FATAL ;PRINT FATAL MESSAGE ON CONSOL MOV #MESS21,R4 ;ANOTHER MESSAGE) CALL WRITE ;WRITE WITHOUT A CR/LF FIRSTN MOV #MESS17,R4 ;ANOTHER MESSAGE5 CALL WRITLN ;WRITE WITH A CR/LF AT FRONT OF MESSAGEO BREAK FATAL ;DC410 .IFTF ;DF,R$$CON ;DC410ONLINU: ;DC410A .IFT ;DF,R$$CON ;DC410I ;DC410/ .IF DF,V$$DSK ; VIRTUAL DISK SUPPORT ;DC410 3 MOV R5,-(SP) ; SAVE UCB ADDRESS FOR BELOW ;DC410P' CLR R3 ; AND NO KRB PRESENT ;DC410E .ENDC ;DF,V$$DSK ;DC410250$: MOV (SP),$SCDEV ;SET UP FOR UCB STATUS CHANGE1 BNE 55$ ;IF UCB ADDRESS EXISTS -- PUT IT ONLINE TST (SP)+ ;CLEAN STACK* RETURN ;GO HOME EARLY -- NO UCB ADDRESS#55$: MOV R3,-(SP) ;SAVE KRB ADDRESS 1 MOVB #100,$SCOFL ;SHOW SPECIAL ONLINE TRANSITIONU, CALL $UCBSC ;CALL DRIVER FOR STATUS CHANGE;@; AS ABOVE, IF THE DRIVER DOESN'T RETURN IMMEDIATELY, THEN IT ISC; A SOFTWARE DESIGN ERROR. SUBMIT AN SPR IF YOU ENCOUNTER THE NEXTD; BREAK INSTRUCTION BELOW.;N MOV (SP)+,R3 ;GET KRB ADDRESS3 BEQ 555$ ; IF EQ, NO KRB, SHOULD BE DONE ;DC4105< BIT #KS.SLO,K.STS(R3) ;IS THIS A SLOW CONTROLLER? ;DC410 BNE 56$ ;IF NE YES ;DC410Y5555$: TST $SCDEV ;DID THE DRIVER FINISH UP? ;DC410  BEQ 60$ ;IF EQ YES ;**-3 BR 59$ ;NO, FATAL556$: MOV #2000,R4 ;GET VALUE FOR 45 SECOND OUTER LOOPS057$: MOV #-1,R2 ;GET COUNT FOR INNER DELAY LOOP958$: TSTB $SCERR ;IS THE CONTROLLER STILL COMING ONLINE?U" BNE 60$ ;IF NE NO, IT'S FINISHED SOB R2,58$ ;INNER LOOP DELAY SOB R4,57$ ;OUTER LOOP DELAY859$: MOV #MESS12,R4 ;SPECIFY MESSAGE TO PRINT ON CONSOLE, CALL $FATAL ;PRINT FATAL MESSAGE ON CONSOL2 MOV #MESS14,R4 ;SPECIFY ANOTHER MESSAGE ON CONSOL% CALL WRITE ;WRITE MESSAGE TO CONSOLB MOV #MESS15,R4 ;ANOTHER MESSAGE CALL WRITLN ;WITH CR/LF FIRSTR BREAK FATAL"60$: MOV (SP)+,R5 ;GET UCB ADDRESS. BITB #US.OFL,U.ST2(R5) ;WHAT IS ONLINE STATUS BEQ 70$ ;IF EQ DEVICE ONLINE;N?; THE DEVICE COULD NOT BE PUT ONLINE. THE ONLY REASON FOR THISE<; IS THAT THE DRIVER REJECTED THE ONLINE REQUEST. THE ERROR<; CODE FROM $SCERR IS IN R1. CORRECT THE CONDITION, AND TRY; AGAIN.;E4 MOVB $SCERR,R1 ;PUT ERROR CODE WHERE XDT CAN SEE IT# MOV $TEMP1,R3 ;RECOVER CTB ADDRESSO6 BITB #LS.MDC,L.STS(R3) ;IS IT MULTIDRIVER CONTROLLER?2 BEQ 63$ ;I00t__DATADATADATADATAF EQ NO -- LEAVE CONTROLLER NAME AS IS" MOV U.DCB(R5),R3 ;GET DCB ADDRESS. MOV D.NAM(R3),UU ;PLACE DCB NAME INTO MESSAGE363$: MOV $TEMP0,R3 ;SET POINTER TO CHARACTER STRING - MOVB U.UNIT(R5),R4 ;GET PHYSICAL UNIT NUMBERH BIC #177707,R4  BEQ 65$ ;IF EQ NO DIGIT THERE ) ASR R4 ;PLACE DIGIT IN LOW PART OF BYTED ASR R4D ASR R4G' ADD #'0,R4 ;MAKE INTO ASCII CHARACTERD) MOVB R4,(R3)+ ;PLACE CHARACTER IN SIMPLEO165$: MOVB U.UNIT(R5),R4 ;GET PHYSICAL UNIT NUMBERL BIC #177770,R4 ;GET MASK6 ADD #'0,R4 ;MAKE INTO NUMBER! MOVB R4,(R3)+ ;PLACE INTO STRINGT MOVB #':,(R3)+ ;ADD COLON CLRB (R3)+ ;TERMINATE STRING4 MOV #MESS20,R4 ;SPECIFY MESSAGE FOR CONSOL PRINTOUT CALL $FATAL ;PRINT FATAL ERROR6 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/LFI MOV #MESS17,R4 ;ANOTHER MESSAGE CALL WRITLN ;WRITE WITH CR/LF5 BREAK FATAL .ENDC ; DF R$$CON 70$: RETURNC ;DC410 .DSABL LSB ;DC410T; ;**-1; N O T E W E L L :;>; THE FOLLOWING CODE HAS BEEN LIFTED DIRECTLY FROM THE MODULE=; SAVVEC.MAC. THE ONLY MODIFICATION MADE TO IT IS TO REMOVE @; THE GLOBAL SYMBOLS. IT SHOULD NOT BE FURTHER MODIFIED, SINCE?; IT IS IMPORTANT TO KEEP THIS CODE "EXACTLY" LIKE THE CODE INA?; SAVVEC.MAC. FURTHERMORE, ANY MODIFICATIONS TO SAVVEC SHOULDM0; BE REFLECTED IN MODIFICATIONS TO THIS MODULE.;L.; ORIGINALLY LIFTED FROM SAVVEC.MAC 1-MAR-78.; :; MOST RECENTLY UPDATED TO REFLECT CHANGES TO SAVVEC.MAC:;E; K. E. KINNEAR 23-MAR-78;I?; D. CARROLL 18-OCT-1995 - CONDITIONALIZED MP SUPPORT ;DC403 ; ;DC403O;E; SPECIAL EQUATED SYMBOLSE;O&; $GETVC ERROR CODES (MUST BE NONZERO);F'GT$E1==1*2 ;DRIVER NOT LOADED (FATAL) 8GT$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)S1GT$E5==5*2 ;UNIBUS RUN NOT ACCESSIBLE (WARNING)1;7 ; LOCAL DATA;E?NONSI: .WORD $NONSI ;ADDRESSES OF EXECUTIVE NONSENSE INTERRUPTENS0: .WORD $NS0 ; ENTRY POINTS8 .WORD $NS1 ; .WORD $NS2 ; .WORD $NS3 ; .WORD $NS4 ; .WORD $NS5 ; .WORD $NS6 ;NS7: .WORD $NS7 ;;+&; **-GETVC-GET THE NEXT VECTOR ADDRESS; B; THE INSTRUCTIONS IN THIS ROUTINE CANNOT BE MAPPED BY KISAR6 (THEC; VIRTUAL ADDRESSES MUST NOT BE BETWEEN 140000 AND 160000), BECAUSE42; THIS ROUTINE REMAPS (AND LATER RESTORES) KISAR6.;NH;***********************************************************************G; CODE IN THIS MODULE IS DUPLICATED IN THE EXECUTIVE MODULE INITL. ANYI-; BUG FIXES HERE MUST BE REPLICATED THERE!!!!SI;************************************************************************; ; INPUTS:G;TC; THIS ROUTINE IS CALLED AT SYSTEM STATE TO PROVIDE AN INTERLOCK ; ON THE VECTOR MANIPULATION.;D; WHEN CALLED INITIALLY,4; R4 = ADDRESS OF KRBS; R5 = ADDRESS OF CTBP; (SP) = RETURN ADDRESSS;.%; WHEN CALLED BACK AS A COROUTINE,*3; IF R0<>0, VECTOR ADDRESS PRESERVED FROM LAST CALLS9; IF R0=0, AFTER CLEANING UP THE STACK, $GETVC EXITS WITH ; C=1 ; R1=0R4; R0, R2, R3, R4, R5 PRESERVED AND NOT EXAMINED.; R4 = ADDRESS OF KRB PRESERVED FROM LAST CALL.; R5 = ADDRESS OF CTB PRESERVED FROM LAST CALL; (SP) = RETURN ADDRESS ;E ; OUTPUTS:; A; IF C=0, $GETVC MAY BE CALLED AGAIN AS A COROUTINE (THERE MAYA0; BE ANOTHER VECTOR ADDRESS TO BE RETURNED)4; R0 = VECTOR ADDRESS (BIASED TO MAP THROUGH KISAR6)$; IF R1=0, R0 AND R2 CAN BE USED AND ; Z=10; IF R1<>0, ERROR CODE (GT$E3, GT$E4, GT$E5) AND ; Z=0; R2 = PC WORD FOR VECTORR; R3 = DESTROYED; R4 = PRESERVED; R5 = PRESERVED; (SP) = TEMPORARY STORAGE; 2(SP) = TEMPORARY STORAGE5,; 4(SP) = CONTENTS OF KISAR6 AT INITIAL CALL; 6(SP) = TEMPORARY STORAGE (; KISAR6 = MAPS R0 TO THE VECTOR ADDRESS;E9; IF C=1, $GETVC CANNOT BE CALLED AGAIN AS A COROUTINER=; R0 = MAY BE A VECTOR ADDRESS (BIASED TO MAP THROUGH KISAR6)T; IF R1=0, NO MORE VECTORS AND ; 00ۄibjbkb a a a Z=1); IF R1<>0, ERROR CODE (GT$E1, GT$E2) ANDE ; Z=0; R2 = DESTROYED; R3 = DESTROYED; R4 = PRESERVED; R5 = PRESERVEDB; KISAR6 = RESTORED TO THE MAPPING AT THE TIME OF THE INITIAL CALL;-GETVC: ;;ENTRY POINT(# MOV (SP),R3 ;;SAVE RETURN ADDRESSA6 MOV L.ICB(R5),(SP) ;;SAVE ADDRESS OF FIRST ICB (OR 0)3 MOV @#KISAR6,-(SP) ;;RESERVE OTHER STACK LOCATIONS  CLR -(SP) ;;' CLR -(SP) ;; (ASSUME RESIDENT DRIVER)E& CLR R0 ;;FORM FIRST VECTOR ADDRESS/4 BISB K.VCT(R4),R0 ;;A& BEQ 42$ ;;IF EQ THERE ARE NO VECTORS$ ASL R0 ;;FORM FIRST VECTOR ADDRESS ASL R0 ;; 5 MOV L.DCB(R5),R1 ;;GET POINTER TO A COMMON INTERRUPTI* ;; ROUTINE ADDRESS OR ADDRESS OF A DCB4 MOV (R1),R2 ;;GET COMMON INTERRUPT ROUTINE ADDRESS< BITB #LS.CIN,L.STS(R5) ;;IS THIS A COMMON INTERRUPT DEVICE? BNE 60$ ;;IF NE YESO8 MOV D.DSP(R1),R2 ;;GET ADDRESS OF DRIVER DISPATCH TABLE& BEQ 98$ ;;IF EQ DRIVER IS NOT LOADED;S?; THE FOLLOWING CODE ASSUMES THAT THIS SYSTEM SUPPORTS LOADABLEC<; DRIVERS (I.E., THAT D.PCB EXISTS). ALL M+ SYSTEMS SUPPORT; LOADABLE DRIVERS.A;E0 MOV D.PCB(R1),R1 ;;DRIVER RESIDENT OR LOADABLE? BEQ 10$ ;;IF EQ RESIDENT) MOV P.REL(R1),(SP) ;;SAVE MAPPING TO DDTV MOV (SP),@#KISAR6 ;;MAP TO DDTR+ ADD #20000,R2 ;;BIAS POINTER TO USE KISAR6T410$: ADD #D.VINT,R2 ;;POINT AT FIRST CONTROLLER NAME;VE; SEARCH THE DDT FOR THE VECTOR AND INTERRUPT ENTRY POINT INFORMATION 7; THAT APPLIES TO THIS CONTROLLER. THE DDT LOOKS LIKE:A;HA; $XXTBL+D.VINT: CONTROLLER INFORMATION (NONZERO WORDS TERMINATED ; BY A ZERO WORD); .WORD $XYCTB;A; CONTROLLER INFORMATION; .WORD $XZCTB ; .Q ; . ; .V;R; $XXTBE:: .WORD 0;I+ CLR R1 ;;INITIALIZE OFFSET TO NEXT VECTORA$20$: TST (R2) ;;REACHED END OF DDT? BEQ 150$ ;;IF EQ YES5 CMP L.NAM(R5),(R2) ;;FOUND INFO FOR THIS CONTROLLER?D BEQ 40$ ;;IF EQ YESN630$: TST (R2)+ ;;PASSED OVER ALL INFO FOR CONTROLLER? BNE 30$ ;;IF NE NO TST (R2)+ ;;SKIP CTB POINTER BR 20$ ;; ;M1; THE INFORMATION FOR EACH CONTROLLER LOOKS LIKE:R;); .ASCII /XY/ ;CONTROLLER (CTB) MNEMONICA8; .WORD INTERRUPT ENTRY POINT ADDRESS (NONZERO AND EVEN)(; .WORD INTERRUPT ENTRY POINT ADDRESS OR; VECTOR OFFSET (ODD) ; .C ; .T ; .R ; .WORD 0O;D=; THERE MAY BE ZERO OR MORE WORDS OF INFORMATION BETWEEN THER3; CONTROLLER MNEMONIC AND THE TERMINATING ZERO WORD(;+440$: TST (R2)+ ;;POINT TO NEXT CONTROLLER INFO WORD, TST (R2) ;;REACHED END OF CONTROLLER INFO?42$: BEQ 120$ ;;IF EQ YES6 BIT #1,(R2) ;;IS ENTRY AN INTERRUPT ENTRY POINT ADDR BEQ 50$ ;;IF EQ YESO, MOV (R2),-(SP) ;;FORM VECTOR ADDRESS OFFSET DEC (SP) ;;). CLR R1 ;;CLEAR DEFAULT VECTOR ADDRESS OFFSET' ADD (SP)+,R0 ;;FORM NEW VECTOR ADDRESST BR 40$ ;;$50$: MOV R2,2(SP) ;;SAVE DDT POINTER& ADD R1,R0 ;;FORM NEXT VECTOR ADDRESS5 MOV (R2),R2 ;;GET DRIVER INTERRUPT ENTRY POINT ADDR' TST (SP) ;;IS THIS A RESIDENT DRIVER?T BEQ 60$ ;;IF EQ YES( MOV 6(SP),R2 ;;GET ICB POINTERI52$: MOV R2,R1 ;;COPY ITQ ASL R2 ;;FORM VIRTUAL ADDRESS - MOV (R2)+,6(SP) ;;ASSUME NOT A MP/I&D SYSTEME' ;; (ASSUME CURRENT MAPPING IS OKAY)  .IF DF M$$PRO ;DC403/ TSTB $NCPU ;;IS THIS A MULTIPROCESSOR SYSTEM?P BEQ 60$ ;;IF EQ NO4 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 LINKT ASR R1 ;;H ASR R1 ;; ASR R1 ;;Q1 MOV $K6TAB(R1),@#KISAR6 ;;MAP TO ICB'S CPU POOLI, BIC #160000,R2 ;;CLEAR CPU NUMBER BITS3 BIS #140000,R2 ;;BIAS ICB POINTER TO USE APR6I; BIT $URMTB(R1),K.URM(R4) ;;THIS ICB POINTER FOR THE CPU TO ) ;; WHICH THE DEVICE IS CURRENTLYS ;; CONNECTED? BNE 54$ ;;IF NE YESO$ MOV -(R2),R2 ;;GET NEXT ICB POINTER BR 52$ ;;E/54$: MOV -(R2),6(SP) ;;SAVE POINTER TO NEXT ICBI* ADD #40002,R2 ;;REMOVE BIAS BITS AND FORM ;; ADDRESS OF ICB'S JSR; .ENDC ;DF,M$$PRO ;DC403;$*; VECTOR ADDRESS TOO HIGH FOR THIS SYSTEM?;B-60$: CMP $VECTR,R000t__DATADATADATADATA ;;VECTOR ADDRESS TOO HIGH?# BLO 160$ ;;IF LO YES ;DC403 .IF DF M$$PRO ;DC403 ; ;**-1@; MAP TO THE CORRECT CPU VECTOR AREA IF THIS IS A MULTIPROCESSOR; CONFIGURATION?;B. MOVB $NCPU,R1 ;;GET NUMBER OF CPU'S IN SYSTEM. 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 YES6 BIT K.URM(R4),$URMTB(R1) ;;IS CONTROLLER ON THIS CPU? BEQ 70$ ;;IF EQ NO8 MOV $K6TAB(R1),@#KISAR6 ;;MAP TO VECTOR CONTEXT FOR CPU3 BIS #140000,R0 ;;BIAS VECTOR ADDRESS TO USE KISAR6  .ENDC ;DF,M$$PRO ;DC403 ; ;**-1A; SEE IF VECTOR IS IN USE (DOES NOT POINT TO A NONSENSE INTERRUPT; ENTRY POINT);G/80$: MOV #NONSI,R1 ;;POINT TO TABLE OF NONSENSES ;; INTERRUPT ENTRY POINTSR'90$: CMP (R1)+,(R0) ;;IS VECTOR IN USE?, BEQ 100$ ;;IF EQ NOO$ CMP #NS7,R1 ;;REACHED END OF TABLE BHIS 90$ ;;IF HIS NO;N; VECTOR IN USE (WARNING)7;  MOV #GT$E4,R1 ;;GET ERROR CODE6 BR 167$ ;;WARNINGE;R; DRIVER NOT LOADED (FATAL)V;O#98$: MOV #GT$E1,R1 ;;GET ERROR CODE$ BR 130$ ;;;B; R2 CONTAINS WHAT SHOULD BE PUT INTO THE FIRST WORD OF THE VECTORD; (PROGRAM COUNTER) IF THE CALLER IS INITIALIZING THE VECTOR. R2 IS!; ONE OF THE FOLLOWING ADDRESSES:T;T5; 1) DRIVER INTERRUPT ENTRY POINT (RESIDENT DRIVER)B@; 2) SECOND WORD OF AN INTERRUPT CONTROL BLOCK (LOADED DRIVER)1; 3) ENTRY POINT OF A COMMON INTERRUPT ROUTINE;,100$: MOV R3,-(SP) ;;POSITION RETURN ADDRESS) CLR R1 ;;SHOW GOOD VECTOR ADDRESS (C=0)V 110$: CALL @(SP)+ ;;CALL CALLER;C; AT THIS POINT:;; (SP) = RETURN ADDRESSO; IF 2(SP)=0, RESIDENT DRIVERO1; IF 2(SP)<>0, MAPPING TO DDT FOR LOADABLE DRIVERI.; 4(SP) = ADDRESS OF LAST WORD EXAMINED IN DDT$; 6(SP) = INITIAL CONTENTS OF KISAR6%; 10(SP) = ADDRESS OF NEXT ICB (OR 0)B; # MOV (SP)+,R3 ;;SAVE RETURN ADDRESSL) TST R0 ;;CALLER WANT AN IMMEDIATE EXIT?  BEQ 120$ ;;IF EQ YES8 BITB #LS.CIN,L.STS(R5) ;;A COMMON INTERRUPT CONTROLLER?) BNE 120$ ;;IF NE YES -- ONLY ONE VECTORV' MOV #4,R1 ;;GET DEFAULT VECTOR OFFSET& MOV 2(SP),R2 ;;RESTORE POINTER TO DDT/ MOV (SP),@#KISAR6 ;;IF NECESSARY, REMAP TO DDT)$ BIC #160000,R0 ;;CLEAR MAPPING BITS BR 40$ ;; +120$: CLR R1 ;;SHOW ALL VECTORS WERE FOUND +130$: CMP (SP)+,(SP)+ ;;CLEAR OFF STACK ANDE- MOV (SP)+,@#KISAR6 ;;RESTORE INITIAL MAPPINGA# MOV R1,(SP)+ ;; SET OR CLEAR Z-BIT ( SEC ;;SHOW CANNOT CALL AS A COROUTINE JMP (R3) ;;RETURN,;(,; DRIVER DOES NOT SUPPORT CONTROLLER (FATAL);;$150$: MOV #GT$E2,R1 ;;GET ERROR CODE BR 130$ ;;;E; VECTOR TOO HIGH (WARNING);;T$160$: MOV #GT$E3,R1 ;;GET ERROR CODE,167$: MOV R3,-(SP) ;;POSITION RETURN ADDRESS% CLC ;;SHOW CAN CALL AS A COROUTINE$ BR 110$ ;; ;DC403 .IF DF M$$PRO ;DC403 ; ;**-1%; UNIBUS RUN NOT ACCESSIBLE (WARNING)T; $170$: MOV #GT$E5,R1 ;;GET ERROR CODE BR 167$ ;; ;DC403 .ENDC ;DF,M$$PRO ;DC403;R; END OF DYNAMIC STORAGE REGIONR;O0INEND: ;REFERENCE LABEL FOR END TO DEALLOCATE. .BLKB 2 ;EXTRA FOR POSSIBLE ALIGNMENT CHANGE;R%; BEGINNING OF DYNAMIC STORAGE REGION ;O .IF DF K$$DAS1$ICBEG::.WORD 0 ;LINK TO NEXT BLOCK IN FREE LISTA? .WORD <<$ICTOP-$ICBEG>&177774> ;LENGTH OF FREE BLOCK ;DC403OD .BLKB <<+3>&177774>-4 ;ALLOCATE REMAINING STORAGE ;DC403 ;**-10 .IFF$1$SYBEG::.WORD 0 ;LINK TO NEXT BLOCK IN FREE LIST34 .WORD <<+3>&177774> ;LENGTH OF FREE BLOCK< .BLKB <<+3>&177774>-4 ;ALLOCATE REMAINING STORAGE%$SYTOP:: ;LAST ADDRESS IN EXECUTIVEL .ENDC .END $INITLGINNING OF DYNAMIC STORAGE REGION ;O .IF DF K$$DAS1$ICBEG::.WORD 0 ;LINK TO NEXT BLOCK IN FREE LISTA? .WORD <<$ICTOP-$ICBEG>&177774> ;LENGTH OF FREE BLOCK ;DC403OD .BLKB <<+3>&177774>-4 ;ALLOCATE REMAINING STORAGE ;DC403 ;**-10 .IFF$1$SYBEG::.WORD 0 ;LINK TO NEXT BLOCK IN FREE LIST34 .WORD <<+3>&177774> ;LENGTH OF FREE BLOCK< .BLKB00ibjbkb a a a .TITLE DRGSSD .IDENT /04.02/& 7; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.7; All rights reservedG;OA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED,9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.S;O ; VERSION 04;D; D. N. CUTLER 31-AUG-73;,; PREVIOUSLY MODIFIED BY:R;; D. N. CUTLER; J. E. PROVINO ;O;$; MODIFIED FOR RSX-11M-PLUS V4.0 BY:;; L. B. MCCULLEY 23-MAR-87 4.01$;O7; LBM050 - SUPPORT PROCESSORS WITHOUT SWITCH REGISTERS;I; D. CARROLL 11-JUN-93 4.02;7; DC121 - CORRECT LBM050 TO ALLOW FOR A COMMON SWR ON ; AN MP SYSTEM;;; MACRO LIBRARY CALLSI;D .MCALL HWDDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS;+; **-$DRGSS-GET SENSE SWITCHES;SJ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO STORE THE CONTENTS OF THE CONSOLE>; SWITCH REGISTER IN THE ISSUING TASK'S DIRECTIVE STATUS WORD.;R ; DPB FORMAT:0;:#; WD. 00 -- DIC(125.),DPB SIZE(1.).$;O ; INPUTS: ;U9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.L+; R3=ADDRESS OF THE LAST WORD IN THE DPB+2.5/; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.M,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;W5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)$;S:; C=0 WITH A DIRECTIVE STATUS EQUAL TO THE CONTENTS OF THE; CONSOLE SWITCH REGISTER.T;- .IF DF G$$TSS0$DRGSS::.IF NDF,M$$PRO ; MULTIPROCESSOR SUPPORT8 BIT #HF.SWR,$HFMSK ; HARDWARE SWITCH REGISTER PRESENT?$ BEQ 1$ ; NO, DON'T TRY TO READ IT0 MOV SWR,$SWR ; YES, READ IT INTO SYSCM STORAGE, .ENDC ;NDF,M$$PRO ; MULTIPROCESSOR SUPPORT-1$: MOV $SWR,2(SP) ; RETURN VALUE FROM SYSCM  RETURNS .ENDC .ENDRRENT TASK.;W5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)$;S:; C=0 WITH A DIRECTIVE STATUS EQUAL TO THE CONTENTS OF THE; CONSOLE SWITCH REGISTER.T;- .IF DF G$$TSS0$DRGSS::.IF NDF,M$$PRO ; MULTIPROCESSOR SUPPORT8 BIT #HF.SWR,$HFMSK ; HARDWARE SWITCH REGISTER PRESENT?$ BEQ 1$ ; NO, DON'T TRY TO READ IT0 MOV SWR,$SWR ; YES, .TITLE LOWCR> .IDENT /06.00/A;R1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.T; All rights reservedN;I<; 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 11-AUG-73;O; PREVIOUSLY MODIFIED BY:L;<; P. J. BEZEREDI; J. M. LAWLER; B. S. MCCARTHY; R. T. PERRON ; T. LEKAS .; T. M. MARTIN; J. R. KAUFFMAN E; J. W. BERZLE; C. A. SILVER; L. B. MCCULLEY ; K. L. NOEL; P.K.M. WEISS; G. N. LARSEN; D. T. CARROLL.;A+; MODIFIED FOR RSX-11M-PLUS VERSION 4.6 BY:c;U; D. CARROLL 17-Oct-1995 06.005; DC403 - Merge powerfail and crash stacks together,Y.; Also, allocate the crash data base for MS:/; /DU:/MU: together (both will not be used atU; the same time).Y;D;E;Y8; LOW CORE POINTERS, TRAP VECTORS, AND INTERRUPT VECTORS; @; THIS FILE MUST BE FIRST IN THE TASK BUILDER COMMAND FILE SINCE.; IT OCCUPIES LOCATIONS STARTING AT REAL ZERO.;.; MACRO LIBRARY CALLSS;  .MCALL HDRDF$,HWDDF$,PCBDF$ HDRDF$ ;DEFINE HEADER OFFSETS$ HWDDF$ ;DEFINE HARDWARE REGISTERS- PCBDF$ ,,SYSDEF ;DEFINE PCB OFFSETS AND SIZEa .PSECTo;r; LOCAL MACROS;a; GENVT-GENERATE VECTOR ENTRY;  .MACRO GENVT ARGt .IF DF E$$NSI .WORD $NS'ARG .IFFm .WORD $NONSIY .ENDC .WORD PR7!<<<$$$-START>/4>&17>I .ENDM .MACRO NSIH .IF DF E$$LOG&E$$NSIN CALL $NSIER .IFFM IOT .ENDC .ENDM NSISTART: .REPT V$$CTR/4L$$$=. GENVT \<<$$$-START>/<4*20>> .ENDR .=START+4D0 .WORD $TRP04 ;TRAPS TO 4 (ODD,STACK,NONEX MEM) .WORD PR7 ;A4 .WORD $ILINS ;ILLEGAL (RESERVED) INSTRUCTION TRAPS .WORD PR7 ;.) .WORD $TRACE ;BREAK POINT (TRACE) TRAPSE .WORD PR7 ;N .WORD $IOTRP ; .WORD PR7 ;." .WORD $NONSI ;NONSENSE INTERRUPT .WORD PR7 ;Y% .WORD $EMTRP ;EMT INSTRUCTION TRAPS7 .WORD PR7 ;& .WORD $TRTRP ;TRAP INSTRUCTION TRAPS .WORD PR7 ;F .IF DF C$$CDA( JMP $CRASH ;JUMP TO CRASH DUMP ROUTINE .IFF ; DF C$$CDAR% HALT 00t__DATADATADATADATA ;HALT - NO CRASH DUMP SUPPORT$& BR .-2 ;DON'T ALLOW CONTINUE, EITHER .ENDC ; DF C$$CDA..DSW:: .WORD .+2 ;ADDRESS OF DIRECTIVE STATUS .BLKW 1 ;DIRECTIVE STATUS WORD" .BLKW 1 ;FCS IMPURE AREA POINTER& .BLKW 1 ;FORTRAN IMPURE AREA POINTER6 .BLKW 1 ;OVERLAY RUN TIME SYSTEM IMPURE AREA POINTER! .BLKW 1 ;RESERVED FOR EXPANSION. .BLKW 12. ;.0 .WORD 0 ;CONSTANTLY CHANGING WORD FOR M9312mp., .WORD $ENVEC ;112 - FIXED POINTER TO TABLE$ ; OF NECESSARY ENTRY POINTS .BLKB V$$CTR-114 ; ;C; EXECUTIVE STACK AREA; 8 .ASCII /COPR. (C) MENTEC 1995/ ;ASCII COPYRIGHT NOTICE# .ASCIZ /*PDP-11 25TH ANNIVERSARY*/ # .ASCIZ /*RSX-11 20TH ANNIVERSARY*/O .BLKW 49.-26. ;SYSTEM STACKP .IF DF P$$MON3 .BLKW 16. ;DEFINE EXTRA STACK SPACE FOR P-MONITOR  .ENDC .IF DF I$$C11 .BLKW 30. ;  .ENDC .IF DF P$$LAS4 .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 R4 !$UMR5:: .BLKW 1 ;USER'S SAVED R5I!$UMPC:: .BLKW 1 ;USER'S SAVED PCL!$UMPS:: .BLKW 1 ;USER'S SAVED PSF$STACK:: ;REF LABELD; ; PROCESSOR IMPURE DATA AREA; .IF DF M$$PRO&$PROC2::.BYTE 0 ;PROCESSOR NUMBER * 2"$PROCN::.BYTE 0 ;PROCESSOR NUMBER .ENDC'$STKDP::.WORD 0 ;STACK DEPTH INDICATORF-$TKTCB::.WORD 0 ;POINTER TO CURRENT TASK TCBC7$CURPR::.WORD $PRTAB ;POINTER TO CURRENT TASK PRIORITYI0$SGFFR:: .WORD 0 ;POINTER INTO STACK FOR $SGFIN)$HFMSK::.WORD HF.EIS ;HARDWARE MASK WORDS) .WORD H2.BRG ;SECOND HARDWARE MASK WORDL* ;H2.BRG IS SET BECAUSE THE VIRGIN BOOT) ;OF A PROFESSIONAL 300 SERIES MACHINEU) ;IS CURRENTLY ALWAYS DONE ON A BRIDGEO+ ;SYSTEM AND INITL DOES NOT SET THIS BITB2$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$$OOT2$RBTAD::.WORD B$$OOT ;ADDRESS OF REBOOT ROM ENTRY .ENDC ; DF B$$OOT;SA; THE FOLLOWING BYTE IS A FLAG SET WHENEVER SUPERVISOR I SPACE IS;H; MAPPED READ/WRITE, MEANING THE PDR'S MUST BE CLEARED ON CONTEXT SWITCH;O($SIRWF::.BYTE 0 ;SUPER I SPACE R/W FLAG-$CXDBL::.BYTE 0 ;CONTEXT SWITCH DISABLE FLAGE'$SAHDB:: ;BIAS OF CURRENT TASK HEADERD .IF DF X$$HDR .WORD 06$SAVSP::.WORD $UMR4 ;SAVED SP - ALWAYS POINTS TO UMR4 .IFTF2$SAHPT:: ;VIRTUAL ADDRESS OF CURRENT TASK HEADER .IFTW .WORD 0 .ENDC0$HEADR::.WORD 0 ;POINTER TO CURRENT TASK HEADER .IF DF F$$MAP4$FMAPP::.WORD 0 ;POINTER TO FAST MAP AREA OF HEADER .ENDC ; DF F$$MAP<$RQSCH::.WORD $RQTAB ;POINTER TO CURRENT RESCHEDULE POINTER;UH; THE FOLLOWING CELLS CONDITIONALLY DESCRIBE THE EXECUTIVE CONFIGURATION$; IF KERNEL DATA SPACE IS SUPPORTED.;. .IF DF K$$DASE$ROEND::.WORD <<<$EXEND+77>&177700>/100>&1777 ;LENGTH IN 32 WD BLOCKS" ;OF R/O SECTION OF EXECUTIVE9$SCMOF::.WORD 0 ;OFFSET TO DATA SPACE OR 0 IF NOT LOADED: .WORD 3 ;ALLOCATION SIZE MASK 6$ICAVL::.WORD $ICBEG ;BEGINNING OF ALLOCATED ICB POOL% .WORD 0 ;DUMMY SIZE FOR FIRST BLOCK  .IFF.$SCMOF:: ;MAKE SURE SYMBOL IS ALWAYS DEFINED .ENDC;B; UMR ALLOCATION LISTHEAD AND WAIT QUEUE LISTHEAD. THE ALLOCATIONF; LISTHEAD DOUBLES AS A DESCRIPTOR OF THE UMRS STATICALLY ALLOCATED TO; THE EXEC AND ANYONE ELSE.7;/ .IF DF M$$EXT&U$$UMRB .IF DF U$$BME9$UMRHD::.WORD $UBUMR+2 ;MAPPING ASSIGNMENT BLOCK LISTHEADS .IFF ; 3$UMRHD::.WORD 0 ;MAPPING ASSIGNMENT BLOCK LISTHEADA .IFTF ;U$$BME, .WORD UBMPR ;ADDRESS OF FIRST ASSIGNED UMR5 .WORD N$$UMR ;NUMBER OF UMR'S STATICLY ASSIGNED * 4A-$UMRWT::.WORD 0,.-2 ;UMR WAIT QUEUE LISTHEAD$UBUMR:: .IFT ;U$$BMEA .WORD 0 ; LINK WORDA0 .WORD UBMPR+174 ; ADDRESS OF FIRST ASSIGNED UMR$ .WORD 4 ; NUMBER OF UMR'S ASSIGNED .ENDC ;DF U$$BMEY .ENDC ; DF M$$EXT&U$$UMR ;U); DATA STRUCTURES FOR EXECUTIVE IDLE CODEU;2)$I00 ibjbkb a a aDLCT::.BYTE 0 ;IDLE PATTERN COUNT BYTE ($IDLFL::.BYTE 0 ;IDLE PATTERN FLAG BYTE&$IDLPT::.WORD 7760 ;IDLE PATTERN WORD+ .WORD 0 ;WORKING STORAGE FOR IDLE PATTERN$;;@; SYSTEM POWER FAIL STACK, IF CRASH DUMP NOT SUPPORTED ;DC403; ;**-1 .IF DF P$$RFL .IF DF M$$PRO9$PWKA0::.BLKW M$$PRO ;;;STORAGE FOR KINAR0 IN CPA'S AREAU+$PWCSR::.WORD FKCSR ;;;POINTER TO IIST CSR.1FKCSR: .WORD 0 ;;;CPA CSR (WHEN NO IIST PRESENT)U .ENDC .IF NDF,C$$CDA ;DC403#$PWBTM::.BLKW 7 ;R0 THRU R5 AND SPN .IF DF M$$EXT' .BLKW 31.*2 ;UNIBUS MAPPING REGISTERS: .ENDC- .BLKW 25. ;MEMORY MANAGEMENT REGS & USER SPR .IF DF F$$LPP% .BLKW 27. ;FLOATING POINT REGISTERSP .ENDC .IF DF K$$DAS .BLKW 8. ;KERNEL D SPACE APR'S .ENDC .IF DF S$$LIB( .BLKW 16. ;SUPER I SPACE PARS AND PDRS( .BLKW 16. ;SUPER D SPACE PARS AND PDRS .BLKW 1 ;SUPER SPD .ENDC .IF DF U$$DAS# .BLKW 16. ;USER D SPACE REGISTERS  .ENDC ; DF U$$DAS$PWSTK==.-2 ;REF LABEL .ENDC ;NDF,C$$CDA ;DC403 /$POWSP:: .BLKW 1 ;SAVED SP FOR POWERFAIL STACK. .ENDC;T"; FLOATING POINT SUPPORT WORK AREA; .IF DF F$$LPP'$FLSTS::.BLKW 2 ;FLOATING POINT STATUS$<$FLFRK::.WORD $FLFTB ;POINTER FOR FLOATING POINT FORK BLOCK7$FLTCB::.BLKW 1 ;ADDRESS OF TCB CAUSING EXCEPTION TRAPL .ENDC;S9; SAVE AREA FOR ERROR LOGGING NONSENSE INTERRUPT HANDLINGF;  .IF DF E$$LOG&E$$NSIE"$VID:: .BLKB 1 ;VECTOR ID STORAGE#$NSI:: .BYTE -1 ;RECURSION COUNTER.$OPS:: .BLKW 1 ;OLD PS STORAGE$OPC:: .BLKW 1 ;OLD PC STORAGEO9$ERLFK::.WORD $PBEZ ;POINTER TO ERROR LOGGING FORK BLOCKT .ENDC ; DF E$$LOG&E$$NSIL;$; DATA STRUCTURES FOR PARITY SUPPORT;; EXEC PARITY ERROR MESSAGER;R .IF DF P$$RTY .NLIST BEX:C$EXMSG::.ASCIZ <15><12>/***EXEC PARITY ERROR STOP***/<15><12><12> ; .LIST BEX .EVEN;N#; INTERRUPT RECURSION LEVEL COUNTER;F$PARLV::.WORD -1 ;;:.; PARITY CONTROL STATUS REGISTER ADDRESS TABLE;U; ******* NOTE WELL ! *******O;PD; THE FOLLOWING TABLES ARE REFERENCED IN INITL AND PARTY, AS WELL ASE; BY SAVE AND HRC. THE ADJACENCY OF THE ITEMS STARTING AT $PARTB ANDA; INCLUDING $MEMR1, $MPCSR, AND $CPUER IS NOT ONLY ASSUMED, IT ISSB; CRUCIAL AND MUST BE PRESERVED. NOTE ALSO THAT ANY CHANGE IN THEH; STRUCTURE OF $PARTB SHOULD PROBABLY BE REFLECTED IN $MKCSR AND $MKCS2,; BOTH FOUND IN SYSCM.$CSRTB:: ;REFERENCE LABELRE$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 REGISTER  .BYTE 0 ;END OF TABLEA2 .BLKW 1 ;DUMMY STORAGE FOR MEMORY ERROR REGISTER .IFTF ; DF P$$RTY5$PARTB::.WORD 1 ;DUMMY CSR FOR NONEXISTANT REGISTERS  .IFT ; DF P$$RTYE;TE; TABLE OF CSR ADDRESSES. IF THE CSR DOES NOT EXIST, THE ENTRY POINTS E; TO $PARTB ABOVE. THIS MUST BE THE CASE SO THAT CODE REFERENCING THE,E; CSRS PRIOR TO THE CSR SCAN (SUCH AS THE LOCK$ $EXECL IN INITL) WILL0*; ACCESS A DUMMY LOCATION, NOT LOCATION 0.;.#$MEMR1:: ;MEMORY PARITY CSR TABLE .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$$RTYT; %; PDP-11/70 CACHE PARITY STATUS TABLEA;S .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 ERRORO$ .BYTE 30,240 ;ADDRESS/DATA GROUP 1 .WORD 0 ;TIME OF LAST ERROR .WORD 0 ;END OF TABLE ;N; NEW CACHE PARITY CSR CONTENTS;; $MPCTL::.WORD 1 ; .ENDC .IFF ; DF P$$RTY $CSRTB:: ;REFERENCE LABEL  .ENDC ; DF P$$RTY/; DATA AREA FOR DYNAMIC EXEC DEBUGGER INTERFACED .IF DF D$$DXD&$DXDK5::.WORD 0 00t__DATADATADATADATA ;SAVED KINAR5 FOR DXD)$DXDRL::.WORD 0 ;RELOCATION BIAS FOR DXD $$DXDEP::.WORD 0 ;ENTRY POINT TO DXD .ENDC ; D$$DXDT;U ; DATA AREA FOR BUGCHECK SUPPORT;$BCFAC::.WORD 0 ;FACILITY CODE1$BCERR::.WORD 0 ;ERROR CODE;.#; DATA AREA FOR SYSTEM CRASH MODULEA;  .IF DF C$$CDA2$CRBAE::.WORD 0 ;DEFINE EXISTENCE OF BAE REGISTER5 .IIF EQ C$$CDA-12 CDA$MS=0 ;MS RESIDENT CRASH DRIVERR2 .IIF EQ C$$CDA CDA$MS=0 ;LOADABLE CRASH DRIVERS& .IIF EQ C$$CDA-16 CDA$DU=0 ;DC403& .IIF EQ C$$CDA-17 CDA$MU=0 ;DC4034 .IIF EQ C$$CDA CDA$DU=0 ; LOADABLE CRASH ;DC403 ;DC403= .IF DF CDA$MS ;MS RESIDENT OR LOADABLE CRASH DRIVER ;DC403( .IF DF CDA$DU!CDA$MU!H$$GEN ;DC403 .IFF ; MSCP CDA ;DC403  ;**-3T,$MSCR1:: ;COMMAND BUFFER FOR MS CRASH DUMP2 .BLKW 5 ;NEED FOUR WORDS ON DOUBLE WORD BOUNDARY $MSCR2:: ;CHARACTERISTICS DATA, .WORD $MSCR3 ;LOW ORDER 16 BITS OF MESSAGE ;BUFFER ADDRESSI .WORD 0 ;HIGH ORDER 2 BITS' .WORD 14. ;SIZE OF THE MESSAGE BUFFER= .WORD 0 ;FLAG WORD $MSCR3::.BLKW 7 ;MESSAGE BUFFER .ENDC ; MSCP CDA ;DC403 .ENDC ;DF CDA$MSD' .IF DF CDA$DU!CDA$MU!H$$GEN ;**-3 ;U ; CRASH DATA BASE FOR DU DEVICES;S; *** NOTE WELL ***=; ANY CHANGES TO THIS DATABASE MUST ALSO BE MADE IN CRASH.MAC; COMMAND AND RESPONSE PACKETS .WORD 60 ;PACKET LENGTH;1 .WORD 1 ;VIRTUAL CIRCUIT AND CREDIT/DEBIT FIELDB%CMDPKT: .WORD 1 ;COMMAND PACKET AREA. .BLKW 23. ;R .BLKW 2 ;ENVELOPE.(RSPPKT: .BLKW 24. ;RESPONSE PACKET AREA ;DC403= .IF DF CDA$MS ;MS RESIDENT OR LOADABLE CRASH DRIVER ;DC403 ;DC403*$$$ =. ; REMEMBER WHERE WE ARE ;DC403%. =RSPPKT ; RESET ORIGIN ;DC403C ;DC403W4$MSCR1:: ;COMMAND BUFFER FOR MS CRASH DUMP ;DC4039 .BLKW 5 ;NEED FOUR WORDS ON DOUBLE WORD BOUNDARY ;DC403O*$MSCR2:: ;CHARACTERISTICS DATA ;DC4035 .WORD $MSCR3 ;LOW ORDER 16 BITS OF MESSAGE ;DC403N ;BUFFER ADDRESS ;DC403& .WORD 0 ;HIGH ORDER 2 BITS ;DC4030 .WORD 14. ;SIZE OF THE MESSAGE BUFFER ;DC403 .WORD 0 ;FLAG WORD ;DC403C ;DC403+$MSCR3::.BLKW 7 ;MESSAGE BUFFER ;DC403  ;DC403< .IIF GT,<.-$$$>, .ERROR ; MS: DATABASE IS TOO LARGE ;DC403 ;DC4035. =$$$ ; AND RETURN TO MSCP CRASH DATABASE ;DC403W .ENDC ;DF CDA$MS ;DC403 ;DC403 .BLKW 2 ;C; COMMAND RINGS.RINGS:(RSP: .WORD RSPPKT ;RESPONSE PACKET RING- .WORD 100000 ; PACKET "OWNED" BY CONTROLLERG'CMD: .WORD CMDPKT ;COMMAND PACKET RINGZ- .WORD 100000 ; PACKET "OWNED" BY CONTROLLERA; INITIALIZATION TABLE$MUCSH::2$DUCSH::.WORD CMDPKT, RSPPKT ;ADDRESSES OF PACKETS# .WORD 100000, RINGS ;STEPS 1 AND 2R .WORD 0, 1 ;STEPS 3 AND 4 % .WORD RSP ;ADDRESS OF RESPONSE RINGD .ENDC .IFF ; DF C$$CDA;-$BCPC:: .WORD 0 ;BUGCHECK PC FOR TYPE DIRECT  .IFT ; DF C$$CDA($BCPC:: ;ALTERNATE LABEL FOR CRASH PC($CRUPC::.WORD 0 ;USER PC IS STORED HERE($CRUST::.WORD 0 ;USER PS IS STORED HERE .NLIST BEXNA$CRMS0::.ASCII <15><12><12>/CRASH -- CONT WITH SCRATCH MEDIA ON / $CRDEV:: ;REFERENCE SYMBOL:.IIF EQ C$$CDA-1, .ASCII /DT/D.IIF EQ C$$CDA-2, .ASCII /DK/0.IIF EQ C$$CDA-3, .ASCII /MT/D.IIF EQ C$$CDA-4, .ASCII /MM/R.IIF EQ C$$CDA-5, .ASCII /DB/.IIF EQ C$$CDA-6, .ASCII /DM/;.IIF EQ C$$CDA-7, .ASCII /DL/P.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 SUPPORTEDM-.IIF EQ C$$CDA-15, .ASCII /MF/ ;NOT SUPPORTEDT.IIF EQ C$$CDA-16, .ASCII /DU/.IIF EQ C$$CDA-17 .ASCII /MU/A>.IIF EQ <.-$CRDEV> .ASCII /XX/ ;ALWAYS ALLOW FOR A DEVICE NAME$CRUNT::.BYTE <60+>A( .BYTE <60+/10>># .BYTE <60+>>F .ASCIZ <15><12><12> .IF DF M$$PROC$CRMS1::.ASCIZ <15><12>/CRASH -- WAITING FOR PROCESSORS TO QUIESCE/SE$CRMS2::.ASCIZ <15><12>/CRASH -- PROCESSOR REGISTERS HAVE BEEN SAVED/AF$CRMS400ibjbkb a a a::.ASCIZ <15><12>/CRASH -- SANITY TIMER EXPIRED ON PROCESSOR CP/A$CRMS5::.ASCIZ <15><12>/CRASH -- CRASH REQUESTED BY PROCESSOR CP//$CRCPU::.ASCIZ /?/ .ENDC@$CRMS3::.ASCIZ <15><12>\CRASH -- I/O ERROR ON CRASH DUMP DEVICE\6$CRMS6::.ASCIZ <15><12>/CRASH -- ILLEGAL CRASH DEVICE/9$CRMS7::.ASCIZ <15><12>/CRASH -- CRASH DRIVER NOT LOADED/.=; ALL THE SECTIONS OF THE BUGCHECK MESSAGE MUST BE CONTIGUOUSE5$BCMSG::.ASCIZ <15><12>/SYSTEM FAULT DETECTED AT PC=/E .ASCIZ / FACILITY=/N .ASCIZ / ERROR CODE=/ .ASCIZ <15><12><12>& .BLKB 6 ;BUFFER FOR OCTAL CONVERSION$$BCBUF::.BYTE 0 ;OF VALUES IN CRASH .LIST BEX .ENDC ; DF C$$CDA .IF DF A$$CNT*$BILNG::.BYTE 1 ;BILLING IS INITIALLY OFF .IFFD$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 CALLS2$CRSBF::.BLKW 177. ;CRASH STACK IS THIS SIZE (NOT" ;169.+4 AS PREVIOUSLY THOUGHT) ;(SEE CRASH.MAC FOR FORMAT) !$CRSST==.-2 ;TOP OF CRASH STACKL ; *** ABOVE MUST BE ADJACENT .IF DF P$$RFL ;DC403 ;DC403#$PWSTK==.-2 ;REF LABEL ;DC403 ;DC403 .ENDC ;DF,P$$RFL ;DC403 ;DC403/ .IF EQ, C$$CDA ;LOADABLE CRASH DRIVER SUPPORT# PBNH = 0 ;STARTING DEVICE ADDRESST PBNL = 0 ;UNKNOWND .IFTF0$CRSBN::.WORD PBNH,PBNL ;STARTING DEVICE ADDRESS3$CRSCS::.WORD PBNH+PBNL ;CHECKSUM OF DEVICE ADDRESS96$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 DRIVER  .ENDC ; EQ, C$$CDA  .ENDC ; DF C$$CDA .IF DF A$$CNT9$STRTM::.BLKW 2 ;ABSOLUTE TIME OF CONTEXT SWITCH TO TASK  .IFFE$STRTM:: .ENDCF; HERE WE DEFINE A SINGLE "FAKE WORD" WHICH RECEIVES ALL THE ADDRESSESD; FOR THINGS WHICH ARE NOT GENNED INTO THE SYSTEM, BUT WHICH REQUIREB; THAT THE ADDRESSES ALWAYS BE RESOLVED FOR TASKBUILDING MCR, ETC.B; THIS ONE (IN LOWCR) IS TO BE USED FOR I SPACE REFERENCES AND CPUC; SPECIFIC INFO (ALSO THINGS WHICH MUST BE ACCESSED WHEN D SPACE IS.A; TURNED OFF), AND THE ONE IN SYSCM IS USED FOR D SPACE LOCATIONS .IF NDF R$$WPTB$WPBR:: FAKE = 0I .ENDC ; NDF R$$WPT .IF NDF P$$RTY$PARLV:: FAKE = 0S .ENDC ; NDF P$$RTY  .IF NDF D$$DXDE$DXDEP::$DXDK5::$DXDRL:: FAKE = 0T .ENDC ; NDF D$$DXDQ .IF DF FAKE- .WORD -1 ;FAKE DATA LOCATION FOR ALL OF THER ;ABOVE .ENDC ; DF FAKE;+-; **-$NS0,$NS1,$NS2,$NS3,$NS4,$NS5,$NS6,$NS7-I(; NONSENSE INTERRUPT IDENTIFIER ROUTINES;D?; EACH OF THESE ROUTINES IS VECTORED TO BY ONE OF A GROUP OF 16CG; UNUSED VECTORS. THE VECTORS ARE SUB-CODED IN THE PS CONDITION CODES.F;- .IF DF M$$PRO!V$$DSK;RA; IN A MULTIPROCESSING SYSTEM, SOME STACK SPACE IS NECESSARY WHEN?; THE CPU IS INTERRUPTED. THE M9312MP BOOTSTRAP SETS R6 TO THEQ8; VALUE POINTED TO BY PHYSICAL ZERO. THIS IS THAT AREA.; A; FOR BOOTABLE VIRUTAL DEVICES, THIS WILL SERVE AS THE STACK USEDN0; BY BOOT, TO PASS THE VIRTUAL DEVICE LBN PAIRS.;F .IF DF,V$$DSK ;DC403H .IF GT, ;DC403EF .BLKW <*6> ; THIS IS REALLY A WASTE, AND THE MAXIMUM ;DC4036 ; NESTING SHOULD REALLY BE SET TO A MAXIMUM ;DC4038 ; OF TWO, SINCE IT CAN'T BE RELEASED BY INITL ;DC403. .ENDC ;GT ; WHAT IS REALLY NEEDED.. ;DC403E .ENDC ;DF,V$$DSK ; BUT SOMEONE WILL WANT MORE ... SO BE IT... ;DC403H8 .BLKW 19. ; STACK SPACE FOR IIST, OR LBN PAIRS ;DC4034 .WORD "VF ; SHOW VF: SUPPORT INCLUDED ... ;DC403 ;**-2B .ENDC ;DF,M$$PRO!V$$DSK#$NS0:: NSI ;;;CALL COMMON ROUTINE  .WORD 0 ;;;GROUP 0-17-$NS1:: NSI ;;; .WORD 20 ;;;GROUP 20-37U$NS2:: NSI ;;; .WORD 40 ;;;GROUP 40-57T$NS3:: NSI ;;; .WORD 60 ;;;GROUP 60-77N$NS4:: NSI ;;; .WORD 100 ;;;GROUP 100-117$NS5:: NSI ;;; .WORD 120 ;;;GROUP 120-137$NS6:: NSI ;;; .WORD 140 ;;;GROUP 100"'t__DATADATADATADATA40-157$NS7:: NSI ;;; .WORD 160 ;;;GROUP 160-177;I.; INDIRECT POINTERS INTO MULTIPROCESSOR TABLES;  .IF DF M$$PRO6$TKPTR::.WORD $TKTAB ;POINTER INTO CURRECT TASK TABLE4$MPSWT::.WORD $MPTAB ;POINTER INTO CPU STATUS TABLE1$CPURM::.WORD $URMTB ;POINTER INTO CPU URM TABLE =$CPCRM::.WORD $CRMTB ;POINTER INTO COMPLEMENTED RUN MASK TBL;2$TTUQP::.WORD $TTUQ ;TTDRV MULTIPROCESSOR POINTER;0$; MULTIPROCESSOR LOCAL MEMORY WORDS.;O0$CPBIT::.WORD 1 ;PROCESSOR BIT FOR USE IN MASKS0$FRKCT::.WORD 0 ;NUMBER OF FORK BLOCKS DEQUEUED .ENDC; ; KXJ11 SPECIFIC LOCATIONS;C .IF DF C$$KXJ ; KXJ SUPPORTED?6$KXVC1::.BLKW 1 ; KXJ VECTOR 1 - DRIVER COMMUNICATION8$CSFSV::.BLKW 1 ; SAVED KXJ CSR F - FULLY SHARED MEMORY5$CSHSV::.BLKW 1 ; SAVED KXJ CSR H - " " "C0$KXPTR::.BLKW 1 ; POINTER TO KXJ DRIVER'S DCB($KXBAS::.BLKW 1 ; BASE ADDRESS OF KXDRV .IFFR$KXVC1::$CSFSV::$CSHSV::$KXPTR::$KXBAS:: .ENDC ; C$$KXJ; "; REMOTE SYSTEM SPECIFIC LOCATIONS;T .IF DF C$$RMT ; REMOTE HOSTK,$XXLOW::.BLKW 1 ; FIRST GENERIC DCB ADDRESS+$XXHGH::.BLKW 1 ; LAST GENERIC DCB ADDRESS( ; USED TO IDENTIFY A GENERIC DEVICE .IFFI$XXLOW::$XXHGH:: .ENDC ; C$$RMTF;S*; ADDRESS TO INCREMENT ON EVERY CLOCK TICK2; THIS IS EITHER 110 OR ON KXJ REMOTE SYSTEMS TPR5;T&$CKINC::.WORD 110 ; INITIALIZE TO 110; ; REMOTE TASK SPECIFIC LOCATIONS;:% .IF DF C$$RTK ; REMOTE TASK SUPPORT:7$CPPKT:: .WORD 0 ; PRE-ALLOCATED CPRBUF PACKET ADDRESSS3$CPLUN:: .WORD 0 ; LUN NUMBER FOR REMOTE I/O KILLS .$CPRBF:: .WORD 0 ; CPRBUF FREE SPACE LISTHEAD;$CPWAT:: .BLKW 2 ; LISTHEAD FOR PACKETS WAITING TO BE SENTC4$CPOUT:: .BLKW 2 ; LISTHEAD FOR OUTSTANDING PACKETS-$CPPOL:: .WORD 0 ; CPRSX POOL WAIT FLAG WORDL8$CPMXB:: .WORD 0 ; MAXIMUM SIZE TO BUFFER IN CPR PACKET3$CPCNT:: .WORD 0 ; REMOTE SYSTEM CONTROLLER LETTER 1$RMTSK:: .WORD 3 ; NUMBER OF REMOTE STATIC TASKS 1$RMTTT:: .BLKW 1 ; NUMBER OF REMOTE HT TERMINALSL1$RMTVT:: .BLKW 1 ; NUMBER OF REMOTE VT TERMINALS  .IFFR$CPPKT::$CPLUN::$CPRBF::$CPWAT::$CPOUT::$CPPOL::$CPMXB::$CPCNT::$RMTSK::$RMTTT::$RMTVT:: .ENDC ; C$$RTKC .END.BLKW 2 ; LISTHEAD FOR OUTSTANDING PACKETS-$CPPOL:: .WORD 0 ; CPRSX POOL WAIT FLAG WORDL8$CPMXB:: .WORD 0 ; MAXIMUM SIZE TO BUFFER IN CPR PACKET3$CPCNT:: .WORD 0 ; REMOTE SYSTEM CONTROLLER LETTER 1$RMTSK:: .WORD 3 ; NUMBER OF REMOTE STATIC TASKS 1$RMTTT:: .BLKW 1 ; NUMBER OF REMOTE HT TERMINALSL1$RMTVT:: .BLKW 1 ; NUMB .TITLE DBDRV  .IDENT /16.12/.;.1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.O; All rights reservedO;I;U<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;D; P. J. BEZEREDI 19-SEP-79;<; MODIFIED FOR M-PLUS V2.0 BY:;S; R. T. PERRON; P. J. BEZEREDI ; T. LEKAS; ; MODIFIED BY:;.; P. J. CARR 9-JUN-82 16.01T; '; PJC052 -- CORRECT SEEK OPTIMIZATION. ;L; P. J. CARR 27-AUG-82 16.02; :; PJC063 -- COUNT EACH DIFFERENT OFFSET AS 1 RETRY DURING; OFFSET RECOVERY.;c; P. J. CARR 27-AUG-82 16.03;O9; 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;P00*ibjbkb a a a; B. S. MCCARTHY 6-AUG-85 16.10 ;T/; BM368 -- ADD CONDITIONAL SKIP OF FIRST DRIVEG!; NOT READY ERROR FOR POWERFAIL4;-$; MODIFIED FOR RSX-11M-PLUS V4.5 BY:;N; D. CARROLL 27-SEP-1994 16.110; DC290 -- INCLUDE SUPPORT FOR THE SHELBY DRIVE%; AS A DYNAMICALLY SIZEABLE DEVICER; ; D. CARROLL 21-MAR-95 16.123; DC320 -- DO NOT SEEK ON SHELBY, SINCE THE SEARCHT'; FUNCTION IS A NO-OP FOR THE SHELBYP;4;.-; RH11/RH70-RP04/05/06 OVERLAPPED SEEK DRIVERR;I .MCALL HWDDF$,PKTDF$6$ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS;I,; DEVICE REGISTER AND STATUS BIT DEFINITIONS;-%RPCS1=0 ;CONTROL STATUS REGISTER 1NIE=100 ;INTERRUPT ENABLE1TRE=40000 ;TRANSFER ERROR *MCPE=20000 ;MASSBUS CONTROL PARITY ERROR#DVA=4000 ;DRIVE AVAILABLE TO PORT-RPWC=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 ;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 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 I002't__DATADATADATADATANITIATOR;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 REQUESTOR 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 YESR0 CMP U.PRM(R5),#<<32.*256.>+64.> ; SHELBY DRIVE?1 BEQ DBRQC1 ; YUP, DO NOT PERFORM SEEK OPERATIONN- MOVB K.CON(R1),R3 ;RETREIVE CONTROLLER INDEXE# TST $DBOPT(R3) ;WHICH SEEK METHOD?." BNE 10$ ;IF NE ALWAYS SEEK FIRST3 BIT #KS.DIP,K.STS(R1) ;DATA TRANSFER IN PROGRESS? + BEQ DBRQC1 ;IF EQ NO, START DATA TRANSFER210$: BISB #S3.SIP,S.ST3(R4) ;SET SEEK IN PROGRESS6 CALL $RQCNC ;REQUEST CONTROLLER FOR CONTROL FUNCTION BR DBINIO ; 320$: MOV #FUNTBL,R0 ; GET ADDRESS OF FUNCTION TABLE )25$: TSTB (R0)+ ; BYPASS CONTROLLER CODE>- CMPB (R0)+,I.FCN(R3) ; FUNCTION CODE MATCH ?R 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.DBUB00:ibjbkb a a aMP: 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+60$: 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? B00B't__DATADATADATADATAEQ 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 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 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/0600Jibjbkb a a a 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 12$ ;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$ 00R't__DATADATADATADATA;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(R5),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 YES500Zibjbkb a a a 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 ;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.VER00b't__DATADATADATADATA&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 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.P00jibjbkb a a aRM+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) ;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 NOC+ CMPB RPDT(R2),#47 ; IS THIS A SHELBY DRIVET BNE 7$ ; IS NE, NOPE, CONTINUE$ BIT #MOL,RPDS(R2) ; DO WE HAVE MOL?+ BEQ 7$ ; IF EQ, NOPE, NO GEOMETRY YET ...E# MOVB #47,(R2) ; GET DRIVE GEOMETRYS57$: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO CALLERE BR 15$ ;010$: BIT #VV$SET,I.PRM+2(R1) ;SET VOLUME VALID? BEQ 30$ ;IF EQ NOR7 MOV RPDS(R2),R1 ;GET CONTENTS OF DRIVE STATUS REGISTERU COM R1 ;TOGGLE THEMA) BIT #MOL!DRY,R1 ;DRIVE READY AND ONLINE?1 BNE 20$ ;IF NE NOB& CMPB RPDT(R2),#47 ; IS THIS A SHELBY?$ BNE 13$ ; IF NE, NOPE ... CONTINUE) MOVB #47,(R2) ; ISSUE THE IDENT FUNCTIOND'12$: CMPB (R2),#246 ; CONTROLLER READY?O' BNE 12$ ; IF NE, NOPE, PAUSE A MOMENTD( MOV R0,-(SP) ; SAVE CURRENT STATUS CODE+ MOV RPCC(R2),R0 ; GET THE HIGHEST CYLINDER0$ INC R0 ; BUMP THE HIGHEST CYLINDER) MOV R0,U.PRM+2(R5) ; UPDATE THE GEOMETRY2. MUL #<64.*32.>,R0 ; CALCULATE THE HIGHEST LBN, MOVB R0,U.CW2(R5) ; LOAD THE HIGH ORDER LBN0 MOV R1,U.CW3(R5) ; AND THE LOW ORDER DRIVE SIZE MOV (SP)+,R0 ; RESTORE R0,13$: MOVB #23,(R2) ;ISSUE PACK ACK TO SET VV15$: JMP DBFIN1 ;EXIT320$: MOV #IE.DNR&377,R0 ;DRIVE NOT READY ERROR CODEY) BICB #US.VV,U.STS(R5);RESET VOLUME VALIDD BR 15$ ;EXIT030$: BIT #VV$UNL,I.PRM+2(R1) ;UNLOAD THE DRIVE? BEQ 15$ ;IF EQ NO0+ BIT #PIP,RPDS(R2) ;IS THE DRIVE IN MOTION?R- BNE 15$ ;IF NE YES, IT'S PROBABLY UNLOADING.% MOVB #3,(R2) ;ISSUE UNLOAD FUNCTIONM BR 15$ ;;;$; **-DBCLR-CLEAR DRIVE OR SUB-SYSTEM?; **-DBCLR1-ALTERNATE ENTRY TO CLEAR DRIVE W/O INTERRUPT ENABLE;3C; 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 T00rvt__DATADATADATADATAIMEOUT 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+ .TITLE DRDRVS .IDENT /14.06/C;D1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.0; All rights reserved:;T;P<; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;T; P. J. BEZEREDI 19-SEP-79; $; MODIFIED FOR RSX-11M-PLUS V2.1 BY:;L; P.J. BEZEREDIT ; P.J. CARRK ; J. GALLANT;,; MODIFIED BY:;D; 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;-; C SESTOKAS 19-APR-89 14.04;M5; CS002 -- HANDLE OFFLINE UNIT UNSOLICITED INTERRUPT.;L$; MODIFIED FOR RSX-11M-PLUS V4.5 BY:;A; D. CARROLL 27-SEP-1994 14.05;-3; DC290 -- INCLUDE SUPPORT FOR THE SHELBY DRIVE ASR; DYNAMICALLY SIZEABLE; ; D. CARROLL 21-MAR-95 14.068; DC330 -- FOR SHELBY DRIVE, DO NOT PERFORM SEEK, SINCE.; THAT IS A FUNCTIONAL NO-OP FOR THE SHELBY;A;Y;A;; RH11/RH70-RM02/RM03/RM05/RM80/RP07 OVERLAPPED SEEK DRIVERR;F .MCALL HWDDF$,PKTDF$ $ HWDDF$ ;DEFINE HARDWARE REGISTERS$ PKTDF$ ;DEFINE I/O PACKET OFFSETS; ,; DEVICE REGISTER AND STATUS BIT DEFINITIONS;M%RMCS1=0 ;CONTROL STATUS REGISTER 19IE=100 ;INTERRUPT ENABLEDTRE=40000 ;TRANSFER ERRORE*MCPE=20000 ;MASSBUS CONTROL PARITY ERROR#DVA=4000 ;DRIVE AVAILABLE TO PORTORMWC=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 ERRORD%MDPE=400 ;MASSBUS DATA PARITY ERROR0!00zibjbkb a a aRMDS=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 WORD 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,00vt__DATADATADATADATA 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 YEST0 CMP U.PRM(R5),#<<32.*256.>+64.> ; SHELBY DRIVE?1 BEQ DRRQC1 ; YUP, DO NOT PERFORM SEEK OPERATION/- MOVB K.CON(R1),R3 ;RETREIVE CONTROLLER INDEXE# TST $DROPT(R3) ;WHICH SEEK METHOD?." BNE 10$ ;IF NE ALWAYS SEEK FIRST3 BIT #KS.DIP,K.STS(R1) ;DATA TRANSFER IN PROGRESS? + BEQ DRRQC1 ;IF EQ NO, START DATA TRANSFER210$: BISB #S3.SIP,S.ST3(R4) ;SET SEEK IN PROGRESS6 CALL $RQCNC ;REQUEST CONTROLLER FOR CONTROL FUNCTION JMP DRINIO ; INITIATE I/O(320$: MOV #FUNTBL,R0 ; GET ADDRESS OF FUNCTION TABLEC)25$: TSTB (R0)+ ; BYPASS CONTROLLER CODEV+ CMPB (R0)+,I.FCN(R3) ; FUNCTION CODE MATCHP 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 TRANSFER(;: ; **-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)00ibjbkb a a a,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(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 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$ ;;00vt__DATADATADATADATA;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 DATA 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 00ibjbkb a a aEXTENDED 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 INTERRUPTSBA MOV RMDS(R2),R0 ;;; R0 - drive status (seize drive on dual port)G1 BIT #PGM,R0 ;;; Drive programmable (dual port)?V BNE 6$ ;;; IF NE, Yes/7 MOV #TRE!11,(R2) ;;; Clear single controller and driveQ BR 7$ ;;; and fork interlock.76$: BIT #DPR,R0 ;;; Drive present (available) on port?V* BEQ 8$ ;;; IF EQ, No - don't do anything0 MOV #TRE!11,(R2) ;;; Clear controller and driveA BISB #S3.DRL,S.ST3(R4) ;;; Indicate releasing drive on dual port+ MOVB #113,(R2) ;;; and release the drive.T,7$: CLR S.FRK+2(R4) ;;; Reset fork interlock&8$: MTPS #0 ;;; and allow interrupts BR DRPWF3 ;RELEASE CONTROLLERl;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 TRANSFERD>; TERMINATED, DETERMINE WHY. IF WE ARE SPINNING UP, RETRY THE ; OPERATION.; 110$: BITB #US.SPU,U.STS(R5) ;ARE WE SPINNING UP?d BEQ 15$ ;IF EQ NO,- BIT #S2.MAD,S.ST2(R4) ;MULTI-ACCESS DEVICE?p BEQ 12$ ;IF EQ NO , CMP S.KRB(R4),S.KTB(R4) ;IS THIS PORT 'A'? BNE 14$ ;IF NE NOt2 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$: BIT #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 ;CALCU00vt__DATADATADATADATALATE 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(R2) ;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 ;CAL00ibjbkb a a aCULATE 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 RETRY 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); CH00vt__DATADATADATADATAECK 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... ; 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?E00ibjbkb a a a 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;T(; **-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 NOR& C00†vt__DATADATADATADATAMPB RMDT(R2),#47 ; IS THIS A SHELBY? BNE 6$ ; IF NE, NOPE ...# BIT #MOL,RMDS(R2) ; DO WE HAVE MOL' BEQ 6$ ; IF EQ, NOPE, DON'T IDENT ...?" MOVB #47,(R2) ; LOAD THE FUNCTION56$: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO CALLERC BR 15$ ;010$: BIT #VV$SET,I.PRM+2(R1) ;SET VOLUME VALID? BEQ 25$ ;IF EQ NO + MOV RMDS(R2),R1 ;GET DRIVE STATUS REGISTERU COM R1 ;TOGGLE THE BITSU0 BIT #MOL!DRY,R1 ;IS THE DRIVE READY AND ONLINE? BNE 20$ ;IF NE NO(& CMPB RMDT(R2),#47 ; IS THIS A SHELBY?$ BNE 13$ ; IF NE, NOPE ... CONTINUE) MOVB #47,(R2) ; ISSUE THE IDENT FUNCTION,)12$: CMPB (R2),#246 ; FUNCTION COMPLETED?Q' BNE 12$ ; IF NE, NOPE, PAUSE A MOMENT;( MOV R0,-(SP) ; SAVE CURRENT STATUS CODE+ MOV RMCC(R2),R0 ; GET THE HIGHEST CYLINDER$ INC R0 ; BUMP THE HIGHEST CYLINDER) MOV R0,U.PRM+2(R5) ; UPDATE THE GEOMETRY(. MUL #<64.*32.>,R0 ; CALCULATE THE HIGHEST LBN, MOVB R0,U.CW2(R5) ; LOAD THE HIGH ORDER LBN0 MOV R1,U.CW3(R5) ; AND THE LOW ORDER DRIVE SIZE MOV (SP)+,R0 ; RESTORE R0,13$: MOVB #23,(R2) ;ISSUE PACK ACK TO SET VV15$: JMP DRFIN1 ;EXIT320$: MOV #IE.DNR&377,R0 ;DRIVE NOT READY ERROR CODET) BICB #US.VV,U.STS(R5);RESET VOLUME VALIDN BR 15$ ;EXIT625$: BIT #VV$UNL,I.PRM+2(R1) ; UNLOAD DRIVE REQUESTED?" BEQ 15$ ; IF EQ, NOPE, FINISH UP, CMPB RMDT(R2),#47 ; IS THIS A SHELBY DRIVE?) BNE 15$ ; IF NE, NOPE, DON'T TRY UNLOADL% BIT #MOL,RMDS(R2) ; IS MEDIA LOADED?R BEQ 15$ ; NOPE, FINISH UP ...V* MOVB #3,(R2) ; ISSUE THE UNLOAD FUNCTION BR 15$ ; AND FINISH UP;$; **-DRCLR-CLEAR DRIVE OR SUB-SYSTEM?; **-DRCLR1-ALTERNATE ENTRY TO CLEAR DRIVE W/O INTERRUPT ENABLET;AC; ISSUE A DRIVE CLEAR FUNCTION UNLESS THE SELECTED DRIVE/CONTROLLER;'; IS HUNG, THEN ISSUE SUB-SYSTEM CLEAR.A;R ; INPUTS:E;; R2=CSR ADDRESS; R5=UCB ADDRESS;P ; OUTPUTS:;;; SELECTED DRIVE IS CLEAREDE;$ .ENABL LSB,+DRCLR: TSTB (R2) ;IS THE CONTROLLER READY?E BPL 10$ ;IF PL NO$ BIT #1,(R2) ;IS GO BIT SET?  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 STACKI) BIC #7,(SP) ;CLEAR THE SUBFUNCTION BITS & CMPB #IO.ATT/256.,1(SP) ;IS IT ATTACH% BEQ 55$ ;IF EQ YES - L00ʆΆibjbkb a a aEAVE 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 YES0 CMP U.PRM(R5),#<<32.*256.>+64.> ; SHELBY DRIVE?( BEQ 40$ ; YUP, NOT A LAST TRACK DEVICE CLR R0 ;GET READY FOR THE BISB% BISB U.PRM(R5),R0 ;GET SECTORS/TRACKE4 ADD R0,I.PRM+12(R3) ;INCREMENT BLOCK # BY ONE TRACK! ADCB I.PRM+10(R3) ;AND THE CARRYN. MOV R3,R1 ;RESTORE PACKET ADDRESS FOR $BLKC21 CALL $BLKC2 ;SEE IF WRITE IS TO BAD SECTOR FILEM CLR R1 ;GET READY FOR THE BISB% BISB U.PRM(R5),R1 ;GET SECTORS/TRACKN% SUB R1,R0 ;CORRECT THE BLOCK NUMBER $ SBCB R2 ;AND THE HIGH BLOCK NUMBER BR 40$ ;CONTINUE+30$: MOV R1,R3 ;COPY POINTER TO I/O PACKET . 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 DESIRED CYLINDER ADDRES;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reserved.;:; THIS SOFTWARE IS FURNISHED UNDER LICENSE AND MAY BE USED>; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;; VERSION: 03.16;; PREVIOUSLY MODIFIED BY:;,; G. MARIGOWDA, J. MELVIN, P.WEISS, L. KOGAN;$; MODIFIED FOR RSX-11M-PLUS V4.4 BY:;; J. MELVIN 02-MAY-1990 03.12@; JJM0454 - DO NOT UPDATE CREDIT COUNT FOR ALL PACKET TYPES;; J. MELVIN 26-FEB-1992 03.131; JJM0481 - CORRECT USE OF I/O PACKET LENGTHy;n; J. MELVIN 28-FEB-1992 03.14sA; JJM0478 - INITIALIZE Q.INF FIELD BASED ON CONTROLLER MODELB;S; J. MELVIN 02-MAR-1992 03.15N,; JJM0482 - REINSERT DEBUG MACRO POINTS;:$; MODIFIED FOR RSX-11M-PLUS V4.5 BY:;; D. CARROLL 24-MAY-1993 03.160; DC215 - ADD C2.FRK FOR mP FORK CONDITION;4;:0 .IIF NDF,R$$UDA R$$UDA=0 ; INSURE IT IS DEFINED0 .IIF NDF,R$$MYA R$$MYA=0 ; INSURE IT IS DEFINEDI;======================================================================== H; THE FOLLOWING DEFINITIONS MAY BE CHANGED TO CUSTOMIZE THE MSCP DRIVERSI;========================================================================35MAXWBT = 8. ; MAXIMUM UMR WAIT BLOCK TABLE ENTRIES) ; MAXIMUM # OF I/O'S EACH CONTROLLER ' ; CAN HAVE OUTSTANDING AT ONE TIME52DUUMR = 4 ; PREALLOCATED UMR WAIT BLOCKS FOR DU2MUUMR = 2 ; PREALLOCATED UMR WAIT BLOCKS FOR MUG; DUTMO = ; DSA CONTROLLERS SEND THE HOST A TIMEOUT VALUE WHEN THEY ARE=B ; BROUGHT ONLINE. FOR DISK CONTROLLERS, THIS VALUE IS TYPICALLYA ; BETWEEN 30 SEC AND 2 MIN. IF THE CONTROLLER BECOMES UNAVAIL-=B ; ABLE, IT WILL TAKE THE HOST 2*(TIMEOUT VALUE)+3 SEC TO RESYNCH@ ; THIS TIME PERIOD IS LONGER THAN NECESSARY BECAUSE THE DRIVER@ ; DOES NOT IMPLEMENT SOME OF THE LONGER MSCP COMMANDS, SUCH AS? ; 'ERASE'. FOR SOME APPLICATIONS THE TIME DELAY SPECIFIED BYPA ; THE CONTROLLER MAY BE UNACCEPTABLE. DEFINING DUTMO WILL CAUSEE1 ; THIS VALUE TO BE USED FOR THE TIMEOUT PERIOD.U> ; **00҆vt__DATADATADATADATA***DO NOT***** USE THIS OPTION UNLESS YOUR APPLICATION@ ; ABSOLUTELY REQUIRES IT. IF YOU USE THIS OPTION, AND YOU EX-A ; PERIENCE INEXPLICABLY FAILED COMMANDS OR EXCESSIVE RESYNCHING @ ; RAISE THIS VALUE **BEFORE** SUBMITTING A PROBLEM REPORT. DO= ; NOT UNDER ANY CIRCUMSTANCES ATTEMPT TO USE VALUE < 5 SEC.? ; A COMPARABLE VALUE IS NOT INCLUDED FOR TAPE DRIVERS BECAUSE < ; THE REWIND COMMAND IS ONE OF THE LONGEST TMSCP COMMANDS.5SPNTMO = 20. ; # SECONDS TO DELAY BEFORE DOING GUS + ; TO RA81 IMMEDIATELY AFTER POWERFAIL.OF;=====================================================================; END OF ALTERABLE DEFINITIONSF;===================================================================== .NLISTMF;=====================================================================; DEFINE CST OFFSETS FOR DSAF;=====================================================================' .ASECT ; DEFINE CST OFFSETS FOR DSAM.=0.+C.STAT: .BLKW 1 ; CONNECTION STATE STATUSR C1.RDY = 1 ; READY. C1.ONL = 2 ; IN TRANSITION FOR 'CON ONL'+ C1.SCC = 4 ; WAITING FOR 'SCC' TO END=0 C1.GUS = 10 ; 'GUS' COMMAND MUST BE ISSUED0 C1.AVN = 20 ; 'AVL' COMMAND MUST BE ISSUED5 C1.SYN = 40 ; CNTRL SYNCHRONIZATION IN PROGRESS=8 C1.REC = 100 ; SYNCHRONIZATION RECOVERY - PHASE 17 C1.CON = 200 ; SYNCHRONIZATION RECOVERY - PHASE 2=3 C1.UMR = 400 ; ALLOCATE UMRS IF UNIBUS SYSTEMF5 C1.DQU = 1000 ; CALL $DQUMR WHEN EXITING DRIVERA* C1.FAT = 2000 ; FATAL ERROR OCCURRED3 C1.ABO = 4000 ; ABORT COMMANDS MUST BE ISSUED 3 C1.GCS = 10000 ; 'GCS' COMMAND MUST BE ISSUED + C1.TMO = 20000 ; TIMEOUT HAS OCCURRED;/ C1.R1 = 40000 ; RECOVERY - START ON-LINES;9 C1.R2 = 100000 ; RECOVERY - UNITS STILL SPINNING UP 1C.EXTN: .BLKW 1 ; RESERVED. DO NOT MOVE/REMOVE 5C.CMST: .BLKW 2 ; OLDEST OUTSTANDING COMMAND STATUS0.C.OLHD: .BLKW 2 ; OUTSTANDING IOPS LIST HEAD C.CMDS: .BLKW 1 ; CREDIT COUNT&C.VCID: .BLKB 1 ; VIRTUAL CIRCUIT ID/C.FLAG: .BLKB 1 ; CLASS DRIVER CONTROL FLAGO2 C2.SHD = 1 ; RECURSION DURING DISK SHADOWING' C2.FRK = 2 ; mP FORK BLOCK QUEUED 8C.REDO: .BLKW 1 ; OLDEST COMMAND TO REISSUE AT RESYNCH:C.REQU: .BLKW 2 ; QUEUE OF CMDS TO RESTART AFTER RESYNCH .IF DF E$$LOG9C.MLNG: .BLKW 1 ; LENGTH OF CONTROLLER ERROR LOG PACKETM'C.CRED: .BLKB 1 ; CREDIT/DEBIT COUNTSD&C.VCIX: .BLKB 1 ; VIRTUAL CIRCUIT ID#C.IP: .BLKW 1 ; SAVED IP REGISTER #C.SA: .BLKW 1 ; SAVED SA REGISTERT .ENDC ;E$$LOG .IF DF M$$EXT%C.UMCT: .BLKW 1 ; UMR COUNTER FIELD -C.UMRW: .BLKW MAXWBT ; UMR WAIT BLOCK TABLE. .ENDC ;M$$EXT-CSTLEN = <.-C.STAT>/2 ; CST LENGTH IN WORDSCG;======================================================================T; DEFINE QST OFFSETS FOR DSAG;======================================================================B .ASECT .=0T,Q.CST: .BLKW 1 ; ADDRESS OF ASSOCIATED CST2Q.STAT: .BLKW 1 ; PORT-TO-CONTROLLER LINK STATUS Q1.RDY= 1 ; READYG% Q1.OFF= 2 ; OFF-LINE (UNUSABLE)T$ Q1.SYN= 100000 ; SYNCHRONIZING6Q.SAD: .BLKW 1 ; INTERRUPT HANDLER ADDRESS (DYNAMIC)% .BLKB 1 ; RESERVED FOR DIGITAL USE 8Q.INF: .BLKB 1 ; CONTROLLER IDENTIFICATION INFORMATION, ; Q.INF DEFINITIONS APPEAR IN UDADF.MAC9Q.RSPN: .BLKB 1 ; NUMBER OF RESPONSE RING DESCRIPTORS=6Q.CMDN: .BLKB 1 ; NUMBER OF COMMAND RING DESCRIPTORS)Q.CTM: .BLKB 1 ; CURRENT TIME-OUT COUNT.&Q.RTY: .BLKB 1 ; CURRENT RETRY COUNT(Q.RING: ; RESPONSE RING AREA ADDRESS/Q.FRSP: .BLKW 1 ; FIRST RESPONSE RING ADDRESS .Q.LRSP: .BLKW 1 ; LAST RESPONSE RING ADDRESS.Q.FCMD: .BLKW 1 ; FIRST COMMAND RING ADDRESS-Q.LCMD: .BLKW 1 ; LAST COMMAND RING ADDRESSL9Q.RPAT: .BLKW 1 ; ADDRESS OF TABLE OF RSP PKT ADDRESSESP9Q.CPAT: .BLKW 1 ; ADDRESS OF TABLE OF CMD PKT ADDRESSESR0Q.STEP: ; SYNCHRONIZATION STEP BIT. OVERLAPS% ; Q.CRSP AND >MUST< REMAIN HERE. 6Q.CRSP: .BLKW 1 ; ADDRESS OF CURRENT RESPONSE PACKET2Q.INDX: ; SYNCHRONIZATION STEP INDEX. OVERLAPS% ; Q.CCM00چΆibjbkb a a aD AND >MUST< REMAIN HERE.N0Q.CCMD: .BLKW 1 ; FIRST COMMAND PACKET ADDRESS6Q.WRIT: .BLKW 4 ; VALUES TO WRITE TO SA DURING SYNCH9Q.TEMP: .BLKW 1 ; CONTROLLER SPECIFIC SCRATCH/WORK AREAB6Q.IOSQ: .BLKB 1 ; CONTROLLER SPECIFIC I/O SEQUENCE #% .BLKB 1 ; RESERVED FOR DIGITAL USEK0Q.CNTI: .BLKW 4 ; CONTROLLER T/MSCP IDENTIFIER!Q.ID = Q.CNTI+6 ; CONTROLLER IDS/Q.CSVR: .BLKB 1 ; CONTROLLER SOFTWARE VERSIONC/Q.CHVR: .BLKB 1 ; CONTROLLER HARDWARE VERSIONT,QSTLEN = <.-Q.CST>/2 ; QST LENGTH IN WORDS <;MJ;=========================================================================; DEFINE RCT DATA STRUCTURESJ;=========================================================================;+I; DEFINE THE ERROR LOG PACKET OFFSETS USED FOR COMMUNICATION BETWEEN FROMI; DUDRV AND RCT TO ERROR LOG. .=177776/M$RSF: .BLKW 1 ; REPLACEMENT STATUS FLAG WORDI+M$CRF: .BLKW 2 ; COMMAND REFERENCE NUMBEREM$UNIT: .BLKW 1 ; UNIT NUMBERO"M$SEQ: .BLKW 1 ; SEQUENCE NUMBERM$FMT: .BLKB 1 ; FORMATWM$FLAG: .BLKB 1 ; FLAGS=(M$OPCD: .BLKW 1 ; EVENT CODE / SUBCODE)M$CNTI: .BLKW 4 ; CONTROLLER IDENTIFIERT/M$CSVR: .BLKB 1 ; CONTROLLER SOFTWARE VERSION=/M$CHVR: .BLKB 1 ; CONTROLLER HARDWARE VERSIONE"M$MLUN: .BLKW 1 ; MULTIUNIT CODE#M$UNTI: .BLKW 4 ; UNIT IDENTIFIER )M$USVR: .BLKB 1 ; UNIT SOFTWARE VERSIONW)M$UHVR: .BLKB 1 ; UNIT HARDWARE VERSION:-M$CYL: .BLKW 1 ; CYLINDER (NOT USED BY RCT) (M$VRSN: .BLKW 2 ; VOLUME SERIAL NUMBERM$BLBN: .BLKW 2 ; BAD LBNLM$NRBN: .BLKW 2 ; NEW RBNKM$HED: .BLKW 1 ; HEADER CODE . = M$HEDOM$ORBN: .BLKW 2 ; OLD RBN M$CAUS: .BLKW 1 ; CAUSE+M$SIZ= . - M$RSF ; SIZE OF PACKET (BYTES)O;+6; REPLACEMENT STATUS FLAG WORD BIT DEFINITIONS (M$RSF);-MF$PRI=1 ; PRIMARY RBN USED)MF$SUC=2 ; REPLACEMENT SUCCESSFUL FLAGK%MF$ISF=40000 ; IGNORE STATUS FLAGS "MF$LNG=100000 ; LONG RCT PACKET .PSECTLN;=============================================================================; DRIVER WIDE MACRO DEFINITIONSRN;=============================================================================< .MACRO CALLV TYPE, RTN ; CALL AND RETURN FROM CLASS OR PORT .IF IDN ,T3 JSR PC,@120000+RTN ; CALL TO CLASS DRIVER ROUTINEO .ENDC ; CLASS .IF IDN ,2 JSR PC,@140000+RTN ; CALL TO PORT DRIVER ROUTINE .ENDC ; PORT  .ENDM ; CALLV= .MACRO JMPV TYPE, RTN ; JUMP TO CLASS OR PORT WITH NO RETURN= .IF IDN ,=0 JMP @120000+RTN ; JUMP TO CLASS DRIVER ROUTINE .ENDC ; CLASS .IF IDN ,/ JMP @140000+RTN ; JUMP TO PORT DRIVER ROUTINE= .ENDC ; PORTA .ENDM ; JMPV 2 .MACRO PUSH LIST ; PUSH LIST OF ITEMS ONTO STACK .IRP XX,, .IF IDN <#0> CLR -(SP) ; '0' ITEM .IFF ; #0 MOV XX,-(SP) ; NON-ZERO ITEMSP .ENDC ; #0 .ENDM ; IRP .ENDM ; PUSHE0 .MACRO POP LIST ; PULL LIST OF ITEMS OFF STACK .IRP XX,C MOV (SP)+,XX ; ALL ITEMS .ENDM ; IRP .ENDM ; POP= .MACRO $IDENT NAME,IDMAJ,IDMIN,TEXT ; SET UP MODULE IDENTITYIF .TITLE NAME V'IDMAJ'.'IDMIN 'TEXT ; NAME / VERSION NUMBER / TITLE1 .RADIX 10. ; ALWAYS USE DECIMAL VERSIONS 'MAJOR = 'IDMAJ ; MAJOR VERSIONX'MINOR = 'IDMIN ; MINOR VERSION / .RADIX 8. ; BACK TO THE NORMAL DEFAULTR .ENDM ; $IDENT;= .MACRO FUNCT FCN, OPCOD, PKTSIZ, PRO ; RSX TO T/MSCP MAPPINGS .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 .MACRO JMPTBL TYPE  .IF IDN , $ CLASID = 0 ; CLASS DRIVER VERSION! CLADAT = 2 ; PROCESS DATAGRAMS $ CLAEND = 4 ; DISPATCH END PACKETS- CLAERR = 6 ; PROCESS FATAL ERRORS / RESETS 1 CLACMD = 10 ; STATE PROCESSING, I/O INITIATION$' SCUCB = 12 ; SCAN UCB LIST FOR UCBSK$ CLASYN = 14 ; PERFORM CLASS SYNCH .ENDC ; CLASS .IF IDN ,$ PORTID = 0 ; PORT DRIVER VERSION1 PORSUP = 2 ; SET UP NECESSARY PORT INFORMATIOND4 PORINT = 4 ; GET RESPONSE P00↺t__DATADATADATADATAACKETS, INTERRUPT PROC1 PORSEN = 6 ; SEND COMMAND PACKET TO CONTROLLER 7 PORUMR = 10 ; ALL/DEALL STATIC UMRS, DYNAM WAIT BLKS- PKTAC = 12 ; ALLOCATE, ZERO COMMAND PACKET * PKTDR = 14 ; DEALLOCATE RESPONSE PACKET5 PKTCHK = 16 ; CHECK REQUIRED RESOURCES (NON-IMMED) * STOMP = 20 ; HARD INITIALIZE CONTROLLER2 CONCNT = 22 ; NUMBER OF CLASS DRIVERS CONNECTED1 PKTCH1 = 24 ; CHECK REQUIRED RESOURCES (IMMED)N& PORSYN = 26 ; PORT SYNCH PROCESSING2 MPPROX = 30 ; PLACE HOLDER. MPPRO DEFINED BELOW .ENDC ; PORT .ENDM ; JMPTBLEK;==========================================================================AK; NULL MACROS THAT ARE REPLACED BY LOGPU.MAC IF TERMINAL LOGGING IS DESIRED K;==========================================================================M .MACRO LOGDAT .ENDM .MACRO LOGCMD .ENDM .MACRO LOGRSP .ENDM .MACRO LOGSYN .ENDM .MACRO LOGSTP .ENDM .MACRO LOGRTN .ENDM .LISTJ;========================================================================= ; DRIVER WIDE SYMBOL DEFINITIONSJ;=========================================================================/RPLEN = 60. ; RESPONSE PACKET LENGTH (BYTES)M/CPLEN = 60. ; COMMAND PACKET LENGTH (BYTES)=/ENVLEN = 4. ; ENVELOPE LENGTH (BYTES)=/MPPRO = 30 ; OFFSET FOR $MPPRO VECTORED ADDRO.IO.0 = 0 ; ZERO ENTRY FOR I/O FUNCTION CODE1OP.0 = 0 ; ZERO ENTRY FOR T/MSCP FUNCTION CODER'FO.OP = 2 ; OFFSET FOR T/MSCP OPCODE=(FO.SZ = 3 ; OFFSET FOR SIZE OF PACKET4FO.CMD = 4 ; OFFSET FOR OPCODE PROCESSING ROUTINE.FOSIZ = 6 ; SIZE OF ENTRY IN DISPATCH TABLE)GUS.L = 6 ; GET UNIT STATUS CMD LENGTHR!ONL.L = 22 ; ONLINE CMD LENGTHE ABO.L = 10 ; ABORT CMD LENGTH#AVL.L = 6 ; AVAILABLE CMD LENGTH -GCS.L = 10 ; GET COMMAND STATUS CMD LENGTHF5SCC.L = 20 ; SET CONTROLLER CHARACTERISTIC CMD LENI)CMDINT = -4 ; COMMAND INTERRUPT OFFSETR*RSPINT = -2 ; RESPONSE INTERRUPT OFFSET"OWN = 100000 ; PACKET OWNER FLAGFLAG = 40000 ; FLAG)MSGLNG = -4 ; OFFSET TO MESSAGE LENGTHS+VCID = -1 ; OFFSET TO VIRTUAL CIRCUIT ID /CREDIT = -2 ; OFFSET TO MESSAGE/CREDIT FIELDC#MSGTYP = 360 ; MESSAGE TYPE MASKD"CRDDBT = 17 ; CREDIT/DEBIT MASK&VCDSK = 0 ; DISK VIRTUAL CIRCUIT ID&VCTAP = 1 ; TAPE VIRTUAL CIRCUIT ID/VCDIA = 255. ; DIAGNOSTIC VIRTUAL CIRCUIT IDA)MSGMUL = 20 ; MESSAGE FIELD MULTIPLIERD"MSGSEQ = 0 ; SEQUENTIAL MESSAGE MSGDAT = 1 ; DATAGRAM MESSAGEMSGCRD = 2 ; CREDIT MESSAGE MSGNNP = 3 ; NODE NAME PACKET%MSGMNT = 15. ; MAINTENANCE MESSAGE-,RETRY = 3. ; CONTROLLER ERROR RETRY COUNTSTMOC = 10. ; TIME-OUT COUNTI*RNGSIZ = 4 ; RSP RING DESCRIPTOR LENGTH+CMDSIZ = 4 ; CMD RING DESCRIPTOR LENGTH 9RSPLNG = RPLEN+ENVLEN ; TOTAL LENGTH OF RESPONSE PACKETC8CMDLNG = CPLEN+ENVLEN ; TOTAL LENGTH OF COMMAND PACKET+MSW = 2 ; MOST SIGNIFICANT WORD IN RINGS'UMRWTB = 20. ; SIZE OF UMR WAIT BLOCK1:.IIF DF M$$PRO UMRWTB=UMRWTB+2 ; ADD WORD FOR UNIBUS MASKNP = 3 ; NODE NAME PACKET% .TITLE BFCTLM .IDENT /01.10/ F;;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.1; All rights reservedS;SA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDR9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.+; ; VERSION 07;S; D. N. CUTLER 26-DEC-73;+; PREVIOUSLY MODIFIED BY:M;(; D. N. CUTLER; T. J. MILLER;K; MODIFIED BY:;I; T. J. MILLER 9-MAY-77;N*; TM082 -- SAVE AND RESTORE R5 IN $BLXIO.;A; T. J. MILLER 14-AUG-77; ;; TM099 -- REMOVE UNEEDED CONDITIONALIZATION FOR RSX-11M+.o;i; J. E. PROVINO 24-JUN-79,;c:; JP131 -- CHANGE CONDITIONALS FOR NEW REAL TIME DEVICES.;I; D. CARROLL 28-JUL-1994 ;08L;E=; DC296 -- INCLUDE SUPPORT FOR BLOCK MOVE INSTRUCTION WITHINE; ROUTINE $BLXIO;; D. CARROLL 19-April-1995 ;09R;O<; DC357 -- DON'T MAKE BLOCK MOVE A RUN-TIME TEST, HANDLE IT; WITHIN SAVE;.$; Modified for RSX-11M-PLUS V4.6 by:;E; D. Carroll 18-Oct-1995 01.10 ;; DC404 - Include PSECT definition to00Άibjbkb a a a allow ICB pool to beI ; fully expanded when able ...;E;R; BUFFER CONTROL ROUTINES1;-; MACRO LIBRARY CALLSO;E .MCALL HWDDF$$ HWDDF$ ;DEFINE HARDWARE REGISTERS. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404;+*; **-$GTBYT-GET NEXT BYTE FROM USER BUFFER;CB; 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 BEENM0; FETCHED, THE NEXT BYTE ADDRESS IS INCREMENTED.; ; INPUTS:I;u:; R5=ADDRESS OF THE UCB THAT CONTAINS THE BUFFER POINTERS.;d ; OUTPUTS:;<; THE NEXT BYTE IS FETCHED FROM THE USER BUFFER AND RETURNEDC; TO THE CALLER ON THE STACK. THE NEXT BYTE ADDRESS IS INCREMENTED. ;K*; ALL REGISTERS ARE PRESERVED ACROSS CALL.;- .ENABL LSBB0$GTBYT::MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESS' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGR) MOV U.BUF(R5),KISAR6 ;MAP TO USER BUFFERK8 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 UPDATEI;+(; **-$PTBYT-PUT NEXT BYTE IN USER BUFFER;H>; 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: ;B:; 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.;-.$PTBYT::MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING) MOV U.BUF(R5),KISAR6 ;MAP TO USER BUFFER3 MOVB 4(SP),@U.BUF+2(R5) ;STORE BYTE IN USER BUFFERX* MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING- MOV (SP)+,(SP) ;COLLAPSE STACK REMOVING BYTEN- BR 20$ ;TAKE COMMON EXIT FOR ADDRESS UPDATEE;+*; **-$GTWRD-GET NEXT WORD FROM USER BUFFER;PB; 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.I;6 ; INPUTS:E;R:; R5=ADDRESS OF THE UCB THAT CONTAINS THE BUFFER POINTERS.; ; OUTPUTS:;R<; 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.;-0$GTWRD::MOV (SP),-(SP) ;DUPLICATE RETURN ADDRESS' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGM) MOV U.BUF(R5),KISAR6 ;MAP TO USER BUFFERL7 MOV @U.BUF+2(R5),4(SP) ;GET NEXT WORD FROM USER BUFFERE* MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING- BR 10$ ;TAKE COMMON EXIT FOR ADDRESS UPDATEN;+(; **-$PTWRD-PUT NEXT WORD IN USER BUFFER;E=; THIS ROUTINE IS CALED TO PUT A WORD IN THE NEXT LOCATION INCD; USER BUFFER. AFTER THE WORD HAS BEEN STORED, THE NEXT WORD ADDRESS; IS CALCULATED.; ; INPUTS:.;-:; R5=ADDRESS OF THE UCB THAT CONTAINS THE BUFFER POINTERS.=; 2(SP)=WORD TO BE STORED IN THE NEXT LOCATION OF THE BUFFER.T;S ; OUTPUTS:;V8; THE WORD IS STORED IN THE USER BUFFER AND REMOVED FROM1; THE STACK. THE NEXT WORD ADDRESS IS CALCULATED.A;C*; ALL REGISTERS ARE PRESERVED ACROSS CALL.;-.$PTWRD::MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING) MOV U.BUF(R5),KISAR6 ;MAP TO USER BUFFERN1 MOV 4(SP),@U.BUF+2(R5);STORE WORD IN USER BUFFER,* MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING- MOV (SP)+,(SP) ;COLLAPSE STACK REMOVING WORDC410$: INC U.BUF+2(R5) ;CALCULATE ADDRESS OF NEXT WORD120$: INC U.BUF+2(R5) ;INCREMENT NEXT BYTE ADDRESST0 CMP U.BUF+2(R5),#160000 ;OVERFLOW 28K BOUNDARY? BLO 30$ ;IF LO NO % SUB #20000,U.BUF+2(R5) ;REDUCE BY 4KT+ ADD #200,U.BUF(R5) ;ADJUST RELOCATION BIASS 30$: RETURN .DSABL LSBI;+2; **-$GTCWD-GET NEXT WORD FROM USER CONTROL BUFFER;TC; THIS ROUTINE IS CALLED TO GET THE NEXT WORD FROM THE USER CONTROLME; BUFFER AND RETURN IT TO THE CALLER ON THE STACK. AFTER THE WORD HASC4; BEEN FETCHED, THE NEXT WORD ADDRESS IS CALCULATED.; ; INPUTS:D;0:; R5=ADDRESS OF THE UCB THAT CONTAINS THE BUFFER POINTERS.;R 00t__DATADATADATADATA; OUTPUTS:;RD; 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 MAPPINGA1 MOV U.CBF(R5),KISAR6 ;MAP TO USER CONTROL BUFFERD7 MOV @U.CBF+2(R5),4(SP) ;GET NEXT WORD FROM USER BUFFER * MOV (SP)+,KISAR6 ;RESTORE CURRENT MAPPING3 ADD #2,U.CBF+2(R5) ;CALCULATE ADDRESS OF NEXT WORDH- BIT #20000,U.CBF+2(R5) ;OVERFLOW 4K BOUNDRY?L BEQ 10$ ;IF EQ NO + BIC #20000,U.CBF+2(R5) ;CLEAR OVERFLOW BITE+ ADD #200,U.CBF(R5) ;ADJUST RELOCATION BIAS.10$: RETURN ;1 .ENDC;+; **-$BLXIO-MOVE BLOCK OF DATA.-;)C; THIS ROUTINE IS CALLED TO MOVE DATA IN MEMORY IN A MAPPED SYSTEM.;V ; INPUTS:K;R; R0=NUMBER OF BYTES TO MOVE.; R1=SOURCE APR5 BIAS.; R2=SOURCE DISPLACEMENT.F; R3=DESTINATION APR6 BIAS.O; R4=DESTINATION DISPLACEMENT.;( ; OUTPUTS:;A!; DESCRIBED MOVE IS ACCOMPLISHED.. ; R0 ALTERED; R1,R3 PRESERVED8; 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; MEANS A MAXIMUM OF 4K-63).O;-$BLXIO::MOV R5,-(SP) ;SAVE R5% MOV #KISAR6,R5 ;POINT TO KERNAL APR6T! MOV (R5),-(SP) ;SAVE KERNAL APR6.. MOV R3,(R5) ;SET UP KERNAL APR6 FOR TRANSFER" MOV -(R5),-(SP) ;SAVE KERNAL APR5. MOV R1,(R5) ;SET UP KERNAL APR5 FOR TRANSFER .IF NDF N$$MOVA%10$: MOVB (R2)+,(R4)+ ;MOVE NEXT BYTE  DEC R0 ;MORE TO MOVE?D BNE 10$ ;IF NE YES S$$BLX == 0N S$$BRB == 0  .IFFB S$$BLX ==. MOVR$ R2,R4,R0 ; MOVE ALL DATAS BR 90$ ; ALL DONES5. = S$$BLX ; **WARNING** THE NEXT INSTRUCTION MAY BE:0; ; OVERWRITTEN WITH THE PREVIOUS INSTRUCTION; ; SEQUENCE. MOV #1,-(SP) ;PUSH LOW BIT MASK" BIT (SP),R2 ;SOURCE ADDRESS ODD? BEQ 10$ ;IF EQ NOS" MOVB (R2)+,(R4)+ ;MOVE FIRST BYTE DEC R0 ;REDUCE COUNT+10$: BIT (SP),R4 ;DESTINATION ADDRESS ODD?R( BNE 50$ ;IF NE YES, PERFORM BYTE MOVES)20$: SUB #N$$MOV*2,R0 ;MOVE ENTIRE BLOCK?= BCC 40$ ;IF CC YES# BIC R0,(SP) ;REMAINING COUNT ODD?R BNE 30$ ;IF NE NOB DEC R0 ;ADJUST NEGATIVE COUNT -30$: SUB R0,PC ;INDEX INTO MOVE INSTRUCTIONS 40$: ;REF LABEL .REPT N$$MOVC 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 S$$BRB ==/2>> .ENDC% MOV (SP)+,(R5)+ ;RESTORE KERNAL APR5O$ MOV (SP)+,(R5) ;RESTORE KERNAL APR6 MOV (SP)+,R5 ;RESTORE R5U RETURN ;# .ENDR0 ;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 S$$BRB ==/2>> .ENDC% MOV (SP)+,(R5)+ ;RESTORE KERNAL APR5O$ MOV (SP)+,(R5) ;RESTORE KERNAL APR6 MOV (SP)+,R5 ;RES .TITLE RDDRV  .IDENT /05.00/ ;+ 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; 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:; ; B. S. McCarthy 3-OCT-82 3.1; 4; BM258 -- correct driver to use $CKBFB for buffer; checking due to P.IOC; $; Modified for RSX-11M-PLUS V4.5 by:; !; D. Carroll 26-April-1995 04.003; DC360 -- vectoring common (alway00Άibjbkb a a as used) drivers ;.$; Modified for RSX-11M-PLUS V4.6 by:;5; D. Carroll 18-Oct-1995 05.006; DC404 -- Correct problem in powerfail routine which3; corrupts the system stack on the second power-y ; fail ...w; ; ; Reconfiguration control driver;d;+C; The reconfiguration control driver provides the interface between D; user command level tasks which generate requests to perform systemG; reconfiguration functions and to return system status indications and6-; a priviledged reconfiguration control task..E; This driver access and address checks QIO requests from the command.D; 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!VC$RD ==0 ; RD: is now vectoredsLD$RD ==0 ; RD: is loadabler .MCALL OLRDF$,UCBDF$t3 OLRDF$ ; Define online reconfiguration interfacee UCBDF$ ; Define UCB offsets;d; Define local variables;k0 U.LIST=U.CNT+2 ; Listhead for packet extension;i; Driver dispatch tablet;r/ DDT$ RD,1,NONE ; Define driver dispatch table.;+"; Executive vector table for rddrv;-.EXEVEC: .WORD D.VINT ; executive vector table&GTPKT:: .WORD $GTPKT ; Get I/O packet'SSTS:: .WORD S.STS ; Controller statuss3ALOCB:: .WORD $ALOCB ; allocate primary pool blockL/DEACB:: .WORD $DEACB ; deallocate primary poolf.HRCPT:: .WORD $HRCPT ; pointer for hrc... TCB)QRMVF:: .WORD $QRMVF ; Queue remove fifo)QINSF:: .WORD $QINSF ; Queue insert fifon)EXRQN:: .WORD $EXRQN ; activate task ...%CKBFB:: .WORD $CKBFB ; check bufferc4EXRQP:: .WORD $EXRQP ; Activate and queue priority5GTWRD:: .WORD $GTWRD ; get word from control bufferK*IOFIN:: .WORD $IOFIN ; finish I/O packet.QINSP:: .WORD $QINSP ; queue insert priorityCRELOC:: .WORD $RELOC ; relocate and convert to address doublewordlEXEND:;+9; **-RDINI- Reconfiguration driver initiatior entry point ;R;QB; 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 calledlE; directly from the directive service code to validate the additional D; 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 packet; R4= address of SCBd; R5= address of UCBd;f%; The packet is formatted as follows:s; ; i.lnk: I/O queue thread worda; i.pri: request priority; i.efn: event flag numbera*; i.TCB: address of tcb of requestor task:; i.ln2: address of LUN2 word in header of requestor task; i.UCB: address of ucb; i.fcn: I/O function codee.; 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)/; i.AST: virtua address of ast service routineC-; i.prm: relocation bias of first I/O buffer=; +2: displacement to first I/O buffer (relative to apr6)y+; +4: size in bytes of first I/O bufferr; +6:b; +10: ; +12:2 ; +14:f ; +16:i;e-; I/o function codes serviced by this driver:b; B; io.mfc = 0,1 multiple functions and I/O parameters are supplied; in the users buffer); io.rsc = 0,2 read system configurations; io.att = 0,3 attach to unit!; io.det = 0,4 deatach from unita*; io.wsc = n,6 write system configuration; 'n' is a function code.;;-(RDINI: TST EXEVEC ; vectors translated? BNE 10$ ; if NE, yes, continue# MOV R1,-(SP) ; Save packet addressb MOV R4,-(SP) ; and SCB address * CALL RDPWF ; translate executive vecto00t__DATADATADATADATArs MOV (SP)+,R4 ; restore SCB  MOV (SP)+,R1 ; and IOPe)10$: MOV R1,R3 ; Copy address of packet + ADD #I.FCN,R1 ; And point to function codes! CMPB #IO.ATT/400,1(R1) ; Attach?, BEQ 95$ ; Yes, go enqueue - CMPB #IO.DET/400,1(R1) ; How about a detach?y BEQ 95$ ; Yes, same operation.9 CMP #IO.RSC,(R1) ; Is this a 'read full configuration'?a- BEQ 95$ ; Yes, then just go enqueue requestR2 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. 3 ; For the remainder of the functions the caller , ; 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 address1 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;+; ?; Come here if this is either a 'write device configuration' oro; '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 noth;+B; Change input buffer descriptor to reference user supplied buffer;-+ ADD #I.PRM+0,R3 ; 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.+440$: ; At this point U.BUF/U.CNT refer to either, ; the remainder of the parameters in the. ; packet itself (for a io.wsc function) or/ ; to the users specification buffer (for anM ; 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 bigS8 CALL NXTNOD ; Allocate the first packet extension node/ ; And link it to the packet extension list. # BCS 110$ ; Br if allocation errort-50$: MOV (SP),R1 ; Get packet address again 2 BEQ 150$ ; Br if this was a oneshot qio (io.wsc)/ ; and we have finished parameter processinga* MOV I.FCN(R1),R0 ; Get user function code) SWAB R0 ; Get function code to low byte ( 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 code" ; 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;+; Validate next function codeI;-G70$: CMPB #IO.WSC/400,R0 ; This must be a write configuration functiont BNE 100$ ; Illegal functionl SWAB R0 ; Get subfunction ) CMPB #MAXFC,R0 ; Verify code is in rangei" BLO 100$ ; Illegal function code: CALL PUTWRD ; Put function code to packet extension list# BCS 110$ ; Br if allocation errore$ CLR R1 ; Count required parameters BIC #^C377,R0 ; Isolate command# BEQ 100$ ; Br if illegal functiond+ MOVB LEGFCN-1(R0),R0 ; Pickup control bytei$ 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 command*80$: MOV #IE.SPC&377,R0 ; Parameter error BR 120$ ; Take error exiti(95$: BR 170$ ; Relay branch from above1100$: MOV #IE.IFC&377,R1 ; Illegal function codeF;110$: MOV R1,R0 ; Code was set by detecting routine aboves$120$: TST (SP)+ ; Remove flag word" MOV (SP)+,R3 ; Get packet address7125$: CLR R1 ; Reset second word of I/O status return#' CALL @IOFIN ; And return error statusO; 9; Now clear any partial packet ext00 Άibjbkb a a aension list built abover;%130$: MOV R5,R0 ; Point to listheadO ADD #U.LIST,R0; CALL @QRMVF ; Remove next node" BCS 200$ ; Br if no more in list+ MOV R1,R0 ; Set address of node to return7( MOV #I.LGTH,R1 ; And set allocated size* CALL @DEACB ; Return node to system pool BR 130$ ; Go for next in listf;o-; Process privileged task mode change request ;R7140$: MOV I.TCB(R3),R2 ; Pick up requestor TCB addressN* BIT #T3.PRV,T.ST3(R2) ; Is it privileged?0 BEQ 146$ ; Br if no. non-privileged requestors ; Just wake up hrc... ; ADD #I.PRM+0-I.FCN,R1 ; Advance pointer to first parametern1 BIC (R1),U.CW2(R5) ; Reset 'mask' from mode bits, COM (R1) ; Obtain 'not mask'9 BIC (R1)+,(R1) ; And ensure 'true' bits dont contain anyB. ; Other than what were specified in 'mask'< BIS (R1),U.CW2(R5) ; And set in new bits into mode control.146$: 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 accordinglyk1147$: 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;17150$: CLR R0 ; Set a zero command as a stopper in the$ ; Packet extension% CALL PUTWRD ; Put to extension listv# BCS 110$ ; Br if allocation error160$: TST (SP)+ ; Remove flagL" MOV (SP)+,R3 ; Get packet address;4E; Copy packet extension listhead to the packet and enqueue the packetc; To the SCB queue.h;*170$: MOV R3,R1 ; Restore packet adderssB MOV U.LIST+0(R5),I.PRM+14(R1) ; Copy extension listhead to packet175$: CLR U.LIST(R5) ;e% 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 listheadD* CALL @QINSP ; And insert packet in queue& ; Fall through into packet dequeue;e,; Fetch the next packet from the input queue6; Perform attach and detach functions as a side effect;e4180$: BICB #US.BSY,U.STS(R5) ; Mark driver not busy# MOV U.SCB(R5),R4 ; Get SCB addressM% ADD SSTS,R4 ; Adjust to status worde& CLRB (R4) ; To allow another dequeueE GTPKT$ RD,1,130$,,T ; Get next packet from queue or return to caller+;+; Input:; R1= address of next packet ; R4= address of SCB; R5= address of UCBe;p; Packet format:; ; as above.;-3 MOV @HRCPT,R0 ; Get address of hrc processing taske) BNE 190$ ; Br if service task availableu& MOV #IE.OFL&377,R0 ; 'device' offline MOV R1,R3 ; Set up for $iofine0 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 listhead.185$: MOV R2,U.LIST+2(R5) ; LAST node pointer' MOV (R2),R2 ; Look for real lAST node= BNE 185$ ; Not yet2187$: CALL 125$ ; Do I/O done on this packet and# ; Elimenate any parameter lists( BR 180$ ; Go reset device not busy and ; Check for another packet@190$: CALL @EXRQP ; Enqueue to hrc and activate if not already BR 180$ ; Go for next packet;++; Powerfail and timeout driver entry points;-200$:;RDOUT:RDCAN: RETURN-RDPWF: TST EXEVEC ; Vector table translated?  BNE 80$ ; if ne, yes$ MOV R5,-(SP) ; save our UCB address& MOV KINAR6,-(SP) ; Save Kernel-I apr6/ MOV @#112,R0 ; Get address of table of entriesa3 MOV @(R0),KINAR6 ; Map common through i-space apr6 + MOV #EXEVEC,R3 ; Point to our vector table 1 MOV #</2>-1,R2 ; set up the lengthh+ CALL @#140004 ; Translate the vector tableo) MOV (SP)+,KINAR6 ; Restore Kernel-I apr6e) MOV (SP)+,R5 ; Restore our UCB ;DC404:#80$: RETURN ; All done ;DC404E ;**-2 ;+; Utility routines;-;+A; Copy parameters or buffer descriptors to extension as indicatede; In the control byte.;-+MOVPAR: BIC #^C17,R0 ; Isolate control bits) BEQ 15$ ; Br if done" MOV R0,R2 ; Copy parameter c00t__DATADATADATADATAount310$: CALL GETWRD ; Get next word from user buffer1$ 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 errorC& SOB R2,10$ ; Loop for all parameters 15$: RETURN3MOVDES: BIC #^C17,R0 ; Isolate count of descriptorst BEQ 35$ ; Br if none to move MOV R5,-(SP) ; Save a registern MOV R0,-(SP) ; Save the count@10$: CALL GETBUF ; Get next buffer descriptor from user buffer1 BCS 28$ ; Branch if input exhausted prematurelyn 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 offset02 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 extension925$: INC (SP)+ ; Clear stack without changing carry bitr BCS 30$ ; Exit if errorr% DEC (SP) ; Dec count of descriptors  BNE 10$ ; Loop"28$: INC (SP)+ ; Clean the stack'30$: MOV (SP)+,R5 ; Restore a register35$: RETURN ;;nC; Get a buffer descriptor from the user, address check and relocaten; To an apr6 base plus offset.;t4GETBUF: CALL GETWRD ; Get virtual address of buffer BCS 50$ ; Br if no moreu MOV R1,R0 ; Set address  CALL GETWRD ; Get size wordn BCS 50$ ; Br if no moreC$ MOV R1,-(SP) ; Save size for return BNE 5$ ; Br if real descriptor' CLR R2 ; Indicate no buffer available1 BR 40$ ; Complete scan-5$: CALL @CKBFB ; Check and lock the buffers7 BCS 40$ ; And exit if there is a buffer mapping errorf+ CALL @RELOC ; And relocate to apr6 offsetd'40$: MOV (SP)+,R0 ; Return buffer size 50$: RETURN;+1; Get next word from user input buffer or packet.r;-/GETWRD: MOV #IE.BAD&377,R1 ; Assume fetch error * SUB #2,U.CNT(R5) ; Account for word taken BCS 10$ ; Br if no more 9 CALL @GTWRD ; User system routine to address the bufferd MOV (SP)+,R1 ; Load value CLC ; Ensure carry clear$ 10$: RETURN;+#; Put word to packet extension listn;x; Input:; R0=word to putn*; R3=bytecount of space remaining in node; R4=node fill pointerS;-.PUTWRD: SUB #2,(R3) ; Account for space taken$ BGE 20$ ; Br if space is available! ADD #2,(R3) ; Correct underflowA5 CALL NXTNOD ; Allocate next node and link it to theo ; Extension list BCC PUTWRD ; Try again BR 30$ ; Allocate error %20$: MOV R0,(R4)+ ; Put word to node+ 30$: RETURN;CH; Allocate another node for the packet extension list and link it to the; Listhead at u.list+0,+2 ;=%NXTNOD: JSR R2,$SAVVR ; Save r0,r1,r2m, 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' / MOV R4,R3 ; Copy pointer to 'space remaining'r3 SUB #4,(R4)+ ; Adjust to actual space and point toe ; First fill location $ MOV R3,-(SP) ; Against modification4 CALL @QINSF ; Insert node at end of extension list! MOV (SP)+,R3 ; Restore registersA RETURNl+10$: MOV #IE.NOD&377,R1 ; Allocation error RETURN4; 0; Specification of legal functions and arguments;, .MACRO CMD NAME $$$TMP=.D .=LEGFCN+-1 .BYTE IO$'NAME&377M .IIF GT .-$$$TMP $$$TMP=. .=$$$TMPM $$$CNT=$$$CNT+1 .ENDM $$$CNT=0iLEGFCN:B* CMD ONL ; Online, two buffer descriptors+ CMD OFL ; Offline, two buffer descriptorsP/ CMD MAI ; Maintenance, two buffer descriptorst CMD ONE ; On condition CMD IF ; If conditione( 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 wordsL CMD STA ; Return device status! CMD RLI ; Link, two descriptorsP"00ibjbkb a a a 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 descriptore> 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 wordsL CMD STA ; Return device status! CMD RLI ; Link, two descriptorsP" .TITLE DCSUB - Subroutines/ .IDENT /05.00/ .IF DF D$$CHE;;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.L; All rights reserved.;m; Original author:; John Gemignani;r; Previously modified by:E;Y ; D. Carroll ; J. Kauffmann; L. B. McCulley;V$; Modified for RSX-11M-PLUS V4.6 by:;e; D. Carroll 08-Jan-1996 05.00e*; DC430 - Include support for 32-bit LBNs;a;aE; This module contains various routines to support disk data caching.T;) .MCALL HDRDF$ .MCALL SHDDF$& HDRDF$ ; Define the Header offsets SHDDF$ .PSECT DC$SUB,RO,Io i8 .SBTTL SEARCH - Search for the first overlapping extentF .SBTTL SRCHP - Search for next overlapping extent (from set position);+; SEARCH passed:'; R1 -> User's I/O request packet (URP) ; UCBX mappedf;R; SRCHP passed:b"; R0 -> CED at which search begins ; R1 -> URP0; Cache partition mapped; ;s ; Returned:hC; R2 := LSB (Least Significant Part) of the highest requested block)#; R3 := MSP (Most Significant Part)H(; R4 := Length of the transfer in blocks;$; CC: R0 -> First overlapping extent&; CS: Indicates no overlapping extentsA; H.TMP -> CED prior to current (zero denotes beginning of list)s;p; Cache partition mapped;- .enabl lsbrSEARCH::0 MOV APR6.BASE+X.CCED, R0 ; Get the first extent$ MP$PAR ; Map the cache partition5 CLR APRD.BASE+H.TMP ; init the lbn list position toe BR 10$ ; and start search3SRCHP:: ; partial search - position in CED list 8 MOV R0,APRD.BASE+H.TMP ; beginning of list as current p BNE 10$ ; ok, start searching+ MP.UCBX ; no current position, map UCBXp( BR SEARCH ; and SEARCH from beginning<10$: MOV I.PRM+P4(R1), R3 ; Get MSP of requested LBN ;DC430D BIT #DV.32B,U.CW1(R5) ; does this device support 32-bit LBNs ;DC430* BNE 11$ ; if NE, yes, continue ;DC4301 BIC #177400,R3 ; clean up the high byte ;DC430o ;DC430-11$: MOV I.PRM+P5(R1), R2 ; and LSP ;DC430a ;**-2o) MOV R2, -(SP) ; Put a copy on the stacke MOV R3, -(SP)/ CALL CLCLEN ; calculate xfr length in blocksM( DEC R4 ; Backup one block temporarily0 ADD R4, 2(SP) ; Calculate highest LBN requeste ADC (SP) ; Carry if necessary* INC R4 ; Restore to full size requested0 TST R0 ; are we at beginning of an empty list- BEQ 50$ ; If EQ, no CED to scan = all done4;R5; Don't forget that the extent high LBN is stored +1.;:15$:: CMP R3, E.LBNH+2(R0) ; Might this extent overlap? ;DC4300 BHI 20$ ; If HI, no, check next extent ;**-1 BLO 30$ ; If LO, yesc- CMP R2, E.LBNH(R0) ; Double word comparisona BLO 30$ ; If LO, yesy<20$: MOV R0, APRD.BASE+H.TMP ; Update pointer to current CED& MOV E.LNXT(R0), R0 ; Get next extent BNE 15$ BR 50$rC30$: CMP (SP), E.LBNL+2(R0) ; Does this extent truly overlap ;DC430 BHI 40$ ; If HI, yes ;**-1 BLO 50$ ; If LO, no/ CMP 2(SP), E.LBNL(R0) ; Double word comparison BLO 50$ ; If LO, no$40$: CLC ; Indicate overlap found BR 60$I!50$: SEC ; Indicate no overlapB60$: MOV (SP)+, R3 MOV (SP)+, R2 RETURNu .dsabl lsba4 .sbttl + CLCLEN, Calculate transfer length from URP;+G; CLCLEN - Calculate length of transfer in blocks, from I/O packet bytee ; count;B; Input: ; R1 - URP,;L ; Output: "; R4 - Number of blocks requested;; All other registers preserved;-;CLCLEN::MOV I.PRM+P2(R1), R4 ; Get the request size (bytes)a ADD #777, R4 ; Round up ' ROR R4 ; Bring carry in as high bit.d, SWAB R4 ; Finish righ00"t__DATADATADATADATAt shift of nine bits' BIC #177400,R4 ; Clear unwanted bits. RETURNu s@ .SBTTL + GETCRP - allocate Cache Rqst Pkt and save URP contents;+<; **-GETCRP - allocate Cache Rqst Pkt and save URP contents;t ; Passed: 5; R1 -> User I/O Request Packet (URP, in system pool)R; ; Cache Partition mapped; ; Returned: C; CS - CRP allocation failed (unlikely, FREAGE should free resourcee@; CC - Cache Request Packet (CRP) successfully allocated in pool; &; R2 -> CRP, URP values copied to CRP6; (see DCPRE for CRP contents and offset definitions); I.AADA (R1) -> CRP0; I.AADA+2 (R1) = 0 for later use as CED pointer;-+GETCRP::MOV R0,-(SP) ; Save work registersa& MOV R1,-(SP) ; Save pointer register,10$: MOV #R.LGTH,R1 ;Set length to allocate3 .if df,p$$ctl ; pool monitoring support included? ; MOV #<3*I.LGTH>,-(SP) ; add margin for i/o pkts in minimuml! .if df,i$$cbp ; using ICB pool?t4 TST $PRILL ; is it set at ICB pool for the limit?* BMI 12$ ; if MI, just require some pool .endc ;df,i$$cbpn3 ADD $PRILL,(SP) ; free at which to use pool firstA'12$: CMP $PRISZ,(SP)+ ; more now free?r) BLOS 15$ ; no, use internal pool firsti .iftf ; p$$ctlP$ CALL $ALOCB ; try to use sys pool BCC 100$ ; ok" MOV (SP),R1 ; set up for USTAT$ USTAT$ 0,#APR6.BASE+S.POL MOV #R.LGTH,R1 ; reset length;%15$: CALL .ALOCB ;Request the space. BCC 100$ ;Got space" MOV (SP),R1 ; set up for USTAT$ USTAT$ 0,#APR6.BASE+S.PSP MOV #R.LGTH,R1 ; reset lengthm .ift ; p$$ctl$ CALL $ALOCB ; try to use sys pool BCC 100$ ; ok" MOV (SP),R1 ; set up for USTAT$ USTAT$ 0,#APR6.BASE+S.POL .endc. CALL FREAGE ;Delete oldest CED to free pool- BCC 10$ ;and try again (should succeed nowM BR 90$ ;nfg, return a failure7100$: MOV R0,R2 ; set pointer register to be returned;0 MOV (SP),R1 ; restore User Request Packet ptr% MOV R1,R.URP(R2) ; point CRP to URPt< MOV I.AADA(R1),R.AADA(R2) ; save URP attachment ptrs in CRP MOV I.AADA+2(R1),R.AADA+2(R2)' MOV R2,I.CRP(R1) ; set CRP ptr in URPB+ CLR I.ACED(R1) ; clear CED pointer in URP ;+5; Save initial User I/O Request Packet (URP) context.E;-4 MOVB I.FCN(R1),R.FCN(R2) ; save I.FCN modifier byte5 MOVB I.EFN(R1),R.EFN(R2) ; save virtual user op flagu6 MOV I.IOSB+2(R1),R.IOSB2(R2) ; save user IOSB address9 MOV I.IOSB+4(R1),R.IOSB2+2(R2) ; save user IOSB APR baseM7 MOV I.PRM+P1.1(R1),R.P1.1(R2) ; save user I.PRM values. MOV I.PRM+P1.2(R1),R.P1.2(R2) MOV I.PRM+P2(R1),R.P2(R2)0 CLR R.P3(R2) ; initialize the total byte count MOV I.PRM+P4(R1),R.P4(R2) MOV I.PRM+P5(R1),R.P5(R2)190$: MOV (SP)+,R1 ; restore URP ptr for failurese, MOV (SP)+,R0 ; restore both work registers RETURNeA .SBTTL + RFRSHP -- refresh original User Request Packet from CRPI;+@; RFRSHP refreshes User Request Packet with original parameters!; saved in Cache Request PacketM8; NOTE: does not mung driver status return in I.PRM+P3;M ; Passed:. ; R1 -> URPR; ; Returns:; URP refreshedC ; R2 -> CRP;; All other registers preserved;-4RFRSHP::MOV I.CRP(R1),R2 ; get CRP pointer from URP) CMP (R2),R1 ; is this the correct CRP?i BEQ 5$ ; if EQ, nope ...o0 FATAL$ BE.DDA ; double deallocation attempted:5$: MOVB R.FCN(R2),I.FCN(R1) ; restore I.FCN modifier byte8 MOVB R.EFN(R2),I.EFN(R1) ; restore virtual user op flag9 MOV R.IOSB2(R2),I.IOSB+2(R1) ; restore user IOSB addressm< MOV R.IOSB2+2(R2),I.IOSB+4(R1) ; restore user IOSB APR base= MOV R.P1.1(R2),I.PRM+P1.1(R1) ; restore current I.PRM values  MOV R.P1.2(R2),I.PRM+P1.2(R1)> MOV R.P2(R2),I.PRM+P2(R1) ; don't mung I.PRM+P3 driver status MOV R.P4(R2),I.PRM+P4(R1) MOV R.P5(R2),I.PRM+P5(R1) RETURN ; .SBTTL + UPDPKT -- refresh URP and update for segments xfrI;+K; UPDPKT -- refresh URP then update params for segments previously transfera;s ; Passed: ; R1 -> URPR;I ; Return: ; R2 -> CRPr;S;-/UPDPKT::CALL RFRSHP ; refresh original params H ; update request parameters for bytes t00*ibjbkb a a aransferred in all prev sequences. MOV R4,-(SP) ; save work register for CLCLEN0 MOV R.P3(R2),R4 ; get bytes transferred so far> ADD R4,I.PRM+P1.2(R1) ; update next user buffer phys address< ADCB I.PRM+P1.1+1(R1) ; maybe carry into hi order phys addr+;NOTE -> ; NOTE - requires 22-bit systemd/ SUB R4,I.PRM+P2(R1) ; reduce length remaining 7 MOV I.PRM+P2(R1),-(SP) ; save count of requested bytes-: MOV R4,I.PRM+P2(R1) ; change to bytes transferred so far0 CALL CLCLEN ; return blocks transferred in R48 ADD R4,I.PRM+P5(R1) ; update next starting LBN request$ ADC I.PRM+P4(R1) ; ..double prec..: MOV (SP)+,I.PRM+P2(R1) ; restore count of requested bytes& MOV (SP)+,R4 ; restore work register RETURNm7 .SBTTL + RLSCRP -- refresh URP from CRP and delete CRPi;+C; RLSCRP refresh URP with original context from CRP then delete CRP6; Offset R.P3 has been used to accumulate total bytes:; transferred by segments processed previously, propogate;; it into I.PRM+P3 in case it should be returned by $IOFIN,;R ; Passed: ; R1 -> URPt; I.CRP(R1) -> CRP;C ; Returns:; R2 destroyed,c; URP updated,; CRP deleted.;-+RLSCRP::CALL RFRSHP ; refresh URP from CRP;5 MOV R.P3(R2),I.PRM+P3(R1) ; propogate transfer total  CALL DELCRP ; delete CRP RETURN+6 .SBTTL + DELCRP - Deallocate cache request descriptor;+ ; Passed:; R2 -> CRP to deallocatet;c; Cache Partition mapped;s ; Returned:; All registers preservedp;- DELCRP::MOV R0, -(SP) ; save R0 MOV R1, -(SP) ; and R1O' MOV R.URP(R2),R1 ; get address of URP(3 CMP I.CRP(R1),R2 ; does this URP point to the CRPa BEQ 5$ ; yes, continue ...P& FATAL$ BE.DDA ; double deallocation05$: TST I.ACED(R1) ; do we have an attached CED% BEQ 7$ ; if EQ, nope, continue ...R. FATAL$ BE.CAA ; CED is attached at deletion77$: MOV R.AADA(R2),I.AADA(R1) ; restore URP attachments+ MOV R.AADA+2(R2),I.AADA+2(R1) ; both parts ( MOV R2,R0 ; set CRP address to delete6 MOV #R.LGTH, R1 ; Length of cache request descriptor" CALL .DEACB ; Release the block MOV (SP)+, R1 ; restore R1 MOV (SP)+, R0 ; and R05 RETURN,2 .SBTTL + Q2PHS1 queue operations to phase 2 queue2 .SBTTL + Q2PHS2 queue operations to phase 2 queue;+6; Q2PHS1 - queue request to phase II, and force a fork&; Q2PHS2 - queues a request to phase 27; (used in DCCTL if other requests remain in rundown)V;A;+; Input:"; R1 - URP to queue into phase II;;; Cache partition mapped;-Q2PHS1::- BISB #CS.DNF,APRD.BASE+H.CSTS ; force a forkLQ2PHS2::9 CMP APRD.BASE+H.PAVL,#3 ; is this really a cache region?(% BNE 10$ ; nope, go die in disgraceB9 MOV R1,@APRD.BASE+H.PKTQ+2 ; queue us to be the last oneH7 MOV R1,APRD.BASE+H.PKTQ+2 ; set pointer to end of liste CLR (R1) ; show end of list RETURN 110$: FATAL$ BE.IDC ; cache partition not mappedC? .SBTTL + Q2DRVR queue operations to driver during deactivation ;+B; Q2DRVR - queue request for dispatch after deactivation completes@; (called from DCCHE and DCCTL during deactivation processing);A; Input:"; R1 - URP to queue into phase II;-'Q2DRVR::MP.PAR ; map cache partitionM MOV R1,@APRD.BASE+H.DACTQ+2 MOV R1,APRD.BASE+H.DACTQ+2M CLR (R1)B RETURNQ s .SBTTL Attachment RoutinesC .SBTTL + ATTCED - Attach a CEDT;+; **-ATTCED - Attach a CED;e ; Passed:n; R0 -> CED to attach ; R1 -> I/O packet to attach; ; Cache Partition mapped;2 ; Returned:r; All registers preservede;i=; This routine will attach an I/O packet to a CED for I/O, ori;; will queue it if there is a pending operation on the CED.h;-9ATTCED::TST I.ACED(R1) ; is this packet already attachedA+ BEQ 3$ ; if EQ, nope, continue w/ attach+' FATAL$ BE.CAA ; CED already attacheda43$: TST E.IOPA(R0) ; active packet already attached BNE 5$ ; yes, queue this one 8 MOV R1,E.IOPA(R0) ; no, this one gets it (CC from TST)2 MOV R0,I.ACED(R1) ; set ptrs in CED and URP both BR 10$ ; and finish up65$: CMP E.IOPA(R0),R002t__DATADATADATADATA1 ; is this packet owner already?% BEQ 10$ ; yes, return easy success 5 MOV R1,@E.ATTL+2(R0) ; attach packet at end of queue . MOV R1,E.ATTL+2(R0) ; update end of list ptr$ CLR (R1) ; clear link at list end3 CLR I.ACED(R1) ; show no CED attached to this URPO) SEC ; tell caller some other is ownerB 10$: RETURNq e6 .SBTTL + DETCED - Detach extents involved with an I/O;+1; **-DETCED - Detach extents involved with an I/On;R ; Passed: ; R0 -> CED to be freed4; Packets in E.ATTL are waiting for extent, will be; queued to Phase 2.u=; E.IOPA(R0) -> active packet, zero it here (for ATTCED flag)e'; R1 -> I/O packet of original attachera;eB; NOTE: E.PCNT is no longer valid, only one op is active on extent:; at any time. Others are queued and resumed in Phase II.;o*; Extent will be deleted if ES.DEL is set.; ;E ; Returned: ; All registers preservedO;+ ; Action:E8; A "lock" is simply an owner of a given extent (E.IOPA);0?; Any waiting requests queued to the extent are requeued to the,?; list headed by H.PKTQ for Phase II processing. Phase II willz<; dispatch to resume the processing that was blocked waiting; for this extent to free up.i;o;; If the CED being detached is contiguous with the previous.=; CED, and does not exceed maximum extent size, we will merge +; the two CEDs to save on pool allocations.n; ; +DETCED::MOV R2, -(SP) ; Get work registers  MOV R3, -(SP)+ CMP E.IOPA(R0),R1 ; is this the attacher? * BNE 3$ ; if NE, nope, this isn't it ...4 CMP I.ACED(R1),R0 ; is this the correct attachment BEQ 5$ ; if EQ, yes, continue-3$: FATAL$ BE.CNA ; CED not attached by IOPi/5$: CLR I.ACED(R1) ; packet no longer attachedD, CLR E.IOPA(R0) ; and show no active packet4 MOV E.ATTL(R0),R2 ; Get address of first CRP attac% BEQ 10$ ; none in queue, finish uplA MOV R2,@APRD.BASE+H.PKTQ+2 ; splice to end of queue for Phase II< MOV E.ATTL+2(R0),APRD.BASE+H.PKTQ+2 ; point at end of queue* CLR E.ATTL(R0) ; no longer any attachers2 MOV R0,E.ATTL+2(R0) ; set the CED queue to empty ADD #E.ATTL,E.ATTL+2(R0)o710$: BITB #ES.DEL, E.STAT(R0) ; Should this be deleted? BEQ 20$ ; If EQ, no8 MOV E.LPRV(R0),-(SP) ; extract the previous CED address1 BIT #1,I.TCB(R1) ; are we in a purge operation?f/ BEQ 15$ ; if EQ, nope, they want a valid CEDi* MOV R0,(SP) ; use this CED for deletion&15$: CALL FRECED ; Delete the extent' MOV (SP)+,R0 ; and update the new CED & ; If CS, deferred - not a problem" BNE 40$ ; we didn't pull a null;+@; Note: The following section of code will preserve the status/; of carry (CC-C) for the calling subroutine.;-( MOV KISAR6,-(SP) ; save kernel mapping MP.UCBX ; map our UCBX8 MOV APR6.BASE+X.CCED,R0 ; get the first CED in the list+ MOV (SP)+,KISAR6 ; restore kernel mappinga BR 40$ ; finish up);+E; This CED will not be deleted, so make a simple check to determine(C; if this CED is adjacent to the previous CED, and if so, merge theoC; two CED together, provided that they do not exceed the read-ahead G; parameters. This will handle any contiguous extents, and maximize thel; available pool ...;->20$: CMP E.LPRV(R0),E.BPRV(R0) ; do both base/lbn point to the+ BNE 35$ ; if NE, nope, don't do this ...D2 MOV E.LPRV(R0),R3 ; get the previous CED address" BEQ 40$ ; this is the first CED8 CMP E.LBNH(R3),E.LBNL(R0) ; are these CED's contiguous? BNE 35$ ; if NE, nope ...8 CMP E.LBNH+2(R3),E.LBNL+2(R0) ; and now the MSP ;DC430( BNE 35$ ; nope, finish up ... ;**-17 MOVB E.SIZE(R3),R2 ; get the size of the previous CEDc& ASH #3,R2 ; convert to 32.wd blocks/ ADD E.PHYA(R3),R2 ; calculate the top addressV* CMP E.PHYA(R0),R2 ; are they contiguous?* BNE 35$ ; nope, they are not contiguous@ CMPB E.STAT(R3),E.STAT(R0) ; are they like CED's (i.e. deferred, BNE 35$ ; nope, can't merge them together;+H; These CED's are identical, and contiguous .... so merge them togethe5; if we are allowed, and don't excee00:ibjbkb a a ad read-ahead sizen;-" CLR -(SP) ; make a scratch word MOV KISAR6,-(SP) ; save KISAR6! MP.UCBX ; and map to the UCBXt3 MOVB APR6.BASE+X.CSTS,3(SP) ; save the status byte 9 MOVB APR6.BASE+X.XRDA,2(SP) ; and the size parameter ...B0 MOV (SP)+,KISAR6 ; restore kernel APR6 mapping1 BIT #,(SP) ; is read-ahead allowed?e1 BEQ 30$ ; if EQ, nope ... (all that comparing)) CLRB 1(SP) ; insure high byte is clearu4 MOVB E.SIZE(R3),R2 ; load the size of the previous) CLR -(SP) ; prepare to set up our sizeS4 MOVB E.SIZE(R0),(SP) ; and the size of this extent ADD (SP)+,R2 ; compute total CMP R2,(SP)+ ; are we too big?+ BHI 35$ ; if HI, yes, can't merge extentS;+F; There are no violations, so merge the two extents, and free up the; additional CED ...;-% CLR -(SP) ; and set an accumulatorl0 MOVB E.SIZE(R0),(SP) ; save the size to extend. MOV R3,-(SP) ; save the target CED for merge3 CLRB E.STAT(R0) ; if deferred, don't write it outr CALL FRECED ; delete the CED 0 MOV (SP)+,R0 ; restore the new detached extent* MOVB E.SIZE(R0),R2 ; get the extent size. ADD (SP),E.LBNH(R0) ; update the highest LBN2 ADC E.LBNH+2(R0) ; double precision ... ;DC430. ADD (SP),R2 ; compute new size byte ;**-1- MOVB R2,E.SIZE(R0) ; and we are all updated-/ CALL QUPAGE ; pre-age this extent to the end("30$: TST (SP)+ ; clean the stack#35$: CLC ; insure carry is cleare,40$: MOV (SP)+, R3 ; Restore work registers MOV (SP)+, R2 RETURN; l) .SBTTL Structure Allocation/Deallocatione# .SBTTL + CRECED - Create CED block);+; **-CRECED - Create CED block;. ; Passed: ; R1 - URP;e ; Returned:E; R0 -> Newly allocated CEDo; E.ATTL (R0) = 0; E.ATTL+2 (R0) => E.ATTL(R0);-(CRECED::MOV R1,-(SP) ; save URP address' MOV #E.LGTH,R1 ; Set size to allocatei1 CALL .ALOCB ; Call internal allocation routinee. BCS 90$ ; failure, tell caller the bad news* CLRB E.STAT(R0) ; clear E.STAT ;DC430+ CLR E.IOPA(R0) ; no active packet ;**-2t CLR E.ATTL(R0)a2 MOV R0,E.ATTL+2(R0) ; set empty attachment queue ADD #E.ATTL,E.ATTL+2(R0)o90$: MOV (SP)+,R1 ; restore R1 RETURN ; to caller# .SBTTL + DELCED - Delete CED block;+; **-DELCED - Delete CED block;C ; Passed:-!; R0 -> The CED to be deallocated.;H ; Returned:z; All registers preservedB;-DELCED: MOV R1,-(SP)) MOV #E.LGTH,R1 ; Set size to deallocatee3 CALL .DEACB ; Call internal deallocation routine MOV (SP)+,R1P RETURNn i* .SBTTL Buffer address conversion routines= .SBTTL + ADJBUF - Convert NPR buffer addresses to doublewordA;+ ; ADJBUF - Adjust buffer address;e ; Passed:R; R1 -> I/O packet to adjust ; R5 -> UCBt;E ; Returned:; Nil.; 9; This routine will replace the 22-bit buffer address fore6; UC.NPR devices with an address doubleword for use by"; the $BLXIO (block move) routine.;-ADJBUF::' BITB #UC.NPR,U.CTL(R5) ;Is device NPR?C+ BEQ 10$ ;No if EQ; leave address "as is"P& MOV R2,-(SP) ;Get two work registers MOV R3,-(SP) ;2 MOV I.PRM+P1.1(R1),R2 ;Get the MSB of the address2 MOV I.PRM+P1.2(R1),R3 ;Get the LSB of the address .IFNDF M$$EXT ;18-bit systemk( ASH #4,R2 ;Shift <21:20> into <17:16> .IFF ;M$$EXT& SWAB R2 ;Shift <31:24> into <23:16> .ENDC ; M$$EXT6 BIC #^C<77>,I.PRM+P1.2(R1) ;Remove all but low 6 bits8 BIS #APR6.BASE,I.PRM+P1.2(R1) ;Create APR6 displacement" ROL R3 ;Shift out <15> from LSB ROL R2 ;And pick up in MSB " 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' BISB R3,R2 ;Set <13:6> into APR biasE' MOV R2,I.PRM+P1.1(R1) ;Create APR bias ' MOV (SP)+,R3 ;Restore saved registersA MOV (SP)+,R2 ;10$: RETURN ; All set X .SBTTL Buffer management./ .SBTTL + GETBUF - Allocate a buffer from cache,;+*; **-GETBUF - Allocate a buffer from cache; ; Passed:<; R1 -> User's I/O packetd*; R4 := length required in 512-byte blocks00Bt__DATADATADATADATA; R5 -> UCB of request devicep; ; Returned:3; CC: R0 -> Available CED ; CS: No CED available;:<; Attempts to allocate space can be provided through various ; algorithms.R;;,; The first algorithm attempts to reuse free<; space as quickly as possible, by searching the extent list:; 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 thee:; extent age list will be deallocated. Another attempt to=; allocate space will be tried. A failure at this point willD#; cause the request to be bypassed.e;-5GETBUF::CALL GETFRE ;Attempt to allocate free space BCC 10$ ;Space found, use it / CALL FREAGE ; none, delete oldest to free spc+ BCC GETBUF ; delete succeeded, try again 10$:! RETURN ; C-bit status correctl 2 .SBTTL + GETFRE - Allocate free space in CED list;+-; **-GETFRE - Allocate free space in CED listm; ; Passed:e; R1 -> User's I/O packeta(; R4 := Number of 256-word blocks needed; R5 -> UCB of request deviceh;p ; Returned: 0; CS indicates either no buffer space available,0; or that a CED to describe that space cannot; be allocated,; CC: .; R0 -> New CED to be completed, with space; allocated.; ;R2,R3 insignificant;R4,R5 preserved;R"; To obtain the address and length8; of any free space (between allocations), the following; algorithm is used:;pA; size = ADDRESSOF(ced[n+1]) - ADDRESSOF(ced[n]) - SIZEOF(ced[n]):;u+; base = ADDRESSOF(ced[n]) + SIZEOF(ced[n])f;q=; Special handling is required for the first and last CEDs in ;; the list. The first one is treated as the [n+1] element,a;; with the base of the data buffer portion of the partitionm;; being the address of the [n] element (SIZEOF(n) is zero).;,:; 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.);A5; This routine will scan the CED list for free space.S3; Free space is the unallocated portion between thei5; allocated extents. The entire list must be checked ; in order to find it.;s;e:; If there is room adjacent to the previous CED in the LBN%; list, the scan will begin there ... ;t;-2GETFRE: MOV R1,-(SP) ;Save the I/O packet address> MOV APRD.BASE+H.CMDF,-(SP) ; get the base memory CED to start7 MOV APRD.BASE+H.TMP,R0 ; get the previous CED (by LBN)l' BEQ 5$ ; if EQ, there is no previousu8 MOV I.PRM+P4(R1),-(SP) ; save the P4 parameter ;DC430: BIT #DV.32B,U.CW1(R5) ; device using 32-bit LBNs? ;DC4302 BNE 2$ ; if NE, yes, compare whole thing ;DC430 ;DC4305 CLRB 1(SP) ; clean off the high order stuff ;DC430N ;DC430;2$: CMP E.LBNH+2(R0),(SP)+ ; will they be adjacent? ;DC430h# BNE 5$ ; if NE, nope ... ;**-1H: CMP E.LBNH(R0),I.PRM+P5(R1) ; how about the low order LBN BNE 5$ ; nope, don't bother2 BITB #ES.WPL,E.STAT(R0) ; is this a place holder?. BNE 5$ ; if NE, yes, can't make it adjacent) CLR R2 ; determine if there is enough? + BISB E.SIZE(R0),R2 ; and include the size,- ASH #3,R2 ; compute next available address4% ADD E.PHYA(R0),R2 ; total it all upo. MOV (R0),R3 ; get the "next" buffer address+ MOV E.PHYA(R3),R3 ; and it's base addressC% SUB R2,R3 ; compute the difference- MOV R4,R2 ; copy desired size% ASH #3,R2 ; convert requested size CMP R3,R2 ; is it big enough?% BHIS 10$ ; if HIS, yes, use it ...e15$: MOV APRD.BASE+H.CMDH,R0 ;Address of first CED4 TST APRD.BASE+H.CMDF ; do we have a starting point?+ BEQ 10$ ; if EQ, nope, use CMDH to start2, CLR (SP) ; flag no holes detected ... yet2 MOV APRD.BASE+H.CMDF,R0 ; get a good starting CED; Assume E.BNXT = 0 for source310$: MOV (R0), R1 ;Address of next physical extentm$ BEQ 30$ ;End of extent list if EQ CLR R2 ; Prepare to get byte.5 BISB E.SIZE(R0),R2 ; Get size of extent in 512-byte# ASH #3,R2 ; Convert to APR bias.e5 ADD E.PHY00Jibjbkb a a aA(R0),R2 ;Add base for possible free space2 MOV E.PHYA(R1),R3 ;Get the address of the "next". SUB R2,R3 ;Subtract free address for length+ BNE 20$ ;Free space available - check itt.15$: MOV R1,R0 ;Else advance in the CED list BR 10$ ;And look for spaceo220$: TST (SP) ; do we have a CED to start later? BNE 25$ ; yup, continue ...( MOV R0,(SP) ; set up a starting point125$: ASH #-3,R3 ; Convert to 512-byte blocks to2- CMP R3,R4 ; Is this free space big enough?A+ BLO 15$ ;Too small if LO; keep searching ;c ; Context:;(; 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;o; The following must be done:o; '; 1. A CED allocated for the new extenty1; 2. The new CED linked into the physical addressi3; list, positioned between the R0-> and R1-> CEDl>; 3. The new CED placed at the end of the age list (BY CALLER)2; 4. The new CED inserted at the appropriate point ; in the LBN list (BY CALLER); MOV R0,R3 ;Free up R0 for use CALL CRECED ;Create a CED now. BCS 40$ ; If CS, none are available for use* MOV R2,E.PHYA(R0) ;Establish our address( MOVB R4,E.SIZE(R0) ;Establish our size#; Assume E.BNXT = 0 for destinationw$ MOV R0, (R3) ;Point previous to us) MOV R3,E.BPRV(R0) ;Point us to previous % MOV R0,E.BPRV(R1) ;Point next to use#; Assume E.BNXT = 0 for destinationi MOV R1, (R0) ;Point us to next7 MOV R5,E.UCB(R0) ;Plug in owning device's UCB addressC# TST (PC)+ ;Return CC for successf(30$: SEC ;Indicate no space availableB40$: MOV (SP)+,APRD.BASE+H.CMDF ; and update the next starting CED MOV (SP)+,R1 ;Restore saved R1 RETURN; l= .SBTTL + FREAGE - Unlink and deallocate first age list entry,;+8; **-FREAGE - Unlink and deallocate first age list entry2; **-FRECED - Unlink and deallocate a cache extent; ; Alternate entry:9; FREAGE - Deallocate oldest extent from age list to free,(; cache internal pool and buffer space>; DELBUF - Deallocate a buffer from all lists without checking8; busy or deferred status bits (caller is responsible); ; Passed:t; R0 -> CED to be deallocated+; R5 -> UCB Address of device;; ; Returned: ; CC: CED is deleted&; CS: CED is marked for deletion later;E; All registers preserved ;s6; Prior to deallocation, the CED must be removed from:;h; 1. The age list; 2. The LBN list; 3. The address list;nF; NOTE: If the extent is "busy" or "locked down" it will be marked for!; deletion during I/O completion. ;- .ENABL LSBc=FREAGE::CLR APRD.BASE+H.CMDF ; insure we start from the start 7 MOV APRD.BASE+H.CEDH,R0 ; get oldest CED from age list #20$: BEQ 110$ ; empty list, hunh? ) CALL FRECED ; attempt to free this CEDe& BCC 120$ ; if CC, we released a CED( TST E.IOPA(R0) ; do we have active I/O) BNE 110$ ; if NE, yes, return this onet6 MOV E.ANXT(R0),R0 ; get the next CED in the age list+ BR 20$ ; and retry with the next elementi7 .SBTTL + FRECED - Unlink and deallocate a cache extentN%FRECED::TST E.IOPA(R0) ;Extent busy?i- BNE 100$ ; If NE, yes, don't deallocate itH. BITB #ES.WDF,E.STAT(R0) ; Is write deferred ? BEQ 200$ ; If EQ, nou/ CALL QUPAGE ; yes, move to front of age list& ; ...FRECED calls don't just spin: BITB #ES.ERR,E.STAT(R0) ; Is there an error with this CED' BNE 110$ ; If NE, yes, skip this one0. CALL WRTDFR ; write the deferred extent now. BCS 110$ ; no pool error returned by WRTDFR8100$: BISB #ES.DEL, E.STAT(R0) ; Mark for deletion later1110$: SEC ; Indicates busy extent still existsN120$: RETURN ; to caller;TE; called to delete CED from all lists w/o checking for busy or deferH; called by DCCTL for forced deactivation of cache (implictly imvokedG; for VV$CLR from dismount, should be no valid defers remaining) andCE; called by DCCTL for FUNDEL to handle ACP function to purge 00Rt__DATADATADATADATAcachet,; for deallocation of blocks from a file.;o;e=; Remove CED from lists now that we know it's ok to delete ite;i;l7; Don't remove write placeholder from lists it isn't inN;2?200$: BITB #ES.WPL,E.STAT(R0) ; is this a placeholder for writel0 BNE 210$ ; yes, only in LBN list, skip others. ; Remove from age list and memory buffer list* CALL QRMAGE ; Remove from the age queue/ CALL QRMBUF ; Remove from memory buffer liste;yG; Update pointer for LBN list positioning if deleting the "current" CEDc;oA210$: CMP R0,APRD.BASE+H.TMP ; deleting CED pointed to as currentw BNE 220$ ; no, ok, go on1 MOV E.LPRV(R0),APRD.BASE+H.TMP ; yes, update ptr /220$: CALL QRMLBN ; Remove from the LBN queues CALL DELCED ; Delete the CEDB CLC ; Indicates successs RETURNt .DSABL LSBv r% .SBTTL Write deferred I/O operationsC5 .SBTTL + WRTDFR - Write deferred data in CED to diskF;+A; WRTDFR - Routine to write out specified deferred extent to disk ;i ; Inputs:d*; R0 - CED with data to be written to disk.; R1 -> I/O packet for write (in primary pool)G; R5 - UCB address of device for request causing write (not necessarilye:; the device being written, if age list is being purged!);u ; Outputs::; CC - I/O packet queued to driver to write data in extent ; CS - error;-*WRTDFR::CALL $SAVAL ; save all registers1 MOV E.UCB(R0),R5 ; Get new UCB address from CEDo# CALL DFRPKT ; fill in I/O packett, BCS 20$ ; UGH, didn't get pool for one.../ CALL ATTCED ; attach to CED, should succeed!i BCC 10$ ; if CC, we made it' FATAL$ BE.CAA ; CED already attachede;10$: BISB #ES.WIP,E.STAT(R0) ; Indicate a write-in-progress 0 CALL .DRQRQ ; Initiate the I/O for the extent0 MP.PAR ; ensure cache partition still mapped20$: RETURN ; to caller B .SBTTL + DFRPKT - Fill in internal I/O packet for deferred extent;+C; DFRPKT - Routine to set up internal I/O packet for deferred writeB;2 ; Inputs: '; R0 - CED with data to written to diskD$; R1 -> I/O packet to be initialized; R5 - UCB address of device ; Outputs:; CC: 3; R1 - I/O packet allocated and partially filledR; CS:d&; Allocation failure for I/O packet;-,DFRPKT::MOV R0,-(SP) ; Save the CED address' MOV #I.LGTH,R1 ; Get size to allocate:$ CALL $ALOCB ; Allocate I/O packet& BCS 50$ ; If CS, allocation failure;dK; First clear the packet and then fill in necessary data for call to driverr; ( MOV R0,-(SP) ; Save I/O packet address ROR R1 ; convert to words"10$: CLR (R0)+ ; zero out a word SOB R1,10$ ; / MOV (SP)+,R1 ; Restore packet address into R1a4 MOV $LDRPT,R0 ; Take priority of ...LDR for packet+ BISB T.PRI(R0),I.PRI(R1) ; set up priorityS5 MOV R0,I.TCB(R1) ; Also make it the owning task TCBz1 MOV R5,I.UCB(R1) ; Put in UCB address of device< MOV #IO.WLB,I.FCN(R1) ; Make this a logical write operation9 MOV KINAR5,I.IOSB+2(R1) ; Set up internal I/O completion2 MOV #DFRIOC!1,I.IOSB+4(R1) ; ... address and flag% CLRB I.EFN(R1) ; insure logical I/O ( MOV (SP),R0 ; Restore the CED address2 MOV R0,I.CRP(R1) ; Keep pointer to CED in packet> MOV E.LBNL(R0),I.PRM+P5(R1) ; Get LSP of LBN to write to disk8 MOV E.LBNL+2(R0),I.PRM+P4(R1) ; Get MSP of LBN ;DC430 ;**-1s5 MOVB E.SIZE(R0),R2 ; Get size of transfer in blocksv$ ASH #9.,R2 ; Turn that into bytes6 MOV R2,I.PRM+P2(R1) ; Put byte value into I/O packet) MOV R1,R4 ; Save address of I/O packetC+ MOV #APR6.BASE,R2 ; Get APR6 displacement 5 MOV E.PHYA(R0),R1 ; Get APR bias of start of buffers/ CALL $MPPHY ; Map to physical address if NPRo/ MOV R1,I.PRM+P1.1(R4) ; Move MSP to I/O packet5/ MOV R2,I.PRM+P1.2(R4) ; Move LSP to I/O packetN, MOV R4,R1 ; Restore pointer to I/O packet .IF DF S$$HDW;+?; In order to insure shadowing integrity, we will also need to -; allocate an ML node for the deferred I/O ;-, MOV U.UMB(R5),R4 ; extract the UMB address" BEQ 50$ ; if EQ, no shadow pair5 BIT #MS.MDA,M.STS(R4) ; can we allo00Zibjbkb a a acate new packets?1& BNE 50$ ; if NE, nope, continue ..., MOV R1,R3 ; copy the packet address to R3- MOV #ML.LGH,R1 ; set the length to allocate2 CALL $ALOCB ; allocate primary pool for ML node% BCC 20$ ; we got pool, go continuek MOV R3,R1 ; restore IOP2 USTAT$ 0,#APR6.BASE+S.POL ; error allocating pool- MOV R3,R0 ; set up to deallocate the packee! MOV #I.LGTH,R1 ; and the lengtht& CALL $DEACB ; deallocate the packet SEC ; flag error BR 50$ ; and finish out ...(20$: MOV R0,R1 ; copy ML node address CLR (R0)+ ; Clear link word2 MOV #>,(R0)+ ; ML.LEN/ML.TYP+ CLR (R0)+ ; ML.DNC/Unused set done count / MOV R3,(R0)+ ; ML.PRI set primary I/O packet;6 MOV M.LHD(R4),(R1) ; link new node to previous first/ MOV R1,M.LHD(R4) ; point listhead to new nodeo-40$: MOV R3,R1 ; restore I/O packet addressk .ENDC ;DF S$$HDW;(50$: MOV (SP)+,R0 ; Restore CED address RETURNk= .SBTTL + DFRIOC - I/O completion routine for deferred extentO;+J; DFRIOC - Routine to complete processing after a deferred extent has been; written to disk+;M ; Inputs:P; R3 - I/O packet addresss;s;-5DFRIOC: CALL $SAVAL ; save all registers for $IOFINc" MOV I.ACED(R3),R0 ; Point to CED. MOV I.UCB(R3),R5 ; Get UCB address of device MP.PAR ; map cache partition/ BITB #CS.DBG,APRD.BASE+H.CSTS ; debug enabled?S BEQ 7$ ; nope, skip this;1 CMP E.IOPA(R0),R3 ; is this packet for this ced?- BNE 3$ ; no, go die ... " CMP E.UCB(R0),R5 ; ucb match ced? BEQ 7$ ; ok, sanity checkede%3$: FATAL$ BE.UCB ; bad UCB addresso7$: .IF DF CHEWBHP8 BICB #ES.WIP,E.STAT(R0) ; Indicate extent no longer WIP .IFF ;DF,CHEWBHE BICB #,E.STAT(R0) ; Indicate extent no longer WIP/DFRR .ENDC ;DF,CHEWBHs/ TSTB I.PRM+P3(R3) ; See if there was an error BPL 10$ ; If PL, no error ASSUME ES.DEL,2002 TSTB E.STAT(R0) ; force delete? (for deactivate) BMI 20$ ; yes> BISB #,E.STAT(R0) ; Show error on deferred CED4 CALL QUPAGE ; move CED w/err to front of age list- BR 20$ ; (must retain until file deleted!)E10$: .IF DF CHEWBH6 BITB #ES.WDF,E.STAT(R0) ; was this a deferred extent?0 BEQ 20$ ; if EQ, nope, don't delete on detach? BICB #ES.WDF,E.STAT(R0) ; else, no longer deferred, and delete  .ENDC ;DF,CHEWBHr; BISB #ES.DEL,E.STAT(R0) ; set flag to delete CED in detachT320$: MOV R3,R1 ; copy I/O packet to R1 for DETCED$1 CALL DETCED ; detach CED, requeue pending rqstw4 MOV R3,R0 ; setup for internal I/O pkt deallocate$ MOV #I.LGTH,R1 ; set up the length& CALL $DEACB ; return packet to pool1 CALLR DCFRK0 ; fork and run Phase II if needede d" .SBTTL Memory allocation routines* .SBTTL + .ALOCB - Internal hook to $ALOCB;+%; **-.ALOCB - Internal hook to $ALOCBt; ; Passed:F; R1 := Requested size;T ; Returned:f4; R1 := Size rounded up according to blocking factor); If CC then successfully allocated blockD; R0 -> Newly allocated block ; If CS then no memory available;t<; This routine will allocate memory from the cache partition=; using the system memory allocation routine $ALOCB in CORAL.o@; Entry point $ALOC1 is called with the internal header address.;n.ALOCB: MOV R2,-(SP) ; save R2o: MOV #APRD.BASE+H.PAVL,R0 ; R0 -> Internal pool list heade/ CALL $ALOC1 ; Attempt to allocate the memoryd MOV (SP)+,R2 ; restore R2o RETURNb* .SBTTL + .DEACB - Internal hook to $DEACB;+%; **-.DEACB - Internal hook to $DEACBk; ; Passed:n; R0 -> Block to be deallocatedu; R1 := Length of block ;m ; Returned:r; All registers preservedm;r=; This routine will deallocate memory in the cache partition, ?; or into system pool depending upon the address. This enables)<; the cacher to allocate space from primary pool in cases of); extreme emergency (not currently used).l;-+.DEACB: MOV R0,-(SP) ; save work registerso MOV R2,-(SP). MOV R3,-(SP)-0 CMP R0,#APR5.BASE ; System pool or cache pool? BLO 10$ ; System po00bt__DATADATADATADATAol if LO; MOV #APRD.BASE+H.PAVL,R3 ; R3 -> Internal pool list headerm1 CALL $DEAC1 ; Attempt to deallocate the memoryh BR 20$ ; Go to common exitr110$: CALL $DEACB ; Deallocate it to system poole+20$: MOV (SP)+,R3 ; restore work registersa MOV (SP)+,R2e MOV (SP)+,R0m RETURNi e! .SBTTL EBLXIO -- BLXIO Extensione;+; **-EBLXIO -- BLXIO Extension; ?; This routine performs the same operation as $BLXIO, except it,C; extends the amount that may be transferred from under 4K bytes to <; 65535 bytes. Forks are performed between calls to $BLXIO.;m;C; Input:;;&; R0 number of bytes to be transferred!; R1 starting APR bias for sourceC=; R2 starting offset for source (must be less than 100 octal)R&; R3 starting APR bias for destinationA; R4 starting offset for destination (must be less than 100 octals9; On a multiprocessor system, we have the executive lock.e;r;m ; Output:o;a; R0-R4 alteredx; R5 preserved;-4 .IFDF M$$PRO ; Is multiprocessor support required-FRKSIZ = 14 ; Yes, fork block is six words.e .IFF -FRKSIZ = 12 ; No, fork block is five words.f .ENDC* .IFDF K$$DAS ; Are we using data space?-REGSIZ = 4 ; The cache region APRs take two  .IFF -REGSIZ = 2 ; The cache region APR takes ones .ENDCEBLXIO::.IF DF M$$PROr/ TST APRD.BASE+H.PKTQ ; any pending work to do?a& BEQ 10$ ; nope, skip the extra work* MOV #10$,-(SP) ; set up a return address# CALL $SAVAL ; save all registersM) CALLR DCFRK0 ; and check for more workd:10$: ULOCK$ $EXECL,WAIT ; Yes, release the executive lock .ENDC ;DF,M$$PROk MOV R5,-(SP) ; Save register..$ CLR R5 ; Flag no block allocated.- MOV R0,-(SP) ; Save count of bytes to move. 5 MOV #MAXTR,R0 ; Get maximum size of single transfers/ SUB R0,(SP) ; Subtract bytes to be transferrE, BCC 210$ ; There are enough; do transfer.0 ADD (SP),R0 ; The maximum is too much, adjust& CLR (SP) ; Zero bytes will be left.210$: .IF DF DC$DBG&K$$DAS" CMP R3,$SCMOF ; size above exec? BLOS 235$ ; if LOS, fatal# CMP R4,#140000 ; address in APR6?N BLO 235$ ; if LO, fatal .ENDC ;DF,DC$DBG&K$$DAS CALL $BLXIO ; Transfer data. TST (SP) ; Are we done? BEQ 255$ ; Yes, leave.#/ MOV KISAR6,-(SP) ; Save APR for cache region.S* .IFDF K$$DAS ; Are we using data space?5 MOV KISAR5,-(SP) ; Save second APR for cache region( .ENDC MOV R4,-(SP) ; Save register.t MOV R3,-(SP) ; Save register.e MOV R2,-(SP) ; Save register.D MOV R1,-(SP) ; Save register.e9 MOV #$STACK-22+FRKSIZ,R1 ; Get location where we want SPe% ; be, plus space for fork block.l. SUB SP,R1 ; Figure size of block needed for% ; for fork block plus everything?' ; the stack below the task contextR4 LOCK$ $EXECL,WAIT ; Yes, obtain the executive lock* CALL $ALOCB ; Get space for fork block.% BCC 215$ ; There is space; use it.(6 ULOCK$ $EXECL,WAIT ; Yes, release the executive lock" MOV (SP)+,R1 ; Restore register." MOV (SP)+,R2 ; Restore register." MOV (SP)+,R3 ; Restore register." MOV (SP)+,R4 ; Restore register.* .IFDF K$$DAS ; Are we using data space?1 CMP (SP)+,(SP)+ ; We don't need the saved APRs.  .IFFr+ TST (SP)+ ; We don't need the saved APR.k .ENDC% BR 240$ ; Go do the next transfer. !215$: MOV R0,R4 ; Copy pointer. > ; Copy stack to fork block and adjust R4 for input to $QFORK.7217$: MOV (SP)+,(R4)+ ; Copy stack word to fork block.v* CMP SP,#$STACK-22 ; Is stack copied yet? BNE 217$ ; No, keep going.e4 .IFDF M$$PRO ; Is multiprocessor support required+ CLR (R4)+ ; We can run on any processor.u .ENDC6 MOV #237$,2(R4) ; Record PC to be restored by system3 MOV R4,4(R4) ; Record R5 to be restored by sysyemR3 MOV R0,6(R4) ; Record R4 to be restored by system9 MOV KINAR5,10(R4) ; Record APR to be restored by system  BR 230$ ; Go do fork.# ; Come back after another transfer )220$: TST R5 ; Do we have a fork block?$* BEQ 240$ ; No, go do the next transfer.- MOV 6(R5),R0 ; Point to beginning of00jibjbkb a a a block.l! MOV R1,(R0)+ ; Record register.(! MOV R2,(R0)+ ; Record register.r! MOV R3,(R0)+ ; Record register.e! MOV R4,(R0)+ ; Record register.M8 MOV (SP)+,REGSIZ(R0) ; Record remaining length (it goes$ ; above the saved APR or APRs).) MOV R5,R4 ; Pass fork block to $QFORK.t .IF DF M$$PRO- CALL 230$ ; we don't need the lock to forka/ LOCK$ $EXECL,WAIT ; Obtain the executive lock  RETURN ; to $DIRXT .ENDC ;DF M$$PROo3230$: CLR (R4) ; we will be the last in the queuen JMP $QFORK ; Fork., .IF DF DC$DBG&K$$DAS()235$: FATAL$ BE.IDC ; inconsistent dataR .ENDC ;DF,DC$DBG&K$$DAS- ; This label is where the system returns to.+;237$: ULOCK$ $EXECL,WAIT ; Yes, release the executive locke* MOV R4,R0 ; Switch to another register." MOV (R0)+,R1 ; Restore register." MOV (R0)+,R2 ; Restore register." MOV (R0)+,R3 ; Restore register." MOV (R0)+,R4 ; Restore register.* .IFDF K$$DAS ; Are we using data space?. MOV (R0)+,KISAR5 ; Restore cache region APR. .ENDC. MOV (R0)+,KISAR6 ; Restore cache region APR.- MOV (R0)+,-(SP) ; Restore length remaining.F9240$: MOV #MAXTR,R0 ; Get maximum size of single trasfero/ SUB R0,R4 ; Decrease pointer by maximum sizee0 ADD #MAXTRB,R3 ; Increase APR by maximum size./ SUB R0,R2 ; Decrease pointer by maximum sizeM0 ADD #MAXTRB,R1 ; Increase APR by maximum size.1 SUB R0,(SP) ; Subtract bytes to be transferrede, BCC 250$ ; There are enough; do transfer.0 ADD (SP),R0 ; The maximum is too much, adjust& CLR (SP) ; Zero bytes will be left.250$: .IF DF DC$DBG&K$$DAS" CMP R3,$SCMOF ; size above exec? BLOS 235$ ; if LOS, fatal# CMP R4,#140000 ; address in APR6?, BLO 235$ ; if LO, fatal .ENDC ;DF,DC$DBG&K$$DAS CALL $BLXIO ; Transfer data.z TST (SP) ; Are we done?. BNE 220$ ; No, do another fork and transfer6255$: TST (SP)+ ; Get count (now zero) off the stack4 LOCK$ $EXECL,WAIT ; Yes, obtain the executive lock) TST R5 ; Did we allocate a fork block?i$ BEQ 290$ ; No, skip deallocation.2 MOV 6(R5),R0 ; Get beginning of block for $DEACB MOV R5,R4 ; Copy pointer.) ADD #12,R5 ; Point after end of block.,1 SUB R0,R5 ; Compute length of block for $DEACBf MOV R5,R1 ; Copy length.S; SUB #12+REGSIZ+FRKSIZ,R5 ; Subtract size of fork block and?" ; values not needed on stack. ASR R5 ; Convert to words. 4 .IFDF M$$PRO ; Is multiprocessor support required) TST -(R4) ; Move past Unibus run mask.T .ENDC7260$: MOV -(R4),-(SP) ; Copy saved value back to stackl% SOB R5,260$ ; Continue until done.g CALL $DEACB ; Release space.;'290$: MOV (SP)+,R5 ; Restore register.  RETURNo . .SBTTL $USTAT - Update cache statistics block; ; Passed: ; R1 -> I/O request packet(; I.LNK(R1) -> Offset to be incremented#; I.CRP(R1) -> Cache Request Packet "; CRP+R.STAT -> Operation context); (i.e. base address in stat. block)p ; R5 -> UCB;T ; Returned:v; All registers preserved.;C ; Action:O<; Increments the double-word statistics value located at the;; specified offset (passed in I.LNK(R1) by caller) from the;B; base for the operation context specified by I.PRM+P3 in the CRP.;U-$USTAT::MOV R0, -(SP) ; Save a work registers' MOV KISAR6, -(SP) ; Save APR6 mapping(; G; Calculate the offset to be incremented, using R0 as a pointer, beforeP;S- MOV 6(SP),R0 ; load statistics base addressr, TST (R1) ; is this a statistics w/o a CRP$ BMI 5$ ; if MI, yes, continue ...% MP.PAR ; CRP may be in cache poold" MOV I.CRP(R1),R0 ; get R0 -> CRP1 MOV R.STAT(R0),R0 ; get R0 -> stat context baseo% BIC #1,R0 ; insure an even addresst. CMP (R1),#S.POL ; is this a fixed statistic?* BLO 5$ ; if LO, nope, do context update+ MOV #APR6.BASE,R0 ; set up a base addressl+5$: BIC #100000,(R1) ; remove the sign bit . ADD (R1),R0 ; Add in the offset from caller# MP.UCBX ; Map the UCB extensiont, BEQ 10$ ; If EQ, there isn't one, skip it9 MOV APR6.BASE+X.CSBA, KISAR6 ; Map the statistics buffer$ BEQ00rt__DATADATADATADATA 10$ ; If EQ, there isn't one. ADD #1, (R0)+ ; Update the appropriate field ADC (R0) ; Double words10$: MOV (SP)+, KISAR6 MOV (SP)+, R0 RETURNt ?7 .SBTTL .DRQRQ, Insure shadow protection for I/O packet6;+:; **-.DRQRQ- Insure shadow protection for each I/O packet;e@; This routine is used to insure that on a device which supportsF; shadowing, that each I/O packet is protected against errors. When anG; I/O request is first queued, an ML node is allocated for the request.D; As each request is queued into phase II, after $IOFIN, the ML nodeF; is deallocated. This routine insures that the packet is protected on; any subsequent I/O requests.;.; Input:; R1 - I/O packet address; R5 - Device UCB address;Q ; Output:s(; to $DRQRQ, with packet, if needed ...;h;-4.DRQRQ::MOV R5,-(SP) ; save our current UCB address% MOV R1,-(SP) ; save the IOP addresss .IF DF S$$HDW4 TST U.UMB(R5) ; does this device support shadowing" BEQ 50$ ; if EQ, nope, continue, MOV R1,R3 ; copy the packet address to R3( CALL $SHFND ; try to find the ML node BCC 30$ ; ML node is foundk( MOV U.UMB(R5),R4 ; extract UMB address5 BIT #MS.MDA,M.STS(R4) ; can we allocate new packets? & BNE 30$ ; if NE, nope, continue ...' .IF DF S$$HLS ; shadow load sharing?2 BITB #MS.CBP,M.STS(R4) ; can we bypass shadowing? BEQ 10$ ; if EQ, nope ...2 CMPB I.FCN+1(R3),#IO.RLB/256. ; valid for bypass?% BEQ 30$ ; if EQ, yes, continue ...5 .ENDC ;DF,S$$HLSo;+D; Certain error paths will cause this section of code to be entered,>; and instead of forcing a system crash, we will handle it ...;-110$: MOV #ML.LGH,R1 ; set the length to allocateR2 CALL $ALOCB ; allocate primary pool for ML node% BCC 20$ ; we got pool, go continueS;+C; This should not happen since we just deallocated the ML node ford>; this operation previously, so we should never crash here ...;-& FATAL$ BE.NPL ; no pool for ML node(20$: MOV R0,R1 ; copy ML node address CLR (R0)+ ; Clear link word2 MOV #>,(R0)+ ; ML.LEN/ML.TYP+ CLR (R0)+ ; ML.DNC/Unused set done countl/ MOV R3,(R0)+ ; ML.PRI set primary I/O packett6 MOV M.LHD(R4),(R1) ; link new node to previous first/ MOV R1,M.LHD(R4) ; point listhead to new nodeS-30$: MOV R3,R1 ; restore I/O packet addressl50$: .ENDC ;DF S$$HDW) CALL $DRQRQ ; and forward on to $DRQRQe MOV (SP)+,R1 ; restore R1 & MOV (SP)+,R5 ; reset our UCB address RETURN ; to caller/ .SBTTL + SETLBN, Load LBN/size values into CED.;+3; **-SETLBN- Load LBN and size parameters into CEDM;N9; This routine is used to load I/O parameters from an I/OaA; packet, into a newly created CED (or to update an existing CED)r;; Input:; R0 - CED to be loaded; R1 - I/O packet; I.PRM+P4 - LBN MSP; I.PRM+P5 - LBN LSP!; R4 - Size of request in blocksQ;; ; Output:d; &; CED loaded with LBN/size parameters;M;-=SETLBN::MOV I.PRM+P4(R1),E.LBNL+2(R0) ; copy the MSP ;DC430.4 BIT #DV.32B,U.CW1(R5) ; using 32-bit LBNs? ;DC430* BNE 10$ ; if NE, yes, continue ;DC430 ;DC4302 CLRB E.LBNL+3(R0) ; clear the high byte ;DC430 ;DC430;10$: MOV I.PRM+P5(R1),E.LBNL(R0) ; and the LBN LSP ;DC430u ;DC430> MOV E.LBNL+2(R0),E.LBNH+2(R0) ; and now the highest LB ;DC4307 MOV I.PRM+P5(R1),E.LBNH(R0) ; and also the LSP ;**-4 + ADD R4,E.LBNH(R0) ; add the total blockse. ADC E.LBNH+2(R0) ; double precision ;DC430 ;**-1P. MOVB R4,E.SIZE(R0) ; and load in the extent RETURN ; to caller$? .SBTTL + UPDLBN -- Update LBN parameters if extent is deferredR;+9; UPDLBN -- Update LBN parameters if extent is deferredI;MB; This routine is called from both FUNDEL, and DCFLSH to determineH; if an overlapping CED is deferred, and if so, insure that the portion/; which does not overlap is retained in cache.A;R; Input:; R0 - CED to be deletede%; R2 - LSP of highest LBN of requestn%; R3 - MSP of highest LBN of requestS;( 00z|ibjbkb a a a; Output: 4; CC-C clear, not deferred, all registers preserved; CC-C set, deferred extent;r;-#UPDLBN::CLC ; insure carry clear-, BITB #ES.WDF,E.STAT(R0) ; is this deferred?% BEQ 20$ ; nope, just delete it ...h MOV R2,-(SP) ; save R2 MOV R3,-(SP) ; and R3g) NEG R2 ; we need to subtract the valuep3 ADD E.LBNH(R0),R2 ; compute the difference we gete* MOVB E.SIZE(R0),R3 ; get the extent size- SUB R2,R3 ; compute how much to adjust LBN ;+!; R2 :== new size of the extent <; R3 :== number of blocks removed from the front of extent;-. ADD R3,E.LBNL(R0) ; compute new starting LBN. ADC E.LBNL+2(R0) ; double precision ;DC430- ASH #3,R3 ; convert to 32.wd blocks ;**-1s1 ADD R3,E.PHYA(R0) ; and set up the base addressR- MOVB R2,E.SIZE(R0) ; update the extent sizeb MOV (SP)+,R3 ; restore R30 MOV (SP)+,R2 ; and R2r SEC ; flag updated CED 20$: RETURNe .ENDC ; D$$CHE, .ENDcompute how much to adjust LBN ;+!; R2 :== new size of the exten .TITLE CORALR .IDENT /10.12/ ;V0; Copyright (c) 1995-1999 by Mentec Inc., U.S.A.; 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.;0; D. N. CUTLER 3-AUG-73N;; MODIFIED BY:; ; H. HUANG 28-JUN-83 10.00; 1; HH175 -- ADD EXTENDIBLE SECONDARY POOL SUPPORTR;9; J. W. BERZLE 07-SEP-83 10.01;V2; JWB047 -- ADD BUGCHECK FACILITY AND ERROR CODES;S; J. W. BERZLE 11-JUN-84 10.02;S0; JWB085 -- DEALLOCATE CONTEXT BLOCK IF PRESENT#; WHEN DEALLOCATING CLOCK BLOCK.; ; C. A. SILVER 12-MAR-85 10.03;F(; CAS019 -- ADD AUXILARY SPM HOOKPOINTS; ; C. B. PUTNAM 09-MAY-85 10.04;E-; CBP204 -- ADD POOL FRAGMENT VALIDITY CHECKU;R ; B. S. MCCARTHY 24-JUN-85 10.05; '; CAS019 -- REFORMAT SPM HOOK COMMENTS ; ; P. K. M. WEISS 13-OCT-86 10.06;9/; PKW118 -- ADD $ALSC1 AND $DESC1 ENTRY POINTS-;D ; P. K. M. WEISS 10-NOV-87 10.07;S;; PKW142 - RETURN CC WHEN LISTHEAD BELOW $POLHD FOR $ALSC1 ;T; P. K. M. WEISS 2-FEB-88 10.08D;L=; PKW150 - CALL $CPRCV IF $CPPOL IS SET ON POOL DEALLOCATION ;S ; P. K. M. WEISS 29-NOV-88 10.09; 3; PKW168 - $SAVAL IS *NOT* AN EXEC ROUTINE, CRETIND;O; D. CARROLL 17-JUN-1993 10.10;.6; DC228 -- ALLOW USE OF ICB POOL FOR PRIMARY POOL IF ; ALLOCATION FAILURE OCCURS.;W ; D. CARROLL 26-APRIL-1995 10.11:; DC359 -- Correct pool allocation failure reporting, and8; handle PLCTL high/low values with 100000 indicating"; to use ICB pool as the limit.; $; Modified for RSX-11M-PLUS V4.6 by:; ; D. Carroll 18-Oct-1995 10.12;; DC404 - Include PSECT definition to allow ICB pool to be; fully expanded when desiredE;O;N!; CORE BUFFER ALLOCATION ROUTINES-;3; MACRO LIBRARY CALLS ;O .MCALL CLKDF$,PKTDF$,BGCK$A3 CLKDF$ ;DEFINE CLOCK QUEUE CONTROL BLOCK OFFSETSO$ PKTDF$ ;DEFINE I/O PACKET OFFSETS. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;DC404 .IF DF,I$$CBP&K$$DAS&M$$PROA .IIF NE,, .ERROR ; NOT SUPPORTED ICB POOL ON MP SYSTEMM .ENDC ;DF,I$$CBP&K$$DAS&M$$PRO1;+ ; **-$ALOCB-ALLOCATE CORE BUFFER2; **-$ALOC1-ALLOCATE CORE BUFFER (ALTERNATE ENTRY);aH; THIS ROUTINE IS CALLED TO ALLOCATE AN EXEC CORE BUFFER. THE ALLOCATIONF; ALGORITHM IS FIRST FIT AND BLOCKS ARE ALLOCATED IN MULTIPLES OF FOUR; BYTES.;O ; INPUTS: ;S>; R0=ADDRESS OF CORE ALLOCATION LISTHEAD-2 IF ENTRY AT $ALOC1.2; R1=SIZE OF THE CORE BUFFER TO ALLOCATE IN BYTES.;, ; OUTPUTS:;$>; C=1 IF INSUFFICIENT CORE IS AVAILABLE TO ALLOCATE THE BLOCK. ; C=0 IF THE BLOCK IS ALLOCATED.%; R0=ADDRESS OF THE ALLOCATED BLOCK. ; R1=LENGTH OF BLOCK ALLOCATED ;- .ENABL LSBN7$ALOCB::MOV #$CRAVL-2,R0 ;POINT TO ALLOCATION MASK WORDR .IF DF Q$$OPT% ADD (R0),R1 ;ROUND TO NEXT BOUNDARY  BIC (R0)+,R1 ;M# BEQ 5$ ;IF EQ ZERO LENGTH REQUESTU( CMP R1,#I.LGTH ;REQUEST SIZE OF PACKET? BNE 5$ ;IF NE NO2 MOV #$PKAVL,R2 ;POINT TO PACKET AVAILABLE POINTER% MOV (R2),R0 ;PICK UP PACKET POINTE00t__DATADATADATADATARF BEQ 4$ ;IF EQ THERE IS NONE - MOV (R0),(R2)+ ;UNLINK PACKET FROM LIFO LISTL;+; ** W A R N I N G **T;A; SPM HOOKPOINT NUMBER 77.;O); DO NOT CHANGE THE INSTRUCTION FOLLOWINGO; LABEL WITHOUT CHECKING SPM;-+$SPH77==. ;SPM CHANGES THE INSTRUCTION AT( ;THE LOCATION OF THIS LABEL, DEC (R2) ;INDICATE ONE PACKET LESS IN LIST RETURN ;R84$: MOV #$CRAVL-2,R0 ;POINT BACK TO ALLOCATION MASK WORD .ENDC,$ALOC1::ADD (R0),R1 ;ROUND TO NEXT BOUNDARY BIC (R0)+,R1 ;CLEAR EXCESS#5$: SEC ;ASSUME ZERO LENGTH BLOCK($ BEQ 35$ ;IF EQ ZERO LENGTH REQUEST .IF DF P$$CTL' MOV R0,-(SP) ;SAVE ADDRESS OF LISTHEAD. .IF DF I$$CBP&K$$DAS , CMP R0,#$CRAVL ; IS THIS THE EXEC LISTHEAD?# BEQ 7$ ; IF EQ, YES, FLAG AS SUCHS% CMP R0,#$ICAVL ; HOW ABOUT ICB POOL?F& BNE 8$ ; IF NE, NOPE, GO DO THE WORK CLR (SP) ; FLAG ICB POOL USAGE#7$: INC (SP) ; FLAG TRACKABLE POOLL8$: SEC ; INSURE CARRY SET .ENDC ;DF,I$$CBP&K$$DAS .ENDC.10$: MOV R0,R2 ;SAVE ADDRESS OF CURRENT BLOCK( MOV (R2),R0 ;GET ADDRESS OF NEXT BLOCK .IF DF R$$DER BEQ 40$ ;IF EQ END OF CHAIN( ;V1 ;THE FOLLOWING CODE CHECKS TO SEE IF THE POOLC, ;...FRAGMENT IS OF VALID SIZE. IT CAN BE2 ;...NEITHER ODD NOR AN ODD MULTIPLE OF 2 BYTES ; # BIT #3,2(R0) ;FRAGMENT SIZE VALID?O BNE 50$ ;IF NE, NO .IFF  BEQ 30$ ;IF EQ END OF CHAINS .ENDC CMP 2(R0),R1 ;BLOCK BIG ENOUGH? BLO 10$ ;IF LO NO;$ BEQ 20$ ;IF EQ BLOCK IS EXACT SIZE( TST (R0)+ ;POINT TO SIZE OF FREE BLOCK' SUB R1,(R0) ;CALCULATE SIZE REMAINING$ ADD R0,R1 ;POINT TO NEW FREE BLOCK MOV (R0),(R1) ;COPY SIZET MOV -(R0),-(R1) ;COPY LINKE+ MOV R1,(R0) ;STORE LINK TO NEW FREE BLOCKS" SUB R0,R1 ;RESTORE SIZE OF BLOCK120$: MOV (R0),(R2) ;UPDATE LINK TO NEW FREE BLOCK0 30$: ;  .IF DF P$$CTL .IF DF I$$CBP&K$$DASF& ROR (SP) ; IS THIS A TRACKABLE POOL?& BCC 34$ ; IF CC, NOPE, RETURN STATUS .IFF ;DF,I$$CBP&K$$DAS4 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) .IFTF ;DF,I$$CBP&K$$DAS BPL 32$ ;IF PL NO- .IFT ;DF,I$$CBP&K$$DASR6 BIT #F6.ICP,$FMSK6 ; HAS THIS FUNCTION BEEN DISABLED?( BEQ 31$ ; IF EQ, YES, RETURN THE ERROR;+B; Note: For a caller who is requesting *only* ICB pool, and notD; an original request for $CRAVL, a pool allocation failure will notD; be reported to PMT... for tracking. The failure will only occur ifE; the original request was made of normal primary pool, and a failureI!; occured on both possible pools. ;-+ ASL (SP)+ ; IS THIS ATTEMPT FOR ICB POOL?32 BEQ 35$ ; IF EQ, YES, RETURN FINAL STATUS, ERROR0 MOV #$ICAVL-2,R0 ; SET UP THE ICB POOL LISTHEAD! CALL $ALOC1 ; AND TRY AGAIN ...R" ROR -(SP) ; SAVE STATUS OF CARRY( BMI 31$ ; IF MI, FULL ALLOCATION ERROR) TST $PRILL ; IS ICB POOL THE LOW LIMIT?o BPL 34$ ; IF PL, NOPEr" BR 325$ ; REPORT THE POOL CHANGE31$: .IFTF ;DF,I$$CBP&K$$DAS/ MOV #PC.ALF!,R2 ;SET LOW POOL MASK ' BR 33$ ;REPORT THE ALLOCATION FAILUREo632$: SUB R1,$PRISZ ;SUBTRACT FROM TOTAL FREE POOL SIZE;+; ** W A R N I N G **U;F; SPM HOOKPOINT NUMBER 76.;A); DO NOT CHANGE THE INSTRUCTION FOLLOWINGL; LABEL WITHOUT CHECKING SPM;-+$SPH76==. ;SPM CHANGES THE INSTRUCTION AT  ;THE LOCATION OF THIS LABELT6 CMP @#$PRISZ,@#$PRILL ;DID WE CROSS LOWER POOL LIMIT?# BGE 34$ ;IF HIS NO, ALLOCATION OKO<325$: MOV #PC.LOW!,R2 ;SET UP LOW POOL CONDITION,33$: CALL $PLTRQ ;REQUEST POOL MONITOR TASK34$: .IFT ;DF,I$$CBP&K$$DAS27 ASL (SP)+ ; CLEAN THE STACK, AND SET CARRY AS NEEDED. .IFF ;DF,I$$CBP&K$$DASF1 ASL (R0) ;RECOVER THE CARRY BIT AND RESET LOC 0H .ENDC ;DF,I$$CBP&K$$DAS .ENDC35$: RETURN ;DONE .IF DF R$$DER 40$: ;S .IF DF P$$CTL .IF DF I$$CBP&K$$DASE ROR (SP) ; TRACKABLE POOL?& BCC 43$ ; IF CC, NOPE, FINISH UP ...= BIT #F6.ICP,$FMSK6 ; HAS THIS FUNCTION BEEN DISABLED BY LOA?S( BEQ 43$ ; IF EQ, Y00|ibjbkb a a aES, RETURN THE ERROR' ASL (SP)+ ; WAS THIS ALREADY ICB POOL, BEQ 45$ ; IF. MOV #$ICAVL-2,R0 ; POINT TO ICB POOL LISTHEAD) CALLR $ALOC1 ; AND RETRY THE ALLOCATION ,43$: ASL (SP)+ ; CLEAN STACK, AND SET CARRY .IFF ;DF,I$$CBP&K$$DASC INC (SP)+ ;CLEAN STACK .ENDC ;DF,I$$CBP&K$$DAS45$: .ENDC% DEC R0 ;RETURN A VALUE OF MINUS ONEP RETURN ;EC50$: BGCK$A BF.POL,BE.FSI,FATAL ;ALLOCATION - FRAGMENT SIZE INVALID  .ENDC .DSABL LSBB;++; **-$ALCLK-ALLOCATE CLOCK QUEUE CORE BLOCKR;J; THIS ROUTINE IS CALLED TO ALLOCATE A CORE BLOCK FOR A CLOCK QUEUE ENTRY.; ; INPUTS:I;P; NONE.E; ; OUTPUTS:;;A; IF INSUFFICIENT CORE IS AVAILABLE TO ALLOCATE THE BLOCK, THEN AT>; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED. ELSE THE ADDRESS OF6; THE ALLOCATED BLOCK IS RETURNED TO THE CALLER IN R0.;- .ENABL LSBI5$ALCLK::MOV #C.LGTH,R1 ;PICK UP LENGTH OF CLOCK BLOCKA BR 10$ ;;+-; **-$DECLK-DEALLOCATE CLOCK QUEUE CORE BLOCKBN; **-$DCLKA-DEALLOCATE CLOCK QUEUE BLOCK THAT MAY HAVE ACCOUNTING REQUIREMENTS;TG; THIS ROUTINE IS CALLED TO DEALLOCATE A CORE BLOCK THAT WAS BEING USEDO; FOR A CLOCK QUEUE ENTRY.;I ; INPUTS: ;E1; R0=ADDRESS OF THE CORE BLOCK TO BE DEALLOCATED.E;V ; OUTPUTS:;R2; THE CLOCK QUEUE ENTRY CORE BLOCK IS DEALLOCATED.;-$DCLKA:: .IF DF A$$CNT. CMPB #C.SCHD,C.RQT(R0) ;PERIODIC TASK REQUEST BEQ 2$ ;IF EQ YESC1 CMPB #C.SSHT,C.RQT(R0) ;SINGLE SHOT TASK REQUESTC BNE $DECLK ;IF NE NO 2$: MOV C.UAB(R0),R1 ;LOCATE UAB BEQ $DECLK ;IF EQ, NO UABN' MOV KISAR6,-(SP) ;SAVE CURRENT MAPPINGL MOV R1,KISAR6 ;MAP UABL) DECB @#B.USE+140000 ;DECREMENT USE COUNTU$ 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 ADDRESS.4$: MOV (SP)+,KISAR6 ;RESTORE ORIGINAL MAPPING .ENDC$DECLK::( .IF DF N$$DIR ;NAMED DIRECTORY SUPPORT/ CMPB #C.SCHD,C.RQT(R0) ;PERIODIC TASK REQUEST?0 BEQ 5$ ;IF EQ, YES2 CMPB #C.SSHT,C.RQT(R0) ;SINGLE SHOT TASK REQUEST? BNE 7$ ;IF NE, NOR-5$: TSTB C.NAM(R0) ;IS THERE A CONTEXT BLOCK?M BEQ 7$ ;IF EQ, NO4, MOV C.CTX(R0),R1 ;GET CONTEXT BLOCK POINTER BEQ 7$ ;BR IF EQ, NONE EXISTS4' CALL $DLCTX ;DEALLOCATE CONTEXT BLOCKE7$: ;REFERENCE LABEL+ .ENDC ; DF N$$DIR. MOV #C.LGTH,R1 ;PICK UP LENGTH OF CLOCK BLOCK BR $DEACB ;N;+3; **-$ALPKT-ALLOCATE SEND OR I/O REQUEST CORE BLOCKT;C; THIS ROUTINE IS CALLED TO ALLOCATE A CORE BLOCK FOR A SEND OR I/OS; REQUEST QUEUE ENTRY.;S ; INPUTS:T; ; NONE.;E ; OUTPUTS:;RA; IF INSUFFICIENT CORE IS AVAILABLE TO ALLOCATE THE BLOCK, THEN AN>; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED. ELSE THE ADDRESS OF6; THE ALLOCATED BLOCK IS RETURNED TO THE CALLER IN R0.;-0$ALPKT::MOV #I.LGTH,R1 ;SET LENGTH OF I/O PACKET,10$: CALL $ALOCB ;ATTEMPT TO ALLOCATE BLOCK BCC 80$ ;IF CC SUCCESSFULL! DRSTS D.RS1 ;ALLOCATION FAILURER;+5; **-$DEPKT-DEALLOCATE SEND OR I/O REQUEST CORE BLOCKC;OG; THIS ROUTINE IS CALLED TO DEALLOCATE A CORE BLOCK THAT WAS BEING USEDE(; FOR A SEND OR I/O REQUEST QUEUE ENTRY.;V ; INPUTS:A;C1; R0=ADDRESS OF THE CORE BLOCK TO BE DEALLOCATED.1;S ; OUTPUTS:; @; THE SEND OR I/O REQUEST QUEUE ENTRY CORE BLOCK IS DEALLOCATED.;-0$DEPKT::MOV #I.LGTH,R1 ;SET LENGTH OF I/O PACKET;+"; **-$DEACB-DEALLOCATE CORE BUFFER4; **-$DEAC1-DEALLOCATE CORE BUFFER (ALTERNATE ENTRY);LH; THIS ROUTINE IS CALLED TO DEALLOCATE AN EXEC CORE BUFFER. THE BLOCK ISD; INSERTED INTO THE FREE BLOCK CHAIN BY CORE ADDRESS. IF AN ADJACENTF; BLOCK IS CURRENTLY FREE, THEN THE TWO BLOCKS ARE MERGED AND INSERTED; IN THE FREE BLOCK CHAIN.;O ; INPUTS:A;C2; R0=ADDRESS OF THE CORE BUFFER TO BE DEALLOCATED.4; R1=SIZE OF THE CORE BUFFER TO DEALLOCATE IN BYTES.>; R3=ADDRESS OF CORE ALLOCATION LISTHEAD-2 IF ENTRY AT $DEAC1.;O ; OUTPUTS:;R;; THE CORE BLOCK IS MERGED INTO THE FREE CORE CHAIN BY CORE ?; ADDRESS AND IS AGCOMERATED IF NECESSARY WITH ADJACENT BLOCKS.C;-7$DEACB::MOV 00t__DATADATADATADATA#$CRAVL-2,R3 ;POINT TO ALLOCATION MASK WORDA .IF DF I$$CBP&K$$DASR+ CMP R0,#$POOL ; IS THIS BLOCK IN ICB POOL? . BHIS 20$ ; IF HIS, NOPE, NORMAL PRIMARY POOL% MOV #$ICAVL-2,R3 ; POINT TO ICB POOL $ BR $DEAC1 ; AND GO DEALLOCATE pOOL20$: .ENDC ;DF,I$$CBP&K$$DAS .IF DF Q$$OPT% ADD (R3),R1 ;ROUND TO NEXT BOUNDARYC 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 NOS7 MOV #$PKMAX,R2 ;PNT TO MAX # OF PACKETS TO PREALLOCATE3* CMPB (R2),-(R2) ;MAX NUMBER PREALLOCATED? BLOS 30$ ;IF LOS YES;+; ** W A R N I N G ** ; ; SPM HOOKPOINT NUMBER 75.;P); DO NOT CHANGE THE INSTRUCTION FOLLOWING ; LABEL WITHOUT CHECKING SPM;-+$SPH75==. ;SPM CHANGES THE INSTRUCTION AT$ ;THE LOCATION OF THIS LABEL' INC (R2) ;INDICATE ONE MORE AVAILABLEC+ MOV -(R2),(R0) ;LINK PACKET INTO LIFO LISTL MOV R0,(R2) ;L RETURN ;Q .ENDC ;Q$$OPT,$DEAC1::ADD (R3),R1 ;ROUND TO NEXT BOUNDARY BIC (R3)+,R1 ;CLEAR EXCESS3$ BEQ 80$ ;IF EQ NO BLOCK TO RELEASE30$: ;REF LABELC.IIF DF R$$DER!P$$CTL!C$$RTK MOV R3,-(SP) ;SAVE ADDRESS OF LISTHEAD.40$: MOV R3,R2 ;SAVE ADDRESS OF CURRENT BLOCK( MOV (R2),R3 ;GET ADDRESS OF NEXT BLOCK BEQ 50$ ;IF EQ END OF CHAINN CMP R0,R3 ;BLOCK GO HERE?I BHIS 40$ ;IF HIS NO;)50$: MOV R3,(R0) ;ASSUME NO AGLOMERATION0 .IF DF P$$CTL/ CMP #$CRAVL,(SP) ;DEALLOCATION OF EXEC'S POOL?N .IF DF,I$$CBP&K$$DAS:+ BEQ $SPH74 ;IF EQ, YES, INCLUDE THE STATS3' CMP #$ICAVL,(SP) ; HOW ABOUT ICB POOL?L .ENDC ;DF,I$$CBP&K$$DAS& BNE 53$ ; IF NE, NOPE, FINISH UP ...;+; ** W A R N I N G ** ;L; SPM HOOKPOINT NUMBER 74.;V); DO NOT CHANGE THE INSTRUCTION FOLLOWINGG; LABEL WITHOUT CHECKING SPM;-+$SPH74==. ;SPM CHANGES THE INSTRUCTION ATE ;THE LOCATION OF THIS LABEL:* ADD R1,@#$PRISZ ;COUNT SIZE IN POOL TOTAL 53$: ; .ENDC ; DF P$$CTL- MOV R0,-(SP) ;CALCULATE ADDRESS OF NEW BLOCKA ADD R1,(SP) ;; .IF DF R$$DER' BCS 110$ ;IF CS, ILLEGAL DEALLOCATIONU3 CMP 2(SP),#$CRAVL ;DEALLOCATION IN EXECUTIVE POOL?F BNE 55$ ;IF NE NO.2 CMP R0,#$POOL ;DEALLOCATION BEFORE FRONT OF LIST? BLO 120$ ;IF LOW, YESC0 CMP (SP),$EXSIZ ;DEALLOCATION PAST END OF POOL? BHI 130$ ;IF HIGH, YES55$: ;REFERENCE LABEL .IFTF ;R$$DER& CMP R3,(SP)+ ;EQUAL TO NEXT IN CHAIN? .IFT ;R$$DERE' BLO 90$ ;IF LO, DEALLOCATION OVERLAPS$ .IFTF ;R$$DER BNE 60$ ;IF NE NOO1 MOV (R3)+,(R0) ;MOVE LINK WORD TO BLOCK RELEASED ADD (R3),R1 ;MERGE TWO BLOCKSC160$: MOV R2,-(SP) ;SAVE ADDRESS OF PREVIOUS BLOCKV% MOV R0,(R2)+ ;ASSUME NO AGLOMERATION,/ ADD (R2),(SP) ;CALCULATE ADDRESS OF NEXT BLOCK1- CMP R0,(SP)+ ;EQUAL TO BLOCK BEING RELEASED?I .IFT ;R$$DERO BHIS 65$ ;IF HIS, NO OVERLAP7 CMP (SP),#$CRAVL ;DEALLOCATION IN EXECUTIVE CORE POOL?E0 BEQ 100$ ;IF EQ YES (ELSE NOT SURE OF OVERLAP)65$: ;REF LABEL .ENDC ;R$$DER BNE 70$ ;IF NE NO6 ADD (R2),R1 ;MERGE TWO BLOCKSM1 MOV (R0),-(R2) ;MOVE LINK WORD TO PREVIOUS BLOCKR% MOV R2,R0 ;SET NEW ADDRESS OF BLOCK -70$: MOV R1,2(R0) ;SET SIZE OF BLOCK RELEASEDM .IF DF P$$CTL0 CMP #$CRAVL,(SP) ;ALLOCATION IN EXEC CORE POOL? .IF DF,I$$CBP&K$$DASL+ BEQ 73$ ; IF EQ, YES, CHECK FOR HIGH POOL % CMP #$ICAVL,(SP) ; IF THIS ICB POOL?R .ENDC ;DF,I$$CBP&K$$DAS- BNE 75$ ;IF NE NO, SKIP DEALLOCATION CHECKSU673$: CMP $PRISZ,$PRIHL ;DID WE CROSS UPPER POOL LIMIT? BLE 75$ ;IF LE NO8 MOV #PC.HIH!,R2 ;SET UP HIGH POOL CONDITION TST (SP)+ ;CLEAN STACK' BR $PLTRQ ;REQUEST POOL RECOVERY TASK75$: .ENDC ;P$$CTL .IF DF C$$RTK, CMP #$CRAVL,(SP)+ ;ALLOCATION IN CORE POOL? BNE 80$ ;NOPE, EXITP: TST $CPPOL ;CPRSX COMMUNICATION DRIVER WAITING FOR POOL? BEQ 80$ ;NOPE, EXITP* CALL $CPRCV ;LET CPR DRIVER USE THE POOL .IFF ;C$$RTKS-.IIF DF P$$CTL!R$$DER TST (SP)+ ;CLEAN STACKU .ENDC ;C$$RTK80$: RETURN ;S .IF DF R$$DER$90$: TST R3 ;INSERT AT END OF LIST? BEQ 60$ ;IF EQ YES, OK5100$: BGCK$A BF.POL,BE.DDA,FATAL ;00|ibjbkb a a aDOUBLE DEALLOCATIONR7110$: BGCK$A BF.POL,BE.SIZ,FATAL ;SIZE OF BLOCK INVALIDD>120$: BGCK$A BF.POL,BE.BAK,FATAL ;DEALLOCATED BLOCK BELOW POOL6130$: BGCK$A BF.POL,BE.POV,FATAL ;OVERLAPS END OF POOL .ENDC ;R$$DER .DSABL LSBP;+%; **-$PLTRQ-REQUEST POOL MONITOR TASKH;O;; THIS ROUTINE IS USED TO REQUEST THE EXECUTION OF THE POOLAC; MONITOR TASK, IF INSTALLED. THE FORMAT OF THE POOL TASK/EXECUTIVE0$; COMMUNICATIONS WORD IS AS FOLLOWS:;6:; $POLST CONTAINS CONDITION BITS INDICATING THE CUMULATIVE6; HISTORY OF THE POOL'S CONDITION SINCE THE LAST TIME6; THAT THE POOL MONITOR TASK CLEARED THEM. THESE BITS4; ARE SET BY THIS ROUTINE AND MAY BE CLEARED BY THE5; POOL MONITOR TASK. NOTE THAT MORE THAN ONE BIT MAYB'; BE SET IN THIS BYTE AT ANY ONE TIME.N@; $POLST+1 CONTAINS INHIBIT BITS INDICATING WHAT POOL CONDITIONS9; THE POOL MONITOR TASK IS CURRENTLY AWARE OF. A BIT SET :; IN THIS BYTE INDICATES TO THIS ROUTINE A POOL CONDITION6; THAT DOES NOT REQUIRE EXECUTION OF THE POOL MONITOR7; TASK. THESE BITS ARE ONLY MODIFIED BY THE POOL TASK. 5; GENERALLY, THERE IS NEVER MORE THAN ONE BIT SET IN ; THIS BYTE AT ANY GIVEN TIME.A;M=; THE CALLER OF THIS ROUTINE PROVIDES A BIT MASK INDICATING A A; POOL CONDITION THAT IT WISHES TO MAKE KNOWN TO THE POOL MONITORCD; TASK. THE GENERAL FORM OF THIS BIT MASK IS #>,A; WHERE 'XXX' DENOTES WHICH OF THE EIGHT POTENTIAL CONDITIONS THEE@; USER WISHES TO MAKE KNOWN TO THE POOL MONITOR TASK (BY STORINGB; THE PC.XXX BIT IN THE LOW BYTE OF $POLST). THE FOLLOWING ACTIONS ; CAN OCCUR:; =; 1) IF THE SPECIFIED LOW BYTE MASK BIT IS ALREADY SET IN THEY?; LOW BYTE OF $POLST, THEN THIS INDICATES THAT THIS ROUTINE HAS ?; 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.;0=; 2) IF THE BIT IS NOT ALREADY SET IN THE LOW BYTE OF $POLST,I>; 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 BIT8; IS ALREADY SET IN THE HIGH BYTE, THEN THE POOL TASK IS@; CURRENTLY AWARE OF THE CONDITION AND DOES NOT WISH TO EXECUTE.A; IF THE BIT IS NOT SET IN THE HIGH BYTE, THEN THE POOL CONDITIONC=; IS A NEW ONE AND THE POOL MONITOR TASK IS REQUESTED TO RUN.0; G; THIS INTERFACE IS FLEXIBLE ENOUGH TO ALLOW OTHER INTERFACE PROTOCOLS: ;I?; - ONE INHIBIT BIT ($POLST+1) COULD BE DEFINED TO 'COVER' MOREN=; THAN ONE CONDITION BIT ($POLST+0). FOR INSTANCE, $PLTRQ CANF@; BE CALLED WITH R2=403, WHERE THERE ARE TWO CONDITION BITS SET,.; BUT ONLY ONE INHIBIT BIT SPECIFIED FOR BOTH.;W=; - THERE NEED NOT BE A MIRROR-IMAGE RELATIONSHIP BETWEEN THET=; INHIBIT BITS AND THE CONDITION BITS. FOR VARYING CONDITIONSN@; AND STATES, VARIOUS COMBINATIONS OF THESE BITS CAN BE ENCODED.;T?; - NO INHIBIT BIT NEED BE SPECIFIED AT ALL. IN THIS CASE, EVENI@; IF THE POOL MONITOR TASK HAD SET THE CORRESPONDING INHIBIT BIT=; IN $POLST+1 FOR THE CONDITION ABOUT TO BE REPORTED, LEAVINGF?; THE HIGH BYTE OF R2 CLEAR WILL FORCE THE POOL MONITOR TASK TO,8; EXECUTE FOR THAT CONDITION REPORTED IN THE LOW BYTE OF=; R2 (UNLESS, OF COURSE, THAT BIT IS ALREADY SET IN $POLST+0,N<; INDICATING A MULTIPLE REQUEST). FOR INSTANCE, IF $PLTRQ IS<; CALLED WITH R2=1, THE POOL TASK MAY EXECUTE AND SET $POLST;; TO 400, THE INHIBIT BIT FOR POOL CONDITION '1'. IF $PLTRQS=; WERE THEN CALLED AGAIN WITH R2=1, THE POOL TASK WOULD AGAINI>; BE CALLED BECAUSE R2 DID NOT HAVE THE INHIBIT BIT SPECIFIED.8; THIS OPERATION FORCES THE POOL TASK TO RESPOND ANYWAY.;OC; THE REASON FOR SUCH FLEXIBILITY IS TO GENERALIZE THE INTERFACE TO F; BE USEFUL FOR A VARIETY OF CHORES. THE INTERFACE NEED NOT BE LIMITED; TO POOL STATUS REPORTING. ; ; INPUTS:F;L<; R2=POOL CONDITION BIT MASK (PC.XXX OR'ED WITH PC.XXX*400).;L ; OUTPUTS:;H;; 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 THEE8; POOL TAS00t__DATADATADATADATAK IS REQUESTED WITH THE REASON FOR THE REQUEST?; (PC.XXX) STORED IN THE LOW BYTE OF $POLST. OTHERWISE, RETURN.E;N; R0,R1 AND R3 ARE PRESERVED.E;- .ENABL LSBA$PLTRQ:: .IF DF P$$CTL6 BITB R2,$POLST ;ALREADY REQUESTED FOR THIS CONDITION?- BNE 20$ ;IF NE YES, AVOID MULTIPLE REQUESTS 0 BISB R2,$POLST ;INDICATE CURRENT POOL CONDITION' CLRB R2 ;CHECK POOL TASK INHIBIT BITSS5 BIT R2,$POLST ;REQUEST POOL TASK FOR THIS CONDITION?S1 BNE 20$ ;IF NE NO, TASK AWARE OF POOL CONDITIONH MOV R0,-(SP) ;SAVE R0, MOV $PTTCB,R0 ;POOL MONITOR TASK INSTALLED?% BEQ 10$ ;IF EQ NO, CAN'T REQUEST ITH MOV R1,-(SP) ;SAVE R1 MOV R3,-(SP) ;SAVE R3, CALL $EXRQN ;REQUEST THE POOL MONITOR TASK MOV (SP)+,R3 ;RESTORE R3A MOV (SP)+,R1 ;RESTORE R1T10$: MOV (SP)+,R0 ;RESTORE R0I20$: .ENDC ; DF P$$CTL RETURN ;D .DSABL LSBO;+4; **-$ALSEC-ALLOCATE CORE BUFFER FROM SECONDARY POOL=; **-$ALSC1-ALLOCATE 32 WORD BLOCKS OF POOL - ALTERNATE ENTRY ; ;NJ; THIS ROUTINE IS CALLED TO ALLOCATE A BLOCK FROM THE SECONDARY POOL. THEA; ALLOCATION ALGORITHM IS FIRST FIT (SAME AS $ALOCB). BLOCKS AREJ; ALLOCATED IN UNITS OF 32 WORDS, AND A BLOCK WILL ALWAYS START ON A 32 WD*; BOUNDRY TO FACILITATE MAPPING THE BLOCK.;M ; INPUTS: ;S5; R1=SIZE OF THE BUFFER TO ALLOCATE IN 32 WORD BLOCKS;0; R2=ADDRESS OF POOL LISTHEAD IF ENTRY AT $ALSC1;$ ; OUTPUTS:;C=; C=1 IF INSUFFICIENT CORE IS AVAILABLE TO ALLOCATE THE BLOCKO ; R0=-1 ;L&; C=0 IF THE ALLOCATION WAS SUCCESSFUL.; R0=ADDRESS OF BLOCK (TO BE USED IN AN APR)2; R1=SIZE OF BLOCK JUST ALLOCATED IN 32 WD UNITS;S"; R3, R4, R5 PRESERVED ACROSS CALL;U;-$ALSEC:: .IF DF P$$OOLE .IIF DF C$$SC1 MOV #$POLHD,R2 ;PUT $POLHD WHERE ROUTINE LOOKS FOR IT $ALSC1:: .ENABL LSBF SAVNR ;SAVE R4, R5N, .IF DF C$$SC1 ;IF ALTERNATE SECONDARY POOL MOV R3,-(SP) ;AND R3  MOV R2,R3 ;MOVE THE LISTHEAD .ENDC ;C$$SC1* MOV #-1,R0 ;ASSUME REQUESTED LENGTH IS 03 MOV #KISAR6,R4 ;POINT TO APR USED FOR POOL MAPPING % MOV (R4),-(SP) ;SAVE CURRENT MAPPINGZ5 MOV #140000,R2 ;VIRTUAL ADDRESS OF MAPPED POOL BLOCK 0 CLR R5 ;PREVIOUS BLOCK IN LIST IS THE LISTHEAD TST R1 ;IS LENGTH ZERO?C SEC ;ASSUME IT IS BEQ 50$ ;IF EQ YES< .IIF DF C$$SC1 MOV (R3),(R4) ;MAP FIRST FREE BLOCK IN POOL> .IIF NDF C$$SC1 MOV $POLHD,(R4) ;MAP FIRST FREE BLOCK IN POOL BR 20$R110$: MOV (R4),R5 ;SAVE CURRENT BLOCK AS PREVIOUSS! MOV (R2),(R4) ;MAP TO NEXT BLOCKD!20$: BEQ 50$ ;IF EQ, END OF LISTT# CMP 2(R2),R1 ;IS BLOCK BIG ENOUGH?( BLO 10$ ;IF LO NON BEQ 30$ ;IF EQ YES, EXACT FITU. MOV (R2)+,-(SP) ;SAVE LINK TO NEXT POOL BLOCK MOV (R2),-(SP) ;SAVE SIZE' SUB R1,(SP) ;CALCULATE REMAINING SIZE 0 ADD R1,(R4) ;MAP TO REMAINING PORTION OF BLOCK8 MOV (SP)+,(R2) ;GET REMAINING SIZE OF UNALLOCATED BLOCK* MOV (SP),-(R2) ;INSERT LINK TO NEXT BLOCK% MOV (R4),(SP) ;SAVE ADDRESS OF BLOCK,0 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 BLOCKU .IFDF C$$SC1I( CMP R3,#$POLHD ;IS THIS SECONDARY POOL?# CLC ;MAKE SURE CARRY STAYS CLEARO+ BNE 35$ ;NO, LEAVE TOTAL FREE SPACE ALONE, .ENDC ;C$$SC19 SUB R1,$SECFR ;SUBTRACT AMOUNT ALLOCATED FROM TOTAL FREEK335$: MOV (R2),-(SP) ;GET ADDRESS OF NEXT FREE BLOCKB$ MOV R5,(R4) ;MAP TO PREVIOUS BLOCK0 BEQ 40$ ;IF EQ, PREVIOUS BLOCK IS THE LISTHEAD) MOV (SP)+,(R2) ;UNLINK ALLOCATED SECTIONL BR 50$M40$:: .IIF DF C$$SC1 MOV (SP)+,(R3) ;UNLINK ALLOCATED SECTION; .IIF NDF C$$SC1 MOV (SP)+,$POLHD ;UNLINK ALLOCATED SECTIONI450$: MOV (SP)+,(R4) ;RESTORE ORIGINAL KISAR6 MAPPING= .IIF DF C$$SC1 MOV (SP)+,R3 ;RESTORE ORIGINAL CONTENTS OF R3; 60$: RETURNB;+F; **-$ALSPK-ALLOCATE A RECEIVE BY REFERENCE PACKET FROM SECONDARY POOL5; **-$ALVPK-ALLOCATE A PACKET FROM THE SECONDARY POOLR;O<; THIS ROUTINE IS CALLED TO ALLOCATE A SECONDARY POOL BLOCK.%; THE PACKET IS MAPPED THROUGH APR 5.L;B ; INPUTS::;.2; R1=SIZE OF BLOCK IN UNITS OF 32. WORDS ($ALVPK).;N ; OUTPUTS:;S$; C=0 IF00|ibjbkb a a a A BLOCK HAS BEEN ALLOCATED.1; R0=120000 (THE PACKET IS MAPPED THROUGH APR5).I&; 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.T;O;-5$ALSPK::MOV #/100,R1 ;GET SIZE TO ALLOCATEN&$ALVBK::CALL $ALSEC ;ALLOCATE A BLOCK# BCS 65$ ;IF CS ALLOCATION FAILURE+ MOV R0,KISAR5 ;MAP THE PACKET THROUGH APR5 2 MOV #120000,R0 ;POINT TO FIRST WORD OF THE PACKET RETURN ;RETURN WITH C=0%65$: DRSTS D.RS1 ;ALLOCATION FAILUREE;+D; **-$DESPK-DEALLOCATE RECEIVE BY REFERENCE PACKET TO SECONDARY POOL;MD; THIS ROUTINE IS CALLED TO DEALLOCATE A RECEIVE BY REFERENCE PACKET; TO THE SECONDARY POOL.; ; INPUTS: ;U;; R0=ADDRESS OF PACKET TO BE DEALLOCATED. THIS MUST BE THEO<; APR VALUE TO MAP THE FIRST 32. WORD SEGMENT OF THE BLOCK.; ; OUTPUTS:;A; NONE.M;R;- .IFTF$DESPK:: .IFTR0 MOV #/100,R1 ;GET SIZE TO DEALLOCATE;+3; **-$DESEC-DEALLOCATE CORE BLOCK IN SECONDARY POOLO;; **-$DESC1-DEALLOCATE 32-WORD CORE BLOCK INTO PRIVATE POOL ;KH; THIS ROUTINE IS CALLED TO DEALLOCATE A SECONDARY POOL BLOCK. THE BLOCKH; IS INSERTED INTO THE FREE BLOCK CHAIN BY CORE ADDRESS. IF AN ADJACENT:; BLOCK IS CURRENTLY FREE, THEN THE TWO BLOCKS ARE MERGED.;V ; INPUTS: ; ?; R0=ADDRESS OF CORE BLOCK TO BE DEALLOCATED. THIS MUST BE THEM:; APR VALUE TO MAP THE FIRST 32 WORD SEGMENT OF THE BLOCK,; R1=SIZE OF THE BLOCK IN UNITS OF 32 WORDS.0; R2=ADDRESS OF POOL LISTHEAD IF ENTRY AT $DESC1;$ ; OUTPUTS:;E>; THE CORE BLOCK IS MERGED INTO THE FREE CORE CHAIN BY ADDRESS2; AND MERGED WITH ANY BORDERING BLOCKS IF POSSIBLE; ; R3, R4, R5 PRESERVED;L;- .IFTF$DESEC::? .IIF DF C$$SC1 MOV #$POLHD,R2 ;PUT $POLHD ADDRESS WHERE NEEDEDA$DESC1:: .IFTN TST R1 ;IS LENGTH ZERO BEQ 140$ ;IF EQ YESC SAVNR ;SAVE R4, R5M MOV R3,-(SP) ;SAVE R3; .IIF DF C$$SC1 MOV R2,-(SP) ;PUT THE LISTHEAD ON THE STACKI .IF NDF X$$SEC., .IF DF C$$SC1 ;IF ALTERNATE SECONDARY POOL/ CMP (SP),#$POLHD ;IS THIS REAL SECONDARY POOL?I4 BNE 69$ ;NO, DON'T CHECK FOR IT BEING IN PARTITION .ENDC ;C$$SC1 MOV $PLPAR,R3 ;LOCATE PARTITION+ MOV P.REL(R3),R4 ;GET ITS STARTING ADDRESSC* CMP R4,R0 ;DOES BLOCK START IN PARTITION BHI 160$ ;IF HIGH, NO.0 ADD P.SIZE(R3),R4 ;GET TOP ADDRESS IN PARTITION .IFTF% ADD R1,R0 ;GET TOP ADDRESS OF BLOCK + BCS 150$ ;CS- OVERFLOW....BAD DEALLOC LENT .IFTH( CMP R4,R0 ;DOES BLOCK END IN PARTITION BLO 170$ ;IF LOW, NO .ENDC* SUB R1,R0 ;RESTORE BASE ADDRESS OF BLOCKI69$: .IIF DF C$$SC1 MOV @(SP),R3 ;GET THE ADDRESS OF THE FIRST FREE BLOCK1G .IIF NDF C$$SC1 MOV $POLHD,R3 ;GET THE ADDRESS OF THE FIRST FREE BLOCK - MOV #140000,R4 ;GET VIRTUAL ADDRESS OF BLOCKI* MOV #KISAR6,R5 ;POINT TO MAPPING REGISTER% MOV (R5),-(SP) ;SAVE CURRENT MAPPING.3 CLR -(SP) ;WORD FOR STORING TOP OF PREVIOUS BLOCK11 CLR R2 ;INITIAL PREV. BLOCK IN LIST IS LISTHEAD&70$: MOV R3,(R5) ;MAP NEXT FREE BLOCK BEQ 95$ ;IF EQ, END OF LISTN/ CMP R0,R3 ;DOES BLOCK GO BEFORE CURRENT BLOCK BLO 80$ ;IF LO YES BEQ 180$3+ MOV R3,(SP) ;GET ADDRESS OF CURRENT BLOCK.* ADD 2(R4),(SP) ;CALCULATE ITS TOP ADDRESS0 MOV R3,R2 ;STORE ADDRESS AS THE PREVIOUS BLOCK/ MOV (R4),R3 ;POINT TO NEXT BLOCK IN FREE LISTT BR 70$ ;580$: ADD R1,R0 ;GET TOP ADDRESS IN DEALLOCATED BLOCK-3 CMP R0,R3 ;CAN IT BE COMBINED WITH THE NEXT BLOCKR BNE 90$ ;IF NE NOC. MOV (R4)+,-(SP) ;SAVE LINK TO NEXT FREE BLOCK MOV (R4),-(SP) ;SAVE LENGTH2 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 BLOCKC) MOV (SP)+,-(R4) ;LINK TO NEXT FREE BLOCKE BR 100$890$: BHI 180$ ;IF HIGH, DEALLOCATED BLOCK OVERLAPS NEXT2 SUB R1,R0 ;GET BASE ADDRESS OF DEALLOCATED BLOCK.95$: MOV R0,(R5) ;MAP BLOCK BEING DEALLOCATED5 MOV R3,(R4) ;INSERT LINK TO NEXT BLOCK IN FREE LISTC MOV R1,2(R4) ;INSERT LENGTH;100$: CMP (SP)+,R0 ;CAN BLOCK BE MERGED WITH00t__DATADATADATADATA PREVIOUS BLOCK  BNE 110$ ;IF NE NO. MOV (R4)+,-(SP) ;SAVE LINK TO NEXT FREE BLOCK MOV (R4),-(SP) ;AND LENGTHT. MOV R2,(R5) ;MAP PREVIOUS BLOCK IN FREE LIST4 ADD (SP)+,(R4) ;ADD LENGTH TO WHAT IS ALREADY THERE$ MOV (SP)+,-(R4) ;LINK TO NEXT BLOCK BR 130$5110$: BHI 180$ ;IF HI, BLOCK OVERLAPS PREVIOUS BLOCKC! MOV R2,(R5) ;MAP PREVIOUS BLOCKB, BNE 120$ ;IF NE, THERE IS A PREVIOUS BLOCKF .IIF DF C$$SC1 MOV 2(SP),R4 ;USE THE LIST HEAD AS THE PREVIOUS BLOCKH .IIF NDF C$$SC1 MOV #$POLHD,R4 ;USE THE LIST HEAD AS THE PREVIOUS BLOCK;120$: MOV R0,(R4) ;LINK BLOCK BEING DEALLOCATED INTO CHAIN 130$:N .IF DF C$$SC1; CMP 2(SP),#$POLHD ;WAS THIS A SECONDARY POOL DEALLOCATION?T BNE 135$ ;NO, JUST CONTINUEV .ENDC ;C$$SC14 ADD R1,$SECFR ;ADD AMOUNT DEALLOCATED TO TOTAL FREE.135$: MOV (SP)+,(R5) ;RESTORE ORIGINAL MAPPING- .IIF DF C$$SC1 TST (SP)+ ;POP $POLHD ADDRESSO MOV (SP)+,R3 ;RESTORE R3 140$: RETURN7150$: BGCK$A BF.POL,BE.SIZ,FATAL ;SIZE OF BLOCK INVALID1>160$: BGCK$A BF.POL,BE.BAK,FATAL ;DEALLOCATED BLOCK BELOW POOL6170$: BGCK$A BF.POL,BE.POV,FATAL ;OVERLAPS END OF POOL5180$: BGCK$A BF.POL,BE.DDA,FATAL ;DOUBLE DEALLOCATIONS .DSABL LSBO .ENDC .END135$ ;NO, JUST CONTINUEV .ENDC ;C$$SC14 ADD R1,$SECFR ;ADD AMOUNT DEALLOCATED TO TOTAL FREE.135$: MOV (SP)+,(R5) ;RESTORE ORIGINAL MAPPING- .IIF DF C$$SC1 TST (SP)+ ;POP $POLHD ADDRESSO MOV (SP)+,R3 ;RESTORE R3 140$: RETURN7150$: BGCK$A BF.POL,BE.SIZ,FATAL ;SIZE OF BLOCK INVALID1>160$: BGCK$A B .TITLE DCWOP - Write operations .IDENT /05.00/Y .IF DF D$$CHE;r1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.m; All rights reservede;e;d; Previously modified by:I;>; J. Kauffman 10-DEC-87 02.00; L.B.McCulley 31-Dec-91 4.00; D. Carroll 27-July-1992 4.01u"; L. B. McCulley 8-Aug-1992 4.01a!; D. Carroll 8-October-1992 4.02T"; D. Carroll 30-October-1992 4.03; D. Carroll 12-Nov-1992 4.04; D. Carroll 21-Nov-1992 4.05; D. Carroll 01-May-1995 4.06;n$; Modified for RSX-11M-PLUS V4.6 by:; ; D. Carroll 8-Jan-1996 05.00*; DC430 -- Modified to handle 32-bit LBNs;M;e;I'; Disk Data Caching Write functionality;<; See module DCCHE,DCROP for a complete description of write&; interactions with disk data caching.;o;- .MCALL F11DF$( F11DF$ ; Define window block offsets .PSECT DC$WOP, RO, I4 T .SBTTL Write Phase-Ib! .SBTTL + DCW1 - Write operations1;+$; **-DCW1- Write operations, Phase I;. ; Passed:1 ; UCBX mapped;; R1 -> I/O packet*; I.EFN := Indicates if I/O is virtual%; I.TCB -> TCB of requesting taske0; T.ST3 := T3.ACP indicates I/O is from an ACP'; I.PRM+P2 := Size of request in bytesD ; R5 -> UCBm;t ; Returned: 2; All writes require some processing in cache, so:8; C-CLR returned to tell $DRQRQ not to forward to driverD; $DRQRQ called to explicitly queue packet to driver with cacher IOC=; (always goes to driver bypassing cache if cacher is mapped)a;I ; Action:s8; All extents involved will be acted upon no matter what9; behaviour attributes have been selected for the device.s;gF; If exactly one extent maps the request then it will be "locked down"H; and the driver invoked through $DRQRQ. The internal IOC will transfer6; data to cache when the write completes successfully.;eG; Otherwise all involved extents will be deleted and the driver invokedaE; via $DRQRQ. A placeholder CED is retained in cache to close a racee:; window with possible overlapping read-aheads from cache.;wE; All asynchronous I/O is serialized by using the attachment queue toc+; the CED and the cache Phase 2 processing.t; ;s; Notes:9; I/O operations which specify the bypass bits must stillt7; update the cache, for the benefit of other non-bypass ;; readers. Keep in mind that IQ.UMD (user-mode diagnostic) ;; requests use parameter 6 to specify the diagnostic buffer9; address. Therefore, the cache can only use parameter 3o; if it really has to.;o6DCW1:: CLRB I.PRM+P3+1(R1) ; initialize the high byte# C00|ibjbkb a a aALL INICTX ; Initialize context & BCC COMMON ; if CC, not virtual I/O" TST $DCCEL ; extent info valid?) BEQ COMMON ; if EQ, nope, don't bothert0 CALL CLCLEN ; determine size to check caching, CMPB R4,@2(R0) ; is the request too large?0 BHI COMMON ; too big, can't defer this extent= BITB #XC.DFR,APR6.BASE+X.CSTS ; are deferred extents allowedd .IF DF CHEWBH+ BNE 10$ ; if NE, process deferred optioni8 BITB #X2.WBH,APR6.BASE+X.CST2 ; is write-behind allowed .ENDC ;DF,CHEWBHC& BEQ COMMON ; if EQ, nope, finish up ;+ ; if bypass bits set in write subfunction, & ; purge cache of any affected extents ; and pass request to driverC ;210$: BIT #CHEBYP, I.FCN(R1) ; any bypass bits set?% BNE COMMON ; yes, can't cache suchB0 BIT #777,I.PRM+P2(R1) ; partial block transfer?% BNE COMMON ; yes, can't cache suchr9 MOVB $DCSTS,I.PRM+P3+1(R1) ; save the extent status bytec .IF DF CHEWBH? BICB #^C,I.PRM+P3+1(R1) ; isolate all but deferred sts, BNE COMMON ; if NE, yes, don't invoke WBHB BITB #X2.WBH,APRD.BASE+X.CST2 ; are write behind operations legal. BEQ COMMON ; if EQ, nope, just use deferred .IF DF P$$CTL ;DC430; CMP $PRISZ,#1000. ; enough space for write-behind? ;DC430,0 BLO COMMON ; if LO, nope, skip it ... ;DC430 .ENDC ;DF,P$$CTL ;DC430 ;DC430> BISB #,I.PRM+P3+1(R1) ; flag for deferred path .ENDC ;DF,CHEWBHH1COMMON: CLR $DCCEL ; invalidate previous statusb/ MOV 4(R0),R0 ; extract the statistics address'% MP.PAR ; map cache par for GETCRP.- CALL GETCRP ; get cache request packet forC& BCC 40$ ; ... local context storage320$: CALLR CHEPUR ; clean out overlapping extents $; got Cache Request Packet, go ahead?40$: MOVB I.PRM+P3+1(R1),R.LBNL(R2) ; save deferred status flag . CLRB I.PRM+P3+1(R1) ; and reset flag to zero3 MOV R0,R.STAT(R2) ; Set statistics context in CRP;( USTAT$ S.WTOT ; Increment write total. CALLR Q2PHS1 ; queue the packet to phase II i4 .SBTTL + DCW2 - Phase 2 entry, test deferred writes;+; **-DCW2- Write Phase II entryt;c?; Request here is eligible for cache processing (eg, no bypass)E; ; Deferred writes?;nH; This section checks to see if the I/O request is virtual and it is for8; a temporary file; i.e. WS.MDL is set in window status.;1K; If so, it should be deferred if possible so search for an existing extentt; 1; If none is found, dispatch to create a new CED.CM; If any existing extent is found, it is tested for partial overlap conditione;yI; If exactly one extent completely contains the range of the request, the +; transfer is performed within that extent. ;aJ; Any partially overlapping extents are purged to disk, and after all suchJ; extents purge successfully, a new CED is created to complete the requeueI; Failure to allocate a buffer for the extent will cause a write to disk.a;x; Input: ; R1 - URPf ; R5 - UCBd ; UCBX mappedr;-&DCW2:: MP$PAR ; map cache partition$ MOV I.CRP(R1),R2 ; Get CRP pointer: MOV R.LBNL(R2),-(SP) ; Save flag for I/O request deferred MP.UCBX ; map the UCBX again0 CALL SEARCH ; Locate first overlapping extent. BIT #WS.MDL,(SP)+ ; Is I/O request deferred?% BNE DEFER ; NE, yes, go process it 2 BCS MISS ; SEARCH found no extent, process miss 5 .SBTTL HIT - Process a non-deferred extent cache hite;+1; **-HIT- Process a non-deferred extent cache hit ;dA; This routine will determine if a single extent overlaps a givenVC; write request, and if so, will update the cache data after I/O isoD; completed. If a miss is declared, we still must have a placeholderD; CED to insure that data cache read-ahead is interlocked with other ; requests.r;?; Input:; R0 - CED with overlap ; R1 - URPM2; R2 - LSP of highest requested LBN (from SEARCH)2; R3 - MSP of highest requested LBN (from SEARCH)/; R4 - Size of request in blocks (from SERACH)a; R5 - UCB addressr;i; Cache partition mapped; ; Output:l8; If the request is han00‡t__DATADATADATADATAdled by a single extent, it will=; be queued to disk, and updated at I/O completion, otherwisee9; all overlapping extents will be purged, and the requesta; forwarded to disk.;-4HIT: BIT #CHEBYP,I.FCN(R1) ; are we bypassing cache?" BNE 20$ ; yes, flush cache here, BIT #777,I.PRM+P2(R1) ; odd block transfer?" BNE 20$ ; yes, purge it out ...B CMP R3, E.LBNH+2(R0) ; Might this extent fully map request ;DC430 BLO 10$ ; If LO, yes ;**-1$ BHI 20$ ; If HI, no, flush it out- CMP R2, E.LBNH(R0) ; Double word comparison" BHIS 20$ ; If HIS, no, flush it?10$: MOV I.PRM+P4(R1),-(SP) ; extract the logical block ;DC430 3 BIT #DV.32B,U.CW1(R5) ; using 32-bit LBNs ;DC430#* BNE 11$ ; if NE, yes, continue ;DC430 ;DC4300 CLRB 1(SP) ; clean off the high stuff ;DC430 ;DC430>11$: CMP (SP)+, E.LBNL+2(R0) ; Does this truely map it ;DC430 BHI 40$ ; If HI, yes ;**-1% BLO 20$ ; If LO, no, flush it out6 CMP I.PRM+P5(R1), E.LBNL(R0) ; Double word comparison BHIS 40$ ; If HIS, yes, ok ; if LO, no, flush it 620$: USTAT$ S.WLAP ; Increment partial overlap count/ CALL DELATT ; delete any overlapping extentsi BCC MISS ; ok, they're gone$ ; we're queued to CED for phase030$: RETURN ; CED unbusy queues us for Phase440$: CALL ATTCED ; attach to extent, queue if busy BCS 30$ ; busy, just return9 BISB #ES.WIP,E.STAT(R0) ; attached ok, show why CED busyu, USTAT$ S.WHIT ; Increment write hit stats- BR DOWRIT ; finish off packet and do writes ) .SBTTL + MISS - Process clean cache missT;+;P:; MISS found no extent in cache covering request LBN range9; so we must create a placeholder CED for duration of I/O; ; Input: ; R1 - URPf; R4 - Size of request %; R5 - UCB address of issuing device;: ; Output:D1; Placeholder CED created, and request forwardedb:; on to the driver for processing. The placeholder will be$; deleted when the I/O is completed.;c;-3MISS: CALL CRECED ; allocate a CED for placeholdera! BCC 20$ ; got it ok, now use it-+ CALL FREAGE ; try to free one for use nowd% BCC MISS ; did free one, now use itN( TST R0 ; did we get a CED from FREAGE?1 BEQ 10$ ; if EQ, nope, just requeue to phase II7 CALLR ATTCED ; attach to the CED with outstanding I/Ov210$: CALLR Q2PHS1 ; else queue a retry to Phase 2<20$: CALL ATTCED ; attach to new CED, should always succeed;+@; Initialize the CED, with no memory buffer, no age list entry,(; just a specific LBN and size filled in;-) CLR E.PHYA(R0) ; ...no phys mem addressR1 CLR E.BNXT(R0) ; ...no memory buffer list entryd CLR E.BPRV(R0) ; ...+ CLR E.ANXT(R0) ; ...no age list insertionB CLR E.APRV(R0) ; ...6 MOV I.UCB(R1),E.UCB(R0) ; set UCB pointer for phase 2A BISB #,E.STAT(R0) ; set status flags to ber9 ; write placeholder, write in progress, delete when donel+ CALL SETLBN ; Set up LBN/size parameterst. CALL QINLBN ; insert into LBN queue of CEDs i/ .SBTTL + DOWRIT, Issue write request to driver;;+*; **-DOWRIT- Issue write request to driver;m ; Context:'; R0 -> CED for extent covering requestC; R1 -> I/O request packet; <; Finish preparing I/O packet and queue to driver for cacher;-JDOWRIT: MOV KINAR5, I.IOSB+2(R1) ; Load APR bias and address of IOC ;DC430G MOV #WRTIOC!1, I.IOSB+4(R1) ; I/O completion routine, note bit 0 ;**-2n( CLRB I.EFN(R1) ; insure as logical I/O ;6 ; All changes to the user I/O packet will be restored7 ; from the Cache Request Packet before calling $IOFIN. ;/ CALLR .DRQRQ ; Issue disk I/O, IOC cleans up  x! .SBTTL Deferred write processing = .SBTTL + DEFER, Determine outcome of deferred request searchO7DEFER: BCS 60$ ; CS, SEARCH found no extent, must loadA;+A; We found at least one extent, does it completely cover request?C; ; Context:; Cache partition mapped;t ; R0 -> First overlapping extent ; R1 -> URPgC; R2 := Least Significant Part (LSP) of the highest requested block#; R3 :00ʇ|ibjbkb a a a= Most Significant Part (MSP)r#; R4 := Length of request in blocks ; R5 -> UCBk;-8 MOV I.PRM+P4(R1),-(SP) ; extract the LBN (msp) ;DC4309 BIT #DV.32B,U.CW1(R5) ; device using 32-bit LBNs ;DC430a* BNE 10$ ; if NE, yes, continue ;DC430 ;DC430/ CLRB 1(SP) ; clean up the high stuff ;DC430o ;DC430C10$: CMP (SP)+,E.LBNL+2(R0) ; request begin before extent? ;DC430v+ BLO 50$ ; yes, overlap, flush it ;DC430 3 BHI 20$ ; no, extent might cover transfer ;DC430; CMP I.PRM+P5(R1),E.LBNL(R0) ; ..double precision.. ;**-3u BLO 50$=20$: CMP R3,E.LBNH+2(R0) ; request end after extent? ;DC430 * BHI 50$ ; yes, overlap, flush it ;**-1. BLO DFRCPY ; no, extent does cover transfer* CMP R2,E.LBNH(R0) ; ..double precision... BLO DFRCPY ; remember, E.LBNH is next block;+>; some extent overlaps, flush it out then process the transfer;-450$: USTAT$ S.WLAP ; tally a write that overlapped/ CALL DELATT ; delete all overlapping extentsn BCC 60$ ; ok, got them all,( ; we're queued to first one for IOC/ RETURN ; CED unbusy queues us for Phase IIn"60$: CALL GETBUF ; get an extent1 BCS MISS ; if CS, allocation failed, flag miss  d- .SBTTL + DFRLOD - Create New Deferred Extentb;+C; DFRLOD - invoked when a deferred write extent is detected after ae7; total miss or complete purge of overlapping extents.; ; Passed: $; R1 => I/O request packet from user7; R4 -> Size of request in blocks (gotten from SEARCH)B ; R5 => UCB,;t; Mapped: Cache partitione; ; Action:e0; link newly allocated extent into the CED lists;-7DFRLOD: USTAT$ S.WLOD ; tally a write that didn't hit ' .IF DF CHEWBH ; write behind support( MOV I.CRP(R1),R2 ; get the CRP pointer8 BIT #WS.WBH,R.LBNL(R2) ; is this write behind activity?/ BEQ 10$ ; if EQ, nope, don't mark for deletel: BISB #ES.DEL,E.STAT(R0) ; flag as being marked for delete: BICB #WS.WBH,R.LBNL(R2) ; don't need the flag anymore ...10$: .ENDC ;DF,CHEWBH3 BISB #ES.WDF,E.STAT(R0) ; indicate deferred extentc;+=; Initialize size of new CED from parameters in the I/O BlockD;-/ CALL SETLBN ; set up our LBN/size parameters.;+?; Now insert the initialized CED into the device and age queuesC;-/ CALL QADAGE ; Insert the CED into the age lie+ CALL QINLBN ; and into the unit LBN list' k. .SBTTL + DFRCPY - Load Deferred Extent w/data;+/; DFRCPY - Deferred Write processing completion;;n ; Passed: ; Cache partition mapped;CB; R0 -> CED of target extent (there is exactly one extent involvedA; R1 -> User I/O Request Packet (URP, in primary pool for driver)&; I.PRM+P1 := Source buffer address; I.PRM+P2 := Byte countt ; I.PRM+P3z;; I.PRM+P5 := Requested LBN least significant part (LSP)I8; I.CRP -> Cache Request Packet (CRP in cache pool)+; I.ACED -> CED of first extent involvedL ; R5 -> UCBE;n ; Returned:#; N/A - control is passed to $IOFINc;l ; Action:9; Transfer data from user buffer into the deferred extentr,; then set up and finish the I/O completion.;-1DFRCPY: CALL ATTCED ; attach the CED for extento4 BCS LATER ; it's busy already, queued to phase II5 USTAT$ S.WDFR ; tally a write that didn't hit disk , BITB #ES.WDF,E.STAT(R0) ; already deferred?$ BNE 20$ ; yup, don't adjust sizes .IF DF CHEWBH( MOV I.CRP(R1),R2 ; get the CRP into R2. BIT #WS.WBH,R.LBNL(R2) ; is this write behind( BNE 20$ ; if NE, don't convert to DFR .ENDC ;DF,CHEWBHr9 BISB #ES.WDF,E.STAT(R0) ; Indicate this CED now deferred 0 CALL CLCLEN ; determine the toal request size. CMPB R4,E.SIZE(R0) ; are they the same size?, BEQ 20$ ; yes, don't worry, no adjustment' BLO 10$ ; if LO, sanity prevails ...h) FATAL$ BE.IDC ; internal inconsistencyy;+=; Since we have just changed a CED from being normal to being=; deferred, we will shrink the size of the CED to be the same2;; size as the request. This will tailor the request so thato@; when the CED is written to disk, we will only write that which; wa00҇t__DATADATADATADATAs actually deferred.;-.10$: CALL SETLBN ; reset LBN/size parameters;+!; Input parameters to WRTXFR are:?(; R0 := target CED address (set already)(; R1 := I/O request packet (set already);--20$: CALL WRTXFR ; and do transfer to cache2 MOV I.ACED(R1),R0 ; restore CED address from pkt .IF DF CHEWBH( MOV I.CRP(R1),R2 ; get the CRP pointer1 BIT #WS.WBH,R.LBNL(R2) ; is this a write behind?t3 BEQ 40$ ; if EQ, nope, process deferred normally ;+E; At this point, we need to create an I/O packet which will write outC@; the affected portion of this CED, and then release the I/O pkt;-$ MOV R1,-(SP) ; save R1 for now ... CALL DFRPKT ; create a packet* BCS 30$ ; failed to allocate I/O packet* MOV R1,R4 ; copy the packet for now ...% MOV (SP),R2 ; restore original URP3 MOV I.PRM+P2(R2),I.PRM+P2(R4) ; update the lengthi? MOV I.PRM+P4(R2),I.PRM+P4(R4) ; update the target IOP ;DC430 < BIT #DV.32B,U.CW1(R5) ; device support 32-bit LBNs? ;DC430/ BNE 25$ ; if NE, yes, leave P4 as is ;DC430t6 CLRB I.PRM+P4+1(R4) ; zero out the high byte ;DC430425$: MOV I.PRM+P5(R2),R1 ; get the LBN LSP ;DC4305 MOV R1,I.PRM+P5(R4) ; and update the LBN LSP ;**-2i;+=; Since the CED will overlap, carry is allowed to be carriedw&; across, to create the correct offset;-* SUB E.LBNL(R0),R1 ; convert to an offset& ASH #3,R1 ; convert to 32.wd offset2 ADD E.PHYA(R0),R1 ; compute the address for real0 MOV #APR6.BASE,R2 ; and start at the beginning+ CALL $MPPHY ; map address for NPR device36 MOV R4,E.IOPA(R0) ; show new packet as owner now ...4 MOV R0,I.ACED(R4) ; and let DETCED know intentions5 BISB #ES.WIP,E.STAT(R0) ; and show write in progressi4 MOV R1,I.PRM+P1.1(R4) ; load in the high order bits/ MOV R2,I.PRM+P1.2(R4) ; and the low order bitss* MOV R4,R1 ; move back to usual register# MOV @#KISAR6,-(SP) ; save mapping / CALL .DRQRQ ; queue the I/O to disk, delayed 1 MOV (SP)+,@#KISAR6 ; restore mapping for RLSCRPg% MOV (SP)+,R1 ; restore original URPN, CLR I.ACED(R1) ; no longer attached to CED! BR 50$ ; and finish up now ...C;+<; We failed to allocate an IOP, so we must forward to disk;-(30$: MOV (SP)+,R1 ; restore URP address/ CALLR DOWRIT ; and forward to the driver .... .ENDC ;DF,CHEWBHe(40$: CALL DETCED ; now release CED and,50$: CALL RLSCRP ; delete CRP, refresh URP;+G; This is a deferred write which has just completed. Since no disk I/ORJ; occurred, no status has been returned and must be faked back to the user;-- MOV R1, R3 ; Set packet address for $IOFIN07 MOV #IS.SUC&377,R0 ; Fake success status back to userc: MOV I.PRM+P2(R3),R1 ; Put in number of transferred bytes* CALL $IOFIN ; Return I/O status to user-LATER: CLC ; make sure $DRQRQ doesn't callB7 RETURN ; to run Phase II ; successfully deferred writeL C .SBTTL Write I/O completion2 .SBTTL + WRTIOC - Internal I/O completion routine;+>; **-WRTIOC- Process internal I/O completion for write request; ; Passed:e; R3 -> Driver request packet,; I.UCB -> UCB ; I.PRM+P3, P4 := Driver statusD; I.CRP(R3) -> Cache request packet (saved context from user request7; I.ACED(R3) -> CED of extent involved in this transfer/;t ; Returned:@; N/A - status is passed back to user from driver packet returns ; via $IOFIN;s ; Action:rC; If placeholder CED do not transfer data into cache, delete extentt:; If error, do not transfer data into cache, delete extent@; If extent exists and no error, transfer data into cache extentB; Phase 2 will process all blocked requests queued to extent, FIFO;t@; Since we are being called from $IOFIN, let the driver continue@; execution, and we will finish the copy function once complete.?; Without calling fork, it would be possible for EBLXIO to calleC; fork, and transfer control to another processor. This would causedA; the subsequent return to the driver to be executed on the wrongt?; processor, or with a delay which could impact I/O throughput. ;oE; In a non-mP enviro00ڇ|ibjbkb a a anment, this call to fork will minimize the amountr7; of pool required if EBLXIO is required to fork again.c;e;-3WRTIOC: CALL $SAVNR ; save non-volitile registersw& MOV R3,R4 ; Copy I/O packet pointer6 ADD #I.PRM+12,R4 ; Point to last word for fork block# MOV @#KINAR5,(R4) ; Load our biasc0 MOV R1,-(R4) ; Store I/O status block contents, MOV R0,-(R4) ; in standard P3,P4 of IOP .IF DF M$$PRO* CLR I.PRM(R3) ; Set up our URM for FORK0 .ENDC5 CALL $FORK0 ; Fork here to allow driver completiono4 SUB #I.PRM+4,R3 ; Point to beginning of I/O packet( MOV R3,R1 ; set conventional register& MOV I.ACED(R1),R0 ; get CED from URP2 MOV I.UCB(R1),R5 ; get UCB (and UCBX) for device MP.UCBX ; map UCB extensionw6 MOVB APR6.BASE+X.CST2,R3 ; save status flag from UCBX MP$PAR ; map cache partition1 BITB #CS.DBG,APRD.BASE+H.CSTS ; is debug enabledP BEQ 7$ ; if EQ, nope ...2 CMP E.IOPA(R0),R1 ; is this packet for this ced? BNE 3$ ; no, go die ...# CMP E.UCB(R0),R5 ; ucb match ced?. BEQ 7$ ; ok, sanity checked)3$: FATAL$ BE.UCB ; UCB is inconsistent *7$: MOV I.CRP(R1),R2 ; get CRP pointer to, MOV I.PRM+P3(R1),R.P3(R2) ; save status and< MOV I.PRM+P4(R1),R.P4(R2) ; bytes transferred for user IOSB' BITB #X2.DEA,R3 ; deactivating cache?M* BNE 10$ ; yes, skip transfer into cache;+ ; Context: ; R0 -> CEDu; R1 -> packet7;-+ BITB #ES.WPL,E.STAT(R0) ; placeholder CED?s% BNE 10$ ; yep, transfer impossible , TSTB I.PRM+P3(R1) ; Is an error indicated? BPL 20$ ; If PL, no6 BISB #ES.ERR,E.STAT(R0) ; set error bit in CED status>10$: BISB #ES.DEL,E.STAT(R0) ; delete placeholder or error CED+ BR 30$ ; skip data transfer, release CED1;+!; Input parameters to WRTXFR are:O; R0 := target CED address+; R1 := I/O request packet (just refreshed)a;-20$: .IF DF CHEWBH9 BIT #WS.MDL,R.LBNL(R2) ; is this a write behind function,* BNE 30$ ; if NE, yes, don't copy buffer .ENDC ;DF,CHEWBHi3 CALL RFRSHP ; refresh packet contents before xfr2 CALL WRTXFR ; do the transfer into cache extent2 MOV I.ACED(R1),R0 ; restore CED address from pkt- MOV I.CRP(R1),R2 ; get CRP pointer from pkt0;30$: BICB #ES.WIP,E.STAT(R0) ; clear write-in-progress flags1 CALL DETCED ; detach, requeue any waiting pkts:0 CALL RLSCRP ; delete CRP after refreshing URP) MOV R1,R3 ; set I/O pkt ptr for $IOFIN 4 MOV I.PRM+P3(R3), R0 ; Get driver completion status MOV I.PRM+P4(R3), R1C5 CALL $IOFIN ; Return I/O completion and exit ;**-2f) CALLR DCFORK ; via phase 2 dispatcher.r t .SBTTL Local Subroutines(/ .SBTTL + DCFLSH - Deletes all involved extentsP;+ ; Passed:C; Cache partition mapped;B&; R0 -> CED of first overlaping extent-; R2 := High LBN Least significant part (LSP)e,; R3 := High LBN Most significant part (MSP); R5 := UCB addressU; ; Returned: #; All registers preserved except R0I-; CC - All extents were able to be eliminated:; CS - At least one of the extents could not be eliminated;-.DCFLSH: CLR -(SP) ; Initialize status return410$: MOV E.LNXT(R0),-(SP) ; save pointer to next CED$ TST E.IOPA(R0) ; is this CED busy? BNE 50$# CALL FRECED ; Delete this extent0) BCC 70$ ; IF CC, extent was eliminated BR 60$ ;t=50$: BISB #ES.DEL,E.STAT(R0) ; busy, delete when owner detach(160$: MOV R0,2(SP) ; save last CED still flushing )70$: MOV (SP)+,R0 ; restore the next CEDt BEQ 90$ ; yep, exitC CMP R3, E.LBNL+2(R0) ; Does this extent overlap the request ;DC430- BHI 10$ ; If HI, yes ;**-1 BLO 90$ ; If LO, no- CMP R2, E.LBNL(R0) ; Double word comparison BHIS 10$ ; If HIS, yess290$: TST (SP) ; did we have a CED still in pipe?- BEQ 95$ ; if EQ, nope, leave R0-> next CEDe4 MOV (SP),R0 ; flag the last CED which was written495$: ROL (SP)+ ; set the status for carry returned* RETURN ; NOTE carry sets because cache$ ; addresses are all > 120000(8);+@; **-DELATT- Delete all overlapping requests, and if pending I/O; 00⇿t__DATADATADATADATA attach to queued CEDI;I ; Passed:*; Cache partition mapped;C&; R0 -> CED of first overlaping extent-; R2 := High LBN Least significant part (LSP)P,; R3 := High LBN Most significant part (MSP); R5 := UCB addresse; ; Returned:e#; All registers preserved except R0D-; CC - All extents were able to be eliminatede:; CS - At least one of the extents could not be eliminated); request atteched to CED w/ pending I/O0;-3DELATT::CALL DCFLSH ; delete all affected extents * BCC 5$ ; queued (while deferred writes)$ ; phase 2 comes back here after CALL ATTCED ; queue to it SEC ; show we queued 5$: RETURN g< .SBTTL + WRTXFR - Transfer from user buffer to cache extent;+8; WRTXFR - transfer from a user buffer to a cache extent@; we know that there is exactly one single cache extent involvedB; this is called from disk write internal ioc for real disk writes>; and to complete deferred write processing when the write was; successfully deferred;t; Entry:; R0 => CED of target extenti/; R1 => I/O packet containing user buffer info ; I.PRM+P2 = byte countC2; I.PRM+P4 = requested LBN most significant part3; I.PRM+P5 = requested LBN least significant part+; ;; R0, R1 is saved/restored, all other registers are trashedk; ;t%; Prepare input parameters to $BLXIO:n; R0 := Byte count (I.PRM+P2)o; R1 := Source APR5 bias ; R2 := Source APR5 displacement; R3 := Destination APR6 bias .; R4 := Destination APR6 displacement (140000);-7WRTXFR: MOV R1, -(SP) ; Save packet address for returne* MOV R0, -(SP) ; and save the CED address7 BISB #ES.XIP,E.STAT(R0) ; flag that transfer is activen5 CALL ADJBUF ; Converts to doubleword if device NPRp/ MOV R0,R4 ; switch registers for conveniencei MOV R1,R08 MOV I.PRM+P1.1(R0), R1 ; get source APR bias for EBLXIO8 MOV I.PRM+P1.2(R0), R2 ; get source APR displacement...+ SUB #20000, R2 ; adjust for APR5 not APR6t;+L; The destination APR bias is the extent bias offset by the number of blocks:; between the requested LBN and the low LBN of the extent.;-0 MOV I.PRM+P5(R0), R3 ; Get LSP of requested LBN5 SUB E.LBNL(R4), R3 ; Safe to assume carry availablee) ASH #3, R3 ; Convert to 32-word blocks,6 ADD E.PHYA(R4), R3 ; and include extent base address2 MOV #APR6.BASE, R4 ; set target APR displacement& MOV I.PRM+P2(R0), R0 ; set byte count# CALL EBLXIO ; Transfer the data.a- MOV (SP)+, R0 ; restore CED address as wellP8 BICB #ES.XIP,E.STAT(R0) ; flag transfer not in progress, MOV (SP)+, R1 ; restore I/O packet address RETURN. .ENDC ; .IFDF D$$CHER .END LSP of requested LBN5 SUB E.LBNL(R4), R3 ; Safe to assume carry availablee) ASH #3, R3 ; Convert to 32-word blocks,6 ADD E.PHYA(R4), R3 ; and include extent base address2 MOV #APR6.BASE, R4 ; set target APR displacement& MOV I.PRM+P2(R0), R0 ; set byte count# CALL EBLXIO ; Transfer the data.a- MOV (SP)+, R0 ; restore CED address as wellP8 BICB #ES.XIP,E.STAT(R0) ; flag transfer not in progress .TITLE DRRAS  .IDENT /10.04/V;T1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDD9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.;.; ; D. N. CUTLER 4-SEP-73P;(; PREVIOUSLY MODIFIED BY:T;B; T. M. MARTIN; B. S. MCCARTHYT ; M. S. FOXT; J. M. LAWLER;X+; MODIFIED FOR RSX-11M-PLUS VERSION 3.0 BY:T;E; J. W. BERZLE; J. R. KAUFFMAN; B. S. MCCARTHY;T+; MODIFIED FOR RSX-11M-PLUS VERSION 4.0 BY: ;.; B. S. MCCARTHY; +; MODIFIED FOR RSX-11M-PLUS VERSION 4.3 BY: ;h; G. N. LARSEN; +; MODIFIED FOR RSX-11M-PLUS VERSION 4.4 BY:D;Y; B. S. MCCARTHY 9-JUL-90 10.02C;A'; BM430 -- ADD UNIVERSAL RECEIVER TASK;); BM431 -- ADD SEND AND UNSTOP DIRECTIVEM;F$; MODIFIED FOR RSX-11M-PLUS V4.5 BY:;C; D. CARROLL 20-OCT-1993 10.03;R3; DC242 -- INSURE THAT THE UNIVERSAL RECEIVER TASKE,; IS ACTIVATED IN THE CASE OF SDAT$/RQST$*; IN WHICH URT... WILL NO00|ibjbkb a a aT BE ACTIVATED; $; Modified for RSX-11M-PLUS V4.6 by:;I; D. Carroll 18-Oct-1995 10.049; DC404 - Include PSECT statment to allow ICB pool to be !; fully expanded during sysgen.T;9; RECEIVE AND SEND DIRECTIVES ; ; MACRO LIBRARY CALLS; .MCALL HDRDF$,TCBDF$D .IF DF N$$DIR .MCALL LNMDF$' LNMDF$ ;DEFINE CONTEXT BLOCK OFFSETS2 .ENDC ;DF N$$DIR% HDRDF$ ;DEFINE TASK HEADER OFFSETSE, TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS. .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;DC404;+C; **-$DRREC-(VARIABLE LENGTH) RECEIVE DATA AND RECEIVE DATA OR EXIT42; **-$DRRCS-(VARIABLE LENGTH) RECEIVE DATA OR STOP; G; THESE DIRECTIVES INSTRUCT THE SYSTEM TO DEQUEUE A DATA BLOCK FROM THE I; ISSUING TASK'S RECEIVE QUEUE. IF THE DIRECTIVE IS RECEIVE DATA OR EXIT,CH; THEN A TASK EXIT WILL BE EFFECTED IF NO DATA IS QUEUED. IF THE DIREC-H; TIVE IS RECEIVE OR STOP, THEN THE ISSUING TASK WILL BE SUSPENDED IF NO; DATA IS QUEUED.;I ; DPB FORMAT:C; 6; WD. 00 -- DIC(75., 77., OR 139.),DPB SIZE(4. OR 6.).=; WD. 01 -- FIRST HALF OF SENDER TASK NAME OR 0 FOR ANY TASK.*,; WD. 02 -- SECOND HALF OF SENDER TASK NAME.&; WD. 03 -- ADDRESS OF RECEIVE BUFFER.?; WD. 04 -- NUMBER OF WORDS TO RECEIVE (VARIABLE RECEIVE ONLY).Q;E ; INPUTS:R;I9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK.F+; R3=ADDRESS OF THE SECOND WORD IN THE DPB. /; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.L,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;P5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK)S;(-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.S:; DIRECTIVE STATUS OF +1 IS RETURNED IF DATA IS RECEIVED.9; DIRECTIVE STATUS OF 'D.RS22' IS RETURNED IF NO DATA IS ; RECEIVED ON RECEIVE OR STOP.; C=1 IF DIRECTIVE IS REJECTED.N5; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF NO DATA 0; IS QUEUED IN TASK'S RECEIVE QUEUE ON RECEIVE ; DATA.:; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE ISSUING2; TASK IS AT AST STATE AND ISSUED THE RECEIVE OR; STOP DIRECTIVE.P2; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF THE+; ISSUING TASK IS A SLAVE TASK AND HAS AN+*; ACTIVE GROUP GLOBAL EVENT FLAG CONTEXT+; AND THE NEXT RECEIVE PACKET WILL CHANGEA; THE TASK'S GROUP NUMBER.;S9; THE FORMAT OF A FIXED LENGTH SEND PACKET IS AS FOLLOWS: ;'%; WD. 00 -- RECEIVE QUEUE LINK WORD.Q,; WD. 01 -- FIRST WORD OF SENDER TASK NAME.-; WD. 02 -- SECOND WORD OF SENDER TASK NAME.R2; WD. 03 THRU 15. -- CONTENTS OF THE SEND BUFFER.,; WD. 16. -- TI UCB ADDRESS OF SENDER TASK.; WD. 17. -- CURRENT UIC 0; WD. 18. -- FIRST WORD OF TARGET MU TASK NAME.1; WD. 19. -- SECOND WORD OF TARGET MU TASK NAME.C?; WD. 20. -- CONTEXT BLOCK POINTER (IF NAME DIRECTORY SUPPORT)K;G<; THE FORMAT OF A VARIABLE LENGTH SEND PACKET IS AS FOLLOWS:;S2; WD. 00 -- RECEIVE BY REFERENCE QUEUE LINK WORD.:; WD. 01 -- NUMBER DATA WORDS + 2 (FOR SENDER TASK NAME).,; WD. 02 -- FIRST WORD OF SENDER TASK NAME.-; WD. 03 -- SECOND WORD OF SENDER TASK NAME.W*; WD. 04 THRU N -- DATA WORDS TO BE SENT.,; WD. N+1 -- TI UCB ADDRESS OF SENDER TASK.; WD. N+2 -- CURRENT UIC.0; WD. N+3 -- FIRST WORD OF TARGET MU TASK NAME.1; WD. N+4 -- SECOND WORD OF TARGET MU TASK NAME.R?; WD. N+5 -- CONTEXT BLOCK POINTER (IF NAME DIRECTORY SUPPORT)E;S<; NOTE: FOR SYSTEMS WITH SECONDARY POOL SUPPORT, ALL PACKETS'; FOR SENDS AND RECEIVES ARE ALLOCATED24; FROM THE SECONDARY POOL AND THE FIXED LENGTH SEND/; BECOMES A VARIABLE LENGTH SEND OF LENGTH 13.D;T;-;E+; * * * * * N O T E W E L L * * * * *.; <; THESE ROUTINES CURRENTLY WORK ONLY BECAUSE THEY ARE IN THE:; ROOT OF THE EXEC AND APPEAR TO BE IN THE FIRST DIRECTIVE<; COMMON. IF THEY ARE EVER MOVED, IN ADDITION TO THE CHANGES:; TO MAPPING NECESSARY, IT WILL BE NECESSARY TO CHANGE THE:; CODE WHICH STUFFS THE NEW DSW ON THE STACK TO ACCOMODATE7; THE DIFFERING STACK FORMATS ON SYSTEMS WITH DIRECTIVEE ; COMMONS.;D .ENABL LSB /60$: DRSTS D.RS89 ;INVALID RECEIVE BUFFER SIZE3$70$: DRSTS D.RS99 ;INVALID DPB SIZE00t__DATADATADATADATA-$DRRCS::TST (R2) ;ISSUING TASK AT AST STATE?E BPL $DRREC ;IF PL NO, DRSTS D.RS80 ;ISSUING TASK IS AT AST STATE#$DRREC::CLR -(SP) ;INIT ERROR CODEN4 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$$HDR9 MOVB H.CUIC+1(R4),-(SP) ;SAVE GRP CODE - HEADER UNMAPPED  .IFFS" MOV R4,-(SP) ;SAVE HEADER ADDRESS .ENDC5 MOV (R3)+,-(SP) ;SAVE FIRST HALF OF SENDER TASK NAME06 MOV (R3)+,-(SP) ;SAVE SECOND HALF OF SENDER TASK NAME) CMPB $DICSV+1,#4. ;FIXED LENGTH RECEIVE?; BEQ 102$ ;IF EQ YES , CMPB $DICSV+1,#6. ;VARIABLE LENGTH RECEIVE? BNE 70$ ;IF NE NON" MOV 2(R3),R1 ;GET SIZE TO RECEIVE% BEQ 60$ ;IF EQ ERROR - ILLEGAL SIZE  CMP R1,#P$$MAX ;VALID SIZE? BLOS 101$ ;IF LOS YESF: CMP $TKTCB,$URTCB ;IS TARGET THE UNIVERSAL RECEIVER TASK? BNE 60$ ;IF NE NOS CMP R1,#P$$MAX+2 ;VALID SIZE? BHI 60$ ;IF HI NOM6101$: ADD #2,R1 ;TWO EXTRA WORDS FOR SENDER TASK NAME+ MOV R1,6(SP) ;SAVE THE SIZE TO RECEIVE + 2S ASL R1 ;CONVERT SIZE TO BYTES 1102$: MOV (R3),R3 ;GET ADDRESS OF RECEIVE BUFFERC+ CALL $ACHKP ;ADDRESS CHECK RECEIVE BUFFER + MOV R3,R4 ;SAVE ADDRESS OF RECEIVE BUFFERE4 MOV (SP)+,R3 ;RETRIEVE 2ND HALF OF SENDER TASK NAME6 MOV (SP)+,R2 ;RETRIEVE FIRST HALF OF SENDER TASK NAME MOV R5,R0 ;COPY TCB ADDRESS & ADD #T.RCVL,R0 ;POINT TO RECEIVE LIST4 CALL $GTRPK ;GET RECEIVE DATA PACKET AND MAP TO IT BCS 20$ ;IF CS THERE IS NONE2 MOV (SP)+,R2 ;GET SAVED GROUP CODE/HEADER ADDRESS3 BIT #T3.SLV,T.ST3(R5) ;ISSUING TASK A SLAVE TASK ?$ BEQ 105$ ;IF EQ NO8 TSTB T.GGF(R5) ;TASK HAVE ACTIVE GROUP GLOBAL CONTEXT ? BEQ 105$ ;IF EQ NO/ MOV @#120002,R3 ;GET LENGTH OF DATA +2 (WORDS)R ASL R3 ;CONVERT TO BYTES .IF DF X$$HDR, CMPB R2,120007(R3) ;WILL UIC GROUP CHANGE ? .IFFR6 CMPB H.CUIC+1(R2),120007(R3) ;WILL UIC GROUP CHANGE ? .ENDC BEQ 105$ ;IF EQ NO8 DRSTS D.RS17 ;SLAVE TASK HAS GRP GLOBAL CONTEXT ACTIVE,105$: CALL $GTSPK ;DEQUEUE SPECIFIED PACKET2 MOV #120002,R1 ;POINT TO THE NUMBER OF WORDS SENT. CMP (SP),(R1) ;BUFFER SMALLER THAN DATA SENT? BEQ 2$ ;IF EQ NO BLO 201$ ;IF LO YESB- MOV (R1),(SP) ;KEEP THE NUMBER OF WORDS SENTH BR 2$ ; 2201$: INC 2(SP) ;INDICATE DATA HAS BEEN TRUNCATED2$: ;REFERENCE SYMBOL1 BIT #T3.SLV,T.ST3(R5) ;IS RECEIVER A SLAVE TASK?1 BEQ 5$ ;IF EQ NO .IF DF V$$TRM;B; IF TI OF THE RECEIVER IS A VT, DECREMENT THE VT OFFSPRING COUNT,B; DEALLOCATE THE VT IF REQUIRED, AND CLEAR ANY LUNS WHICH MAY HAVE,; BEEN ASSIGNED TO THE SLAVE TASK'S TI (VT).A; NOTE -- COUNT IS DECREMENTED WHEN CHANGING THE TI AWAY FROM THEF>; CURRENT VT. FOR THIS REASON, THE VT OFFSPRING COUNT IS NOTA; DECREMENTED IF A RECEIVE DATA IS ISSUED AND THE QUEUE IS EMPTY.N;U" MOV R1,-(SP) ;SAVE PACKET ADDRESS/ CALL $TICLR ;DECREMENT VT OFFSPRING COUNT AND ;CLEAR OUT LUNS% MOV (SP)+,R1 ;RESTORE PACKET ADDRESSI .ENDC MOV R1,R0 ;COPY PACKET ADDRESS/ MOV (R1),R3 ;GET NUMBER OF DATA WORDS SENT +2L ASL R3 ;CONVERT TO BYTES4 ADD R3,R0 ;POINT TO SENDER'S TI UCB ADDRESS IN PKT TST (R0)+ ;W0 MOV (R0)+,T.UCB(R5) ;SET TI ADDRESS OF RECEIVER .IF DF X$$HDR+ MOV #KISAR6,R3 ;GET ADDRESS OF KERNEL APR6A3 MOV (R3),-(SP) ;SAVE CURRENT MAPPING (USER BUFFER)( MOV $SAHDB,(R3) ;MAP NONRESIDENT HEADER" MOV $SAHPT,R2 ;GET HEADER ADDRESS1 MOV (R0),H.CUIC(R2) ;SET CURRENT UIC OF RECEIVERE/ MOV (R0),H.DUIC(R2) ;SET DEFAULT UIC OF SENDERA/ MOV (SP)+,(R3) ;RESTORE MAPPING TO USER BUFFERO .IFF+' MOV $HEADR,R2 ;GET TASK HEADER ADDRESS 1 MOV (R0),H.CUIC(R2) ;SET CURRENT UIC OF RECEIVER+1 MOV (R0),H.DUIC(R2) ;SET DEFAULT UIC OF RECEIVERE .ENDC .IF DF N$$DIR MOV R1,-(SP) ;SAVE R1, MOV T.CTX(R5),R1 ;GET CURRENT CONTEXT BLOCK BEQ 3$ ;IF EQ, NONE+ CALL $DLCTX ;DELETE CURRENT CONTEXT BLOCKV63$: 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 MOVE00|ibjbkb a a a+ CMPB $DICSV+1,#6 ;VARIABLE LENGTH RECEIVE?  BNE 10$ ;IF NE NOE5 MOV R2,4(SP) ;RETURN IN DSW NUMBER OF WORDS RECEIVED410$: MOV (R1)+,(R4)+ ;MOVE DATA BLOCK TO TASK BUFFER! DEC R2 ;ANY MORE WORDS TO MOVE?N BNE 10$ ;IF NE YES% MOV KISAR5,R0 ;GET ADDRESS OF PACKETR* MOV @#120002,R1 ;GET NUMBER OF WORDS SENT .IF DF N$$DIR6 ADD #<7.+37>,R1 ;INCLUDE CONTROL WORDS IN PACKET SIZE .IFF$6 ADD #<6.+37>,R1 ;INCLUDE CONTROL WORDS IN PACKET SIZE .ENDC ;DF N$$DIRG' ASH #-5,R1 ;CONVERT TO 32. WORD UNITS#4 CALL $DESEC ;DEALLOCATE RECEIVE PACKET TO SEC POOL/ TST (SP)+ ;CLEAN THE STACK AND TEST FOR ERRORE( BNE 45$ ;IF NE DATA HAS BEEN TRUNCATED .IF DF D$$PAR .IF NDF K$$DASR/ MOV $DRAPR,KINAR5 ;REMAP DISPATCHER IN I SPACE; .ENDC ;NDF K$$DAS .ENDC ;DF D$$PARE RETURN ;D20$: ;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 CMP (SP)+,(SP)+ ;CLEAN STACKC2 CMPB $DICSV,#77. ;RECEIVE DATA OR EXIT DIRECTIVE? BNE 30$ ;IF NE NO  JMP $DREXT ;EXIT TASKD230$: CMPB $DICSV,#139. ;RECEIVE OR STOP DIRECTIVE? BNE 40$ ;IF NE NOP CALL $STPCT ;STOP CURRENT TASK DRSTS D.RS22 ;RETURN IS.SET.'40$: DRSTS D.RS8 ;NO PACKET TO RECEIVE ;45$: DRSTS D.RS15 ;RECEIVE BUFFER TOO SMALL DATA TRUNCATED;+; **-$DRSND-SEND DATAH ; SEND DATA AND UNSTOP;EI; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO QUEUE A THIRTEEN WORD DATA BLOCKP&; IN A SPECIFIED TASK'S RECEIVE QUEUE.;R ; DPB FORMAT:E; (; WD. 00 -- DIC(71.),DPB SIZE(5. OR 8.).=; DIC(179.),DPB SIZE(5. OR 8.). FOR SEND AND UNSTOPT-; WD. 01 -- FIRST HALF OF RECEIVER TASK NAME. .; WD. 02 -- SECOND HALF OF RECEIVER TASK NAME.0; WD. 03 -- ADDRESS OF THIRTEEN WORD DATA BLOCK.); WD. 04 -- EVENT FLAG NUMBER (OPTIONAL).N@; WD. 05 -- NUMBER OF WORDS TO SEND (VARIABLE LENGTH SEND ONLY).;T ; INPUTS:H;D-; R0=ADDRESS OF THE TCB OF THE RECEIVER TASK.E:; R1=ADDRESS OF THE TASK STATUS WORD OF THE RECEIVER TASK.9; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. 2; R3=ADDRESS OF THE DATA BLOCK ADDRESS IN THE DPB./; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK.V,; R5=ADDRESS OF THE TCB OF THE CURRENT TASK.;E5; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ;C-; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED.&; DIRECTIVE STATUS OF +1 IS RETURNED.; C=1 IF DIRECTIVE IS REJECTED.N:; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF INSUFFICIENT.; CORE IS AVAILABLE TO QUEUE THE DATA BLOCK.6; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF RECEIVER+; TASK IS AN ANCILLARY CONTROL PROCESSOR.K;D>; NOTE: FOR SYSTEMS WITH SECONDARY POOL SUPPORT, ALL SENDS AND:; RECEIVES USE PACKETS ALLOCATED FROM THE SECONDARY POOL.;:2; ON SYSTEMS SUPPORTING NON RESIDENT TASK HEADERS3; AND PROTOTYPE TCBS, KISAR6 MAY MAP THE PROTOTYPEC4; TCB IN POOL UPON ENTRY. THEREFORE, DO NOT ASSUME"; THAT THE TASK HEADER IS MAPPED.;S;-(270$: DRSTS D.RS2 ;SET DIRECTIVE STATUS)275$: DRSTS D.RS98 ;SET DIRECTIVE STATUSE0360$: DRSTS D.RS89 ;INVALID RECEIVE BUFFER SIZE%370$: DRSTS D.RS99 ;INVALID DPB SIZE $DRSND:: ;9 BIT #T3.ACP!T3.NSD,T.ST3(R0) ;SENDS ALLOWED TO RECEIVER?I BNE 270$ ;IF NE, NOE1 MOV T.ST3(R0),-(SP) ;SAVE 3RD STATUS WORD OF TCBR0 MOV R0,-(SP) ;SAVE TCB ADDRESS OF RECEIVER TASK1 MOV #13.,R1 ;ASSUME THIS IS A FIXED LENGTH SENDU+ MOV R1,-(SP) ;SAVE NUMBER OF WORDS TO SEND  ASL R1 ;CONVERT TO BYTES) MOVB 2(R3),-(SP) ;SAVE EVENT FLAG NUMBER 0 CMPB $DICSV+1,#5. ;FIXED LENGTH SEND DIRECTIVE? BEQ 210$ ;IF EQ YESI- CMPB $DICSV+1,#7. ;SEND REQUEST AND CONNECT?  BEQ 210$ ;IF EQ YESD BLO 370$ ;IF LO, ERROR4 CMPB $DICSV+1,#9. ;IS IT SOME FORM OF VARIABLE SEND BHI 370$ ;IF HI NO, ERROR)# BNE 205$ ;IF NE, IT MUST BE VALID" CMPB $DICSV,#71. ;IS THIS A VSDA$' BEQ 370$ ;IF EQ YES, ILLEGAL DPB SIZEI205$: ;REFERENCE LABELV* MOV 4(R3),R1 ;GET NUMBER OF WORDS TO SEND BEQ 360$ ;IF EQ ILLEGAL SIZE CMP R1,#P$$MAX ;V00t__DATADATADATADATAALID SIZE? BHI 360$ ;IF HI NO2 MOV R1,2(SP) ;SAVE THE NUMBER OF WORDS TO BE SENT ASL R1 ;CONVERT TO BYTES.210$: MOV (R3),R3 ;GET ADDRESS OF DATA BUFFER BIT #1,R3 ;ODD ADDRESS?R BNE 275$ ;IF NE, YES - ERROR% MOV R3,R0 ;MOV BUFFER ADDR FOR CALLH( CALL $ACHRO ;ADDRESS CHECK DATA BUFFER BCS 275$ ;IF CS, ERROR# CALL $RELOC ;RELOCATE USER BUFFER " MOV R1,KISAR6 ;MAP TO USER BUFFER+ MOV R2,R3 ;SUBSTITUTE NEW VIRTUAL ADDRESSW3 MOVB (SP)+,R0 ;RETRIEVE OPTIONAL EVENT FLAG NUMBER, CALL $SETF ;SET THE EVENT FLAG8 CMP 2(SP),$URTCB ;IS TARGET THE UNIVERSAL RECEIVER TASK BNE 220$ ;IF NE NO+ CMP R5,$URTCB ; IS THE SENDER ALSO URT...?D( BEQ 270$ ; YES, FORCE THE IE.INS ERROR4 ADD #2,(SP) ;ADJUST SIZE OF PACKET TO FIT TASKNAME/220$: MOV (SP),R1 ;GET NUMBER OF WORDS TO SEND  .IF DF N$$DIR6 ADD #<9.+37>,R1 ;INCLUDE CONTROL WORDS IN PACKET SIZE .IFF66 ADD #<8.+37>,R1 ;INCLUDE CONTROL WORDS IN PACKET SIZE .ENDC ;DF N$$DIR,4 CMP R5,$URTCB ;SENDING FROM THE UNIVERSAL RECEIVER?" BNE 222$ ; IF NE, NOPE, CONTINUE2 CMP (SP),#15. ; IS URT SENDING AT LEAST 15 WORDS?2 BLO 222$ ; IF LO, NOPE, WANTS TO IDENTIFY ITSELF< SUB #2.,R1 ; DECREASE SIZE BY TWO, URT WILL INCLUDE SENDER,222$: ASH #-5,R1 ;CONVERT TO 32. WORD UNITS CALL $ALSEC ;ALLOCATE A PACKET# BCC 225$ ; CC, WE HAVE THE PACKET,$ JMP 265$ ;IF CS ALLOCATION FAILURE-225$: CLR -(SP) ;RESERVE A WORD ON THE STACKO MOV 2(SP),(SP) ;COPY WORD COUNT$ MOV KISAR5,2(SP) ;SAVE KERNEL APR 5, MOV R0,KISAR5 ;MAP THE PACKET THROUGH APR 53 MOV #120002,R0 ;POINT TO SECOND WORD OF THE PACKETL4 MOV (SP),(R0)+ ;SAVE NUMBER OF DATA WORDS IN PACKET# CMP R5,$URTCB ; IS THE SENDER URT?S+ BNE 227$ ; IF NE, NOPE, INCLUDE TASK NAME$2 CMP (SP),#15. ; IS URT SENDING AT LEAST 15 WORDS?# BHIS 230$ ; IF HIS, YES, CONTINUEC9227$: ADD #2,-2(R0) ;TWO EXTRA WORDS FOR SENDER TASK NAMEU< MOV T.NAM(R5),(R0)+ ;INSERT SENDER TASK NAME IN SEND PACKET MOV T.NAM+2(R5),(R0)+ ;9 CMP 4(SP),$URTCB ;IS TARGET THE UNIVERSAL RECEIVER TASK?H BNE 230$ ;IF NE NO> MOV $DICSV+2,(R0)+ ;INSERT NAME OF REAL TARGET TASK IN PACKET MOV $DICSV+4,(R0)+ ; SUB #2,(SP) ;ADJUST COPY COUNT"230$: MOV (SP)+,R2 ;SET LOOP COUNT/240$: MOV (R3)+,(R0)+ ;MOVE DATA TO SEND PACKET.! DEC R2 ;ANY MORE WORDS TO MOVE?? BNE 240$ ;IF NE YES  .IF DF V$$TRM2 MOV T.UCB(R5),R1 ;GET ADDRESS OF TI UCB OF SENDER# MOV @R1,R2 ;DETERMINE DCB ADDRESSE. CMP D.NAM(R2),#"VT ;IS IT A VIRTUAL TERMINAL? BNE 245$ ;IF NE NO/ MOV 4(SP),R2 ;GET TCB ADDRESS OF RECEIVER TASK2+ BIT #T3.SLV,R2 ;IS RCVR TASK A SLAVE TASK?A BEQ 245$ ;IF EQ NO. INCB U.OCNT(R1) ;INCREMENT VT OFFSPRING COUNT-245$: MOV R1,(R0)+ ;SET UCB ADDRESS IN PACKETO .IFF/ MOV T.UCB(R5),(R0)+ ;SET UCB ADDRESS IN PACKETD .ENDC .IF DF X$$HDR0 MOV $SAHDB,KISAR6 ;MAP NON RESIDENT TASK HEADER2 MOV $SAHPT,R4 ;GET ADDRESS OF CURRENT TASK HEADER .ENDC3 MOV H.CUIC(R4),(R0)+ ;SET CURRENT (PROTECTION) UICL .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 4(SP),R2 ;GET TCB ADDRESS OF RECEIVER TASK4+ BIT #T3.SLV,R2 ;IS RCVR TASK A SLAVE TASK? BEQ 250$ ;IF EQ, NOR2 MOV T.CTX(R5),(R0) ;PUT CONTEXT BLOCK INTO PACKET BEQ 250$ ;IF EQ, NONEA' MOV KISAR5,-(SP) ;SAVE CURRENT MAPPING# MOV (R0),KISAR5 ;MAP CONTEXT BLOCKT- INCB C.REF+120000 ;INCREMENT REFERENCE COUNTR" MOV (SP)+,KISAR5 ;RESTORE MAPPING250$: ;REFERENCE LABEL$ .ENDC ;DF N$$DIRR1 MOV 2(SP),R0 ;GET ADDRESS OF RECEIVER TASK'S TCBS& ADD #T.RCVL,R0 ;POINT TO RECEIVE LIST% MOV KISAR5,R1 ;GET ADDRESS OF PACKETO2 MOV $PTCPT,KISAR6 ;REMAP TCB IF IN SECONDARY POOL0 CALL $QSPIF ;INSERT PACKET IN THE RECEIVE LIST' MOV (SP)+,KISAR5 ;RESTORE KERNEL APR 5Q. MOV #AS.RCA,R4 ;GET CODE FOR RECEIVE DATA AST1 MOV (SP)+,R5 ;RETRIEVE RECEIVER TASK TCB ADDRESST# TST (SP)+ ;REMOVE 3RD STATUS WORDE" CALL $DASTT ;DECLARE RECEIVE AST0 CMPB #179.,$DICSV ;WAS THIS A SEND AND UNSTOP ?4 BEQ 251$ ;IF EQ, YES, 00 jbkb a a aPROCESS SEND DATA AND UNSTOP5 CMP R5,$URTCB ; IS THIS THE UNIVERSAL RECEIVER TASK?V3 BNE 260$ ; IF NE, NOPE, DECLATE SIGNIFICANT EVENT6- TST T.STAT(R5) ; IS THE TASK ALREADY ACTIVE?I7 BPL 260$ ; IF PL, YES, JUST DECLARE SIGNIFICANT EVENTO$ BR 255$ ; GO START UP THE TASK ...,251$: MOV R5,R0 ;GET TCB ADDRESS FOR UNSTOP# CMP #120000,R0 ;IS IT A REAL TASK?( BLOS 260$ ;IF LOS NO ADD #T.STAT,R0 ;POINT TO T.STAT# TST (R0)+ ;SPECIFIED TASK ACTIVE?S BMI 285$ ;IF MI NO. BIT #T2.SEF,(R0) ;TASK STOPPED FOR EVENT FLAG BNE 280$ ;IF NE YESI! MOV #T2.STP,R2 ;PICK UP STOP BITV& BIT R2,(R0) ;TASK CURRENTLY STOPPED? BNE 255$ ;IF NE YEST TST (R0) ;AST IN PROGRESS? BPL 280$ ;IF PL NO ASL R2 ;SET PRE AST STOP BIT BIT R2,(R0) ;WAS TASK STOPPED?# BEQ 280$ ;IF EQ NO, RETURN STATUS !255$: MOV R5,R0 ;GET TCB ADDRESS# CALLR $EXRQN ;UNSTOP0260$: CALLR $DRDSE ;DECLARE A SIGNIFICANT EVENT&265$: DRSTS D.RS1 ;ALLOCATION FAILURE0280$: DRSTS D.RS00 ;TASK ACTIVE BUT NOT STOPPED5285$: CMP R5,$URTCB ; IS THIS THE UNIVERSAL RECEIVER?I+ BEQ 255$ ; IF EQ, YES, GO START IT UP ..., DRSTS D.RS22 ;TASK NOT ACTIVEB .DSABL LSBN;+$; **-$GTRPK-GET RECEIVE DATA PACKET.; D; THIS ROUTINE IS CALLED TO DEQUEUE A SPECIFIED PACKET FROM A QUEUE.;E ; INPUTS:0;;; R2=FIRST WORD OF TASK NAME. ; R3=SECOND WORD OF TASK NAME.; R0=LIST HEAD ADDRESS.$;A ; OUTPUTS:;C1; C=0 IF AN ENTRY HAS BEEN REMOVED FROM THE LIST.A; KISAR5 MAPS THE ENTRY.. ; C=1 IF THE ENTRY IS NOT FOUND.;8;-)$GTRPK::MOV R0,R1 ;COPY LISTHEAD ADDRESSR#10$: SEC ;ASSUME PACKET NOT FOUND ( MOV (R1),R1 ;GET ADDRESS OF NEXT ENTRY BEQ 100$ ;IF EQ END OF LISTT* MOV R1,KISAR5 ;MAP THE ENTRY THROUGH APR5 TST R2 ;TASK NAME SPECIFIED?) BEQ 20$ ;IF EQ NO, DEQUEUE FIRST PACKET* MOV #120000,R1 ;POINT TO PACKET LINK WORD3 CMP @#120004,R2 ;MATCH ON FIRST WORD OF TASK NAME? BNE 10$ ;IF NE NO 4 CMP @#120006,R3 ;MATCH ON SECOND WORD OF TASK NAME? BNE 10$ ;IF NE NO " MOV KISAR5,R1 ;GET PACKET ADDRESS20$: ;REFERENCE LABEL100$: RETURN ; .END: SEC ;ASSUME PACKET NOT FOUND ( MOV (R1),R1 ;GET ADDRESS OF NEXT ENTRY BEQ 100$ ;IF EQ END OF LISTT* MOV R1,KISAR5 ;MAP THE ENTRY THROUGH APR5 TST R2 ;TASK NAME SPECIFIED?) BEQ 20$ ;IF EQ NO, DEQUEUE FIRST PACKET* MOV #120000,R1 ;POINT TO PACKET LINK WORD3 CMP @#120004,R2 ;MATCH ON FIRST WORD OF TASK NAME? BNE 10$ ;IF NE NO 4 CMP @#120006,R3 ;MATCH ON SECOND WORD OF TASK NAME? BNE 10$ ;IF NE NO " MOV KISAR5,R1 ;GET PACKET ADDRESS .TITLE ICEND: .IDENT /01/ B;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.C; All rights reserved ;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDI9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; VERSION 01;.; D. CARROLL 18-OCT-1995;OB; THIS MODULE ENDS THE FIRST FOUR K OF MEMORY WHICH WILL HAVE BEEN>; EXPANDED USING TO THE TOP FOR THE MAXIMUM AMOUNT OF ICB POOL; ;U .IF DF,K$$DAS .IIF DF,I$$CBP, .PSECT EXEC0:"$ICTOP::.WORD 0 ; top of ICB pool .ENDC ;DF,K$$DAS  .ENDht (c) 1995-1999 by Mentec, Inc., U.S.A.C; All rights reserved ;A; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USEDI9; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; VERSION 01;.; D. CARROLL 18-OCT-1995;OB; THIS MODULE ENDS THE FIRST FOUR K OF MEMORY WHICH WILL HAVE BEEN>; EXPANDED USING TO THE TOP FOR THE MAXIMUM AMOUNT OF ICB POOL; ;U .IF DF,K$$DAS .IIF DF,I$$CBP, .PSECT EXEC0:"$ICTOP::.WORD 0 ; t .TITLE SYSIDS .IDENT /01.00/ .;B2; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reservedC;);DA; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USEDFA; AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSEoB; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISA; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED ORDA; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND 1; OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSF00t__DATADATADATADATAERED.I; A; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTtA; 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.;Y-; CREATED BY SYSBLD ON 1998-12-17 AT 14:55:16 ;I; MODIFIED BY:;TA; 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 BEXH D$SYTYP:: .IF DF P$$3XX .ASCII \ProMicro/RSX\ .IFFL. .IF DF R$$MIC ;SYSTEM NAME USED BY UTILITIES .ASCII \Micro/RSX \ .IFF .IF DF R$$CPR .ASCII \VAX-CP/RSX \ .IFF  .ASCII /RSX-11M-PLUS/ .ENDC ; DF R$$CPR  .ENDC ; DF R$$MIC .ENDC ; DF P$$3XXR?$SYSID::.ASCII /87 / ;SYSTEM IDENTIFICATION - MUST BE 4 CHARST .IF DF M$$PROO. =.-2. .ASCII /mP/ ; add on an "mP" if genned as mP .ENDC ;DF,M$$PRO  S-$VERSN::.ASCII /4.6 / ;SYSTEM VERSION NUMBERNF$SYSNM::.WORD S$$NM1,S$$NM2,S$$NM3 ;SYSTEM NAME (NODE NAME FOR DECNET) .ENDFFL. .IF DF R$$MIC ;SYSTEM NAME USED BY UTILITIES .ASCII \Micro/RSX \ .IFF .IF DF R$$CPR .ASCII \VAX-CP/RSX \ .IFF  .ASCII /RSX-11M-PLUS/ .ENDC ; DF R$$CPR  .ENDC ; DF R$$MIC .ENDC ; DF P$$3XXR?$SYSID::.ASCII /87 / ;SYSTEM IDENTIFICATION - MUST BE 4 CHARST .IF DF M$$PROO. =.-2. .ASCII /mP/ ; add on an "mP" if genned as mP .ENDC ;DF,M$$PRO  S-$VERSN::.ASCII /4.6 / ;SYSTEMztpDs@p@<&Kq@:2@`@@}s@'@e;@$9~Z@<&%t@<&9@zh&@t<@ձ@h'@?T@$9΅@?S@X@,l@4@'@=@@=@' q@`;@b<&D@hp!@$9:@:_@2X@ Zya(}< G0lhpG( a(}   A     BBVFF LLC//r<&9<&Kq<&D ' DLD> PVV9 <&%tppjj<ll,,kk ' q t< <&%t!_  '  ""SYRRi+cOFLINCDGNLLW DB@HEKYKBMDNL2(*08@HPXbjrz0 .nn~!F Invalid sync record Invalid record byte count, Size: %M Checksum error (DATA), Checksum: %P Premature on input file Checksum error (XLOD), Checksum: %P Checksum error (XFER), Checksum: %P Diagnostic load size >32.KWddDLD -- Not enough contiguous file spaceOdd address or non-existent memory errorDirective error = %DI/O error = %DRead error = %DWait error = %DRegion creation errorWindow creation errorCommand line errorSyntax errorParse errorQIOW error\ File not foundFile close errorGet partition parameters errorMapping errorPartition too smallPartition not found*Debug * - Record %D, Type=%IDATAXADDXFER, Addr: xxxxxxContinuing ...Error in BIC/BIN input record %D. VBN: %Q:%Q, Bytes usedT /left: %D./%D.%N Load address: %PWrite error = %DParity error%NLow address = %O%NHigh address = %OPartition name: %2RParG tition base: %P Size: %Q00File name: %XTransfer address: %Qn  HELP/MCR DLDa" " Q|. .     Gx iw 0 b wwzf&p wh&ȕ |X  a(}&,a(} 0a(} 8?S@a(}FJz Ra(}&Va(}`=fh ja(}& ra(}00jbkb a a aZtwh5" - 1H  |@= ha(} a(}" s $9΅ 8a(}H<@a(}Ba(}Fa(}Ha(}La(}Ra(}Ta(}Xa(}t%wVwD& SYw&ȕr wh' 5wzEw|a(} a(}$9:sVD 2a(}: >a(}& Fa(}rL@=RhXa(}'`a(}fzla(}V: %zwH# ,r%   H| a(} a(}a(}a(}a(}a(} $a(}H(' q.hp!4$9~Z6a(}r>a(}Fa(}Na(} Ra(}HR# w2rw7 rUwz |' q h'2a(}r a(}$a(}r&a(}*a(}2a(}6  ~ a(}'h'a(} a(}$a(}&a(}*a(}2a(}6NL( SYSY"SY&SY*TI.CL2   wH za(}a(}a(}a(}"a(}& a(}*&a(}.,a(}204a(}8a(} a(}@a(} Da(}HH`N  Ra(} Va(}LhH w wnnnnnn7   n pH a(} 2X a(}na(}n"a(}n&a(}n*a(}n.a(}n2a(} 6a(} :a(} >Ba(}n Ha(}pX ,~  e  =  ,  ׭n  z a(}, a(}a(}~a(} a(} a(}$a(} 0a(}6a(} :a(}= @,Da(}Ja(}nRa(}^ ,w*  5wU7 7 nwH# w2H# w a(} , a(}'a(}$*a(}.a(} 2a(}n :a(}H>' qDh&J2 Na(}HR' qXhp!H^25 5w wVH b.  z2 a(}a(} a(}&V*a(} .a(}H 2a(}6b:a(}.a(}@a(}jHa(}Ta(}Va(}Za(}\a(}da(}l tw ^w HwR 6w $w wr x a(}la(} a(}s$a(} ,a(} 0a(}:a00"(t__DATADATADATADATA(} Ba(}R La(} Ta(} ^a(} fa(} pa(} xa(}w`l wN] w<} w* w9 w& w% ra(} a(}l a(} a(}] *a(} 2a(}}   f 0,46  %7*Z a(} a(} a(} &a(},ձ 6a(}<`;^a(}ba(}vs za(}~s~ wj7*v  wN7* w2 lWtmdB~7 lmjby  a(}s a(}v s(a(}2s 6a(}:sDa(}LPa(}Ta(}l`a(}dha(}lla(}na(}j ra(}bzldWtB~5  n   `  T  H  7 7  " za(}la(}da(} a(} $a(} .a(} 2a(} :a(} >a(} Fa(} Ja(}Za(}da(} ha(}ta(}TH R55 e  7`  za(} a(} a(}Ha(}a(} "a(}$a(}*a(}2a(}:a(}>a(}Ba(}Ha(}La(}Pa(}H&   D7  Xw7 %  Z 7   d1  4ea(}a(}a(} a(}(a(},a(}6a(}Da(}Ha(}Pa(} Va(}Za(}` da(} ha(} ta(}6  >  F J4e6    j a(}e; a(} a(}$`; .a(} 8a(} a(}JG|Na(}Va(}(}v 0s 8a(}@a(}Ba(}"Fa(}Ha(}$La(}Na(}0Ra(}Ta(}Xa(}Za(}.h @6eAtE7,w Etem--za(}  a .TITLE KCLOKB CLOCK 'B' CONTROL .IDENT /M01.01/;E1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.T; All rights reservedG;A>; 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. ;M?; 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 CAL00*jbkb a a aLS;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, ETC)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:: C002 9t__DATADATADATADATACC 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 ALL 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/;U1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reserved;;U>; 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 :jbkb a a a TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ;M?; 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;  .MCALL 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--C00 BEt__DATADATADATADATAHECK 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 POINTER 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/ B, .TITLE KAASO3 D/A OUTPUT WITH SCOPE CONTROL .IDENT /M01.00/;T1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.B; All rights reserved ;;>; 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. ;M?; 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-BITS00JPjbkb a a a$ .TITLE KADAGR A/D AUTO-GAIN RANGING .IDENT /M01.00/;-1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.I; All rights reservedS;0>; 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. ;M?; 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 CONVERT( .TITLE KADDRV ROUTINES TO DRIVE THE ADC .IDENT /M01.00/; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.C; All rights reservedS;,>; 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. ;M?; 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 M00REt__DATADATADATADATAACRO 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 THE 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; ; INPU00Z^jbkb a a aTS: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 ENABLE 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 R33 .TITLE KADIN0 SINGLE CHANNEL A/D INTERRUPT HANDLER( .IDENT /M01.01/;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A..; All rights reserved.;B>; 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. ;M?; 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 ;;;00b%dt__DATADATADATADATAGET 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 SWEEP 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 SWEEP END;9@ .TITLE KADIN1 MULTIPLE CHANNEL ABS CHANNEL ADDRESSING INTERRUPT .IDENT /M01.01/; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.:; All rights reservedE;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. ;M?; 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 BNE00%j&ljbkb a a a 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$ ;;;IF 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 CC NO F< .TITLE KADIN2 SINGLE CHANNEL GAIN RANGING INTERRUPT HANDLER .IDENT /M01.00/; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.M; All rights reservedA; >; 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. ;M?; 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 E00'rdt__DATADATADATADATA= .TITLE KADIN3 MULTIPLE CHANNEL SINGLE GAIN INTERRUPT ROUTINEO .IDENT /M01.00/;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.L; All rights reservedV;0>; 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. ;M?; 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- BCC 100*z2jbkb a a aA .TITLE KADIN4 SINGLE CHANNEL AUTO GAIN RANGING INTERRUPT HANDLER; .IDENT /M01.00/;E1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.A; All rights reservedN;>; 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. ;M?; 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 B; .TITLE KADIN5 MULTIPLE CHANNEL AUTO GAIN RANGING INTERRUPTP .IDENT /M01.00/;O1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.L; All rights reservedL;/>; 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. ;M?; 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 AU0024t__DATADATADATADATATO 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);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$: CA& .TITLE KAST AST ROUTINES FOR K-SERIES .IDENT /M01.00/;N1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.G; All rights reserved0;4>; 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. ;M?; 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. ;S004jbkb a a a; 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,-(SP) ; 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; .IIF NDF S$$YDF , .NLISTB .TITLE RSXMCO .IDENT /11.30/:;,; Copyright (c) 1995 by Mentec, Inc., U.S.A.; All rights reservedS;D;DA; 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. THISOA; SOFTWARE OR ANY OTHER COPIES THEREOF, MAY NOT BE PROVIDED OR A; OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO ANDD2; OWNERSHIP OF THE SOFTWAR00t__DATADATADATADATAE IS HEREBY TRANSFERRED.;BA; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTtA; 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: 11.30; Date: 08-AUG-86 10:19:15 ;I; C; The following symbols represent options for which the conditionalOD; code has been removed from the Executive. The symbols are definedB; here only for the use of privileged tasks, common utilities, and; user written tasks.I;AA$$CHK=0 ; Address checkingA$$CPS=0 ; ACP support A$$NSI=0 ; ANSI magtape support,A$$PRI=0 ; Alter Priority directive (ALTP$)A$$TRP=0 ; AST support !C$$CKP=0 ; Checkpointing supportU$D$$ISK=0 ; Nonresident task support/D$$SHF=0 ; Automatic dynamic memory compactionoD$$WCK=0 ; Writecheck support)D$$YNC=0 ; Dynamic checkpoint allocatione-D$$YNM=0 ; Dynamic memory allocation supportd#;E$$PER=0 ; Log parity error trapsi(F$$LVL=1 ; File structure level support7G$$DVI=0 ; Get device info directive supported (GDVI$)C6G$$TPP=0 ; Get Partition Parameters directive (GPRT$)1G$$TTK=0 ; Get Task Parameters directive (GTSK$)P0I$$RAR=0 ; Install, request, and remove on exitI$$RDN=0 ; I/O rundownd-L$$ASG=0 ; Logical device assignment support #L$$DRV=0 ; Loadable driver supportc*L$$LDR=0 ; Task loader as a separate task#M$$FCS=0 ; FCS/File system supporto%M$$MGE=0 ; Memory management supportgBM$$MUP=0 ; Multi-user protection - requires T$$BTW,T$$RNE,T$$RST,; ; and P$$OFF 1P$$GMX=0 ; Get mapping context - requires P$$LASt.P$$LAS=0 ; Program logical address extensions,P$$OFF=0 ; Parent/Offspring tasking supportP$$OOL=0 ; Secondary pool+P$$P45=0 ; Rotating pattern in data lightsG7P$$SRF=0 ; Send/Receive by reference - requires P$$LASd'R$$DSP=0 ; Executive level dispatchinga#R$$EXV=0 ; Extend Executive to 20KC#R$$SND=0 ; Receive/Send directivese6T$$KMG=0 ; Task termination/device not ready messages; L; The following symbols are statically defined for all RSX-11M-PLUS systems.; They should not be changed.;L C$$INT=0 ; Connect to interrupt6C$$PCR=0 ; Checkpoint Common Region directive (CPCR$)!D$$IAG=0 ; User mode diagnostics0);E$$DVC=0 ; Device error logging supportF";E$$LOG=0 ; Error logging support-;E$$NSI=0 ; Nonsense interrupt error loggingp)E$$XPR=0 ; Extend Task directive (EXTK$)0+G$$GEF=0 ; Group global event flag supportK2H$$FME=16. ; Number of fast map extension entries.H$$FMS=4 ; Size of a fast map extension entry:H$$FMX=2 ; Size of a fast map extension in 32-word blocks*L$$NAM=0 ; Named directory support in DCL3M$$CRB=84. ; Number of characters in an MCR buffer)"M$$CRX=0 ; External MCR functionsM$$OVR=0 ; Overlayed MCR (M$$XLN=256. ; Total length of MCR lines#N$$DIR=0 ; Named directory supporte0;O$$LAP=0 ; Overlapped device operation support3P$$MAX=256. ; Maximum size of send/receive packetsuP$$MON=0 ; SPM-11 support(;P$$RFL=0 ; Power fail recovery support#R$$CON=0 ; Reconfiguration support:R$$EIS=0 ; EIS instructions - required for DECNET support/R$$FEA=0 ; Test Feature Mask directive (FEAT$)B0R$$GIN=0 ; General Information directive (GIN$);R$$LKL=1 ; RMS record lockingR$$MPL=0 ; RSX-11M-PLUS systemN5R$$11M=0 ; RSX-11M system (as opposed to 11D or IAS)i$;S$$ECC=0 ; Shared Exec ECC support&S$$MAP=0 ; SMAP$ and MVTS$ directives#;S$$OPT=0 ; Disk seek optimizationk)U$$UMD=0 ; User mode diagnostics support 1U$$UMR=0 ; UMR support (as separate from M$$EXT)g ;A$$LOG=0p ;A$$SEC=0S; G; The following symbols are for terminal driver options that are alwayse#; included in RSX-11M-PLUS systems. ;e4T$$BTW=0 ; Breakthrough write - required for M$$MUP!T$$CCA=0 ; Unsolicited input ASTL"T$$CON=0 ; Serial console supportT$$CTR=0 ; Control-RrT$$CUP=0 ; Cursor positioningT$$EIO=0 ; Extended I/OT$$ESC=0 ; Escape sequences(T$$GMC=0 ; Get terminal characteris00jbkb a a atics'T$$GTS=0 ; Get terminal driver supportUT$$LTH=0 ; LAT supporte0T$$LWC=0 ; Settable case conversion (lowercase)(T$$OVL=0 ; Overlaid driver (uses TTEXT)%T$$RED=0 ; Hard read error detectiond3T$$RNE=0 ; Read with no echo - required for M$$MUPrT$$RPR=0 ; Read after promptP>T$$RST=0 ; Read with special terminator - required for M$$MUPT$$RUB=0 ; CRT rubout(T$$SMC=0 ; Set terminal characteristics,T$$TSA=0 ; Network Command terminal supportT$$USP=0 ; User-written ports;cJ; The following symbols define the first free UMR for use by user drivers.N; If the system includes DH11 or DHU11 terminal controllers, these symbols are; redefined later in this file.a;r2N$$UMR=5*4. ; Number of statically allocated UMRs*U$$MRN=170224 ; Address of first free UMR@U$$MHI=0 ; High 2 bits of 18 bit UNIBUS address in bits 4 and 55U$$MLO=120000 ; Low 16 bits of 18 bit UNIBUS addressn;cL; The following symbols are for options which are always included by SYSGEN.J; A knowledgeable user could alter these symbols at his own risk to tailor ; his system.r;-C$$ORE=512. ; Size of dynamic storage region -;E$$ICM=0 ; ERRLOG: inhibit console messagese-;E$$MOU=0 ; ERRLOG: log mounts and dismountss-;E$$SEF=0 ; ERRLOG: use special file formatse4F$$NIM=0 ; Deleted disk image of fixed task support0G$$TSS=0 ; Get Sense Switches directive (GSSW$)&N$$MOV=33. ; Size of BLXIO move table(P$$CTL=0 ; Pool monitoring task support.Q$$OPT=5 ; Number of pre-allocate I/O packetsAR$$IIC=0 ; Internal I/O completion - required for T$$TSA, D$$CHE=S$$HFC=30. ; Minimum time interval between shuffler requestso+S$$WRG=0 ; Console switch register presenta*S$$WST=0 ; Switch State directive (SWST$)7;S2.NRD=20000 ; Enable new power recovery for DM/DB/DR;NK; The following symbols are the initial values for system tuning parametersh; that are reset in SYSVMR.3; BR$$NDC=6 ; Round robin sched: Clock ticks per scheduling interval@R$$NDL=1 ; Round robin sched: Lowest priority class to considerDR$$NDH=150. ; Round robin sched: Highest priority class to consider/S$$WPC=30. ; Clock ticks per swapping intervalWS$$WPR=5 ; Swapping priority $P$$HIL=1600. ; PMT: High pool limit"P$$LOL=600. ; PMT: Low pool limitDP$$FRS=200. ; PMT: Lowest permissible size of largest pool fragment2P$$BPR=51. ; PMT: Pool base priority task control;tE; The following symbols are those that are generated by the "Choosingp4; Executive options" questions answered by the user.;w; -X$$SEC=0 ; Extensible secondary pool supportd)R$$TPR="73 ; Processor type (for NETGEN)s#S$$EXC=0 ; Full-functionality Execw%K$$DAS=0 ; Kernel data space supportp(A$$CKP=0 ; Alternate checkpoint support&I$$CBP=0 ; Alternate ICB pool support#U$$DAS=0 ; User data space supportb D$$PAR=0 ; Directive partitions#X$$HDR=0 ; External header support L$$GCL=0 ; Logical name support+S$$LIB=0 ; Supervisor-mode library supportCF$$MAP=0 ; Fast map facilityq&I$$CSZ=80. ; ICB pool size (in words)3M$$NET=1400.+31. ; DECnet support - requires S$$WSTRS$$NM1="CP ; System name S$$NM2="R ;C S$$NM3=" ;t;S$$HDW=0 ; Shadow recordingn0;D$$CHE=0 ; Disk data caching - requires R$$IIC(A$$CNT=0 ; Accounting - requires P$$OOL-;Q$$MGR=0 ; Queue Manager included at SYSGENr#A$$CLI=16. ; Alternate CLI support C$$CTC=0 ; CTRL/C abort support0P$$WND=0 ; Secondary pool FCP - requires P$$OOL#F$$DVN=0 ; Decimal version numbersM$V$$TRM=0 ; Virtual terminal support+V$$TLD=120. ; Default VT: unit buffer size.+V$$TLM=184. ; Maximum VT: unit buffer size"GT$$ACD=0 ; Ancillary control driver support in TTDRV - requires T$$EIOe+T$$UTO=30. ; Time-out on unsolicited inputq)T$$COM=0 ; Separate terminal buffer pooli%;X$$DBT=0 ; Executive debugging tooli-R$$DER=0 ; CORAL deallocation error checking /;C$$RSH=177564 ; Crash notification device CSRD;C$$CDA=2 ; Crash dumps on DK/C$$RUN=0 ; Logical unit number of crash device5S$$YSZ=256.*32. ; Size of phys. memory in 32W blocksf#M$$EXT=0 ; Extended memory su00t__DATADATADATADATApport4 P$$D70=0 ; 11/70 parity support,F$$LPP=0 ; Floating point processor supportH$$RTZ=60. ; Line frequency'K$$CSR=177546 ; Line clock CSR addressu'K$$CNT=177546 ; Count register addresspK$$TPS=60. ; Ticks per secondK$$LDC=1 ; Load count value$K$$IEN=115 ; Interrupt enable value;7G; The following symbols are defined for all RSX-11M-PLUS systems except$&; pregennerated non I/D-space systems.;c!P$$RTY=0 ; Parity memory support.;mE; The following symbols are those that are generated by the "Choosing1;; Peripheral Configuration" questions answered by the user.o;(R$$UDA=1. ; MSCP-class disk controllersLD$DU=0 ; Loadable DUDRVDU$C0=4 ; DUA command ringseDU$R0=4 ; DUA response rings;LD$CO=0 ; Loadable CODRV&D$$L11=1 ; DL11/DLV11 line interfacesLD$TT=0 ; Loadable TTDRVN$$LDV=1 ; Null deviceoLD$NL=0 ; Loadable NLDRVLD$VT=0 ; Loadable VTDRVLD$RD=0 ; Loadable RDDRVLD$XX=0 ; Loadable XXDRVLD$KX=0 ; Loadable KXDRV+V$$CTR=500 ; Address of highest vector + 4s;1G; This macro provides the linkage between the last CTB in SYSTB and theAH; first CTB in the user-supplied resident data bases. Invoke this macroD; in the first resident data base's CTB just before the L.LNK field.;e .MACRO CTB1"$CTB1:: ; First user-supplied CTB .ENDM;o?; *************** START OF CPR SPECIFIC CONDITIONALS **********V;D?; THIS SECTION CONTAINS CONDITIONAL SYMBOLS DEFINED FOR THE CPR ; SYSTEM ONLY.;KK$$TP0=175000 ; TPR03C$$RSH=K$$TP0 ; CRASH NOTIFICATION CSR (NOT USED)s'C$$CDA=20 ; CRASH ON KXJ IS SUPPORTEDa C$$RMT=0 ; REMOTE HOST SUPPORT"C$$KXJ=0 ; KXJ PROCESSOR SUPPORT$C$$XDJ=0 ; XDT ON KXJ IS SUPPORTEDC$$DFB=0 ; DEFERRED BINDINGuC$$RTB=0 ; RUN TIME BINDING-C$$ODB=0 ; CANNOT OVERRIDE DEFERRED BINDINGB!C$$RTK=0 ; REMOTE TASK SERVICESR!C$$NSY=0 ; NO LOCAL SYSTEM DISK*C$$NCO=0 ; NO LOCAL CONSOLEA%C$$RDR=0 ; REMOTE DIRECTORY STORAGE C$$RLG=0 ; REMOTE LOGICALS.C$$SC1=0 ; ALTERNATE SECONDARY POOL ROUTINES"C$$LDR=0 ; REMOTE LOADER/OVERLAY)R$$CPR=0 ; MAKE SYSTEM NAME VAX-CPR/RSX0+G$$DVI=0 ; SUPPORT FOR THE GDVI DIRECTIVEO;S?; *************** END OF CPR SPECIFIC CONDITIONALS ************F;E;I;N ; EXEC MACROS;;N;M/; ASSUME MACRO FOR CHECKING SYMBOL DEPENDENCIES ;D B .MACRO ASSUME A,B=0..IIF NE - .ERROR ;EXPRESSIONS NOT EQUAL .ENDM 0;;; CALL SUBROUTINE;R .MACRO CALL SUBR ARG  .IF IDN <$INTSV>, JSR R5,$INTSV .WORD ^C&PR7 .IFFA .IF IDN <$SAVNR>, JSR R5,$SAVNR .IFFL .IF IDN <$SWSTK>, EMT 376 .WORD ARG .IFF0 JSR PC,SUBR .ENDC .ENDC .ENDC .ENDM;*!; CALL AND RETURN FROM SUBROUTINEO;S .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 X .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;0; 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 --00jbkb a a a 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$:  .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 .ENDC004t__DATADATADATADATA .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;A*; BLOCK MOVE INSTRUCTION MACRO (TEMPORARY);N .MACRO MOVR$ SRC,DST,CNTM .NTYPE $$$S,SRC .NTYPE $$$D,DST .NTYPE $$$C,CNT .IF EQ,<<$$$S!$$$D!$$$C>&70>C$$$S = $$$S*^o100;$$$D = $$$D*^o10 .LIST MEB .WORD ^o075000+$$$S+$$$D+$$$C .NLIST MEB .IFF ;EQ-/ .ERROR ; Invalid addressing mode used in MOVR$ .ENDC ;EQ,<<$$$S!$$$D!$$$C>&70> .ENDM ;MOVR$V .IIF NDF S$$YDF , .LISTBUF MOV$ OPCODE .IF DF VC$CPR S CALL @CPSEN .IFF CALL $CPSEN .ENDC ;VC$CPR .ENDM;A*; BLOCK MOVE INSTRUCTION MACRO (TEMPORARY);N .MACRO MOVR$ SRC,DST,CNTM .NTYPE $$$S,SRC .NTYPE $$$D,DST .NTYPE $$$C,CNT .IF EQ,<<$$$S!$$$D!$$$C>&70>C$$$S = $$$S*^o100;$$$D = $$$D*^o10 .LIST MEB .WORD ^o075000+$$$S+$$$D+$$$C .NLIST MEB .IFF ;EQ-/ .ERROR ; Invalid ; 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$ ;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 1000046jbkb a a a$ ;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$ ;DISCO) .TITLE KBFRMG BUFFER MANAGEMENT ROUTINES .IDENT /M01.00/; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reservedG;.>; 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. ;M?; 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$ 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 006ˆ9Ɉt__DATADATADATADATAFAILURE1 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 RET .TITLE KCLOKA CLOCK A CONTROL .IDENT /M01.00/;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.;; All rights reserved ;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 TERMS009ʈ:Έjbkb a a a. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ;M?; 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 .EN- .TITLE KSWDF SWEEP CONTROL BLOCK DEFINITIONSM .IDENT /M01.01/; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.$; All rights reservedO;>; 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. ;M?; 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 ;MORE 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 BUFFER00:҈Ɉt__DATADATADATADATAS 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 ;SIMULATE 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$00:ڈ;ۈ<jbkb a a aACTV = 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;-!K$) .TITLE KCOMM COMMON RO DATA FOR K-SERIES  .IDENT /M01.00/;S1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.0; All rights reservedD; >; 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. ;M?; 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;R@2 .TITLE KCVADF CONVERT A/D INPUT TO FLOATING POINT .IDENT /M01.01/;E1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.L; All rights reservedE;1>; 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. ;M?; 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 RATHE00<At__DATADATADATADATAR 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 N/ .TITLE KDIGO SET DIGITAL INPUT START FOR SWEEPP .IDENT /M01.00/;21; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.0; All rights reserved0;B>; 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. ;M?; 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 DEFAULTED.;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$ ;IF00AKjbkb a a a 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.WFL2" .TITLE KDISWP DIGITAL INPUT SWEEP .IDENT /M01.00/;U1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.!; All rights reservedC;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. ;M?; 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 MAC00Kct__DATADATADATADATARO 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$: MO# .TITLE KDOSWP DIGITAL OUTPUT SWEEP0 .IDENT /M01.00/;S1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reservedS;I>; 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. ;M?; 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; SYSTEM 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 OKM00cjbkb a a a0 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/;01; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reservedC;0>; 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. ;M?; 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 FIRST 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 FI00t__DATADATADATADATA .TITLE KDSDGO DISABLE DIGO; .IDENT /M01.00/;01; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.P; All rights reservedO;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. ;M?; 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 WER' .TITLE KDVDF K-SERIES HARDWARE DEFINES  .IDENT /M01.00/;D1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.E; All rights reservedO;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. ;M?; 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 ;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 = 1000000 jbkb a a a0 ;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 RE# .TITLE KEFQA SET EFN AND QUEUE ASTP .IDENT /M01.00/; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.B; All rights reserved;A>; 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 00t__DATADATADATADATA TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ;M?; 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 YES--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) ;REME00!jbkb a a aMBER 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) ;REME+ .TITLE KFLT16 FLOAT 2'S COMPLEMENT INTEGER .IDENT /M01.00/;;1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.; All rights reservedR;>; 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. ;M?; 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) ;2 .TITLE KIESTO STORE ERROR CODE FROM ABORTED SWEEP .IDENT /M01.00/; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ;B>; 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 00"%t__DATADATADATADATATHESE LICENSE TERMS. TITLE>; TO AND OWNERSHIP OF THE SOFTWARE SHALL AT ALL TIMES REMAIN ; IN DEC. ;M?; 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 ROUTINESI .IDENT /M01.00/;I1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved,; >; 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. ;M?; 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 IMMEDIATELY .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 00*!jbkb a a aFOR 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 ROUTINEI* 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,@.KACS0027t__DATADATADATADATAR ;;;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$: RETU& .TITLE KLQSUB CLOCK QUEUE SUBROUTINES .IDENT /M01.01/; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.5; All rights reserved(; >; 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. ;M?; 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 CONDITIONALIZATION 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] AC00:>!jbkb a a aTIVE 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 QUEUE $ .TITLE KPAA PUSH ARGUMENT ADDRESSES .IDENT /M01.00/;T1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.P; All rights reservedB;#>; 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. ;M?; 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 REQUIRED 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 400BEH__DATADATADATADATA0$ ;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 GIVEN 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 NUMBERSN .IDENT /03/;81; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.Y; All rights reservedI;EA; THIS SOFTWARE IS FURNISHED TO PURCHASER UNDER A LICENSE FOR USEB@; ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED (WITH INCLUSIOND; OF THE ABOVE COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT1; AS MAY OTHERWISE BE PROVIDED IN WRITING BY DEC. ;R@; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT@; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL; EQUIPMENT CORPORATION.; @; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY?; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.E;N ; VERSION 03; ; D. N. CUTLER 10-FEB-72;+-; **-.KMUL-INTEGER MULTIPLY MAGNITUDE NUMBERSE;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 PRESE .TITLE KRWBF READ/WRITE BUFFER  .IDENT /M01.00/;S1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.U; All rights reservedH;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. ;M?; 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 CALLS00J>!jbkb a a a;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 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) ;;00RT[__DATADATADATADATA;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= MOV( .TITLE RCLOKB READ CLOCK B FROM FORTRAN .IDENT /M01.00/; 1; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A.E; All rights reservedO;>; 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. ;M?; 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 MOV 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 MOV<0b 1@,00\>!jbkb a a awwUwH ~wTwCw`Iw?w""w#w{QwT[7wxdwd(w 7wwZww(wP :@hb T33.;.; SGNMAIN.CMD.;1.; RSX-11M-PLUS SYSGEN -- Mainline command file".;.;.;2.; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A..; 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 LICENSEC.; AND WITH THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THISfB.; 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.a.;B.; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUTB.; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL.; EQUIPMENT CORPORATION.E.;B.; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF=.; ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.G.;.; Version: 12.01S.;.; Written by:.;.; J. C. Franzini .;.; Previously modified by:.;.; J. C. Franzini .; G. N. Larsen .; L. B. McCulleyN.; J. W. BerzleT.;.; Modified for M-PLUS V4.2 by:T.; .; L.B. McCulley 20-Oct-88 11.02%.; LBM130 -- Fix BL display for FT .; .; L. B. McCulley 6-Jan-89 12.004.; LBM149 -- Propogate BL for display from sysbuild.;.;.; Modified for M-PLUS V4.4 by:E.;!.; L. M. Franklin 26-May-92 12.01E$.; LMF164 -- Update copyright date.;.; Documentation by:.;.; M. J. Tardiff.; E.; This command file must run on the current and previous versions of ".; RSX-11M-PLUS and on VAX-11 RSX...; SYSGEN is supported on the following disks:.;.; RP04, RP05, RP06u.; RM02, RM03, RM05, RM80, RP07 .; RK07L.; RA60, RA80, RA81B.; Variable names and use conventions in the SYSGEN command files:.;D.; $a$aaa contains the value associated with the RSXMC symbol a$$aaaM.; a$aaaa contains the value associated with the data structure offset a.aaaaaK.; aa'xxx' type symbols should be thought of as arrays or tables, where thec.; variable xxx is the index..;-.; TEMPN, TEMPNn temporary numeric variabless,.; TEMPS, TEMPSn temporary string variables-.; TEMPL, TEMPLn temporary logical variables .;H.; These temporary variables should only be used for short-term, obviousK.; purposes: counters, indices, intermediate values, temporary work areas,eG.; etc. They should NEVER have any long-term significance. The entiretG.; life or scope of any one usage should be visible at a glance. NeveraC.; expect a temporary variable to be intact over a subroutine call.;.;L.; DFLTN temporary numeric variable holding default response for a questionK.; DFLTS temporary string variable holding default response for a questionaL.; DFLTL temporary logical variable holding default response for a question.;K.; The following string variables define all the drivers in a given system.VI.; Each variable contains a class of drivers. The drivers are classifiednE.; by whether they are DIGITAL-supplied or user-supplied, resident oraJ.; loadable, with resident or loadable data bases. The string00dT[__DATADATADATADATAs are of the4.; form: dd,dd,dd,... where dd is a device mnemonic.;D.; $DSRR DIGITAL-supplied resident drivers with resident data basesD.; $DSLR DIGITAL-supplied loadable drivers with resident data basesD.; $DSLL DIGITAL-supplied loadable drivers with loadable data basesA.; $USRR User-supplied resident drivers with resident data bases A.; $USLR User-supplied loadable drivers with resident data baseseA.; $USLL User-supplied loadable drivers with loadable data basesd.;5.; Global Symbols: * - defined in this command file..;&.; $DCLI* restore CLI to DCL when done.; $EC* expanded commentsn.; $PREP* PREPGENd.; $RP* release disk1.; $SVNI1* Executive saved answer input file name 3.; $SVNI2* peripherals saved answer input file namerA.; $SVNI3* nonprivileged task builds saved answer input file names2.; $SVNO1* Executive saved answer output file name4.; $SVNO2* peripherals saved answer output file nameB.; $SVNO3* nonprivileged task builds saved answer output file name2.; $SVUI1* use saved answers for Executive options9.; $SVUI2* use saved answers for peripheral configurationd:.; $SVUI3* use saved answers for nonprivileged task buildsB.; $SYGEN* lower-level command files have been invoked from SYSGEN.;.;G.; The two special symbols $SGNBL and $SGNVR are defined in the modulenH.; SGNVERSN contained in SYSGEN.CLB in order to propogate the baselevelC.; and version numbers, respectively, provided at the start of theg!.; development sysbuild process.f.;J.; NOTE: The answers to the questions in this module are not saved in theM.; saved answer files. However, the answers can be pre-defined in SGNPREFIX.r.; File usage:.;.; @SYSGEN/LB:SGNVERSNm.; @SGNPREFIX .; @ACFANSf.; .CHAIN /LB:SGNNXT;  .ENABLE GLOBALl .ENABLE SUBSTITUTION  .ENABLE ESCAPEd .DISABLE LOWERCASEn @'$SGNFI'SYSGEN/LB:SGNVERSN ;0 ; RSX-11M-PLUS V'$SGNVR' BL'$SGNBL' SYSGEN  ;1 ; Copyright (c) 1995-1999 by Mentec Inc., U.S.A.n ; .SETT $SYGEN .SETT Y .SETF N .SETS COLON ":" .SETF $CE .SETF $CD .SETF $AE .SETF $BE .SETF $BP .SETF $BN .SETF $VM .SETF $AD7.; Define these symbols in case SGNPREFIX is not aroundN, .SETF $18BIT ! SGNPREFIX redefines this !, .SETF $M$PRO ! SGNPREFIX redefines this !, .SETF $B$LIN ! SGNPREFIX redefines this !, .SETF $P$GEN ! SGNPREFIX redefines this !/ .SETS $DIRCT "" ! SGNPREFIX redefines this !, .SETF $SYSBL ! SGNPREFIX redefines this !5 .TESTFILE SGNPREFIX.CMD ! Is prefix file available?. .IF NE 1 .GOTO 10 @SGNPREFIX.CMD$L.10: .IFT .OR .IF EQ 5 .GOTO 12 ! always F on AME ;H ; SGN -- Warning: This terminal is nonprivileged. If all the requiredH ; tasks are not installed, or if you do not have write-access toH ; the necessary UFDs on the target system disk, this SYSGEN will$ ; not complete successfully.?.12: .SETF $DCLI ! remember if CLI was DCL so we can restore itT .IF NE "DCL" .GOTO 20 .SETT $DCLI ; SET TERM MCR .20: .; Continue..; Set terminal to /NONAMED mode if necessary.7 .IF EQ 5 .GOTO 22 ! If EQ, AME, nonamed mode-; .IFNDF .GOTO 22 ! If NDF, pre-V2.1, nonamed moder1 .SETN F4$NAM 1000 ! Define bit mask for F4.NAMoI .PARSE "," JUNKS JUNKS JUNKS FMASK4 JUNKS ! Get 4th feature maskk2 .SETN TEMPN 'FMASK4'&F4$NAM ! Isolate bit F4.NAM; .IF TEMPN EQ 0 .GOTO 22 ! If EQ, named dir not supportedr" .IF NE "[]" SET /NONAMED%.; ! If NE, named mode, reset it.22: .; Continue, .IF NE "[200,200]" SET /UIC=[200,200]A .IFDF .AND .IF EQ 6 SET /DPRO=[RWED,RWED,RWE,R]DT .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. ;@ ; If you are unsure of the answer to a question for which a de-/ ; fault answer exists, use the default answer. 00l>!jbkb a a a ; ; ;5 ;===================================================,8 ; Choosing SYSGEN Options '' at '